mirror of
				https://github.com/inventree/InvenTree.git
				synced 2025-11-04 07:05:41 +00:00 
			
		
		
		
	update args
This commit is contained in:
		@@ -41,7 +41,7 @@ export function ActionButton(props: ActionButtonProps) {
 | 
				
			|||||||
          onClick={props.onClick ?? notYetImplemented}
 | 
					          onClick={props.onClick ?? notYetImplemented}
 | 
				
			||||||
          variant={props.variant ?? 'light'}
 | 
					          variant={props.variant ?? 'light'}
 | 
				
			||||||
        >
 | 
					        >
 | 
				
			||||||
          <Group spacing="xs" noWrap={true}>
 | 
					          <Group gap="xs" wrap="nowrap">
 | 
				
			||||||
            {props.icon}
 | 
					            {props.icon}
 | 
				
			||||||
          </Group>
 | 
					          </Group>
 | 
				
			||||||
        </ActionIcon>
 | 
					        </ActionIcon>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -55,7 +55,7 @@ export function SplitButton({
 | 
				
			|||||||
  const theme = useMantineTheme();
 | 
					  const theme = useMantineTheme();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <Group noWrap style={{ gap: 0 }}>
 | 
					    <Group wrap="nowrap" style={{ gap: 0 }}>
 | 
				
			||||||
      <Button
 | 
					      <Button
 | 
				
			||||||
        onClick={currentOption?.onClick}
 | 
					        onClick={currentOption?.onClick}
 | 
				
			||||||
        disabled={loading ? false : currentOption?.disabled}
 | 
					        disabled={loading ? false : currentOption?.disabled}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -399,7 +399,7 @@ export function DetailsTable({
 | 
				
			|||||||
}) {
 | 
					}) {
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <Paper p="xs" withBorder radius="xs">
 | 
					    <Paper p="xs" withBorder radius="xs">
 | 
				
			||||||
      <Stack spacing="xs">
 | 
					      <Stack gap="xs">
 | 
				
			||||||
        {title && <StylishText size="lg">{title}</StylishText>}
 | 
					        {title && <StylishText size="lg">{title}</StylishText>}
 | 
				
			||||||
        <Table striped>
 | 
					        <Table striped>
 | 
				
			||||||
          <tbody>
 | 
					          <tbody>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -174,7 +174,7 @@ function UploadModal({
 | 
				
			|||||||
      >
 | 
					      >
 | 
				
			||||||
        <Group
 | 
					        <Group
 | 
				
			||||||
          position="center"
 | 
					          position="center"
 | 
				
			||||||
          spacing="xl"
 | 
					          gap="xl"
 | 
				
			||||||
          style={{ minHeight: rem(140), pointerEvents: 'none' }}
 | 
					          style={{ minHeight: rem(140), pointerEvents: 'none' }}
 | 
				
			||||||
        >
 | 
					        >
 | 
				
			||||||
          <Dropzone.Accept>
 | 
					          <Dropzone.Accept>
 | 
				
			||||||
@@ -252,7 +252,7 @@ function ImageActionButtons({
 | 
				
			|||||||
    <>
 | 
					    <>
 | 
				
			||||||
      {visible && (
 | 
					      {visible && (
 | 
				
			||||||
        <Group
 | 
					        <Group
 | 
				
			||||||
          spacing="xs"
 | 
					          gap="xs"
 | 
				
			||||||
          style={{ zIndex: 2, position: 'absolute', top: '10px', left: '10px' }}
 | 
					          style={{ zIndex: 2, position: 'absolute', top: '10px', left: '10px' }}
 | 
				
			||||||
        >
 | 
					        >
 | 
				
			||||||
          {actions.selectExisting && (
 | 
					          {actions.selectExisting && (
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -246,7 +246,7 @@ export function TemplateEditor(props: TemplateEditorProps) {
 | 
				
			|||||||
              </Tabs.Tab>
 | 
					              </Tabs.Tab>
 | 
				
			||||||
            ))}
 | 
					            ))}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            <Group position="right" style={{ flex: '1' }} noWrap>
 | 
					            <Group justify="right" style={{ flex: '1' }} wrap="nowrap">
 | 
				
			||||||
              <SplitButton
 | 
					              <SplitButton
 | 
				
			||||||
                loading={isPreviewLoading}
 | 
					                loading={isPreviewLoading}
 | 
				
			||||||
                defaultSelected="preview_save"
 | 
					                defaultSelected="preview_save"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -422,11 +422,11 @@ export function ApiForm({
 | 
				
			|||||||
      <Paper mah={'65vh'} style={{ overflowY: 'auto' }}>
 | 
					      <Paper mah={'65vh'} style={{ overflowY: 'auto' }}>
 | 
				
			||||||
        <div>
 | 
					        <div>
 | 
				
			||||||
          {/* Form Fields */}
 | 
					          {/* Form Fields */}
 | 
				
			||||||
          <Stack spacing="sm">
 | 
					          <Stack gap="sm">
 | 
				
			||||||
            {(!isValid || nonFieldErrors.length > 0) && (
 | 
					            {(!isValid || nonFieldErrors.length > 0) && (
 | 
				
			||||||
              <Alert radius="sm" color="red" title={t`Form Errors Exist`}>
 | 
					              <Alert radius="sm" color="red" title={t`Form Errors Exist`}>
 | 
				
			||||||
                {nonFieldErrors.length > 0 && (
 | 
					                {nonFieldErrors.length > 0 && (
 | 
				
			||||||
                  <Stack spacing="xs">
 | 
					                  <Stack gap="xs">
 | 
				
			||||||
                    {nonFieldErrors.map((message) => (
 | 
					                    {nonFieldErrors.map((message) => (
 | 
				
			||||||
                      <Text key={message}>{message}</Text>
 | 
					                      <Text key={message}>{message}</Text>
 | 
				
			||||||
                    ))}
 | 
					                    ))}
 | 
				
			||||||
@@ -446,7 +446,7 @@ export function ApiForm({
 | 
				
			|||||||
              </Alert>
 | 
					              </Alert>
 | 
				
			||||||
            )}
 | 
					            )}
 | 
				
			||||||
            <FormProvider {...form}>
 | 
					            <FormProvider {...form}>
 | 
				
			||||||
              <Stack spacing="xs">
 | 
					              <Stack gap="xs">
 | 
				
			||||||
                {!optionsLoading &&
 | 
					                {!optionsLoading &&
 | 
				
			||||||
                  Object.entries(props.fields ?? {}).map(
 | 
					                  Object.entries(props.fields ?? {}).map(
 | 
				
			||||||
                    ([fieldName, field]) => (
 | 
					                    ([fieldName, field]) => (
 | 
				
			||||||
@@ -468,7 +468,7 @@ export function ApiForm({
 | 
				
			|||||||
      {/* Footer with Action Buttons */}
 | 
					      {/* Footer with Action Buttons */}
 | 
				
			||||||
      <Divider />
 | 
					      <Divider />
 | 
				
			||||||
      <div>
 | 
					      <div>
 | 
				
			||||||
        <Group position="right">
 | 
					        <Group justify="right">
 | 
				
			||||||
          {props.actions?.map((action, i) => (
 | 
					          {props.actions?.map((action, i) => (
 | 
				
			||||||
            <Button
 | 
					            <Button
 | 
				
			||||||
              key={i}
 | 
					              key={i}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -104,7 +104,7 @@ export function AuthenticationForm() {
 | 
				
			|||||||
      ) : null}
 | 
					      ) : null}
 | 
				
			||||||
      <form onSubmit={classicForm.onSubmit(() => {})}>
 | 
					      <form onSubmit={classicForm.onSubmit(() => {})}>
 | 
				
			||||||
        {classicLoginMode ? (
 | 
					        {classicLoginMode ? (
 | 
				
			||||||
          <Stack spacing={0}>
 | 
					          <Stack gap={0}>
 | 
				
			||||||
            <TextInput
 | 
					            <TextInput
 | 
				
			||||||
              required
 | 
					              required
 | 
				
			||||||
              label={t`Username`}
 | 
					              label={t`Username`}
 | 
				
			||||||
@@ -118,7 +118,7 @@ export function AuthenticationForm() {
 | 
				
			|||||||
              {...classicForm.getInputProps('password')}
 | 
					              {...classicForm.getInputProps('password')}
 | 
				
			||||||
            />
 | 
					            />
 | 
				
			||||||
            {auth_settings?.password_forgotten_enabled === true && (
 | 
					            {auth_settings?.password_forgotten_enabled === true && (
 | 
				
			||||||
              <Group position="apart" mt="0">
 | 
					              <Group justify="apart" mt="0">
 | 
				
			||||||
                <Anchor
 | 
					                <Anchor
 | 
				
			||||||
                  component="button"
 | 
					                  component="button"
 | 
				
			||||||
                  type="button"
 | 
					                  type="button"
 | 
				
			||||||
@@ -143,7 +143,7 @@ export function AuthenticationForm() {
 | 
				
			|||||||
          </Stack>
 | 
					          </Stack>
 | 
				
			||||||
        )}
 | 
					        )}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <Group position="apart" mt="xl">
 | 
					        <Group justify="apart" mt="xl">
 | 
				
			||||||
          <Anchor
 | 
					          <Anchor
 | 
				
			||||||
            component="button"
 | 
					            component="button"
 | 
				
			||||||
            type="button"
 | 
					            type="button"
 | 
				
			||||||
@@ -228,7 +228,7 @@ export function RegistrationForm() {
 | 
				
			|||||||
    <>
 | 
					    <>
 | 
				
			||||||
      {auth_settings?.registration_enabled && (
 | 
					      {auth_settings?.registration_enabled && (
 | 
				
			||||||
        <form onSubmit={registrationForm.onSubmit(() => {})}>
 | 
					        <form onSubmit={registrationForm.onSubmit(() => {})}>
 | 
				
			||||||
          <Stack spacing={0}>
 | 
					          <Stack gap={0}>
 | 
				
			||||||
            <TextInput
 | 
					            <TextInput
 | 
				
			||||||
              required
 | 
					              required
 | 
				
			||||||
              label={t`Username`}
 | 
					              label={t`Username`}
 | 
				
			||||||
@@ -256,7 +256,7 @@ export function RegistrationForm() {
 | 
				
			|||||||
            />
 | 
					            />
 | 
				
			||||||
          </Stack>
 | 
					          </Stack>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          <Group position="apart" mt="xl">
 | 
					          <Group justify="apart" mt="xl">
 | 
				
			||||||
            <Button
 | 
					            <Button
 | 
				
			||||||
              type="submit"
 | 
					              type="submit"
 | 
				
			||||||
              disabled={isRegistering}
 | 
					              disabled={isRegistering}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,7 +20,7 @@ export function NestedObjectField({
 | 
				
			|||||||
        </Accordion.Control>
 | 
					        </Accordion.Control>
 | 
				
			||||||
        <Accordion.Panel>
 | 
					        <Accordion.Panel>
 | 
				
			||||||
          <Divider sx={{ marginTop: '-10px', marginBottom: '10px' }} />
 | 
					          <Divider sx={{ marginTop: '-10px', marginBottom: '10px' }} />
 | 
				
			||||||
          <Stack spacing="xs">
 | 
					          <Stack gap="xs">
 | 
				
			||||||
            {Object.entries(definition.children ?? {}).map(
 | 
					            {Object.entries(definition.children ?? {}).map(
 | 
				
			||||||
              ([childFieldName, field]) => (
 | 
					              ([childFieldName, field]) => (
 | 
				
			||||||
                <ApiFormField
 | 
					                <ApiFormField
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,7 +25,7 @@ export function Thumbnail({
 | 
				
			|||||||
  const backup_image = '/static/img/blank_image.png';
 | 
					  const backup_image = '/static/img/blank_image.png';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <Group align={align ?? 'left'} spacing="xs" noWrap={true}>
 | 
					    <Group align={align ?? 'left'} gap="xs" wrap="nowrap">
 | 
				
			||||||
      <ApiImage
 | 
					      <ApiImage
 | 
				
			||||||
        src={src || backup_image}
 | 
					        src={src || backup_image}
 | 
				
			||||||
        alt={alt}
 | 
					        alt={alt}
 | 
				
			||||||
@@ -59,7 +59,7 @@ export function ThumbnailHoverCard({
 | 
				
			|||||||
}) {
 | 
					}) {
 | 
				
			||||||
  const card = useMemo(() => {
 | 
					  const card = useMemo(() => {
 | 
				
			||||||
    return (
 | 
					    return (
 | 
				
			||||||
      <Group position="left" spacing={10} noWrap={true}>
 | 
					      <Group justify="left" gap={10} wrap="nowrap">
 | 
				
			||||||
        <Thumbnail src={src} alt={alt} size={size} />
 | 
					        <Thumbnail src={src} alt={alt} size={size} />
 | 
				
			||||||
        <Text>{text}</Text>
 | 
					        <Text>{text}</Text>
 | 
				
			||||||
      </Group>
 | 
					      </Group>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -59,7 +59,7 @@ export function AttachmentLink({
 | 
				
			|||||||
  let text = external ? attachment : attachment.split('/').pop();
 | 
					  let text = external ? attachment : attachment.split('/').pop();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <Group position="left" spacing="sm">
 | 
					    <Group justify="left" gap="sm">
 | 
				
			||||||
      {external ? <IconLink /> : attachmentIcon(attachment)}
 | 
					      {external ? <IconLink /> : attachmentIcon(attachment)}
 | 
				
			||||||
      <Anchor href={attachment} target="_blank" rel="noopener noreferrer">
 | 
					      <Anchor href={attachment} target="_blank" rel="noopener noreferrer">
 | 
				
			||||||
        {text}
 | 
					        {text}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,7 +5,7 @@ export function ColorToggle() {
 | 
				
			|||||||
  const { colorScheme, toggleColorScheme } = useMantineColorScheme();
 | 
					  const { colorScheme, toggleColorScheme } = useMantineColorScheme();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <Group position="center">
 | 
					    <Group justify="center">
 | 
				
			||||||
      <ActionIcon
 | 
					      <ActionIcon
 | 
				
			||||||
        onClick={() => toggleColorScheme()}
 | 
					        onClick={() => toggleColorScheme()}
 | 
				
			||||||
        size="lg"
 | 
					        size="lg"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,13 +19,13 @@ export function StatisticItem({
 | 
				
			|||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <Paper withBorder p="xs" key={id} pos="relative">
 | 
					    <Paper withBorder p="xs" key={id} pos="relative">
 | 
				
			||||||
      <LoadingOverlay visible={isLoading} overlayBlur={2} />
 | 
					      <LoadingOverlay visible={isLoading} overlayBlur={2} />
 | 
				
			||||||
      <Group position="apart">
 | 
					      <Group justify="apart">
 | 
				
			||||||
        <Text size="xs" color="dimmed" className={classes.dashboardItemTitle}>
 | 
					        <Text size="xs" color="dimmed" className={classes.dashboardItemTitle}>
 | 
				
			||||||
          {data.title}
 | 
					          {data.title}
 | 
				
			||||||
        </Text>
 | 
					        </Text>
 | 
				
			||||||
      </Group>
 | 
					      </Group>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <Group align="flex-end" spacing="xs" mt={25}>
 | 
					      <Group align="flex-end" gap="xs" mt={25}>
 | 
				
			||||||
        <Text className={classes.dashboardItemValue}>{data.value}</Text>
 | 
					        <Text className={classes.dashboardItemValue}>{data.value}</Text>
 | 
				
			||||||
      </Group>
 | 
					      </Group>
 | 
				
			||||||
    </Paper>
 | 
					    </Paper>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -43,7 +43,7 @@ export function InfoItem({
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <Group position="apart">
 | 
					    <Group justify="apart">
 | 
				
			||||||
      <Text fz="sm" fw={700}>
 | 
					      <Text fz="sm" fw={700}>
 | 
				
			||||||
        {name}:
 | 
					        {name}:
 | 
				
			||||||
      </Text>
 | 
					      </Text>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,7 +22,7 @@ export function ProgressBar(props: ProgressBarProps) {
 | 
				
			|||||||
  }, [props]);
 | 
					  }, [props]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <Stack spacing={2} style={{ flexGrow: 1, minWidth: '100px' }}>
 | 
					    <Stack gap={2} style={{ flexGrow: 1, minWidth: '100px' }}>
 | 
				
			||||||
      {props.progressLabel && (
 | 
					      {props.progressLabel && (
 | 
				
			||||||
        <Text align="center" size="xs">
 | 
					        <Text align="center" size="xs">
 | 
				
			||||||
          {props.value} / {props.maximum}
 | 
					          {props.value} / {props.maximum}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -59,7 +59,7 @@ export function AboutInvenTreeModal({
 | 
				
			|||||||
      <tr key={idx}>
 | 
					      <tr key={idx}>
 | 
				
			||||||
        <td>{map.title}</td>
 | 
					        <td>{map.title}</td>
 | 
				
			||||||
        <td>
 | 
					        <td>
 | 
				
			||||||
          <Group position="apart" spacing="xs">
 | 
					          <Group justify="apart" gap="xs">
 | 
				
			||||||
            {alwaysLink ? (
 | 
					            {alwaysLink ? (
 | 
				
			||||||
              <Anchor href={data[map.ref]} target="_blank">
 | 
					              <Anchor href={data[map.ref]} target="_blank">
 | 
				
			||||||
                {data[map.ref]}
 | 
					                {data[map.ref]}
 | 
				
			||||||
@@ -177,7 +177,7 @@ export function AboutInvenTreeModal({
 | 
				
			|||||||
        </tbody>
 | 
					        </tbody>
 | 
				
			||||||
      </Table>
 | 
					      </Table>
 | 
				
			||||||
      <Divider />
 | 
					      <Divider />
 | 
				
			||||||
      <Group position="apart">
 | 
					      <Group justify="apart">
 | 
				
			||||||
        <CopyButton
 | 
					        <CopyButton
 | 
				
			||||||
          value={copyval}
 | 
					          value={copyval}
 | 
				
			||||||
          label={<Trans>Copy version information</Trans>}
 | 
					          label={<Trans>Copy version information</Trans>}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,14 +18,14 @@ import { apiUrl } from '../../states/ApiState';
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
export function LicenceView(entries: Readonly<any[]>) {
 | 
					export function LicenceView(entries: Readonly<any[]>) {
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <Stack spacing="xs">
 | 
					    <Stack gap="xs">
 | 
				
			||||||
      <Divider />
 | 
					      <Divider />
 | 
				
			||||||
      {entries?.length > 0 ? (
 | 
					      {entries?.length > 0 ? (
 | 
				
			||||||
        <Accordion variant="contained" defaultValue="-">
 | 
					        <Accordion variant="contained" defaultValue="-">
 | 
				
			||||||
          {entries?.map((entry: any, index: number) => (
 | 
					          {entries?.map((entry: any, index: number) => (
 | 
				
			||||||
            <Accordion.Item key={entry.name} value={`entry-${index}`}>
 | 
					            <Accordion.Item key={entry.name} value={`entry-${index}`}>
 | 
				
			||||||
              <Accordion.Control>
 | 
					              <Accordion.Control>
 | 
				
			||||||
                <Group position="apart" grow>
 | 
					                <Group justify="apart" grow>
 | 
				
			||||||
                  <Text>{entry.name}</Text>
 | 
					                  <Text>{entry.name}</Text>
 | 
				
			||||||
                  <Text>{entry.license}</Text>
 | 
					                  <Text>{entry.license}</Text>
 | 
				
			||||||
                  <Space />
 | 
					                  <Space />
 | 
				
			||||||
@@ -60,7 +60,7 @@ export function LicenseModal() {
 | 
				
			|||||||
  const rspdata = !data ? [] : Object.keys(data ?? {});
 | 
					  const rspdata = !data ? [] : Object.keys(data ?? {});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <Stack spacing="xs">
 | 
					    <Stack gap="xs">
 | 
				
			||||||
      <Divider />
 | 
					      <Divider />
 | 
				
			||||||
      <LoadingOverlay visible={isFetching} />
 | 
					      <LoadingOverlay visible={isFetching} />
 | 
				
			||||||
      {isFetching && (
 | 
					      {isFetching && (
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -137,7 +137,7 @@ export function ServerInfoModal({
 | 
				
			|||||||
        </tbody>
 | 
					        </tbody>
 | 
				
			||||||
      </Table>
 | 
					      </Table>
 | 
				
			||||||
      <Divider />
 | 
					      <Divider />
 | 
				
			||||||
      <Group position="right">
 | 
					      <Group justify="right">
 | 
				
			||||||
        <Button
 | 
					        <Button
 | 
				
			||||||
          color="red"
 | 
					          color="red"
 | 
				
			||||||
          onClick={() => {
 | 
					          onClick={() => {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -42,7 +42,7 @@ export function BreadcrumbList({
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <Paper p="3" radius="xs">
 | 
					    <Paper p="3" radius="xs">
 | 
				
			||||||
      <Group spacing="xs">
 | 
					      <Group gap="xs">
 | 
				
			||||||
        {navCallback && (
 | 
					        {navCallback && (
 | 
				
			||||||
          <ActionIcon key="nav-action" onClick={navCallback}>
 | 
					          <ActionIcon key="nav-action" onClick={navCallback}>
 | 
				
			||||||
            <IconMenu2 />
 | 
					            <IconMenu2 />
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -79,7 +79,7 @@ function DetailDrawerComponent({
 | 
				
			|||||||
        </Group>
 | 
					        </Group>
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    >
 | 
					    >
 | 
				
			||||||
      <Stack spacing={'xs'} className={classes.flex}>
 | 
					      <Stack gap={'xs'} className={classes.flex}>
 | 
				
			||||||
        <Divider />
 | 
					        <Divider />
 | 
				
			||||||
        {content}
 | 
					        {content}
 | 
				
			||||||
      </Stack>
 | 
					      </Stack>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -88,7 +88,7 @@ export function Header() {
 | 
				
			|||||||
        }}
 | 
					        }}
 | 
				
			||||||
      />
 | 
					      />
 | 
				
			||||||
      <Container className={classes.layoutHeaderSection} size="100%">
 | 
					      <Container className={classes.layoutHeaderSection} size="100%">
 | 
				
			||||||
        <Group position="apart">
 | 
					        <Group justify="apart">
 | 
				
			||||||
          <Group>
 | 
					          <Group>
 | 
				
			||||||
            <NavHoverMenu openDrawer={openNavDrawer} />
 | 
					            <NavHoverMenu openDrawer={openNavDrawer} />
 | 
				
			||||||
            <NavTabs />
 | 
					            <NavTabs />
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,7 +22,7 @@ export function MainMenu() {
 | 
				
			|||||||
    <Menu width={260} position="bottom-end">
 | 
					    <Menu width={260} position="bottom-end">
 | 
				
			||||||
      <Menu.Target>
 | 
					      <Menu.Target>
 | 
				
			||||||
        <UnstyledButton className={classes.layoutHeaderUser}>
 | 
					        <UnstyledButton className={classes.layoutHeaderUser}>
 | 
				
			||||||
          <Group spacing={7}>
 | 
					          <Group gap={7}>
 | 
				
			||||||
            <Text weight={500} size="sm" sx={{ lineHeight: 1 }} mr={3}>
 | 
					            <Text weight={500} size="sm" sx={{ lineHeight: 1 }} mr={3}>
 | 
				
			||||||
              {userState.username() ? (
 | 
					              {userState.username() ? (
 | 
				
			||||||
                userState.username()
 | 
					                userState.username()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -56,7 +56,7 @@ export function NavHoverMenu({
 | 
				
			|||||||
      </HoverCard.Target>
 | 
					      </HoverCard.Target>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <HoverCard.Dropdown sx={{ overflow: 'hidden' }}>
 | 
					      <HoverCard.Dropdown sx={{ overflow: 'hidden' }}>
 | 
				
			||||||
        <Group position="apart" px="md">
 | 
					        <Group justify="apart" px="md">
 | 
				
			||||||
          <ActionIcon
 | 
					          <ActionIcon
 | 
				
			||||||
            onClick={openDrawer}
 | 
					            onClick={openDrawer}
 | 
				
			||||||
            onMouseOver={openDrawer}
 | 
					            onMouseOver={openDrawer}
 | 
				
			||||||
@@ -64,7 +64,7 @@ export function NavHoverMenu({
 | 
				
			|||||||
          >
 | 
					          >
 | 
				
			||||||
            <IconLayoutSidebar />
 | 
					            <IconLayoutSidebar />
 | 
				
			||||||
          </ActionIcon>
 | 
					          </ActionIcon>
 | 
				
			||||||
          <Group spacing={'xs'}>
 | 
					          <Group gap={'xs'}>
 | 
				
			||||||
            {instanceName ? (
 | 
					            {instanceName ? (
 | 
				
			||||||
              instanceName
 | 
					              instanceName
 | 
				
			||||||
            ) : (
 | 
					            ) : (
 | 
				
			||||||
@@ -89,7 +89,7 @@ export function NavHoverMenu({
 | 
				
			|||||||
        />
 | 
					        />
 | 
				
			||||||
        <MenuLinks links={onlyItems} highlighted={true} />
 | 
					        <MenuLinks links={onlyItems} highlighted={true} />
 | 
				
			||||||
        <div className={classes.headerDropdownFooter}>
 | 
					        <div className={classes.headerDropdownFooter}>
 | 
				
			||||||
          <Group position="apart">
 | 
					          <Group justify="apart">
 | 
				
			||||||
            <div>
 | 
					            <div>
 | 
				
			||||||
              <Text fw={500} fz="sm">
 | 
					              <Text fw={500} fz="sm">
 | 
				
			||||||
                <Trans>Get started</Trans>
 | 
					                <Trans>Get started</Trans>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -66,7 +66,7 @@ export function NotificationDrawer({
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
      }}
 | 
					      }}
 | 
				
			||||||
      title={
 | 
					      title={
 | 
				
			||||||
        <Group position="apart" noWrap={true}>
 | 
					        <Group justify="apart" wrap="nowrap">
 | 
				
			||||||
          <StylishText size="lg">{t`Notifications`}</StylishText>
 | 
					          <StylishText size="lg">{t`Notifications`}</StylishText>
 | 
				
			||||||
          <ActionIcon
 | 
					          <ActionIcon
 | 
				
			||||||
            onClick={() => {
 | 
					            onClick={() => {
 | 
				
			||||||
@@ -79,7 +79,7 @@ export function NotificationDrawer({
 | 
				
			|||||||
        </Group>
 | 
					        </Group>
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    >
 | 
					    >
 | 
				
			||||||
      <Stack spacing="xs">
 | 
					      <Stack gap="xs">
 | 
				
			||||||
        <Divider />
 | 
					        <Divider />
 | 
				
			||||||
        <LoadingOverlay visible={notificationQuery.isFetching} />
 | 
					        <LoadingOverlay visible={notificationQuery.isFetching} />
 | 
				
			||||||
        {(notificationQuery.data?.results?.length ?? 0) == 0 && (
 | 
					        {(notificationQuery.data?.results?.length ?? 0) == 0 && (
 | 
				
			||||||
@@ -88,8 +88,8 @@ export function NotificationDrawer({
 | 
				
			|||||||
          </Alert>
 | 
					          </Alert>
 | 
				
			||||||
        )}
 | 
					        )}
 | 
				
			||||||
        {notificationQuery.data?.results?.map((notification: any) => (
 | 
					        {notificationQuery.data?.results?.map((notification: any) => (
 | 
				
			||||||
          <Group position="apart" key={notification.pk}>
 | 
					          <Group justify="apart" key={notification.pk}>
 | 
				
			||||||
            <Stack spacing="3">
 | 
					            <Stack gap="3">
 | 
				
			||||||
              {notification?.target?.link ? (
 | 
					              {notification?.target?.link ? (
 | 
				
			||||||
                <Text
 | 
					                <Text
 | 
				
			||||||
                  size="sm"
 | 
					                  size="sm"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -32,7 +32,7 @@ export function PageDetail({
 | 
				
			|||||||
  actions?: ReactNode[];
 | 
					  actions?: ReactNode[];
 | 
				
			||||||
}) {
 | 
					}) {
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <Stack spacing="xs">
 | 
					    <Stack gap="xs">
 | 
				
			||||||
      {breadcrumbs && breadcrumbs.length > 0 && (
 | 
					      {breadcrumbs && breadcrumbs.length > 0 && (
 | 
				
			||||||
        <Paper p="xs" radius="xs" shadow="xs">
 | 
					        <Paper p="xs" radius="xs" shadow="xs">
 | 
				
			||||||
          <BreadcrumbList
 | 
					          <BreadcrumbList
 | 
				
			||||||
@@ -42,13 +42,13 @@ export function PageDetail({
 | 
				
			|||||||
        </Paper>
 | 
					        </Paper>
 | 
				
			||||||
      )}
 | 
					      )}
 | 
				
			||||||
      <Paper p="xs" radius="xs" shadow="xs">
 | 
					      <Paper p="xs" radius="xs" shadow="xs">
 | 
				
			||||||
        <Stack spacing="xs">
 | 
					        <Stack gap="xs">
 | 
				
			||||||
          <Group position="apart" noWrap={true}>
 | 
					          <Group justify="apart" wrap="nowrap">
 | 
				
			||||||
            <Group position="left" noWrap={true}>
 | 
					            <Group justify="left" wrap="nowrap">
 | 
				
			||||||
              {imageUrl && (
 | 
					              {imageUrl && (
 | 
				
			||||||
                <ApiImage src={imageUrl} radius="sm" height={64} width={64} />
 | 
					                <ApiImage src={imageUrl} radius="sm" height={64} width={64} />
 | 
				
			||||||
              )}
 | 
					              )}
 | 
				
			||||||
              <Stack spacing="xs">
 | 
					              <Stack gap="xs">
 | 
				
			||||||
                {title && <StylishText size="lg">{title}</StylishText>}
 | 
					                {title && <StylishText size="lg">{title}</StylishText>}
 | 
				
			||||||
                {subtitle && (
 | 
					                {subtitle && (
 | 
				
			||||||
                  <Text size="md" truncate>
 | 
					                  <Text size="md" truncate>
 | 
				
			||||||
@@ -59,12 +59,12 @@ export function PageDetail({
 | 
				
			|||||||
            </Group>
 | 
					            </Group>
 | 
				
			||||||
            <Space />
 | 
					            <Space />
 | 
				
			||||||
            {detail}
 | 
					            {detail}
 | 
				
			||||||
            <Group position="right" spacing="xs" noWrap>
 | 
					            <Group justify="right" gap="xs" wrap="nowrap">
 | 
				
			||||||
              {badges}
 | 
					              {badges}
 | 
				
			||||||
            </Group>
 | 
					            </Group>
 | 
				
			||||||
            <Space />
 | 
					            <Space />
 | 
				
			||||||
            {actions && (
 | 
					            {actions && (
 | 
				
			||||||
              <Group spacing={5} position="right">
 | 
					              <Group gap={5} justify="right">
 | 
				
			||||||
                {actions.map((action, idx) => (
 | 
					                {actions.map((action, idx) => (
 | 
				
			||||||
                  <Fragment key={idx}>{action}</Fragment>
 | 
					                  <Fragment key={idx}>{action}</Fragment>
 | 
				
			||||||
                ))}
 | 
					                ))}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -161,7 +161,7 @@ function BasePanelGroup({
 | 
				
			|||||||
                  width: '100%'
 | 
					                  width: '100%'
 | 
				
			||||||
                }}
 | 
					                }}
 | 
				
			||||||
              >
 | 
					              >
 | 
				
			||||||
                <Stack spacing="md">
 | 
					                <Stack gap="md">
 | 
				
			||||||
                  {panel.showHeadline !== false && (
 | 
					                  {panel.showHeadline !== false && (
 | 
				
			||||||
                    <>
 | 
					                    <>
 | 
				
			||||||
                      <StylishText size="xl">{panel.label}</StylishText>
 | 
					                      <StylishText size="xl">{panel.label}</StylishText>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -61,7 +61,7 @@ export function PartCategoryTree({
 | 
				
			|||||||
      <Group
 | 
					      <Group
 | 
				
			||||||
        position="apart"
 | 
					        position="apart"
 | 
				
			||||||
        key={node.id}
 | 
					        key={node.id}
 | 
				
			||||||
        noWrap={true}
 | 
					        wrap="nowrap"
 | 
				
			||||||
        onClick={() => {
 | 
					        onClick={() => {
 | 
				
			||||||
          onClose();
 | 
					          onClose();
 | 
				
			||||||
          navigate(`/part/category/${node.id}`);
 | 
					          navigate(`/part/category/${node.id}`);
 | 
				
			||||||
@@ -148,13 +148,13 @@ export function PartCategoryTree({
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
      }}
 | 
					      }}
 | 
				
			||||||
      title={
 | 
					      title={
 | 
				
			||||||
        <Group position="left" p="ms" spacing="md" noWrap={true}>
 | 
					        <Group justify="left" p="ms" gap="md" wrap="nowrap">
 | 
				
			||||||
          <IconSitemap />
 | 
					          <IconSitemap />
 | 
				
			||||||
          <StylishText size="lg">{t`Part Categories`}</StylishText>
 | 
					          <StylishText size="lg">{t`Part Categories`}</StylishText>
 | 
				
			||||||
        </Group>
 | 
					        </Group>
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    >
 | 
					    >
 | 
				
			||||||
      <Stack spacing="xs">
 | 
					      <Stack gap="xs">
 | 
				
			||||||
        <LoadingOverlay visible={treeQuery.isFetching} />
 | 
					        <LoadingOverlay visible={treeQuery.isFetching} />
 | 
				
			||||||
        <ReactTree
 | 
					        <ReactTree
 | 
				
			||||||
          nodes={treeQuery.data ?? []}
 | 
					          nodes={treeQuery.data ?? []}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -68,8 +68,8 @@ function QueryResultGroup({
 | 
				
			|||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <Paper shadow="sm" radius="xs" p="md" key={`paper-${query.model}`}>
 | 
					    <Paper shadow="sm" radius="xs" p="md" key={`paper-${query.model}`}>
 | 
				
			||||||
      <Stack key={`stack-${query.model}`}>
 | 
					      <Stack key={`stack-${query.model}`}>
 | 
				
			||||||
        <Group position="apart" noWrap={true}>
 | 
					        <Group justify="apart" wrap="nowrap">
 | 
				
			||||||
          <Group position="left" spacing={5} noWrap={true}>
 | 
					          <Group justify="left" gap={5} wrap="nowrap">
 | 
				
			||||||
            <Text size="lg">{model.label_multiple}</Text>
 | 
					            <Text size="lg">{model.label_multiple}</Text>
 | 
				
			||||||
            <Text size="sm" italic>
 | 
					            <Text size="sm" italic>
 | 
				
			||||||
              {' '}
 | 
					              {' '}
 | 
				
			||||||
@@ -331,7 +331,7 @@ export function SearchDrawer({
 | 
				
			|||||||
      withCloseButton={false}
 | 
					      withCloseButton={false}
 | 
				
			||||||
      styles={{ header: { width: '100%' }, title: { width: '100%' } }}
 | 
					      styles={{ header: { width: '100%' }, title: { width: '100%' } }}
 | 
				
			||||||
      title={
 | 
					      title={
 | 
				
			||||||
        <Group position="apart" spacing={1} noWrap={true}>
 | 
					        <Group justify="apart" gap={1} wrap="nowrap">
 | 
				
			||||||
          <TextInput
 | 
					          <TextInput
 | 
				
			||||||
            placeholder={t`Enter search text`}
 | 
					            placeholder={t`Enter search text`}
 | 
				
			||||||
            radius="xs"
 | 
					            radius="xs"
 | 
				
			||||||
@@ -392,7 +392,7 @@ export function SearchDrawer({
 | 
				
			|||||||
        </Center>
 | 
					        </Center>
 | 
				
			||||||
      )}
 | 
					      )}
 | 
				
			||||||
      {!searchQuery.isFetching && !searchQuery.isError && (
 | 
					      {!searchQuery.isFetching && !searchQuery.isError && (
 | 
				
			||||||
        <Stack spacing="md">
 | 
					        <Stack gap="md">
 | 
				
			||||||
          {queryResults.map((query, idx) => (
 | 
					          {queryResults.map((query, idx) => (
 | 
				
			||||||
            <QueryResultGroup
 | 
					            <QueryResultGroup
 | 
				
			||||||
              key={idx}
 | 
					              key={idx}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,7 +22,7 @@ export function SettingsHeader({
 | 
				
			|||||||
  switch_link?: string;
 | 
					  switch_link?: string;
 | 
				
			||||||
}) {
 | 
					}) {
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <Stack spacing="0" ml={'sm'}>
 | 
					    <Stack gap="0" ml={'sm'}>
 | 
				
			||||||
      <Group>
 | 
					      <Group>
 | 
				
			||||||
        <Title order={3}>{title}</Title>
 | 
					        <Title order={3}>{title}</Title>
 | 
				
			||||||
        {shorthand && <Text c="dimmed">({shorthand})</Text>}
 | 
					        {shorthand && <Text c="dimmed">({shorthand})</Text>}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -53,7 +53,7 @@ export function StockLocationTree({
 | 
				
			|||||||
      <Group
 | 
					      <Group
 | 
				
			||||||
        position="apart"
 | 
					        position="apart"
 | 
				
			||||||
        key={node.id}
 | 
					        key={node.id}
 | 
				
			||||||
        noWrap={true}
 | 
					        wrap="nowrap"
 | 
				
			||||||
        onClick={() => {
 | 
					        onClick={() => {
 | 
				
			||||||
          onClose();
 | 
					          onClose();
 | 
				
			||||||
          navigate(`/stock/location/${node.id}`);
 | 
					          navigate(`/stock/location/${node.id}`);
 | 
				
			||||||
@@ -88,13 +88,13 @@ export function StockLocationTree({
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
      }}
 | 
					      }}
 | 
				
			||||||
      title={
 | 
					      title={
 | 
				
			||||||
        <Group position="left" noWrap={true} spacing="md" p="md">
 | 
					        <Group justify="left" wrap="nowrap" gap="md" p="md">
 | 
				
			||||||
          <IconSitemap />
 | 
					          <IconSitemap />
 | 
				
			||||||
          <StylishText size="lg">{t`Stock Locations`}</StylishText>
 | 
					          <StylishText size="lg">{t`Stock Locations`}</StylishText>
 | 
				
			||||||
        </Group>
 | 
					        </Group>
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    >
 | 
					    >
 | 
				
			||||||
      <Stack spacing="xs">
 | 
					      <Stack gap="xs">
 | 
				
			||||||
        <LoadingOverlay visible={treeQuery.isFetching} />
 | 
					        <LoadingOverlay visible={treeQuery.isFetching} />
 | 
				
			||||||
        <ReactTree
 | 
					        <ReactTree
 | 
				
			||||||
          nodes={treeQuery.data ?? []}
 | 
					          nodes={treeQuery.data ?? []}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -113,8 +113,8 @@ export function RenderInlineModel({
 | 
				
			|||||||
  // TODO: Handle URL
 | 
					  // TODO: Handle URL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <Group spacing="xs" position="apart" noWrap={true}>
 | 
					    <Group gap="xs" justify="apart" wrap="nowrap">
 | 
				
			||||||
      <Group spacing="xs" position="left" noWrap={true}>
 | 
					      <Group gap="xs" justify="left" wrap="nowrap">
 | 
				
			||||||
        {image && Thumbnail({ src: image, size: 18 })}
 | 
					        {image && Thumbnail({ src: image, size: 18 })}
 | 
				
			||||||
        <Text size="sm">{primary}</Text>
 | 
					        <Text size="sm">{primary}</Text>
 | 
				
			||||||
        {secondary && <Text size="xs">{secondary}</Text>}
 | 
					        {secondary && <Text size="xs">{secondary}</Text>}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -137,7 +137,7 @@ function SettingValue({
 | 
				
			|||||||
      );
 | 
					      );
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
      return valueText ? (
 | 
					      return valueText ? (
 | 
				
			||||||
        <Group spacing="xs" position="right">
 | 
					        <Group gap="xs" justify="right">
 | 
				
			||||||
          <Space />
 | 
					          <Space />
 | 
				
			||||||
          <Button variant="subtle" onClick={onEditButton}>
 | 
					          <Button variant="subtle" onClick={onEditButton}>
 | 
				
			||||||
            {valueText}
 | 
					            {valueText}
 | 
				
			||||||
@@ -177,8 +177,8 @@ export function SettingItem({
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <Paper style={style}>
 | 
					    <Paper style={style}>
 | 
				
			||||||
      <Group position="apart" p="3">
 | 
					      <Group justify="apart" p="3">
 | 
				
			||||||
        <Stack spacing="2" p="4px">
 | 
					        <Stack gap="2" p="4px">
 | 
				
			||||||
          <Text>
 | 
					          <Text>
 | 
				
			||||||
            {setting.name}
 | 
					            {setting.name}
 | 
				
			||||||
            {setting.required ? ' *' : ''}
 | 
					            {setting.required ? ' *' : ''}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -35,7 +35,7 @@ export function SettingList({
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <>
 | 
					    <>
 | 
				
			||||||
      <Stack spacing="xs">
 | 
					      <Stack gap="xs">
 | 
				
			||||||
        {(keys || allKeys).map((key, i) => {
 | 
					        {(keys || allKeys).map((key, i) => {
 | 
				
			||||||
          const setting = settingsState?.settings?.find(
 | 
					          const setting = settingsState?.settings?.find(
 | 
				
			||||||
            (s: any) => s.key === key
 | 
					            (s: any) => s.key === key
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -134,7 +134,7 @@ function WidgetControlBar({
 | 
				
			|||||||
  useHotkeys([['mod+E', () => editFnc()]]);
 | 
					  useHotkeys([['mod+E', () => editFnc()]]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <Group position="right">
 | 
					    <Group justify="right">
 | 
				
			||||||
      <Menu
 | 
					      <Menu
 | 
				
			||||||
        shadow="md"
 | 
					        shadow="md"
 | 
				
			||||||
        width={200}
 | 
					        width={200}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -244,7 +244,7 @@ export function openModalApiForm(props: OpenApiFormProps) {
 | 
				
			|||||||
          props.onClose ? props.onClose() : null;
 | 
					          props.onClose ? props.onClose() : null;
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        children: (
 | 
					        children: (
 | 
				
			||||||
          <Stack spacing={'xs'}>
 | 
					          <Stack gap={'xs'}>
 | 
				
			||||||
            <Divider />
 | 
					            <Divider />
 | 
				
			||||||
            <ApiForm id={modalId} props={props} optionsLoading={false} />
 | 
					            <ApiForm id={modalId} props={props} optionsLoading={false} />
 | 
				
			||||||
          </Stack>
 | 
					          </Stack>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -62,7 +62,7 @@ export function useApiFormModal(props: ApiFormModalProps) {
 | 
				
			|||||||
    closeOnClickOutside: formProps.closeOnClickOutside,
 | 
					    closeOnClickOutside: formProps.closeOnClickOutside,
 | 
				
			||||||
    size: props.size ?? 'xl',
 | 
					    size: props.size ?? 'xl',
 | 
				
			||||||
    children: (
 | 
					    children: (
 | 
				
			||||||
      <Stack spacing={'xs'}>
 | 
					      <Stack gap={'xs'}>
 | 
				
			||||||
        <Divider />
 | 
					        <Divider />
 | 
				
			||||||
        <OptionsApiForm props={formProps} id={id} />
 | 
					        <OptionsApiForm props={formProps} id={id} />
 | 
				
			||||||
      </Stack>
 | 
					      </Stack>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,7 +22,7 @@ export default function Logged_In() {
 | 
				
			|||||||
              <Text size="lg">
 | 
					              <Text size="lg">
 | 
				
			||||||
                <Trans>Checking if you are already logged in</Trans>
 | 
					                <Trans>Checking if you are already logged in</Trans>
 | 
				
			||||||
              </Text>
 | 
					              </Text>
 | 
				
			||||||
              <Group position="center">
 | 
					              <Group justify="center">
 | 
				
			||||||
                <Loader />
 | 
					                <Loader />
 | 
				
			||||||
              </Group>
 | 
					              </Group>
 | 
				
			||||||
            </Stack>
 | 
					            </Stack>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -240,14 +240,14 @@ export default function Scan() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    if (uniqueObjectTypes.length === 0) {
 | 
					    if (uniqueObjectTypes.length === 0) {
 | 
				
			||||||
      return (
 | 
					      return (
 | 
				
			||||||
        <Group spacing={0}>
 | 
					        <Group gap={0}>
 | 
				
			||||||
          <IconQuestionMark color="orange" />
 | 
					          <IconQuestionMark color="orange" />
 | 
				
			||||||
          <Trans>Selected elements are not known</Trans>
 | 
					          <Trans>Selected elements are not known</Trans>
 | 
				
			||||||
        </Group>
 | 
					        </Group>
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
    } else if (uniqueObjectTypes.length > 1) {
 | 
					    } else if (uniqueObjectTypes.length > 1) {
 | 
				
			||||||
      return (
 | 
					      return (
 | 
				
			||||||
        <Group spacing={0}>
 | 
					        <Group gap={0}>
 | 
				
			||||||
          <IconAlertCircle color="orange" />
 | 
					          <IconAlertCircle color="orange" />
 | 
				
			||||||
          <Trans>Multiple object types selected</Trans>
 | 
					          <Trans>Multiple object types selected</Trans>
 | 
				
			||||||
        </Group>
 | 
					        </Group>
 | 
				
			||||||
@@ -270,8 +270,8 @@ export default function Scan() {
 | 
				
			|||||||
  // rendering
 | 
					  // rendering
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <>
 | 
					    <>
 | 
				
			||||||
      <Group position="apart">
 | 
					      <Group justify="apart">
 | 
				
			||||||
        <Group position="left">
 | 
					        <Group justify="left">
 | 
				
			||||||
          <StylishText>
 | 
					          <StylishText>
 | 
				
			||||||
            <Trans>Scan Page</Trans>
 | 
					            <Trans>Scan Page</Trans>
 | 
				
			||||||
          </StylishText>
 | 
					          </StylishText>
 | 
				
			||||||
@@ -287,8 +287,8 @@ export default function Scan() {
 | 
				
			|||||||
      <Grid maw={'100%'}>
 | 
					      <Grid maw={'100%'}>
 | 
				
			||||||
        <Col span={4}>
 | 
					        <Col span={4}>
 | 
				
			||||||
          <Stack>
 | 
					          <Stack>
 | 
				
			||||||
            <Stack spacing="xs">
 | 
					            <Stack gap="xs">
 | 
				
			||||||
              <Group position="apart">
 | 
					              <Group justify="apart">
 | 
				
			||||||
                <TitleWithDoc
 | 
					                <TitleWithDoc
 | 
				
			||||||
                  order={3}
 | 
					                  order={3}
 | 
				
			||||||
                  text={t`Select the input method you want to use to scan items.`}
 | 
					                  text={t`Select the input method you want to use to scan items.`}
 | 
				
			||||||
@@ -306,7 +306,7 @@ export default function Scan() {
 | 
				
			|||||||
              </Group>
 | 
					              </Group>
 | 
				
			||||||
              {inp}
 | 
					              {inp}
 | 
				
			||||||
            </Stack>
 | 
					            </Stack>
 | 
				
			||||||
            <Stack spacing={0}>
 | 
					            <Stack gap={0}>
 | 
				
			||||||
              <TitleWithDoc
 | 
					              <TitleWithDoc
 | 
				
			||||||
                order={3}
 | 
					                order={3}
 | 
				
			||||||
                text={t`Depending on the selected parts actions will be shown here. Not all barcode types are supported currently.`}
 | 
					                text={t`Depending on the selected parts actions will be shown here. Not all barcode types are supported currently.`}
 | 
				
			||||||
@@ -355,7 +355,7 @@ export default function Scan() {
 | 
				
			|||||||
          </Stack>
 | 
					          </Stack>
 | 
				
			||||||
        </Col>
 | 
					        </Col>
 | 
				
			||||||
        <Col span={8}>
 | 
					        <Col span={8}>
 | 
				
			||||||
          <Group position="apart">
 | 
					          <Group justify="apart">
 | 
				
			||||||
            <TitleWithDoc
 | 
					            <TitleWithDoc
 | 
				
			||||||
              order={3}
 | 
					              order={3}
 | 
				
			||||||
              text={t`History is locally kept in this browser.`}
 | 
					              text={t`History is locally kept in this browser.`}
 | 
				
			||||||
@@ -696,8 +696,8 @@ function InputImageBarcode({ action }: inputProps) {
 | 
				
			|||||||
  }, [cameraValue]);
 | 
					  }, [cameraValue]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <Stack spacing="xs">
 | 
					    <Stack gap="xs">
 | 
				
			||||||
      <Group spacing="xs">
 | 
					      <Group gap="xs">
 | 
				
			||||||
        <Select
 | 
					        <Select
 | 
				
			||||||
          value={cameraValue}
 | 
					          value={cameraValue}
 | 
				
			||||||
          onChange={setCameraValue}
 | 
					          onChange={setCameraValue}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -35,7 +35,7 @@ export function AccountDetailPanel() {
 | 
				
			|||||||
      </Group>
 | 
					      </Group>
 | 
				
			||||||
      <Group>
 | 
					      <Group>
 | 
				
			||||||
        {editing ? (
 | 
					        {editing ? (
 | 
				
			||||||
          <Stack spacing="xs">
 | 
					          <Stack gap="xs">
 | 
				
			||||||
            <TextInput
 | 
					            <TextInput
 | 
				
			||||||
              label="first name"
 | 
					              label="first name"
 | 
				
			||||||
              placeholder={t`First name`}
 | 
					              placeholder={t`First name`}
 | 
				
			||||||
@@ -46,14 +46,14 @@ export function AccountDetailPanel() {
 | 
				
			|||||||
              placeholder={t`Last name`}
 | 
					              placeholder={t`Last name`}
 | 
				
			||||||
              {...form.getInputProps('last_name')}
 | 
					              {...form.getInputProps('last_name')}
 | 
				
			||||||
            />
 | 
					            />
 | 
				
			||||||
            <Group position="right" mt="md">
 | 
					            <Group justify="right" mt="md">
 | 
				
			||||||
              <Button type="submit">
 | 
					              <Button type="submit">
 | 
				
			||||||
                <Trans>Submit</Trans>
 | 
					                <Trans>Submit</Trans>
 | 
				
			||||||
              </Button>
 | 
					              </Button>
 | 
				
			||||||
            </Group>
 | 
					            </Group>
 | 
				
			||||||
          </Stack>
 | 
					          </Stack>
 | 
				
			||||||
        ) : (
 | 
					        ) : (
 | 
				
			||||||
          <Stack spacing="0">
 | 
					          <Stack gap="0">
 | 
				
			||||||
            <Text>
 | 
					            <Text>
 | 
				
			||||||
              <Trans>First name: </Trans>
 | 
					              <Trans>First name: </Trans>
 | 
				
			||||||
              {form.values.first_name}
 | 
					              {form.values.first_name}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -137,7 +137,7 @@ function EmailContent({}: {}) {
 | 
				
			|||||||
                key={link.id}
 | 
					                key={link.id}
 | 
				
			||||||
                value={String(link.id)}
 | 
					                value={String(link.id)}
 | 
				
			||||||
                label={
 | 
					                label={
 | 
				
			||||||
                  <Group position="apart">
 | 
					                  <Group justify="apart">
 | 
				
			||||||
                    {link.email}
 | 
					                    {link.email}
 | 
				
			||||||
                    {link.primary && (
 | 
					                    {link.primary && (
 | 
				
			||||||
                      <Badge color="blue">
 | 
					                      <Badge color="blue">
 | 
				
			||||||
@@ -251,7 +251,7 @@ function SsoContent({ dataProvider }: { dataProvider: any | undefined }) {
 | 
				
			|||||||
        variant="outline"
 | 
					        variant="outline"
 | 
				
			||||||
        disabled={!provider.configured}
 | 
					        disabled={!provider.configured}
 | 
				
			||||||
      >
 | 
					      >
 | 
				
			||||||
        <Group position="apart">
 | 
					        <Group justify="apart">
 | 
				
			||||||
          {provider.display_name}
 | 
					          {provider.display_name}
 | 
				
			||||||
          {provider.configured == false && <IconAlertCircle />}
 | 
					          {provider.configured == false && <IconAlertCircle />}
 | 
				
			||||||
        </Group>
 | 
					        </Group>
 | 
				
			||||||
@@ -308,7 +308,7 @@ function SsoContent({ dataProvider }: { dataProvider: any | undefined }) {
 | 
				
			|||||||
            {currentProviders === undefined ? (
 | 
					            {currentProviders === undefined ? (
 | 
				
			||||||
              <Trans>Loading</Trans>
 | 
					              <Trans>Loading</Trans>
 | 
				
			||||||
            ) : (
 | 
					            ) : (
 | 
				
			||||||
              <Stack spacing="xs">
 | 
					              <Stack gap="xs">
 | 
				
			||||||
                {currentProviders.map((provider: any) => (
 | 
					                {currentProviders.map((provider: any) => (
 | 
				
			||||||
                  <ProviderButton key={provider.id} provider={provider} />
 | 
					                  <ProviderButton key={provider.id} provider={provider} />
 | 
				
			||||||
                ))}
 | 
					                ))}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -97,7 +97,7 @@ export default function AdminCenter() {
 | 
				
			|||||||
        label: t`Project Codes`,
 | 
					        label: t`Project Codes`,
 | 
				
			||||||
        icon: <IconListDetails />,
 | 
					        icon: <IconListDetails />,
 | 
				
			||||||
        content: (
 | 
					        content: (
 | 
				
			||||||
          <Stack spacing="xs">
 | 
					          <Stack gap="xs">
 | 
				
			||||||
            <GlobalSettingList keys={['PROJECT_CODES_ENABLED']} />
 | 
					            <GlobalSettingList keys={['PROJECT_CODES_ENABLED']} />
 | 
				
			||||||
            <Divider />
 | 
					            <Divider />
 | 
				
			||||||
            <ProjectCodeTable />
 | 
					            <ProjectCodeTable />
 | 
				
			||||||
@@ -144,7 +144,7 @@ export default function AdminCenter() {
 | 
				
			|||||||
  }, []);
 | 
					  }, []);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const QuickAction = () => (
 | 
					  const QuickAction = () => (
 | 
				
			||||||
    <Stack spacing={'xs'} ml={'sm'}>
 | 
					    <Stack gap={'xs'} ml={'sm'}>
 | 
				
			||||||
      <Title order={5}>
 | 
					      <Title order={5}>
 | 
				
			||||||
        <Trans>Quick Actions</Trans>
 | 
					        <Trans>Quick Actions</Trans>
 | 
				
			||||||
      </Title>
 | 
					      </Title>
 | 
				
			||||||
@@ -167,7 +167,7 @@ export default function AdminCenter() {
 | 
				
			|||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <Stack spacing="xs">
 | 
					    <Stack gap="xs">
 | 
				
			||||||
      <SettingsHeader
 | 
					      <SettingsHeader
 | 
				
			||||||
        title={t`Admin Center`}
 | 
					        title={t`Admin Center`}
 | 
				
			||||||
        subtitle={t`Advanced Options`}
 | 
					        subtitle={t`Advanced Options`}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -38,7 +38,7 @@ export default function MachineManagementPanel() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      <Space h="10px" />
 | 
					      <Space h="10px" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <Stack spacing={'xs'}>
 | 
					      <Stack gap={'xs'}>
 | 
				
			||||||
        <Title order={5}>
 | 
					        <Title order={5}>
 | 
				
			||||||
          <Trans>Machine types</Trans>
 | 
					          <Trans>Machine types</Trans>
 | 
				
			||||||
        </Title>
 | 
					        </Title>
 | 
				
			||||||
@@ -47,7 +47,7 @@ export default function MachineManagementPanel() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      <Space h="10px" />
 | 
					      <Space h="10px" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <Stack spacing={'xs'}>
 | 
					      <Stack gap={'xs'}>
 | 
				
			||||||
        <Group>
 | 
					        <Group>
 | 
				
			||||||
          <Title order={5}>
 | 
					          <Title order={5}>
 | 
				
			||||||
            <Trans>Machine Error Stack</Trans>
 | 
					            <Trans>Machine Error Stack</Trans>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,7 +8,7 @@ import { UserTable } from '../../../../tables/settings/UserTable';
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
export default function UserManagementPanel() {
 | 
					export default function UserManagementPanel() {
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <Stack spacing="xs">
 | 
					    <Stack gap="xs">
 | 
				
			||||||
      <Title order={5}>
 | 
					      <Title order={5}>
 | 
				
			||||||
        <Trans>Users</Trans>
 | 
					        <Trans>Users</Trans>
 | 
				
			||||||
      </Title>
 | 
					      </Title>
 | 
				
			||||||
@@ -21,7 +21,7 @@ export default function UserManagementPanel() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      <Divider />
 | 
					      <Divider />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <Stack spacing={0}>
 | 
					      <Stack gap={0}>
 | 
				
			||||||
        <Text>
 | 
					        <Text>
 | 
				
			||||||
          <Trans>Settings</Trans>
 | 
					          <Trans>Settings</Trans>
 | 
				
			||||||
        </Text>
 | 
					        </Text>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -288,7 +288,7 @@ export default function SystemSettings() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <>
 | 
					    <>
 | 
				
			||||||
      <Stack spacing="xs">
 | 
					      <Stack gap="xs">
 | 
				
			||||||
        <SettingsHeader
 | 
					        <SettingsHeader
 | 
				
			||||||
          title={t`System Settings`}
 | 
					          title={t`System Settings`}
 | 
				
			||||||
          subtitle={server.instance || ''}
 | 
					          subtitle={server.instance || ''}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -110,7 +110,7 @@ export default function UserSettings() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <>
 | 
					    <>
 | 
				
			||||||
      <Stack spacing="xs">
 | 
					      <Stack gap="xs">
 | 
				
			||||||
        <SettingsHeader
 | 
					        <SettingsHeader
 | 
				
			||||||
          title={t`Account Settings`}
 | 
					          title={t`Account Settings`}
 | 
				
			||||||
          subtitle={`${user?.first_name} ${user?.last_name}`}
 | 
					          subtitle={`${user?.first_name} ${user?.last_name}`}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -349,7 +349,7 @@ export default function BuildDetail() {
 | 
				
			|||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <>
 | 
					    <>
 | 
				
			||||||
      {editBuild.modal}
 | 
					      {editBuild.modal}
 | 
				
			||||||
      <Stack spacing="xs">
 | 
					      <Stack gap="xs">
 | 
				
			||||||
        <LoadingOverlay visible={instanceQuery.isFetching} />
 | 
					        <LoadingOverlay visible={instanceQuery.isFetching} />
 | 
				
			||||||
        <PageDetail
 | 
					        <PageDetail
 | 
				
			||||||
          title={build.reference}
 | 
					          title={build.reference}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -296,7 +296,7 @@ export default function CompanyDetail(props: CompanyDetailProps) {
 | 
				
			|||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <>
 | 
					    <>
 | 
				
			||||||
      {editCompany.modal}
 | 
					      {editCompany.modal}
 | 
				
			||||||
      <Stack spacing="xs">
 | 
					      <Stack gap="xs">
 | 
				
			||||||
        <LoadingOverlay visible={instanceQuery.isFetching} />
 | 
					        <LoadingOverlay visible={instanceQuery.isFetching} />
 | 
				
			||||||
        <PageDetail
 | 
					        <PageDetail
 | 
				
			||||||
          title={t`Company` + `: ${company.name}`}
 | 
					          title={t`Company` + `: ${company.name}`}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -227,7 +227,7 @@ export default function ManufacturerPartDetail() {
 | 
				
			|||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <>
 | 
					    <>
 | 
				
			||||||
      {editManufacturerPart.modal}
 | 
					      {editManufacturerPart.modal}
 | 
				
			||||||
      <Stack spacing="xs">
 | 
					      <Stack gap="xs">
 | 
				
			||||||
        <LoadingOverlay visible={instanceQuery.isFetching} />
 | 
					        <LoadingOverlay visible={instanceQuery.isFetching} />
 | 
				
			||||||
        <PageDetail
 | 
					        <PageDetail
 | 
				
			||||||
          title={t`ManufacturerPart`}
 | 
					          title={t`ManufacturerPart`}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -272,7 +272,7 @@ export default function SupplierPartDetail() {
 | 
				
			|||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <>
 | 
					    <>
 | 
				
			||||||
      {editSuppliertPart.modal}
 | 
					      {editSuppliertPart.modal}
 | 
				
			||||||
      <Stack spacing="xs">
 | 
					      <Stack gap="xs">
 | 
				
			||||||
        <LoadingOverlay visible={instanceQuery.isFetching} />
 | 
					        <LoadingOverlay visible={instanceQuery.isFetching} />
 | 
				
			||||||
        <PageDetail
 | 
					        <PageDetail
 | 
				
			||||||
          title={t`Supplier Part`}
 | 
					          title={t`Supplier Part`}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -222,7 +222,7 @@ export default function CategoryDetail({}: {}) {
 | 
				
			|||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <>
 | 
					    <>
 | 
				
			||||||
      {editCategory.modal}
 | 
					      {editCategory.modal}
 | 
				
			||||||
      <Stack spacing="xs">
 | 
					      <Stack gap="xs">
 | 
				
			||||||
        <LoadingOverlay visible={instanceQuery.isFetching} />
 | 
					        <LoadingOverlay visible={instanceQuery.isFetching} />
 | 
				
			||||||
        <PartCategoryTree
 | 
					        <PartCategoryTree
 | 
				
			||||||
          opened={treeOpen}
 | 
					          opened={treeOpen}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -452,7 +452,7 @@ export default function PartDetail() {
 | 
				
			|||||||
            />
 | 
					            />
 | 
				
			||||||
          </Grid.Col>
 | 
					          </Grid.Col>
 | 
				
			||||||
          <Grid.Col span={8}>
 | 
					          <Grid.Col span={8}>
 | 
				
			||||||
            <Stack spacing="xs">
 | 
					            <Stack gap="xs">
 | 
				
			||||||
              <table>
 | 
					              <table>
 | 
				
			||||||
                <PartIcons part={part} />
 | 
					                <PartIcons part={part} />
 | 
				
			||||||
              </table>
 | 
					              </table>
 | 
				
			||||||
@@ -752,7 +752,7 @@ export default function PartDetail() {
 | 
				
			|||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <>
 | 
					    <>
 | 
				
			||||||
      {editPart.modal}
 | 
					      {editPart.modal}
 | 
				
			||||||
      <Stack spacing="xs">
 | 
					      <Stack gap="xs">
 | 
				
			||||||
        <LoadingOverlay visible={instanceQuery.isFetching} />
 | 
					        <LoadingOverlay visible={instanceQuery.isFetching} />
 | 
				
			||||||
        <PartCategoryTree
 | 
					        <PartCategoryTree
 | 
				
			||||||
          opened={treeOpen}
 | 
					          opened={treeOpen}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -313,7 +313,7 @@ export default function PurchaseOrderDetail() {
 | 
				
			|||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <>
 | 
					    <>
 | 
				
			||||||
      {editPurchaseOrder.modal}
 | 
					      {editPurchaseOrder.modal}
 | 
				
			||||||
      <Stack spacing="xs">
 | 
					      <Stack gap="xs">
 | 
				
			||||||
        <LoadingOverlay visible={instanceQuery.isFetching} />
 | 
					        <LoadingOverlay visible={instanceQuery.isFetching} />
 | 
				
			||||||
        <PageDetail
 | 
					        <PageDetail
 | 
				
			||||||
          title={t`Purchase Order` + `: ${order.reference}`}
 | 
					          title={t`Purchase Order` + `: ${order.reference}`}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -235,7 +235,7 @@ export default function ReturnOrderDetail() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <>
 | 
					    <>
 | 
				
			||||||
      <Stack spacing="xs">
 | 
					      <Stack gap="xs">
 | 
				
			||||||
        <LoadingOverlay visible={instanceQuery.isFetching} />
 | 
					        <LoadingOverlay visible={instanceQuery.isFetching} />
 | 
				
			||||||
        <PageDetail
 | 
					        <PageDetail
 | 
				
			||||||
          title={t`Return Order` + `: ${order.reference}`}
 | 
					          title={t`Return Order` + `: ${order.reference}`}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -259,7 +259,7 @@ export default function SalesOrderDetail() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <>
 | 
					    <>
 | 
				
			||||||
      <Stack spacing="xs">
 | 
					      <Stack gap="xs">
 | 
				
			||||||
        <LoadingOverlay visible={instanceQuery.isFetching} />
 | 
					        <LoadingOverlay visible={instanceQuery.isFetching} />
 | 
				
			||||||
        <PageDetail
 | 
					        <PageDetail
 | 
				
			||||||
          title={t`Sales Order` + `: ${order.reference}`}
 | 
					          title={t`Sales Order` + `: ${order.reference}`}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -41,12 +41,12 @@ function FilterItem({
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <Paper p="sm" shadow="sm" radius="xs">
 | 
					    <Paper p="sm" shadow="sm" radius="xs">
 | 
				
			||||||
      <Group position="apart" key={flt.name}>
 | 
					      <Group justify="apart" key={flt.name}>
 | 
				
			||||||
        <Stack spacing="xs">
 | 
					        <Stack gap="xs">
 | 
				
			||||||
          <Text size="sm">{flt.label}</Text>
 | 
					          <Text size="sm">{flt.label}</Text>
 | 
				
			||||||
          <Text size="xs">{flt.description}</Text>
 | 
					          <Text size="xs">{flt.description}</Text>
 | 
				
			||||||
        </Stack>
 | 
					        </Stack>
 | 
				
			||||||
        <Group position="right">
 | 
					        <Group justify="right">
 | 
				
			||||||
          <Badge>{flt.displayValue ?? flt.value}</Badge>
 | 
					          <Badge>{flt.displayValue ?? flt.value}</Badge>
 | 
				
			||||||
          <Tooltip label={t`Remove filter`} withinPortal={true}>
 | 
					          <Tooltip label={t`Remove filter`} withinPortal={true}>
 | 
				
			||||||
            <CloseButton size="md" color="red" onClick={removeFilter} />
 | 
					            <CloseButton size="md" color="red" onClick={removeFilter} />
 | 
				
			||||||
@@ -138,7 +138,7 @@ function FilterAddGroup({
 | 
				
			|||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <Stack spacing="xs">
 | 
					    <Stack gap="xs">
 | 
				
			||||||
      <Divider />
 | 
					      <Divider />
 | 
				
			||||||
      <Select
 | 
					      <Select
 | 
				
			||||||
        data={filterOptions}
 | 
					        data={filterOptions}
 | 
				
			||||||
@@ -195,14 +195,14 @@ export function FilterSelectDrawer({
 | 
				
			|||||||
      onClose={onClose}
 | 
					      onClose={onClose}
 | 
				
			||||||
      title={<StylishText size="lg">{t`Table Filters`}</StylishText>}
 | 
					      title={<StylishText size="lg">{t`Table Filters`}</StylishText>}
 | 
				
			||||||
    >
 | 
					    >
 | 
				
			||||||
      <Stack spacing="xs">
 | 
					      <Stack gap="xs">
 | 
				
			||||||
        {hasFilters &&
 | 
					        {hasFilters &&
 | 
				
			||||||
          tableState.activeFilters?.map((f) => (
 | 
					          tableState.activeFilters?.map((f) => (
 | 
				
			||||||
            <FilterItem key={f.name} flt={f} tableState={tableState} />
 | 
					            <FilterItem key={f.name} flt={f} tableState={tableState} />
 | 
				
			||||||
          ))}
 | 
					          ))}
 | 
				
			||||||
        {hasFilters && <Divider />}
 | 
					        {hasFilters && <Divider />}
 | 
				
			||||||
        {addFilter && (
 | 
					        {addFilter && (
 | 
				
			||||||
          <Stack spacing="xs">
 | 
					          <Stack gap="xs">
 | 
				
			||||||
            <FilterAddGroup
 | 
					            <FilterAddGroup
 | 
				
			||||||
              tableState={tableState}
 | 
					              tableState={tableState}
 | 
				
			||||||
              availableFilters={availableFilters}
 | 
					              availableFilters={availableFilters}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -548,9 +548,9 @@ export function InvenTreeTable<T = any>({
 | 
				
			|||||||
          onClose={() => setFiltersVisible(false)}
 | 
					          onClose={() => setFiltersVisible(false)}
 | 
				
			||||||
        />
 | 
					        />
 | 
				
			||||||
      )}
 | 
					      )}
 | 
				
			||||||
      <Stack spacing="sm">
 | 
					      <Stack gap="sm">
 | 
				
			||||||
        <Group position="apart">
 | 
					        <Group justify="apart">
 | 
				
			||||||
          <Group position="left" key="custom-actions" spacing={5}>
 | 
					          <Group justify="left" key="custom-actions" gap={5}>
 | 
				
			||||||
            {tableProps.tableActions?.map((group, idx) => (
 | 
					            {tableProps.tableActions?.map((group, idx) => (
 | 
				
			||||||
              <Fragment key={idx}>{group}</Fragment>
 | 
					              <Fragment key={idx}>{group}</Fragment>
 | 
				
			||||||
            ))}
 | 
					            ))}
 | 
				
			||||||
@@ -583,7 +583,7 @@ export function InvenTreeTable<T = any>({
 | 
				
			|||||||
            )}
 | 
					            )}
 | 
				
			||||||
          </Group>
 | 
					          </Group>
 | 
				
			||||||
          <Space />
 | 
					          <Space />
 | 
				
			||||||
          <Group position="right" spacing={5}>
 | 
					          <Group justify="right" gap={5}>
 | 
				
			||||||
            {tableProps.enableSearch && (
 | 
					            {tableProps.enableSearch && (
 | 
				
			||||||
              <TableSearchInput
 | 
					              <TableSearchInput
 | 
				
			||||||
                searchCallback={(term: string) =>
 | 
					                searchCallback={(term: string) =>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,14 +29,14 @@ export function TableHoverCard({
 | 
				
			|||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <HoverCard withinPortal={true}>
 | 
					    <HoverCard withinPortal={true}>
 | 
				
			||||||
      <HoverCard.Target>
 | 
					      <HoverCard.Target>
 | 
				
			||||||
        <Group spacing="xs" position="apart" noWrap={true}>
 | 
					        <Group gap="xs" justify="apart" wrap="nowrap">
 | 
				
			||||||
          {value}
 | 
					          {value}
 | 
				
			||||||
          <IconInfoCircle size="16" color="blue" />
 | 
					          <IconInfoCircle size="16" color="blue" />
 | 
				
			||||||
        </Group>
 | 
					        </Group>
 | 
				
			||||||
      </HoverCard.Target>
 | 
					      </HoverCard.Target>
 | 
				
			||||||
      <HoverCard.Dropdown>
 | 
					      <HoverCard.Dropdown>
 | 
				
			||||||
        <Stack spacing="xs">
 | 
					        <Stack gap="xs">
 | 
				
			||||||
          <Group spacing="xs" position="left">
 | 
					          <Group gap="xs" justify="left">
 | 
				
			||||||
            <IconInfoCircle size="16" color="blue" />
 | 
					            <IconInfoCircle size="16" color="blue" />
 | 
				
			||||||
            <Text weight="bold">{title}</Text>
 | 
					            <Text weight="bold">{title}</Text>
 | 
				
			||||||
          </Group>
 | 
					          </Group>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -149,7 +149,7 @@ export function BomTable({
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
          let text =
 | 
					          let text =
 | 
				
			||||||
            available_stock <= 0 ? (
 | 
					            available_stock <= 0 ? (
 | 
				
			||||||
              <Text color="red" italic>{t`No stock`}</Text>
 | 
					              <Text c="red" italic>{t`No stock`}</Text>
 | 
				
			||||||
            ) : (
 | 
					            ) : (
 | 
				
			||||||
              available_stock
 | 
					              available_stock
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -142,7 +142,7 @@ export default function BuildLineTable({ params = {} }: { params?: any }) {
 | 
				
			|||||||
        ordering: 'unit_quantity',
 | 
					        ordering: 'unit_quantity',
 | 
				
			||||||
        render: (record: any) => {
 | 
					        render: (record: any) => {
 | 
				
			||||||
          return (
 | 
					          return (
 | 
				
			||||||
            <Group position="apart">
 | 
					            <Group justify="apart">
 | 
				
			||||||
              <Text>{record.bom_item_detail?.quantity}</Text>
 | 
					              <Text>{record.bom_item_detail?.quantity}</Text>
 | 
				
			||||||
              {record?.part_detail?.units && (
 | 
					              {record?.part_detail?.units && (
 | 
				
			||||||
                <Text size="xs">[{record.part_detail.units}]</Text>
 | 
					                <Text size="xs">[{record.part_detail.units}]</Text>
 | 
				
			||||||
@@ -156,7 +156,7 @@ export default function BuildLineTable({ params = {} }: { params?: any }) {
 | 
				
			|||||||
        sortable: true,
 | 
					        sortable: true,
 | 
				
			||||||
        render: (record: any) => {
 | 
					        render: (record: any) => {
 | 
				
			||||||
          return (
 | 
					          return (
 | 
				
			||||||
            <Group position="apart">
 | 
					            <Group justify="apart">
 | 
				
			||||||
              <Text>{record.quantity}</Text>
 | 
					              <Text>{record.quantity}</Text>
 | 
				
			||||||
              {record?.part_detail?.units && (
 | 
					              {record?.part_detail?.units && (
 | 
				
			||||||
                <Text size="xs">[{record.part_detail.units}]</Text>
 | 
					                <Text size="xs">[{record.part_detail.units}]</Text>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -39,7 +39,7 @@ export function CompanyTable({
 | 
				
			|||||||
        sortable: true,
 | 
					        sortable: true,
 | 
				
			||||||
        render: (record: any) => {
 | 
					        render: (record: any) => {
 | 
				
			||||||
          return (
 | 
					          return (
 | 
				
			||||||
            <Group spacing="xs" noWrap={true}>
 | 
					            <Group gap="xs" wrap="nowrap">
 | 
				
			||||||
              <Thumbnail
 | 
					              <Thumbnail
 | 
				
			||||||
                src={record.thumbnail ?? record.image ?? ''}
 | 
					                src={record.thumbnail ?? record.image ?? ''}
 | 
				
			||||||
                alt={record.name}
 | 
					                alt={record.name}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -54,7 +54,7 @@ function attachmentTableColumns(): TableColumn[] {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      render: function (record: any) {
 | 
					      render: function (record: any) {
 | 
				
			||||||
        return (
 | 
					        return (
 | 
				
			||||||
          <Group position="apart">
 | 
					          <Group justify="apart">
 | 
				
			||||||
            <Text>{record.upload_date}</Text>
 | 
					            <Text>{record.upload_date}</Text>
 | 
				
			||||||
            {record.user_detail && (
 | 
					            {record.user_detail && (
 | 
				
			||||||
              <Badge size="xs">{record.user_detail.username}</Badge>
 | 
					              <Badge size="xs">{record.user_detail.username}</Badge>
 | 
				
			||||||
@@ -227,7 +227,7 @@ export function AttachmentTable({
 | 
				
			|||||||
  }, [allowEdit]);
 | 
					  }, [allowEdit]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <Stack spacing="xs">
 | 
					    <Stack gap="xs">
 | 
				
			||||||
      {pk && pk > 0 && (
 | 
					      {pk && pk > 0 && (
 | 
				
			||||||
        <InvenTreeTable
 | 
					        <InvenTreeTable
 | 
				
			||||||
          key="attachment-table"
 | 
					          key="attachment-table"
 | 
				
			||||||
@@ -248,7 +248,7 @@ export function AttachmentTable({
 | 
				
			|||||||
      {allowEdit && validPk && (
 | 
					      {allowEdit && validPk && (
 | 
				
			||||||
        <Dropzone onDrop={uploadFiles} key="attachment-dropzone">
 | 
					        <Dropzone onDrop={uploadFiles} key="attachment-dropzone">
 | 
				
			||||||
          <Dropzone.Idle>
 | 
					          <Dropzone.Idle>
 | 
				
			||||||
            <Group position="center">
 | 
					            <Group justify="center">
 | 
				
			||||||
              <IconFileUpload size={24} />
 | 
					              <IconFileUpload size={24} />
 | 
				
			||||||
              <Text size="sm">{t`Upload attachment`}</Text>
 | 
					              <Text size="sm">{t`Upload attachment`}</Text>
 | 
				
			||||||
            </Group>
 | 
					            </Group>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -206,8 +206,8 @@ function MachineDrawer({
 | 
				
			|||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <Stack spacing="xs">
 | 
					    <Stack gap="xs">
 | 
				
			||||||
      <Group position="apart">
 | 
					      <Group justify="apart">
 | 
				
			||||||
        <Box></Box>
 | 
					        <Box></Box>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <Group>
 | 
					        <Group>
 | 
				
			||||||
@@ -277,8 +277,8 @@ function MachineDrawer({
 | 
				
			|||||||
      </Group>
 | 
					      </Group>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <Card withBorder>
 | 
					      <Card withBorder>
 | 
				
			||||||
        <Stack spacing="md">
 | 
					        <Stack gap="md">
 | 
				
			||||||
          <Group position="apart">
 | 
					          <Group justify="apart">
 | 
				
			||||||
            <Title order={4}>
 | 
					            <Title order={4}>
 | 
				
			||||||
              <Trans>Machine information</Trans>
 | 
					              <Trans>Machine information</Trans>
 | 
				
			||||||
            </Title>
 | 
					            </Title>
 | 
				
			||||||
@@ -286,10 +286,10 @@ function MachineDrawer({
 | 
				
			|||||||
              <IconRefresh />
 | 
					              <IconRefresh />
 | 
				
			||||||
            </ActionIcon>
 | 
					            </ActionIcon>
 | 
				
			||||||
          </Group>
 | 
					          </Group>
 | 
				
			||||||
          <Stack pos="relative" spacing="xs">
 | 
					          <Stack pos="relative" gap="xs">
 | 
				
			||||||
            <LoadingOverlay visible={isFetching} overlayOpacity={0} />
 | 
					            <LoadingOverlay visible={isFetching} overlayOpacity={0} />
 | 
				
			||||||
            <InfoItem name={t`Machine Type`}>
 | 
					            <InfoItem name={t`Machine Type`}>
 | 
				
			||||||
              <Group spacing="xs">
 | 
					              <Group gap="xs">
 | 
				
			||||||
                {machineType ? (
 | 
					                {machineType ? (
 | 
				
			||||||
                  <DetailDrawerLink
 | 
					                  <DetailDrawerLink
 | 
				
			||||||
                    to={`../type-${machine?.machine_type}`}
 | 
					                    to={`../type-${machine?.machine_type}`}
 | 
				
			||||||
@@ -302,7 +302,7 @@ function MachineDrawer({
 | 
				
			|||||||
              </Group>
 | 
					              </Group>
 | 
				
			||||||
            </InfoItem>
 | 
					            </InfoItem>
 | 
				
			||||||
            <InfoItem name={t`Machine Driver`}>
 | 
					            <InfoItem name={t`Machine Driver`}>
 | 
				
			||||||
              <Group spacing="xs">
 | 
					              <Group gap="xs">
 | 
				
			||||||
                {machineDriver ? (
 | 
					                {machineDriver ? (
 | 
				
			||||||
                  <DetailDrawerLink
 | 
					                  <DetailDrawerLink
 | 
				
			||||||
                    to={`../driver-${machine?.driver}`}
 | 
					                    to={`../driver-${machine?.driver}`}
 | 
				
			||||||
@@ -333,7 +333,7 @@ function MachineDrawer({
 | 
				
			|||||||
                <Text fz="sm">{machine?.status_text}</Text>
 | 
					                <Text fz="sm">{machine?.status_text}</Text>
 | 
				
			||||||
              </Flex>
 | 
					              </Flex>
 | 
				
			||||||
            </InfoItem>
 | 
					            </InfoItem>
 | 
				
			||||||
            <Group position="apart" spacing="xs">
 | 
					            <Group justify="apart" gap="xs">
 | 
				
			||||||
              <Text fz="sm" fw={700}>
 | 
					              <Text fz="sm" fw={700}>
 | 
				
			||||||
                <Trans>Errors</Trans>:
 | 
					                <Trans>Errors</Trans>:
 | 
				
			||||||
              </Text>
 | 
					              </Text>
 | 
				
			||||||
@@ -412,7 +412,7 @@ export function MachineListTable({
 | 
				
			|||||||
        sortable: true,
 | 
					        sortable: true,
 | 
				
			||||||
        render: function (record) {
 | 
					        render: function (record) {
 | 
				
			||||||
          return (
 | 
					          return (
 | 
				
			||||||
            <Group position="left" noWrap>
 | 
					            <Group justify="left" wrap="nowrap">
 | 
				
			||||||
              <MachineStatusIndicator machine={record} />
 | 
					              <MachineStatusIndicator machine={record} />
 | 
				
			||||||
              <Text>{record.name}</Text>
 | 
					              <Text>{record.name}</Text>
 | 
				
			||||||
              {record.restart_required && (
 | 
					              {record.restart_required && (
 | 
				
			||||||
@@ -432,7 +432,7 @@ export function MachineListTable({
 | 
				
			|||||||
            (m) => m.slug === record.machine_type
 | 
					            (m) => m.slug === record.machine_type
 | 
				
			||||||
          );
 | 
					          );
 | 
				
			||||||
          return (
 | 
					          return (
 | 
				
			||||||
            <Group spacing="xs">
 | 
					            <Group gap="xs">
 | 
				
			||||||
              <Text>
 | 
					              <Text>
 | 
				
			||||||
                {machineType ? machineType.name : record.machine_type}
 | 
					                {machineType ? machineType.name : record.machine_type}
 | 
				
			||||||
              </Text>
 | 
					              </Text>
 | 
				
			||||||
@@ -447,7 +447,7 @@ export function MachineListTable({
 | 
				
			|||||||
        render: (record) => {
 | 
					        render: (record) => {
 | 
				
			||||||
          const driver = machineDrivers?.find((d) => d.slug === record.driver);
 | 
					          const driver = machineDrivers?.find((d) => d.slug === record.driver);
 | 
				
			||||||
          return (
 | 
					          return (
 | 
				
			||||||
            <Group spacing="xs">
 | 
					            <Group gap="xs">
 | 
				
			||||||
              <Text>{driver ? driver.name : record.driver}</Text>
 | 
					              <Text>{driver ? driver.name : record.driver}</Text>
 | 
				
			||||||
              {!record.is_driver_available && <UnavailableIndicator />}
 | 
					              {!record.is_driver_available && <UnavailableIndicator />}
 | 
				
			||||||
            </Group>
 | 
					            </Group>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -78,7 +78,7 @@ function MachineTypeDrawer({ machineTypeSlug }: { machineTypeSlug: string }) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <Stack>
 | 
					    <Stack>
 | 
				
			||||||
      <Group position="center">
 | 
					      <Group justify="center">
 | 
				
			||||||
        <Title order={4}>
 | 
					        <Title order={4}>
 | 
				
			||||||
          {machineType ? machineType.name : machineTypeSlug}
 | 
					          {machineType ? machineType.name : machineTypeSlug}
 | 
				
			||||||
        </Title>
 | 
					        </Title>
 | 
				
			||||||
@@ -91,8 +91,8 @@ function MachineTypeDrawer({ machineTypeSlug }: { machineTypeSlug: string }) {
 | 
				
			|||||||
      )}
 | 
					      )}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <Card withBorder>
 | 
					      <Card withBorder>
 | 
				
			||||||
        <Stack spacing="md">
 | 
					        <Stack gap="md">
 | 
				
			||||||
          <Group position="apart">
 | 
					          <Group justify="apart">
 | 
				
			||||||
            <Title order={4}>
 | 
					            <Title order={4}>
 | 
				
			||||||
              <Trans>Machine type information</Trans>
 | 
					              <Trans>Machine type information</Trans>
 | 
				
			||||||
            </Title>
 | 
					            </Title>
 | 
				
			||||||
@@ -101,7 +101,7 @@ function MachineTypeDrawer({ machineTypeSlug }: { machineTypeSlug: string }) {
 | 
				
			|||||||
            </ActionIcon>
 | 
					            </ActionIcon>
 | 
				
			||||||
          </Group>
 | 
					          </Group>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          <Stack pos="relative" spacing="xs">
 | 
					          <Stack pos="relative" gap="xs">
 | 
				
			||||||
            <LoadingOverlay visible={isFetching} overlayOpacity={0} />
 | 
					            <LoadingOverlay visible={isFetching} overlayOpacity={0} />
 | 
				
			||||||
            <InfoItem name={t`Name`} value={machineType?.name} type="text" />
 | 
					            <InfoItem name={t`Name`} value={machineType?.name} type="text" />
 | 
				
			||||||
            <InfoItem name={t`Slug`} value={machineType?.slug} type="text" />
 | 
					            <InfoItem name={t`Slug`} value={machineType?.slug} type="text" />
 | 
				
			||||||
@@ -138,7 +138,7 @@ function MachineTypeDrawer({ machineTypeSlug }: { machineTypeSlug: string }) {
 | 
				
			|||||||
      </Card>
 | 
					      </Card>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <Card withBorder>
 | 
					      <Card withBorder>
 | 
				
			||||||
        <Stack spacing="md">
 | 
					        <Stack gap="md">
 | 
				
			||||||
          <Title order={4}>
 | 
					          <Title order={4}>
 | 
				
			||||||
            <Trans>Available drivers</Trans>
 | 
					            <Trans>Available drivers</Trans>
 | 
				
			||||||
          </Title>
 | 
					          </Title>
 | 
				
			||||||
@@ -182,7 +182,7 @@ function MachineDriverDrawer({
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <Stack>
 | 
					    <Stack>
 | 
				
			||||||
      <Group position="center">
 | 
					      <Group justify="center">
 | 
				
			||||||
        <Title order={4}>
 | 
					        <Title order={4}>
 | 
				
			||||||
          {machineDriver ? machineDriver.name : machineDriverSlug}
 | 
					          {machineDriver ? machineDriver.name : machineDriverSlug}
 | 
				
			||||||
        </Title>
 | 
					        </Title>
 | 
				
			||||||
@@ -195,8 +195,8 @@ function MachineDriverDrawer({
 | 
				
			|||||||
      )}
 | 
					      )}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <Card withBorder>
 | 
					      <Card withBorder>
 | 
				
			||||||
        <Stack spacing="md">
 | 
					        <Stack gap="md">
 | 
				
			||||||
          <Group position="apart">
 | 
					          <Group justify="apart">
 | 
				
			||||||
            <Title order={4}>
 | 
					            <Title order={4}>
 | 
				
			||||||
              <Trans>Machine driver information</Trans>
 | 
					              <Trans>Machine driver information</Trans>
 | 
				
			||||||
            </Title>
 | 
					            </Title>
 | 
				
			||||||
@@ -205,7 +205,7 @@ function MachineDriverDrawer({
 | 
				
			|||||||
            </ActionIcon>
 | 
					            </ActionIcon>
 | 
				
			||||||
          </Group>
 | 
					          </Group>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          <Stack pos="relative" spacing="xs">
 | 
					          <Stack pos="relative" gap="xs">
 | 
				
			||||||
            <LoadingOverlay visible={isFetching} overlayOpacity={0} />
 | 
					            <LoadingOverlay visible={isFetching} overlayOpacity={0} />
 | 
				
			||||||
            <InfoItem name={t`Name`} value={machineDriver?.name} type="text" />
 | 
					            <InfoItem name={t`Name`} value={machineDriver?.name} type="text" />
 | 
				
			||||||
            <InfoItem name={t`Slug`} value={machineDriver?.slug} type="text" />
 | 
					            <InfoItem name={t`Slug`} value={machineDriver?.slug} type="text" />
 | 
				
			||||||
@@ -250,7 +250,7 @@ function MachineDriverDrawer({
 | 
				
			|||||||
              value={machineDriver?.is_builtin}
 | 
					              value={machineDriver?.is_builtin}
 | 
				
			||||||
              type="boolean"
 | 
					              type="boolean"
 | 
				
			||||||
            />
 | 
					            />
 | 
				
			||||||
            <Group position="apart" spacing="xs">
 | 
					            <Group justify="apart" gap="xs">
 | 
				
			||||||
              <Text fz="sm" fw={700}>
 | 
					              <Text fz="sm" fw={700}>
 | 
				
			||||||
                <Trans>Errors</Trans>:
 | 
					                <Trans>Errors</Trans>:
 | 
				
			||||||
              </Text>
 | 
					              </Text>
 | 
				
			||||||
@@ -276,7 +276,7 @@ function MachineDriverDrawer({
 | 
				
			|||||||
      </Card>
 | 
					      </Card>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <Card withBorder>
 | 
					      <Card withBorder>
 | 
				
			||||||
        <Stack spacing="md">
 | 
					        <Stack gap="md">
 | 
				
			||||||
          <Title order={4}>
 | 
					          <Title order={4}>
 | 
				
			||||||
            <Trans>Machines</Trans>
 | 
					            <Trans>Machines</Trans>
 | 
				
			||||||
          </Title>
 | 
					          </Title>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -67,7 +67,7 @@ function ParameterCell({
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <div>
 | 
					    <div>
 | 
				
			||||||
      <Group grow ref={ref} position="apart">
 | 
					      <Group grow ref={ref} justify="apart">
 | 
				
			||||||
        <Group grow style={{ flex: 1 }}>
 | 
					        <Group grow style={{ flex: 1 }}>
 | 
				
			||||||
          <TableHoverCard
 | 
					          <TableHoverCard
 | 
				
			||||||
            value={value ?? '-'}
 | 
					            value={value ?? '-'}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -94,7 +94,7 @@ export default function PartCategoryTemplateTable({}: {}) {
 | 
				
			|||||||
          }
 | 
					          }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          return (
 | 
					          return (
 | 
				
			||||||
            <Group position="apart" grow>
 | 
					            <Group justify="apart" grow>
 | 
				
			||||||
              <Text>{record.default_value}</Text>
 | 
					              <Text>{record.default_value}</Text>
 | 
				
			||||||
              {units && <Text size="xs">{units}</Text>}
 | 
					              {units && <Text size="xs">{units}</Text>}
 | 
				
			||||||
            </Group>
 | 
					            </Group>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -140,7 +140,7 @@ function partTableColumns(): TableColumn[] {
 | 
				
			|||||||
        return (
 | 
					        return (
 | 
				
			||||||
          <TableHoverCard
 | 
					          <TableHoverCard
 | 
				
			||||||
            value={
 | 
					            value={
 | 
				
			||||||
              <Group spacing="xs" position="left" noWrap>
 | 
					              <Group gap="xs" justify="left" wrap="nowrap">
 | 
				
			||||||
                <Text color={color}>{text}</Text>
 | 
					                <Text color={color}>{text}</Text>
 | 
				
			||||||
                {record.units && (
 | 
					                {record.units && (
 | 
				
			||||||
                  <Text size="xs" color={color}>
 | 
					                  <Text size="xs" color={color}>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -38,7 +38,7 @@ export default function PartTestTemplateTable({ partId }: { partId: number }) {
 | 
				
			|||||||
          return (
 | 
					          return (
 | 
				
			||||||
            <Text
 | 
					            <Text
 | 
				
			||||||
              weight={record.required && 700}
 | 
					              weight={record.required && 700}
 | 
				
			||||||
              color={record.enabled ? undefined : 'red'}
 | 
					              c={record.enabled ? undefined : 'red'}
 | 
				
			||||||
            >
 | 
					            >
 | 
				
			||||||
              {record.test_name}
 | 
					              {record.test_name}
 | 
				
			||||||
            </Text>
 | 
					            </Text>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -185,7 +185,7 @@ export function PartThumbTable({
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      <Divider />
 | 
					      <Divider />
 | 
				
			||||||
      <Paper p="sm">
 | 
					      <Paper p="sm">
 | 
				
			||||||
        <Group position="apart">
 | 
					        <Group justify="apart">
 | 
				
			||||||
          <TextInput
 | 
					          <TextInput
 | 
				
			||||||
            placeholder={t`Search...`}
 | 
					            placeholder={t`Search...`}
 | 
				
			||||||
            onChange={(event) => {
 | 
					            onChange={(event) => {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -47,8 +47,8 @@ export function RelatedPartTable({ partId }: { partId: number }): ReactNode {
 | 
				
			|||||||
          let part = getPart(record);
 | 
					          let part = getPart(record);
 | 
				
			||||||
          return (
 | 
					          return (
 | 
				
			||||||
            <Group
 | 
					            <Group
 | 
				
			||||||
              noWrap={true}
 | 
					              wrap="nowrap"
 | 
				
			||||||
              position="left"
 | 
					              justify="left"
 | 
				
			||||||
              onClick={() => {
 | 
					              onClick={() => {
 | 
				
			||||||
                navigate(`/part/${part.pk}/`);
 | 
					                navigate(`/part/${part.pk}/`);
 | 
				
			||||||
              }}
 | 
					              }}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -119,11 +119,11 @@ export function PluginDrawer({
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <Stack spacing={'xs'}>
 | 
					    <Stack gap={'xs'}>
 | 
				
			||||||
      <Group position="apart">
 | 
					      <Group justify="apart">
 | 
				
			||||||
        <Box></Box>
 | 
					        <Box></Box>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <Group spacing={'xs'}>
 | 
					        <Group gap={'xs'}>
 | 
				
			||||||
          {plugin && PluginIcon(plugin)}
 | 
					          {plugin && PluginIcon(plugin)}
 | 
				
			||||||
          <Title order={4}>
 | 
					          <Title order={4}>
 | 
				
			||||||
            {plugin?.meta?.human_name ?? plugin?.name ?? '-'}
 | 
					            {plugin?.meta?.human_name ?? plugin?.name ?? '-'}
 | 
				
			||||||
@@ -161,11 +161,11 @@ export function PluginDrawer({
 | 
				
			|||||||
      <LoadingOverlay visible={isFetching} overlayOpacity={0} />
 | 
					      <LoadingOverlay visible={isFetching} overlayOpacity={0} />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <Card withBorder>
 | 
					      <Card withBorder>
 | 
				
			||||||
        <Stack spacing="md">
 | 
					        <Stack gap="md">
 | 
				
			||||||
          <Title order={4}>
 | 
					          <Title order={4}>
 | 
				
			||||||
            <Trans>Plugin information</Trans>
 | 
					            <Trans>Plugin information</Trans>
 | 
				
			||||||
          </Title>
 | 
					          </Title>
 | 
				
			||||||
          <Stack pos="relative" spacing="xs">
 | 
					          <Stack pos="relative" gap="xs">
 | 
				
			||||||
            <InfoItem type="text" name={t`Name`} value={plugin?.name} />
 | 
					            <InfoItem type="text" name={t`Name`} value={plugin?.name} />
 | 
				
			||||||
            <InfoItem
 | 
					            <InfoItem
 | 
				
			||||||
              type="text"
 | 
					              type="text"
 | 
				
			||||||
@@ -193,11 +193,11 @@ export function PluginDrawer({
 | 
				
			|||||||
      </Card>
 | 
					      </Card>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <Card withBorder>
 | 
					      <Card withBorder>
 | 
				
			||||||
        <Stack spacing="md">
 | 
					        <Stack gap="md">
 | 
				
			||||||
          <Title order={4}>
 | 
					          <Title order={4}>
 | 
				
			||||||
            <Trans>Package information</Trans>
 | 
					            <Trans>Package information</Trans>
 | 
				
			||||||
          </Title>
 | 
					          </Title>
 | 
				
			||||||
          <Stack pos="relative" spacing="xs">
 | 
					          <Stack pos="relative" gap="xs">
 | 
				
			||||||
            {plugin?.is_package && (
 | 
					            {plugin?.is_package && (
 | 
				
			||||||
              <InfoItem
 | 
					              <InfoItem
 | 
				
			||||||
                type="text"
 | 
					                type="text"
 | 
				
			||||||
@@ -226,7 +226,7 @@ export function PluginDrawer({
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      {plugin && plugin.active && (
 | 
					      {plugin && plugin.active && (
 | 
				
			||||||
        <Card withBorder>
 | 
					        <Card withBorder>
 | 
				
			||||||
          <Stack spacing="md">
 | 
					          <Stack gap="md">
 | 
				
			||||||
            <Title order={4}>
 | 
					            <Title order={4}>
 | 
				
			||||||
              <Trans>Plugin settings</Trans>
 | 
					              <Trans>Plugin settings</Trans>
 | 
				
			||||||
            </Title>
 | 
					            </Title>
 | 
				
			||||||
@@ -290,7 +290,7 @@ export default function PluginListTable() {
 | 
				
			|||||||
          // TODO: Add link to plugin detail page
 | 
					          // TODO: Add link to plugin detail page
 | 
				
			||||||
          // TODO: Add custom badges
 | 
					          // TODO: Add custom badges
 | 
				
			||||||
          return (
 | 
					          return (
 | 
				
			||||||
            <Group position="left">
 | 
					            <Group justify="left">
 | 
				
			||||||
              <PluginIcon {...record} />
 | 
					              <PluginIcon {...record} />
 | 
				
			||||||
              <Text>{record.name}</Text>
 | 
					              <Text>{record.name}</Text>
 | 
				
			||||||
            </Group>
 | 
					            </Group>
 | 
				
			||||||
@@ -344,7 +344,7 @@ export default function PluginListTable() {
 | 
				
			|||||||
                : t`Confirm plugin deactivation`
 | 
					                : t`Confirm plugin deactivation`
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          >
 | 
					          >
 | 
				
			||||||
            <Stack spacing="xs">
 | 
					            <Stack gap="xs">
 | 
				
			||||||
              <Text>
 | 
					              <Text>
 | 
				
			||||||
                {active
 | 
					                {active
 | 
				
			||||||
                  ? t`The following plugin will be activated`
 | 
					                  ? t`The following plugin will be activated`
 | 
				
			||||||
@@ -532,7 +532,7 @@ export default function PluginListTable() {
 | 
				
			|||||||
        icon={<IconInfoCircle />}
 | 
					        icon={<IconInfoCircle />}
 | 
				
			||||||
        title={t`Confirm plugin uninstall`}
 | 
					        title={t`Confirm plugin uninstall`}
 | 
				
			||||||
      >
 | 
					      >
 | 
				
			||||||
        <Stack spacing="xs">
 | 
					        <Stack gap="xs">
 | 
				
			||||||
          <Text>{t`The selected plugin will be uninstalled.`}</Text>
 | 
					          <Text>{t`The selected plugin will be uninstalled.`}</Text>
 | 
				
			||||||
          <Text>{t`This action cannot be undone.`}</Text>
 | 
					          <Text>{t`This action cannot be undone.`}</Text>
 | 
				
			||||||
        </Stack>
 | 
					        </Stack>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -31,7 +31,7 @@ export default function ScheduledTasksTable() {
 | 
				
			|||||||
          }
 | 
					          }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          return (
 | 
					          return (
 | 
				
			||||||
            <Group position="apart">
 | 
					            <Group justify="apart">
 | 
				
			||||||
              <Text>{record.last_run}</Text>
 | 
					              <Text>{record.last_run}</Text>
 | 
				
			||||||
              {record.success ? (
 | 
					              {record.success ? (
 | 
				
			||||||
                <IconCircleCheck color="green" />
 | 
					                <IconCircleCheck color="green" />
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -130,11 +130,11 @@ export function TemplateDrawer({
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <Stack spacing="xs" style={{ display: 'flex', flex: '1' }}>
 | 
					    <Stack gap="xs" style={{ display: 'flex', flex: '1' }}>
 | 
				
			||||||
      {editTemplate.modal}
 | 
					      {editTemplate.modal}
 | 
				
			||||||
      {deleteTemplate.modal}
 | 
					      {deleteTemplate.modal}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <Group position="apart">
 | 
					      <Group justify="apart">
 | 
				
			||||||
        <Box></Box>
 | 
					        <Box></Box>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <Group>
 | 
					        <Group>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -178,7 +178,7 @@ function stockItemTableColumns(): TableColumn[] {
 | 
				
			|||||||
        return (
 | 
					        return (
 | 
				
			||||||
          <TableHoverCard
 | 
					          <TableHoverCard
 | 
				
			||||||
            value={
 | 
					            value={
 | 
				
			||||||
              <Group spacing="xs" position="left" noWrap={true}>
 | 
					              <Group gap="xs" justify="left" wrap="nowrap">
 | 
				
			||||||
                <Text color={color}>{text}</Text>
 | 
					                <Text color={color}>{text}</Text>
 | 
				
			||||||
                {part.units && (
 | 
					                {part.units && (
 | 
				
			||||||
                  <Text size="xs" color={color}>
 | 
					                  <Text size="xs" color={color}>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -132,7 +132,7 @@ export default function StockItemTestResultTable({
 | 
				
			|||||||
            record.stock_item != undefined && record.stock_item != itemId;
 | 
					            record.stock_item != undefined && record.stock_item != itemId;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          return (
 | 
					          return (
 | 
				
			||||||
            <Group position="apart">
 | 
					            <Group justify="apart">
 | 
				
			||||||
              <Text
 | 
					              <Text
 | 
				
			||||||
                italic={installed}
 | 
					                italic={installed}
 | 
				
			||||||
                fw={required && 700}
 | 
					                fw={required && 700}
 | 
				
			||||||
@@ -141,7 +141,7 @@ export default function StockItemTestResultTable({
 | 
				
			|||||||
                {!record.templateId && '- '}
 | 
					                {!record.templateId && '- '}
 | 
				
			||||||
                {record.test_name ?? record.template_detail?.test_name}
 | 
					                {record.test_name ?? record.template_detail?.test_name}
 | 
				
			||||||
              </Text>
 | 
					              </Text>
 | 
				
			||||||
              <Group position="right">
 | 
					              <Group justify="right">
 | 
				
			||||||
                {record.results && record.results.length > 1 && (
 | 
					                {record.results && record.results.length > 1 && (
 | 
				
			||||||
                  <Tooltip label={t`Test Results`}>
 | 
					                  <Tooltip label={t`Test Results`}>
 | 
				
			||||||
                    <Badge color="lightblue" variant="filled">
 | 
					                    <Badge color="lightblue" variant="filled">
 | 
				
			||||||
@@ -194,7 +194,7 @@ export default function StockItemTestResultTable({
 | 
				
			|||||||
        title: t`Date`,
 | 
					        title: t`Date`,
 | 
				
			||||||
        render: (record: any) => {
 | 
					        render: (record: any) => {
 | 
				
			||||||
          return (
 | 
					          return (
 | 
				
			||||||
            <Group position="apart">
 | 
					            <Group justify="apart">
 | 
				
			||||||
              {renderDate(record.date)}
 | 
					              {renderDate(record.date)}
 | 
				
			||||||
              {record.user_detail && (
 | 
					              {record.user_detail && (
 | 
				
			||||||
                <RenderUser instance={record.user_detail} />
 | 
					                <RenderUser instance={record.user_detail} />
 | 
				
			||||||
@@ -214,7 +214,7 @@ export default function StockItemTestResultTable({
 | 
				
			|||||||
        title: t`Started`,
 | 
					        title: t`Started`,
 | 
				
			||||||
        render: (record: any) => {
 | 
					        render: (record: any) => {
 | 
				
			||||||
          return (
 | 
					          return (
 | 
				
			||||||
            <Group position="apart">
 | 
					            <Group justify="apart">
 | 
				
			||||||
              {renderDate(record.started_datetime, {
 | 
					              {renderDate(record.started_datetime, {
 | 
				
			||||||
                showTime: true,
 | 
					                showTime: true,
 | 
				
			||||||
                showSeconds: true
 | 
					                showSeconds: true
 | 
				
			||||||
@@ -229,7 +229,7 @@ export default function StockItemTestResultTable({
 | 
				
			|||||||
        title: t`Finished`,
 | 
					        title: t`Finished`,
 | 
				
			||||||
        render: (record: any) => {
 | 
					        render: (record: any) => {
 | 
				
			||||||
          return (
 | 
					          return (
 | 
				
			||||||
            <Group position="apart">
 | 
					            <Group justify="apart">
 | 
				
			||||||
              {renderDate(record.finished_datetime, {
 | 
					              {renderDate(record.finished_datetime, {
 | 
				
			||||||
                showTime: true,
 | 
					                showTime: true,
 | 
				
			||||||
                showSeconds: true
 | 
					                showSeconds: true
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,7 +18,7 @@ export default function MobileAppView() {
 | 
				
			|||||||
      <Center h="100vh">
 | 
					      <Center h="100vh">
 | 
				
			||||||
        <Container>
 | 
					        <Container>
 | 
				
			||||||
          <Stack>
 | 
					          <Stack>
 | 
				
			||||||
            <Title color="red">
 | 
					            <Title c="red">
 | 
				
			||||||
              <Trans>Mobile viewport detected</Trans>
 | 
					              <Trans>Mobile viewport detected</Trans>
 | 
				
			||||||
            </Title>
 | 
					            </Title>
 | 
				
			||||||
            <Text>
 | 
					            <Text>
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user