diff --git a/src/components/Dashboard/common/FileUpload.jsx b/src/components/Dashboard/common/FileUpload.jsx
index b4940ce..d5b3ef5 100644
--- a/src/components/Dashboard/common/FileUpload.jsx
+++ b/src/components/Dashboard/common/FileUpload.jsx
@@ -1,4 +1,4 @@
-import { Upload, Button, Flex, Typography, Space } from 'antd'
+import { Upload, Button, Flex, Typography, Space, Progress, Card } from 'antd'
import PropTypes from 'prop-types'
import { ApiServerContext } from '../context/ApiServerContext'
import UploadIcon from '../../Icons/UploadIcon'
@@ -6,6 +6,7 @@ import { useContext, useState, useEffect } from 'react'
import ObjectSelect from './ObjectSelect'
import FileList from './FileList'
import PlusIcon from '../../Icons/PlusIcon'
+import { LoadingOutlined } from '@ant-design/icons'
const { Text } = Typography
@@ -18,6 +19,8 @@ const FileUpload = ({
showInfo
}) => {
const { uploadFile } = useContext(ApiServerContext)
+ const [uploading, setUploading] = useState(false)
+ const [uploadProgress, setUploadProgress] = useState(0)
// Track current files using useState
const [currentFiles, setCurrentFiles] = useState(() => {
@@ -56,7 +59,11 @@ const FileUpload = ({
const handleFileUpload = async (file) => {
try {
- const uploadedFile = await uploadFile(file)
+ setUploading(true)
+ const uploadedFile = await uploadFile(file, {}, (progress) => {
+ setUploadProgress(progress)
+ })
+ setUploading(false)
if (uploadedFile) {
if (multiple) {
// For multiple files, add to existing array
@@ -95,7 +102,7 @@ const FileUpload = ({
return (
- {hasNoItems ? (
+ {hasNoItems && uploading == false ? (
) : null}
+ {uploading == true ? (
+
+
+ Uploading...
+ {uploadProgress > 0 ? (
+ <>
+ {uploadProgress >= 0 && uploadProgress < 100 ? (
+ <>
+
+ {uploadProgress}%
+ >
+ ) : null}
+ {uploadProgress == 100 ? : null}
+ >
+ ) : null}
+
+
+ ) : null}
{
+ if (!value) {
+ return n/a
+ }
+
+ return (
+
+
+ {value}
+
+
+ {showCopy && (
+
+ )}
+
+ )
+}
+
+MiscId.propTypes = {
+ value: PropTypes.string,
+ showCopy: PropTypes.bool
+}
+
+export default MiscId
diff --git a/src/components/Dashboard/common/NewObjectForm.jsx b/src/components/Dashboard/common/NewObjectForm.jsx
index 7bd8af4..eac6fbf 100644
--- a/src/components/Dashboard/common/NewObjectForm.jsx
+++ b/src/components/Dashboard/common/NewObjectForm.jsx
@@ -3,8 +3,20 @@ import { Form, message } from 'antd'
import { ApiServerContext } from '../context/ApiServerContext'
import PropTypes from 'prop-types'
import merge from 'lodash/merge'
+import set from 'lodash/set'
import { getModelByName } from '../../../database/ObjectModels'
+const buildObjectFromEntries = (entries = []) => {
+ return entries.reduce((acc, entry) => {
+ const { namePath, value } = entry || {}
+ if (!Array.isArray(namePath) || value === undefined) {
+ return acc
+ }
+ set(acc, namePath, value)
+ return acc
+ }, {})
+}
+
/**
* NewObjectForm is a reusable form component for creating new objects.
* It handles form validation, submission, and error handling logic.
@@ -30,41 +42,102 @@ const NewObjectForm = ({ type, style, defaultValues = {}, children }) => {
const model = getModelByName(type)
// Function to calculate computed values from model properties
- const calculateComputedValues = useCallback((currentData, model) => {
- if (!model || !model.properties) return {}
+ const calculateComputedValues = useCallback(
+ (currentData, modelDefinition) => {
+ if (!modelDefinition || !Array.isArray(modelDefinition.properties)) {
+ return []
+ }
- const computedValues = {}
+ const normalizedPath = (name, parentPath = []) => {
+ if (Array.isArray(name)) {
+ return [...parentPath, ...name]
+ }
+ if (typeof name === 'number') {
+ return [...parentPath, name]
+ }
+ if (typeof name === 'string' && name.length > 0) {
+ return [...parentPath, ...name.split('.')]
+ }
+ return parentPath
+ }
- model.properties.forEach((property) => {
- // Check if this property has a computed value function
- if (property.value && typeof property.value === 'function') {
- try {
- const computedValue = property.value(currentData)
- if (computedValue !== undefined) {
- computedValues[property.name] = computedValue
+ const getValueAtPath = (dataSource, path) => {
+ if (!Array.isArray(path) || path.length === 0) {
+ return dataSource
+ }
+ return path.reduce((acc, key) => {
+ if (acc == null) return acc
+ return acc[key]
+ }, dataSource)
+ }
+
+ const computedEntries = []
+
+ const processProperty = (property, scopeData, parentPath = []) => {
+ if (!property?.name) return
+
+ const propertyPath = normalizedPath(property.name, parentPath)
+
+ if (property.value && typeof property.value === 'function') {
+ try {
+ const computedValue = property.value(scopeData || {})
+ if (computedValue !== undefined) {
+ computedEntries.push({
+ namePath: propertyPath,
+ value: computedValue
+ })
+ }
+ } catch (error) {
+ console.warn(
+ `Error calculating value for property ${property.name}:`,
+ error
+ )
+ }
+ }
+
+ if (
+ Array.isArray(property.properties) &&
+ property.properties.length > 0
+ ) {
+ if (property.type === 'objectChildren') {
+ const childValues = getValueAtPath(currentData, propertyPath)
+ if (Array.isArray(childValues)) {
+ childValues.forEach((childData = {}, index) => {
+ property.properties.forEach((childProperty) => {
+ processProperty(childProperty, childData || {}, [
+ ...propertyPath,
+ index
+ ])
+ })
+ })
+ }
+ } else {
+ const nestedScope = getValueAtPath(currentData, propertyPath) || {}
+ property.properties.forEach((childProperty) => {
+ processProperty(childProperty, nestedScope || {}, propertyPath)
+ })
}
- } catch (error) {
- console.warn(
- `Error calculating value for property ${property.name}:`,
- error
- )
}
}
- })
- return computedValues
- }, [])
+ modelDefinition.properties.forEach((property) => {
+ processProperty(property, currentData)
+ })
+
+ return computedEntries
+ },
+ []
+ )
// Set initial form values when defaultValues change
useEffect(() => {
if (Object.keys(defaultValues).length > 0) {
// Calculate computed values for initial data
- const computedValues = calculateComputedValues(defaultValues, model)
- const initialFormData = { ...defaultValues, ...computedValues }
+ const computedEntries = calculateComputedValues(defaultValues, model)
+ const computedValuesObject = buildObjectFromEntries(computedEntries)
+ const initialFormData = merge({}, defaultValues, computedValuesObject)
form.setFieldsValue(initialFormData)
- setObjectData((prev) => {
- return merge({}, prev, initialFormData)
- })
+ setObjectData((prev) => merge({}, prev, initialFormData))
}
}, [form, defaultValues, calculateComputedValues, model])
@@ -102,18 +175,31 @@ const NewObjectForm = ({ type, style, defaultValues = {}, children }) => {
form={form}
layout='vertical'
style={style}
- onValuesChange={(values) => {
+ onValuesChange={(_changedValues, allFormValues) => {
// Calculate computed values based on current form data
- const currentFormData = { ...objectData, ...values }
- const computedValues = calculateComputedValues(currentFormData, model)
+ const currentFormData = merge({}, objectData || {}, allFormValues)
+ const computedEntries = calculateComputedValues(currentFormData, model)
- // Update form with computed values if any were calculated
- if (Object.keys(computedValues).length > 0) {
- form.setFieldsValue(computedValues)
+ if (Array.isArray(computedEntries) && computedEntries.length > 0) {
+ computedEntries.forEach(({ namePath, value }) => {
+ if (!Array.isArray(namePath) || value === undefined) return
+ const currentValue = form.getFieldValue(namePath)
+ if (currentValue !== value) {
+ if (typeof form.setFieldValue === 'function') {
+ form.setFieldValue(namePath, value)
+ } else {
+ const fallbackPayload = buildObjectFromEntries([
+ { namePath, value }
+ ])
+ form.setFieldsValue(fallbackPayload)
+ }
+ }
+ })
}
// Merge all values (user input + computed values)
- const allValues = { ...values, ...computedValues }
+ const computedValuesObject = buildObjectFromEntries(computedEntries)
+ const allValues = merge({}, allFormValues, computedValuesObject)
setObjectData((prev) => {
return merge({}, prev, allValues)
})
diff --git a/src/components/Dashboard/common/ObjectActions.jsx b/src/components/Dashboard/common/ObjectActions.jsx
index 262b61b..852dfef 100644
--- a/src/components/Dashboard/common/ObjectActions.jsx
+++ b/src/components/Dashboard/common/ObjectActions.jsx
@@ -3,6 +3,8 @@ import { Dropdown, Button } from 'antd'
import { getModelByName } from '../../../database/ObjectModels'
import PropTypes from 'prop-types'
import { useNavigate, useLocation } from 'react-router-dom'
+import { useActionsModal } from '../context/ActionsModalContext'
+import KeyboardShortcut from './KeyboardShortcut'
// Recursively filter actions based on visibleActions
function filterActionsByVisibility(actions, visibleActions) {
@@ -43,6 +45,7 @@ function mapActionsToMenuItems(actions, currentUrlWithActions, id, objectData) {
const actionUrl = action.url ? action.url(id) : undefined
var disabled = actionUrl && actionUrl === currentUrlWithActions
+ var visible = true
if (action.disabled) {
if (typeof action.disabled === 'function') {
@@ -52,6 +55,14 @@ function mapActionsToMenuItems(actions, currentUrlWithActions, id, objectData) {
}
}
+ if (action.visible) {
+ if (typeof action.visible === 'function') {
+ visible = action.visible(objectData)
+ } else {
+ visible = action.visible
+ }
+ }
+
const item = {
key: action.key || action.name,
label: action.label,
@@ -67,7 +78,9 @@ function mapActionsToMenuItems(actions, currentUrlWithActions, id, objectData) {
objectData
)
}
- return item
+ if (visible == true) {
+ return item
+ }
})
}
@@ -91,6 +104,7 @@ const ObjectActions = ({
const actions = model.actions || []
const navigate = useNavigate()
const location = useLocation()
+ const { showActionsModal } = useActionsModal()
// Get current url without 'action' param
const currentUrlWithoutActions = stripActionParam(
@@ -140,11 +154,20 @@ const ObjectActions = ({
}
return (
-
-
-
+ showActionsModal(id, type, objectData)}
+ >
+
+
+
+
)
}
diff --git a/src/components/Dashboard/common/ObjectChildTable.jsx b/src/components/Dashboard/common/ObjectChildTable.jsx
new file mode 100644
index 0000000..9d42bbc
--- /dev/null
+++ b/src/components/Dashboard/common/ObjectChildTable.jsx
@@ -0,0 +1,474 @@
+import { useMemo, useEffect, useRef } from 'react'
+import PropTypes from 'prop-types'
+import { Table, Skeleton, Card, Button, Flex, Form, Typography } from 'antd'
+import PlusIcon from '../../Icons/PlusIcon'
+import ObjectProperty from './ObjectProperty'
+import { LoadingOutlined } from '@ant-design/icons'
+const { Text } = Typography
+
+const DEFAULT_COLUMN_WIDTHS = {
+ text: 200,
+ number: 120,
+ dateTime: 200,
+ state: 200,
+ id: 180,
+ bool: 120,
+ tags: 200
+}
+
+const getDefaultWidth = (type) => {
+ return DEFAULT_COLUMN_WIDTHS[type] || 200
+}
+
+const createSkeletonRows = (rowCount, keyPrefix, keyName) => {
+ return Array.from({ length: rowCount }).map((_, index) => {
+ const skeletonKey = `${keyPrefix}-${index}`
+ const row = {
+ isSkeleton: true,
+ _objectChildTableKey: skeletonKey
+ }
+
+ if (typeof keyName === 'string') {
+ row[keyName] = skeletonKey
+ }
+
+ return row
+ })
+}
+
+const ObjectChildTable = ({
+ maxWidth = '100%',
+ properties = [],
+ columns = [],
+ visibleColumns = {},
+ objectData = null,
+ scrollHeight = 240,
+ size = 'small',
+ loading = false,
+ rowKey = '_id',
+ skeletonRows = 5,
+ additionalColumns = [],
+ emptyText = 'No items',
+ isEditing = false,
+ formListName,
+ value = [],
+ rollups = [],
+ onChange,
+ ...tableProps
+}) => {
+ const mainTableWrapperRef = useRef(null)
+ const rollupTableWrapperRef = useRef(null)
+
+ const propertyMap = useMemo(() => {
+ const map = new Map()
+ properties.forEach((property) => {
+ if (property?.name) {
+ map.set(property.name, property)
+ }
+ })
+ return map
+ }, [properties])
+
+ const orderedPropertyNames = useMemo(() => {
+ if (columns && columns.length > 0) {
+ return columns
+ }
+ return properties.map((property) => property.name).filter(Boolean)
+ }, [columns, properties])
+
+ const resolvedProperties = useMemo(() => {
+ const explicit = orderedPropertyNames
+ .map((name) => propertyMap.get(name))
+ .filter(Boolean)
+
+ const remaining = properties.filter(
+ (property) => !orderedPropertyNames.includes(property.name)
+ )
+
+ return [...explicit, ...remaining].filter((property) => {
+ if (!property?.name) return false
+ if (
+ visibleColumns &&
+ Object.prototype.hasOwnProperty.call(visibleColumns, property.name)
+ ) {
+ return visibleColumns[property.name] !== false
+ }
+ return true
+ })
+ }, [orderedPropertyNames, propertyMap, properties, visibleColumns])
+
+ // When used inside antd Form.Item without Form.List, `value` will be the controlled array.
+ const itemsSource = useMemo(() => {
+ return value ?? []
+ }, [value])
+
+ // When used with antd Form.List, grab the form instance so we can read
+ // the latest row values and pass them into ObjectProperty as objectData.
+ // Assumes this component is rendered within a Form context when editing.
+ const formInstance = Form.useFormInstance()
+
+ const listNamePath = useMemo(() => {
+ if (!formListName) return null
+ return Array.isArray(formListName) ? formListName : [formListName]
+ }, [formListName])
+
+ const tableColumns = useMemo(() => {
+ const propertyColumns = resolvedProperties.map((property) => ({
+ title: property.label || property.name,
+ dataIndex: property.name,
+ key: property.name,
+ width: property.columnWidth || getDefaultWidth(property.type),
+ render: (_text, record) => {
+ if (record?.isSkeleton) {
+ return (
+
+ )
+ }
+ return (
+
+ )
+ }
+ }))
+
+ return [...propertyColumns, ...additionalColumns]
+ }, [resolvedProperties, additionalColumns, isEditing])
+
+ const skeletonData = useMemo(() => {
+ return createSkeletonRows(
+ skeletonRows,
+ 'object-child-table-skeleton',
+ typeof rowKey === 'string' ? rowKey : null
+ )
+ }, [skeletonRows, rowKey])
+
+ const dataSource = useMemo(() => {
+ if (loading && (!itemsSource || itemsSource.length === 0)) {
+ return skeletonData
+ }
+ return itemsSource
+ }, [itemsSource, loading, skeletonData])
+
+ const resolvedRowKey =
+ typeof rowKey === 'function' ? rowKey : (_record, index) => index
+
+ const scrollConfig =
+ scrollHeight != null
+ ? { y: scrollHeight, x: 'max-content' }
+ : { x: 'max-content' }
+
+ const handleAddItem = () => {
+ const newItem = {}
+
+ resolvedProperties.forEach((property) => {
+ if (
+ property?.name &&
+ !Object.prototype.hasOwnProperty.call(newItem, property.name)
+ ) {
+ newItem[property.name] = null
+ }
+ })
+
+ const currentItems = Array.isArray(itemsSource) ? itemsSource : []
+ const newItems = [...currentItems, newItem]
+
+ if (typeof onChange === 'function') {
+ onChange(newItems)
+ }
+ }
+
+ const rollupDataSource = useMemo(() => {
+ if (!rollups || rollups.length === 0) return []
+
+ // Single summary row where each rollup value is placed under
+ // the column that matches its `property` field.
+ const summaryRow = {}
+
+ properties.forEach((property) => {
+ const rollup = rollups.find(
+ (r) => r.property && r.property === property.name
+ )
+
+ if (rollup && typeof rollup.value === 'function') {
+ try {
+ const updatedObjectData = { ...objectData }
+ console.log('UPDATED OBJECT DATA', value)
+ updatedObjectData[property.name] = value
+ summaryRow[property.name] = rollup.value(updatedObjectData)
+ } catch (e) {
+ // Fail quietly but log for debugging
+ console.error('Error computing rollup', rollup.name, e)
+ summaryRow[property.name] = null
+ }
+ } else {
+ summaryRow[property.name] = null
+ }
+ })
+
+ return [summaryRow]
+ }, [properties, rollups, objectData])
+
+ const rollupColumns = useMemo(() => {
+ return properties.map((property, index) => {
+ const nextProperty = properties[index + 1]
+ var nextRollup = null
+ if (nextProperty) {
+ nextRollup = rollups?.find(
+ (r) => r.property && r.property === nextProperty.name
+ )
+ }
+ const rollupLabel = nextRollup?.label
+ return {
+ title: {property.label || property.name},
+ dataIndex: property.name,
+ key: property.name,
+ width: property.columnWidth || getDefaultWidth(property.type),
+ render: (_text, record) => {
+ return (
+
+
+ {property?.prefix}
+ {record[property.name]}
+ {property?.suffix}
+
+ {rollupLabel && {rollupLabel}:}
+
+ )
+ }
+ }
+ })
+ }, [properties, rollups])
+
+ const hasRollups = useMemo(
+ () => Array.isArray(rollups) && rollups.length > 0,
+ [rollups]
+ )
+
+ useEffect(() => {
+ if (!hasRollups || isEditing == null) return
+
+ const mainWrapper = mainTableWrapperRef.current
+ const rollupWrapper = rollupTableWrapperRef.current
+
+ if (!mainWrapper || !rollupWrapper) return
+
+ const mainBody =
+ mainWrapper.querySelector('.ant-table-body') ||
+ mainWrapper.querySelector('.ant-table-content')
+ const rollupBody =
+ rollupWrapper.querySelector('.ant-table-body') ||
+ rollupWrapper.querySelector('.ant-table-content')
+
+ if (!mainBody || !rollupBody) return
+
+ let isSyncing = false
+
+ const syncScroll = (source, target) => {
+ if (!target) return
+ isSyncing = true
+ target.scrollLeft = source.scrollLeft
+ window.requestAnimationFrame(() => {
+ isSyncing = false
+ })
+ }
+
+ const handleMainScroll = () => {
+ if (isSyncing) return
+ syncScroll(mainBody, rollupBody)
+ }
+
+ const handleRollupScroll = () => {
+ if (isSyncing) return
+ syncScroll(rollupBody, mainBody)
+ }
+
+ mainBody.addEventListener('scroll', handleMainScroll)
+ rollupBody.addEventListener('scroll', handleRollupScroll)
+
+ return () => {
+ mainBody.removeEventListener('scroll', handleMainScroll)
+ rollupBody.removeEventListener('scroll', handleRollupScroll)
+ }
+ }, [hasRollups, isEditing])
+
+ const rollupTable = hasRollups ? (
+
+ ) : null
+
+ const tableComponent = (
+
+
+
}}
+ size={size}
+ rowKey={resolvedRowKey}
+ scroll={scrollConfig}
+ locale={{ emptyText }}
+ pagination={false}
+ className={hasRollups ? 'child-table-rollups' : 'child-table'}
+ {...tableProps}
+ />
+
+ {rollupTable}
+
+ )
+
+ // When editing and a Form.List name is provided, bind rows via Form.List
+ // instead of the manual value/onChange mechanism.
+ if (isEditing === true && formListName) {
+ return (
+
+ {(fields, { add }) => {
+ const listDataSource = fields.map((field, index) => ({
+ _field: field,
+ _index: index,
+ key: field.key
+ }))
+ const listColumns = resolvedProperties.map((property) => ({
+ title: property.label || property.name,
+ dataIndex: property.name,
+ key: property.name,
+ width: property.columnWidth || getDefaultWidth(property.type),
+ render: (_text, record) => {
+ const field = record?._field
+ if (!field) return null
+
+ // Resolve the most up-to-date row data for this index from the form
+ let rowObjectData = undefined
+ if (formInstance && listNamePath) {
+ const namePath = [...listNamePath, field.name]
+ rowObjectData = formInstance.getFieldValue(namePath)
+ }
+ return (
+
+ )
+ }
+ }))
+
+ const listTable = (
+
+
+
record.key ?? record._index}
+ scroll={scrollConfig}
+ locale={{ emptyText }}
+ className={hasRollups ? 'child-table-rollups' : 'child-table'}
+ style={{ maxWidth, minWidth: 0 }}
+ {...tableProps}
+ />
+
+ {rollupTable}
+
+ )
+
+ const handleAddListItem = () => {
+ const newItem = {}
+ resolvedProperties.forEach((property) => {
+ if (property?.name) {
+ newItem[property.name] = null
+ }
+ })
+ add(newItem)
+ }
+
+ return (
+
+
+
+
+ }
+ onClick={handleAddListItem}
+ />
+
+ {listTable}
+
+
+ )
+ }}
+
+ )
+ }
+
+ if (isEditing === true) {
+ return (
+
+
+
+
+ }
+ onClick={handleAddItem}
+ />
+
+ {tableComponent}
+
+
+ )
+ }
+
+ return tableComponent
+}
+
+ObjectChildTable.propTypes = {
+ properties: PropTypes.arrayOf(
+ PropTypes.shape({
+ name: PropTypes.string.isRequired,
+ label: PropTypes.string,
+ type: PropTypes.string
+ })
+ ).isRequired,
+ columns: PropTypes.arrayOf(PropTypes.string),
+ visibleColumns: PropTypes.object,
+ scrollHeight: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
+ size: PropTypes.string,
+ loading: PropTypes.bool,
+ rowKey: PropTypes.oneOfType([PropTypes.string, PropTypes.func]),
+ skeletonRows: PropTypes.number,
+ additionalColumns: PropTypes.arrayOf(PropTypes.object),
+ emptyText: PropTypes.node,
+ isEditing: PropTypes.bool,
+ formListName: PropTypes.oneOfType([PropTypes.string, PropTypes.array]),
+ value: PropTypes.arrayOf(PropTypes.object),
+ onChange: PropTypes.func,
+ maxWidth: PropTypes.string,
+ rollups: PropTypes.arrayOf(PropTypes.object),
+ objectData: PropTypes.object
+}
+
+export default ObjectChildTable
diff --git a/src/components/Dashboard/common/ObjectForm.jsx b/src/components/Dashboard/common/ObjectForm.jsx
index bf908a4..a1885c6 100644
--- a/src/components/Dashboard/common/ObjectForm.jsx
+++ b/src/components/Dashboard/common/ObjectForm.jsx
@@ -13,8 +13,20 @@ import { AuthContext } from '../context/AuthContext'
import PropTypes from 'prop-types'
import DeleteObjectModal from './DeleteObjectModal'
import merge from 'lodash/merge'
+import set from 'lodash/set'
import { getModelByName } from '../../../database/ObjectModels'
+const buildObjectFromEntries = (entries = []) => {
+ return entries.reduce((acc, entry) => {
+ const { namePath, value } = entry || {}
+ if (!Array.isArray(namePath) || value === undefined) {
+ return acc
+ }
+ set(acc, namePath, value)
+ return acc
+ }, {})
+}
+
/**
* ObjectForm is a reusable form component for editing any object type.
* It handles fetching, updating, locking, unlocking, and validation logic.
@@ -37,6 +49,7 @@ const ObjectForm = forwardRef(
const [lock, setLock] = useState({})
const [initialized, setInitialized] = useState(false)
const [isEditing, setIsEditing] = useState(false)
+ const isEditingRef = useRef(false)
const [formValid, setFormValid] = useState(false)
const [form] = Form.useForm()
@@ -115,30 +128,93 @@ const ObjectForm = forwardRef(
})
// Function to calculate computed values from model properties
- const calculateComputedValues = useCallback((currentData, model) => {
- if (!model || !model.properties) return {}
+ const calculateComputedValues = useCallback(
+ (currentData, modelDefinition) => {
+ if (!modelDefinition || !Array.isArray(modelDefinition.properties)) {
+ return []
+ }
- const computedValues = {}
+ const normalizedPath = (name, parentPath = []) => {
+ if (Array.isArray(name)) {
+ return [...parentPath, ...name]
+ }
+ if (typeof name === 'number') {
+ return [...parentPath, name]
+ }
+ if (typeof name === 'string' && name.length > 0) {
+ return [...parentPath, ...name.split('.')]
+ }
+ return parentPath
+ }
- model.properties.forEach((property) => {
- // Check if this property has a computed value function
- if (property.value && typeof property.value === 'function') {
- try {
- const computedValue = property.value(currentData)
- if (computedValue !== undefined) {
- computedValues[property.name] = computedValue
+ const getValueAtPath = (dataSource, path) => {
+ if (!Array.isArray(path) || path.length === 0) {
+ return dataSource
+ }
+ return path.reduce((acc, key) => {
+ if (acc == null) return acc
+ return acc[key]
+ }, dataSource)
+ }
+
+ const computedEntries = []
+
+ const processProperty = (property, scopeData, parentPath = []) => {
+ if (!property?.name) return
+
+ const propertyPath = normalizedPath(property.name, parentPath)
+
+ if (property.value && typeof property.value === 'function') {
+ try {
+ const computedValue = property.value(scopeData || {})
+ if (computedValue !== undefined) {
+ computedEntries.push({
+ namePath: propertyPath,
+ value: computedValue
+ })
+ }
+ } catch (error) {
+ console.warn(
+ `Error calculating value for property ${property.name}:`,
+ error
+ )
+ }
+ }
+
+ if (
+ Array.isArray(property.properties) &&
+ property.properties.length > 0
+ ) {
+ if (property.type === 'objectChildren') {
+ const childValues = getValueAtPath(currentData, propertyPath)
+ if (Array.isArray(childValues)) {
+ childValues.forEach((childData = {}, index) => {
+ property.properties.forEach((childProperty) => {
+ processProperty(childProperty, childData || {}, [
+ ...propertyPath,
+ index
+ ])
+ })
+ })
+ }
+ } else {
+ const nestedScope =
+ getValueAtPath(currentData, propertyPath) || {}
+ property.properties.forEach((childProperty) => {
+ processProperty(childProperty, nestedScope || {}, propertyPath)
+ })
}
- } catch (error) {
- console.warn(
- `Error calculating value for property ${property.name}:`,
- error
- )
}
}
- })
- return computedValues
- }, [])
+ modelDefinition.properties.forEach((property) => {
+ processProperty(property, currentData)
+ })
+
+ return computedEntries
+ },
+ []
+ )
// Validate form on change (debounced to avoid heavy work on every keystroke)
useEffect(() => {
@@ -146,7 +222,8 @@ const ObjectForm = forwardRef(
const currentFormValues = form.getFieldsValue()
const mergedObjectData = {
...serverObjectData.current,
- ...currentFormValues
+ ...currentFormValues,
+ _isEditing: isEditingRef.current
}
form
@@ -198,12 +275,13 @@ const ObjectForm = forwardRef(
const lockEvent = await fetchObjectLock(id, type)
setLock(lockEvent)
onStateChangeRef.current({ lock: lockEvent })
- setObjectData(data)
+ setObjectData({ ...data, _isEditing: isEditingRef.current })
serverObjectData.current = data
// Calculate and set computed values on initial load
- const computedValues = calculateComputedValues(data, model)
- const initialFormData = { ...data, ...computedValues }
+ const computedEntries = calculateComputedValues(data, model)
+ const computedValuesObject = buildObjectFromEntries(computedEntries)
+ const initialFormData = merge({}, data, computedValuesObject)
form.setFieldsValue(initialFormData)
setFetchLoading(false)
@@ -275,24 +353,37 @@ const ObjectForm = forwardRef(
const startEditing = () => {
setIsEditing(true)
- onStateChangeRef.current({ isEditing: true })
+ isEditingRef.current = true
+ console.log('IS EDITING TRUE')
+ setObjectData((prev) => ({ ...prev, _isEditing: isEditingRef.current }))
+ onStateChangeRef.current({
+ isEditing: true,
+ objectData: { ...objectData, _isEditing: isEditingRef.current }
+ })
lockObject(id, type)
}
const cancelEditing = () => {
if (serverObjectData.current) {
// Recalculate computed values when canceling
- const computedValues = calculateComputedValues(
+ const computedEntries = calculateComputedValues(
serverObjectData.current,
model
)
- const resetFormData = { ...serverObjectData.current, ...computedValues }
-
+ const computedValuesObject = buildObjectFromEntries(computedEntries)
+ const resetFormData = merge(
+ {},
+ serverObjectData.current,
+ computedValuesObject
+ )
+ setIsEditing(false)
+ isEditingRef.current = false
form.setFieldsValue(resetFormData)
- setObjectData(resetFormData)
+ console.log('IS EDITING FALSE')
+ setObjectData({ ...resetFormData, _isEditing: isEditingRef.current })
}
- setIsEditing(false)
- onStateChangeRef.current({ isEditing: false })
+
+ onStateChangeRef.current({ isEditing: isEditingRef.current })
unlockObject(id, type)
}
@@ -302,9 +393,15 @@ const ObjectForm = forwardRef(
setEditLoading(true)
onStateChangeRef.current({ editLoading: true })
await updateObject(id, type, value)
- setObjectData({ ...objectData, ...value })
+
setIsEditing(false)
- onStateChangeRef.current({ isEditing: false })
+ isEditingRef.current = false
+ onStateChangeRef.current({ isEditing: isEditingRef.current })
+ setObjectData({
+ ...objectData,
+ ...value,
+ _isEditing: isEditingRef.current
+ })
messageApi.success('Information updated successfully')
} catch (err) {
console.error(err)
@@ -374,37 +471,51 @@ const ObjectForm = forwardRef(
form={form}
layout='vertical'
style={style}
- onValuesChange={(values) => {
+ onValuesChange={(changedValues, allFormValues) => {
+ // Use the full form snapshot (allFormValues) so list fields (Form.List)
+ // come through as complete arrays instead of sparse arrays like
+ // [null, null, { quantity: 5 }].
if (onEdit != undefined) {
- onEdit(values)
+ onEdit(allFormValues)
}
// Calculate computed values based on current form data
- const currentFormData = { ...objectData, ...values }
- const computedValues = calculateComputedValues(
+ const currentFormData = {
+ ...(serverObjectData.current || {}),
+ ...allFormValues
+ }
+ const computedEntries = calculateComputedValues(
currentFormData,
model
)
- // Update form with computed values if any were calculated and they changed
- if (Object.keys(computedValues).length > 0) {
- const currentComputedValues = form.getFieldsValue(
- Object.keys(computedValues)
- )
- const hasDiff = Object.keys(computedValues).some(
- (key) => currentComputedValues[key] !== computedValues[key]
- )
-
- if (hasDiff) {
- form.setFieldsValue(computedValues)
- }
+ if (Array.isArray(computedEntries) && computedEntries.length > 0) {
+ computedEntries.forEach(({ namePath, value }) => {
+ if (!Array.isArray(namePath) || value === undefined) return
+ const currentValue = form.getFieldValue(namePath)
+ if (currentValue !== value) {
+ if (typeof form.setFieldValue === 'function') {
+ form.setFieldValue(namePath, value)
+ } else {
+ const fallbackPayload = buildObjectFromEntries([
+ { namePath, value }
+ ])
+ form.setFieldsValue(fallbackPayload)
+ }
+ }
+ })
}
- // Merge all values (user input + computed values)
- const allValues = { ...values, ...computedValues }
+ const computedValuesObject = buildObjectFromEntries(computedEntries)
+ const mergedFormValues = merge(
+ {},
+ allFormValues,
+ computedValuesObject
+ )
+ mergedFormValues._isEditing = isEditingRef.current
setObjectData((prev) => {
- return { ...prev, ...allValues }
+ return { ...prev, ...mergedFormValues }
})
}}
>
diff --git a/src/components/Dashboard/common/ObjectProperty.jsx b/src/components/Dashboard/common/ObjectProperty.jsx
index c4b1e05..cade529 100644
--- a/src/components/Dashboard/common/ObjectProperty.jsx
+++ b/src/components/Dashboard/common/ObjectProperty.jsx
@@ -43,6 +43,8 @@ import AlertsDisplay from './AlertsDisplay'
import FileUpload from './FileUpload'
import DataTree from './DataTree'
import FileList from './FileList'
+import ObjectChildTable from './ObjectChildTable'
+import MiscId from './MiscId'
const { Text } = Typography
@@ -86,6 +88,11 @@ const ObjectProperty = ({
roundNumber = false,
showHyperlink,
showSince,
+ properties = [],
+ onChange = null,
+ maxWidth = '100%',
+ loading = false,
+ rollups = [],
...rest
}) => {
if (value && typeof value == 'function' && objectData) {
@@ -379,6 +386,18 @@ const ObjectProperty = ({
case 'objectList': {
return
}
+ case 'objectChildren': {
+ return (
+
+ )
+ }
case 'state': {
if (value && value?.type) {
return
@@ -419,6 +438,9 @@ const ObjectProperty = ({
)
}
}
+ case 'miscId': {
+ return
+ }
case 'density': {
if (value != null) {
return {`${value} g/cm³`}
@@ -432,7 +454,14 @@ const ObjectProperty = ({
}
case 'alerts': {
if (value != null && value?.length != 0) {
- return
+ return (
+
+ )
} else {
return (
@@ -546,6 +575,11 @@ const ObjectProperty = ({
margin: 0,
...(mergedFormItemProps.style || {})
}
+
+ if (typeof onChange === 'function') {
+ mergedFormItemProps.onChange = onChange
+ }
+
switch (type) {
case 'netGross':
return (
@@ -736,7 +770,7 @@ const ObjectProperty = ({
case 'objectType':
return (
-
+
)
case 'objectList':
@@ -775,6 +809,18 @@ const ObjectProperty = ({
/>
)
+ case 'objectChildren': {
+ return (
+
+ )
+ }
default:
return (
@@ -815,7 +861,9 @@ ObjectProperty.propTypes = {
showPreview: PropTypes.bool,
showHyperlink: PropTypes.bool,
options: PropTypes.array,
- showSince: PropTypes.bool
+ showSince: PropTypes.bool,
+ loading: PropTypes.bool,
+ rollups: PropTypes.arrayOf(PropTypes.object)
}
export default ObjectProperty
diff --git a/src/components/Dashboard/common/ObjectSelect.jsx b/src/components/Dashboard/common/ObjectSelect.jsx
index ecfc994..3666554 100644
--- a/src/components/Dashboard/common/ObjectSelect.jsx
+++ b/src/components/Dashboard/common/ObjectSelect.jsx
@@ -14,8 +14,16 @@ import { AuthContext } from '../context/AuthContext'
import ObjectProperty from './ObjectProperty'
import { getModelByName } from '../../../database/ObjectModels'
import merge from 'lodash/merge'
+import { getModelProperty } from '../../../database/ObjectModels'
const { SHOW_CHILD } = TreeSelect
+// Helper to check if two values are equal (handling objects/ids)
+const areValuesEqual = (v1, v2) => {
+ const id1 = v1 && typeof v1 === 'object' && v1._id ? v1._id : v1
+ const id2 = v2 && typeof v2 === 'object' && v2._id ? v2._id : v2
+ return String(id1) === String(id2)
+}
+
const ObjectSelect = ({
type = 'unknown',
showSearch = false,
@@ -31,7 +39,7 @@ const ObjectSelect = ({
const { token } = useContext(AuthContext)
// --- State ---
const [treeData, setTreeData] = useState([])
- const [objectPropertiesTree, setObjectPropertiesTree] = useState({})
+ const [objectPropertiesTree, setObjectPropertiesTree] = useState([])
const [initialized, setInitialized] = useState(false)
const [error, setError] = useState(false)
const properties = useMemo(() => getModelByName(type).group || [], [type])
@@ -69,6 +77,50 @@ const ObjectSelect = ({
[isMinimalObject, fetchObject, type]
)
+ const mergeGroups = useCallback((current, incoming) => {
+ if (!current) return incoming
+ if (!incoming) return current
+ if (!Array.isArray(current) || !Array.isArray(incoming)) return incoming
+
+ const merged = [...current]
+
+ // Helper to generate a unique key for a group node
+ const getGroupKey = (item) => {
+ const val = item.value
+ const valPart =
+ val && typeof val === 'object' && val._id
+ ? val._id
+ : JSON.stringify(val)
+ return `${item.property}:${valPart}`
+ }
+
+ for (const item of incoming) {
+ if (item.property && item.value !== undefined) {
+ // It's a group node
+ const itemKey = getGroupKey(item)
+ const existingIdx = merged.findIndex(
+ (x) =>
+ x.property && x.value !== undefined && getGroupKey(x) === itemKey
+ )
+
+ if (existingIdx > -1) {
+ merged[existingIdx] = {
+ ...merged[existingIdx],
+ children: mergeGroups(merged[existingIdx].children, item.children)
+ }
+ } else {
+ merged.push(item)
+ }
+ } else {
+ // It's a leaf object
+ if (!merged.some((x) => String(x._id) === String(item._id))) {
+ merged.push(item)
+ }
+ }
+ }
+ return merged
+ }, [])
+
// Fetch the object properties tree from the API
const handleFetchObjectsProperties = useCallback(
async (customFilter = filter) => {
@@ -78,11 +130,14 @@ const ObjectSelect = ({
filter: customFilter,
masterFilter
})
+
if (Array.isArray(data)) {
- setObjectPropertiesTree((prev) => merge([], prev, data))
+ setObjectPropertiesTree((prev) => mergeGroups(prev, data))
} else {
- setObjectPropertiesTree((prev) => merge({}, prev, data))
+ // Fallback if API returns something unexpected
+ setObjectPropertiesTree((prev) => merge([], prev, data))
}
+
setInitialLoading(false)
setError(false)
return data
@@ -92,24 +147,31 @@ const ObjectSelect = ({
return null
}
},
- [type, fetchObjectsByProperty, properties, filter, masterFilter]
+ [
+ type,
+ fetchObjectsByProperty,
+ properties,
+ filter,
+ masterFilter,
+ mergeGroups
+ ]
)
// Convert the API response to AntD TreeSelect treeData
const buildTreeData = useCallback(
(data, pIdx = 0, parentKeys = [], filterPath = []) => {
- if (!data) return []
- if (Array.isArray(data)) {
+ if (!data || !Array.isArray(data)) return []
+ console.log(data, pIdx, properties.length)
+ // If we are past the grouping properties, these are leaf objects
+ if (pIdx >= properties.length) {
return data.map((object) => {
setObjectList((prev) => {
- const filtered = prev.filter(
- (prevObject) => prevObject._id != object._id
- )
- return [...filtered, object]
+ if (prev.some((p) => p._id === object._id)) return prev
+ return [...prev, object]
})
return {
title: (
-
+
{
- if (property != null && typeof value === 'object') {
- const newFilterPath = filterPath.concat({ property, value: key })
- return {
- title: ,
- value: parentKeys.concat(key).join('-'),
- filterValue: key,
- key: parentKeys.concat(key).join('-'),
- property,
- parentKeys: parentKeys.concat(key || '-'),
- filterPath: newFilterPath,
- selectable: false,
- children: buildTreeData(
- value,
- pIdx + 1,
- parentKeys.concat(key),
- newFilterPath
- ),
- isLeaf: false
- }
- }
+ // Group Nodes
+ return data
+ .map((group) => {
+ // Only process if it looks like a group
+ if (!group.property) return null
+
+ const { property, value, children } = group
+ var valueString = value
+ if (value && typeof value === 'object' && value._id) {
+ valueString = value._id
+ }
+ if (Array.isArray(valueString)) {
+ valueString = valueString.join(',')
+ }
+ const nodeKey = parentKeys
+ .concat(property + ':' + valueString)
+ .join('-')
+ const newFilterPath = filterPath.concat({
+ property,
+ value: valueString
})
- .filter(Boolean)
- }
+
+ const modelProperty = getModelProperty(type, property)
+ return {
+ title: ,
+ value: nodeKey,
+ key: nodeKey,
+ property,
+ filterValue: valueString,
+ parentKeys: parentKeys.concat(valueString),
+ filterPath: newFilterPath,
+ selectable: false,
+ isLeaf: false,
+ children: buildTreeData(
+ children,
+ pIdx + 1,
+ parentKeys.concat(valueString),
+ newFilterPath
+ )
+ }
+ })
+ .filter(Boolean)
},
[properties, type]
)
// --- loadData for async loading on expand ---
const loadData = async (node) => {
- // node.property is the property name, node.value is the value
+ // node.property is the property name, node.value is the value key
if (!node.property) return
+ if (type == 'unknown') return
// Build filter for this node by merging all parent property-value pairs
const customFilter = { ...filter }
if (Array.isArray(node.filterPath)) {
@@ -172,26 +249,40 @@ const ObjectSelect = ({
customFilter[property] = value
})
}
+ // Ensure current node is in filter (should be covered by filterPath, but redundancy is safe)
customFilter[node.property] = node.filterValue
// Fetch children for this node
const data = await handleFetchObjectsProperties(customFilter)
if (!data) return
- // Extract only the children for the specific node that was expanded
- let nodeSpecificData = data
- if (typeof data === 'object' && !Array.isArray(data)) {
- // If the API returns an object with multiple keys, get only the data for this node
- nodeSpecificData = data[node.value] || {}
+
+ // Navigate to the specific node's children in the response
+ let nodeSpecificChildren = data
+
+ if (node.filterPath && Array.isArray(node.filterPath)) {
+ for (const pathItem of node.filterPath) {
+ if (!Array.isArray(nodeSpecificChildren)) break
+ const match = nodeSpecificChildren.find(
+ (g) =>
+ g.property === pathItem.property &&
+ areValuesEqual(g.value, pathItem.value)
+ )
+ if (match) {
+ nodeSpecificChildren = match.children
+ } else {
+ nodeSpecificChildren = []
+ break
+ }
+ }
}
+
// Build new tree children only for this specific node
const children = buildTreeData(
- nodeSpecificData,
+ nodeSpecificChildren,
properties.indexOf(node.property) + 1,
node.parentKeys || [],
- (node.filterPath || []).concat({
- property: node.property,
- value: node.filterValue
- })
+ node.filterPath
)
+
// Update treeData with new children for this node only
setTreeData((prevTreeData) => {
// Helper to recursively update the correct node
@@ -250,7 +341,8 @@ const ObjectSelect = ({
value &&
typeof value === 'object' &&
value !== null &&
- !initialized
+ !initialized &&
+ type != 'unknown'
) {
// Check if value is a minimal object and fetch full object if needed
const fullValue = await fetchFullObjectIfNeeded(value)
@@ -260,7 +352,13 @@ const ObjectSelect = ({
properties.forEach((prop) => {
if (Object.prototype.hasOwnProperty.call(fullValue, prop)) {
const filterValue = fullValue[prop]
- if (filterValue?.name) {
+ if (
+ filterValue &&
+ typeof filterValue === 'object' &&
+ filterValue._id
+ ) {
+ valueFilter[prop] = filterValue._id
+ } else if (filterValue?.name) {
valueFilter[prop] = filterValue.name
} else if (Array.isArray(filterValue)) {
valueFilter[prop] = filterValue.join(',')
@@ -275,12 +373,13 @@ const ObjectSelect = ({
setInitialized(true)
return
}
- if (!initialized && token != null) {
+ if (!initialized && token != null && type != 'unknown') {
handleFetchObjectsProperties()
setInitialized(true)
}
- if (value == null) {
+ if (value == null || type == 'unknown') {
setTreeSelectValue(null)
+ setInitialLoading(false)
setInitialized(true)
}
}
@@ -292,7 +391,8 @@ const ObjectSelect = ({
handleFetchObjectsProperties,
initialized,
token,
- fetchFullObjectIfNeeded
+ fetchFullObjectIfNeeded,
+ type
])
const prevValuesRef = useRef({ type, masterFilter })
@@ -341,6 +441,14 @@ const ObjectSelect = ({
}
}, [value])
+ const placeholder = useMemo(
+ () =>
+ type == 'unknown'
+ ? 'n/a'
+ : `Select a ${getModelByName(type).label.toLowerCase()}...`,
+ [type]
+ )
+
// --- Error UI ---
if (error) {
return (
@@ -373,12 +481,12 @@ const ObjectSelect = ({
multiple={multiple}
loadData={loadData}
showCheckedStrategy={SHOW_CHILD}
- placeholder={`Select a ${getModelByName(type).label.toLowerCase()}...`}
+ placeholder={placeholder}
{...treeSelectProps}
{...rest}
value={treeSelectValue}
onChange={onTreeSelectChange}
- disabled={disabled}
+ disabled={disabled || type == 'unknown'}
/>
)
}
diff --git a/src/components/Dashboard/common/ObjectTypeSelect.jsx b/src/components/Dashboard/common/ObjectTypeSelect.jsx
index 03cc17f..4c3cb1d 100644
--- a/src/components/Dashboard/common/ObjectTypeSelect.jsx
+++ b/src/components/Dashboard/common/ObjectTypeSelect.jsx
@@ -10,11 +10,18 @@ const ObjectTypeSelect = ({
placeholder = 'Select object type...',
showSearch = true,
allowClear = true,
- disabled = false
+ disabled = false,
+ masterFilter = null
}) => {
// Create options from object models
const options = objectModels
.sort((a, b) => a.label.localeCompare(b.label))
+ .filter((model) => {
+ if (masterFilter == null || Object.keys(masterFilter).length == 0) {
+ return true
+ }
+ return masterFilter.includes(model?.name)
+ })
.map((model) => ({
value: model.name,
label: ,
@@ -46,7 +53,8 @@ ObjectTypeSelect.propTypes = {
placeholder: PropTypes.string,
showSearch: PropTypes.bool,
allowClear: PropTypes.bool,
- disabled: PropTypes.bool
+ disabled: PropTypes.bool,
+ masterFilter: PropTypes.object
}
export default ObjectTypeSelect
diff --git a/src/components/Dashboard/common/PrinterTemperaturePanel.jsx b/src/components/Dashboard/common/PrinterTemperaturePanel.jsx
index 1061838..48ce07d 100644
--- a/src/components/Dashboard/common/PrinterTemperaturePanel.jsx
+++ b/src/components/Dashboard/common/PrinterTemperaturePanel.jsx
@@ -70,7 +70,7 @@ const PrinterTemperaturePanel = ({
}, [temperatureData.bed?.target])
useEffect(() => {
- if (id && connected) {
+ if (id && connected == true) {
const temperatureEventUnsubscribe = subscribeToObjectEvent(
id,
'printer',
diff --git a/src/components/Dashboard/common/PropertyChanges.jsx b/src/components/Dashboard/common/PropertyChanges.jsx
index 01a0a92..ee7490b 100644
--- a/src/components/Dashboard/common/PropertyChanges.jsx
+++ b/src/components/Dashboard/common/PropertyChanges.jsx
@@ -58,6 +58,7 @@ const PropertyChanges = ({ type, value }) => {
longId={false}
minimal={true}
objectData={value?.old}
+ maxWidth='200px'
/>
) : null}
{value?.old && value?.new ? (
@@ -71,6 +72,7 @@ const PropertyChanges = ({ type, value }) => {
longId={false}
minimal={true}
objectData={value?.new}
+ maxWidth='200px'
/>
) : null}
diff --git a/src/components/Dashboard/common/ScrollBox.jsx b/src/components/Dashboard/common/ScrollBox.jsx
new file mode 100644
index 0000000..b738f11
--- /dev/null
+++ b/src/components/Dashboard/common/ScrollBox.jsx
@@ -0,0 +1,20 @@
+import PropTypes from 'prop-types'
+import SimpleBar from 'simplebar-react'
+import 'simplebar-react/dist/simplebar.min.css'
+
+const ScrollBox = ({ children, style, ...rest }) => {
+ return (
+
+
+ {children}
+
+
+ )
+}
+
+ScrollBox.propTypes = {
+ children: PropTypes.node,
+ style: PropTypes.object
+}
+
+export default ScrollBox
diff --git a/src/components/Dashboard/common/StateDisplay.jsx b/src/components/Dashboard/common/StateDisplay.jsx
index 5c9303c..2f71eee 100644
--- a/src/components/Dashboard/common/StateDisplay.jsx
+++ b/src/components/Dashboard/common/StateDisplay.jsx
@@ -18,8 +18,12 @@ const StateDisplay = ({
'processing',
'queued',
'printing',
- 'used'
+ 'used',
+ 'deploying'
]
+ const orangeProgressTypes = ['used', 'deploying', 'queued']
+ const activeProgressTypes = ['printing', 'deploying']
+
const currentState = state || {
type: 'unknown',
progress: 0
@@ -39,8 +43,12 @@ const StateDisplay = ({
currentState?.progress > 0 ? (
) : null}
diff --git a/src/components/Dashboard/common/StateTag.jsx b/src/components/Dashboard/common/StateTag.jsx
index cc8a320..331f292 100644
--- a/src/components/Dashboard/common/StateTag.jsx
+++ b/src/components/Dashboard/common/StateTag.jsx
@@ -92,6 +92,10 @@ const StateTag = ({ state, showBadge = true, style = {} }) => {
status = 'warning'
text = 'Used'
break
+ case 'unconsumed':
+ status = 'success'
+ text = 'Unconsumed'
+ break
default:
status = 'default'
text = state || 'Unknown'
diff --git a/src/components/Dashboard/common/TemplateEditor.jsx b/src/components/Dashboard/common/TemplateEditor.jsx
index 6a94f35..ce360d5 100644
--- a/src/components/Dashboard/common/TemplateEditor.jsx
+++ b/src/components/Dashboard/common/TemplateEditor.jsx
@@ -16,6 +16,7 @@ import CheckCircleIcon from '../../Icons/CheckCircleIcon.jsx'
import ObjectProperty from '../common/ObjectProperty.jsx'
import TemplatePreview from './TemplatePreview.jsx'
import DataTree from './DataTree.jsx'
+//import { useMediaQuery } from 'react-responsive'
const TemplateEditor = ({
objectData,
@@ -28,6 +29,7 @@ const TemplateEditor = ({
const [testObjectViewMode, setTestObjectViewMode] = useState('Tree')
const [previewMessage, setPreviewMessage] = useState('No issues found.')
const [previewError, setPreviewError] = useState(false)
+ //const isMobile = useMediaQuery({ maxWidth: 768 })
const handlePreviewMessage = (message, isError) => {
setPreviewMessage(message)
@@ -36,7 +38,7 @@ const TemplateEditor = ({
return (
<>
-
+
{collapseState.preview == true && (
diff --git a/src/components/Dashboard/context/ActionsModalContext.jsx b/src/components/Dashboard/context/ActionsModalContext.jsx
new file mode 100644
index 0000000..c71fbdb
--- /dev/null
+++ b/src/components/Dashboard/context/ActionsModalContext.jsx
@@ -0,0 +1,316 @@
+import { Input, Flex, List, Typography, Modal, Tag } from 'antd'
+import {
+ createContext,
+ useContext,
+ useEffect,
+ useMemo,
+ useRef,
+ useState
+} from 'react'
+import PropTypes from 'prop-types'
+import { useLocation, useNavigate } from 'react-router-dom'
+
+import { getModelByName } from '../../../database/ObjectModels'
+
+const ActionsModalContext = createContext()
+
+// Remove the "action" query param from a URL so we don't navigate to the same URL again
+const stripActionParam = (pathname, search) => {
+ const params = new URLSearchParams(search)
+ params.delete('action')
+ const query = params.toString()
+ return pathname + (query ? `?${query}` : '')
+}
+
+// Flatten nested actions (including children) into a single list
+const flattenActions = (actions, parentLabel = '') => {
+ if (!Array.isArray(actions)) return []
+
+ const flat = []
+
+ actions.forEach((action) => {
+ if (!action || action.type === 'divider') {
+ return
+ }
+
+ const hasUrl = typeof action.url === 'function'
+ const hasChildren =
+ Array.isArray(action.children) && action.children.length > 0
+
+ const currentLabel = action.label || action.name || ''
+ const fullLabel = parentLabel
+ ? `${parentLabel} / ${currentLabel}`
+ : currentLabel
+
+ // Only push actions that are actually runnable
+ if (hasUrl) {
+ flat.push({
+ ...action,
+ key: action.key || action.name || fullLabel,
+ fullLabel
+ })
+ }
+
+ if (hasChildren) {
+ flat.push(...flattenActions(action.children, fullLabel))
+ }
+ })
+
+ return flat
+}
+
+const ActionsModalProvider = ({ children }) => {
+ const { Text } = Typography
+ const navigate = useNavigate()
+ const location = useLocation()
+
+ const [visible, setVisible] = useState(false)
+ const [query, setQuery] = useState('')
+ const [context, setContext] = useState({
+ id: null,
+ type: null,
+ objectData: null
+ })
+
+ const inputRef = useRef(null)
+
+ const showActionsModal = (id, type, objectData = null) => {
+ setContext({ id, type, objectData })
+ setQuery('')
+ setVisible(true)
+ }
+
+ const hideActionsModal = () => {
+ setVisible(false)
+ setQuery('')
+ }
+
+ // Focus and select text in input when modal becomes visible
+ useEffect(() => {
+ // Use a small timeout to ensure the modal is fully rendered and visible
+ setTimeout(() => {
+ if (visible) {
+ console.log('visible', visible)
+ console.log('inputRef.current', inputRef.current)
+ if (visible && inputRef.current) {
+ console.log('focusing input')
+ const input = inputRef.current.input
+ if (input) {
+ input.focus()
+ input.select() // Select all text
+ }
+ }
+ }
+ }, 50)
+ }, [visible])
+
+ const model = context.type ? getModelByName(context.type) : null
+ const ModelIcon = model?.icon || null
+ const modelLabel = model?.label || model?.name || ''
+
+ const flattenedActions = useMemo(
+ () => flattenActions(model?.actions || []),
+ [model]
+ )
+
+ const currentUrlWithoutActions = stripActionParam(
+ location.pathname,
+ location.search
+ )
+
+ const getActionDisabled = (action) => {
+ const { id, objectData } = context
+ if (!action) return true
+
+ let disabled = false
+ const url = action.url ? action.url(id) : undefined
+
+ // Match ObjectActions default disabling behaviour
+ if (url && url === currentUrlWithoutActions) {
+ disabled = true
+ }
+
+ if (typeof action.disabled !== 'undefined') {
+ if (typeof action.disabled === 'function') {
+ disabled = action.disabled(objectData)
+ } else {
+ disabled = action.disabled
+ }
+ }
+
+ return disabled
+ }
+
+ const getVisibleDisabled = (action) => {
+ const { objectData } = context
+ if (!action) return true
+
+ let visible = true
+
+ if (typeof action.visible !== 'undefined') {
+ if (typeof action.visible === 'function') {
+ visible = action.visible(objectData)
+ } else {
+ visible = action.visible
+ }
+ }
+
+ return visible
+ }
+
+ const normalizedQuery = query.trim().toLowerCase()
+
+ const filteredActions = flattenedActions.filter((action) => {
+ if (!normalizedQuery) return true
+
+ const haystack = [
+ action.fullLabel || '',
+ action.label || '',
+ action.name || '',
+ modelLabel
+ ]
+ .join(' ')
+ .toLowerCase()
+ return haystack.includes(normalizedQuery)
+ })
+
+ const runAction = (action) => {
+ if (!action || typeof action.url !== 'function') return
+ if (getActionDisabled(action)) return
+
+ const { id } = context
+ const targetUrl = action.url(id)
+ if (targetUrl && targetUrl !== '#') {
+ navigate(targetUrl)
+ hideActionsModal()
+ }
+ }
+
+ const handleKeyDown = (e) => {
+ if (!filteredActions.length) return
+
+ // Enter triggers first visible action
+ if (e.key === 'Enter') {
+ e.preventDefault()
+ const first = filteredActions[0]
+ runAction(first)
+ return
+ }
+
+ // Number keys 1-9 trigger corresponding actions
+ if (/^[1-9]$/.test(e.key)) {
+ e.preventDefault()
+ const index = parseInt(e.key, 10)
+ if (index < filteredActions.length) {
+ const action = filteredActions[index]
+ runAction(action)
+ }
+ }
+ }
+
+ return (
+
+
+
+
+
+
+ }
+ placeholder='Search actions...'
+ size='large'
+ value={query}
+ onChange={(e) => setQuery(e.target.value)}
+ onKeyDown={handleKeyDown}
+ />
+
+ {filteredActions.length > 0 && (
+
+
+ getVisibleDisabled(action)
+ )}
+ renderItem={(action, index) => {
+ const Icon = action.icon
+ const disabled = getActionDisabled(action)
+
+ let shortcutText = ''
+ if (index === 0) {
+ shortcutText = 'ENTER'
+ } else if (index <= 9) {
+ shortcutText = index.toString()
+ }
+
+ return (
+ !disabled && runAction(action)}
+ style={{
+ cursor: disabled ? 'not-allowed' : 'pointer',
+ opacity: disabled ? 0.5 : 1
+ }}
+ >
+
+
+ {Icon ? : null}
+
+
+ {action.fullLabel || action.label || action.name}
+
+
+
+
+ {action.danger && Danger}
+ {shortcutText && {shortcutText}}
+
+
+
+ )
+ }}
+ />
+
+ )}
+
+
+ {children}
+
+ )
+}
+
+ActionsModalProvider.propTypes = {
+ children: PropTypes.node.isRequired
+}
+
+const useActionsModal = () => useContext(ActionsModalContext)
+
+// eslint-disable-next-line react-refresh/only-export-components
+export { ActionsModalProvider, ActionsModalContext, useActionsModal }
diff --git a/src/components/Dashboard/context/ApiServerContext.jsx b/src/components/Dashboard/context/ApiServerContext.jsx
index 3f09ee6..cf39a72 100644
--- a/src/components/Dashboard/context/ApiServerContext.jsx
+++ b/src/components/Dashboard/context/ApiServerContext.jsx
@@ -70,6 +70,11 @@ const ApiServerProvider = ({ children }) => {
[userProfile?._id]
)
+ const clearSubscriptions = useCallback(() => {
+ subscribedCallbacksRef.current.clear()
+ subscribedLockCallbacksRef.current.clear()
+ }, [])
+
const connectToServer = useCallback(() => {
if (token && authenticated == true) {
logger.debug('Token is available, connecting to api server...')
@@ -101,6 +106,7 @@ const ApiServerProvider = ({ children }) => {
newSocket.on('disconnect', () => {
logger.debug('Api Server disconnected')
setError('Api Server disconnected')
+ clearSubscriptions()
setConnected(false)
})
@@ -108,16 +114,10 @@ const ApiServerProvider = ({ children }) => {
logger.error('Api Server connection error:', err)
messageApi.error('Api Server connection error: ' + err.message)
setError('Api Server connection error')
+ clearSubscriptions()
setConnected(false)
})
- newSocket.on('bridge.notification', (data) => {
- notificationApi[data.type]({
- title: data.title,
- message: data.message
- })
- })
-
newSocket.on('error', (err) => {
logger.error('Api Server error:', err)
setError('Api Server error')
@@ -445,6 +445,7 @@ const ApiServerProvider = ({ children }) => {
(id, objectType, eventType, callback) => {
if (socketRef.current && socketRef.current.connected == true) {
const callbacksRefKey = `${objectType}:${id}:events:${eventType}`
+
// Remove callback from the subscribed callbacks map
if (subscribedCallbacksRef.current.has(callbacksRefKey)) {
const callbacks = subscribedCallbacksRef.current
@@ -452,6 +453,7 @@ const ApiServerProvider = ({ children }) => {
.filter((cb) => cb !== callback)
if (callbacks.length === 0) {
subscribedCallbacksRef.current.delete(callbacksRefKey)
+ console.log('Unsubscribing from object event:', callbacksRefKey)
socketRef.current.emit('unsubscribeObjectEvent', {
_id: id,
objectType,
@@ -479,6 +481,7 @@ const ApiServerProvider = ({ children }) => {
subscribedCallbacksRef.current.get(callbacksRefKey).length
if (callbacksLength <= 0) {
+ console.log('Subscribing to object event:', callbacksRefKey)
socketRef.current.emit(
'subscribeToObjectEvent',
{
@@ -662,7 +665,12 @@ const ApiServerProvider = ({ children }) => {
`${config.backendUrl}/${type.toLowerCase()}s/properties`,
{
params: {
- ...filter,
+ ...Object.keys(filter).reduce((acc, key) => {
+ acc[key] = Array.isArray(filter[key])
+ ? filter[key].join(',')
+ : filter[key]
+ return acc
+ }, {}),
properties: properties.join(','), // Convert array to comma-separated string
masterFilter: JSON.stringify(masterFilter)
},
@@ -932,7 +940,11 @@ const ApiServerProvider = ({ children }) => {
}
// Upload file to the API
- const uploadFile = async (file, additionalData = {}) => {
+ const uploadFile = async (
+ file,
+ additionalData = {},
+ progressCallback = null
+ ) => {
const uploadUrl = `${config.backendUrl}/files`
logger.debug('Uploading file:', file.name, 'to:', uploadUrl)
@@ -955,6 +967,9 @@ const ApiServerProvider = ({ children }) => {
(progressEvent.loaded * 100) / progressEvent.total
)
logger.debug(`Upload progress: ${percentCompleted}%`)
+ if (progressCallback) {
+ progressCallback(percentCompleted)
+ }
}
})
@@ -963,7 +978,7 @@ const ApiServerProvider = ({ children }) => {
} catch (err) {
console.error('File upload error:', err)
showError(err, () => {
- uploadFile(file, additionalData)
+ uploadFile(file, additionalData, progressCallback)
})
return null
}
diff --git a/src/components/Dashboard/context/MessageContext.jsx b/src/components/Dashboard/context/MessageContext.jsx
new file mode 100644
index 0000000..5f0cfd5
--- /dev/null
+++ b/src/components/Dashboard/context/MessageContext.jsx
@@ -0,0 +1,58 @@
+import { createContext, useContext } from 'react'
+import PropTypes from 'prop-types'
+import { message } from 'antd'
+
+const MessageContext = createContext()
+
+export const MessageProvider = ({ children }) => {
+ const [msgApi, contextHolder] = message.useMessage()
+
+ const showMessage = (type, content, options = {}) => {
+ return msgApi.open({
+ type,
+ content,
+ ...options
+ })
+ }
+
+ const showSuccess = (content, options = {}) =>
+ showMessage('success', content, options)
+ const showInfo = (content, options = {}) =>
+ showMessage('info', content, options)
+ const showWarning = (content, options = {}) =>
+ showMessage('warning', content, options)
+ const showError = (content, options = {}) =>
+ showMessage('error', content, options)
+ const showLoading = (content, options = {}) =>
+ showMessage('loading', content, options)
+
+ return (
+
+ {contextHolder}
+ {children}
+
+ )
+}
+
+MessageProvider.propTypes = {
+ children: PropTypes.node.isRequired
+}
+
+export const useMessageContext = () => {
+ const context = useContext(MessageContext)
+ if (!context) {
+ throw new Error('useMessageContext must be used within a MessageProvider')
+ }
+ return context
+}
+
+export { MessageContext }
diff --git a/src/components/Icons/CourierIcon.jsx b/src/components/Icons/CourierIcon.jsx
new file mode 100644
index 0000000..5cbe2a5
--- /dev/null
+++ b/src/components/Icons/CourierIcon.jsx
@@ -0,0 +1,6 @@
+import Icon from '@ant-design/icons'
+import CustomIconSvg from '../../../assets/icons/couriericon.svg?react'
+
+const CourierIcon = (props) =>
+
+export default CourierIcon
diff --git a/src/components/Icons/CourierServiceIcon.jsx b/src/components/Icons/CourierServiceIcon.jsx
new file mode 100644
index 0000000..71f705f
--- /dev/null
+++ b/src/components/Icons/CourierServiceIcon.jsx
@@ -0,0 +1,7 @@
+import Icon from '@ant-design/icons'
+import CustomIconSvg from '../../../assets/icons/courierserviceicon.svg?react'
+
+const CourierServiceIcon = (props) =>
+
+export default CourierServiceIcon
+
diff --git a/src/components/Icons/OrderItemsIcon.jsx b/src/components/Icons/OrderItemsIcon.jsx
new file mode 100644
index 0000000..068468b
--- /dev/null
+++ b/src/components/Icons/OrderItemsIcon.jsx
@@ -0,0 +1,6 @@
+import Icon from '@ant-design/icons'
+import CustomIconSvg from '../../../assets/icons/orderitemsicon.svg?react'
+
+const OrderItemsIcon = (props) =>
+
+export default OrderItemsIcon
diff --git a/src/components/Icons/PurchaseOrderIcon.jsx b/src/components/Icons/PurchaseOrderIcon.jsx
new file mode 100644
index 0000000..25bdb16
--- /dev/null
+++ b/src/components/Icons/PurchaseOrderIcon.jsx
@@ -0,0 +1,8 @@
+import Icon from '@ant-design/icons'
+import CustomIconSvg from '../../../assets/icons/purchaseordericon.svg?react'
+
+const PurchaseOrderIcon = (props) => (
+
+)
+
+export default PurchaseOrderIcon
diff --git a/src/database/ObjectModels.js b/src/database/ObjectModels.js
index f0e7ded..6ea58f0 100644
--- a/src/database/ObjectModels.js
+++ b/src/database/ObjectModels.js
@@ -7,6 +7,8 @@ import { Job } from './models/Job'
import { Product } from './models/Product'
import { Part } from './models/Part.js'
import { Vendor } from './models/Vendor'
+import { Courier } from './models/Courier'
+import { CourierService } from './models/CourierService'
import { File } from './models/File'
import { SubJob } from './models/SubJob'
import { Initial } from './models/Initial'
@@ -15,6 +17,7 @@ import { StockEvent } from './models/StockEvent'
import { StockAudit } from './models/StockAudit'
import { PartStock } from './models/PartStock'
import { ProductStock } from './models/ProductStock'
+import { PurchaseOrder } from './models/PurchaseOrder'
import { AuditLog } from './models/AuditLog'
import { User } from './models/User'
import { NoteType } from './models/NoteType'
@@ -35,6 +38,8 @@ export const objectModels = [
Product,
Part,
Vendor,
+ Courier,
+ CourierService,
File,
SubJob,
Initial,
@@ -43,6 +48,7 @@ export const objectModels = [
StockAudit,
PartStock,
ProductStock,
+ PurchaseOrder,
AuditLog,
User,
NoteType,
@@ -64,6 +70,8 @@ export {
Product,
Part,
Vendor,
+ Courier,
+ CourierService,
File,
SubJob,
Initial,
@@ -72,6 +80,7 @@ export {
StockAudit,
PartStock,
ProductStock,
+ PurchaseOrder,
AuditLog,
User,
NoteType,
diff --git a/src/database/models/Courier.js b/src/database/models/Courier.js
new file mode 100644
index 0000000..28b40c0
--- /dev/null
+++ b/src/database/models/Courier.js
@@ -0,0 +1,142 @@
+import CourierIcon from '../../components/Icons/CourierIcon'
+import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
+import EditIcon from '../../components/Icons/EditIcon'
+import CheckIcon from '../../components/Icons/CheckIcon'
+import XMarkIcon from '../../components/Icons/XMarkIcon'
+import ReloadIcon from '../../components/Icons/ReloadIcon'
+import BinIcon from '../../components/Icons/BinIcon'
+
+export const Courier = {
+ name: 'courier',
+ label: 'Courier',
+ prefix: 'COR',
+ icon: CourierIcon,
+ actions: [
+ {
+ name: 'info',
+ label: 'Info',
+ default: true,
+ row: true,
+ icon: InfoCircleIcon,
+ url: (_id) => `/dashboard/management/couriers/info?courierId=${_id}`
+ },
+ {
+ name: 'reload',
+ label: 'Reload',
+ icon: ReloadIcon,
+ url: (_id) =>
+ `/dashboard/management/couriers/info?courierId=${_id}&action=reload`
+ },
+ {
+ name: 'edit',
+ label: 'Edit',
+ row: true,
+ icon: EditIcon,
+ url: (_id) =>
+ `/dashboard/management/couriers/info?courierId=${_id}&action=edit`,
+ visible: (objectData) => {
+ return !(objectData?._isEditing && objectData?._isEditing == true)
+ }
+ },
+ {
+ name: 'finishEdit',
+ label: 'Save Edits',
+ icon: CheckIcon,
+ url: (_id) =>
+ `/dashboard/management/couriers/info?courierId=${_id}&action=finishEdit`,
+ visible: (objectData) => {
+ return objectData?._isEditing && objectData?._isEditing == true
+ }
+ },
+ {
+ name: 'cancelEdit',
+ label: 'Cancel Edits',
+ icon: XMarkIcon,
+ url: (_id) =>
+ `/dashboard/management/couriers/info?courierId=${_id}&action=cancelEdit`,
+ visible: (objectData) => {
+ console.log(objectData?._isEditing)
+ return objectData?._isEditing && objectData?._isEditing == true
+ }
+ },
+ { type: 'divider' },
+ {
+ name: 'delete',
+ label: 'Delete',
+ icon: BinIcon,
+ danger: true,
+ url: (_id) =>
+ `/dashboard/management/couriers/info?courierId=${_id}&action=delete`
+ }
+ ],
+ columns: ['name', '_id', 'country', 'email', 'website', 'createdAt'],
+ filters: ['name', '_id', 'country', 'email'],
+ sorters: ['name', 'country', 'email', 'createdAt', '_id'],
+ group: ['country'],
+ properties: [
+ {
+ name: '_id',
+ label: 'ID',
+ columnFixed: 'left',
+ type: 'id',
+ objectType: 'courier',
+ showCopy: true
+ },
+ {
+ name: 'createdAt',
+ label: 'Created At',
+ type: 'dateTime',
+ readOnly: true
+ },
+ {
+ name: 'name',
+ label: 'Name',
+ columnFixed: 'left',
+ required: true,
+ type: 'text'
+ },
+ {
+ name: 'updatedAt',
+ label: 'Updated At',
+ type: 'dateTime',
+ readOnly: true
+ },
+ {
+ name: 'contact',
+ label: 'Contact',
+ type: 'text',
+ readOnly: false,
+ required: false
+ },
+ {
+ name: 'country',
+ label: 'Country',
+ type: 'country',
+ readOnly: false,
+ required: false
+ },
+ {
+ name: 'email',
+ label: 'Email',
+ columnWidth: 300,
+ type: 'email',
+ readOnly: false,
+ required: false
+ },
+ {
+ name: 'phone',
+ label: 'Phone',
+ type: 'phone',
+ readOnly: false,
+ required: false
+ },
+ {
+ name: 'website',
+ label: 'Website',
+ columnWidth: 300,
+ type: 'url',
+ readOnly: false,
+ required: false
+ }
+ ]
+}
diff --git a/src/database/models/CourierService.js b/src/database/models/CourierService.js
new file mode 100644
index 0000000..8869cf9
--- /dev/null
+++ b/src/database/models/CourierService.js
@@ -0,0 +1,170 @@
+import CourierServiceIcon from '../../components/Icons/CourierServiceIcon'
+import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
+import EditIcon from '../../components/Icons/EditIcon'
+import CheckIcon from '../../components/Icons/CheckIcon'
+import XMarkIcon from '../../components/Icons/XMarkIcon'
+import ReloadIcon from '../../components/Icons/ReloadIcon'
+import BinIcon from '../../components/Icons/BinIcon'
+
+export const CourierService = {
+ name: 'courierService',
+ label: 'Courier Service',
+ prefix: 'COS',
+ icon: CourierServiceIcon,
+ actions: [
+ {
+ name: 'info',
+ label: 'Info',
+ default: true,
+ row: true,
+ icon: InfoCircleIcon,
+ url: (_id) =>
+ `/dashboard/management/courierservices/info?courierServiceId=${_id}`
+ },
+ {
+ name: 'reload',
+ label: 'Reload',
+ icon: ReloadIcon,
+ url: (_id) =>
+ `/dashboard/management/courierservices/info?courierServiceId=${_id}&action=reload`
+ },
+ {
+ name: 'edit',
+ label: 'Edit',
+ row: true,
+ icon: EditIcon,
+ url: (_id) =>
+ `/dashboard/management/courierservices/info?courierServiceId=${_id}&action=edit`,
+ visible: (objectData) => {
+ return !(objectData?._isEditing && objectData?._isEditing == true)
+ }
+ },
+ {
+ name: 'finishEdit',
+ label: 'Save Edits',
+ icon: CheckIcon,
+ url: (_id) =>
+ `/dashboard/management/courierservices/info?courierServiceId=${_id}&action=finishEdit`,
+ visible: (objectData) => {
+ return objectData?._isEditing && objectData?._isEditing == true
+ }
+ },
+ {
+ name: 'cancelEdit',
+ label: 'Cancel Edits',
+ icon: XMarkIcon,
+ url: (_id) =>
+ `/dashboard/management/courierservices/info?courierServiceId=${_id}&action=cancelEdit`,
+ visible: (objectData) => {
+ console.log(objectData?._isEditing)
+ return objectData?._isEditing && objectData?._isEditing == true
+ }
+ },
+ { type: 'divider' },
+ {
+ name: 'delete',
+ label: 'Delete',
+ icon: BinIcon,
+ danger: true,
+ url: (_id) =>
+ `/dashboard/management/courierservices/info?courierServiceId=${_id}&action=delete`
+ }
+ ],
+ columns: [
+ 'name',
+ '_id',
+ 'courier',
+ 'courier._id',
+ 'tracked',
+ 'deliveryTime',
+ 'active'
+ ],
+ filters: ['name', '_id', 'courier._id', 'active', 'deliveryTime', 'tracked'],
+ sorters: [
+ 'name',
+ 'courier._id',
+ 'active',
+ 'tracked',
+ 'estimatedDeliveryTime',
+ 'createdAt',
+ '_id'
+ ],
+ group: ['courier'],
+ properties: [
+ {
+ name: '_id',
+ label: 'ID',
+ columnFixed: 'left',
+ type: 'id',
+ objectType: 'courierService',
+ showCopy: true
+ },
+ {
+ name: 'createdAt',
+ label: 'Created At',
+ type: 'dateTime',
+ readOnly: true
+ },
+ {
+ name: 'name',
+ label: 'Name',
+ columnFixed: 'left',
+ required: true,
+ type: 'text'
+ },
+ {
+ name: 'updatedAt',
+ label: 'Updated At',
+ type: 'dateTime',
+ readOnly: true
+ },
+ {
+ name: 'courier',
+ label: 'Courier',
+ type: 'object',
+ objectType: 'courier',
+ showHyperlink: true,
+ required: true
+ },
+ {
+ name: 'courier._id',
+ label: 'Courier ID',
+ type: 'id',
+ objectType: 'courier',
+ showHyperlink: true
+ },
+ {
+ name: 'deliveryTime',
+ label: 'Delivery Time',
+ type: 'number',
+ readOnly: false,
+ required: false,
+ suffix: 'days',
+ columnWidth: 175
+ },
+ {
+ name: 'active',
+ label: 'Active',
+ type: 'bool',
+ readOnly: false,
+ required: true,
+ columnWidth: 150
+ },
+ {
+ name: 'tracked',
+ label: 'Tracked',
+ type: 'bool',
+ readOnly: false,
+ required: true,
+ columnWidth: 150
+ },
+ {
+ name: 'website',
+ label: 'Website',
+ columnWidth: 300,
+ type: 'url',
+ readOnly: false,
+ required: false
+ }
+ ]
+}
diff --git a/src/database/models/DocumentJob.js b/src/database/models/DocumentJob.js
index 0e67654..68d8732 100644
--- a/src/database/models/DocumentJob.js
+++ b/src/database/models/DocumentJob.js
@@ -1,6 +1,8 @@
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
import ReloadIcon from '../../components/Icons/ReloadIcon'
import EditIcon from '../../components/Icons/EditIcon'
+import CheckIcon from '../../components/Icons/CheckIcon'
+import XMarkIcon from '../../components/Icons/XMarkIcon'
import DocumentJobIcon from '../../components/Icons/DocumentJobIcon'
import dayjs from 'dayjs'
@@ -33,7 +35,31 @@ export const DocumentJob = {
row: true,
icon: EditIcon,
url: (_id) =>
- `/dashboard/management/documentjobs/info?documentJobId=${_id}&action=edit`
+ `/dashboard/management/documentjobs/info?documentJobId=${_id}&action=edit`,
+ visible: (objectData) => {
+ return !(objectData?._isEditing && objectData?._isEditing == true)
+ }
+ },
+ {
+ name: 'finishEdit',
+ label: 'Save Edits',
+ icon: CheckIcon,
+ url: (_id) =>
+ `/dashboard/management/documentjobs/info?documentJobId=${_id}&action=finishEdit`,
+ visible: (objectData) => {
+ return objectData?._isEditing && objectData?._isEditing == true
+ }
+ },
+ {
+ name: 'cancelEdit',
+ label: 'Cancel Edits',
+ icon: XMarkIcon,
+ url: (_id) =>
+ `/dashboard/management/documentjobs/info?documentJobId=${_id}&action=cancelEdit`,
+ visible: (objectData) => {
+ console.log(objectData?._isEditing)
+ return objectData?._isEditing && objectData?._isEditing == true
+ }
}
],
columns: ['name', '_id', 'state', 'createdAt', 'updatedAt'],
diff --git a/src/database/models/DocumentPrinter.js b/src/database/models/DocumentPrinter.js
index ac34d60..eb723af 100644
--- a/src/database/models/DocumentPrinter.js
+++ b/src/database/models/DocumentPrinter.js
@@ -2,6 +2,8 @@ import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
import ReloadIcon from '../../components/Icons/ReloadIcon'
import EditIcon from '../../components/Icons/EditIcon'
import DocumentPrinterIcon from '../../components/Icons/DocumentPrinterIcon'
+import CheckIcon from '../../components/Icons/CheckIcon'
+import XMarkIcon from '../../components/Icons/XMarkIcon'
export const DocumentPrinter = {
name: 'documentPrinter',
@@ -32,7 +34,31 @@ export const DocumentPrinter = {
row: true,
icon: EditIcon,
url: (_id) =>
- `/dashboard/management/documentprinters/info?documentPrinterId=${_id}&action=edit`
+ `/dashboard/management/documentprinters/info?documentPrinterId=${_id}&action=edit`,
+ visible: (objectData) => {
+ return !(objectData?._isEditing && objectData?._isEditing == true)
+ }
+ },
+ {
+ name: 'finishEdit',
+ label: 'Save Edits',
+ icon: CheckIcon,
+ url: (_id) =>
+ `/dashboard/management/documentprinters/info?documentPrinterId=${_id}&action=finishEdit`,
+ visible: (objectData) => {
+ return objectData?._isEditing && objectData?._isEditing == true
+ }
+ },
+ {
+ name: 'cancelEdit',
+ label: 'Cancel Edits',
+ icon: XMarkIcon,
+ url: (_id) =>
+ `/dashboard/management/documentprinters/info?documentPrinterId=${_id}&action=cancelEdit`,
+ visible: (objectData) => {
+ console.log(objectData?._isEditing)
+ return objectData?._isEditing && objectData?._isEditing == true
+ }
}
],
columns: [
@@ -101,6 +127,21 @@ export const DocumentPrinter = {
type: 'bool',
required: true
},
+ {
+ name: 'vendor',
+ label: 'Vendor',
+ type: 'object',
+ objectType: 'vendor',
+ required: false
+ },
+ {
+ name: 'vendor._id',
+ label: 'Vendor ID',
+ type: 'id',
+ objectType: 'vendor',
+ showHyperlink: true,
+ readOnly: true
+ },
{
name: 'host',
label: 'Host',
diff --git a/src/database/models/DocumentSize.js b/src/database/models/DocumentSize.js
index d6bc273..8ad4d4b 100644
--- a/src/database/models/DocumentSize.js
+++ b/src/database/models/DocumentSize.js
@@ -1,6 +1,8 @@
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
import ReloadIcon from '../../components/Icons/ReloadIcon'
import EditIcon from '../../components/Icons/EditIcon'
+import CheckIcon from '../../components/Icons/CheckIcon'
+import XMarkIcon from '../../components/Icons/XMarkIcon'
import DocumentSizeIcon from '../../components/Icons/DocumentSizeIcon'
export const DocumentSize = {
@@ -32,7 +34,31 @@ export const DocumentSize = {
row: true,
icon: EditIcon,
url: (_id) =>
- `/dashboard/management/documentsizes/info?documentSizeId=${_id}&action=edit`
+ `/dashboard/management/documentsizes/info?documentSizeId=${_id}&action=edit`,
+ visible: (objectData) => {
+ return !(objectData?._isEditing && objectData?._isEditing == true)
+ }
+ },
+ {
+ name: 'finishEdit',
+ label: 'Save Edits',
+ icon: CheckIcon,
+ url: (_id) =>
+ `/dashboard/management/documentsizes/info?documentSizeId=${_id}&action=finishEdit`,
+ visible: (objectData) => {
+ return objectData?._isEditing && objectData?._isEditing == true
+ }
+ },
+ {
+ name: 'cancelEdit',
+ label: 'Cancel Edits',
+ icon: XMarkIcon,
+ url: (_id) =>
+ `/dashboard/management/documentsizes/info?documentSizeId=${_id}&action=cancelEdit`,
+ visible: (objectData) => {
+ console.log(objectData?._isEditing)
+ return objectData?._isEditing && objectData?._isEditing == true
+ }
}
],
columns: [
diff --git a/src/database/models/DocumentTemplate.js b/src/database/models/DocumentTemplate.js
index babcffe..04decd8 100644
--- a/src/database/models/DocumentTemplate.js
+++ b/src/database/models/DocumentTemplate.js
@@ -1,6 +1,8 @@
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
import ReloadIcon from '../../components/Icons/ReloadIcon'
import EditIcon from '../../components/Icons/EditIcon'
+import CheckIcon from '../../components/Icons/CheckIcon'
+import XMarkIcon from '../../components/Icons/XMarkIcon'
import DesignIcon from '../../components/Icons/DesignIcon'
import DocumentTemplateIcon from '../../components/Icons/DocumentTemplateIcon'
@@ -41,7 +43,31 @@ export const DocumentTemplate = {
row: true,
icon: EditIcon,
url: (_id) =>
- `/dashboard/management/documenttemplates/info?documentTemplateId=${_id}&action=edit`
+ `/dashboard/management/documenttemplates/info?documentTemplateId=${_id}&action=edit`,
+ visible: (objectData) => {
+ return !(objectData?._isEditing && objectData?._isEditing == true)
+ }
+ },
+ {
+ name: 'finishEdit',
+ label: 'Save Edits',
+ icon: CheckIcon,
+ url: (_id) =>
+ `/dashboard/management/documenttemplates/info?documentTemplateId=${_id}&action=finishEdit`,
+ visible: (objectData) => {
+ return objectData?._isEditing && objectData?._isEditing == true
+ }
+ },
+ {
+ name: 'cancelEdit',
+ label: 'Cancel Edits',
+ icon: XMarkIcon,
+ url: (_id) =>
+ `/dashboard/management/documenttemplates/info?documentTemplateId=${_id}&action=cancelEdit`,
+ visible: (objectData) => {
+ console.log(objectData?._isEditing)
+ return objectData?._isEditing && objectData?._isEditing == true
+ }
}
],
columns: [
diff --git a/src/database/models/Filament.js b/src/database/models/Filament.js
index 55032b9..63003be 100644
--- a/src/database/models/Filament.js
+++ b/src/database/models/Filament.js
@@ -2,6 +2,8 @@ import EditIcon from '../../components/Icons/EditIcon'
import FilamentIcon from '../../components/Icons/FilamentIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
import ReloadIcon from '../../components/Icons/ReloadIcon'
+import CheckIcon from '../../components/Icons/CheckIcon'
+import XMarkIcon from '../../components/Icons/XMarkIcon'
export const Filament = {
name: 'filament',
@@ -30,7 +32,31 @@ export const Filament = {
row: true,
icon: EditIcon,
url: (_id) =>
- `/dashboard/management/filaments/info?filamentId=${_id}&action=edit`
+ `/dashboard/management/filaments/info?filamentId=${_id}&action=edit`,
+ visible: (objectData) => {
+ return !(objectData?._isEditing && objectData?._isEditing == true)
+ }
+ },
+ {
+ name: 'finishEdit',
+ label: 'Save Edits',
+ icon: CheckIcon,
+ url: (_id) =>
+ `/dashboard/management/filaments/info?filamentId=${_id}&action=finishEdit`,
+ visible: (objectData) => {
+ return objectData?._isEditing && objectData?._isEditing == true
+ }
+ },
+ {
+ name: 'cancelEdit',
+ label: 'Cancel Edits',
+ icon: XMarkIcon,
+ url: (_id) =>
+ `/dashboard/management/filaments/info?filamentId=${_id}&action=cancelEdit`,
+ visible: (objectData) => {
+ console.log(objectData?._isEditing)
+ return objectData?._isEditing && objectData?._isEditing == true
+ }
}
],
columns: [
diff --git a/src/database/models/File.js b/src/database/models/File.js
index 279759b..06a6033 100644
--- a/src/database/models/File.js
+++ b/src/database/models/File.js
@@ -2,6 +2,8 @@ import DownloadIcon from '../../components/Icons/DownloadIcon'
import FileIcon from '../../components/Icons/FileIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
import EditIcon from '../../components/Icons/EditIcon'
+import CheckIcon from '../../components/Icons/CheckIcon'
+import XMarkIcon from '../../components/Icons/XMarkIcon'
import ReloadIcon from '../../components/Icons/ReloadIcon'
import BinIcon from '../../components/Icons/BinIcon'
@@ -31,7 +33,31 @@ export const File = {
label: 'Edit',
row: true,
icon: EditIcon,
- url: (_id) => `/dashboard/management/files/info?fileId=${_id}&action=edit`
+ url: (_id) => `/dashboard/management/files/info?fileId=${_id}&action=edit`,
+ visible: (objectData) => {
+ return !(objectData?._isEditing && objectData?._isEditing == true)
+ }
+ },
+ {
+ name: 'finishEdit',
+ label: 'Save Edits',
+ icon: CheckIcon,
+ url: (_id) =>
+ `/dashboard/management/files/info?fileId=${_id}&action=finishEdit`,
+ visible: (objectData) => {
+ return objectData?._isEditing && objectData?._isEditing == true
+ }
+ },
+ {
+ name: 'cancelEdit',
+ label: 'Cancel Edits',
+ icon: XMarkIcon,
+ url: (_id) =>
+ `/dashboard/management/files/info?fileId=${_id}&action=cancelEdit`,
+ visible: (objectData) => {
+ console.log(objectData?._isEditing)
+ return objectData?._isEditing && objectData?._isEditing == true
+ }
},
{
name: 'download',
diff --git a/src/database/models/GCodeFile.js b/src/database/models/GCodeFile.js
index c6baf7a..db83212 100644
--- a/src/database/models/GCodeFile.js
+++ b/src/database/models/GCodeFile.js
@@ -1,5 +1,7 @@
import DownloadIcon from '../../components/Icons/DownloadIcon'
import EditIcon from '../../components/Icons/EditIcon'
+import CheckIcon from '../../components/Icons/CheckIcon'
+import XMarkIcon from '../../components/Icons/XMarkIcon'
import GCodeFileIcon from '../../components/Icons/GCodeFileIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
import ReloadIcon from '../../components/Icons/ReloadIcon'
@@ -39,7 +41,31 @@ export const GCodeFile = {
row: true,
icon: EditIcon,
url: (_id) =>
- `/dashboard/production/gcodefiles/info?gcodeFileId=${_id}&action=edit`
+ `/dashboard/production/gcodefiles/info?gcodeFileId=${_id}&action=edit`,
+ visible: (objectData) => {
+ return !(objectData?._isEditing && objectData?._isEditing == true)
+ }
+ },
+ {
+ name: 'finishEdit',
+ label: 'Save Edits',
+ icon: CheckIcon,
+ url: (_id) =>
+ `/dashboard/production/gcodefiles/info?gcodeFileId=${_id}&action=finishEdit`,
+ visible: (objectData) => {
+ return objectData?._isEditing && objectData?._isEditing == true
+ }
+ },
+ {
+ name: 'cancelEdit',
+ label: 'Cancel Edits',
+ icon: XMarkIcon,
+ url: (_id) =>
+ `/dashboard/production/gcodefiles/info?gcodeFileId=${_id}&action=cancelEdit`,
+ visible: (objectData) => {
+ console.log(objectData?._isEditing)
+ return objectData?._isEditing && objectData?._isEditing == true
+ }
}
],
@@ -127,9 +153,11 @@ export const GCodeFile = {
name: 'cost',
label: 'Cost',
type: 'number',
+ roundNumber: 2,
value: (objectData) => {
return (
- objectData?.file?.metaData?.filamentUsedG * objectData?.filament?.cost
+ objectData?.file?.metaData?.filamentUsedG *
+ (objectData?.filament?.cost / 1000)
)
},
readOnly: true,
@@ -196,6 +224,51 @@ export const GCodeFile = {
label: 'Print Profile',
type: 'text',
readOnly: true
+ },
+ {
+ name: 'parts',
+ label: 'Parts',
+ type: 'objectChildren',
+ objectType: 'part',
+ properties: [
+ {
+ name: 'part',
+ label: 'Part',
+ type: 'object',
+ objectType: 'part',
+ required: true
+ },
+ {
+ name: 'part._id',
+ label: 'Part ID',
+ type: 'id',
+ objectType: 'part',
+ showHyperlink: true,
+ value: (objectData) => {
+ return objectData?.part?._id
+ }
+ },
+ {
+ name: 'quantity',
+ label: 'Quantity',
+ type: 'number',
+ required: true
+ }
+ ],
+ rollups: [
+ {
+ name: 'totalQuantity',
+ label: 'Total',
+ type: 'number',
+ property: 'quantity',
+ value: (objectData) => {
+ return objectData?.parts?.reduce(
+ (acc, part) => acc + part.quantity,
+ 0
+ )
+ }
+ }
+ ]
}
]
}
diff --git a/src/database/models/Host.js b/src/database/models/Host.js
index 16b6006..551c6ab 100644
--- a/src/database/models/Host.js
+++ b/src/database/models/Host.js
@@ -2,6 +2,8 @@ import HostIcon from '../../components/Icons/HostIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
import ReloadIcon from '../../components/Icons/ReloadIcon'
import EditIcon from '../../components/Icons/EditIcon'
+import CheckIcon from '../../components/Icons/CheckIcon'
+import XMarkIcon from '../../components/Icons/XMarkIcon'
import OTPIcon from '../../components/Icons/OTPIcon'
export const Host = {
@@ -38,7 +40,32 @@ export const Host = {
label: 'Edit',
row: true,
icon: EditIcon,
- url: (_id) => `/dashboard/management/hosts/info?hostId=${_id}&action=edit`
+ url: (_id) =>
+ `/dashboard/management/hosts/info?hostId=${_id}&action=edit`,
+ visible: (objectData) => {
+ return !(objectData?._isEditing && objectData?._isEditing == true)
+ }
+ },
+ {
+ name: 'finishEdit',
+ label: 'Save Edits',
+ icon: CheckIcon,
+ url: (_id) =>
+ `/dashboard/management/hosts/info?hostId=${_id}&action=finishEdit`,
+ visible: (objectData) => {
+ return objectData?._isEditing && objectData?._isEditing == true
+ }
+ },
+ {
+ name: 'cancelEdit',
+ label: 'Cancel Edits',
+ icon: XMarkIcon,
+ url: (_id) =>
+ `/dashboard/management/hosts/info?hostId=${_id}&action=cancelEdit`,
+ visible: (objectData) => {
+ console.log(objectData?._isEditing)
+ return objectData?._isEditing && objectData?._isEditing == true
+ }
}
],
columns: ['name', '_id', 'state', 'tags', 'connectedAt'],
@@ -54,8 +81,8 @@ export const Host = {
showCopy: true
},
{
- name: 'connectedAt',
- label: 'Connected At',
+ name: 'createdAt',
+ label: 'Created At',
type: 'dateTime',
readOnly: true
},
@@ -67,6 +94,12 @@ export const Host = {
columnWidth: 200,
columnFixed: 'left'
},
+ {
+ name: 'updatedAt',
+ label: 'Updated At',
+ type: 'dateTime',
+ readOnly: true
+ },
{
name: 'state',
label: 'State',
@@ -76,10 +109,10 @@ export const Host = {
readOnly: true
},
{
- name: 'active',
- label: 'Active',
- type: 'bool',
- required: true
+ name: 'connectedAt',
+ label: 'Connected At',
+ type: 'dateTime',
+ readOnly: true
},
{
name: 'online',
@@ -87,6 +120,13 @@ export const Host = {
type: 'bool',
readOnly: true
},
+ {
+ name: 'active',
+ label: 'Active',
+ type: 'bool',
+ required: true
+ },
+
{
name: 'deviceInfo.os',
label: 'Operating System',
@@ -158,6 +198,14 @@ export const Host = {
label: 'Tags',
type: 'tags',
required: false
+ },
+ {
+ name: 'files',
+ label: 'Files',
+ type: 'objectList',
+ objectType: 'file',
+ required: false,
+ readOnly: true
}
]
}
diff --git a/src/database/models/Job.js b/src/database/models/Job.js
index 7569e08..a953596 100644
--- a/src/database/models/Job.js
+++ b/src/database/models/Job.js
@@ -56,6 +56,12 @@ export const Job = {
objectType: 'job',
showCopy: true
},
+ {
+ name: 'createdAt',
+ label: 'Created At',
+ type: 'dateTime',
+ readOnly: true
+ },
{
name: 'state',
label: 'State',
@@ -65,7 +71,39 @@ export const Job = {
showProgress: true,
showId: false,
showQuantity: false,
- columnWidth: 150,
+ columnWidth: 250,
+ readOnly: true
+ },
+ {
+ name: 'updatedAt',
+ label: 'Updated At',
+ type: 'dateTime',
+ readOnly: true
+ },
+ {
+ name: 'quantity',
+ label: 'Quantity',
+ type: 'number',
+ columnWidth: 125,
+ required: true
+ },
+ {
+ name: 'startedAt',
+ label: 'Started At',
+ type: 'dateTime',
+ readOnly: true
+ },
+ {
+ name: 'printers',
+ label: 'Printers',
+ type: 'objectList',
+ objectType: 'printer',
+ required: true
+ },
+ {
+ name: 'finishedAt',
+ label: 'Finished At',
+ type: 'dateTime',
readOnly: true
},
{
@@ -82,33 +120,6 @@ export const Job = {
type: 'id',
objectType: 'gcodeFile',
showHyperlink: true
- },
- {
- name: 'quantity',
- label: 'Quantity',
- type: 'number',
- columnWidth: 125,
- required: true
- },
- {
- name: 'createdAt',
- label: 'Created At',
- type: 'dateTime',
- readOnly: true
- },
- {
- name: 'startedAt',
- label: 'Started At',
- type: 'dateTime',
- readOnly: true
- },
- {
- name: 'printers',
- label: 'Printers',
- type: 'objectList',
- objectType: 'printer',
- required: true,
- span: 2
}
]
}
diff --git a/src/database/models/NoteType.js b/src/database/models/NoteType.js
index 6a2cd27..8fc67e3 100644
--- a/src/database/models/NoteType.js
+++ b/src/database/models/NoteType.js
@@ -2,6 +2,8 @@ import NoteTypeIcon from '../../components/Icons/NoteTypeIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
import ReloadIcon from '../../components/Icons/ReloadIcon'
import EditIcon from '../../components/Icons/EditIcon'
+import CheckIcon from '../../components/Icons/CheckIcon'
+import XMarkIcon from '../../components/Icons/XMarkIcon'
export const NoteType = {
name: 'noteType',
@@ -30,7 +32,31 @@ export const NoteType = {
row: true,
icon: EditIcon,
url: (_id) =>
- `/dashboard/management/notetypes/info?noteTypeId=${_id}&action=edit`
+ `/dashboard/management/notetypes/info?noteTypeId=${_id}&action=edit`,
+ visible: (objectData) => {
+ return !(objectData?._isEditing && objectData?._isEditing == true)
+ }
+ },
+ {
+ name: 'finishEdit',
+ label: 'Save Edits',
+ icon: CheckIcon,
+ url: (_id) =>
+ `/dashboard/management/notetypes/info?noteTypeId=${_id}&action=finishEdit`,
+ visible: (objectData) => {
+ return objectData?._isEditing && objectData?._isEditing == true
+ }
+ },
+ {
+ name: 'cancelEdit',
+ label: 'Cancel Edits',
+ icon: XMarkIcon,
+ url: (_id) =>
+ `/dashboard/management/notetypes/info?noteTypeId=${_id}&action=cancelEdit`,
+ visible: (objectData) => {
+ console.log(objectData?._isEditing)
+ return objectData?._isEditing && objectData?._isEditing == true
+ }
}
],
columns: ['name', '_id', 'color', 'active', 'createdAt', 'updatedAt'],
diff --git a/src/database/models/Part.js b/src/database/models/Part.js
index 0c56a38..e87d080 100644
--- a/src/database/models/Part.js
+++ b/src/database/models/Part.js
@@ -2,6 +2,8 @@ import EditIcon from '../../components/Icons/EditIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
import PartIcon from '../../components/Icons/PartIcon'
import ReloadIcon from '../../components/Icons/ReloadIcon'
+import CheckIcon from '../../components/Icons/CheckIcon'
+import XMarkIcon from '../../components/Icons/XMarkIcon'
export const Part = {
name: 'part',
@@ -29,7 +31,32 @@ export const Part = {
label: 'Edit',
row: true,
icon: EditIcon,
- url: (_id) => `/dashboard/management/parts/info?partId=${_id}&action=edit`
+ url: (_id) =>
+ `/dashboard/management/parts/info?partId=${_id}&action=edit`,
+ visible: (objectData) => {
+ return !(objectData?._isEditing && objectData?._isEditing == true)
+ }
+ },
+ {
+ name: 'finishEdit',
+ label: 'Save Edits',
+ icon: CheckIcon,
+ url: (_id) =>
+ `/dashboard/management/parts/info?partId=${_id}&action=finishEdit`,
+ visible: (objectData) => {
+ return objectData?._isEditing && objectData?._isEditing == true
+ }
+ },
+ {
+ name: 'cancelEdit',
+ label: 'Cancel Edits',
+ icon: XMarkIcon,
+ url: (_id) =>
+ `/dashboard/management/parts/info?partId=${_id}&action=cancelEdit`,
+ visible: (objectData) => {
+ console.log(objectData?._isEditing)
+ return objectData?._isEditing && objectData?._isEditing == true
+ }
}
],
columns: [
@@ -71,22 +98,6 @@ export const Part = {
type: 'dateTime',
readOnly: true
},
-
- {
- name: 'product',
- label: 'Product',
- type: 'object',
- required: true,
- objectType: 'product'
- },
- {
- name: 'product._id',
- label: 'Product ID',
- type: 'id',
- readOnly: true,
- showHyperlink: true,
- objectType: 'product'
- },
{
name: 'vendor',
label: 'Vendor',
@@ -111,11 +122,14 @@ export const Part = {
objectType: 'vendor'
},
{
- name: 'globalPricing',
- label: 'Global Price',
+ name: 'cost',
+ label: 'Cost',
columnWidth: 150,
required: true,
- type: 'bool'
+ type: 'number',
+ prefix: '£',
+ min: 0,
+ step: 0.01
},
{
name: 'priceMode',
@@ -142,18 +156,21 @@ export const Part = {
step: 0.01
},
{
- name: 'amount',
- label: 'Amount',
+ name: 'price',
+ label: 'Price',
required: true,
- disabled: (objectData) => {
- return (
- objectData.globalPricing == true || objectData.priceMode == 'margin'
- )
- },
type: 'number',
prefix: '£',
min: 0,
- step: 0.1
+ step: 0.1,
+ roundNumber: 2,
+ value: (objectData) => {
+ if (objectData?.priceMode == 'margin') {
+ return objectData?.cost * (1 + objectData?.margin / 100) || undefined
+ } else {
+ return objectData?.price || undefined
+ }
+ }
},
{
name: 'file',
diff --git a/src/database/models/PartStock.js b/src/database/models/PartStock.js
index 9355acd..0c1ea3a 100644
--- a/src/database/models/PartStock.js
+++ b/src/database/models/PartStock.js
@@ -2,7 +2,7 @@ import PartStockIcon from '../../components/Icons/PartStockIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
export const PartStock = {
- name: 'partstock',
+ name: 'partStock',
label: 'Part Stock',
prefix: 'PTS',
icon: PartStockIcon,
@@ -13,8 +13,124 @@ export const PartStock = {
default: true,
row: true,
icon: InfoCircleIcon,
- url: (_id) => `/dashboard/management/partstocks/info?partStockId=${_id}`
+ url: (_id) => `/dashboard/inventory/partstocks/info?partStockId=${_id}`
}
],
- url: (id) => `/dashboard/management/partstocks/info?partStockId=${id}`
+ url: (id) => `/dashboard/inventory/partstocks/info?partStockId=${id}`,
+ filters: ['_id', 'part', 'startingQuantity', 'currentQuantity'],
+ sorters: ['part', 'startingQuantity', 'currentQuantity'],
+ columns: [
+ '_id',
+ 'state',
+ 'startingQuantity',
+ 'currentQuantity',
+ 'part',
+ 'part._id',
+ 'createdAt',
+ 'updatedAt'
+ ],
+ properties: [
+ {
+ name: '_id',
+ label: 'ID',
+ type: 'id',
+ objectType: 'partStock',
+ showCopy: true,
+ readOnly: true
+ },
+ {
+ name: 'createdAt',
+ label: 'Created At',
+ type: 'dateTime',
+ readOnly: true
+ },
+ {
+ name: 'state',
+ label: 'State',
+ type: 'state',
+ readOnly: true,
+ columnWidth: 120
+ },
+ {
+ name: 'updatedAt',
+ label: 'Updated At',
+ type: 'dateTime',
+ readOnly: true
+ },
+ {
+ name: 'sourceType',
+ label: 'Source Type',
+ type: 'objectType',
+ readOnly: false,
+ columnWidth: 200,
+ required: true,
+ masterFilter: ['subJob']
+ },
+
+ {
+ name: 'consumedAt',
+ label: 'Consumed At',
+ type: 'dateTime',
+ readOnly: true
+ },
+ {
+ name: 'part',
+ label: 'Part',
+ type: 'object',
+ objectType: 'part',
+ required: true
+ },
+ {
+ name: 'part._id',
+ label: 'Part ID',
+ type: 'id',
+ objectType: 'part',
+ readOnly: true,
+ showHyperlink: true
+ },
+
+ {
+ name: 'source',
+ label: 'Source',
+ type: 'object',
+ readOnly: false,
+ required: true,
+ columnWidth: 200,
+ objectType: (objectData) => {
+ return objectData?.sourceType
+ }
+ },
+ {
+ name: 'source._id',
+ label: 'Source ID',
+ type: 'id',
+ readOnly: true,
+ columnWidth: 200,
+ objectType: (objectData) => {
+ return objectData?.sourceType
+ }
+ },
+ {
+ name: 'currentQuantity',
+ label: 'Current Quantity',
+ type: 'number',
+ readOnly: true,
+ columnWidth: 200,
+ required: true,
+ value: (objectData) => {
+ if (objectData?.state?.type === 'new') {
+ return objectData?.startingQuantity
+ } else {
+ return objectData.currentQuantity
+ }
+ }
+ },
+ {
+ name: 'startingQuantity',
+ label: 'Starting Quantity',
+ type: 'number',
+ columnWidth: 200,
+ required: true
+ }
+ ]
}
diff --git a/src/database/models/Printer.js b/src/database/models/Printer.js
index b1fcf43..094c4d9 100644
--- a/src/database/models/Printer.js
+++ b/src/database/models/Printer.js
@@ -2,10 +2,14 @@ import PrinterIcon from '../../components/Icons/PrinterIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
import ReloadIcon from '../../components/Icons/ReloadIcon'
import EditIcon from '../../components/Icons/EditIcon'
+import CheckIcon from '../../components/Icons/CheckIcon'
+import XMarkIcon from '../../components/Icons/XMarkIcon'
import PlayCircleIcon from '../../components/Icons/PlayCircleIcon'
import PauseCircleIcon from '../../components/Icons/PauseCircleIcon'
import StopCircleIcon from '../../components/Icons/StopCircleIcon'
import FilamentStockIcon from '../../components/Icons/FilamentStockIcon'
+import ControlIcon from '../../components/Icons/ControlIcon'
+
export const Printer = {
name: 'printer',
label: 'Printer',
@@ -32,7 +36,7 @@ export const Printer = {
name: 'control',
label: 'Control',
row: true,
- icon: PlayCircleIcon,
+ icon: ControlIcon,
url: (_id) => `/dashboard/production/printers/control?printerId=${_id}`
},
{
@@ -41,7 +45,31 @@ export const Printer = {
row: true,
icon: EditIcon,
url: (_id) =>
- `/dashboard/production/printers/info?printerId=${_id}&action=edit`
+ `/dashboard/production/printers/info?printerId=${_id}&action=edit`,
+ visible: (objectData) => {
+ return !(objectData?._isEditing && objectData?._isEditing == true)
+ }
+ },
+ {
+ name: 'finishEdit',
+ label: 'Save Edits',
+ icon: CheckIcon,
+ url: (_id) =>
+ `/dashboard/production/printers/info?printerId=${_id}&action=finishEdit`,
+ visible: (objectData) => {
+ return objectData?._isEditing && objectData?._isEditing == true
+ }
+ },
+ {
+ name: 'cancelEdit',
+ label: 'Cancel Edits',
+ icon: XMarkIcon,
+ url: (_id) =>
+ `/dashboard/production/printers/info?printerId=${_id}&action=cancelEdit`,
+ visible: (objectData) => {
+ console.log(objectData?._isEditing)
+ return objectData?._isEditing && objectData?._isEditing == true
+ }
},
{ type: 'divider' },
{
@@ -98,12 +126,13 @@ export const Printer = {
label: 'Start Queue',
icon: PlayCircleIcon,
disabled: (objectData) => {
- console.log(objectData?.subJobs?.length)
+ console.log(objectData?.queue?.length)
return (
objectData?.state?.type == 'error' ||
objectData?.state?.type == 'printing' ||
- objectData?.subJobs?.length == 0 ||
- objectData?.subJobs?.length == undefined
+ objectData?.state?.type == 'paused' ||
+ objectData?.queue?.length == 0 ||
+ objectData?.queue?.length == undefined
)
},
url: (_id) =>
@@ -125,7 +154,7 @@ export const Printer = {
label: 'Resume Job',
icon: PlayCircleIcon,
disabled: (objectData) => {
- return objectData?.state?.type != 'printing'
+ return objectData?.state?.type != 'paused'
},
url: (_id) =>
`/dashboard/production/printers/control?printerId=${_id}&action=resumeJob`
@@ -137,7 +166,7 @@ export const Printer = {
disabled: (objectData) => {
return (
objectData?.state?.type != 'printing' &&
- objectData?.state?.type != 'error'
+ objectData?.state?.type != 'paused'
)
},
url: (_id) =>
@@ -149,20 +178,37 @@ export const Printer = {
name: 'filamentStock',
label: 'Filament Stock',
icon: FilamentStockIcon,
+ disabled: (objectData) => {
+ return objectData?.online == false
+ },
children: [
{
name: 'loadFilamentStock',
label: 'Load Filament Stock',
icon: FilamentStockIcon,
url: (_id) =>
- `/dashboard/production/printers/control?printerId=${_id}&action=loadFilamentStock`
+ `/dashboard/production/printers/control?printerId=${_id}&action=loadFilamentStock`,
+ disabled: (objectData) => {
+ return (
+ objectData?.state?.type == 'printing' ||
+ objectData?.state?.type == 'error' ||
+ objectData?.currentFilamentStock != null
+ )
+ }
},
{
name: 'unloadFilamentStock',
label: 'Unload Filament Stock',
icon: FilamentStockIcon,
url: (_id) =>
- `/dashboard/production/printers/control?printerId=${_id}&action=unloadFilamentStock`
+ `/dashboard/production/printers/control?printerId=${_id}&action=unloadFilamentStock`,
+ disabled: (objectData) => {
+ return (
+ objectData?.state?.type == 'printing' ||
+ objectData?.state?.type == 'error' ||
+ objectData?.currentFilamentStock == null
+ )
+ }
}
]
}
@@ -214,7 +260,8 @@ export const Printer = {
type: 'state',
objectType: 'printer',
showName: false,
- readOnly: true
+ readOnly: true,
+ columnWidth: 250
},
{
name: 'connectedAt',
@@ -354,7 +401,7 @@ export const Printer = {
required: false
},
{
- name: 'subJobs',
+ name: 'queue',
label: 'Queue',
type: 'objectList',
objectType: 'subJob',
diff --git a/src/database/models/Product.js b/src/database/models/Product.js
index 827f001..2aad532 100644
--- a/src/database/models/Product.js
+++ b/src/database/models/Product.js
@@ -2,6 +2,8 @@ import ProductIcon from '../../components/Icons/ProductIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
import ReloadIcon from '../../components/Icons/ReloadIcon'
import EditIcon from '../../components/Icons/EditIcon'
+import CheckIcon from '../../components/Icons/CheckIcon'
+import XMarkIcon from '../../components/Icons/XMarkIcon'
export const Product = {
name: 'product',
@@ -30,7 +32,31 @@ export const Product = {
row: true,
icon: EditIcon,
url: (_id) =>
- `/dashboard/management/products/info?productId=${_id}&action=edit`
+ `/dashboard/management/products/info?productId=${_id}&action=edit`,
+ visible: (objectData) => {
+ return !(objectData?._isEditing && objectData?._isEditing == true)
+ }
+ },
+ {
+ name: 'finishEdit',
+ label: 'Save Edits',
+ icon: CheckIcon,
+ url: (_id) =>
+ `/dashboard/management/products/info?productId=${_id}&action=finishEdit`,
+ visible: (objectData) => {
+ return objectData?._isEditing && objectData?._isEditing == true
+ }
+ },
+ {
+ name: 'cancelEdit',
+ label: 'Cancel Edits',
+ icon: XMarkIcon,
+ url: (_id) =>
+ `/dashboard/management/products/info?productId=${_id}&action=cancelEdit`,
+ visible: (objectData) => {
+ console.log(objectData?._isEditing)
+ return objectData?._isEditing && objectData?._isEditing == true
+ }
}
],
columns: [
@@ -129,6 +155,51 @@ export const Product = {
prefix: '£',
min: 0,
step: 0.1
+ },
+ {
+ name: 'parts',
+ label: 'Parts',
+ type: 'objectChildren',
+ objectType: 'part',
+ properties: [
+ {
+ name: 'part',
+ label: 'Part',
+ type: 'object',
+ objectType: 'part',
+ required: true
+ },
+ {
+ name: 'part._id',
+ label: 'Part ID',
+ type: 'id',
+ objectType: 'part',
+ showHyperlink: true,
+ value: (objectData) => {
+ return objectData?.part?._id
+ }
+ },
+ {
+ name: 'quantity',
+ label: 'Quantity',
+ type: 'number',
+ required: true
+ }
+ ],
+ rollups: [
+ {
+ name: 'totalQuantity',
+ label: 'Total',
+ type: 'number',
+ property: 'quantity',
+ value: (objectData) => {
+ return objectData?.parts?.reduce(
+ (acc, part) => acc + part.quantity,
+ 0
+ )
+ }
+ }
+ ]
}
]
}
diff --git a/src/database/models/PurchaseOrder.js b/src/database/models/PurchaseOrder.js
new file mode 100644
index 0000000..865d0ed
--- /dev/null
+++ b/src/database/models/PurchaseOrder.js
@@ -0,0 +1,180 @@
+import PurchaseOrderIcon from '../../components/Icons/PurchaseOrderIcon'
+import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
+
+export const PurchaseOrder = {
+ name: 'purchaseOrder',
+ label: 'Purchase Order',
+ prefix: 'POR',
+ icon: PurchaseOrderIcon,
+ actions: [
+ {
+ name: 'info',
+ label: 'Info',
+ default: true,
+ row: true,
+ icon: InfoCircleIcon,
+ url: (_id) =>
+ `/dashboard/inventory/purchaseorders/info?purchaseOrderId=${_id}`
+ }
+ ],
+ group: ['vendor'],
+ filters: ['vendor', 'vendor._id'],
+ sorters: ['createdAt', 'state', 'updatedAt'],
+ columns: ['_id', 'createdAt', 'state', 'updatedAt', 'vendor', 'vendor._id'],
+ properties: [
+ {
+ name: '_id',
+ label: 'ID',
+ type: 'id',
+ columnFixed: 'left',
+ objectType: 'purchaseOrder',
+ columnWidth: 140,
+ showCopy: true
+ },
+ {
+ name: 'createdAt',
+ label: 'Created At',
+ type: 'dateTime',
+ readOnly: true
+ },
+ { name: 'state', label: 'State', type: 'state', readOnly: true },
+ {
+ name: 'updatedAt',
+ label: 'Updated At',
+ type: 'dateTime',
+ readOnly: true
+ },
+ {
+ name: 'vendor',
+ label: 'Vendor',
+ required: true,
+ type: 'object',
+ objectType: 'vendor'
+ },
+ {
+ name: 'vendor._id',
+ label: 'Vendor ID',
+ readOnly: true,
+ type: 'id',
+ showHyperlink: true,
+ objectType: 'vendor'
+ },
+ {
+ name: 'courierService',
+ label: 'Courier Service',
+ required: true,
+ type: 'object',
+ objectType: 'courierService'
+ },
+ {
+ name: 'courierService._id',
+ label: 'Courier Service ID',
+ readOnly: true,
+ type: 'id',
+ showHyperlink: true,
+ objectType: 'courierService'
+ },
+ {
+ name: 'items',
+ label: 'Order Items',
+ type: 'objectChildren',
+ required: true,
+ properties: [
+ {
+ name: 'itemType',
+ label: 'Item Type',
+ type: 'objectType',
+ masterFilter: ['part', 'packaging'],
+ required: true
+ },
+ {
+ name: 'item',
+ label: 'Item',
+ type: 'object',
+ objectType: (objectData) => {
+ return objectData?.itemType
+ },
+ required: true
+ },
+ {
+ name: 'item._id',
+ label: 'Item ID',
+ type: 'id',
+ objectType: (objectData) => {
+ return objectData?.itemType
+ },
+ showHyperlink: true,
+ value: (objectData) => {
+ return objectData?.item?._id
+ }
+ },
+ {
+ name: 'quantity',
+ label: 'Quantity',
+ type: 'number',
+ required: true
+ },
+ {
+ name: 'price',
+ label: 'Price',
+ type: 'number',
+ required: true,
+ prefix: '£',
+ min: 0,
+ step: 0.01,
+ value: (objectData) => {
+ if (objectData?.price == undefined) {
+ console.log('PurchaseOrder.js', objectData)
+ return (
+ (objectData?.item?.cost || 0) * (objectData?.quantity || 0) ||
+ undefined
+ )
+ } else {
+ return objectData?.part?.price || undefined
+ }
+ }
+ }
+ ],
+ rollups: [
+ {
+ name: 'totalQuantity',
+ label: 'Total',
+ type: 'number',
+ property: 'quantity',
+ value: (objectData) => {
+ return objectData?.items?.reduce(
+ (acc, item) => acc + item.quantity,
+ 0
+ )
+ }
+ },
+ {
+ name: 'totalPrice',
+ label: 'Total',
+ type: 'number',
+ prefix: '£',
+ property: 'price',
+ value: (objectData) => {
+ return objectData?.items?.reduce((acc, item) => acc + item.price, 0)
+ }
+ }
+ ]
+ },
+ {
+ name: 'cost',
+ label: 'Cost',
+ type: 'netGross',
+ required: true,
+ prefix: '£',
+ min: 0,
+ step: 0.01,
+ value: (objectData) => {
+ const net = objectData?.items?.reduce(
+ (acc, item) => acc + item.price,
+ 0
+ )
+ return { net: net, gross: net }
+ }
+ }
+ ]
+}
diff --git a/src/database/models/StockAudit.js b/src/database/models/StockAudit.js
index 0c95b1b..3b2eb19 100644
--- a/src/database/models/StockAudit.js
+++ b/src/database/models/StockAudit.js
@@ -2,7 +2,7 @@ import StockAuditIcon from '../../components/Icons/StockAuditIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
export const StockAudit = {
- name: 'stockaudit',
+ name: 'stockAudit',
label: 'Stock Audit',
prefix: 'SAU',
icon: StockAuditIcon,
@@ -16,5 +16,38 @@ export const StockAudit = {
url: (_id) => `/dashboard/inventory/stockaudits/info?stockAuditId=${_id}`
}
],
- url: (id) => `/dashboard/inventory/stockaudits/info?stockAuditId=${id}`
+ url: (id) => `/dashboard/inventory/stockaudits/info?stockAuditId=${id}`,
+ columns: ['_id', 'state', 'createdAt', 'updatedAt'],
+ filters: ['_id'],
+ sorters: ['createdAt', 'updatedAt'],
+ group: ['state'],
+ properties: [
+ {
+ name: '_id',
+ label: 'ID',
+ type: 'id',
+ objectType: 'stockAudit',
+ showCopy: true,
+ readOnly: true
+ },
+ {
+ name: 'createdAt',
+ label: 'Created At',
+ type: 'dateTime',
+ readOnly: true
+ },
+ {
+ name: 'state',
+ label: 'State',
+ type: 'state',
+ readOnly: true,
+ columnWidth: 120
+ },
+ {
+ name: 'updatedAt',
+ label: 'Updated At',
+ type: 'dateTime',
+ readOnly: true
+ }
+ ]
}
diff --git a/src/database/models/SubJob.js b/src/database/models/SubJob.js
index 5364768..2f856a4 100644
--- a/src/database/models/SubJob.js
+++ b/src/database/models/SubJob.js
@@ -1,14 +1,37 @@
import SubJobIcon from '../../components/Icons/SubJobIcon'
+import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
+import XMarkIcon from '../../components/Icons/XMarkIcon'
export const SubJob = {
name: 'subJob',
label: 'Sub Job',
prefix: 'SJB',
icon: SubJobIcon,
- actions: [],
+ actions: [
+ {
+ name: 'info',
+ label: 'Info',
+ default: true,
+ row: true,
+ icon: InfoCircleIcon,
+ url: (_id) => `/dashboard/production/subjobs/info?subJobId=${_id}`
+ },
+ {
+ name: 'cancel',
+ label: 'Cancel Sub Job',
+ row: true,
+ icon: XMarkIcon,
+ url: (_id) =>
+ `/dashboard/production/subjobs/info?subJobId=${_id}&action=cancel`,
+ disabled: (objectData) => {
+ return objectData?.state?.type !== 'queued'
+ }
+ }
+ ],
columns: ['_id', 'printer', 'printer._id', 'job._id', 'state', 'createdAt'],
filters: ['state', '_id', 'job._id', 'printer._id'],
sorters: ['createdAt', 'state'],
+ group: ['job'],
properties: [
{
name: '_id',
@@ -19,6 +42,68 @@ export const SubJob = {
columnWidth: 140,
showCopy: true
},
+ {
+ name: 'createdAt',
+ label: 'Created At',
+ type: 'dateTime',
+ readOnly: true,
+ columnWidth: 175
+ },
+ {
+ name: 'state',
+ label: 'State',
+ type: 'state',
+ objectType: 'subJob',
+ showStatus: true,
+ showProgress: true,
+ showId: false,
+ showQuantity: false,
+ columnWidth: 250,
+ readOnly: true
+ },
+ {
+ name: 'updatedAt',
+ label: 'Updated At',
+ type: 'dateTime',
+ readOnly: true,
+ columnWidth: 175
+ },
+ {
+ name: 'job',
+ label: 'Job',
+ type: 'object',
+ objectType: 'job'
+ },
+ {
+ name: 'job._id',
+ label: 'Job ID',
+ type: 'id',
+ columnWidth: 140,
+ showHyperlink: true,
+ objectType: 'job'
+ },
+
+ {
+ name: 'startedAt',
+ label: 'Started At',
+ type: 'dateTime',
+ readOnly: true
+ },
+
+ {
+ name: 'moonrakerJobId',
+ label: 'Moonraker Job ID',
+ type: 'miscId',
+ columnWidth: 140,
+ showCopy: true
+ },
+
+ {
+ name: 'finishedAt',
+ label: 'Finished At',
+ type: 'dateTime',
+ readOnly: true
+ },
{
name: 'printer',
label: 'Printer',
@@ -34,33 +119,6 @@ export const SubJob = {
columnFixed: 'left',
showHyperlink: true,
objectType: 'printer'
- },
- {
- name: 'job._id',
- label: 'Job ID',
- type: 'id',
- columnWidth: 140,
- showHyperlink: true,
- objectType: 'job'
- },
- {
- name: 'state',
- label: 'State',
- type: 'state',
- objectType: 'subJob',
- showStatus: true,
- showProgress: true,
- showId: false,
- showQuantity: false,
- columnWidth: 125,
- readOnly: true
- },
- {
- name: 'createdAt',
- label: 'Created At',
- type: 'dateTime',
- readOnly: true,
- columnWidth: 175
}
]
}
diff --git a/src/database/models/Vendor.js b/src/database/models/Vendor.js
index cc9499e..ffef6a8 100644
--- a/src/database/models/Vendor.js
+++ b/src/database/models/Vendor.js
@@ -1,6 +1,8 @@
import VendorIcon from '../../components/Icons/VendorIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
import EditIcon from '../../components/Icons/EditIcon'
+import CheckIcon from '../../components/Icons/CheckIcon'
+import XMarkIcon from '../../components/Icons/XMarkIcon'
import ReloadIcon from '../../components/Icons/ReloadIcon'
import BinIcon from '../../components/Icons/BinIcon'
@@ -31,7 +33,31 @@ export const Vendor = {
row: true,
icon: EditIcon,
url: (_id) =>
- `/dashboard/management/vendors/info?vendorId=${_id}&action=edit`
+ `/dashboard/management/vendors/info?vendorId=${_id}&action=edit`,
+ visible: (objectData) => {
+ return !(objectData?._isEditing && objectData?._isEditing == true)
+ }
+ },
+ {
+ name: 'finishEdit',
+ label: 'Save Edits',
+ icon: CheckIcon,
+ url: (_id) =>
+ `/dashboard/management/vendors/info?vendorId=${_id}&action=finishEdit`,
+ visible: (objectData) => {
+ return objectData?._isEditing && objectData?._isEditing == true
+ }
+ },
+ {
+ name: 'cancelEdit',
+ label: 'Cancel Edits',
+ icon: XMarkIcon,
+ url: (_id) =>
+ `/dashboard/management/vendors/info?vendorId=${_id}&action=cancelEdit`,
+ visible: (objectData) => {
+ console.log(objectData?._isEditing)
+ return objectData?._isEditing && objectData?._isEditing == true
+ }
},
{ type: 'divider' },
{
@@ -43,7 +69,6 @@ export const Vendor = {
`/dashboard/management/vendors/info?vendorId=${_id}&action=delete`
}
],
- url: (id) => `/dashboard/management/vendors/info?vendorId=${id}`,
columns: ['name', '_id', 'country', 'email', 'website', 'createdAt'],
filters: ['name', '_id', 'country', 'email'],
sorters: ['name', 'country', 'email', 'createdAt', '_id'],
diff --git a/src/routes/InventoryRoutes.jsx b/src/routes/InventoryRoutes.jsx
index 7517557..c76ad5a 100644
--- a/src/routes/InventoryRoutes.jsx
+++ b/src/routes/InventoryRoutes.jsx
@@ -3,9 +3,12 @@ import { Route } from 'react-router-dom'
import FilamentStocks from '../components/Dashboard/Inventory/FilamentStocks.jsx'
import FilamentStockInfo from '../components/Dashboard/Inventory/FilamentStocks/FilamentStockInfo.jsx'
import PartStocks from '../components/Dashboard/Inventory/PartStocks.jsx'
+import PartStockInfo from '../components/Dashboard/Inventory/PartStocks/PartStockInfo.jsx'
import StockEvents from '../components/Dashboard/Inventory/StockEvents.jsx'
import StockAudits from '../components/Dashboard/Inventory/StockAudits.jsx'
import StockAuditInfo from '../components/Dashboard/Inventory/StockAudits/StockAuditInfo.jsx'
+import PurchaseOrders from '../components/Dashboard/Inventory/PurchaseOrders.jsx'
+import PurchaseOrderInfo from '../components/Dashboard/Inventory/PurchaseOrders/PurchaseOrderInfo.jsx'
const InventoryRoutes = [
}
/>,
+ }
+ />,
}
+ />,
+ }
+ />,
+ }
/>
]
diff --git a/src/routes/ManagementRoutes.jsx b/src/routes/ManagementRoutes.jsx
index e9504d9..5ceb824 100644
--- a/src/routes/ManagementRoutes.jsx
+++ b/src/routes/ManagementRoutes.jsx
@@ -9,6 +9,10 @@ import ProductInfo from '../components/Dashboard/Management/Products/ProductInfo
import Vendors from '../components/Dashboard/Management/Vendors'
import VendorInfo from '../components/Dashboard/Management/Vendors/VendorInfo'
import Materials from '../components/Dashboard/Management/Materials'
+import Couriers from '../components/Dashboard/Management/Couriers'
+import CourierInfo from '../components/Dashboard/Management/Couriers/CourierInfo.jsx'
+import CourierServices from '../components/Dashboard/Management/CourierServices'
+import CourierServiceInfo from '../components/Dashboard/Management/CourierServices/CourierServiceInfo.jsx'
import Settings from '../components/Dashboard/Management/Settings'
import AuditLogs from '../components/Dashboard/Management/AuditLogs.jsx'
import NoteTypes from '../components/Dashboard/Management/NoteTypes.jsx'
@@ -73,6 +77,22 @@ const ManagementRoutes = [
element={}
/>,
} />,
+ } />,
+ }
+ />,
+ }
+ />,
+ }
+ />,
} />,
,
} />,
} />,
+ }
+ />,
} />,
=6.0.0":
+"@codemirror/view@^6.0.0", "@codemirror/view@^6.17.0", "@codemirror/view@^6.23.0", "@codemirror/view@^6.27.0", "@codemirror/view@^6.35.0":
version "6.38.1"
resolved "https://registry.npmjs.org/@codemirror/view/-/view-6.38.1.tgz"
integrity sha512-RmTOkE7hRU3OVREqFVITWHz6ocgBjv08GoePscAakgVQfciA3SGCEk7mb9IzwW61cKKmlTpHXG6DUE5Ubx+MGQ==
@@ -993,24 +998,6 @@
ajv "^6.12.0"
ajv-keywords "^3.4.1"
-"@electron/asar@^3.2.1":
- version "3.4.1"
- resolved "https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz"
- integrity sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==
- dependencies:
- commander "^5.0.0"
- glob "^7.1.6"
- minimatch "^3.0.4"
-
-"@electron/asar@^3.2.7":
- version "3.4.1"
- resolved "https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz"
- integrity sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==
- dependencies:
- commander "^5.0.0"
- glob "^7.1.6"
- minimatch "^3.0.4"
-
"@electron/asar@3.2.18":
version "3.2.18"
resolved "https://registry.npmjs.org/@electron/asar/-/asar-3.2.18.tgz"
@@ -1020,6 +1007,15 @@
glob "^7.1.6"
minimatch "^3.0.4"
+"@electron/asar@^3.2.1", "@electron/asar@^3.2.7":
+ version "3.4.1"
+ resolved "https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz"
+ integrity sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==
+ dependencies:
+ commander "^5.0.0"
+ glob "^7.1.6"
+ minimatch "^3.0.4"
+
"@electron/fuses@^1.8.0":
version "1.8.0"
resolved "https://registry.npmjs.org/@electron/fuses/-/fuses-1.8.0.tgz"
@@ -1060,14 +1056,6 @@
tar "^6.2.1"
which "^2.0.2"
-"@electron/notarize@^1.2.3":
- version "1.2.4"
- resolved "https://registry.npmjs.org/@electron/notarize/-/notarize-1.2.4.tgz"
- integrity sha512-W5GQhJEosFNafewnS28d3bpQ37/s91CDWqxVchHfmv2dQSTWpOzNlUVQwYzC1ay5bChRV/A9BTL68yj0Pa+TSg==
- dependencies:
- debug "^4.1.1"
- fs-extra "^9.0.1"
-
"@electron/notarize@2.5.0":
version "2.5.0"
resolved "https://registry.npmjs.org/@electron/notarize/-/notarize-2.5.0.tgz"
@@ -1077,10 +1065,18 @@
fs-extra "^9.0.1"
promise-retry "^2.0.1"
-"@electron/osx-sign@^1.0.5":
- version "1.3.3"
- resolved "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.3.tgz"
- integrity sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg==
+"@electron/notarize@^1.2.3":
+ version "1.2.4"
+ resolved "https://registry.npmjs.org/@electron/notarize/-/notarize-1.2.4.tgz"
+ integrity sha512-W5GQhJEosFNafewnS28d3bpQ37/s91CDWqxVchHfmv2dQSTWpOzNlUVQwYzC1ay5bChRV/A9BTL68yj0Pa+TSg==
+ dependencies:
+ debug "^4.1.1"
+ fs-extra "^9.0.1"
+
+"@electron/osx-sign@1.3.1":
+ version "1.3.1"
+ resolved "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.1.tgz"
+ integrity sha512-BAfviURMHpmb1Yb50YbCxnOY0wfwaLXH5KJ4+80zS0gUkzDX3ec23naTlEqKsN+PwYn+a1cCzM7BJ4Wcd3sGzw==
dependencies:
compare-version "^0.1.2"
debug "^4.3.4"
@@ -1089,10 +1085,10 @@
minimist "^1.2.6"
plist "^3.0.5"
-"@electron/osx-sign@1.3.1":
- version "1.3.1"
- resolved "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.1.tgz"
- integrity sha512-BAfviURMHpmb1Yb50YbCxnOY0wfwaLXH5KJ4+80zS0gUkzDX3ec23naTlEqKsN+PwYn+a1cCzM7BJ4Wcd3sGzw==
+"@electron/osx-sign@^1.0.5":
+ version "1.3.3"
+ resolved "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.3.tgz"
+ integrity sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg==
dependencies:
compare-version "^0.1.2"
debug "^4.3.4"
@@ -1121,19 +1117,6 @@
tar "^6.0.5"
yargs "^17.0.1"
-"@electron/universal@^1.3.2":
- version "1.5.1"
- resolved "https://registry.npmjs.org/@electron/universal/-/universal-1.5.1.tgz"
- integrity sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw==
- dependencies:
- "@electron/asar" "^3.2.1"
- "@malept/cross-spawn-promise" "^1.1.0"
- debug "^4.3.1"
- dir-compare "^3.0.0"
- fs-extra "^9.0.1"
- minimatch "^3.0.4"
- plist "^3.0.4"
-
"@electron/universal@2.0.1":
version "2.0.1"
resolved "https://registry.npmjs.org/@electron/universal/-/universal-2.0.1.tgz"
@@ -1147,16 +1130,18 @@
minimatch "^9.0.3"
plist "^3.1.0"
-"@electron/windows-sign@^1.1.2":
- version "1.2.2"
- resolved "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.2.2.tgz"
- integrity sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ==
+"@electron/universal@^1.3.2":
+ version "1.5.1"
+ resolved "https://registry.npmjs.org/@electron/universal/-/universal-1.5.1.tgz"
+ integrity sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw==
dependencies:
- cross-dirname "^0.1.0"
- debug "^4.3.4"
- fs-extra "^11.1.1"
- minimist "^1.2.8"
- postject "^1.0.0-alpha.6"
+ "@electron/asar" "^3.2.1"
+ "@malept/cross-spawn-promise" "^1.1.0"
+ debug "^4.3.1"
+ dir-compare "^3.0.0"
+ fs-extra "^9.0.1"
+ minimatch "^3.0.4"
+ plist "^3.0.4"
"@emotion/babel-plugin@^11.13.5":
version "11.13.5"
@@ -1254,6 +1239,11 @@
resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz"
integrity sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==
+"@emotion/unitless@0.8.1":
+ version "0.8.1"
+ resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz"
+ integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==
+
"@emotion/unitless@^0.10.0":
version "0.10.0"
resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz"
@@ -1264,11 +1254,6 @@
resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz"
integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==
-"@emotion/unitless@0.8.1":
- version "0.8.1"
- resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz"
- integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==
-
"@emotion/use-insertion-effect-with-fallbacks@^1.2.0":
version "1.2.0"
resolved "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz"
@@ -1289,11 +1274,136 @@
resolved "https://registry.npmjs.org/@epic-web/invariant/-/invariant-1.0.0.tgz"
integrity sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==
+"@esbuild/aix-ppc64@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz"
+ integrity sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==
+
+"@esbuild/android-arm@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz"
+ integrity sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==
+
+"@esbuild/android-arm64@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz"
+ integrity sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==
+
+"@esbuild/android-x64@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz"
+ integrity sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==
+
"@esbuild/darwin-arm64@0.25.9":
version "0.25.9"
resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz"
integrity sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==
+"@esbuild/darwin-x64@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz"
+ integrity sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==
+
+"@esbuild/freebsd-arm64@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz"
+ integrity sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==
+
+"@esbuild/freebsd-x64@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz"
+ integrity sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==
+
+"@esbuild/linux-arm@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz"
+ integrity sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==
+
+"@esbuild/linux-arm64@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz"
+ integrity sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==
+
+"@esbuild/linux-ia32@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz"
+ integrity sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==
+
+"@esbuild/linux-loong64@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz"
+ integrity sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==
+
+"@esbuild/linux-mips64el@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz"
+ integrity sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==
+
+"@esbuild/linux-ppc64@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz"
+ integrity sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==
+
+"@esbuild/linux-riscv64@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz"
+ integrity sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==
+
+"@esbuild/linux-s390x@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz"
+ integrity sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==
+
+"@esbuild/linux-x64@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz"
+ integrity sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==
+
+"@esbuild/netbsd-arm64@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz"
+ integrity sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==
+
+"@esbuild/netbsd-x64@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz"
+ integrity sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==
+
+"@esbuild/openbsd-arm64@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz"
+ integrity sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==
+
+"@esbuild/openbsd-x64@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz"
+ integrity sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==
+
+"@esbuild/openharmony-arm64@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz"
+ integrity sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==
+
+"@esbuild/sunos-x64@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz"
+ integrity sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==
+
+"@esbuild/win32-arm64@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz"
+ integrity sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==
+
+"@esbuild/win32-ia32@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz"
+ integrity sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==
+
+"@esbuild/win32-x64@0.25.9":
+ version "0.25.9"
+ resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz"
+ integrity sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==
+
"@eslint-community/eslint-utils@^4.2.0":
version "4.7.0"
resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz"
@@ -1471,20 +1581,12 @@
resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz"
integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
-"@jridgewell/source-map@^0.3.3":
- version "0.3.11"
- resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz"
- integrity sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==
- dependencies:
- "@jridgewell/gen-mapping" "^0.3.5"
- "@jridgewell/trace-mapping" "^0.3.25"
-
"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0":
version "1.5.5"
resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz"
integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==
-"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.28":
+"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.28":
version "0.3.30"
resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz"
integrity sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==
@@ -1669,7 +1771,7 @@
"@nodelib/fs.stat" "2.0.5"
run-parallel "^1.1.9"
-"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5":
+"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
version "2.0.5"
resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
@@ -1904,7 +2006,7 @@
"@svgr/babel-plugin-transform-react-native-svg" "8.1.0"
"@svgr/babel-plugin-transform-svg-component" "8.0.0"
-"@svgr/core@*", "@svgr/core@^8.1.0":
+"@svgr/core@^8.1.0":
version "8.1.0"
resolved "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz"
integrity sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==
@@ -1978,7 +2080,7 @@
"@tsparticles/updater-out-modes" "3.9.1"
"@tsparticles/updater-size" "3.9.1"
-"@tsparticles/engine@^3.0.2", "@tsparticles/engine@3.9.1":
+"@tsparticles/engine@3.9.1":
version "3.9.1"
resolved "https://registry.npmjs.org/@tsparticles/engine/-/engine-3.9.1.tgz"
integrity sha512-DpdgAhWMZ3Eh2gyxik8FXS6BKZ8vyea+Eu5BC4epsahqTGY9V3JGGJcXC6lRJx6cPMAx1A0FaQAojPF3v6rkmQ==
@@ -2214,7 +2316,7 @@
dependencies:
"@tsparticles/engine" "3.9.1"
-"@tsparticles/slim@^3.9.1", "@tsparticles/slim@3.9.1":
+"@tsparticles/slim@3.9.1", "@tsparticles/slim@^3.9.1":
version "3.9.1"
resolved "https://registry.npmjs.org/@tsparticles/slim/-/slim-3.9.1.tgz"
integrity sha512-CL5cDmADU7sDjRli0So+hY61VMbdroqbArmR9Av+c1Fisa5ytr6QD7Jv62iwU2S6rvgicEe9OyRmSy5GIefwZw==
@@ -2485,15 +2587,7 @@
dependencies:
"@types/ms" "*"
-"@types/eslint-scope@^3.7.7":
- version "3.7.7"
- resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz"
- integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==
- dependencies:
- "@types/eslint" "*"
- "@types/estree" "*"
-
-"@types/eslint@*", "@types/eslint@^8.4.5", "@types/eslint@>=8.0.0":
+"@types/eslint@^8.4.5":
version "8.56.12"
resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz"
integrity sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==
@@ -2508,12 +2602,12 @@
dependencies:
"@types/estree" "*"
-"@types/estree@*", "@types/estree@^1.0.0", "@types/estree@^1.0.6", "@types/estree@^1.0.8", "@types/estree@1.0.8":
+"@types/estree@*", "@types/estree@1.0.8", "@types/estree@^1.0.0", "@types/estree@^1.0.6":
version "1.0.8"
resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz"
integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==
-"@types/fs-extra@^9.0.11", "@types/fs-extra@9.0.13":
+"@types/fs-extra@9.0.13", "@types/fs-extra@^9.0.11":
version "9.0.13"
resolved "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz"
integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==
@@ -2537,7 +2631,7 @@
resolved "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz"
integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==
-"@types/json-schema@*", "@types/json-schema@^7.0.15", "@types/json-schema@^7.0.9":
+"@types/json-schema@*", "@types/json-schema@^7.0.15":
version "7.0.15"
resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz"
integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==
@@ -2566,7 +2660,7 @@
resolved "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz"
integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==
-"@types/node@*", "@types/node@^20.19.0 || >=22.12.0":
+"@types/node@*":
version "24.3.0"
resolved "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz"
integrity sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==
@@ -2593,13 +2687,6 @@
"@types/node" "*"
xmlbuilder ">=11.0.1"
-"@types/react@>=18":
- version "19.1.12"
- resolved "https://registry.npmjs.org/@types/react/-/react-19.1.12.tgz"
- integrity sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w==
- dependencies:
- csstype "^3.0.2"
-
"@types/responselike@^1.0.0":
version "1.0.3"
resolved "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz"
@@ -2722,152 +2809,16 @@
"@types/babel__core" "^7.20.5"
react-refresh "^0.17.0"
-"@webassemblyjs/ast@^1.14.1", "@webassemblyjs/ast@1.14.1":
- version "1.14.1"
- resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz"
- integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==
- dependencies:
- "@webassemblyjs/helper-numbers" "1.13.2"
- "@webassemblyjs/helper-wasm-bytecode" "1.13.2"
-
-"@webassemblyjs/floating-point-hex-parser@1.13.2":
- version "1.13.2"
- resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz"
- integrity sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==
-
-"@webassemblyjs/helper-api-error@1.13.2":
- version "1.13.2"
- resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz"
- integrity sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==
-
-"@webassemblyjs/helper-buffer@1.14.1":
- version "1.14.1"
- resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz"
- integrity sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==
-
-"@webassemblyjs/helper-numbers@1.13.2":
- version "1.13.2"
- resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz"
- integrity sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==
- dependencies:
- "@webassemblyjs/floating-point-hex-parser" "1.13.2"
- "@webassemblyjs/helper-api-error" "1.13.2"
- "@xtuc/long" "4.2.2"
-
-"@webassemblyjs/helper-wasm-bytecode@1.13.2":
- version "1.13.2"
- resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz"
- integrity sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==
-
-"@webassemblyjs/helper-wasm-section@1.14.1":
- version "1.14.1"
- resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz"
- integrity sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==
- dependencies:
- "@webassemblyjs/ast" "1.14.1"
- "@webassemblyjs/helper-buffer" "1.14.1"
- "@webassemblyjs/helper-wasm-bytecode" "1.13.2"
- "@webassemblyjs/wasm-gen" "1.14.1"
-
-"@webassemblyjs/ieee754@1.13.2":
- version "1.13.2"
- resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz"
- integrity sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==
- dependencies:
- "@xtuc/ieee754" "^1.2.0"
-
-"@webassemblyjs/leb128@1.13.2":
- version "1.13.2"
- resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz"
- integrity sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==
- dependencies:
- "@xtuc/long" "4.2.2"
-
-"@webassemblyjs/utf8@1.13.2":
- version "1.13.2"
- resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz"
- integrity sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==
-
-"@webassemblyjs/wasm-edit@^1.14.1":
- version "1.14.1"
- resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz"
- integrity sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==
- dependencies:
- "@webassemblyjs/ast" "1.14.1"
- "@webassemblyjs/helper-buffer" "1.14.1"
- "@webassemblyjs/helper-wasm-bytecode" "1.13.2"
- "@webassemblyjs/helper-wasm-section" "1.14.1"
- "@webassemblyjs/wasm-gen" "1.14.1"
- "@webassemblyjs/wasm-opt" "1.14.1"
- "@webassemblyjs/wasm-parser" "1.14.1"
- "@webassemblyjs/wast-printer" "1.14.1"
-
-"@webassemblyjs/wasm-gen@1.14.1":
- version "1.14.1"
- resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz"
- integrity sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==
- dependencies:
- "@webassemblyjs/ast" "1.14.1"
- "@webassemblyjs/helper-wasm-bytecode" "1.13.2"
- "@webassemblyjs/ieee754" "1.13.2"
- "@webassemblyjs/leb128" "1.13.2"
- "@webassemblyjs/utf8" "1.13.2"
-
-"@webassemblyjs/wasm-opt@1.14.1":
- version "1.14.1"
- resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz"
- integrity sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==
- dependencies:
- "@webassemblyjs/ast" "1.14.1"
- "@webassemblyjs/helper-buffer" "1.14.1"
- "@webassemblyjs/wasm-gen" "1.14.1"
- "@webassemblyjs/wasm-parser" "1.14.1"
-
-"@webassemblyjs/wasm-parser@^1.14.1", "@webassemblyjs/wasm-parser@1.14.1":
- version "1.14.1"
- resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz"
- integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==
- dependencies:
- "@webassemblyjs/ast" "1.14.1"
- "@webassemblyjs/helper-api-error" "1.13.2"
- "@webassemblyjs/helper-wasm-bytecode" "1.13.2"
- "@webassemblyjs/ieee754" "1.13.2"
- "@webassemblyjs/leb128" "1.13.2"
- "@webassemblyjs/utf8" "1.13.2"
-
-"@webassemblyjs/wast-printer@1.14.1":
- version "1.14.1"
- resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz"
- integrity sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==
- dependencies:
- "@webassemblyjs/ast" "1.14.1"
- "@xtuc/long" "4.2.2"
-
"@xmldom/xmldom@^0.8.8":
version "0.8.11"
resolved "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz"
integrity sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==
-"@xtuc/ieee754@^1.2.0":
- version "1.2.0"
- resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz"
- integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==
-
-"@xtuc/long@4.2.2":
- version "4.2.2"
- resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz"
- integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
-
"@zeit/schemas@2.36.0":
version "2.36.0"
resolved "https://registry.npmjs.org/@zeit/schemas/-/schemas-2.36.0.tgz"
integrity sha512-7kjMwcChYEzMKjeex9ZFXkt1AyNov9R5HZtjBKVsmVpw7pa7ZtlCGvCBC2vnnXctaYN+aRI61HjIqeetZW5ROg==
-"7zip-bin@~5.2.0":
- version "5.2.0"
- resolved "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz"
- integrity sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==
-
abbrev@^1.0.0:
version "1.1.1"
resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz"
@@ -2889,34 +2840,24 @@ accepts@~1.3.5:
mime-types "~2.1.34"
negotiator "0.6.3"
-acorn-import-phases@^1.0.3:
- version "1.0.4"
- resolved "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz"
- integrity sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==
-
acorn-jsx@^5.3.2:
version "5.3.2"
resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz"
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
-"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.14.0, acorn@^8.15.0, acorn@^8.9.0:
+acorn@^8.15.0, acorn@^8.9.0:
version "8.15.0"
resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz"
integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==
-agent-base@^6.0.2, agent-base@6:
+agent-base@6, agent-base@^6.0.2:
version "6.0.2"
resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz"
integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
dependencies:
debug "4"
-agent-base@^7.1.0:
- version "7.1.4"
- resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz"
- integrity sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==
-
-agent-base@^7.1.2:
+agent-base@^7.1.0, agent-base@^7.1.2:
version "7.1.4"
resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz"
integrity sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==
@@ -2936,55 +2877,11 @@ aggregate-error@^3.0.0:
clean-stack "^2.0.0"
indent-string "^4.0.0"
-ajv-formats@^2.1.1:
- version "2.1.1"
- resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz"
- integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==
- dependencies:
- ajv "^8.0.0"
-
ajv-keywords@^3.4.1:
version "3.5.2"
resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz"
integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
-ajv-keywords@^5.1.0:
- version "5.1.0"
- resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz"
- integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==
- dependencies:
- fast-deep-equal "^3.1.3"
-
-ajv@^6.10.0, ajv@^6.12.0, ajv@^6.12.4, ajv@^6.9.1:
- version "6.12.6"
- resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz"
- integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
- dependencies:
- fast-deep-equal "^3.1.1"
- fast-json-stable-stringify "^2.0.0"
- json-schema-traverse "^0.4.1"
- uri-js "^4.2.2"
-
-ajv@^8.0.0:
- version "8.17.1"
- resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz"
- integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==
- dependencies:
- fast-deep-equal "^3.1.3"
- fast-uri "^3.0.1"
- json-schema-traverse "^1.0.0"
- require-from-string "^2.0.2"
-
-ajv@^8.8.2, ajv@^8.9.0:
- version "8.17.1"
- resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz"
- integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==
- dependencies:
- fast-deep-equal "^3.1.3"
- fast-uri "^3.0.1"
- json-schema-traverse "^1.0.0"
- require-from-string "^2.0.2"
-
ajv@8.12.0:
version "8.12.0"
resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz"
@@ -2995,6 +2892,16 @@ ajv@8.12.0:
require-from-string "^2.0.2"
uri-js "^4.2.2"
+ajv@^6.10.0, ajv@^6.12.0, ajv@^6.12.4:
+ version "6.12.6"
+ resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz"
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
ansi-align@^3.0.1:
version "3.0.1"
resolved "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz"
@@ -3053,7 +2960,7 @@ antd-style@^3.7.1:
"@emotion/utils" "^1.2.1"
use-merge-value "^1.2.0"
-antd@^5.27.1, antd@>=5.8.1:
+antd@^5.27.1:
version "5.27.1"
resolved "https://registry.npmjs.org/antd/-/antd-5.27.1.tgz"
integrity sha512-jGMSdBN7hAMvPV27B4RhzZfL6n6yu8yDbo7oXrlJasaOqB7bSDPcjdEy1kXy3JPsny/Qazb1ykzRI4EfcByAPQ==
@@ -3343,11 +3250,6 @@ base64-js@^1.3.1, base64-js@^1.5.1:
resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz"
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
-big.js@^5.2.2:
- version "5.2.2"
- resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz"
- integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
-
bl@^4.1.0:
version "4.1.0"
resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz"
@@ -3423,7 +3325,7 @@ braces@^3.0.3:
dependencies:
fill-range "^7.1.1"
-browserslist@^4.24.0, "browserslist@>= 4.21.0":
+browserslist@^4.24.0:
version "4.25.3"
resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.25.3.tgz"
integrity sha512-cDGv1kkDI4/0e5yON9yM5G/0A5u8sf5TnmdX5C9qHzI9PPu++sQ9zjm1k9NiOrf3riY4OkK0zSGqfvJyJsgCBQ==
@@ -3474,8 +3376,8 @@ builder-util@26.0.11:
resolved "https://registry.npmjs.org/builder-util/-/builder-util-26.0.11.tgz"
integrity sha512-xNjXfsldUEe153h1DraD0XvDOpqGR0L5eKFkdReB7eFW5HqysDZFfly4rckda6y9dF39N3pkPlOblcfHKGw+uA==
dependencies:
- "@types/debug" "^4.1.6"
"7zip-bin" "~5.2.0"
+ "@types/debug" "^4.1.6"
app-builder-bin "5.0.0-alpha.12"
builder-util-runtime "9.3.1"
chalk "^4.1.2"
@@ -3499,17 +3401,12 @@ builtins@^5.0.1:
dependencies:
semver "^7.0.0"
-bytes@^3.1.2:
- version "3.1.2"
- resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz"
- integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==
-
bytes@3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz"
integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==
-bytes@3.1.2:
+bytes@3.1.2, bytes@^3.1.2:
version "3.1.2"
resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz"
integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==
@@ -3619,6 +3516,19 @@ chalk-template@0.4.0:
dependencies:
chalk "^4.1.2"
+chalk@4.1.2, chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz"
+ integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+chalk@5.0.1:
+ version "5.0.1"
+ resolved "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz"
+ integrity sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==
+
chalk@^1.1.3:
version "1.1.3"
resolved "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz"
@@ -3630,24 +3540,11 @@ chalk@^1.1.3:
strip-ansi "^3.0.0"
supports-color "^2.0.0"
-chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2, chalk@4.1.2:
- version "4.1.2"
- resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz"
- integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
- dependencies:
- ansi-styles "^4.1.0"
- supports-color "^7.1.0"
-
chalk@^5.0.1:
version "5.6.0"
resolved "https://registry.npmjs.org/chalk/-/chalk-5.6.0.tgz"
integrity sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==
-chalk@5.0.1:
- version "5.0.1"
- resolved "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz"
- integrity sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==
-
character-entities-html4@^2.0.0:
version "2.1.0"
resolved "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz"
@@ -3673,11 +3570,6 @@ chownr@^2.0.0:
resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz"
integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==
-chrome-trace-event@^1.0.2:
- version "1.0.4"
- resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz"
- integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==
-
chromium-pickle-js@^0.2.0:
version "0.2.0"
resolved "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz"
@@ -3688,7 +3580,7 @@ ci-info@^3.2.0:
resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz"
integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==
-classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6, classnames@^2.3.1, classnames@^2.3.2, classnames@^2.5.1, classnames@2.x:
+classnames@2.x, classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6, classnames@^2.3.1, classnames@^2.3.2, classnames@^2.5.1:
version "2.5.1"
resolved "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz"
integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==
@@ -3803,31 +3695,21 @@ comma-separated-tokens@^2.0.0:
resolved "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz"
integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==
+commander@7, commander@^7.2.0:
+ version "7.2.0"
+ resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz"
+ integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
+
commander@^11.1.0:
version "11.1.0"
resolved "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz"
integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==
-commander@^2.20.0:
- version "2.20.3"
- resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz"
- integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
-
commander@^5.0.0:
version "5.1.0"
resolved "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz"
integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==
-commander@^7.2.0, commander@7:
- version "7.2.0"
- resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz"
- integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
-
-commander@^9.4.0:
- version "9.5.0"
- resolved "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz"
- integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==
-
common-tags@^1.8.2:
version "1.8.2"
resolved "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz"
@@ -3888,6 +3770,11 @@ config-file-ts@0.2.8-rc1:
glob "^10.3.12"
typescript "^5.4.3"
+content-disposition@0.5.2:
+ version "0.5.2"
+ resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz"
+ integrity sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==
+
content-disposition@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz"
@@ -3895,11 +3782,6 @@ content-disposition@^1.0.0:
dependencies:
safe-buffer "5.2.1"
-content-disposition@0.5.2:
- version "0.5.2"
- resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz"
- integrity sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==
-
content-type@^1.0.5:
version "1.0.5"
resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz"
@@ -3985,11 +3867,6 @@ crelt@^1.0.5, crelt@^1.0.6:
resolved "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz"
integrity sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==
-cross-dirname@^0.1.0:
- version "0.1.0"
- resolved "https://registry.npmjs.org/cross-dirname/-/cross-dirname-0.1.0.tgz"
- integrity sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==
-
cross-env@^10.0.0:
version "10.0.0"
resolved "https://registry.npmjs.org/cross-env/-/cross-env-10.0.0.tgz"
@@ -4082,12 +3959,12 @@ csso@^5.0.5:
dependencies:
css-tree "~2.2.0"
-csstype@^3.0.2, csstype@^3.0.8, csstype@^3.1.3, csstype@3.1.3:
+csstype@3.1.3, csstype@^3.0.2, csstype@^3.0.8, csstype@^3.1.3:
version "3.1.3"
resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz"
integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
-d3-array@^3.2.4, "d3-array@1 - 3", "d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3":
+"d3-array@1 - 3", "d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@^3.2.4:
version "3.2.4"
resolved "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz"
integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==
@@ -4099,17 +3976,17 @@ d3-binarytree@1:
resolved "https://registry.npmjs.org/d3-binarytree/-/d3-binarytree-1.0.2.tgz"
integrity sha512-cElUNH+sHu95L04m92pG73t2MEJXKu+GeKUN1TJkFsu93E5W8E9Sc3kHEGJKgenGvj19m6upSn2EunvMgMD2Yw==
-d3-color@^3.1.0, "d3-color@1 - 3":
+"d3-color@1 - 3", d3-color@^3.1.0:
version "3.1.0"
resolved "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz"
integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==
-d3-dispatch@^3.0.1, "d3-dispatch@1 - 3":
+"d3-dispatch@1 - 3", d3-dispatch@^3.0.1:
version "3.0.1"
resolved "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz"
integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==
-d3-dsv@^3.0.1, "d3-dsv@1 - 3":
+"d3-dsv@1 - 3", d3-dsv@^3.0.1:
version "3.0.1"
resolved "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz"
integrity sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==
@@ -4150,7 +4027,7 @@ d3-force@^3.0.0:
d3-quadtree "1 - 3"
d3-timer "1 - 3"
-d3-format@^3.1.0, "d3-format@1 - 3":
+"d3-format@1 - 3", d3-format@^3.1.0:
version "3.1.0"
resolved "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz"
integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==
@@ -4164,7 +4041,7 @@ d3-geo-projection@^4.0.0:
d3-array "1 - 3"
d3-geo "1.12.0 - 3"
-d3-geo@^3.1.1, "d3-geo@1.12.0 - 3":
+"d3-geo@1.12.0 - 3", d3-geo@^3.1.1:
version "3.1.1"
resolved "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz"
integrity sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==
@@ -4176,14 +4053,14 @@ d3-hierarchy@^3.1.2:
resolved "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz"
integrity sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==
-d3-interpolate@^3.0.1, "d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3":
+"d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@^3.0.1:
version "3.0.1"
resolved "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz"
integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==
dependencies:
d3-color "1 - 3"
-d3-octree@^1.0.2, d3-octree@1:
+d3-octree@1, d3-octree@^1.0.2:
version "1.1.0"
resolved "https://registry.npmjs.org/d3-octree/-/d3-octree-1.1.0.tgz"
integrity sha512-F8gPlqpP+HwRPMO/8uOu5wjH110+6q4cgJvgJT6vlpy3BEaDIKlTZrgHKZSp/i1InRpVfh4puY/kvL6MxK930A==
@@ -4193,7 +4070,7 @@ d3-path@^3.1.0:
resolved "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz"
integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==
-d3-quadtree@^3.0.1, "d3-quadtree@1 - 3":
+"d3-quadtree@1 - 3", d3-quadtree@^3.0.1:
version "3.0.1"
resolved "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz"
integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==
@@ -4241,14 +4118,14 @@ d3-shape@^3.2.0:
dependencies:
d3-time "1 - 3"
-d3-time@^3.1.0, "d3-time@1 - 3", "d3-time@2.1.1 - 3":
+"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@^3.1.0:
version "3.1.0"
resolved "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz"
integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==
dependencies:
d3-array "2 - 3"
-d3-timer@^3.0.1, "d3-timer@1 - 3":
+"d3-timer@1 - 3", d3-timer@^3.0.1:
version "3.0.1"
resolved "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz"
integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==
@@ -4288,7 +4165,7 @@ data-view-byte-offset@^1.0.1:
es-errors "^1.3.0"
is-data-view "^1.0.1"
-dayjs@^1.11.11, "dayjs@>= 1.x":
+dayjs@^1.11.11:
version "1.11.13"
resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz"
integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==
@@ -4298,13 +4175,20 @@ dayjs@^1.11.18:
resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.18.tgz"
integrity sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==
-debug@^2.2.0:
+debug@2.6.9, debug@^2.2.0:
version "2.6.9"
resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
dependencies:
ms "2.0.0"
+debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5, debug@^4.4.0:
+ version "4.4.1"
+ resolved "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz"
+ integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==
+ dependencies:
+ ms "^2.1.3"
+
debug@^3.2.7:
version "3.2.7"
resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz"
@@ -4312,34 +4196,13 @@ debug@^3.2.7:
dependencies:
ms "^2.1.1"
-debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5, debug@^4.4.0, debug@4:
- version "4.4.1"
- resolved "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz"
- integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==
- dependencies:
- ms "^2.1.3"
-
-debug@~4.3.1:
+debug@~4.3.1, debug@~4.3.2:
version "4.3.7"
resolved "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz"
integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==
dependencies:
ms "^2.1.3"
-debug@~4.3.2:
- version "4.3.7"
- resolved "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz"
- integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==
- dependencies:
- ms "^2.1.3"
-
-debug@2.6.9:
- version "2.6.9"
- resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
- integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
- dependencies:
- ms "2.0.0"
-
decode-named-character-reference@^1.0.0:
version "1.2.0"
resolved "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz"
@@ -4399,7 +4262,7 @@ delayed-stream@~1.0.0:
resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz"
integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
-depd@^2.0.0, depd@2.0.0:
+depd@2.0.0, depd@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz"
integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
@@ -4577,15 +4440,6 @@ ejs@^3.1.8:
dependencies:
jake "^10.8.5"
-electron-builder-squirrel-windows@26.0.12:
- version "26.0.12"
- resolved "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-26.0.12.tgz"
- integrity sha512-kpwXM7c/ayRUbYVErQbsZ0nQZX4aLHQrPEG9C4h9vuJCXylwFH8a7Jgi2VpKIObzCXO7LKHiCw4KdioFLFOgqA==
- dependencies:
- app-builder-lib "26.0.12"
- builder-util "26.0.11"
- electron-winstaller "5.4.0"
-
electron-builder@^26.0.12:
version "26.0.12"
resolved "https://registry.npmjs.org/electron-builder/-/electron-builder-26.0.12.tgz"
@@ -4646,19 +4500,6 @@ electron-to-chromium@^1.5.204:
resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.208.tgz"
integrity sha512-ozZyibehoe7tOhNaf16lKmljVf+3npZcJIEbJRVftVsmAg5TeA1mGS9dVCZzOwr2xT7xK15V0p7+GZqSPgkuPg==
-electron-winstaller@5.4.0:
- version "5.4.0"
- resolved "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-5.4.0.tgz"
- integrity sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==
- dependencies:
- "@electron/asar" "^3.2.1"
- debug "^4.1.1"
- fs-extra "^7.0.1"
- lodash "^4.17.21"
- temp "^0.9.0"
- optionalDependencies:
- "@electron/windows-sign" "^1.1.2"
-
electron@^38.7.1:
version "38.7.2"
resolved "https://registry.npmjs.org/electron/-/electron-38.7.2.tgz"
@@ -4678,11 +4519,6 @@ emoji-regex@^9.2.2:
resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz"
integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
-emojis-list@^3.0.0:
- version "3.0.0"
- resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz"
- integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==
-
encodeurl@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz"
@@ -4718,14 +4554,6 @@ engine.io-parser@~5.2.1:
resolved "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz"
integrity sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==
-enhanced-resolve@^5.17.3:
- version "5.18.3"
- resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz"
- integrity sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==
- dependencies:
- graceful-fs "^4.2.4"
- tapable "^2.2.0"
-
entities@^4.2.0, entities@^4.4.0:
version "4.5.0"
resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz"
@@ -4840,11 +4668,6 @@ es-iterator-helpers@^1.2.1:
iterator.prototype "^1.1.4"
safe-array-concat "^1.1.3"
-es-module-lexer@^1.2.1:
- version "1.7.0"
- resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz"
- integrity sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==
-
es-object-atoms@^1.0.0, es-object-atoms@^1.1.1:
version "1.1.1"
resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz"
@@ -4940,7 +4763,7 @@ escape-string-regexp@^5.0.0:
resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz"
integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==
-eslint-config-prettier@^10.1.8, "eslint-config-prettier@>= 7.0.0 <10.0.0 || >=10.1.0":
+eslint-config-prettier@^10.1.8:
version "10.1.8"
resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz"
integrity sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==
@@ -4979,7 +4802,7 @@ eslint-plugin-es@^4.1.0:
eslint-utils "^2.0.0"
regexpp "^3.0.0"
-eslint-plugin-import@^2.25.2, eslint-plugin-import@^2.27.5:
+eslint-plugin-import@^2.27.5:
version "2.32.0"
resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz"
integrity sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==
@@ -5004,7 +4827,7 @@ eslint-plugin-import@^2.25.2, eslint-plugin-import@^2.27.5:
string.prototype.trimend "^1.0.9"
tsconfig-paths "^3.15.0"
-"eslint-plugin-n@^15.0.0 || ^16.0.0 ", eslint-plugin-n@^15.7.0:
+eslint-plugin-n@^15.7.0:
version "15.7.0"
resolved "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz"
integrity sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==
@@ -5026,7 +4849,7 @@ eslint-plugin-prettier@^5.5.4:
prettier-linter-helpers "^1.0.0"
synckit "^0.11.7"
-eslint-plugin-promise@^6.0.0, eslint-plugin-promise@^6.1.1:
+eslint-plugin-promise@^6.1.1:
version "6.6.0"
resolved "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz"
integrity sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==
@@ -5041,7 +4864,7 @@ eslint-plugin-react-refresh@^0.4.20:
resolved "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.20.tgz"
integrity sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==
-eslint-plugin-react@^7.28.0, eslint-plugin-react@^7.36.1, eslint-plugin-react@^7.37.5:
+eslint-plugin-react@^7.36.1, eslint-plugin-react@^7.37.5:
version "7.37.5"
resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz"
integrity sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==
@@ -5081,14 +4904,6 @@ eslint-scope@^8.4.0:
esrecurse "^4.3.0"
estraverse "^5.2.0"
-eslint-scope@5.1.1:
- version "5.1.1"
- resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz"
- integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
- dependencies:
- esrecurse "^4.3.0"
- estraverse "^4.1.1"
-
eslint-utils@^2.0.0:
version "2.1.0"
resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz"
@@ -5123,7 +4938,7 @@ eslint-visitor-keys@^4.2.1:
resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz"
integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==
-"eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9", "eslint@^7.0.0 || ^8.0.0 || ^9.0.0", eslint@^8.0.1, eslint@^8.41.0, eslint@^8.8.0, eslint@>=4.19.1, eslint@>=5:
+eslint@^8.41.0, eslint@^8.57.1:
version "8.57.1"
resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz"
integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==
@@ -5167,7 +4982,7 @@ eslint-visitor-keys@^4.2.1:
strip-ansi "^6.0.1"
text-table "^0.2.0"
-"eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", eslint@^9.34.0, eslint@>=7, eslint@>=7.0.0, eslint@>=8.0.0, eslint@>=8.40:
+eslint@^9.34.0:
version "9.34.0"
resolved "https://registry.npmjs.org/eslint/-/eslint-9.34.0.tgz"
integrity sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==
@@ -5208,60 +5023,7 @@ eslint-visitor-keys@^4.2.1:
natural-compare "^1.4.0"
optionator "^0.9.3"
-"eslint@^7.0.0 || ^8.0.0", eslint@^8.57.1, eslint@>=6.0.0:
- version "8.57.1"
- resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz"
- integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==
- dependencies:
- "@eslint-community/eslint-utils" "^4.2.0"
- "@eslint-community/regexpp" "^4.6.1"
- "@eslint/eslintrc" "^2.1.4"
- "@eslint/js" "8.57.1"
- "@humanwhocodes/config-array" "^0.13.0"
- "@humanwhocodes/module-importer" "^1.0.1"
- "@nodelib/fs.walk" "^1.2.8"
- "@ungap/structured-clone" "^1.2.0"
- ajv "^6.12.4"
- chalk "^4.0.0"
- cross-spawn "^7.0.2"
- debug "^4.3.2"
- doctrine "^3.0.0"
- escape-string-regexp "^4.0.0"
- eslint-scope "^7.2.2"
- eslint-visitor-keys "^3.4.3"
- espree "^9.6.1"
- esquery "^1.4.2"
- esutils "^2.0.2"
- fast-deep-equal "^3.1.3"
- file-entry-cache "^6.0.1"
- find-up "^5.0.0"
- glob-parent "^6.0.2"
- globals "^13.19.0"
- graphemer "^1.4.0"
- ignore "^5.2.0"
- imurmurhash "^0.1.4"
- is-glob "^4.0.0"
- is-path-inside "^3.0.3"
- js-yaml "^4.1.0"
- json-stable-stringify-without-jsonify "^1.0.1"
- levn "^0.4.1"
- lodash.merge "^4.6.2"
- minimatch "^3.1.2"
- natural-compare "^1.4.0"
- optionator "^0.9.3"
- strip-ansi "^6.0.1"
- text-table "^0.2.0"
-
-espree@^10.0.1:
- version "10.4.0"
- resolved "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz"
- integrity sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==
- dependencies:
- acorn "^8.15.0"
- acorn-jsx "^5.3.2"
- eslint-visitor-keys "^4.2.1"
-
-espree@^10.4.0:
+espree@^10.0.1, espree@^10.4.0:
version "10.4.0"
resolved "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz"
integrity sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==
@@ -5293,11 +5055,6 @@ esrecurse@^4.3.0:
dependencies:
estraverse "^5.2.0"
-estraverse@^4.1.1:
- version "4.3.0"
- resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz"
- integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
-
estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0:
version "5.3.0"
resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz"
@@ -5328,11 +5085,6 @@ eventemitter3@^5.0.1:
resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz"
integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==
-events@^3.2.0:
- version "3.3.0"
- resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz"
- integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
-
execa@^5.1.1:
version "5.1.1"
resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz"
@@ -5438,11 +5190,6 @@ fast-levenshtein@^2.0.6:
resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz"
integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
-fast-uri@^3.0.1:
- version "3.1.0"
- resolved "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz"
- integrity sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==
-
fastq@^1.6.0:
version "1.19.1"
resolved "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz"
@@ -5638,7 +5385,7 @@ fs-extra@^10.0.0, fs-extra@^10.1.0:
jsonfile "^6.0.1"
universalify "^2.0.0"
-fs-extra@^11.1.0:
+fs-extra@^11.1.0, fs-extra@^11.1.1:
version "11.3.1"
resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.1.tgz"
integrity sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==
@@ -5647,24 +5394,6 @@ fs-extra@^11.1.0:
jsonfile "^6.0.1"
universalify "^2.0.0"
-fs-extra@^11.1.1:
- version "11.3.1"
- resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.1.tgz"
- integrity sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==
- dependencies:
- graceful-fs "^4.2.0"
- jsonfile "^6.0.1"
- universalify "^2.0.0"
-
-fs-extra@^7.0.1:
- version "7.0.1"
- resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz"
- integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==
- dependencies:
- graceful-fs "^4.1.2"
- jsonfile "^4.0.0"
- universalify "^0.1.0"
-
fs-extra@^8.1.0:
version "8.1.0"
resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz"
@@ -5674,17 +5403,7 @@ fs-extra@^8.1.0:
jsonfile "^4.0.0"
universalify "^0.1.0"
-fs-extra@^9.0.0:
- version "9.1.0"
- resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz"
- integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==
- dependencies:
- at-least-node "^1.0.0"
- graceful-fs "^4.2.0"
- jsonfile "^6.0.1"
- universalify "^2.0.0"
-
-fs-extra@^9.0.1:
+fs-extra@^9.0.0, fs-extra@^9.0.1:
version "9.1.0"
resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz"
integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==
@@ -5839,11 +5558,6 @@ glob-parent@^6.0.2:
dependencies:
is-glob "^4.0.3"
-glob-to-regexp@^0.4.1:
- version "0.4.1"
- resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz"
- integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
-
glob@^10.3.12:
version "10.4.5"
resolved "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz"
@@ -5868,18 +5582,7 @@ glob@^7.1.3, glob@^7.1.6:
once "^1.3.0"
path-is-absolute "^1.0.0"
-glob@^8.0.1:
- version "8.1.0"
- resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz"
- integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==
- dependencies:
- fs.realpath "^1.0.0"
- inflight "^1.0.4"
- inherits "2"
- minimatch "^5.0.1"
- once "^1.3.0"
-
-glob@^8.1.0:
+glob@^8.0.1, glob@^8.1.0:
version "8.1.0"
resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz"
integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==
@@ -5956,7 +5659,7 @@ got@^11.7.0, got@^11.8.5:
p-cancelable "^2.0.0"
responselike "^2.0.0"
-graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6:
+graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.6:
version "4.2.11"
resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz"
integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
@@ -6080,7 +5783,7 @@ http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0:
resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz"
integrity sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==
-http-errors@^2.0.0, http-errors@2.0.0:
+http-errors@2.0.0, http-errors@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz"
integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==
@@ -6157,7 +5860,7 @@ iconv-corefoundation@^1.1.7:
cli-truncate "^2.1.0"
node-addon-api "^1.6.3"
-iconv-lite@^0.6.2, iconv-lite@^0.6.3, iconv-lite@0.6, iconv-lite@0.6.3:
+iconv-lite@0.6, iconv-lite@0.6.3, iconv-lite@^0.6.2, iconv-lite@^0.6.3:
version "0.6.3"
resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz"
integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
@@ -6205,7 +5908,7 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
-inherits@^2.0.3, inherits@^2.0.4, inherits@2, inherits@2.0.4:
+inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4:
version "2.0.4"
resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@@ -6578,15 +6281,6 @@ jake@^10.8.5:
filelist "^1.0.4"
picocolors "^1.1.1"
-jest-worker@^27.4.5:
- version "27.5.1"
- resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz"
- integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==
- dependencies:
- "@types/node" "*"
- merge-stream "^2.0.0"
- supports-color "^8.0.0"
-
"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"
@@ -6614,7 +6308,7 @@ json-parse-better-errors@^1.0.1:
resolved "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz"
integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
-json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1:
+json-parse-even-better-errors@^2.3.0:
version "2.3.1"
resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz"
integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
@@ -6653,7 +6347,7 @@ json5@^1.0.2:
dependencies:
minimist "^1.2.0"
-json5@^2.1.2, json5@^2.2.3:
+json5@^2.2.3:
version "2.2.3"
resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz"
integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
@@ -6745,20 +6439,6 @@ load-json-file@^5.2.0:
strip-bom "^3.0.0"
type-fest "^0.3.0"
-loader-runner@^4.2.0:
- version "4.3.0"
- resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz"
- integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==
-
-loader-utils@^2.0.0:
- version "2.0.4"
- resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz"
- integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==
- dependencies:
- big.js "^5.2.2"
- emojis-list "^3.0.0"
- json5 "^2.1.2"
-
locate-path@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz"
@@ -6782,6 +6462,11 @@ locate-path@^6.0.0:
dependencies:
p-locate "^5.0.0"
+lodash-es@^4.17.21:
+ version "4.17.21"
+ resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee"
+ integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
+
lodash.get@^4.0.0:
version "4.4.2"
resolved "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz"
@@ -7408,7 +7093,12 @@ micromatch@^4.0.8:
braces "^3.0.3"
picomatch "^2.3.1"
-mime-db@^1.54.0, "mime-db@>= 1.43.0 < 2":
+mime-db@1.52.0:
+ version "1.52.0"
+ resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz"
+ integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+
+"mime-db@>= 1.43.0 < 2", mime-db@^1.54.0:
version "1.54.0"
resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz"
integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==
@@ -7418,19 +7108,14 @@ mime-db@~1.33.0:
resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz"
integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==
-mime-db@1.52.0:
- version "1.52.0"
- resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz"
- integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
-
-mime-types@^2.1.12:
- version "2.1.35"
- resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz"
- integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
+mime-types@2.1.18:
+ version "2.1.18"
+ resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz"
+ integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==
dependencies:
- mime-db "1.52.0"
+ mime-db "~1.33.0"
-mime-types@^2.1.27:
+mime-types@^2.1.12, mime-types@~2.1.34:
version "2.1.35"
resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz"
integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
@@ -7444,20 +7129,6 @@ mime-types@^3.0.0, mime-types@^3.0.1:
dependencies:
mime-db "^1.54.0"
-mime-types@~2.1.34:
- version "2.1.35"
- resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz"
- integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
- dependencies:
- mime-db "1.52.0"
-
-mime-types@2.1.18:
- version "2.1.18"
- resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz"
- integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==
- dependencies:
- mime-db "~1.33.0"
-
mime@^2.5.2:
version "2.6.0"
resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz"
@@ -7478,41 +7149,13 @@ mimic-response@^3.1.0:
resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz"
integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==
-minimatch@^10.0.0:
- version "10.0.3"
- resolved "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz"
- integrity sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==
- dependencies:
- "@isaacs/brace-expansion" "^5.0.0"
-
-minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2, minimatch@3.1.2:
+minimatch@3.1.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
version "3.1.2"
resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz"
integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
dependencies:
brace-expansion "^1.1.7"
-minimatch@^5.0.1:
- version "5.1.6"
- resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz"
- integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==
- dependencies:
- brace-expansion "^2.0.1"
-
-minimatch@^9.0.3:
- version "9.0.5"
- resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz"
- integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==
- dependencies:
- brace-expansion "^2.0.1"
-
-minimatch@^9.0.4:
- version "9.0.5"
- resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz"
- integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==
- dependencies:
- brace-expansion "^2.0.1"
-
minimatch@9.0.3:
version "9.0.3"
resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz"
@@ -7520,7 +7163,28 @@ minimatch@9.0.3:
dependencies:
brace-expansion "^2.0.1"
-minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.8:
+minimatch@^10.0.0:
+ version "10.0.3"
+ resolved "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz"
+ integrity sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==
+ dependencies:
+ "@isaacs/brace-expansion" "^5.0.0"
+
+minimatch@^5.0.1:
+ version "5.1.6"
+ resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz"
+ integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==
+ dependencies:
+ brace-expansion "^2.0.1"
+
+minimatch@^9.0.3, minimatch@^9.0.4:
+ version "9.0.5"
+ resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz"
+ integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==
+ dependencies:
+ brace-expansion "^2.0.1"
+
+minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6:
version "1.2.8"
resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz"
integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
@@ -7571,17 +7235,12 @@ minipass@^3.0.0, minipass@^3.1.1, minipass@^3.1.6:
dependencies:
yallist "^4.0.0"
-"minipass@^5.0.0 || ^6.0.2 || ^7.0.0":
- version "7.1.2"
- resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz"
- integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==
-
minipass@^5.0.0:
version "5.0.0"
resolved "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz"
integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==
-minipass@^7.1.2:
+"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2:
version "7.1.2"
resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz"
integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==
@@ -7594,13 +7253,6 @@ minizlib@^2.1.1, minizlib@^2.1.2:
minipass "^3.0.0"
yallist "^4.0.0"
-mkdirp@^0.5.1:
- version "0.5.6"
- resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz"
- integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==
- dependencies:
- minimist "^1.2.6"
-
mkdirp@^1.0.3, mkdirp@^1.0.4:
version "1.0.4"
resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz"
@@ -7637,21 +7289,21 @@ ml-matrix@^6.10.4:
is-any-array "^2.0.1"
ml-array-rescale "^1.3.7"
-moment@^2.30.1, "moment@>= 2.x":
+moment@^2.30.1:
version "2.30.1"
resolved "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz"
integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==
-ms@^2.0.0, ms@^2.1.1, ms@^2.1.3:
- version "2.1.3"
- resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
- integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
-
ms@2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz"
integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
+ms@^2.0.0, ms@^2.1.1, ms@^2.1.3:
+ version "2.1.3"
+ resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
nanoid@^3.3.11, nanoid@^3.3.7:
version "3.3.11"
resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz"
@@ -7667,6 +7319,11 @@ natural-compare@^1.4.0:
resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz"
integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
+negotiator@0.6.3:
+ version "0.6.3"
+ resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz"
+ integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
+
negotiator@^0.6.3:
version "0.6.4"
resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz"
@@ -7677,16 +7334,6 @@ negotiator@^1.0.0:
resolved "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz"
integrity sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==
-negotiator@0.6.3:
- version "0.6.3"
- resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz"
- integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
-
-neo-async@^2.6.2:
- version "2.6.2"
- resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz"
- integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
-
no-case@^3.0.4:
version "3.0.4"
resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz"
@@ -8056,16 +7703,16 @@ path-scurry@^1.11.1:
lru-cache "^10.2.0"
minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
-path-to-regexp@^8.0.0:
- version "8.2.0"
- resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz"
- integrity sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==
-
path-to-regexp@3.3.0:
version "3.3.0"
resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz"
integrity sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==
+path-to-regexp@^8.0.0:
+ version "8.2.0"
+ resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz"
+ integrity sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==
+
path-type@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz"
@@ -8098,17 +7745,12 @@ picocolors@^1.0.0, picocolors@^1.1.1:
resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz"
integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
-picomatch@^2.2.2:
+picomatch@^2.2.2, picomatch@^2.3.1:
version "2.3.1"
resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
-picomatch@^2.3.1:
- version "2.3.1"
- resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz"
- integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
-
-"picomatch@^3 || ^4", picomatch@^4.0.2, picomatch@^4.0.3:
+picomatch@^4.0.2, picomatch@^4.0.3:
version "4.0.3"
resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz"
integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==
@@ -8131,7 +7773,7 @@ pkg-conf@^3.1.0:
find-up "^3.0.0"
load-json-file "^5.2.0"
-plist@^3.0.0, plist@^3.0.4, plist@^3.0.5, plist@^3.1.0, plist@3.1.0:
+plist@3.1.0, plist@^3.0.0, plist@^3.0.4, plist@^3.0.5, plist@^3.1.0:
version "3.1.0"
resolved "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz"
integrity sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==
@@ -8150,15 +7792,6 @@ postcss-value-parser@^4.0.2:
resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz"
integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
-postcss@^8.5.6:
- version "8.5.6"
- resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz"
- integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==
- dependencies:
- nanoid "^3.3.11"
- picocolors "^1.1.1"
- source-map-js "^1.2.1"
-
postcss@8.4.49:
version "8.4.49"
resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz"
@@ -8168,12 +7801,14 @@ postcss@8.4.49:
picocolors "^1.1.1"
source-map-js "^1.2.1"
-postject@^1.0.0-alpha.6:
- version "1.0.0-alpha.6"
- resolved "https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz"
- integrity sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==
+postcss@^8.5.6:
+ version "8.5.6"
+ resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz"
+ integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==
dependencies:
- commander "^9.4.0"
+ nanoid "^3.3.11"
+ picocolors "^1.1.1"
+ source-map-js "^1.2.1"
prelude-ls@^1.2.1:
version "1.2.1"
@@ -8205,7 +7840,7 @@ prettier-linter-helpers@^1.0.0:
dependencies:
fast-diff "^1.1.2"
-prettier@^3.5.3, prettier@^3.6.2, prettier@>=3.0.0:
+prettier@^3.5.3, prettier@^3.6.2:
version "3.6.2"
resolved "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz"
integrity sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==
@@ -8304,23 +7939,16 @@ quickselect@^2.0.0:
resolved "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz"
integrity sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==
-randombytes@^2.1.0:
- version "2.1.0"
- resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz"
- integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
- dependencies:
- safe-buffer "^5.1.0"
+range-parser@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz"
+ integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==
range-parser@^1.2.1:
version "1.2.1"
resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz"
integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
-range-parser@1.2.0:
- version "1.2.0"
- resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz"
- integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==
-
raw-body@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz"
@@ -8711,7 +8339,7 @@ react-country-flag@^3.1.0:
resolved "https://registry.npmjs.org/react-country-flag/-/react-country-flag-3.1.0.tgz"
integrity sha512-JWQFw1efdv9sTC+TGQvTKXQg1NKbDU2mBiAiRWcKM9F1sK+/zjhP2yGmm8YDddWyZdXVkR8Md47rPMJmo4YO5g==
-react-dom@*, "react-dom@^18.0.0 || ^19.1.0", react-dom@^19.1.1, "react-dom@>= 16.8.0", react-dom@>=16.0.0, react-dom@>=16.11.0, react-dom@>=16.8, react-dom@>=16.8.0, react-dom@>=16.8.4, react-dom@>=16.9.0, react-dom@>=17.0.0, react-dom@>=18:
+react-dom@^19.1.1:
version "19.1.1"
resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.1.1.tgz"
integrity sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==
@@ -8723,12 +8351,7 @@ react-is@^16.13.1, react-is@^16.7.0:
resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz"
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
-react-is@^18.0.0:
- version "18.3.1"
- resolved "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz"
- integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==
-
-react-is@^18.2.0:
+react-is@^18.0.0, react-is@^18.2.0:
version "18.3.1"
resolved "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz"
integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==
@@ -8780,7 +8403,7 @@ react-router@7.8.2:
cookie "^1.0.1"
set-cookie-parser "^2.6.0"
-react@*, "react@^18 || ^19", "react@^18.0.0 || ^19.1.0", react@^19.1.1, "react@>= 16.8.0", "react@>= 16.x", react@>=16, react@>=16.0.0, react@>=16.11.0, react@>=16.8, react@>=16.8.0, react@>=16.8.4, react@>=16.9.0, react@>=17.0.0, react@>=18:
+react@^19.1.1:
version "19.1.1"
resolved "https://registry.npmjs.org/react/-/react-19.1.1.tgz"
integrity sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==
@@ -8993,13 +8616,6 @@ rimraf@^3.0.2:
dependencies:
glob "^7.1.3"
-rimraf@~2.6.2:
- version "2.6.3"
- resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz"
- integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
- dependencies:
- glob "^7.1.3"
-
roarr@^2.15.3:
version "2.15.4"
resolved "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz"
@@ -9012,7 +8628,7 @@ roarr@^2.15.3:
semver-compare "^1.0.0"
sprintf-js "^1.1.2"
-rollup@^1.20.0||^2.0.0||^3.0.0||^4.0.0, rollup@^2.77.2:
+rollup@^2.77.2:
version "2.79.2"
resolved "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz"
integrity sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==
@@ -9089,16 +8705,16 @@ safe-array-concat@^1.1.3:
has-symbols "^1.1.0"
isarray "^2.0.5"
-safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0, safe-buffer@5.2.1:
- version "5.2.1"
- resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
- integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
-
safe-buffer@5.1.2:
version "5.1.2"
resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@~5.2.0:
+ version "5.2.1"
+ resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
safe-push-apply@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz"
@@ -9138,16 +8754,6 @@ scheduler@^0.26.0:
resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz"
integrity sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==
-schema-utils@^4.3.0, schema-utils@^4.3.2:
- version "4.3.2"
- resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz"
- integrity sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==
- dependencies:
- "@types/json-schema" "^7.0.9"
- ajv "^8.9.0"
- ajv-formats "^2.1.1"
- ajv-keywords "^5.1.0"
-
scroll-into-view-if-needed@^3.1.0:
version "3.1.0"
resolved "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz"
@@ -9160,17 +8766,12 @@ semver-compare@^1.0.0:
resolved "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz"
integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==
-semver@^5.5.0:
+"semver@2 || 3 || 4 || 5", semver@^5.5.0:
version "5.7.2"
resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz"
integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
-semver@^6.2.0:
- version "6.3.1"
- resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz"
- integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
-
-semver@^6.3.1:
+semver@^6.2.0, semver@^6.3.1:
version "6.3.1"
resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz"
integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
@@ -9180,11 +8781,6 @@ semver@^7.0.0, semver@^7.1.3, semver@^7.3.2, semver@^7.3.5, semver@^7.3.6, semve
resolved "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz"
integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==
-"semver@2 || 3 || 4 || 5":
- version "5.7.2"
- resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz"
- integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
-
send@^1.1.0, send@^1.2.0:
version "1.2.0"
resolved "https://registry.npmjs.org/send/-/send-1.2.0.tgz"
@@ -9209,13 +8805,6 @@ serialize-error@^7.0.1:
dependencies:
type-fest "^0.13.1"
-serialize-javascript@^6.0.2:
- version "6.0.2"
- resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz"
- integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==
- dependencies:
- randombytes "^2.1.0"
-
serve-handler@6.1.6:
version "6.1.6"
resolved "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz"
@@ -9388,6 +8977,21 @@ simple-update-notifier@2.0.0:
dependencies:
semver "^7.5.3"
+simplebar-core@^1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/simplebar-core/-/simplebar-core-1.3.2.tgz#e249caf38625afb7c316b2d219b66afd6227e301"
+ integrity sha512-qKgTTuTqapjsFGkNhCjyPhysnbZGpQqNmjk0nOYjFN5ordC/Wjvg+RbYCyMSnW60l/Z0ZS82GbNltly6PMUH1w==
+ dependencies:
+ lodash "^4.17.21"
+ lodash-es "^4.17.21"
+
+simplebar-react@^3.3.2:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/simplebar-react/-/simplebar-react-3.3.2.tgz#699c9837f4ada71335b3eca9f8a2b788a559bda1"
+ integrity sha512-ZsgcQhKLtt5ra0BRIJeApfkTBQCa1vUPA/WXI4HcYReFt+oCEOvdVz6rR/XsGJcKxTlCRPmdGx1uJIUChupo+A==
+ dependencies:
+ simplebar-core "^1.3.2"
+
slash@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz"
@@ -9455,7 +9059,7 @@ source-map-js@^1.0.1, source-map-js@^1.2.1:
resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz"
integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
-source-map-support@^0.5.19, source-map-support@~0.5.20:
+source-map-support@^0.5.19:
version "0.5.21"
resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz"
integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
@@ -9546,16 +9150,16 @@ stat-mode@^1.0.0:
resolved "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz"
integrity sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==
-statuses@^2.0.1:
- version "2.0.2"
- resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz"
- integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==
-
statuses@2.0.1:
version "2.0.1"
resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz"
integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
+statuses@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz"
+ integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==
+
stop-iteration-iterator@^1.1.0:
version "1.1.0"
resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz"
@@ -9564,13 +9168,6 @@ stop-iteration-iterator@^1.1.0:
es-errors "^1.3.0"
internal-slot "^1.1.0"
-string_decoder@^1.1.1:
- version "1.3.0"
- resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz"
- integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
- dependencies:
- safe-buffer "~5.2.0"
-
string-convert@^0.2.0:
version "0.2.1"
resolved "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz"
@@ -9594,16 +9191,7 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.1"
-string-width@^5.0.1:
- version "5.1.2"
- resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz"
- integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==
- dependencies:
- eastasianwidth "^0.2.0"
- emoji-regex "^9.2.2"
- strip-ansi "^7.0.1"
-
-string-width@^5.1.2:
+string-width@^5.0.1, string-width@^5.1.2:
version "5.1.2"
resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz"
integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==
@@ -9671,6 +9259,13 @@ string.prototype.trimstart@^1.0.8:
define-properties "^1.2.1"
es-object-atoms "^1.0.0"
+string_decoder@^1.1.1:
+ version "1.3.0"
+ resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz"
+ integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+ dependencies:
+ safe-buffer "~5.2.0"
+
stringify-entities@^4.0.0:
version "4.0.4"
resolved "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz"
@@ -9768,11 +9363,6 @@ styled-components@^6.1.15, styled-components@^6.1.19:
stylis "4.3.2"
tslib "2.6.2"
-stylis@^4.3.4:
- version "4.3.6"
- resolved "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz"
- integrity sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==
-
stylis@4.2.0:
version "4.2.0"
resolved "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz"
@@ -9783,6 +9373,11 @@ stylis@4.3.2:
resolved "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz"
integrity sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==
+stylis@^4.3.4:
+ version "4.3.6"
+ resolved "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz"
+ integrity sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==
+
sumchecker@^3.0.1:
version "3.0.1"
resolved "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz"
@@ -9790,6 +9385,13 @@ sumchecker@^3.0.1:
dependencies:
debug "^4.1.0"
+supports-color@8.1.1:
+ version "8.1.1"
+ resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz"
+ integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
+ dependencies:
+ has-flag "^4.0.0"
+
supports-color@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz"
@@ -9802,13 +9404,6 @@ supports-color@^7.1.0:
dependencies:
has-flag "^4.0.0"
-supports-color@^8.0.0, supports-color@8.1.1:
- version "8.1.1"
- resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz"
- integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
- dependencies:
- has-flag "^4.0.0"
-
supports-preserve-symlinks-flag@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz"
@@ -9831,7 +9426,7 @@ svgo-loader@^4.0.0:
dependencies:
svgo "^3.0.0"
-svgo@^3.0.0:
+svgo@3.3.2, svgo@^3.0.0:
version "3.3.2"
resolved "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz"
integrity sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==
@@ -9857,19 +9452,6 @@ svgo@^4.0.0:
picocolors "^1.1.1"
sax "^1.4.1"
-svgo@3.3.2:
- version "3.3.2"
- resolved "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz"
- integrity sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==
- dependencies:
- "@trysound/sax" "0.2.0"
- commander "^7.2.0"
- css-select "^5.1.0"
- css-tree "^2.3.1"
- css-what "^6.1.0"
- csso "^5.0.5"
- picocolors "^1.0.0"
-
synckit@^0.11.7:
version "0.11.11"
resolved "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz"
@@ -9877,11 +9459,6 @@ synckit@^0.11.7:
dependencies:
"@pkgr/core" "^0.2.9"
-tapable@^2.1.1, tapable@^2.2.0:
- version "2.2.3"
- resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.3.tgz"
- integrity sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==
-
tar@^6.0.5, tar@^6.1.11, tar@^6.1.12, tar@^6.2.1:
version "6.2.1"
resolved "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz"
@@ -9902,40 +9479,16 @@ temp-file@^3.4.0:
async-exit-hook "^2.0.1"
fs-extra "^10.0.0"
-temp@^0.9.0:
- version "0.9.4"
- resolved "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz"
- integrity sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==
- dependencies:
- mkdirp "^0.5.1"
- rimraf "~2.6.2"
-
-terser-webpack-plugin@^5.3.11:
- version "5.3.14"
- resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz"
- integrity sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==
- dependencies:
- "@jridgewell/trace-mapping" "^0.3.25"
- jest-worker "^27.4.5"
- schema-utils "^4.3.0"
- serialize-javascript "^6.0.2"
- terser "^5.31.1"
-
-terser@^5.16.0, terser@^5.31.1:
- version "5.44.0"
- resolved "https://registry.npmjs.org/terser/-/terser-5.44.0.tgz"
- integrity sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==
- dependencies:
- "@jridgewell/source-map" "^0.3.3"
- acorn "^8.15.0"
- commander "^2.20.0"
- source-map-support "~0.5.20"
-
text-table@^0.2.0:
version "0.2.0"
resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz"
integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
+three@0.176.0:
+ version "0.176.0"
+ resolved "https://registry.npmjs.org/three/-/three-0.176.0.tgz"
+ integrity sha512-PWRKYWQo23ojf9oZSlRGH8K09q7nRSWx6LY/HF/UUrMdYgN9i1e2OwJYHoQjwc6HF/4lvvYLC5YC1X8UJL2ZpA==
+
three@^0.159.0:
version "0.159.0"
resolved "https://registry.npmjs.org/three/-/three-0.159.0.tgz"
@@ -9946,11 +9499,6 @@ three@^0.179.1:
resolved "https://registry.npmjs.org/three/-/three-0.179.1.tgz"
integrity sha512-5y/elSIQbrvKOISxpwXCR4sQqHtGiOI+MKLc3SsBdDXA2hz3Mdp3X59aUp8DyybMa34aeBwbFTpdoLJaUDEWSw==
-three@0.176.0:
- version "0.176.0"
- resolved "https://registry.npmjs.org/three/-/three-0.176.0.tgz"
- integrity sha512-PWRKYWQo23ojf9oZSlRGH8K09q7nRSWx6LY/HF/UUrMdYgN9i1e2OwJYHoQjwc6HF/4lvvYLC5YC1X8UJL2ZpA==
-
throttle-debounce@^5.0.0, throttle-debounce@^5.0.2:
version "5.0.2"
resolved "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz"
@@ -10044,16 +9592,16 @@ tsconfig-paths@^3.15.0:
minimist "^1.2.6"
strip-bom "^3.0.0"
-tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.5.0, tslib@^2.5.3, tslib@^2.8.1:
- version "2.8.1"
- resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz"
- integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
-
tslib@2.6.2:
version "2.6.2"
resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz"
integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==
+tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.5.0, tslib@^2.5.3, tslib@^2.8.1:
+ version "2.8.1"
+ resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz"
+ integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
+
tsparticles@^3.9.1:
version "3.9.1"
resolved "https://registry.npmjs.org/tsparticles/-/tsparticles-3.9.1.tgz"
@@ -10154,7 +9702,7 @@ typed-array-length@^1.0.7:
possible-typed-array-names "^1.0.0"
reflect.getprototypeof "^1.0.6"
-typescript@^5.4.3, typescript@>=4.2.0, typescript@>=4.9.4, typescript@>=4.9.5:
+typescript@^5.4.3:
version "5.9.2"
resolved "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz"
integrity sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==
@@ -10365,7 +9913,7 @@ vite-plugin-svgr@^4.5.0:
"@svgr/core" "^8.1.0"
"@svgr/plugin-jsx" "^8.1.0"
-"vite@^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", vite@^7.1.3, vite@>=2, vite@>=2.6.0, vite@>=4.0.2:
+vite@^7.1.3:
version "7.1.3"
resolved "https://registry.npmjs.org/vite/-/vite-7.1.3.tgz"
integrity sha512-OOUi5zjkDxYrKhTV3V7iKsoS37VUM7v40+HuwEmcrsf11Cdx9y3DIr2Px6liIcZFwt3XSRpQvFpL3WVy7ApkGw==
@@ -10397,14 +9945,6 @@ w3c-keyname@^2.2.4:
resolved "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz"
integrity sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==
-watchpack@^2.4.1:
- version "2.4.4"
- resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz"
- integrity sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==
- dependencies:
- glob-to-regexp "^0.4.1"
- graceful-fs "^4.1.2"
-
wcwidth@^1.0.1:
version "1.0.1"
resolved "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz"
@@ -10417,42 +9957,6 @@ web-vitals@^5.1.0:
resolved "https://registry.npmjs.org/web-vitals/-/web-vitals-5.1.0.tgz"
integrity sha512-ArI3kx5jI0atlTtmV0fWU3fjpLmq/nD3Zr1iFFlJLaqa5wLBkUSzINwBPySCX/8jRyjlmy1Volw1kz1g9XE4Jg==
-webpack-sources@^3.3.3:
- version "3.3.3"
- resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz"
- integrity sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==
-
-webpack@*, webpack@^5.1.0:
- version "5.101.3"
- resolved "https://registry.npmjs.org/webpack/-/webpack-5.101.3.tgz"
- integrity sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A==
- dependencies:
- "@types/eslint-scope" "^3.7.7"
- "@types/estree" "^1.0.8"
- "@types/json-schema" "^7.0.15"
- "@webassemblyjs/ast" "^1.14.1"
- "@webassemblyjs/wasm-edit" "^1.14.1"
- "@webassemblyjs/wasm-parser" "^1.14.1"
- acorn "^8.15.0"
- acorn-import-phases "^1.0.3"
- browserslist "^4.24.0"
- chrome-trace-event "^1.0.2"
- enhanced-resolve "^5.17.3"
- es-module-lexer "^1.2.1"
- eslint-scope "5.1.1"
- events "^3.2.0"
- glob-to-regexp "^0.4.1"
- graceful-fs "^4.2.11"
- json-parse-even-better-errors "^2.3.1"
- loader-runner "^4.2.0"
- mime-types "^2.1.27"
- neo-async "^2.6.2"
- schema-utils "^4.3.2"
- tapable "^2.1.1"
- terser-webpack-plugin "^5.3.11"
- watchpack "^2.4.1"
- webpack-sources "^3.3.3"
-
which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1:
version "1.1.1"
resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz"
@@ -10525,13 +10029,6 @@ word-wrap@^1.2.5:
resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz"
integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==
-workerize-loader@*:
- version "2.0.2"
- resolved "https://registry.npmjs.org/workerize-loader/-/workerize-loader-2.0.2.tgz"
- integrity sha512-HoZ6XY4sHWxA2w0WpzgBwUiR3dv1oo7bS+oCwIpb6n54MclQ/7KXdXsVIChTCygyuHtVuGBO1+i3HzTt699UJQ==
- dependencies:
- loader-utils "^2.0.0"
-
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
version "7.0.0"
resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz"
@@ -10574,7 +10071,7 @@ xdg-basedir@^4.0.0:
resolved "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz"
integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==
-xmlbuilder@^15.1.1, xmlbuilder@>=11.0.1:
+xmlbuilder@>=11.0.1, xmlbuilder@^15.1.1:
version "15.1.1"
resolved "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz"
integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==
@@ -10609,7 +10106,7 @@ yargs-parser@^21.1.1:
resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz"
integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==
-yargs@^17.0.1, yargs@^17.6.2, yargs@17.7.2:
+yargs@17.7.2, yargs@^17.0.1, yargs@^17.6.2:
version "17.7.2"
resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz"
integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==