@corva/ui 3.77.0-9 → 3.77.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/MCP_README.md +9 -6
- package/README.md +6 -0
- package/cjs-bundle/components/AssetEditorV2/components/MultipleAssetsToggle.js.map +1 -1
- package/cjs-bundle/components/AssetEditorV2/components/PrimaryAssetSelect.js +1 -1
- package/cjs-bundle/components/AssetEditorV2/components/PrimaryAssetSelect.js.map +1 -1
- package/cjs-bundle/components/AssetEditorV2/components/PrimaryAssetSelectV2.js +1 -1
- package/cjs-bundle/components/AssetEditorV2/components/PrimaryAssetSelectV2.js.map +1 -1
- package/cjs-bundle/components/AssetEditorV2/components/SecondaryAssetSelect.js +1 -1
- package/cjs-bundle/components/AssetEditorV2/components/SecondaryAssetSelect.js.map +1 -1
- package/cjs-bundle/components/AssetEditorV2/components/SelectItem.js +1 -1
- package/cjs-bundle/components/AssetEditorV2/components/SelectItem.js.map +1 -1
- package/cjs-bundle/components/AssetEditorV2/constants.js.map +1 -1
- package/cjs-bundle/components/AssetEditorV2/effects/assetResponse.js +2 -0
- package/cjs-bundle/components/AssetEditorV2/effects/assetResponse.js.map +1 -0
- package/cjs-bundle/components/AssetEditorV2/effects/index.js +1 -1
- package/cjs-bundle/components/AssetEditorV2/effects/index.js.map +1 -1
- package/cjs-bundle/components/AssetEditorV2/effects/usePrimaryAssetSelectData.js +1 -1
- package/cjs-bundle/components/AssetEditorV2/effects/usePrimaryAssetSelectData.js.map +1 -1
- package/cjs-bundle/components/AssetEditorV2/index.js +1 -1
- package/cjs-bundle/components/AssetEditorV2/index.js.map +1 -1
- package/cjs-bundle/components/AssetEditorV2/utils/index.js +1 -1
- package/cjs-bundle/components/AssetEditorV2/utils/index.js.map +1 -1
- package/cjs-bundle/components/AttachmentLightbox/AttachmentDocument.js +1 -1
- package/cjs-bundle/components/AttachmentLightbox/AttachmentDocument.js.map +1 -1
- package/cjs-bundle/components/CommentComposer/useAttachmentUpload.js +1 -1
- package/cjs-bundle/components/CommentComposer/useAttachmentUpload.js.map +1 -1
- package/cjs-bundle/components/DevCenter/DevCenterAppContainer/components/AppSettingsDialog/AppSettingsDialog.js +1 -1
- package/cjs-bundle/components/DevCenter/DevCenterAppContainer/components/AppSettingsDialog/AppSettingsDialog.js.map +1 -1
- package/cjs-bundle/components/DevCenter/DevCenterRouterContext/UniversalLink/UniversalLink.js +1 -1
- package/cjs-bundle/components/DevCenter/DevCenterRouterContext/UniversalLink/UniversalLink.js.map +1 -1
- package/cjs-bundle/components/OffsetWellPickerV5/components/Filter/components/PeriodFilterSelect/PeriodFilterSelect.js.map +1 -1
- package/cjs-bundle/components/OffsetWellPickerV5/components/OffsetWellsTable/cells/MetricsCells/MetricsCells.js +1 -1
- package/cjs-bundle/components/OffsetWellPickerV5/components/OffsetWellsTable/cells/MetricsCells/MetricsCells.js.map +1 -1
- package/cjs-bundle/components/OffsetWellPickerV5/components/OffsetWellsTable/components/MetricCell/MetricCell.js +1 -1
- package/cjs-bundle/components/OffsetWellPickerV5/components/OffsetWellsTable/components/MetricCell/MetricCell.js.map +1 -1
- package/cjs-bundle/components/OffsetWellPickerV5/components/OffsetWellsTable/components/MetricCell/MetricCell.module.css.js +1 -1
- package/cjs-bundle/components/OffsetWellPickerV5/components/OffsetWellsTable/components/OffsetWellsTableRow/OffsetWellsTableRow.js +1 -1
- package/cjs-bundle/components/OffsetWellPickerV5/components/OffsetWellsTable/components/OffsetWellsTableRow/OffsetWellsTableRow.js.map +1 -1
- package/cjs-bundle/components/OffsetWellPickerV5/components/OffsetWellsTable/useRowInteractions.js +1 -1
- package/cjs-bundle/components/OffsetWellPickerV5/components/OffsetWellsTable/useRowInteractions.js.map +1 -1
- package/cjs-bundle/components/OffsetWellPickerV5/constants.js +1 -1
- package/cjs-bundle/components/OffsetWellPickerV5/constants.js.map +1 -1
- package/cjs-bundle/components/OffsetWellPickerV5/hooks/use-well-data-pipeline/useAdvancedWells.js +1 -1
- package/cjs-bundle/components/OffsetWellPickerV5/hooks/use-well-data-pipeline/useAdvancedWells.js.map +1 -1
- package/cjs-bundle/components/OffsetWellPickerV5/stores/filter-store/types.js.map +1 -1
- package/cjs-bundle/components/OffsetWellPickerV5/utils/getTimestampByPeriod.js +1 -1
- package/cjs-bundle/components/OffsetWellPickerV5/utils/getTimestampByPeriod.js.map +1 -1
- package/cjs-bundle/components/Search/Search.js.map +1 -1
- package/cjs-bundle/config/mapbox/index.js +1 -1
- package/cjs-bundle/config/mapbox/index.js.map +1 -1
- package/cjs-bundle/hocs/withAssetEditorLockHOC.js +1 -1
- package/cjs-bundle/hocs/withAssetEditorLockHOC.js.map +1 -1
- package/cjs-bundle/permissions/constants/index.js +1 -1
- package/cjs-bundle/permissions/constants/index.js.map +1 -1
- package/components/AssetEditorV2/__tests__/AssetEditorV2.test.d.ts +2 -0
- package/components/AssetEditorV2/__tests__/AssetEditorV2.test.d.ts.map +1 -0
- package/components/AssetEditorV2/__tests__/consumerTypes.test.d.ts +2 -0
- package/components/AssetEditorV2/__tests__/consumerTypes.test.d.ts.map +1 -0
- package/components/AssetEditorV2/components/MultipleAssetsToggle.d.ts +17 -6
- package/components/AssetEditorV2/components/MultipleAssetsToggle.d.ts.map +1 -1
- package/components/AssetEditorV2/components/MultipleAssetsToggle.js.map +1 -1
- package/components/AssetEditorV2/components/PrimaryAssetSelect.d.ts +30 -39
- package/components/AssetEditorV2/components/PrimaryAssetSelect.d.ts.map +1 -1
- package/components/AssetEditorV2/components/PrimaryAssetSelect.js +1 -1
- package/components/AssetEditorV2/components/PrimaryAssetSelect.js.map +1 -1
- package/components/AssetEditorV2/components/PrimaryAssetSelectV2.d.ts +4 -41
- package/components/AssetEditorV2/components/PrimaryAssetSelectV2.d.ts.map +1 -1
- package/components/AssetEditorV2/components/PrimaryAssetSelectV2.js +1 -1
- package/components/AssetEditorV2/components/PrimaryAssetSelectV2.js.map +1 -1
- package/components/AssetEditorV2/components/SecondaryAssetSelect.d.ts +22 -18
- package/components/AssetEditorV2/components/SecondaryAssetSelect.d.ts.map +1 -1
- package/components/AssetEditorV2/components/SecondaryAssetSelect.js +1 -1
- package/components/AssetEditorV2/components/SecondaryAssetSelect.js.map +1 -1
- package/components/AssetEditorV2/components/SelectItem.d.ts +10 -1
- package/components/AssetEditorV2/components/SelectItem.d.ts.map +1 -1
- package/components/AssetEditorV2/components/SelectItem.js +1 -1
- package/components/AssetEditorV2/components/SelectItem.js.map +1 -1
- package/components/AssetEditorV2/components/__tests__/AssetSelectors.test.d.ts +2 -0
- package/components/AssetEditorV2/components/__tests__/AssetSelectors.test.d.ts.map +1 -0
- package/components/AssetEditorV2/components/__tests__/MultipleAssetsToggle.test.d.ts.map +1 -1
- package/components/AssetEditorV2/components/__tests__/SelectItem.test.d.ts.map +1 -1
- package/components/AssetEditorV2/components/index.d.ts.map +1 -1
- package/components/AssetEditorV2/constants.d.ts +2 -9
- package/components/AssetEditorV2/constants.d.ts.map +1 -1
- package/components/AssetEditorV2/constants.js.map +1 -1
- package/components/AssetEditorV2/effects/__tests__/assetResponse.test.d.ts +2 -0
- package/components/AssetEditorV2/effects/__tests__/assetResponse.test.d.ts.map +1 -0
- package/components/AssetEditorV2/effects/__tests__/useLegacyPrimaryAssetSelectData.test.d.ts +2 -0
- package/components/AssetEditorV2/effects/__tests__/useLegacyPrimaryAssetSelectData.test.d.ts.map +1 -0
- package/components/AssetEditorV2/effects/__tests__/usePrimaryAssetSelectData.test.d.ts +2 -0
- package/components/AssetEditorV2/effects/__tests__/usePrimaryAssetSelectData.test.d.ts.map +1 -0
- package/components/AssetEditorV2/effects/assetResponse.d.ts +4 -0
- package/components/AssetEditorV2/effects/assetResponse.d.ts.map +1 -0
- package/components/AssetEditorV2/effects/assetResponse.js +2 -0
- package/components/AssetEditorV2/effects/assetResponse.js.map +1 -0
- package/components/AssetEditorV2/effects/index.d.ts +34 -28
- package/components/AssetEditorV2/effects/index.d.ts.map +1 -1
- package/components/AssetEditorV2/effects/index.js +1 -1
- package/components/AssetEditorV2/effects/index.js.map +1 -1
- package/components/AssetEditorV2/effects/usePrimaryAssetSelectData.d.ts +21 -17
- package/components/AssetEditorV2/effects/usePrimaryAssetSelectData.d.ts.map +1 -1
- package/components/AssetEditorV2/effects/usePrimaryAssetSelectData.js +1 -1
- package/components/AssetEditorV2/effects/usePrimaryAssetSelectData.js.map +1 -1
- package/components/AssetEditorV2/index.d.ts +36 -67
- package/components/AssetEditorV2/index.d.ts.map +1 -1
- package/components/AssetEditorV2/index.js +1 -1
- package/components/AssetEditorV2/index.js.map +1 -1
- package/components/AssetEditorV2/types.d.ts +82 -0
- package/components/AssetEditorV2/types.d.ts.map +1 -0
- package/components/AssetEditorV2/utils/__tests__/utils.test.d.ts.map +1 -1
- package/components/AssetEditorV2/utils/index.d.ts +23 -19
- package/components/AssetEditorV2/utils/index.d.ts.map +1 -1
- package/components/AssetEditorV2/utils/index.js +1 -1
- package/components/AssetEditorV2/utils/index.js.map +1 -1
- package/components/AttachmentLightbox/AttachmentDocument.d.ts.map +1 -1
- package/components/AttachmentLightbox/AttachmentDocument.js +1 -1
- package/components/AttachmentLightbox/AttachmentDocument.js.map +1 -1
- package/components/CommentComposer/__tests__/useAttachmentUpload.local.test.d.ts +2 -0
- package/components/CommentComposer/__tests__/useAttachmentUpload.local.test.d.ts.map +1 -0
- package/components/CommentComposer/useAttachmentUpload.d.ts.map +1 -1
- package/components/CommentComposer/useAttachmentUpload.js +1 -1
- package/components/CommentComposer/useAttachmentUpload.js.map +1 -1
- package/components/DevCenter/DevCenterAppContainer/components/AppSettingsDialog/AppSettingsDialog.d.ts.map +1 -1
- package/components/DevCenter/DevCenterAppContainer/components/AppSettingsDialog/AppSettingsDialog.js +1 -1
- package/components/DevCenter/DevCenterAppContainer/components/AppSettingsDialog/AppSettingsDialog.js.map +1 -1
- package/components/DevCenter/DevCenterRouterContext/UniversalLink/UniversalLink.d.ts.map +1 -1
- package/components/DevCenter/DevCenterRouterContext/UniversalLink/UniversalLink.js +1 -1
- package/components/DevCenter/DevCenterRouterContext/UniversalLink/UniversalLink.js.map +1 -1
- package/components/Drillstring/BHAComponentDetail/constants.d.ts +2 -2
- package/components/OffsetWellPickerV4/effects/__tests__/useCompanyMetricKey.test.d.ts +2 -0
- package/components/OffsetWellPickerV4/effects/__tests__/useCompanyMetricKey.test.d.ts.map +1 -0
- package/components/OffsetWellPickerV4/effects/useCompanyMetricKey.d.ts.map +1 -1
- package/components/OffsetWellPickerV5/__tests__/constants.test.d.ts +2 -0
- package/components/OffsetWellPickerV5/__tests__/constants.test.d.ts.map +1 -0
- package/components/OffsetWellPickerV5/components/Filter/components/PeriodFilterSelect/PeriodFilterSelect.js.map +1 -1
- package/components/OffsetWellPickerV5/components/OffsetWellsTable/cells/MetricsCells/MetricsCells.d.ts +2 -1
- package/components/OffsetWellPickerV5/components/OffsetWellsTable/cells/MetricsCells/MetricsCells.d.ts.map +1 -1
- package/components/OffsetWellPickerV5/components/OffsetWellsTable/cells/MetricsCells/MetricsCells.js +1 -1
- package/components/OffsetWellPickerV5/components/OffsetWellsTable/cells/MetricsCells/MetricsCells.js.map +1 -1
- package/components/OffsetWellPickerV5/components/OffsetWellsTable/components/MetricCell/MetricCell.d.ts +3 -1
- package/components/OffsetWellPickerV5/components/OffsetWellsTable/components/MetricCell/MetricCell.d.ts.map +1 -1
- package/components/OffsetWellPickerV5/components/OffsetWellsTable/components/MetricCell/MetricCell.js +1 -1
- package/components/OffsetWellPickerV5/components/OffsetWellsTable/components/MetricCell/MetricCell.js.map +1 -1
- package/components/OffsetWellPickerV5/components/OffsetWellsTable/components/MetricCell/MetricCell.module.css.js +1 -1
- package/components/OffsetWellPickerV5/components/OffsetWellsTable/components/MetricCell/__tests__/MetricCell.test.d.ts +2 -0
- package/components/OffsetWellPickerV5/components/OffsetWellsTable/components/MetricCell/__tests__/MetricCell.test.d.ts.map +1 -0
- package/components/OffsetWellPickerV5/components/OffsetWellsTable/components/OffsetWellsTableRow/OffsetWellsTableRow.d.ts.map +1 -1
- package/components/OffsetWellPickerV5/components/OffsetWellsTable/components/OffsetWellsTableRow/OffsetWellsTableRow.js +1 -1
- package/components/OffsetWellPickerV5/components/OffsetWellsTable/components/OffsetWellsTableRow/OffsetWellsTableRow.js.map +1 -1
- package/components/OffsetWellPickerV5/components/OffsetWellsTable/useRowInteractions.d.ts +0 -1
- package/components/OffsetWellPickerV5/components/OffsetWellsTable/useRowInteractions.d.ts.map +1 -1
- package/components/OffsetWellPickerV5/components/OffsetWellsTable/useRowInteractions.js +1 -1
- package/components/OffsetWellPickerV5/components/OffsetWellsTable/useRowInteractions.js.map +1 -1
- package/components/OffsetWellPickerV5/constants.d.ts +26 -3
- package/components/OffsetWellPickerV5/constants.d.ts.map +1 -1
- package/components/OffsetWellPickerV5/constants.js +1 -1
- package/components/OffsetWellPickerV5/constants.js.map +1 -1
- package/components/OffsetWellPickerV5/hooks/use-well-data-pipeline/__tests__/useAdvancedWells.test.d.ts +2 -0
- package/components/OffsetWellPickerV5/hooks/use-well-data-pipeline/__tests__/useAdvancedWells.test.d.ts.map +1 -0
- package/components/OffsetWellPickerV5/hooks/use-well-data-pipeline/__tests__/useCompanyMetricKey.test.d.ts +2 -0
- package/components/OffsetWellPickerV5/hooks/use-well-data-pipeline/__tests__/useCompanyMetricKey.test.d.ts.map +1 -0
- package/components/OffsetWellPickerV5/hooks/use-well-data-pipeline/useAdvancedWells.d.ts.map +1 -1
- package/components/OffsetWellPickerV5/hooks/use-well-data-pipeline/useAdvancedWells.js +1 -1
- package/components/OffsetWellPickerV5/hooks/use-well-data-pipeline/useAdvancedWells.js.map +1 -1
- package/components/OffsetWellPickerV5/stores/filter-store/types.d.ts +2 -1
- package/components/OffsetWellPickerV5/stores/filter-store/types.d.ts.map +1 -1
- package/components/OffsetWellPickerV5/stores/filter-store/types.js.map +1 -1
- package/components/OffsetWellPickerV5/utils/__tests__/getTimestampByPeriod.test.d.ts +2 -0
- package/components/OffsetWellPickerV5/utils/__tests__/getTimestampByPeriod.test.d.ts.map +1 -0
- package/components/OffsetWellPickerV5/utils/getTimestampByPeriod.d.ts +4 -0
- package/components/OffsetWellPickerV5/utils/getTimestampByPeriod.d.ts.map +1 -1
- package/components/OffsetWellPickerV5/utils/getTimestampByPeriod.js +1 -1
- package/components/OffsetWellPickerV5/utils/getTimestampByPeriod.js.map +1 -1
- package/components/Search/Search.d.ts +6 -3
- package/components/Search/Search.d.ts.map +1 -1
- package/components/Search/Search.js.map +1 -1
- package/components/index.d.ts +1 -0
- package/components/index.d.ts.map +1 -1
- package/config/mapbox/index.d.ts.map +1 -1
- package/config/mapbox/index.js +1 -1
- package/config/mapbox/index.js.map +1 -1
- package/hocs/__tests__/withAssetEditorLockHOC.test.d.ts +2 -0
- package/hocs/__tests__/withAssetEditorLockHOC.test.d.ts.map +1 -0
- package/hocs/withAssetEditorLockHOC.d.ts +11 -1
- package/hocs/withAssetEditorLockHOC.d.ts.map +1 -1
- package/hocs/withAssetEditorLockHOC.js +1 -1
- package/hocs/withAssetEditorLockHOC.js.map +1 -1
- package/mcp-server/server.mjs +312 -73
- package/mcp-server/setup.mjs +129 -44
- package/package.json +3 -2
- package/permissions/constants/index.d.ts +1 -0
- package/permissions/constants/index.d.ts.map +1 -1
- package/permissions/constants/index.js +1 -1
- package/permissions/constants/index.js.map +1 -1
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAttachmentUpload.js","sources":["../../../src/components/CommentComposer/useAttachmentUpload.ts"],"sourcesContent":["import { ChangeEvent, useCallback, useEffect, useRef, useState } from 'react';\nimport S3Upload from 'react-s3-uploader/s3upload';\n\nimport type {\n AttachmentKind,\n AttachmentPreviewItem,\n} from '../AttachmentPreview/AttachmentPreview.types';\nimport { getAttachmentKind } from '../AttachmentPreview/getAttachmentKind';\nimport { ACCEPTED_ATTACHMENT_TYPES } from '../AttachFileButton';\n\nimport { getS3SignedUrl } from '~/clients/jsonApi';\nimport { getUrlFileName } from '~/utils/links';\nimport { getSignedLink, peekSignedLink } from '~/utils/signedLinkCache';\n\nexport type UploadedAttachment = {\n url: string;\n name: string;\n size?: number;\n};\n\ntype UseAttachmentUploadOptions = {\n value: UploadedAttachment[];\n onChange: (attachments: UploadedAttachment[]) => void;\n onError?: (message: string | null) => void;\n maxSizeBytes?: number;\n maxFiles?: number;\n /** Mirrors the file input's `accept`; also gates drag-and-drop. */\n accept?: string;\n};\n\n/** A picked or already-stored file, in the order the user arranged it. */\ntype Entry = {\n id: string;\n name: string;\n /** Set while the file is local; cleared entries come from `value`. */\n file: File | null;\n previewUrl: string;\n isUploading: boolean;\n error: string | null;\n uploaded: UploadedAttachment | null;\n};\n\nexport const DEFAULT_MAX_ATTACHMENTS = 10;\n\n/** Same rules the file input enforces via `accept`, so drag-and-drop can't smuggle a type past it. */\nconst isAcceptedType = (file: File, accept: string) =>\n accept\n .split(',')\n .map(rule => rule.trim().toLowerCase())\n .filter(Boolean)\n .some(rule => {\n if (rule.startsWith('.')) return file.name.toLowerCase().endsWith(rule);\n if (rule.endsWith('/*')) {\n const type = file.type.toLowerCase();\n if (type) return type.startsWith(rule.slice(0, -1));\n\n return getAttachmentKind({ name: file.name }) === rule.slice(0, -1);\n }\n\n return file.type.toLowerCase() === rule;\n });\n\nconst getFileKind = (file: File): AttachmentKind => {\n if (file.type.startsWith('image/')) return 'image';\n if (file.type.startsWith('video/')) return 'video';\n return 'file';\n};\n\nconst formatMb = (bytes: number) => (bytes / (1024 * 1024)).toFixed(1);\n\nconst getUploaded = (entries: Entry[]) =>\n entries.map(entry => entry.uploaded).filter(Boolean) as UploadedAttachment[];\n\nconst isSameList = (a: UploadedAttachment[], b: UploadedAttachment[]) =>\n a.length === b.length && a.every((item, index) => item.url === b[index].url);\n\nconst toStoredEntry = (attachment: UploadedAttachment): Entry => ({\n id: attachment.url,\n name: attachment.name,\n file: null,\n previewUrl: '',\n isUploading: false,\n error: null,\n uploaded: attachment,\n});\n\nlet entrySeq = 0;\nconst nextEntryId = () => {\n entrySeq += 1;\n return `attachment-${entrySeq}`;\n};\n\nexport const useAttachmentUpload = ({\n value,\n onChange,\n onError,\n maxSizeBytes,\n maxFiles = DEFAULT_MAX_ATTACHMENTS,\n accept = ACCEPTED_ATTACHMENT_TYPES,\n}: UseAttachmentUploadOptions) => {\n const [entries, setEntries] = useState<Entry[]>([]);\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n const uploadersRef = useRef(new Map<string, S3Upload>());\n // Bumped per attempt so a superseded upload can't write state for a restarted entry.\n const sessionsRef = useRef(new Map<string, number>());\n // Mutations are driven from async upload callbacks, so the latest list lives in a ref.\n const entriesRef = useRef<Entry[]>([]);\n const onChangeRef = useRef(onChange);\n const onErrorRef = useRef(onError);\n\n onChangeRef.current = onChange;\n onErrorRef.current = onError;\n\n // What we last handed the parent. A `value` that still matches it is our own change echoing\n // back; anything else is a parent-driven reset we must adopt.\n const emittedRef = useRef<UploadedAttachment[]>([]);\n\n const commit = useCallback((updater: (prev: Entry[]) => Entry[]) => {\n const next = updater(entriesRef.current);\n entriesRef.current = next;\n setEntries(next);\n emittedRef.current = getUploaded(next);\n onChangeRef.current(emittedRef.current);\n }, []);\n\n const patchEntry = useCallback(\n (id: string, patch: Partial<Entry>) =>\n commit(prev => prev.map(entry => (entry.id === id ? { ...entry, ...patch } : entry))),\n [commit]\n );\n\n const abortUpload = useCallback((id: string) => {\n uploadersRef.current.get(id)?.abortUpload();\n uploadersRef.current.delete(id);\n // Bump, never delete: deleting would let the next attempt reuse session 1, so a callback\n // still in flight from the aborted attempt would pass `isCurrent` and clobber it.\n sessionsRef.current.set(id, (sessionsRef.current.get(id) ?? 0) + 1);\n }, []);\n\n const releasePreview = useCallback((entry?: Entry) => {\n if (entry?.previewUrl) URL.revokeObjectURL(entry.previewUrl);\n }, []);\n\n // The banner is shared by every tile, so recompute it rather than clear it — one file\n // succeeding must not hide a sibling that is still failing.\n const syncError = useCallback(() => {\n onErrorRef.current?.(entriesRef.current.find(entry => entry.error)?.error ?? null);\n }, []);\n\n useEffect(\n () => () => {\n uploadersRef.current.forEach(uploader => uploader.abortUpload());\n uploadersRef.current.clear();\n entriesRef.current.forEach(entry => {\n if (entry.previewUrl) URL.revokeObjectURL(entry.previewUrl);\n });\n },\n []\n );\n\n const startUpload = useCallback(\n (id: string, file: File) => {\n const session = (sessionsRef.current.get(id) ?? 0) + 1;\n sessionsRef.current.set(id, session);\n // A superseded upload must not write state for an entry that is gone or restarted.\n const isCurrent = () => sessionsRef.current.get(id) === session;\n\n const fail = (message: string) => {\n if (!isCurrent()) return;\n patchEntry(id, { isUploading: false, error: message });\n onErrorRef.current?.(message);\n };\n\n let storedKey = '';\n\n const uploader = new S3Upload({\n files: [file],\n preprocess: (target: File, next: (file: File) => void) => next(target),\n onProgress: () => {},\n getSignedUrl: async (\n target: File,\n callback: (data: { signedUrl: string; [key: string]: unknown }) => void\n ) => {\n try {\n const data = await getS3SignedUrl(target.name, target.type);\n storedKey = data.file_name;\n callback({ ...data, signedUrl: data.signed_url });\n } catch (e) {\n fail((e as Error)?.message || 'Failed to upload the file');\n }\n },\n onFinishS3Put: async () => {\n try {\n const url = await getSignedLink(storedKey);\n if (!isCurrent()) return;\n\n uploadersRef.current.delete(id);\n patchEntry(id, {\n isUploading: false,\n error: null,\n uploaded: { url, name: storedKey, size: file.size },\n });\n syncError();\n } catch (e) {\n fail((e as Error)?.message || 'Failed to upload the file');\n }\n },\n onError: (message: string) => fail(message || 'Failed to upload the file'),\n });\n\n uploadersRef.current.set(id, uploader);\n },\n [patchEntry, syncError]\n );\n\n /** Nothing is uploaded: a comment attachment is a url, so the link itself is the attachment. */\n const addLinkedImage = useCallback(\n (url: string) => {\n const name = getUrlFileName(url);\n\n if (!name) return;\n if (entriesRef.current.length >= maxFiles) {\n onErrorRef.current?.(`You can attach up to ${maxFiles} files.`);\n\n return;\n }\n\n if (entriesRef.current.some(entry => entry.uploaded?.url === url)) return;\n\n commit(prev => [\n ...prev,\n {\n id: nextEntryId(),\n name,\n file: null,\n previewUrl: url,\n isUploading: false,\n error: null,\n uploaded: { url, name },\n },\n ]);\n },\n [commit, maxFiles]\n );\n\n /** Attaches files already in S3 (e.g. Wellhub picks): nothing to upload, the key is signed. */\n const addStoredFiles = useCallback(\n async (files: { fileName: string; size?: number }[]) => {\n const fresh = files.filter(\n (file, index, list) =>\n !entriesRef.current.some(entry => entry.uploaded?.name === file.fileName) &&\n list.findIndex(other => other.fileName === file.fileName) === index\n );\n if (!fresh.length) return;\n\n const room = maxFiles - entriesRef.current.length;\n if (room <= 0) {\n onErrorRef.current?.(`You can attach up to ${maxFiles} files.`);\n\n return;\n }\n\n const accepted = fresh.slice(0, room);\n const signed = await Promise.all(\n accepted.map(file =>\n getSignedLink(file.fileName)\n .then(url => ({ url, name: file.fileName, size: file.size }))\n .catch(() => null)\n )\n );\n const attachments = signed.filter(Boolean) as UploadedAttachment[];\n\n // Files may have been dropped in while the keys were signing, so re-check the room.\n let added = 0;\n if (attachments.length) {\n commit(prev => {\n const fitting = attachments.slice(0, Math.max(maxFiles - prev.length, 0));\n added = fitting.length;\n\n return [\n ...prev,\n ...fitting.map(attachment => ({ ...toStoredEntry(attachment), id: nextEntryId() })),\n ];\n });\n }\n\n const failed = signed.length - attachments.length;\n const overflow = fresh.length > accepted.length || added < attachments.length;\n onErrorRef.current?.(\n (failed &&\n `Could not attach ${failed === 1 ? 'a file' : `${failed} files`} from Wellhub.`) ||\n (overflow && `You can attach up to ${maxFiles} files.`) ||\n entriesRef.current.find(entry => entry.error)?.error ||\n null\n );\n },\n [commit, maxFiles]\n );\n\n const addFiles = useCallback(\n (files: File[]) => {\n const supported = files.filter(file => isAcceptedType(file, accept));\n const skipped = supported.length < files.length;\n // One banner, one message: report the most actionable reason once, at the end. Reporting\n // as we go would let a later call overwrite an earlier warning on a mixed drop.\n const unsupported = skipped\n ? (files.length === 1 && 'That file type is not supported.') ||\n 'Some files were skipped — unsupported file type.'\n : null;\n const tooMany = `You can attach up to ${maxFiles} files.`;\n\n const room = maxFiles - entriesRef.current.length;\n if (!supported.length || room <= 0) {\n onErrorRef.current?.(supported.length ? tooMany : unsupported);\n return;\n }\n\n const accepted = supported.slice(0, room);\n const added: Entry[] = accepted.map(file => {\n const kind = getFileKind(file);\n const isTooLarge = !!maxSizeBytes && file.size > maxSizeBytes;\n\n return {\n id: nextEntryId(),\n name: file.name,\n file,\n previewUrl: kind === 'file' ? '' : URL.createObjectURL(file),\n isUploading: !isTooLarge,\n error: isTooLarge\n ? `File is too large (${formatMb(file.size)} MB). Maximum size is ${formatMb(\n maxSizeBytes as number\n )} MB.`\n : null,\n uploaded: null,\n };\n });\n\n commit(prev => [...prev, ...added]);\n\n const overflow = supported.length > accepted.length ? tooMany : null;\n onErrorRef.current?.(\n entriesRef.current.find(entry => entry.error)?.error ?? unsupported ?? overflow\n );\n\n added\n .filter(entry => !entry.error)\n .forEach(entry => startUpload(entry.id, entry.file as File));\n },\n [commit, maxFiles, maxSizeBytes, startUpload, accept]\n );\n\n const handleFileSelect = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(event.target.files ?? []);\n // Reset the input so re-picking the same file still fires a change event.\n if (fileInputRef.current) fileInputRef.current.value = '';\n if (files.length) addFiles(files);\n },\n [addFiles]\n );\n\n const openFileDialog = useCallback(() => fileInputRef.current?.click(), []);\n\n const removeAttachment = useCallback(\n (id: AttachmentPreviewItem['id']) => {\n const key = String(id);\n abortUpload(key);\n releasePreview(entriesRef.current.find(entry => entry.id === key));\n commit(prev => prev.filter(entry => entry.id !== key));\n syncError();\n },\n [abortUpload, releasePreview, commit, syncError]\n );\n\n const handleRetry = useCallback(\n (id: AttachmentPreviewItem['id']) => {\n const key = String(id);\n const entry = entriesRef.current.find(item => item.id === key);\n if (!entry?.file) return;\n\n abortUpload(key);\n patchEntry(key, { isUploading: true, error: null });\n syncError();\n startUpload(key, entry.file);\n },\n [abortUpload, patchEntry, startUpload, syncError]\n );\n\n const reorderAttachments = useCallback(\n (orderedIds: AttachmentPreviewItem['id'][]) =>\n commit(prev => {\n const byId = new Map(prev.map(entry => [entry.id, entry]));\n const reordered = orderedIds.map(id => byId.get(String(id))).filter(Boolean) as Entry[];\n // Unlisted ids (a race with a removal) keep their place at the end.\n const missing = prev.filter(entry => !orderedIds.some(id => String(id) === entry.id));\n return [...reordered, ...missing];\n }),\n [commit]\n );\n\n const clearAttachments = useCallback(() => {\n entriesRef.current.forEach(entry => {\n abortUpload(entry.id);\n releasePreview(entry);\n });\n commit(() => []);\n onErrorRef.current?.(null);\n }, [abortUpload, commit, releasePreview]);\n\n // Adopt a value we didn't produce — an edit form's initial attachments, or a parent-side reset.\n // Compared against what we emitted, not against the current entries: a failed-only or\n // mid-upload list emits `[]` too, and treating that as \"in sync\" would strand those tiles\n // on screen and let a late upload write itself back into freshly reset parent state.\n useEffect(() => {\n if (isSameList(emittedRef.current, value)) return;\n\n entriesRef.current.forEach(entry => {\n abortUpload(entry.id);\n if (entry.previewUrl) URL.revokeObjectURL(entry.previewUrl);\n });\n entriesRef.current = value.map(toStoredEntry);\n emittedRef.current = value;\n setEntries(entriesRef.current);\n onErrorRef.current?.(null);\n }, [value, abortUpload]);\n\n // A stored url has expired by now, so re-sign it for the preview.\n const [storedSrcs, setStoredSrcs] = useState<Record<string, string>>(() =>\n value.reduce<Record<string, string>>((acc, attachment) => {\n const src = peekSignedLink(attachment.name, 'inline');\n if (src) acc[attachment.name] = src;\n\n return acc;\n }, {})\n );\n const storedSrcsRef = useRef(storedSrcs);\n storedSrcsRef.current = storedSrcs;\n\n const storedNames = entries\n // A linked image carries its own url, so there is no key of ours to sign.\n .filter(entry => !entry.file && !entry.previewUrl && entry.uploaded)\n .map(entry => (entry.uploaded as UploadedAttachment).name)\n .join('|');\n\n useEffect(() => {\n const pending = storedNames.split('|').filter(name => name && !(name in storedSrcsRef.current));\n if (!pending.length) return undefined;\n\n let isActive = true;\n Promise.all(\n pending.map(name =>\n getSignedLink(name, 'inline')\n .then(url => [name, url] as const)\n .catch(error => {\n console.error(`Failed to sign stored attachment \"${name}\"`, error);\n\n return [name, ''] as const;\n })\n )\n ).then(resolved => {\n if (isActive) setStoredSrcs(prev => ({ ...prev, ...Object.fromEntries(resolved) }));\n });\n\n return () => {\n isActive = false;\n };\n }, [storedNames]);\n\n const items = entries.reduce<AttachmentPreviewItem[]>((acc, entry) => {\n if (entry.file) {\n acc.push({\n id: entry.id,\n name: entry.name,\n src: entry.previewUrl,\n kind: getFileKind(entry.file),\n size: entry.file.size,\n isUploading: entry.isUploading,\n hideDownload: true,\n error: entry.error ?? undefined,\n });\n return acc;\n }\n\n const stored = entry.uploaded as UploadedAttachment;\n const kind = getAttachmentKind(stored);\n // A linked image is already a url; only one of ours has an S3 key worth signing.\n const src = entry.previewUrl || storedSrcs[stored.name];\n // A thumbnail without its signed url would paint as a broken image, so hold it back.\n if (kind !== 'file' && !src) return acc;\n\n acc.push({ id: entry.id, name: stored.name, src, kind, size: stored.size, hideDownload: true });\n return acc;\n }, []);\n\n return {\n items,\n fileInputRef,\n openFileDialog,\n handleFileSelect,\n addFiles,\n addLinkedImage,\n addStoredFiles,\n removeAttachment,\n handleRetry,\n reorderAttachments,\n clearAttachments,\n isUploading: entries.some(entry => entry.isUploading),\n error: entries.find(entry => entry.error)?.error ?? null,\n count: entries.length,\n isFull: entries.length >= maxFiles,\n maxFiles,\n };\n};\n"],"names":["DEFAULT_MAX_ATTACHMENTS","getFileKind","file","type","startsWith","formatMb","bytes","toFixed","toStoredEntry","attachment","id","url","name","previewUrl","isUploading","error","uploaded","entrySeq","nextEntryId","concat","useAttachmentUpload","_ref","_entries$find$error","_entries$find","value","onChange","onError","maxSizeBytes","_ref$maxFiles","maxFiles","_ref$accept","accept","ACCEPTED_ATTACHMENT_TYPES","useState","_useState2","_slicedToArray","_useState","entries","setEntries","fileInputRef","useRef","uploadersRef","Map","sessionsRef","entriesRef","onChangeRef","onErrorRef","current","emittedRef","commit","useCallback","updater","next","map","entry","filter","Boolean","getUploaded","patchEntry","patch","prev","abortUpload","_uploadersRef$current","_sessionsRef$current$","get","delete","set","releasePreview","URL","revokeObjectURL","syncError","_onErrorRef$current","_entriesRef$current$f","_entriesRef$current$f2","find","useEffect","forEach","uploader","clear","startUpload","_sessionsRef$current$2","session","_onFinishS3Put","_getSignedUrl","isCurrent","fail","message","_onErrorRef$current2","storedKey","S3Upload","files","preprocess","target","onProgress","getSignedUrl","_asyncToGenerator","_regeneratorRuntime","mark","_callee","callback","_data","wrap","_context","getS3SignedUrl","data","sent","file_name","signedUrl","signed_url","t0","stop","_x","_x2","apply","this","arguments","onFinishS3Put","_callee2","_context2","getSignedLink","abrupt","size","addLinkedImage","_onErrorRef$current3","getUrlFileName","length","some","_entry$uploaded","_toConsumableArray","addStoredFiles","_ref2","_onErrorRef$current5","_entriesRef$current$f3","fresh","room","_onErrorRef$current4","accepted","signed","attachments","added","failed","overflow","_context3","index","list","_entry$uploaded2","fileName","findIndex","other","slice","Promise","all","then","catch","fitting","Math","max","_callee3","_x3","addFiles","_onErrorRef$current7","_ref3","_entriesRef$current$f4","_entriesRef$current$f5","supported","split","rule","trim","toLowerCase","endsWith","getAttachmentKind","isAcceptedType","unsupported","tooMany","_onErrorRef$current6","kind","isTooLarge","createObjectURL","handleFileSelect","event","_event$target$files","Array","from","openFileDialog","_fileInputRef$current","click","removeAttachment","key","String","handleRetry","item","reorderAttachments","orderedIds","byId","reordered","missing","clearAttachments","_onErrorRef$current8","_onErrorRef$current9","a","b","every","_useState3","reduce","acc","src","peekSignedLink","_useState4","storedSrcs","setStoredSrcs","storedSrcsRef","storedNames","join","pending","isActive","console","resolved","_objectSpread","Object","fromEntries","items","_entry$error","push","hideDownload","undefined","stored","count","isFull"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useAttachmentUpload.js","sources":["../../../src/components/CommentComposer/useAttachmentUpload.ts"],"sourcesContent":["import { ChangeEvent, useCallback, useEffect, useRef, useState } from 'react';\nimport S3Upload from 'react-s3-uploader/s3upload';\n\nimport type {\n AttachmentKind,\n AttachmentPreviewItem,\n} from '../AttachmentPreview/AttachmentPreview.types';\nimport { getAttachmentKind } from '../AttachmentPreview/getAttachmentKind';\nimport { ACCEPTED_ATTACHMENT_TYPES } from '../AttachFileButton';\n\nimport { getS3SignedUrl } from '~/clients/jsonApi';\nimport { getUrlFileName } from '~/utils/links';\nimport { getSignedLink, peekSignedLink } from '~/utils/signedLinkCache';\n\nexport type UploadedAttachment = {\n url: string;\n name: string;\n size?: number;\n};\n\ntype UseAttachmentUploadOptions = {\n value: UploadedAttachment[];\n onChange: (attachments: UploadedAttachment[]) => void;\n onError?: (message: string | null) => void;\n maxSizeBytes?: number;\n maxFiles?: number;\n /** Mirrors the file input's `accept`; also gates drag-and-drop. */\n accept?: string;\n};\n\n/** A picked or already-stored file, in the order the user arranged it. */\ntype Entry = {\n id: string;\n name: string;\n /** Set while the file is local; cleared entries come from `value`. */\n file: File | null;\n previewUrl: string;\n isUploading: boolean;\n error: string | null;\n uploaded: UploadedAttachment | null;\n};\n\nexport const DEFAULT_MAX_ATTACHMENTS = 10;\n\n/** Same rules the file input enforces via `accept`, so drag-and-drop can't smuggle a type past it. */\nconst isAcceptedType = (file: File, accept: string) =>\n accept\n .split(',')\n .map(rule => rule.trim().toLowerCase())\n .filter(Boolean)\n .some(rule => {\n if (rule.startsWith('.')) return file.name.toLowerCase().endsWith(rule);\n if (rule.endsWith('/*')) {\n const type = file.type.toLowerCase();\n if (type) return type.startsWith(rule.slice(0, -1));\n\n return getAttachmentKind({ name: file.name }) === rule.slice(0, -1);\n }\n\n return file.type.toLowerCase() === rule;\n });\n\nconst getFileKind = (file: File): AttachmentKind => {\n if (file.type.startsWith('image/')) return 'image';\n if (file.type.startsWith('video/')) return 'video';\n return 'file';\n};\n\nconst formatMb = (bytes: number) => (bytes / (1024 * 1024)).toFixed(1);\n\nconst getUploaded = (entries: Entry[]) =>\n entries.map(entry => entry.uploaded).filter(Boolean) as UploadedAttachment[];\n\nconst isSameList = (a: UploadedAttachment[], b: UploadedAttachment[]) =>\n a.length === b.length && a.every((item, index) => item.url === b[index].url);\n\nconst toStoredEntry = (attachment: UploadedAttachment): Entry => ({\n id: attachment.url,\n name: attachment.name,\n file: null,\n previewUrl: '',\n isUploading: false,\n error: null,\n uploaded: attachment,\n});\n\nlet entrySeq = 0;\nconst nextEntryId = () => {\n entrySeq += 1;\n return `attachment-${entrySeq}`;\n};\n\nexport const useAttachmentUpload = ({\n value,\n onChange,\n onError,\n maxSizeBytes,\n maxFiles = DEFAULT_MAX_ATTACHMENTS,\n accept = ACCEPTED_ATTACHMENT_TYPES,\n}: UseAttachmentUploadOptions) => {\n const [entries, setEntries] = useState<Entry[]>([]);\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n const uploadersRef = useRef(new Map<string, S3Upload>());\n // Bumped per attempt so a superseded upload can't write state for a restarted entry.\n const sessionsRef = useRef(new Map<string, number>());\n // Mutations are driven from async upload callbacks, so the latest list lives in a ref.\n const entriesRef = useRef<Entry[]>([]);\n const onChangeRef = useRef(onChange);\n const onErrorRef = useRef(onError);\n\n onChangeRef.current = onChange;\n onErrorRef.current = onError;\n\n // What we last handed the parent. A `value` that still matches it is our own change echoing\n // back; anything else is a parent-driven reset we must adopt.\n const emittedRef = useRef<UploadedAttachment[]>([]);\n\n const commit = useCallback((updater: (prev: Entry[]) => Entry[]) => {\n const next = updater(entriesRef.current);\n entriesRef.current = next;\n setEntries(next);\n emittedRef.current = getUploaded(next);\n onChangeRef.current(emittedRef.current);\n }, []);\n\n const patchEntry = useCallback(\n (id: string, patch: Partial<Entry>) =>\n commit(prev => prev.map(entry => (entry.id === id ? { ...entry, ...patch } : entry))),\n [commit]\n );\n\n const abortUpload = useCallback((id: string) => {\n uploadersRef.current.get(id)?.abortUpload();\n uploadersRef.current.delete(id);\n // Bump, never delete: deleting would let the next attempt reuse session 1, so a callback\n // still in flight from the aborted attempt would pass `isCurrent` and clobber it.\n sessionsRef.current.set(id, (sessionsRef.current.get(id) ?? 0) + 1);\n }, []);\n\n const releasePreview = useCallback((entry?: Entry) => {\n if (entry?.previewUrl) URL.revokeObjectURL(entry.previewUrl);\n }, []);\n\n // The banner is shared by every tile, so recompute it rather than clear it — one file\n // succeeding must not hide a sibling that is still failing.\n const syncError = useCallback(() => {\n onErrorRef.current?.(entriesRef.current.find(entry => entry.error)?.error ?? null);\n }, []);\n\n useEffect(\n () => () => {\n uploadersRef.current.forEach(uploader => uploader.abortUpload());\n uploadersRef.current.clear();\n entriesRef.current.forEach(entry => {\n if (entry.previewUrl) URL.revokeObjectURL(entry.previewUrl);\n });\n },\n []\n );\n\n const startUpload = useCallback(\n (id: string, file: File) => {\n const session = (sessionsRef.current.get(id) ?? 0) + 1;\n sessionsRef.current.set(id, session);\n // A superseded upload must not write state for an entry that is gone or restarted.\n const isCurrent = () => sessionsRef.current.get(id) === session;\n\n const fail = (message: string) => {\n if (!isCurrent()) return;\n patchEntry(id, { isUploading: false, error: message });\n onErrorRef.current?.(message);\n };\n\n let storedKey = '';\n\n const uploader = new S3Upload({\n files: [file],\n preprocess: (target: File, next: (file: File) => void) => next(target),\n onProgress: () => {},\n getSignedUrl: async (\n target: File,\n callback: (data: { signedUrl: string; [key: string]: unknown }) => void\n ) => {\n try {\n const data = await getS3SignedUrl(target.name, target.type);\n storedKey = data.file_name;\n callback({ ...data, signedUrl: data.signed_url });\n } catch (e) {\n fail((e as Error)?.message || 'Failed to upload the file');\n }\n },\n onFinishS3Put: async () => {\n try {\n const url = await getSignedLink(storedKey);\n if (!isCurrent()) return;\n\n uploadersRef.current.delete(id);\n patchEntry(id, {\n isUploading: false,\n error: null,\n uploaded: { url, name: storedKey, size: file.size },\n });\n syncError();\n } catch (e) {\n fail((e as Error)?.message || 'Failed to upload the file');\n }\n },\n onError: (message: string) => fail(message || 'Failed to upload the file'),\n });\n\n uploadersRef.current.set(id, uploader);\n },\n [patchEntry, syncError]\n );\n\n /** Nothing is uploaded: a comment attachment is a url, so the link itself is the attachment. */\n const addLinkedImage = useCallback(\n (url: string) => {\n const name = getUrlFileName(url);\n\n if (!name) return;\n if (entriesRef.current.length >= maxFiles) {\n onErrorRef.current?.(`You can attach up to ${maxFiles} files.`);\n\n return;\n }\n\n if (entriesRef.current.some(entry => entry.uploaded?.url === url)) return;\n\n commit(prev => [\n ...prev,\n {\n id: nextEntryId(),\n name,\n file: null,\n previewUrl: url,\n isUploading: false,\n error: null,\n uploaded: { url, name },\n },\n ]);\n },\n [commit, maxFiles]\n );\n\n /** Attaches files already in S3 (e.g. Wellhub picks): nothing to upload, the key is signed. */\n const addStoredFiles = useCallback(\n async (files: { fileName: string; size?: number }[]) => {\n const fresh = files.filter(\n (file, index, list) =>\n !entriesRef.current.some(entry => entry.uploaded?.name === file.fileName) &&\n list.findIndex(other => other.fileName === file.fileName) === index\n );\n if (!fresh.length) return;\n\n const room = maxFiles - entriesRef.current.length;\n if (room <= 0) {\n onErrorRef.current?.(`You can attach up to ${maxFiles} files.`);\n\n return;\n }\n\n const accepted = fresh.slice(0, room);\n const signed = await Promise.all(\n accepted.map(file =>\n getSignedLink(file.fileName)\n .then(url => ({ url, name: file.fileName, size: file.size }))\n .catch(() => null)\n )\n );\n const attachments = signed.filter(Boolean) as UploadedAttachment[];\n\n // Files may have been dropped in while the keys were signing, so re-check the room.\n let added = 0;\n if (attachments.length) {\n commit(prev => {\n const fitting = attachments.slice(0, Math.max(maxFiles - prev.length, 0));\n added = fitting.length;\n\n return [\n ...prev,\n ...fitting.map(attachment => ({ ...toStoredEntry(attachment), id: nextEntryId() })),\n ];\n });\n }\n\n const failed = signed.length - attachments.length;\n const overflow = fresh.length > accepted.length || added < attachments.length;\n onErrorRef.current?.(\n (failed &&\n `Could not attach ${failed === 1 ? 'a file' : `${failed} files`} from Wellhub.`) ||\n (overflow && `You can attach up to ${maxFiles} files.`) ||\n entriesRef.current.find(entry => entry.error)?.error ||\n null\n );\n },\n [commit, maxFiles]\n );\n\n const addFiles = useCallback(\n (files: File[]) => {\n const supported = files.filter(file => isAcceptedType(file, accept));\n const skipped = supported.length < files.length;\n // One banner, one message: report the most actionable reason once, at the end. Reporting\n // as we go would let a later call overwrite an earlier warning on a mixed drop.\n const unsupported = skipped\n ? (files.length === 1 && 'That file type is not supported.') ||\n 'Some files were skipped — unsupported file type.'\n : null;\n const tooMany = `You can attach up to ${maxFiles} files.`;\n\n const room = maxFiles - entriesRef.current.length;\n if (!supported.length || room <= 0) {\n onErrorRef.current?.(supported.length ? tooMany : unsupported);\n return;\n }\n\n const accepted = supported.slice(0, room);\n const added: Entry[] = accepted.map(file => {\n const isTooLarge = !!maxSizeBytes && file.size > maxSizeBytes;\n\n return {\n id: nextEntryId(),\n name: file.name,\n file,\n // Every kind gets an object url: media paints its thumbnail from it, and the\n // lightbox's document viewers read a draft pdf/csv/text through it — without one\n // the preview reports the file as unopenable until the comment is sent.\n previewUrl: URL.createObjectURL(file),\n isUploading: !isTooLarge,\n error: isTooLarge\n ? `File is too large (${formatMb(file.size)} MB). Maximum size is ${formatMb(\n maxSizeBytes as number\n )} MB.`\n : null,\n uploaded: null,\n };\n });\n\n commit(prev => [...prev, ...added]);\n\n const overflow = supported.length > accepted.length ? tooMany : null;\n onErrorRef.current?.(\n entriesRef.current.find(entry => entry.error)?.error ?? unsupported ?? overflow\n );\n\n added\n .filter(entry => !entry.error)\n .forEach(entry => startUpload(entry.id, entry.file as File));\n },\n [commit, maxFiles, maxSizeBytes, startUpload, accept]\n );\n\n const handleFileSelect = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(event.target.files ?? []);\n // Reset the input so re-picking the same file still fires a change event.\n if (fileInputRef.current) fileInputRef.current.value = '';\n if (files.length) addFiles(files);\n },\n [addFiles]\n );\n\n const openFileDialog = useCallback(() => fileInputRef.current?.click(), []);\n\n const removeAttachment = useCallback(\n (id: AttachmentPreviewItem['id']) => {\n const key = String(id);\n abortUpload(key);\n releasePreview(entriesRef.current.find(entry => entry.id === key));\n commit(prev => prev.filter(entry => entry.id !== key));\n syncError();\n },\n [abortUpload, releasePreview, commit, syncError]\n );\n\n const handleRetry = useCallback(\n (id: AttachmentPreviewItem['id']) => {\n const key = String(id);\n const entry = entriesRef.current.find(item => item.id === key);\n if (!entry?.file) return;\n\n abortUpload(key);\n patchEntry(key, { isUploading: true, error: null });\n syncError();\n startUpload(key, entry.file);\n },\n [abortUpload, patchEntry, startUpload, syncError]\n );\n\n const reorderAttachments = useCallback(\n (orderedIds: AttachmentPreviewItem['id'][]) =>\n commit(prev => {\n const byId = new Map(prev.map(entry => [entry.id, entry]));\n const reordered = orderedIds.map(id => byId.get(String(id))).filter(Boolean) as Entry[];\n // Unlisted ids (a race with a removal) keep their place at the end.\n const missing = prev.filter(entry => !orderedIds.some(id => String(id) === entry.id));\n return [...reordered, ...missing];\n }),\n [commit]\n );\n\n const clearAttachments = useCallback(() => {\n entriesRef.current.forEach(entry => {\n abortUpload(entry.id);\n releasePreview(entry);\n });\n commit(() => []);\n onErrorRef.current?.(null);\n }, [abortUpload, commit, releasePreview]);\n\n // Adopt a value we didn't produce — an edit form's initial attachments, or a parent-side reset.\n // Compared against what we emitted, not against the current entries: a failed-only or\n // mid-upload list emits `[]` too, and treating that as \"in sync\" would strand those tiles\n // on screen and let a late upload write itself back into freshly reset parent state.\n useEffect(() => {\n if (isSameList(emittedRef.current, value)) return;\n\n entriesRef.current.forEach(entry => {\n abortUpload(entry.id);\n if (entry.previewUrl) URL.revokeObjectURL(entry.previewUrl);\n });\n entriesRef.current = value.map(toStoredEntry);\n emittedRef.current = value;\n setEntries(entriesRef.current);\n onErrorRef.current?.(null);\n }, [value, abortUpload]);\n\n // A stored url has expired by now, so re-sign it for the preview.\n const [storedSrcs, setStoredSrcs] = useState<Record<string, string>>(() =>\n value.reduce<Record<string, string>>((acc, attachment) => {\n const src = peekSignedLink(attachment.name, 'inline');\n if (src) acc[attachment.name] = src;\n\n return acc;\n }, {})\n );\n const storedSrcsRef = useRef(storedSrcs);\n storedSrcsRef.current = storedSrcs;\n\n const storedNames = entries\n // A linked image carries its own url, so there is no key of ours to sign.\n .filter(entry => !entry.file && !entry.previewUrl && entry.uploaded)\n .map(entry => (entry.uploaded as UploadedAttachment).name)\n .join('|');\n\n useEffect(() => {\n const pending = storedNames.split('|').filter(name => name && !(name in storedSrcsRef.current));\n if (!pending.length) return undefined;\n\n let isActive = true;\n Promise.all(\n pending.map(name =>\n getSignedLink(name, 'inline')\n .then(url => [name, url] as const)\n .catch(error => {\n console.error(`Failed to sign stored attachment \"${name}\"`, error);\n\n return [name, ''] as const;\n })\n )\n ).then(resolved => {\n if (isActive) setStoredSrcs(prev => ({ ...prev, ...Object.fromEntries(resolved) }));\n });\n\n return () => {\n isActive = false;\n };\n }, [storedNames]);\n\n const items = entries.reduce<AttachmentPreviewItem[]>((acc, entry) => {\n if (entry.file) {\n acc.push({\n id: entry.id,\n name: entry.name,\n src: entry.previewUrl,\n kind: getFileKind(entry.file),\n size: entry.file.size,\n isUploading: entry.isUploading,\n hideDownload: true,\n error: entry.error ?? undefined,\n });\n return acc;\n }\n\n const stored = entry.uploaded as UploadedAttachment;\n const kind = getAttachmentKind(stored);\n // A linked image is already a url; only one of ours has an S3 key worth signing.\n const src = entry.previewUrl || storedSrcs[stored.name];\n // A thumbnail without its signed url would paint as a broken image, so hold it back.\n if (kind !== 'file' && !src) return acc;\n\n acc.push({ id: entry.id, name: stored.name, src, kind, size: stored.size, hideDownload: true });\n return acc;\n }, []);\n\n return {\n items,\n fileInputRef,\n openFileDialog,\n handleFileSelect,\n addFiles,\n addLinkedImage,\n addStoredFiles,\n removeAttachment,\n handleRetry,\n reorderAttachments,\n clearAttachments,\n isUploading: entries.some(entry => entry.isUploading),\n error: entries.find(entry => entry.error)?.error ?? null,\n count: entries.length,\n isFull: entries.length >= maxFiles,\n maxFiles,\n };\n};\n"],"names":["DEFAULT_MAX_ATTACHMENTS","formatMb","bytes","toFixed","toStoredEntry","attachment","id","url","name","file","previewUrl","isUploading","error","uploaded","entrySeq","nextEntryId","concat","useAttachmentUpload","_ref","_entries$find$error","_entries$find","value","onChange","onError","maxSizeBytes","_ref$maxFiles","maxFiles","_ref$accept","accept","ACCEPTED_ATTACHMENT_TYPES","useState","_useState2","_slicedToArray","_useState","entries","setEntries","fileInputRef","useRef","uploadersRef","Map","sessionsRef","entriesRef","onChangeRef","onErrorRef","current","emittedRef","commit","useCallback","updater","next","map","entry","filter","Boolean","getUploaded","patchEntry","patch","prev","abortUpload","_uploadersRef$current","_sessionsRef$current$","get","delete","set","releasePreview","URL","revokeObjectURL","syncError","_onErrorRef$current","_entriesRef$current$f","_entriesRef$current$f2","find","useEffect","forEach","uploader","clear","startUpload","_sessionsRef$current$2","session","_onFinishS3Put","_getSignedUrl","isCurrent","fail","message","_onErrorRef$current2","storedKey","S3Upload","files","preprocess","target","onProgress","getSignedUrl","_asyncToGenerator","_regeneratorRuntime","mark","_callee","callback","_data","wrap","_context","getS3SignedUrl","type","data","sent","file_name","signedUrl","signed_url","t0","stop","_x","_x2","apply","this","arguments","onFinishS3Put","_callee2","_context2","getSignedLink","abrupt","size","addLinkedImage","_onErrorRef$current3","getUrlFileName","length","some","_entry$uploaded","_toConsumableArray","addStoredFiles","_ref2","_onErrorRef$current5","_entriesRef$current$f3","fresh","room","_onErrorRef$current4","accepted","signed","attachments","added","failed","overflow","_context3","index","list","_entry$uploaded2","fileName","findIndex","other","slice","Promise","all","then","catch","fitting","Math","max","_callee3","_x3","addFiles","_onErrorRef$current7","_ref3","_entriesRef$current$f4","_entriesRef$current$f5","supported","split","rule","trim","toLowerCase","startsWith","endsWith","getAttachmentKind","isAcceptedType","unsupported","tooMany","_onErrorRef$current6","isTooLarge","createObjectURL","handleFileSelect","event","_event$target$files","Array","from","openFileDialog","_fileInputRef$current","click","removeAttachment","key","String","handleRetry","item","reorderAttachments","orderedIds","byId","reordered","missing","clearAttachments","_onErrorRef$current8","_onErrorRef$current9","a","b","every","_useState3","reduce","acc","src","peekSignedLink","_useState4","storedSrcs","setStoredSrcs","storedSrcsRef","storedNames","join","pending","isActive","console","resolved","_objectSpread","Object","fromEntries","items","_entry$error","push","kind","hideDownload","undefined","stored","count","isFull"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppSettingsDialog.d.ts","sourceRoot":"","sources":["../../../../../../src/components/DevCenter/DevCenterAppContainer/components/AppSettingsDialog/AppSettingsDialog.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,EAAE,EAAa,MAAM,OAAO,CAAC;AAO1D,OAAO,KAAK,EACV,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EAClB,MAAM,aAAa,CAAC;AAyBrB,eAAO,MAAM,SAAS,mBAAmB,CAAC;AAM1C,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE5B,MAAM,MAAM,yBAAyB,GAAG;IACtC,GAAG,EAAE,oBAAoB,CAAC;IAC1B,OAAO,EAAE,YAAY,CAAC;IACtB,WAAW,EAAE,oBAAoB,CAAC;IAClC,iBAAiB,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC7C,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACxD,gBAAgB,EAAE,CAAC,QAAQ,EAAE,WAAW,KAAK,IAAI,CAAC;IAClD,QAAQ,EAAE,WAAW,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,oBAAoB,CAAC,EAAE,aAAa,CAAC,yBAAyB,CAAC,GAAG,IAAI,CAAC;IACvE,GAAG,EAAE,oBAAoB,CAAC;IAC1B,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,oBAAoB,CAAC;IAClC,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,UAAU,EAAE,OAAO,CAAC;IACpB,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,iBAAiB,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC7C,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,gBAAgB,EAAE,CAAC,QAAQ,EAAE,WAAW,KAAK,IAAI,CAAC;IAClD,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC/B,uBAAuB,EAAE,MAAM,IAAI,CAAC;CACrC,CAAC;
|
|
1
|
+
{"version":3,"file":"AppSettingsDialog.d.ts","sourceRoot":"","sources":["../../../../../../src/components/DevCenter/DevCenterAppContainer/components/AppSettingsDialog/AppSettingsDialog.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,EAAE,EAAa,MAAM,OAAO,CAAC;AAO1D,OAAO,KAAK,EACV,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EAClB,MAAM,aAAa,CAAC;AAyBrB,eAAO,MAAM,SAAS,mBAAmB,CAAC;AAM1C,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE5B,MAAM,MAAM,yBAAyB,GAAG;IACtC,GAAG,EAAE,oBAAoB,CAAC;IAC1B,OAAO,EAAE,YAAY,CAAC;IACtB,WAAW,EAAE,oBAAoB,CAAC;IAClC,iBAAiB,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC7C,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACxD,gBAAgB,EAAE,CAAC,QAAQ,EAAE,WAAW,KAAK,IAAI,CAAC;IAClD,QAAQ,EAAE,WAAW,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,oBAAoB,CAAC,EAAE,aAAa,CAAC,yBAAyB,CAAC,GAAG,IAAI,CAAC;IACvE,GAAG,EAAE,oBAAoB,CAAC;IAC1B,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,oBAAoB,CAAC;IAClC,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,UAAU,EAAE,OAAO,CAAC;IACpB,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,iBAAiB,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC7C,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,gBAAgB,EAAE,CAAC,QAAQ,EAAE,WAAW,KAAK,IAAI,CAAC;IAClD,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC/B,uBAAuB,EAAE,MAAM,IAAI,CAAC;CACrC,CAAC;AAkBF,QAAA,MAAM,iBAAiB,EAAE,EAAE,CAAC,sBAAsB,CAuSjD,CAAC;eAEa,iBAAiB"}
|
package/components/DevCenter/DevCenterAppContainer/components/AppSettingsDialog/AppSettingsDialog.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import o from"@babel/runtime/helpers/defineProperty";import s from"@babel/runtime/helpers/slicedToArray";import{useState as i,useRef as n,useEffect as t}from"react";import{cloneDeep as e,debounce as c,noop as r,mapValues as m,keyBy as p}from"lodash";import{FormControl as a,InputLabel as l,Select as u,MenuItem as d}from"@material-ui/core";import{ArrowForward as j}from"@material-ui/icons";import g from"../../../../EmptyState/EmptyState.js";import{getIsSustainabilityApp as f}from"../../utils.js";import I from"./components/RemoveAppButton.js";import{SettingsAccordion as v}from"./components/SettingsAccordion.js";import{useStyles as h}from"./styles.js";import"@babel/runtime/helpers/objectWithoutProperties";import"@material-ui/pickers";import"@date-io/moment";import"moment";import"../../../../../config/theme/index.js";import{jsxs as C,jsx as y,Fragment as b}from"react/jsx-runtime";import A from"../../../../../hocs/withAssetEditorLockHOC.js";import S from"../../../../ErrorBoundary/ErrorBoundary.js";import O from"../../../../ErrorBoundary/DevCenterAppErrorView/DevCenterAppErrorView.js";import k from"../../../../Button/components/Button/index.js";import"moment-timezone";import"classnames";import"../../../../Button/components/LiveButton/components/LiveButtonStateIndicator/index.js";import"../../../../Button/components/LiveButton/styles.js";import"@icon-park/react/es/all";import"../../../../../icons/IconParkProvider.js";import"../../../../../icons/customIcons/icons/AddMessage.js";import"../../../../../icons/customIcons/icons/DragOne.js";import"../../../../../icons/customIcons/icons/Attention.js";import"../../../../../icons/customIcons/icons/Collapse.js";import"../../../../../icons/customIcons/icons/Dashboard.js";import"../../../../../icons/customIcons/icons/Expand.js";import"../../../../../icons/customIcons/icons/FolderClosed.js";import"../../../../../icons/customIcons/icons/FolderClosedFilled.js";import"../../../../../icons/customIcons/icons/FolderOpened.js";import"../../../../../icons/customIcons/icons/GreaterOrEqual.js";import"../../../../../icons/customIcons/icons/LessOrEqual.js";import"../../../../../icons/customIcons/icons/Search.js";import"../../../../../icons/customIcons/icons/SearchOne.js";import"../../../../../icons/customIcons/icons/Wellhub.js";import"../../../../../icons/customIcons/icons/MultiRuler.js";import"../../../../../icons/customIcons/icons/Checkbox.js";import"../../../../../icons/customIcons/icons/CheckboxChecked.js";import"../../../../../icons/customIcons/icons/CheckboxIndeterminate.js";import"../../../../../icons/customIcons/icons/Radio.js";import"../../../../../icons/customIcons/icons/RadioChecked.js";import"../../../../../icons/customIcons/icons/SimulFrac.js";import"../../../../../icons/customIcons/icons/ZipperFrac.js";import"../../../../../icons/customIcons/icons/CautionFilled.js";import"../../../../../icons/customIcons/icons/InfoRounded.js";import"../../../../../icons/customIcons/icons/FlameFilled.js";import"../../../../../icons/customIcons/icons/MoreApp.js";import"../../../../../icons/customIcons/icons/Pad.js";import"../../../../../icons/customIcons/icons/DrilloutUnit.js";import"../../../../../icons/customIcons/icons/FracFleet.js";import"../../../../../icons/customIcons/icons/Global.js";import"../../../../../icons/customIcons/icons/Program.js";import"../../../../../icons/customIcons/icons/Rig.js";import"../../../../../icons/customIcons/icons/Well.js";import"../../../../../icons/customIcons/icons/Gap.js";import"../../../../../icons/customIcons/icons/Pin.js";import"../../../../../icons/customIcons/icons/PinOne.js";import"../../../../../icons/customIcons/icons/PinOneCrossed.js";import"../../../../../icons/customIcons/icons/CloseOneFilled.js";import"../../../../../icons/customIcons/icons/AttentionFilled.js";import"../../../../../icons/customIcons/icons/CheckOneFilled.js";import"../../../../../icons/customIcons/icons/Archive.js";import"../../../../../icons/customIcons/icons/ArchiveCancel.js";import"../../../../../icons/customIcons/icons/Unarchive.js";import"../../../../../icons/customIcons/icons/Archived.js";import"../../../../../icons/customIcons/icons/InterventionUnit.js";import"../../../../../icons/customIcons/icons/CloudDelete.js";import"../../../../../icons/customIcons/icons/Lasso.js";import"../../../../../icons/customIcons/icons/Radius.js";import"../../../../../icons/customIcons/icons/ErrorOps.js";import"../../../../../icons/customIcons/icons/DataTypeOps.js";import"../../../../../icons/customIcons/icons/FalsePositiveOps.js";import"../../../../../icons/customIcons/icons/CalibrationOps.js";import"../../../../../icons/customIcons/icons/CriticalOps.js";import"../../../../../icons/customIcons/icons/Company.js";import"../../../../../icons/customIcons/icons/ArchiveOne.js";import"../../../../../icons/customIcons/icons/ParseBotFusion.js";import"../../../../../icons/customIcons/icons/Connect.js";import"../../../../../icons/customIcons/icons/PuzzleOne.js";import"../../../../../icons/customIcons/icons/Feed.js";import"../../../../../icons/customIcons/icons/Prompt.js";import"../../../../../icons/customIcons/icons/Companies.js";import"../../../../../icons/customIcons/icons/ClipboardAi.js";import"../../../../../icons/customIcons/icons/Key.js";import"../../../../../icons/customIcons/icons/AtSignCrossed.js";import"../../../../../icons/customIcons/icons/MappingManual.js";import"../../../../../icons/customIcons/icons/Mapping.js";import"../../../../../icons/customIcons/icons/Metrics.js";import"../../../../../icons/customIcons/icons/Drops.js";import"../../../../../icons/customIcons/icons/ClipboardSearch.js";import"../../../../../icons/customIcons/icons/Template.js";import"../../../../../icons/customIcons/icons/ClipboardMetrics.js";import"../../../../../icons/customIcons/icons/ClipboardBuilder.js";import"../../../../../icons/customIcons/icons/UnitConversion.js";import"../../../../../icons/customIcons/icons/NPT.js";import"../../../../../icons/customIcons/icons/GuidedFrac.js";import P from"../../../../Modal/Modal.js";import{DEV_CENTER_CLI_APP_ID as D}from"../../../../../constants/devcenter.js";import"../../../../../constants/goals.js";import{SEGMENTS as E,SEGMENT_TO_ASSET_TYPE as N}from"../../../../../constants/segment.js";import"../../../../../constants/alerts.js";import"../../../../../constants/apps.js";import"../../../../../constants/drillstring.js";import"../../../../../constants/completion.js";import"../../../../../constants/appPackages.js";import"../../../../../constants/notifications.js";import"../../../../../constants/feed.js";import"../../../../../constants/bha.js";import{ASSET_TYPES as x}from"../../../../../constants/assetTypes.js";import"../../../../../constants/corvaCompanyId.js";import"../../../../GradientManager/configuration/constants.js";import w from"../../../../AssetEditorV2/index.js";import F from"../../../../AppVersionsSelect/AppVersionsSelect.js";import R from"../../../../DisabledSettingsMessage/DisabledSettingsMessage.js";import B from"../../../../ConfirmationDialog.js";import"../../../../UserMention/utils/index.js";import"../../../../../utils/convert.js";import"@babel/runtime/helpers/asyncToGenerator";import"@babel/runtime/regenerator";import"../../../../../utils/casing/validation.js";import"lodash/mean";import"../../../../../constants/streamSourceType.js";import"lodash/get";import"file-saver";import{getAppSegment as M}from"../../../../../utils/devcenter.js";import"../../../../../utils/drillstring/conversion.js";import"lodash/set";import"lodash/cloneDeep";import"@babel/runtime/helpers/toConsumableArray";import"lodash/isNumber";import"lodash/has";import"../../../../../utils/ga.js";import"../../../../../utils/goalsConfig/goalsConfig.js";import"../../../../../utils/lasParser.js";import"../../../../../utils/main.js";import"../../../../../utils/metrics/metricsConfig.js";import{isInsideNewMobileApp as T}from"../../../../../utils/mobileDetect.js";import"../../../../../utils/feed.js";import"../../../../../utils/reports.js";import{showSuccessNotification as V}from"../../../../../utils/notificationToasts.js";import"@babel/runtime/helpers/typeof";import"../../../../../utils/dashboardReports.js";import"../../../../../utils/env.js";import"file-extension";import"image-extensions";import"video-extensions";import"../../../../../utils/jsonaDataFormatter.js";import"../../../../../utils/bha.js";import"jsona";import"../../../../../clients/jsonApi/index.js";import"../../../../../utils/charts/Styles.scss.js";import"../../../../../utils/getSingleAsset.js";import{AppIcon as L}from"../../../../AppIcon/AppIcon.js";import U from"../../../../../permissions/usePermissions.js";import{PERMISSIONS as G}from"../../../../../permissions/constants/index.js";import"../../../../../permissions/withPermissionsHOC.js";import"../../../../../permissions/ProvidePermissions.js";import"../../../../../permissions/PermissionsContext.js";import{HideInNativeApp as H}from"../../../../../componentsV2/HideInNativeApp/index.js";import{isReact18Host as _}from"../../../../../componentsV2/AppHeader/V3/VersionSelect/VersionSelect.constants.js";function q(o,s){var i=Object.keys(o);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(o);s&&(n=n.filter((function(s){return Object.getOwnPropertyDescriptor(o,s).enumerable}))),i.push.apply(i,n)}return i}function z(s){for(var i=1;i<arguments.length;i++){var n=null!=arguments[i]?arguments[i]:{};i%2?q(Object(n),!0).forEach((function(i){o(s,i,n[i])})):Object.getOwnPropertyDescriptors?Object.defineProperties(s,Object.getOwnPropertyDescriptors(n)):q(Object(n)).forEach((function(o){Object.defineProperty(s,o,Object.getOwnPropertyDescriptor(n,o))}))}return s}var W="DC_appSettings",K=function(){return null},Z=A(w),J=w,Q=R,X=N,Y=function(){return null},$=function(A){var N,w,R,q,$,oo,so=A.AppSettingsComponent,io=void 0===so?Y:so,no=A.app,to=A.appData,eo=A.appName,co=A.currentUser,ro=A.disableAppAssetSelection,mo=void 0!==ro&&ro,po=A.isMultiRig,ao=A.isSettingsDialogHidden,lo=void 0!==ao&&ao,uo=A.layoutEnvironment,jo=A.onAppRemove,go=A.onCloneDashboard,fo=void 0===go?r:go,Io=A.onSettingsChange,vo=A.openIntercom,ho=A.rigId,Co=A.toggleAppSettingsDialog,yo=M(no),bo=i("string"==typeof yo?yo:E.DRILLING),Ao=s(bo,2),So=Ao[0],Oo=Ao[1],ko=i(!1),Po=s(ko,2),Do=Po[0],Eo=Po[1],No=i(!0),xo=s(No,2),wo=xo[0],Fo=xo[1],Ro=i(""),Bo=s(Ro,2),Mo=Bo[0],To=Bo[1],Vo=i((function(){var o,s,i=e(null!==(o=no.settings)&&void 0!==o?o:{}),n="string"==typeof i.package?i.package:void 0,t="string"==typeof(null===(s=no.package)||void 0===s?void 0:s.version)?no.package.version:void 0;return z(z({},i),{},{package:n||t})})),Lo=s(Vo,2),Uo=Lo[0],Go=Lo[1],Ho=n(ho),_o=n(null),qo=n(null),zo=U([G.getCanReadAppPackages(no.app.id)]),Wo=s(zo,1)[0],Ko=Wo.active,Zo=Wo.loading,Jo=Array.isArray(no.segment)?no.segment.filter((function(o){return"string"==typeof o})):[],Qo=Jo.length>1,Xo=So===E.COMPLETION,Yo=X[So],$o="asset"===(null==uo?void 0:uo.type),os=no.id===D,ss=f(null==no||null===(N=no.app)||void 0===N?void 0:N.id),is=!(mo||T||po||$o&&Xo),ns=!T&&!lo&&!!jo,ts=Zo||Ko||Boolean(null===(w=_o.current)||void 0===w?void 0:w.clientHeight),es=Boolean(null===(R=qo.current)||void 0===R?void 0:R.clientHeight),cs=ts&&es,rs=$o?Z:J,ms="string"==typeof no.app.app_key?no.app.app_key:null,ps="string"==typeof Uo.package?Uo.package:void 0,as=h({isCompletionApp:Xo,isSustainabilityApp:ss,isAccordionRequired:cs,isRemoveButtonVisible:ns}),ls=function(s,i){return Go((function(n){return z(z({},n),{},o({},s,i))}))},us=function(o){return Go((function(s){return z(z({},s),o)}))};t((function(){wo||Fo(!0)}),[wo]),t((function(){c(Eo,200)(!0)}),[]);var ds=C("div",{className:as.modalTitleContainer,children:[y(L,{className:as.appIcon,segment:[So],iconUrl:null==no||null===(q=no.app)||void 0===q||null===($=q.icon)||void 0===$?void 0:$.url,height:48,width:48}),C("div",{children:[y("div",{children:"".concat(eo," Settings")}),y(H,{children:C("div",{"data-testid":"".concat(W,"_appstoreLink"),className:as.appStoreButton,onClick:function(){var o,s;return window.open((s=null==no||null===(o=no.app)||void 0===o?void 0:o.id,"/app-store/app/".concat(s)),"_top")},children:["Open in Appstore ",y(j,{className:as.arrowIcon})]})})]})]}),js=C("div",{className:as.modalActions,children:[ns&&y(I,{appName:eo,onAppRemove:jo}),C("div",{children:[y(k,{"data-testid":"".concat(W,"_cancel"),variation:"secondary",onClick:Co,children:"Cancel"}),lo&&y(k,{variation:"primary",onClick:function(){return fo()},children:"Copy Dashboard"}),!lo&&y(k,{"data-testid":"".concat(W,"_save"),className:as.saveButton,variation:"primary",onClick:function(){if(Uo.package||os){if(is&&!$o){var o,s,i,n,t=null==Yo||null===(o=Yo.primaryAsset)||void 0===o||null===(s=o.assetType)||void 0===s?void 0:s.id,e=null==Yo||null===(i=Yo.primaryAsset)||void 0===i||null===(n=i.assetType)||void 0===n?void 0:n.label;if(t&&!Uo[t])return void To("Please select ".concat(e))}Io(Uo),V("Successfully saved"),Co()}else To("Please select app version")},children:"Save"})]})]});return y(P,{actions:js,closeIconClassName:as.closeIcon,contentContainerClassName:as.modalContainer,modalTitleClassName:as.modalTitle,onClose:Co,open:!0,title:ds,children:C(S,{ErrorView:O,openIntercom:vo,children:[y(B,{open:!!Mo,isShowCancel:!1,title:"Validation failed",text:Mo,handleOk:function(){return To("")},classes:{confirmation:as.confirmationText}}),lo&&y(Q,{}),!lo&&Do&&!es&&!ts&&y(g,{image:g.IMAGES.UnderConstruction,title:"No app settings"}),!lo&&C(b,{children:[C(v,{defaultExpanded:!0,className:as.assetAccordion,accordionDetailsRef:_o,isAccordionRequired:cs,summary:"Asset",children:[Qo&&C(a,{className:as.segmentSelector,children:[y(l,{children:"Segment"}),y(u,{value:So,onChange:function(o){var s=String(o.target.value);Ho.current=null,Fo(!1),Oo(s),Go(z(z({package:Uo.package,segment:s},m(p(x,"id"),(function(){return null}))),{},{assets:null}))},children:Jo.map((function(o){return y(d,{className:as.segmentMenuItem,value:o,children:o},o)}))})]}),is&&wo&&y(rs,{appKey:os?null:ms,appType:Yo,defaultValue:Ho.current,secondaryDefaultValue:+(null==to||null===(oo=to.well)||void 0===oo?void 0:oo.id),isHiddenTitle:!0,isNullable:$o,label:"Asset",onSettingsChange:us,settings:Uo}),y(F,{className:as.appVersionSelect,appId:no.app.id,value:ps,onChange:function(o,s,i){return i&&_()?us({package:o,react18AutoSwitchDisabled:!0}):ls("package",o)}})]}),y(S,{ErrorView:K,openIntercom:vo,children:y(v,{accordionDetailsRef:qo,className:as.accordion,defaultExpanded:!0,isAccordionRequired:cs,summary:"App Settings",children:io&&y(io,{app:no,appData:to,settings:Uo,onSettingChange:ls,onSettingsChange:us,layoutEnvironment:uo,currentUser:co})})})]})]})})};export{W as PAGE_NAME,$ as default};
|
|
1
|
+
import o from"@babel/runtime/helpers/defineProperty";import s from"@babel/runtime/helpers/slicedToArray";import{useState as i,useRef as n,useEffect as t}from"react";import{cloneDeep as e,debounce as c,noop as r,mapValues as m,keyBy as p}from"lodash";import{FormControl as a,InputLabel as l,Select as u,MenuItem as d}from"@material-ui/core";import{ArrowForward as j}from"@material-ui/icons";import g from"../../../../EmptyState/EmptyState.js";import{getIsSustainabilityApp as f}from"../../utils.js";import I from"./components/RemoveAppButton.js";import{SettingsAccordion as v}from"./components/SettingsAccordion.js";import{useStyles as h}from"./styles.js";import"@babel/runtime/helpers/objectWithoutProperties";import"@material-ui/pickers";import"@date-io/moment";import"moment";import"../../../../../config/theme/index.js";import{jsxs as C,jsx as y,Fragment as b}from"react/jsx-runtime";import A from"../../../../../hocs/withAssetEditorLockHOC.js";import S from"../../../../ErrorBoundary/ErrorBoundary.js";import O from"../../../../ErrorBoundary/DevCenterAppErrorView/DevCenterAppErrorView.js";import k from"../../../../Button/components/Button/index.js";import"moment-timezone";import"classnames";import"../../../../Button/components/LiveButton/components/LiveButtonStateIndicator/index.js";import"../../../../Button/components/LiveButton/styles.js";import"@icon-park/react/es/all";import"../../../../../icons/IconParkProvider.js";import"../../../../../icons/customIcons/icons/AddMessage.js";import"../../../../../icons/customIcons/icons/DragOne.js";import"../../../../../icons/customIcons/icons/Attention.js";import"../../../../../icons/customIcons/icons/Collapse.js";import"../../../../../icons/customIcons/icons/Dashboard.js";import"../../../../../icons/customIcons/icons/Expand.js";import"../../../../../icons/customIcons/icons/FolderClosed.js";import"../../../../../icons/customIcons/icons/FolderClosedFilled.js";import"../../../../../icons/customIcons/icons/FolderOpened.js";import"../../../../../icons/customIcons/icons/GreaterOrEqual.js";import"../../../../../icons/customIcons/icons/LessOrEqual.js";import"../../../../../icons/customIcons/icons/Search.js";import"../../../../../icons/customIcons/icons/SearchOne.js";import"../../../../../icons/customIcons/icons/Wellhub.js";import"../../../../../icons/customIcons/icons/MultiRuler.js";import"../../../../../icons/customIcons/icons/Checkbox.js";import"../../../../../icons/customIcons/icons/CheckboxChecked.js";import"../../../../../icons/customIcons/icons/CheckboxIndeterminate.js";import"../../../../../icons/customIcons/icons/Radio.js";import"../../../../../icons/customIcons/icons/RadioChecked.js";import"../../../../../icons/customIcons/icons/SimulFrac.js";import"../../../../../icons/customIcons/icons/ZipperFrac.js";import"../../../../../icons/customIcons/icons/CautionFilled.js";import"../../../../../icons/customIcons/icons/InfoRounded.js";import"../../../../../icons/customIcons/icons/FlameFilled.js";import"../../../../../icons/customIcons/icons/MoreApp.js";import"../../../../../icons/customIcons/icons/Pad.js";import"../../../../../icons/customIcons/icons/DrilloutUnit.js";import"../../../../../icons/customIcons/icons/FracFleet.js";import"../../../../../icons/customIcons/icons/Global.js";import"../../../../../icons/customIcons/icons/Program.js";import"../../../../../icons/customIcons/icons/Rig.js";import"../../../../../icons/customIcons/icons/Well.js";import"../../../../../icons/customIcons/icons/Gap.js";import"../../../../../icons/customIcons/icons/Pin.js";import"../../../../../icons/customIcons/icons/PinOne.js";import"../../../../../icons/customIcons/icons/PinOneCrossed.js";import"../../../../../icons/customIcons/icons/CloseOneFilled.js";import"../../../../../icons/customIcons/icons/AttentionFilled.js";import"../../../../../icons/customIcons/icons/CheckOneFilled.js";import"../../../../../icons/customIcons/icons/Archive.js";import"../../../../../icons/customIcons/icons/ArchiveCancel.js";import"../../../../../icons/customIcons/icons/Unarchive.js";import"../../../../../icons/customIcons/icons/Archived.js";import"../../../../../icons/customIcons/icons/InterventionUnit.js";import"../../../../../icons/customIcons/icons/CloudDelete.js";import"../../../../../icons/customIcons/icons/Lasso.js";import"../../../../../icons/customIcons/icons/Radius.js";import"../../../../../icons/customIcons/icons/ErrorOps.js";import"../../../../../icons/customIcons/icons/DataTypeOps.js";import"../../../../../icons/customIcons/icons/FalsePositiveOps.js";import"../../../../../icons/customIcons/icons/CalibrationOps.js";import"../../../../../icons/customIcons/icons/CriticalOps.js";import"../../../../../icons/customIcons/icons/Company.js";import"../../../../../icons/customIcons/icons/ArchiveOne.js";import"../../../../../icons/customIcons/icons/ParseBotFusion.js";import"../../../../../icons/customIcons/icons/Connect.js";import"../../../../../icons/customIcons/icons/PuzzleOne.js";import"../../../../../icons/customIcons/icons/Feed.js";import"../../../../../icons/customIcons/icons/Prompt.js";import"../../../../../icons/customIcons/icons/Companies.js";import"../../../../../icons/customIcons/icons/ClipboardAi.js";import"../../../../../icons/customIcons/icons/Key.js";import"../../../../../icons/customIcons/icons/AtSignCrossed.js";import"../../../../../icons/customIcons/icons/MappingManual.js";import"../../../../../icons/customIcons/icons/Mapping.js";import"../../../../../icons/customIcons/icons/Metrics.js";import"../../../../../icons/customIcons/icons/Drops.js";import"../../../../../icons/customIcons/icons/ClipboardSearch.js";import"../../../../../icons/customIcons/icons/Template.js";import"../../../../../icons/customIcons/icons/ClipboardMetrics.js";import"../../../../../icons/customIcons/icons/ClipboardBuilder.js";import"../../../../../icons/customIcons/icons/UnitConversion.js";import"../../../../../icons/customIcons/icons/NPT.js";import"../../../../../icons/customIcons/icons/GuidedFrac.js";import P from"../../../../Modal/Modal.js";import{DEV_CENTER_CLI_APP_ID as D}from"../../../../../constants/devcenter.js";import"../../../../../constants/goals.js";import{SEGMENTS as E,SEGMENT_TO_ASSET_TYPE as N}from"../../../../../constants/segment.js";import"../../../../../constants/alerts.js";import"../../../../../constants/apps.js";import"../../../../../constants/drillstring.js";import"../../../../../constants/completion.js";import"../../../../../constants/appPackages.js";import"../../../../../constants/notifications.js";import"../../../../../constants/feed.js";import"../../../../../constants/bha.js";import{ASSET_TYPES as x}from"../../../../../constants/assetTypes.js";import"../../../../../constants/corvaCompanyId.js";import"../../../../GradientManager/configuration/constants.js";import w from"../../../../AssetEditorV2/index.js";import F from"../../../../AppVersionsSelect/AppVersionsSelect.js";import R from"../../../../DisabledSettingsMessage/DisabledSettingsMessage.js";import B from"../../../../ConfirmationDialog.js";import"../../../../UserMention/utils/index.js";import"../../../../../utils/convert.js";import"@babel/runtime/helpers/asyncToGenerator";import"@babel/runtime/regenerator";import"../../../../../utils/casing/validation.js";import"lodash/mean";import"../../../../../constants/streamSourceType.js";import"lodash/get";import"file-saver";import{getAppSegment as M}from"../../../../../utils/devcenter.js";import"../../../../../utils/drillstring/conversion.js";import"lodash/set";import"lodash/cloneDeep";import"@babel/runtime/helpers/toConsumableArray";import"lodash/isNumber";import"lodash/has";import"../../../../../utils/ga.js";import"../../../../../utils/goalsConfig/goalsConfig.js";import"../../../../../utils/lasParser.js";import"../../../../../utils/main.js";import"../../../../../utils/metrics/metricsConfig.js";import{isInsideNewMobileApp as T}from"../../../../../utils/mobileDetect.js";import"../../../../../utils/feed.js";import"../../../../../utils/reports.js";import{showSuccessNotification as V}from"../../../../../utils/notificationToasts.js";import"@babel/runtime/helpers/typeof";import"../../../../../utils/dashboardReports.js";import"../../../../../utils/env.js";import"file-extension";import"image-extensions";import"video-extensions";import"../../../../../utils/jsonaDataFormatter.js";import"../../../../../utils/bha.js";import"jsona";import"../../../../../clients/jsonApi/index.js";import"../../../../../utils/charts/Styles.scss.js";import"../../../../../utils/getSingleAsset.js";import{AppIcon as L}from"../../../../AppIcon/AppIcon.js";import U from"../../../../../permissions/usePermissions.js";import{PERMISSIONS as G}from"../../../../../permissions/constants/index.js";import"../../../../../permissions/withPermissionsHOC.js";import"../../../../../permissions/ProvidePermissions.js";import"../../../../../permissions/PermissionsContext.js";import{HideInNativeApp as H}from"../../../../../componentsV2/HideInNativeApp/index.js";import{isReact18Host as _}from"../../../../../componentsV2/AppHeader/V3/VersionSelect/VersionSelect.constants.js";function q(o,s){var i=Object.keys(o);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(o);s&&(n=n.filter((function(s){return Object.getOwnPropertyDescriptor(o,s).enumerable}))),i.push.apply(i,n)}return i}function z(s){for(var i=1;i<arguments.length;i++){var n=null!=arguments[i]?arguments[i]:{};i%2?q(Object(n),!0).forEach((function(i){o(s,i,n[i])})):Object.getOwnPropertyDescriptors?Object.defineProperties(s,Object.getOwnPropertyDescriptors(n)):q(Object(n)).forEach((function(o){Object.defineProperty(s,o,Object.getOwnPropertyDescriptor(n,o))}))}return s}var W="DC_appSettings",K=function(){return null},Z=A(w),J=R,Q=N,X=function(){return null},Y=function(A){var N,R,q,Y,$,oo,so=A.AppSettingsComponent,io=void 0===so?X:so,no=A.app,to=A.appData,eo=A.appName,co=A.currentUser,ro=A.disableAppAssetSelection,mo=void 0!==ro&&ro,po=A.isMultiRig,ao=A.isSettingsDialogHidden,lo=void 0!==ao&&ao,uo=A.layoutEnvironment,jo=A.onAppRemove,go=A.onCloneDashboard,fo=void 0===go?r:go,Io=A.onSettingsChange,vo=A.openIntercom,ho=A.rigId,Co=A.toggleAppSettingsDialog,yo=M(no),bo=i("string"==typeof yo?yo:E.DRILLING),Ao=s(bo,2),So=Ao[0],Oo=Ao[1],ko=i(!1),Po=s(ko,2),Do=Po[0],Eo=Po[1],No=i(!0),xo=s(No,2),wo=xo[0],Fo=xo[1],Ro=i(""),Bo=s(Ro,2),Mo=Bo[0],To=Bo[1],Vo=i((function(){var o,s,i=e(null!==(o=no.settings)&&void 0!==o?o:{}),n="string"==typeof i.package?i.package:void 0,t="string"==typeof(null===(s=no.package)||void 0===s?void 0:s.version)?no.package.version:void 0;return z(z({},i),{},{package:n||t})})),Lo=s(Vo,2),Uo=Lo[0],Go=Lo[1],Ho=n(ho),_o=n(null),qo=n(null),zo=U([G.getCanReadAppPackages(no.app.id)]),Wo=s(zo,1)[0],Ko=Wo.active,Zo=Wo.loading,Jo=Array.isArray(no.segment)?no.segment.filter((function(o){return"string"==typeof o})):[],Qo=Jo.length>1,Xo=So===E.COMPLETION,Yo=Q[So],$o="asset"===(null==uo?void 0:uo.type),os=no.id===D,ss=f(null==no||null===(N=no.app)||void 0===N?void 0:N.id),is=!(mo||T||po||$o&&Xo),ns=!T&&!lo&&!!jo,ts=Zo||Ko||Boolean(null===(R=_o.current)||void 0===R?void 0:R.clientHeight),es=Boolean(null===(q=qo.current)||void 0===q?void 0:q.clientHeight),cs=ts&&es,rs=$o?Z:w,ms="string"==typeof no.app.app_key?no.app.app_key:null,ps="string"==typeof Uo.package?Uo.package:void 0,as=h({isCompletionApp:Xo,isSustainabilityApp:ss,isAccordionRequired:cs,isRemoveButtonVisible:ns}),ls=function(s,i){return Go((function(n){return z(z({},n),{},o({},s,i))}))},us=function(o){return Go((function(s){return z(z({},s),o)}))};t((function(){wo||Fo(!0)}),[wo]),t((function(){c(Eo,200)(!0)}),[]);var ds=C("div",{className:as.modalTitleContainer,children:[y(L,{className:as.appIcon,segment:[So],iconUrl:null==no||null===(Y=no.app)||void 0===Y||null===($=Y.icon)||void 0===$?void 0:$.url,height:48,width:48}),C("div",{children:[y("div",{children:"".concat(eo," Settings")}),y(H,{children:C("div",{"data-testid":"".concat(W,"_appstoreLink"),className:as.appStoreButton,onClick:function(){var o,s;return window.open((s=null==no||null===(o=no.app)||void 0===o?void 0:o.id,"/app-store/app/".concat(s)),"_top")},children:["Open in Appstore ",y(j,{className:as.arrowIcon})]})})]})]}),js=C("div",{className:as.modalActions,children:[ns&&y(I,{appName:eo,onAppRemove:jo}),C("div",{children:[y(k,{"data-testid":"".concat(W,"_cancel"),variation:"secondary",onClick:Co,children:"Cancel"}),lo&&y(k,{variation:"primary",onClick:function(){return fo()},children:"Copy Dashboard"}),!lo&&y(k,{"data-testid":"".concat(W,"_save"),className:as.saveButton,variation:"primary",onClick:function(){if(Uo.package||os){if(is&&!$o){var o,s,i,n,t=null==Yo||null===(o=Yo.primaryAsset)||void 0===o||null===(s=o.assetType)||void 0===s?void 0:s.id,e=null==Yo||null===(i=Yo.primaryAsset)||void 0===i||null===(n=i.assetType)||void 0===n?void 0:n.label;if(t&&!Uo[t])return void To("Please select ".concat(e))}Io(Uo),V("Successfully saved"),Co()}else To("Please select app version")},children:"Save"})]})]});return y(P,{actions:js,closeIconClassName:as.closeIcon,contentContainerClassName:as.modalContainer,modalTitleClassName:as.modalTitle,onClose:Co,open:!0,title:ds,children:C(S,{ErrorView:O,openIntercom:vo,children:[y(B,{open:!!Mo,isShowCancel:!1,title:"Validation failed",text:Mo,handleOk:function(){return To("")},classes:{confirmation:as.confirmationText}}),lo&&y(J,{}),!lo&&Do&&!es&&!ts&&y(g,{image:g.IMAGES.UnderConstruction,title:"No app settings"}),!lo&&C(b,{children:[C(v,{defaultExpanded:!0,className:as.assetAccordion,accordionDetailsRef:_o,isAccordionRequired:cs,summary:"Asset",children:[Qo&&C(a,{className:as.segmentSelector,children:[y(l,{children:"Segment"}),y(u,{value:So,onChange:function(o){var s=String(o.target.value);Ho.current=null,Fo(!1),Oo(s),Go(z(z({package:Uo.package,segment:s},m(p(x,"id"),(function(){return null}))),{},{assets:null}))},children:Jo.map((function(o){return y(d,{className:as.segmentMenuItem,value:o,children:o},o)}))})]}),is&&wo&&Yo&&y(rs,{appKey:os?null:ms,appType:Yo,defaultValue:Ho.current,secondaryDefaultValue:+(null==to||null===(oo=to.well)||void 0===oo?void 0:oo.id),isHiddenTitle:!0,isNullable:$o,label:"Asset",onSettingsChange:us,settings:Uo}),y(F,{className:as.appVersionSelect,appId:no.app.id,value:ps,onChange:function(o,s,i){return i&&_()?us({package:o,react18AutoSwitchDisabled:!0}):ls("package",o)}})]}),y(S,{ErrorView:K,openIntercom:vo,children:y(v,{accordionDetailsRef:qo,className:as.accordion,defaultExpanded:!0,isAccordionRequired:cs,summary:"App Settings",children:io&&y(io,{app:no,appData:to,settings:Uo,onSettingChange:ls,onSettingsChange:us,layoutEnvironment:uo,currentUser:co})})})]})]})})};export{W as PAGE_NAME,Y as default};
|
|
2
2
|
//# sourceMappingURL=AppSettingsDialog.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppSettingsDialog.js","sources":["../../../../../../src/components/DevCenter/DevCenterAppContainer/components/AppSettingsDialog/AppSettingsDialog.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\nimport type { ComponentType, FC, ReactNode } from 'react';\nimport { cloneDeep, debounce, keyBy, mapValues, noop } from 'lodash';\nimport { FormControl, InputLabel, MenuItem, Select } from '@material-ui/core';\nimport type { SelectProps } from '@material-ui/core/Select';\nimport { ArrowForward as ArrowIcon } from '@material-ui/icons';\n\nimport EmptyState from '../../../../EmptyState';\nimport type {\n AppDataEntry,\n DevCenterAppResource,\n DevCenterCurrentUser,\n LayoutEnvironment,\n} from '../../types';\nimport { getIsSustainabilityApp } from '../../utils';\n\nimport { RemoveAppButton, SettingsAccordion } from './components';\nimport { useStyles } from './styles';\n\nimport { withAssetEditorLockHOC } from '~/hocs';\nimport ErrorBoundary, { DevCenterAppErrorView } from '~/components/ErrorBoundary';\nimport Button from '~/components/Button';\nimport Modal from '~/components/Modal';\nimport { ASSET_TYPES, DEV_CENTER_CLI_APP_ID } from '~/constants';\nimport AssetEditor from '~/components/AssetEditorV2';\nimport AppVersionsSelect from '~/components/AppVersionsSelect';\nimport { DisabledSettingsMessage } from '~/components/DisabledSettingsMessage';\nimport ConfirmationDialog from '~/components/ConfirmationDialog';\nimport { SEGMENT_TO_ASSET_TYPE, SEGMENTS } from '~/constants/segment';\nimport { showSuccessNotification } from '~/utils';\nimport AppIcon from '~/components/AppIcon';\nimport { getAppSegment } from '~/utils/devcenter';\nimport { PERMISSIONS, usePermissions } from '~/permissions';\nimport { isInsideNewMobileApp } from '~/utils/mobileDetect';\nimport { HideInNativeApp } from '~/componentsV2/HideInNativeApp';\n// [REACT-18-MIGRATION-TAG] PLT-3099\nimport { isReact18Host } from '~/componentsV2/AppHeader/V3/VersionSelect/VersionSelect.constants';\n\nexport const PAGE_NAME = 'DC_appSettings';\n\nconst getAppPageUrl = (appId: number | string | undefined): string => `/app-store/app/${appId}`;\n\nconst AppSettingsErrorView = () => null;\n\nexport type AppSettings = {\n package?: string | null;\n padId?: number | string | null;\n segment?: string;\n} & Record<string, unknown>;\n\nexport type AppSettingsComponentProps = {\n app: DevCenterAppResource;\n appData: AppDataEntry;\n currentUser: DevCenterCurrentUser;\n layoutEnvironment?: LayoutEnvironment | null;\n onSettingChange: (name: string, value: unknown) => void;\n onSettingsChange: (settings: AppSettings) => void;\n settings: AppSettings;\n};\n\nexport type AppSettingsDialogProps = {\n AppSettingsComponent?: ComponentType<AppSettingsComponentProps> | null;\n app: DevCenterAppResource;\n appData: AppDataEntry;\n appName: string;\n currentUser: DevCenterCurrentUser;\n disableAppAssetSelection?: boolean;\n isMultiRig: boolean;\n isSettingsDialogHidden?: boolean;\n layoutEnvironment?: LayoutEnvironment | null;\n onAppRemove?: () => void;\n onCloneDashboard?: () => void;\n onSettingsChange: (settings: AppSettings) => void;\n openIntercom?: () => void;\n rigId?: number | string | null;\n toggleAppSettingsDialog: () => void;\n};\n\ntype AssetEditorAppType = {\n primaryAsset?: {\n assetType?: {\n id?: string;\n label?: string;\n };\n };\n};\n\ntype AssetEditorProps = {\n appKey: string | null;\n appType: AssetEditorAppType | undefined;\n defaultValue: number | string | null | undefined;\n secondaryDefaultValue: number;\n isHiddenTitle: boolean;\n isNullable: boolean;\n label: string;\n onSettingsChange: (settings: AppSettings) => void;\n settings: AppSettings;\n};\n\n/*\n * AS-KEEP — JavaScript boundary.\n *\n * `AssetEditorV2` and `DisabledSettingsMessage` are still `.js`. TypeScript infers their props\n * from `propTypes` alone and never reads `defaultProps`, so every defaulted prop comes back\n * required and the inferred type has no overlap with the subset this dialog supplies. Nothing\n * lower on the ladder reaches it: there is no value to narrow, no predicate to write, and\n * widening the contract would mean hand-writing a `.d.ts` for a module that is itself queued for\n * migration. The assertions stay here, at the boundary, and describe exactly what this dialog\n * passes — `AssetEditorProps` below is the real contract, checked at every call site.\n *\n * Delete both once `AssetEditorV2/index.js` and `DisabledSettingsMessage.js` are TypeScript.\n */\nconst AssetEditorWithLock = withAssetEditorLockHOC(AssetEditor) as ComponentType<AssetEditorProps>;\n// TS cannot convert this one directly: with `defaultProps` ignored, the inferred type keeps\n// props this dialog never passes, so neither side overlaps. `unknown` is the only route.\nconst TypedAssetEditor = AssetEditor as unknown as ComponentType<AssetEditorProps>;\nconst OptionalDisabledSettingsMessage = DisabledSettingsMessage as ComponentType<{\n onCloneDashboard?: () => void;\n}>;\n\nconst ASSET_EDITOR_TYPES_BY_SEGMENT: Record<string, AssetEditorAppType> = SEGMENT_TO_ASSET_TYPE;\n\nconst DEFAULT_APP_SETTINGS_COMPONENT: ComponentType<AppSettingsComponentProps> = () => null;\n\nconst AppSettingsDialog: FC<AppSettingsDialogProps> = ({\n AppSettingsComponent = DEFAULT_APP_SETTINGS_COMPONENT,\n app,\n appData,\n appName,\n currentUser,\n disableAppAssetSelection = false,\n isMultiRig,\n isSettingsDialogHidden = false,\n layoutEnvironment,\n onAppRemove,\n onCloneDashboard = noop,\n onSettingsChange,\n openIntercom,\n rigId,\n toggleAppSettingsDialog,\n}) => {\n const initialSegment = getAppSegment(app);\n\n const [appSegmentSetting, setAppSegmentSetting] = useState<string>(\n typeof initialSegment === 'string' ? initialSegment : SEGMENTS.DRILLING\n );\n const [isMounted, setIsMounted] = useState(false);\n const [isAssetSelectorRendered, setIsAssetSelectorRendered] = useState(true);\n const [validationError, setValidationError] = useState('');\n const [appSettings, setAppSettings] = useState<AppSettings>(() => {\n const settings: AppSettings = cloneDeep(app.settings ?? {});\n const settingsPackage = typeof settings.package === 'string' ? settings.package : undefined;\n const packageVersion =\n typeof app.package?.version === 'string' ? app.package.version : undefined;\n\n return {\n ...settings,\n package: settingsPackage || packageVersion,\n };\n });\n\n // NOTE: Keep in ref to have a way to reset default value\n // of asset selector when changing app segment\n const defaultRigId = useRef<number | string | null | undefined>(rigId);\n const platformAppSettingsRef = useRef<HTMLDivElement | null>(null);\n const customAppSettingsRef = useRef<HTMLDivElement | null>(null);\n\n const [{ active: canReadAppPackages, loading: isPermissionsLoading }] = usePermissions([\n PERMISSIONS.getCanReadAppPackages(app.app.id),\n ]);\n\n const appSegments = Array.isArray(app.segment)\n ? app.segment.filter((segment): segment is string => typeof segment === 'string')\n : [];\n const hasSegmentSelector = appSegments.length > 1;\n const isCompletionSegment = appSegmentSetting === SEGMENTS.COMPLETION;\n const assetEditorAppType = ASSET_EDITOR_TYPES_BY_SEGMENT[appSegmentSetting];\n const isAssetPage = layoutEnvironment?.type === 'asset';\n const isCLIApp = app.id === DEV_CENTER_CLI_APP_ID;\n const isSustainabilityApp = getIsSustainabilityApp(app?.app?.id);\n\n const isAssetSelectorVisible =\n !disableAppAssetSelection &&\n !isInsideNewMobileApp &&\n !isMultiRig &&\n !(isAssetPage && isCompletionSegment);\n const isRemoveButtonVisible = !isInsideNewMobileApp && !isSettingsDialogHidden && !!onAppRemove;\n\n const hasPlatformAppSettings =\n isPermissionsLoading ||\n canReadAppPackages ||\n Boolean(platformAppSettingsRef.current?.clientHeight);\n const hasCustomAppSettings = Boolean(customAppSettingsRef.current?.clientHeight);\n const isAccordionRequired = hasPlatformAppSettings && hasCustomAppSettings;\n\n const AssetEditorComponent = isAssetPage ? AssetEditorWithLock : TypedAssetEditor;\n const appKey = typeof app.app.app_key === 'string' ? app.app.app_key : null;\n const selectedPackage = typeof appSettings.package === 'string' ? appSettings.package : undefined;\n\n const styles = useStyles({\n isCompletionApp: isCompletionSegment,\n isSustainabilityApp,\n isAccordionRequired,\n isRemoveButtonVisible,\n });\n\n const handleChangeAppSegment: SelectProps['onChange'] = event => {\n const nextSegment = String(event.target.value);\n\n defaultRigId.current = null;\n setIsAssetSelectorRendered(false);\n\n setAppSegmentSetting(nextSegment);\n setAppSettings({\n package: appSettings.package,\n segment: nextSegment,\n // NOTE: we need to reset asset ids when segment is changed\n ...mapValues(keyBy(ASSET_TYPES, 'id'), () => null),\n assets: null,\n });\n };\n\n const handleAppSettingChange = (name: string, value: unknown) =>\n setAppSettings(prevSettings => ({\n ...prevSettings,\n [name]: value,\n }));\n\n const handleAppSettingsChange = (newSettings: AppSettings) =>\n setAppSettings(prevSettings => ({ ...prevSettings, ...newSettings }));\n\n const handleSave = () => {\n if (!appSettings.package && !isCLIApp) {\n setValidationError('Please select app version');\n return;\n }\n\n if (isAssetSelectorVisible && !isAssetPage) {\n const appTypeKey = assetEditorAppType?.primaryAsset?.assetType?.id;\n const appTypeLabel = assetEditorAppType?.primaryAsset?.assetType?.label;\n\n if (appTypeKey && !appSettings[appTypeKey]) {\n setValidationError(`Please select ${appTypeLabel}`);\n return;\n }\n }\n\n onSettingsChange(appSettings);\n showSuccessNotification('Successfully saved');\n toggleAppSettingsDialog();\n };\n\n const handleAppVersionChange = (value: string, _appPackage: unknown, isUserChange: boolean) =>\n // [REACT-18-MIGRATION-TAG] PLT-3099: a genuine user pick on a React-18 host opts the app out\n // of the auto-switch; the auto-preselect must not (isUserChange).\n isUserChange && isReact18Host()\n ? handleAppSettingsChange({ package: value, react18AutoSwitchDisabled: true })\n : handleAppSettingChange('package', value);\n\n useEffect(() => {\n if (!isAssetSelectorRendered) setIsAssetSelectorRendered(true);\n }, [isAssetSelectorRendered]);\n\n useEffect(() => {\n const debouncedSetIsMounted = debounce(setIsMounted, 200);\n debouncedSetIsMounted(true);\n }, []);\n\n const modalTitle: ReactNode = (\n <div className={styles.modalTitleContainer}>\n <AppIcon\n className={styles.appIcon}\n segment={[appSegmentSetting]}\n iconUrl={app?.app?.icon?.url}\n height={48}\n width={48}\n />\n <div>\n <div>{`${appName} Settings`}</div>\n <HideInNativeApp>\n <div\n data-testid={`${PAGE_NAME}_appstoreLink`}\n className={styles.appStoreButton}\n onClick={() => window.open(getAppPageUrl(app?.app?.id), '_top')}\n >\n Open in Appstore <ArrowIcon className={styles.arrowIcon} />\n </div>\n </HideInNativeApp>\n </div>\n </div>\n );\n\n const modalActions = (\n <div className={styles.modalActions}>\n {isRemoveButtonVisible && <RemoveAppButton appName={appName} onAppRemove={onAppRemove} />}\n <div>\n <Button\n data-testid={`${PAGE_NAME}_cancel`}\n variation=\"secondary\"\n onClick={toggleAppSettingsDialog}\n >\n Cancel\n </Button>\n {isSettingsDialogHidden && (\n <Button variation=\"primary\" onClick={() => onCloneDashboard()}>\n Copy Dashboard\n </Button>\n )}\n {!isSettingsDialogHidden && (\n <Button\n data-testid={`${PAGE_NAME}_save`}\n className={styles.saveButton}\n variation=\"primary\"\n onClick={handleSave}\n >\n Save\n </Button>\n )}\n </div>\n </div>\n );\n\n return (\n <Modal\n actions={modalActions}\n closeIconClassName={styles.closeIcon}\n contentContainerClassName={styles.modalContainer}\n modalTitleClassName={styles.modalTitle}\n onClose={toggleAppSettingsDialog}\n open\n title={modalTitle}\n >\n <ErrorBoundary ErrorView={DevCenterAppErrorView} openIntercom={openIntercom}>\n <ConfirmationDialog\n open={!!validationError}\n isShowCancel={false}\n title=\"Validation failed\"\n text={validationError}\n handleOk={() => setValidationError('')}\n classes={{ confirmation: styles.confirmationText }}\n />\n {isSettingsDialogHidden && <OptionalDisabledSettingsMessage />}\n {!isSettingsDialogHidden &&\n isMounted &&\n !hasCustomAppSettings &&\n !hasPlatformAppSettings && (\n <EmptyState image={EmptyState.IMAGES.UnderConstruction} title=\"No app settings\" />\n )}\n {!isSettingsDialogHidden && (\n <>\n <SettingsAccordion\n defaultExpanded\n className={styles.assetAccordion}\n accordionDetailsRef={platformAppSettingsRef}\n isAccordionRequired={isAccordionRequired}\n summary=\"Asset\"\n >\n {hasSegmentSelector && (\n <FormControl className={styles.segmentSelector}>\n <InputLabel>Segment</InputLabel>\n <Select value={appSegmentSetting} onChange={handleChangeAppSegment}>\n {appSegments.map(segmentItem => (\n <MenuItem\n className={styles.segmentMenuItem}\n key={segmentItem}\n value={segmentItem}\n >\n {segmentItem}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n )}\n {isAssetSelectorVisible && isAssetSelectorRendered && (\n <AssetEditorComponent\n appKey={isCLIApp ? null : appKey}\n appType={assetEditorAppType}\n defaultValue={defaultRigId.current}\n secondaryDefaultValue={+appData?.well?.id}\n isHiddenTitle\n isNullable={isAssetPage}\n label=\"Asset\"\n onSettingsChange={handleAppSettingsChange}\n settings={appSettings}\n />\n )}\n <AppVersionsSelect\n className={styles.appVersionSelect}\n appId={app.app.id}\n value={selectedPackage}\n onChange={handleAppVersionChange}\n />\n </SettingsAccordion>\n <ErrorBoundary ErrorView={AppSettingsErrorView} openIntercom={openIntercom}>\n <SettingsAccordion\n accordionDetailsRef={customAppSettingsRef}\n className={styles.accordion}\n defaultExpanded\n isAccordionRequired={isAccordionRequired}\n summary=\"App Settings\"\n >\n {AppSettingsComponent && (\n <AppSettingsComponent\n app={app}\n appData={appData}\n settings={appSettings}\n onSettingChange={handleAppSettingChange}\n onSettingsChange={handleAppSettingsChange}\n layoutEnvironment={layoutEnvironment}\n currentUser={currentUser}\n />\n )}\n </SettingsAccordion>\n </ErrorBoundary>\n </>\n )}\n </ErrorBoundary>\n </Modal>\n );\n};\n\nexport default AppSettingsDialog;\n"],"names":["PAGE_NAME","AppSettingsErrorView","AssetEditorWithLock","withAssetEditorLockHOC","AssetEditor","TypedAssetEditor","OptionalDisabledSettingsMessage","DisabledSettingsMessage","ASSET_EDITOR_TYPES_BY_SEGMENT","SEGMENT_TO_ASSET_TYPE","DEFAULT_APP_SETTINGS_COMPONENT","AppSettingsDialog","_ref","_app$app","_platformAppSettingsR","_customAppSettingsRef","_app$app2","_app$app2$icon","_appData$well","_ref$AppSettingsCompo","AppSettingsComponent","app","appData","appName","currentUser","_ref$disableAppAssetS","disableAppAssetSelection","isMultiRig","_ref$isSettingsDialog","isSettingsDialogHidden","layoutEnvironment","onAppRemove","_ref$onCloneDashboard","onCloneDashboard","noop","onSettingsChange","openIntercom","rigId","toggleAppSettingsDialog","initialSegment","getAppSegment","_useState","useState","SEGMENTS","DRILLING","_useState2","_slicedToArray","appSegmentSetting","setAppSegmentSetting","_useState4","_useState3","isMounted","setIsMounted","_useState6","_useState5","isAssetSelectorRendered","setIsAssetSelectorRendered","_useState8","_useState7","validationError","setValidationError","_app$settings","_app$package","settings","cloneDeep","settingsPackage","package","undefined","packageVersion","version","_objectSpread","_useState10","_useState9","appSettings","setAppSettings","defaultRigId","useRef","platformAppSettingsRef","customAppSettingsRef","_usePermissions","usePermissions","PERMISSIONS","getCanReadAppPackages","id","_usePermissions2$","canReadAppPackages","active","isPermissionsLoading","loading","appSegments","Array","isArray","segment","filter","hasSegmentSelector","length","isCompletionSegment","COMPLETION","assetEditorAppType","isAssetPage","type","isCLIApp","DEV_CENTER_CLI_APP_ID","isSustainabilityApp","getIsSustainabilityApp","isAssetSelectorVisible","isInsideNewMobileApp","isRemoveButtonVisible","hasPlatformAppSettings","Boolean","current","clientHeight","hasCustomAppSettings","isAccordionRequired","AssetEditorComponent","appKey","app_key","selectedPackage","styles","useStyles","isCompletionApp","handleAppSettingChange","name","value","prevSettings","_defineProperty","handleAppSettingsChange","newSettings","useEffect","debounce","debouncedSetIsMounted","modalTitle","_jsxs","className","modalTitleContainer","children","_jsx","AppIcon","appIcon","iconUrl","icon","url","height","width","concat","HideInNativeApp","appStoreButton","onClick","_app$app3","appId","window","open","ArrowIcon","arrowIcon","modalActions","RemoveAppButton","Button","variation","saveButton","_assetEditorAppType$p","_assetEditorAppType$p2","_assetEditorAppType$p3","_assetEditorAppType$p4","appTypeKey","primaryAsset","assetType","appTypeLabel","label","showSuccessNotification","Modal","actions","closeIconClassName","closeIcon","contentContainerClassName","modalContainer","modalTitleClassName","onClose","title","ErrorBoundary","ErrorView","DevCenterAppErrorView","ConfirmationDialog","isShowCancel","text","handleOk","classes","confirmation","confirmationText","EmptyState","image","IMAGES","UnderConstruction","_Fragment","SettingsAccordion","defaultExpanded","assetAccordion","accordionDetailsRef","summary","FormControl","segmentSelector","InputLabel","Select","onChange","event","nextSegment","String","target","mapValues","keyBy","ASSET_TYPES","assets","map","segmentItem","MenuItem","segmentMenuItem","appType","defaultValue","secondaryDefaultValue","well","isHiddenTitle","isNullable","AppVersionsSelect","appVersionSelect","_appPackage","isUserChange","isReact18Host","react18AutoSwitchDisabled","accordion","onSettingChange"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AppSettingsDialog.js","sources":["../../../../../../src/components/DevCenter/DevCenterAppContainer/components/AppSettingsDialog/AppSettingsDialog.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\nimport type { ComponentType, FC, ReactNode } from 'react';\nimport { cloneDeep, debounce, keyBy, mapValues, noop } from 'lodash';\nimport { FormControl, InputLabel, MenuItem, Select } from '@material-ui/core';\nimport type { SelectProps } from '@material-ui/core/Select';\nimport { ArrowForward as ArrowIcon } from '@material-ui/icons';\n\nimport EmptyState from '../../../../EmptyState';\nimport type {\n AppDataEntry,\n DevCenterAppResource,\n DevCenterCurrentUser,\n LayoutEnvironment,\n} from '../../types';\nimport { getIsSustainabilityApp } from '../../utils';\n\nimport { RemoveAppButton, SettingsAccordion } from './components';\nimport { useStyles } from './styles';\n\nimport { withAssetEditorLockHOC } from '~/hocs';\nimport ErrorBoundary, { DevCenterAppErrorView } from '~/components/ErrorBoundary';\nimport Button from '~/components/Button';\nimport Modal from '~/components/Modal';\nimport { ASSET_TYPES, DEV_CENTER_CLI_APP_ID } from '~/constants';\nimport AssetEditor, { AssetEditorAppType } from '~/components/AssetEditorV2';\nimport AppVersionsSelect from '~/components/AppVersionsSelect';\nimport { DisabledSettingsMessage } from '~/components/DisabledSettingsMessage';\nimport ConfirmationDialog from '~/components/ConfirmationDialog';\nimport { SEGMENT_TO_ASSET_TYPE, SEGMENTS } from '~/constants/segment';\nimport { showSuccessNotification } from '~/utils';\nimport AppIcon from '~/components/AppIcon';\nimport { getAppSegment } from '~/utils/devcenter';\nimport { PERMISSIONS, usePermissions } from '~/permissions';\nimport { isInsideNewMobileApp } from '~/utils/mobileDetect';\nimport { HideInNativeApp } from '~/componentsV2/HideInNativeApp';\n// [REACT-18-MIGRATION-TAG] PLT-3099\nimport { isReact18Host } from '~/componentsV2/AppHeader/V3/VersionSelect/VersionSelect.constants';\n\nexport const PAGE_NAME = 'DC_appSettings';\n\nconst getAppPageUrl = (appId: number | string | undefined): string => `/app-store/app/${appId}`;\n\nconst AppSettingsErrorView = () => null;\n\nexport type AppSettings = {\n package?: string | null;\n padId?: number | string | null;\n segment?: string;\n} & Record<string, unknown>;\n\nexport type AppSettingsComponentProps = {\n app: DevCenterAppResource;\n appData: AppDataEntry;\n currentUser: DevCenterCurrentUser;\n layoutEnvironment?: LayoutEnvironment | null;\n onSettingChange: (name: string, value: unknown) => void;\n onSettingsChange: (settings: AppSettings) => void;\n settings: AppSettings;\n};\n\nexport type AppSettingsDialogProps = {\n AppSettingsComponent?: ComponentType<AppSettingsComponentProps> | null;\n app: DevCenterAppResource;\n appData: AppDataEntry;\n appName: string;\n currentUser: DevCenterCurrentUser;\n disableAppAssetSelection?: boolean;\n isMultiRig: boolean;\n isSettingsDialogHidden?: boolean;\n layoutEnvironment?: LayoutEnvironment | null;\n onAppRemove?: () => void;\n onCloneDashboard?: () => void;\n onSettingsChange: (settings: AppSettings) => void;\n openIntercom?: () => void;\n rigId?: number | string | null;\n toggleAppSettingsDialog: () => void;\n};\n\nconst AssetEditorWithLock = withAssetEditorLockHOC(AssetEditor);\n\n/*\n * AS-KEEP — DisabledSettingsMessage is still JavaScript and declares a required\n * onCloneDashboard callback, although its rendering supports an omitted callback.\n * Remove this assertion when that component is migrated to TypeScript.\n */\nconst OptionalDisabledSettingsMessage = DisabledSettingsMessage as ComponentType<{\n onCloneDashboard?: () => void;\n}>;\n\nconst ASSET_EDITOR_TYPES_BY_SEGMENT: Partial<Record<string, AssetEditorAppType>> =\n SEGMENT_TO_ASSET_TYPE;\n\nconst DEFAULT_APP_SETTINGS_COMPONENT: ComponentType<AppSettingsComponentProps> = () => null;\n\nconst AppSettingsDialog: FC<AppSettingsDialogProps> = ({\n AppSettingsComponent = DEFAULT_APP_SETTINGS_COMPONENT,\n app,\n appData,\n appName,\n currentUser,\n disableAppAssetSelection = false,\n isMultiRig,\n isSettingsDialogHidden = false,\n layoutEnvironment,\n onAppRemove,\n onCloneDashboard = noop,\n onSettingsChange,\n openIntercom,\n rigId,\n toggleAppSettingsDialog,\n}) => {\n const initialSegment = getAppSegment(app);\n\n const [appSegmentSetting, setAppSegmentSetting] = useState<string>(\n typeof initialSegment === 'string' ? initialSegment : SEGMENTS.DRILLING\n );\n const [isMounted, setIsMounted] = useState(false);\n const [isAssetSelectorRendered, setIsAssetSelectorRendered] = useState(true);\n const [validationError, setValidationError] = useState('');\n const [appSettings, setAppSettings] = useState<AppSettings>(() => {\n const settings: AppSettings = cloneDeep(app.settings ?? {});\n const settingsPackage = typeof settings.package === 'string' ? settings.package : undefined;\n const packageVersion =\n typeof app.package?.version === 'string' ? app.package.version : undefined;\n\n return {\n ...settings,\n package: settingsPackage || packageVersion,\n };\n });\n\n // NOTE: Keep in ref to have a way to reset default value\n // of asset selector when changing app segment\n const defaultRigId = useRef<number | string | null | undefined>(rigId);\n const platformAppSettingsRef = useRef<HTMLDivElement | null>(null);\n const customAppSettingsRef = useRef<HTMLDivElement | null>(null);\n\n const [{ active: canReadAppPackages, loading: isPermissionsLoading }] = usePermissions([\n PERMISSIONS.getCanReadAppPackages(app.app.id),\n ]);\n\n const appSegments = Array.isArray(app.segment)\n ? app.segment.filter((segment): segment is string => typeof segment === 'string')\n : [];\n const hasSegmentSelector = appSegments.length > 1;\n const isCompletionSegment = appSegmentSetting === SEGMENTS.COMPLETION;\n const assetEditorAppType = ASSET_EDITOR_TYPES_BY_SEGMENT[appSegmentSetting];\n const isAssetPage = layoutEnvironment?.type === 'asset';\n const isCLIApp = app.id === DEV_CENTER_CLI_APP_ID;\n const isSustainabilityApp = getIsSustainabilityApp(app?.app?.id);\n\n const isAssetSelectorVisible =\n !disableAppAssetSelection &&\n !isInsideNewMobileApp &&\n !isMultiRig &&\n !(isAssetPage && isCompletionSegment);\n const isRemoveButtonVisible = !isInsideNewMobileApp && !isSettingsDialogHidden && !!onAppRemove;\n\n const hasPlatformAppSettings =\n isPermissionsLoading ||\n canReadAppPackages ||\n Boolean(platformAppSettingsRef.current?.clientHeight);\n const hasCustomAppSettings = Boolean(customAppSettingsRef.current?.clientHeight);\n const isAccordionRequired = hasPlatformAppSettings && hasCustomAppSettings;\n\n const AssetEditorComponent = isAssetPage ? AssetEditorWithLock : AssetEditor;\n const appKey = typeof app.app.app_key === 'string' ? app.app.app_key : null;\n const selectedPackage = typeof appSettings.package === 'string' ? appSettings.package : undefined;\n\n const styles = useStyles({\n isCompletionApp: isCompletionSegment,\n isSustainabilityApp,\n isAccordionRequired,\n isRemoveButtonVisible,\n });\n\n const handleChangeAppSegment: SelectProps['onChange'] = event => {\n const nextSegment = String(event.target.value);\n\n defaultRigId.current = null;\n setIsAssetSelectorRendered(false);\n\n setAppSegmentSetting(nextSegment);\n setAppSettings({\n package: appSettings.package,\n segment: nextSegment,\n // NOTE: we need to reset asset ids when segment is changed\n ...mapValues(keyBy(ASSET_TYPES, 'id'), () => null),\n assets: null,\n });\n };\n\n const handleAppSettingChange = (name: string, value: unknown) =>\n setAppSettings(prevSettings => ({\n ...prevSettings,\n [name]: value,\n }));\n\n const handleAppSettingsChange = (newSettings: AppSettings) =>\n setAppSettings(prevSettings => ({ ...prevSettings, ...newSettings }));\n\n const handleSave = () => {\n if (!appSettings.package && !isCLIApp) {\n setValidationError('Please select app version');\n return;\n }\n\n if (isAssetSelectorVisible && !isAssetPage) {\n const appTypeKey = assetEditorAppType?.primaryAsset?.assetType?.id;\n const appTypeLabel = assetEditorAppType?.primaryAsset?.assetType?.label;\n\n if (appTypeKey && !appSettings[appTypeKey]) {\n setValidationError(`Please select ${appTypeLabel}`);\n return;\n }\n }\n\n onSettingsChange(appSettings);\n showSuccessNotification('Successfully saved');\n toggleAppSettingsDialog();\n };\n\n const handleAppVersionChange = (value: string, _appPackage: unknown, isUserChange: boolean) =>\n // [REACT-18-MIGRATION-TAG] PLT-3099: a genuine user pick on a React-18 host opts the app out\n // of the auto-switch; the auto-preselect must not (isUserChange).\n isUserChange && isReact18Host()\n ? handleAppSettingsChange({ package: value, react18AutoSwitchDisabled: true })\n : handleAppSettingChange('package', value);\n\n useEffect(() => {\n if (!isAssetSelectorRendered) setIsAssetSelectorRendered(true);\n }, [isAssetSelectorRendered]);\n\n useEffect(() => {\n const debouncedSetIsMounted = debounce(setIsMounted, 200);\n debouncedSetIsMounted(true);\n }, []);\n\n const modalTitle: ReactNode = (\n <div className={styles.modalTitleContainer}>\n <AppIcon\n className={styles.appIcon}\n segment={[appSegmentSetting]}\n iconUrl={app?.app?.icon?.url}\n height={48}\n width={48}\n />\n <div>\n <div>{`${appName} Settings`}</div>\n <HideInNativeApp>\n <div\n data-testid={`${PAGE_NAME}_appstoreLink`}\n className={styles.appStoreButton}\n onClick={() => window.open(getAppPageUrl(app?.app?.id), '_top')}\n >\n Open in Appstore <ArrowIcon className={styles.arrowIcon} />\n </div>\n </HideInNativeApp>\n </div>\n </div>\n );\n\n const modalActions = (\n <div className={styles.modalActions}>\n {isRemoveButtonVisible && <RemoveAppButton appName={appName} onAppRemove={onAppRemove} />}\n <div>\n <Button\n data-testid={`${PAGE_NAME}_cancel`}\n variation=\"secondary\"\n onClick={toggleAppSettingsDialog}\n >\n Cancel\n </Button>\n {isSettingsDialogHidden && (\n <Button variation=\"primary\" onClick={() => onCloneDashboard()}>\n Copy Dashboard\n </Button>\n )}\n {!isSettingsDialogHidden && (\n <Button\n data-testid={`${PAGE_NAME}_save`}\n className={styles.saveButton}\n variation=\"primary\"\n onClick={handleSave}\n >\n Save\n </Button>\n )}\n </div>\n </div>\n );\n\n return (\n <Modal\n actions={modalActions}\n closeIconClassName={styles.closeIcon}\n contentContainerClassName={styles.modalContainer}\n modalTitleClassName={styles.modalTitle}\n onClose={toggleAppSettingsDialog}\n open\n title={modalTitle}\n >\n <ErrorBoundary ErrorView={DevCenterAppErrorView} openIntercom={openIntercom}>\n <ConfirmationDialog\n open={!!validationError}\n isShowCancel={false}\n title=\"Validation failed\"\n text={validationError}\n handleOk={() => setValidationError('')}\n classes={{ confirmation: styles.confirmationText }}\n />\n {isSettingsDialogHidden && <OptionalDisabledSettingsMessage />}\n {!isSettingsDialogHidden &&\n isMounted &&\n !hasCustomAppSettings &&\n !hasPlatformAppSettings && (\n <EmptyState image={EmptyState.IMAGES.UnderConstruction} title=\"No app settings\" />\n )}\n {!isSettingsDialogHidden && (\n <>\n <SettingsAccordion\n defaultExpanded\n className={styles.assetAccordion}\n accordionDetailsRef={platformAppSettingsRef}\n isAccordionRequired={isAccordionRequired}\n summary=\"Asset\"\n >\n {hasSegmentSelector && (\n <FormControl className={styles.segmentSelector}>\n <InputLabel>Segment</InputLabel>\n <Select value={appSegmentSetting} onChange={handleChangeAppSegment}>\n {appSegments.map(segmentItem => (\n <MenuItem\n className={styles.segmentMenuItem}\n key={segmentItem}\n value={segmentItem}\n >\n {segmentItem}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n )}\n {isAssetSelectorVisible && isAssetSelectorRendered && assetEditorAppType && (\n <AssetEditorComponent\n appKey={isCLIApp ? null : appKey}\n appType={assetEditorAppType}\n defaultValue={defaultRigId.current}\n secondaryDefaultValue={+appData?.well?.id}\n isHiddenTitle\n isNullable={isAssetPage}\n label=\"Asset\"\n onSettingsChange={handleAppSettingsChange}\n settings={appSettings}\n />\n )}\n <AppVersionsSelect\n className={styles.appVersionSelect}\n appId={app.app.id}\n value={selectedPackage}\n onChange={handleAppVersionChange}\n />\n </SettingsAccordion>\n <ErrorBoundary ErrorView={AppSettingsErrorView} openIntercom={openIntercom}>\n <SettingsAccordion\n accordionDetailsRef={customAppSettingsRef}\n className={styles.accordion}\n defaultExpanded\n isAccordionRequired={isAccordionRequired}\n summary=\"App Settings\"\n >\n {AppSettingsComponent && (\n <AppSettingsComponent\n app={app}\n appData={appData}\n settings={appSettings}\n onSettingChange={handleAppSettingChange}\n onSettingsChange={handleAppSettingsChange}\n layoutEnvironment={layoutEnvironment}\n currentUser={currentUser}\n />\n )}\n </SettingsAccordion>\n </ErrorBoundary>\n </>\n )}\n </ErrorBoundary>\n </Modal>\n );\n};\n\nexport default AppSettingsDialog;\n"],"names":["PAGE_NAME","AppSettingsErrorView","AssetEditorWithLock","withAssetEditorLockHOC","AssetEditor","OptionalDisabledSettingsMessage","DisabledSettingsMessage","ASSET_EDITOR_TYPES_BY_SEGMENT","SEGMENT_TO_ASSET_TYPE","DEFAULT_APP_SETTINGS_COMPONENT","AppSettingsDialog","_ref","_app$app","_platformAppSettingsR","_customAppSettingsRef","_app$app2","_app$app2$icon","_appData$well","_ref$AppSettingsCompo","AppSettingsComponent","app","appData","appName","currentUser","_ref$disableAppAssetS","disableAppAssetSelection","isMultiRig","_ref$isSettingsDialog","isSettingsDialogHidden","layoutEnvironment","onAppRemove","_ref$onCloneDashboard","onCloneDashboard","noop","onSettingsChange","openIntercom","rigId","toggleAppSettingsDialog","initialSegment","getAppSegment","_useState","useState","SEGMENTS","DRILLING","_useState2","_slicedToArray","appSegmentSetting","setAppSegmentSetting","_useState4","_useState3","isMounted","setIsMounted","_useState6","_useState5","isAssetSelectorRendered","setIsAssetSelectorRendered","_useState8","_useState7","validationError","setValidationError","_app$settings","_app$package","settings","cloneDeep","settingsPackage","package","undefined","packageVersion","version","_objectSpread","_useState10","_useState9","appSettings","setAppSettings","defaultRigId","useRef","platformAppSettingsRef","customAppSettingsRef","_usePermissions","usePermissions","PERMISSIONS","getCanReadAppPackages","id","_usePermissions2$","canReadAppPackages","active","isPermissionsLoading","loading","appSegments","Array","isArray","segment","filter","hasSegmentSelector","length","isCompletionSegment","COMPLETION","assetEditorAppType","isAssetPage","type","isCLIApp","DEV_CENTER_CLI_APP_ID","isSustainabilityApp","getIsSustainabilityApp","isAssetSelectorVisible","isInsideNewMobileApp","isRemoveButtonVisible","hasPlatformAppSettings","Boolean","current","clientHeight","hasCustomAppSettings","isAccordionRequired","AssetEditorComponent","appKey","app_key","selectedPackage","styles","useStyles","isCompletionApp","handleAppSettingChange","name","value","prevSettings","_defineProperty","handleAppSettingsChange","newSettings","useEffect","debounce","debouncedSetIsMounted","modalTitle","_jsxs","className","modalTitleContainer","children","_jsx","AppIcon","appIcon","iconUrl","icon","url","height","width","concat","HideInNativeApp","appStoreButton","onClick","_app$app3","appId","window","open","ArrowIcon","arrowIcon","modalActions","RemoveAppButton","Button","variation","saveButton","_assetEditorAppType$p","_assetEditorAppType$p2","_assetEditorAppType$p3","_assetEditorAppType$p4","appTypeKey","primaryAsset","assetType","appTypeLabel","label","showSuccessNotification","Modal","actions","closeIconClassName","closeIcon","contentContainerClassName","modalContainer","modalTitleClassName","onClose","title","ErrorBoundary","ErrorView","DevCenterAppErrorView","ConfirmationDialog","isShowCancel","text","handleOk","classes","confirmation","confirmationText","EmptyState","image","IMAGES","UnderConstruction","_Fragment","SettingsAccordion","defaultExpanded","assetAccordion","accordionDetailsRef","summary","FormControl","segmentSelector","InputLabel","Select","onChange","event","nextSegment","String","target","mapValues","keyBy","ASSET_TYPES","assets","map","segmentItem","MenuItem","segmentMenuItem","appType","defaultValue","secondaryDefaultValue","well","isHiddenTitle","isNullable","AppVersionsSelect","appVersionSelect","_appPackage","isUserChange","isReact18Host","react18AutoSwitchDisabled","accordion","onSettingChange"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UniversalLink.d.ts","sourceRoot":"","sources":["../../../../../src/components/DevCenter/DevCenterRouterContext/UniversalLink/UniversalLink.js"],"names":[],"mappings":"AAEA,OAAO,SAAS,MAAM,YAAY,CAAC;AAOnC,wBAAgB,aAAa,CAAC,KAAK,KAAA,+
|
|
1
|
+
{"version":3,"file":"UniversalLink.d.ts","sourceRoot":"","sources":["../../../../../src/components/DevCenter/DevCenterRouterContext/UniversalLink/UniversalLink.js"],"names":[],"mappings":"AAEA,OAAO,SAAS,MAAM,YAAY,CAAC;AAOnC,wBAAgB,aAAa,CAAC,KAAK,KAAA,+BAmDlC;yBAnDe,aAAa"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import
|
|
1
|
+
import e from"classnames";import{Link as t}from"react-router-dom";import r from"prop-types";import{noop as i}from"lodash";import{useDevCenterRouter as o}from"../effects/useDevCenterRouter.js";import n from"./UniversalLink.css.js";import{jsx as a}from"react/jsx-runtime";function s(r){var i=r.href,s=void 0===i?null:i,d=r.children,c=r.className,m=void 0===c?null:c,p=r["data-testid"],f=void 0===p?"UniversalLink":p,u=r.onClick,h=void 0===u?l:u,v=o();return v?a("a",{href:s||null,children:a("button",{"data-testid":f,tabIndex:"0",role:"link",className:e(n.buttonLink,m),onClick:function(e){s&&(e.stopPropagation(),h(e),e.metaKey||e.ctrlKey?window.open(s,"_blank"):v.push(s))},children:d})}):s?a(t,{"data-testid":f,to:s,className:m,children:d}):a("span",{"data-testid":f,className:m,children:d})}s.propTypes={href:r.any,children:r.node.isRequired,className:r.string,onClick:r.func,"data-testid":r.string};var l=i;export{s as UniversalLink};
|
|
2
2
|
//# sourceMappingURL=UniversalLink.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UniversalLink.js","sources":["../../../../../src/components/DevCenter/DevCenterRouterContext/UniversalLink/UniversalLink.js"],"sourcesContent":["import classNames from 'classnames';\nimport { Link as ReactRouterLink } from 'react-router-dom';\nimport PropTypes from 'prop-types';\nimport { noop } from 'lodash';\n\nimport { useDevCenterRouter } from '../effects/useDevCenterRouter';\n\nimport styles from './UniversalLink.css';\n\nexport function UniversalLink(props) {\n const {\n href = null,\n children,\n className = null,\n 'data-testid': dataTestId = 'UniversalLink',\n onClick = DEFAULT_UNIVERSAL_LINK_ON_CLICK,\n } = props;\n const devCenterRouter = useDevCenterRouter();\n\n if (devCenterRouter) {\n return (\n // NOTE: \"a\" element is needed to drag chip to tab bar while clicks are handled by button onClick handler\n <a href={href || null}>\n <button\n data-testid={dataTestId}\n tabIndex=\"0\"\n role=\"link\"\n className={classNames(styles.buttonLink, className)}\n onClick={e => {\n if (href) {\n e.stopPropagation();\n onClick(e);\n if (e.metaKey || e.ctrlKey) {\n window.open(href, '_blank');\n } else {\n devCenterRouter.push(href);\n }\n }\n }}\n >\n {children}\n </button>\n </a>\n );\n }\n\n return (\n <ReactRouterLink data-testid={dataTestId} to={href} className={className}>\n {children}\n </ReactRouterLink>\n );\n}\n\nUniversalLink.propTypes = {\n href: PropTypes.any,\n children: PropTypes.node.isRequired,\n className: PropTypes.string,\n onClick: PropTypes.func,\n 'data-testid': PropTypes.string,\n};\n\nconst DEFAULT_UNIVERSAL_LINK_ON_CLICK = noop;\n"],"names":["UniversalLink","props","href","_props$href","children","_props$className","className","_props$dataTestid","dataTestId","_props$onClick","onClick","DEFAULT_UNIVERSAL_LINK_ON_CLICK","devCenterRouter","useDevCenterRouter","_jsx","tabIndex","role","classNames","styles","buttonLink","e","stopPropagation","metaKey","ctrlKey","window","open","push","ReactRouterLink","to","propTypes","PropTypes","any","node","isRequired","string","func","noop"],"mappings":"8QASO,SAASA,EAAcC,GAC5B,IAMIA,EAAAA,EALFC,KAAAA,aAAO,KAAIC,EACXC,EAIEH,EAJFG,SAAQC,EAINJ,EAHFK,UAAAA,aAAY,KAAID,EAAAE,EAGdN,EAFF,eAAeO,aAAa,gBAAeD,EAAAE,EAEzCR,EADFS,QAAAA,aAAUC,EAA+BF,EAErCG,EAAkBC,IAExB,OAAID,EAGAE,EAAA,IAAA,CAAGZ,KAAMA,GAAQ,KAAKE,SACpBU,EAAA,SAAA,CACE,cAAaN,EACbO,SAAS,IACTC,KAAK,OACLV,UAAWW,EAAWC,EAAOC,WAAYb,GACzCI,QAAS,SAAAU,GACHlB,IACFkB,EAAEC,kBACFX,EAAQU,GACJA,EAAEE,SAAWF,EAAEG,QACjBC,OAAOC,KAAKvB,EAAM,UAElBU,EAAgBc,KAAKxB,GAGzB,EAAAE,SAEDA,
|
|
1
|
+
{"version":3,"file":"UniversalLink.js","sources":["../../../../../src/components/DevCenter/DevCenterRouterContext/UniversalLink/UniversalLink.js"],"sourcesContent":["import classNames from 'classnames';\nimport { Link as ReactRouterLink } from 'react-router-dom';\nimport PropTypes from 'prop-types';\nimport { noop } from 'lodash';\n\nimport { useDevCenterRouter } from '../effects/useDevCenterRouter';\n\nimport styles from './UniversalLink.css';\n\nexport function UniversalLink(props) {\n const {\n href = null,\n children,\n className = null,\n 'data-testid': dataTestId = 'UniversalLink',\n onClick = DEFAULT_UNIVERSAL_LINK_ON_CLICK,\n } = props;\n const devCenterRouter = useDevCenterRouter();\n\n if (devCenterRouter) {\n return (\n // NOTE: \"a\" element is needed to drag chip to tab bar while clicks are handled by button onClick handler\n <a href={href || null}>\n <button\n data-testid={dataTestId}\n tabIndex=\"0\"\n role=\"link\"\n className={classNames(styles.buttonLink, className)}\n onClick={e => {\n if (href) {\n e.stopPropagation();\n onClick(e);\n if (e.metaKey || e.ctrlKey) {\n window.open(href, '_blank');\n } else {\n devCenterRouter.push(href);\n }\n }\n }}\n >\n {children}\n </button>\n </a>\n );\n }\n\n // react-router's Link pushes `to` verbatim on click, so a null one throws there\n if (!href) {\n return (\n <span data-testid={dataTestId} className={className}>\n {children}\n </span>\n );\n }\n\n return (\n <ReactRouterLink data-testid={dataTestId} to={href} className={className}>\n {children}\n </ReactRouterLink>\n );\n}\n\nUniversalLink.propTypes = {\n href: PropTypes.any,\n children: PropTypes.node.isRequired,\n className: PropTypes.string,\n onClick: PropTypes.func,\n 'data-testid': PropTypes.string,\n};\n\nconst DEFAULT_UNIVERSAL_LINK_ON_CLICK = noop;\n"],"names":["UniversalLink","props","href","_props$href","children","_props$className","className","_props$dataTestid","dataTestId","_props$onClick","onClick","DEFAULT_UNIVERSAL_LINK_ON_CLICK","devCenterRouter","useDevCenterRouter","_jsx","tabIndex","role","classNames","styles","buttonLink","e","stopPropagation","metaKey","ctrlKey","window","open","push","ReactRouterLink","to","propTypes","PropTypes","any","node","isRequired","string","func","noop"],"mappings":"8QASO,SAASA,EAAcC,GAC5B,IAMIA,EAAAA,EALFC,KAAAA,aAAO,KAAIC,EACXC,EAIEH,EAJFG,SAAQC,EAINJ,EAHFK,UAAAA,aAAY,KAAID,EAAAE,EAGdN,EAFF,eAAeO,aAAa,gBAAeD,EAAAE,EAEzCR,EADFS,QAAAA,aAAUC,EAA+BF,EAErCG,EAAkBC,IAExB,OAAID,EAGAE,EAAA,IAAA,CAAGZ,KAAMA,GAAQ,KAAKE,SACpBU,EAAA,SAAA,CACE,cAAaN,EACbO,SAAS,IACTC,KAAK,OACLV,UAAWW,EAAWC,EAAOC,WAAYb,GACzCI,QAAS,SAAAU,GACHlB,IACFkB,EAAEC,kBACFX,EAAQU,GACJA,EAAEE,SAAWF,EAAEG,QACjBC,OAAOC,KAAKvB,EAAM,UAElBU,EAAgBc,KAAKxB,GAGzB,EAAAE,SAEDA,MAOJF,EASHY,EAACa,EAAe,CAAC,cAAanB,EAAYoB,GAAI1B,EAAMI,UAAWA,EAAUF,SACtEA,IARDU,EAAA,OAAA,CAAM,cAAaN,EAAYF,UAAWA,EAAUF,SACjDA,GAUT,CAEAJ,EAAc6B,UAAY,CACxB3B,KAAM4B,EAAUC,IAChB3B,SAAU0B,EAAUE,KAAKC,WACzB3B,UAAWwB,EAAUI,OACrBxB,QAASoB,EAAUK,KACnB,cAAeL,EAAUI,QAG3B,IAAMvB,EAAkCyB"}
|
|
@@ -106,10 +106,10 @@ export declare const BHA_COMPONENT_TYPES: ({
|
|
|
106
106
|
})[];
|
|
107
107
|
})[];
|
|
108
108
|
export declare const BHA_GENERAL_FIELD_TYPES: ({
|
|
109
|
+
unit?: undefined;
|
|
109
110
|
name: string;
|
|
110
111
|
label: string;
|
|
111
112
|
cond?: undefined;
|
|
112
|
-
unit?: undefined;
|
|
113
113
|
col_size?: undefined;
|
|
114
114
|
family?: undefined;
|
|
115
115
|
} | {
|
|
@@ -134,8 +134,8 @@ export declare const BHA_GENERAL_FIELD_TYPES: ({
|
|
|
134
134
|
col_size: number;
|
|
135
135
|
family?: undefined;
|
|
136
136
|
} | {
|
|
137
|
-
cond?: undefined;
|
|
138
137
|
unit?: undefined;
|
|
138
|
+
cond?: undefined;
|
|
139
139
|
name: string;
|
|
140
140
|
label: string;
|
|
141
141
|
col_size: number;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCompanyMetricKey.test.d.ts","sourceRoot":"","sources":["../../../../../src/components/OffsetWellPickerV4/effects/__tests__/useCompanyMetricKey.test.js"],"names":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCompanyMetricKey.d.ts","sourceRoot":"","sources":["../../../../src/components/OffsetWellPickerV4/effects/useCompanyMetricKey.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAa,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"useCompanyMetricKey.d.ts","sourceRoot":"","sources":["../../../../src/components/OffsetWellPickerV4/effects/useCompanyMetricKey.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAa,MAAM,OAAO,CAAC;AAe5C;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAJlC,MAIkC,EAAE,gBAAgB,EAHpD,MAAM,EAG8C,GAFlD,UAAU,CAAC,OAAO,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAgCjD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.test.d.ts","sourceRoot":"","sources":["../../../../src/components/OffsetWellPickerV5/__tests__/constants.test.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,aAAa,gBAAiB,MAAM,KAAG,cAAc,cAAc,CAoBxE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PeriodFilterSelect.js","sources":["../../../../../../../src/components/OffsetWellPickerV5/components/Filter/components/PeriodFilterSelect/PeriodFilterSelect.tsx"],"sourcesContent":["import { useCallback } from 'react';\n\nimport { OBJECTIVE_PERIOD_LIST } from '../../../../constants';\nimport { useIsAllWellsLoading } from '../../../../hooks/useIsAllWellsLoading';\nimport type { PeriodType } from '../../../../stores/filter-store/types';\n\nimport { AutocompleteNext, TextInputNext } from '~/componentsV2';\n\ntype PeriodOption = {\n id:
|
|
1
|
+
{"version":3,"file":"PeriodFilterSelect.js","sources":["../../../../../../../src/components/OffsetWellPickerV5/components/Filter/components/PeriodFilterSelect/PeriodFilterSelect.tsx"],"sourcesContent":["import { useCallback } from 'react';\n\nimport { OBJECTIVE_PERIOD_LIST } from '../../../../constants';\nimport { useIsAllWellsLoading } from '../../../../hooks/useIsAllWellsLoading';\nimport type { PeriodType } from '../../../../stores/filter-store/types';\n\nimport { AutocompleteNext, TextInputNext } from '~/componentsV2';\n\ntype PeriodOption = {\n id: PeriodType;\n title: string;\n};\n\ntype PeriodFilterSelectProps = {\n value: PeriodType | null;\n onChange: (value: PeriodType | null) => void;\n testId?: string;\n dropdownClassName?: string;\n};\n\nexport const PeriodFilterSelect = ({\n value,\n onChange,\n testId,\n dropdownClassName,\n}: PeriodFilterSelectProps) => {\n const disabled = useIsAllWellsLoading();\n const options: PeriodOption[] = OBJECTIVE_PERIOD_LIST.map(item => ({\n id: item.value,\n title: item.label,\n }));\n\n const handleChange = useCallback(\n (selectedOption: PeriodOption | undefined) => {\n if (!selectedOption) {\n return;\n }\n\n if (selectedOption.id === 'all') {\n onChange(null);\n } else {\n onChange(selectedOption.id);\n }\n },\n [onChange]\n );\n\n return (\n <AutocompleteNext\n label={\n <TextInputNext.Label infoTooltip=\"Based on the latest data received from the drilling stream\">\n Date\n </TextInputNext.Label>\n }\n options={options}\n value={disabled ? undefined : value ?? 'all'}\n onChange={handleChange}\n clearable={false}\n testId={testId}\n dropdownClassName={dropdownClassName}\n disabled={disabled}\n placeholder={disabled ? 'All' : undefined}\n />\n );\n};\n\nPeriodFilterSelect.displayName = 'PeriodFilterSelect';\n"],"names":["PeriodFilterSelect","_ref","value","onChange","testId","dropdownClassName","disabled","useIsAllWellsLoading","options","OBJECTIVE_PERIOD_LIST","map","item","id","title","label","handleChange","useCallback","selectedOption","_jsx","AutocompleteNext","TextInputNext","Label","infoTooltip","children","undefined","clearable","placeholder","displayName"],"mappings":"6riBAoBaA,IAAAA,EAAqB,SAKHC,GAAA,IAJ7BC,IAAAA,MACAC,IAAAA,SACAC,IAAAA,OACAC,IAAAA,kBAEMC,EAAWC,IACXC,EAA0BC,EAAsBC,KAAI,SAAAC,GAAI,MAAK,CACjEC,GAAID,EAAKT,MACTW,MAAOF,EAAKG,MACb,IAEKC,EAAeC,GACnB,SAACC,GACMA,IAIqB,QAAtBA,EAAeL,GACjBT,EAAS,MAETA,EAASc,EAAeL,IAE5B,GACA,CAACT,IAGH,OACEe,EAACC,EAAgB,CACfL,MACEI,EAACE,EAAcC,MAAK,CAACC,YAAY,6DAA4DC,SAAA,SAI/Ff,QAASA,EACTN,MAAOI,OAAWkB,EAAYtB,QAAAA,EAAS,MACvCC,SAAUY,EACVU,WAAW,EACXrB,OAAQA,EACRC,kBAAmBA,EACnBC,SAAUA,EACVoB,YAAapB,EAAW,WAAQkB,GAGtC,EAEAxB,EAAmB2B,YAAc"}
|
|
@@ -7,7 +7,8 @@ type MetricsCellsProps = {
|
|
|
7
7
|
columnsMap: ColumnsMap;
|
|
8
8
|
lastCellColumn: string;
|
|
9
9
|
loadingWellIds: Set<number>;
|
|
10
|
+
maxLines: number;
|
|
10
11
|
};
|
|
11
|
-
export declare const MetricsCells: ({ data, metricsKeys, metricsMap, borderStyle, columnsMap, lastCellColumn, loadingWellIds, }: MetricsCellsProps) => import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export declare const MetricsCells: ({ data, metricsKeys, metricsMap, borderStyle, columnsMap, lastCellColumn, loadingWellIds, maxLines, }: MetricsCellsProps) => import("react/jsx-runtime").JSX.Element;
|
|
12
13
|
export {};
|
|
13
14
|
//# sourceMappingURL=MetricsCells.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MetricsCells.d.ts","sourceRoot":"","sources":["../../../../../../../src/components/OffsetWellPickerV5/components/OffsetWellsTable/cells/MetricsCells/MetricsCells.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAKhF,KAAK,iBAAiB,GAAG;IACvB,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACtC,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,EAAE,UAAU,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"MetricsCells.d.ts","sourceRoot":"","sources":["../../../../../../../src/components/OffsetWellPickerV5/components/OffsetWellsTable/cells/MetricsCells/MetricsCells.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAKhF,KAAK,iBAAiB,GAAG;IACvB,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACtC,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,EAAE,UAAU,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,YAAY,0GAStB,iBAAiB,4CA+BnB,CAAC"}
|
package/components/OffsetWellPickerV5/components/OffsetWellsTable/cells/MetricsCells/MetricsCells.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import e from"@babel/runtime/helpers/defineProperty";import{get as l}from"lodash";import t from"classnames";import{TableCell as o}from"@material-ui/core";import{MetricCell as r}from"../../components/MetricCell/MetricCell.js";import{PAGE_NAME as i}from"../types.js";import m from"../../components/OffsetWellsTableRow/OffsetWellsTableRow.module.css.js";import{jsx as s,Fragment as a}from"react/jsx-runtime";var n=function(n){var d=n.data,c=n.metricsKeys,f=n.metricsMap,p=n.borderStyle,u=n.columnsMap,v=n.lastCellColumn,h=n.loadingWellIds;return s(a,{children:c.map((function(a,n){var
|
|
1
|
+
import e from"@babel/runtime/helpers/defineProperty";import{get as l}from"lodash";import t from"classnames";import{TableCell as o}from"@material-ui/core";import{MetricCell as r}from"../../components/MetricCell/MetricCell.js";import{PAGE_NAME as i}from"../types.js";import m from"../../components/OffsetWellsTableRow/OffsetWellsTableRow.module.css.js";import{jsx as s,Fragment as a}from"react/jsx-runtime";var n=function(n){var d=n.data,c=n.metricsKeys,f=n.metricsMap,p=n.borderStyle,u=n.columnsMap,v=n.lastCellColumn,h=n.loadingWellIds,y=n.maxLines;return s(a,{children:c.map((function(a,n){var b,g,x=f.get(a),C=x?l(d,x.key):void 0;return s(o,{"data-testid":"".concat(i,"_").concat(a),className:t(m.bodyCell,p,e({},m.lastCell,"lastMetric"===v&&n===c.length-1)),style:{minWidth:(null===(b=u.get(a))||void 0===b?void 0:b.minWidth)||0,flex:(null===(g=u.get(a))||void 0===g?void 0:g.flex)||0},children:s(r,{value:C,wellId:d.id,loadingWellIds:h,metric:x,maxLines:y})},a)}))})};export{n as MetricsCells};
|
|
2
2
|
//# sourceMappingURL=MetricsCells.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MetricsCells.js","sources":["../../../../../../../src/components/OffsetWellPickerV5/components/OffsetWellsTable/cells/MetricsCells/MetricsCells.tsx"],"sourcesContent":["import { get } from 'lodash';\nimport classNames from 'classnames';\nimport { TableCell } from '@material-ui/core';\n\nimport { MetricCell } from '../../components/MetricCell';\nimport type { WellData, MetricConfig, BorderStyle, ColumnsMap } from '../types';\nimport { PAGE_NAME } from '../types';\n\nimport styles from '../../components/OffsetWellsTableRow/OffsetWellsTableRow.module.css';\n\ntype MetricsCellsProps = {\n data: WellData;\n metricsKeys: string[];\n metricsMap: Map<string, MetricConfig>;\n borderStyle: BorderStyle;\n columnsMap: ColumnsMap;\n lastCellColumn: string;\n loadingWellIds: Set<number>;\n};\n\nexport const MetricsCells = ({\n data,\n metricsKeys,\n metricsMap,\n borderStyle,\n columnsMap,\n lastCellColumn,\n loadingWellIds,\n}: MetricsCellsProps) => (\n <>\n {metricsKeys.map((metricsKey, index) => {\n const metric = metricsMap.get(metricsKey);\n const value = metric\n ? (get(data, metric.key) as number | string | null | undefined)\n : undefined;\n\n return (\n <TableCell\n data-testid={`${PAGE_NAME}_${metricsKey}`}\n key={metricsKey}\n className={classNames(styles.bodyCell, borderStyle, {\n [styles.lastCell]: lastCellColumn === 'lastMetric' && index === metricsKeys.length - 1,\n })}\n style={{\n minWidth: columnsMap.get(metricsKey)?.minWidth || 0,\n flex: columnsMap.get(metricsKey)?.flex || 0,\n }}\n >\n <MetricCell\n value={value}\n wellId={data.id}\n loadingWellIds={loadingWellIds}\n metric={metric}\n />\n </TableCell>\n );\n })}\n </>\n);\n"],"names":["MetricsCells","_ref","data","metricsKeys","metricsMap","borderStyle","columnsMap","lastCellColumn","loadingWellIds","_jsx","_Fragment","children","map","metricsKey","index","_columnsMap$get","_columnsMap$get2","metric","get","value","key","undefined","TableCell","PAGE_NAME","className","classNames","styles","bodyCell","lastCell","length","style","minWidth","flex","MetricCell","wellId","id"],"mappings":"
|
|
1
|
+
{"version":3,"file":"MetricsCells.js","sources":["../../../../../../../src/components/OffsetWellPickerV5/components/OffsetWellsTable/cells/MetricsCells/MetricsCells.tsx"],"sourcesContent":["import { get } from 'lodash';\nimport classNames from 'classnames';\nimport { TableCell } from '@material-ui/core';\n\nimport { MetricCell } from '../../components/MetricCell';\nimport type { WellData, MetricConfig, BorderStyle, ColumnsMap } from '../types';\nimport { PAGE_NAME } from '../types';\n\nimport styles from '../../components/OffsetWellsTableRow/OffsetWellsTableRow.module.css';\n\ntype MetricsCellsProps = {\n data: WellData;\n metricsKeys: string[];\n metricsMap: Map<string, MetricConfig>;\n borderStyle: BorderStyle;\n columnsMap: ColumnsMap;\n lastCellColumn: string;\n loadingWellIds: Set<number>;\n maxLines: number;\n};\n\nexport const MetricsCells = ({\n data,\n metricsKeys,\n metricsMap,\n borderStyle,\n columnsMap,\n lastCellColumn,\n loadingWellIds,\n maxLines,\n}: MetricsCellsProps) => (\n <>\n {metricsKeys.map((metricsKey, index) => {\n const metric = metricsMap.get(metricsKey);\n const value = metric\n ? (get(data, metric.key) as number | string | null | undefined)\n : undefined;\n\n return (\n <TableCell\n data-testid={`${PAGE_NAME}_${metricsKey}`}\n key={metricsKey}\n className={classNames(styles.bodyCell, borderStyle, {\n [styles.lastCell]: lastCellColumn === 'lastMetric' && index === metricsKeys.length - 1,\n })}\n style={{\n minWidth: columnsMap.get(metricsKey)?.minWidth || 0,\n flex: columnsMap.get(metricsKey)?.flex || 0,\n }}\n >\n <MetricCell\n value={value}\n wellId={data.id}\n loadingWellIds={loadingWellIds}\n metric={metric}\n maxLines={maxLines}\n />\n </TableCell>\n );\n })}\n </>\n);\n"],"names":["MetricsCells","_ref","data","metricsKeys","metricsMap","borderStyle","columnsMap","lastCellColumn","loadingWellIds","maxLines","_jsx","_Fragment","children","map","metricsKey","index","_columnsMap$get","_columnsMap$get2","metric","get","value","key","undefined","TableCell","PAGE_NAME","className","classNames","styles","bodyCell","lastCell","length","style","minWidth","flex","MetricCell","wellId","id"],"mappings":"qZAqBaA,IAAAA,EAAe,SAAHC,GAAA,IACvBC,IAAAA,KACAC,IAAAA,YACAC,IAAAA,WACAC,IAAAA,YACAC,IAAAA,WACAC,IAAAA,eACAC,IAAAA,eACAC,IAAAA,SAAQ,OAERC,EAAAC,EAAA,CAAAC,SACGT,EAAYU,KAAI,SAACC,EAAYC,GAAU,IAAAC,EAAAC,EAChCC,EAASd,EAAWe,IAAIL,GACxBM,EAAQF,EACTC,EAAIjB,EAAMgB,EAAOG,UAClBC,EAEJ,OACEZ,EAACa,EAAS,CACR,cAAgBC,GAAAA,OAAAA,EAAaV,KAAAA,OAAAA,GAE7BW,UAAWC,EAAWC,EAAOC,SAAUvB,EACpCsB,EAAAA,GAAAA,EAAOE,SAA8B,eAAnBtB,GAAmCQ,IAAUZ,EAAY2B,OAAS,IAEvFC,MAAO,CACLC,UAAU,QAAAhB,EAAAV,EAAWa,IAAIL,UAAf,IAAAE,OAAA,EAAAA,EAA4BgB,WAAY,EAClDC,MAAgC,QAA1B3B,EAAAA,EAAWa,IAAIL,UAAW,IAAAG,OAAA,EAA1BA,EAA4BgB,OAAQ,GAC1CrB,SAEFF,EAACwB,EAAU,CACTd,MAAOA,EACPe,OAAQjC,EAAKkC,GACb5B,eAAgBA,EAChBU,OAAQA,EACRT,SAAUA,KAdPK,OAmBV"}
|
|
@@ -13,8 +13,10 @@ type MetricCellProps = {
|
|
|
13
13
|
wellId: number;
|
|
14
14
|
loadingWellIds: Set<number>;
|
|
15
15
|
metric: MetricConfig | undefined;
|
|
16
|
+
maxLines: number;
|
|
16
17
|
};
|
|
17
|
-
declare const
|
|
18
|
+
export declare const TEXT_VALUE_TEST_ID = "MetricCell_text";
|
|
19
|
+
declare const MetricCellComponent: ({ value, wellId, loadingWellIds, metric, maxLines, }: MetricCellProps) => import("react/jsx-runtime").JSX.Element;
|
|
18
20
|
export declare const MetricCell: import("react").MemoExoticComponent<typeof MetricCellComponent>;
|
|
19
21
|
export {};
|
|
20
22
|
//# sourceMappingURL=MetricCell.d.ts.map
|