{"version":3,"file":"default-packages_cad-core_src_index_ts.6668c80d1172d0cc.prod.js","mappings":"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","sources":["webpack://aurora-new-frontend/./packages/common/packages/core/src/zone/zone.tsx","webpack://aurora-new-frontend/./packages/common/packages/core/src/zone/zones.ts","webpack://aurora-new-frontend/./packages/common/packages/proposal-iframe/src/hook.ts","webpack://aurora-new-frontend/./packages/common/packages/proposal-iframe/src/proposal-iframe.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/shade-report/shade-report.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/shade-report/shade-report-routes.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/system-components/system-component-types.ts","webpack://aurora-new-frontend/./packages/cad-core/src/system-components/system-component-util.ts","webpack://aurora-new-frontend/./packages/cad-core/src/system-components/system-components.generated.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/unsaved-changes-guard.generated.tsx","webpack://aurora-new-frontend/./packages/racking/src/racking-integration-modal/racking-integration-modal-core.tsx","webpack://aurora-new-frontend/./packages/racking/src/racking-integration-modal/racking-integration-modal.generated.tsx","webpack://aurora-new-frontend/./packages/racking/src/racking-iframe-container/racking-iframe-container.generated.tsx","webpack://aurora-new-frontend/./packages/common/packages/core/src/utils/formatOrFallback.ts","webpack://aurora-new-frontend/./packages/common/packages/core/src/hooks/use-locale-format/use-locale-format.ts","webpack://aurora-new-frontend/./packages/common/packages/core/src/utils/formatWattage.ts","webpack://aurora-new-frontend/./packages/cad-core/src/component-select/component-select-item.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/component-select/component-select-core.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/component-select/component-select-types.ts","webpack://aurora-new-frontend/./packages/cad-core/src/component-select/component-select-util.ts","webpack://aurora-new-frontend/./packages/cad-core/src/component-select/component-select-machine.ts","webpack://aurora-new-frontend/./packages/cad-core/src/component-select/component-select.generated.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/component-select/component-select.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/component-select/component-select-validators.ts","webpack://aurora-new-frontend/./packages/cad-core/src/component-modal/component-modal.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/mlpe-selection/mlpe-selection.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/ground-mount-modal/ground-mount-modal-core.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/property-limits.ts","webpack://aurora-new-frontend/./packages/cad-core/src/ground-mount-modal/ground-mount-modal-machine.ts","webpack://aurora-new-frontend/./packages/cad-core/src/ground-mount-modal/util.ts","webpack://aurora-new-frontend/./packages/cad-core/src/ground-mount-modal/ground-mount-modal.generated.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/ground-mount-modal/ground-mount-modal.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/inspector/walkway/fire-pathway-modal-core.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/inspector/cad-inspector-row.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/solar-panel-modal/solar-panel-modal-core.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/solar-panel-modal/solar-panel-modal.generated.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/standard-imagery-modal/standard-imagery-modal-core.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/cad-modals/cad-modals.generated.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/cad-modals/cad-modals.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/drawer.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/autodesigner/shared.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/autodesigner/types.ts","webpack://aurora-new-frontend/./packages/cad-core/src/autodesigner/autodesigner-minimum-irradiance.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/autodesigner/autodesigner-target-mode.tsx","webpack://aurora-new-frontend/./packages/common/packages/core/src/divider/divider.tsx","webpack://aurora-new-frontend/./packages/common/packages/core/src/hooks/use-url-id/use-url-id.ts","webpack://aurora-new-frontend/./packages/cad-core/src/autodesigner/autodesigner-selected-component.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/autodesigner/autodesigner-component-selection.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/autodesigner/autodesigner-components.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/autodesigner/shrinkable-header.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/autodesigner/autodesigner-core.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/autodesigner/autodesigner-energy-mode.tsx","webpack://aurora-new-frontend/./packages/common/packages/core/src/alert-tooltip/alert-tooltip.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/autodesigner/autodesigner-panels.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/autodesigner/autodesigner-utils.ts","webpack://aurora-new-frontend/./packages/cad-core/src/autodesigner/autodesigner.generated.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/autodesigner/autodesigner.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/autostring/inverter-params.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/autostring/autostring-core.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/autostring/settings-reducer.ts","webpack://aurora-new-frontend/./packages/cad-core/src/autostring/autostring-selection-section.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/autostring/components.generated.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/autostring/component-query-fixed.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/autostring/autostring.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/autostring/choose-panel-item.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/autostring/choose-panel.generated.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/autostring/choose-panel.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/cad-right-panel/cad-right-panel.generated.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/cad-right-panel/slide-in-panel.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/cad-right-panel/cad-right-panel.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/autostring/use-validation-error.ts","webpack://aurora-new-frontend/./packages/cad-core/src/cad-toast.tsx","webpack://aurora-new-frontend/./packages/common/packages/core/src/tab/tab.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/cad-performance-dropdown/advanced-section-core.tsx","webpack://aurora-new-frontend/./packages/common/packages/core/src/grid/grid-shared.tsx","webpack://aurora-new-frontend/./packages/common/packages/core/src/grid/grid-box.tsx","webpack://aurora-new-frontend/./packages/common/packages/core/src/constants/months.ts","webpack://aurora-new-frontend/./packages/cad-core/src/cad-performance-dropdown/bill-saving-form/shared/shared-form-types.ts","webpack://aurora-new-frontend/./packages/cad-core/src/cad-performance-dropdown/bill-saving-form/shared/shared-form-options.ts","webpack://aurora-new-frontend/./packages/cad-core/src/cad-performance-dropdown/bill-saving-form/fit-form/feed-in-tariff-card.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/cad-performance-dropdown/bill-saving-form/tou-form/rate-selection-modal.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/cad-performance-dropdown/bill-saving-form/bill-saving-form-core.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/cad-performance-dropdown/bill-saving-form/bill-saving-form.generated.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/cad-performance-dropdown/cad-performance-callout.tsx","webpack://aurora-new-frontend/./packages/common/packages/charts-lib/src/utils/custom-tooltip.tsx","webpack://aurora-new-frontend/./packages/common/packages/charts-lib/src/chart-core.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/cad-performance-dropdown/cad-performance-dropdown-panel.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/cad-performance-dropdown/cad-performance-dropdown-core.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/cad-performance-dropdown/performance-summary.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/cad-performance-dropdown/simulation-button/simulation-button.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/autoroof/autoroof-machine.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/autoroof/autoroof.generated.tsx","webpack://aurora-new-frontend/./packages/common/packages/org-permissions/src/constants.ts","webpack://aurora-new-frontend/./packages/common/packages/org-permissions/src/type.ts","webpack://aurora-new-frontend/./packages/common/packages/org-permissions/src/segment.ts","webpack://aurora-new-frontend/./packages/common/packages/org-permissions/src/org-permission-rules.ts","webpack://aurora-new-frontend/./packages/common/packages/org-permissions/src/provide-org-permissions.ts","webpack://aurora-new-frontend/./packages/cad-core/src/design-settings/simulation-settings/legacy-aurora-simulation-form.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/design-settings/simulation-settings/pvwatts-simulation-form.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/design-settings/simulation-settings/monthly-loss-column.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/design-settings/simulation-settings/monthly-loss-modal-machine.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/design-settings/simulation-settings/monthly-loss-modal.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/design-settings/simulation-settings/annual-system-loss-input.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/design-settings/simulation-settings/system-losses.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/design-settings/simulation-settings/legacy-simulation-settings-core.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/design-settings/simulation-settings/simulation-settings.generated.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/design-settings/simulation-settings/legacy-simulation-settings.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/design-settings/simulation-settings/aurora-simulation-form.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/design-settings/simulation-settings/simulation-settings-core.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/design-settings/simulation-settings/simulation-settings.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/design-settings/system-settings/system-settings-core.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/design-settings/system-settings/system-settings.generated.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/design-settings/design-settings.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/design-settings/design-settings-button.generated.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/map-imagery-selector/use-nearmap-availability.generated.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/nearmap-modal/nearmap-imagery-selection.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/nearmap-modal/nearmap-modal-credit-popover.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/nearmap-modal/nearmap-modal-core.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/nearmap-modal/nearmap-modal.generated.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/nearmap-modal/types.ts","webpack://aurora-new-frontend/./packages/cad-core/src/nearmap-modal/remove-conflicting-images.generated.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/map-imagery-selector/map-imagery-section-title.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/map-imagery-selector/map-imagery-selector-item.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/map-imagery-selector/map-imagery-selector-core.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/map-imagery-selector/map-imagery-selector.generated.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/map-imagery-selector/use-upload-custom-images.generated.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/component-dropdown/component-dropdown.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/irradiance-inspector/irradiance-inspector-monthly-chart.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/irradiance-inspector/irradiance-inspector-core.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/irradiance-inspector/irradiance-inspector.generated.tsx","webpack://aurora-new-frontend/./packages/cad-core/src/autodesigner/autodesigner-toast-manager.ts","webpack://aurora-new-frontend/./packages/common/packages/core/src/checkbox/checkbox.tsx","webpack://aurora-new-frontend/./packages/common/packages/core/src/input/text-input/text-input.tsx","webpack://aurora-new-frontend/./packages/common/packages/shared-domain/src/total-cost-headlines.ts","webpack://aurora-new-frontend/./packages/common/packages/shared-domain/src/use-search-tariff/use-search-tariff.generated.tsx","webpack://aurora-new-frontend/./packages/common/packages/shared-domain/src/use-search-tariff/tariff-search-input.tsx","webpack://aurora-new-frontend/./packages/common/packages/shared-domain/src/delete-project/use-delete-project/delete-project.generated.tsx","webpack://aurora-new-frontend/./packages/common/packages/shared-domain/src/use-show-incentive-errors/use-show-incentive-errors.generated.tsx","webpack://aurora-new-frontend/./packages/common/packages/shared-domain/src/delete-lead/delete-lead.tsx","webpack://aurora-new-frontend/./packages/common/packages/shared-domain/src/use-intercept-mouse/use-intercept-mouse.tsx","webpack://aurora-new-frontend/./packages/common/packages/shared-domain/src/use-current-user-is-EPC/use-current-user-is-EPC.generated.tsx","webpack://aurora-new-frontend/./packages/common/packages/shared-domain/src/use-partners-teams/use-partners-teams.generated.tsx","webpack://aurora-new-frontend/./packages/common/packages/shared-domain/src/use-partner-name/use-partner-name.generated.tsx","webpack://aurora-new-frontend/./packages/common/packages/core/src/utils/format-relative-date.ts","webpack://aurora-new-frontend/./packages/common/packages/shared-domain/src/agreement-status/agreement-status.ts","webpack://aurora-new-frontend/./packages/common/packages/shared-domain/src/design-request-status.ts","webpack://aurora-new-frontend/./packages/common/packages/shared-domain/src/proposal-share-status/proposal-share-status.ts","webpack://aurora-new-frontend/./packages/common/packages/shared-domain/src/status-selector/status-selector.tsx","webpack://aurora-new-frontend/./packages/common/packages/shared-domain/src/proposal-share/proposal-share.generated.tsx","webpack://aurora-new-frontend/./packages/common/packages/shared-domain/src/partner-searchable-multi-select/types.ts","webpack://aurora-new-frontend/./packages/common/packages/shared-domain/src/partner-searchable-multi-select/get-updated-partner-selections.ts","webpack://aurora-new-frontend/./packages/common/packages/shared-domain/src/partner-searchable-multi-select/utils.ts","webpack://aurora-new-frontend/./packages/common/packages/shared-domain/src/partner-searchable-multi-select/use-partner-search.generated.tsx","webpack://aurora-new-frontend/./packages/common/packages/shared-domain/src/use-query-and-download-agreement/use-query-and-download-agreement.generated.tsx","webpack://aurora-new-frontend/./packages/common/packages/shared-domain/src/reassign-project-modal/reassign-project.generated.tsx","webpack://aurora-new-frontend/./packages/common/packages/shared-domain/src/reassign-project-modal/use-team-options/use-team-options.ts","webpack://aurora-new-frontend/./packages/common/packages/shared-domain/src/reassign-project-modal/reassign-project-modal.tsx"],"sourcesContent":["import { FunctionComponent } from 'react';\nimport { View } from 'react-navi';\n\nimport { ZoneSymbol } from './types';\n\ninterface ZoneProps {\n view: ZoneSymbol;\n}\n\n/*\n * A Zone is just a \"view\" that is selective about which view it will render. This is because\n * navi will render the first unrendered view and it may not match the one we want. This might\n * be a lack of understanding in how zones are supposed to work in navi or a bug. Either way\n * this gives us a semantic way to render a specified view.\n * */\nexport const Zone: FunctionComponent = ({ view }) => (\n chunk?.view?.props?.view === view} />\n);\n\nexport const ZoneView: FunctionComponent = ({ children }) => <>{children};\n","export const PageContent = Symbol('PageContent');\nexport const PageNavigation = Symbol('PageNavigation');\nexport const PageContentNavigation = Symbol('PageContentNavigation');\nexport const ProjectOverviewPageSection = Symbol('ProjectOverviewPageSection');\nexport const LeadOverviewPageSection = Symbol('LeadOverviewPageSection');\n","import { useEffect, useState } from 'react';\n\nimport { AppConfig, AuthToken, useAppModule } from '@aurorasolar/common-module-loader';\n\nenum ProposalPath {\n PROPOSAL = 'proposals',\n TEMPLATE = 'proposal-templates',\n}\n\nexport const useProposalTemplateIFrameSrc = (id: string) => {\n return useIFrameSrc(id, ProposalPath.TEMPLATE);\n};\n\nexport const useProposalIFrameSrc = (id: string) => {\n return useIFrameSrc(id, ProposalPath.PROPOSAL);\n};\n\nconst useIFrameSrc = (id: string, path: ProposalPath) => {\n const [iframeSrc, setIframeSrc] = useState('');\n const token$ = useAppModule(AuthToken);\n const appConfig = useAppModule(AppConfig);\n\n useEffect(() => {\n if (token$ && appConfig) {\n const host = appConfig.proposalsIFrameHost;\n const token = token$.getValue();\n setIframeSrc(`//${host}/${path}/${id}?authToken=${token}`);\n }\n }, [appConfig, id, path, token$]);\n\n return iframeSrc;\n};\n","import { FC, useCallback, useRef, useState } from 'react';\nimport styled from 'styled-components';\n\nimport { Loader } from '@aurorasolar/common-core/src/loader';\n\nconst StyledIFrame = styled.iframe`\n border: none;\n height: 100%;\n width: 100%;\n`;\n\nconst StyledLoader = styled(Loader)`\n position: absolute;\n height: 100%;\n width: 100%;\n background-color: white;\n`;\n\nexport const ProposalIFrame: FC<{ iframeSrc: string; useLoader?: boolean }> = ({\n iframeSrc,\n useLoader = true,\n}) => {\n const iframe = useRef(null);\n const [loading, setLoading] = useState(useLoader);\n\n const handleIFrameLoad = useCallback((event) => {\n setLoading(false);\n event.target.focus(); // Fixes bug with holding spacebar to pan CAD\n }, []);\n return (\n <>\n {loading && }\n \n \n );\n};\n","import { FC, useEffect, useState } from 'react';\nimport styled from 'styled-components';\n\nimport { Colors } from '@aurorasolar/common-core/src/colors';\nimport { Loader, LoaderProps } from '@aurorasolar/common-core/src/loader';\nimport { AppConfig, AuthToken, useAppModule } from '@aurorasolar/common-module-loader';\nimport { ProposalIFrame } from '@aurorasolar/common-proposal-iframe';\n\n// Messages from the iframe\nconst PORTAL_LOADED_MESSAGE = 'shade-report-portal-loaded';\nconst MODEL_LOADED_MESSAGE = 'shade-report-model-loaded';\n\nenum ShadeReportState {\n ROUTE_LOADING,\n MODEL_LOADING,\n LOADED,\n}\nconst ShadeReportLoader = styled>(Loader)`\n position: absolute;\n z-index: 2;\n height: 100%;\n width: 100%;\n && {\n .bp3-spinner-head {\n transition: stroke 0.5s ease;\n stroke: ${({ white }) => (white ? Colors.WHITE : Colors.PRIMARY_GREEN)};\n }\n }\n`;\nconst EmptyShadeReport = styled.div<{ state: ShadeReportState }>`\n background: ${Colors.GRAY_500};\n height: 100%;\n width: 100%;\n overflow: hidden;\n position: relative;\n\n &::before {\n /* simulates the V1 title bar */\n content: 'Shade Report';\n position: absolute;\n background: ${Colors.WHITE};\n width: 100%;\n height: 64px;\n line-height: 64px;\n top: 0;\n padding-left: 32px;\n font-size: 20px;\n font-weight: 500;\n }\n\n iframe {\n transition: opacity 0.5s ease;\n opacity: ${({ state }) => (state === ShadeReportState.ROUTE_LOADING ? 0 : 1)};\n width: 100%;\n height: 100%;\n position: relative;\n z-index: 1;\n }\n`;\n\nexport const ShadeReport: FC<{ designId: string; projectId: string }> = ({\n designId,\n projectId,\n}) => {\n const [state, setState] = useState(ShadeReportState.ROUTE_LOADING);\n const [iframeSrc, setIframeSrc] = useState('');\n const token$ = useAppModule(AuthToken);\n const appConfig = useAppModule(AppConfig);\n\n useEffect(() => {\n const listenForPortalLoad = (event: MessageEvent) => {\n setState((previousState) => {\n if (\n previousState === ShadeReportState.ROUTE_LOADING &&\n event.data === PORTAL_LOADED_MESSAGE\n ) {\n return ShadeReportState.MODEL_LOADING;\n }\n if (\n previousState === ShadeReportState.MODEL_LOADING &&\n event.data === MODEL_LOADED_MESSAGE\n ) {\n return ShadeReportState.LOADED;\n }\n return previousState;\n });\n };\n window.addEventListener('message', listenForPortalLoad);\n\n return () => {\n window.removeEventListener('message', listenForPortalLoad);\n };\n }, []);\n\n useEffect(() => {\n if (token$ == null || appConfig == null) {\n return () => {};\n }\n const tokenSubscription = token$.subscribe((token) => {\n const host = appConfig.proposalsIFrameHost;\n const path = `/projects/${projectId}/designs/${designId}/shade-report-portal`;\n setIframeSrc(`//${host}${path}?authToken=${token}`);\n });\n\n return () => tokenSubscription.unsubscribe();\n }, [designId, projectId, token$, appConfig]);\n return (\n \n {state !== ShadeReportState.LOADED && (\n \n )}\n ;\n \n );\n};\n","import { route } from 'navi';\n\nimport { Zones, ZoneView } from '@aurorasolar/common-core/src/zone';\n\nimport { ShadeReport } from './shade-report';\n\nexport const shadeReportRoutes = route((request) => ({\n data: { section: 'documents' },\n view: (\n \n \n \n ),\n}));\n","import { SystemComponentSearchQuery } from './system-components.generated';\n\n/**\n * The types of system components that can be queried.\n *\n * The string values are used by the UI\n */\nexport enum SystemComponentType {\n CombinerBox = 'Combiner box',\n DcOptimizer = 'DC optimizer',\n Disconnect = 'Disconnect',\n LoadCenter = 'Load center',\n Meter = 'Meter',\n ServicePanel = 'Service panel',\n SolarInverter = 'Solar inverter',\n SolarPanel = 'Solar panel',\n Microinverter = 'Microinverter',\n SingleInputMicroinverter = 'Single input microinverter',\n}\n\n/**\n * Maps a `SystemComponentType` enum to the associated GraphQL __typename.\n */\nexport type SystemComponentTypename =\n T extends SystemComponentType.CombinerBox\n ? 'CombinerBox'\n : T extends SystemComponentType.DcOptimizer\n ? 'DcOptimizer'\n : T extends SystemComponentType.Disconnect\n ? 'Disconnect'\n : T extends SystemComponentType.LoadCenter\n ? 'LoadCenter'\n : T extends SystemComponentType.Meter\n ? 'Meter'\n : T extends SystemComponentType.ServicePanel\n ? 'ServicePanel'\n : T extends SystemComponentType.SolarInverter\n ? 'SolarInverter'\n : T extends SystemComponentType.SolarPanel\n ? 'SolarPanel'\n : T extends SystemComponentType.Microinverter\n ? 'SolarInverter'\n : T extends SystemComponentType.SingleInputMicroinverter\n ? 'SolarInverter'\n : never;\n\n/**\n * A system electrical component\n * contains all of the fields necessary for CAD\n * and all fields necessary to display in the UI\n */\nexport type SystemComponent =\n SystemComponentSearchQuery['componentSearch']['components'][0] & {\n __typename: SystemComponentTypename;\n };\n","import { ComponentTypes } from '@aurorasolar/graphql-client-schema';\n\nimport { SystemComponentType } from './system-component-types';\nimport { SystemComponentSearchQueryVariables } from './system-components.generated';\n\nexport const componentQueryParams: Record<\n SystemComponentType,\n {\n type: ComponentTypes;\n filter?: SystemComponentSearchQueryVariables['input']['filter'];\n }\n> = {\n [SystemComponentType.CombinerBox]: { type: ComponentTypes.CombinerBox },\n [SystemComponentType.DcOptimizer]: { type: ComponentTypes.DcOptimizer },\n [SystemComponentType.Disconnect]: { type: ComponentTypes.Disconnect },\n [SystemComponentType.LoadCenter]: { type: ComponentTypes.LoadCenter },\n [SystemComponentType.Meter]: { type: ComponentTypes.Meter },\n [SystemComponentType.Microinverter]: {\n filter: { isMicroinverter: true, isSolarCompatible: true },\n type: ComponentTypes.SolarInverter,\n },\n [SystemComponentType.ServicePanel]: { type: ComponentTypes.ServicePanel },\n [SystemComponentType.SolarInverter]: {\n filter: { isMicroinverter: false, isSolarCompatible: true },\n type: ComponentTypes.SolarInverter,\n },\n [SystemComponentType.SolarPanel]: {\n type: ComponentTypes.SolarPanel,\n },\n [SystemComponentType.SingleInputMicroinverter]: {\n filter: { isMicroinverter: true, isSingleInputMicroinverter: true, isSolarCompatible: true },\n type: ComponentTypes.SolarInverter,\n },\n};\n","// @ts-ignore: Ignore unused { * as Types } import\nimport * as Types from '@aurorasolar/graphql-client-schema';\n\nimport { gql } from '@apollo/client';\nimport { CadRequiredComponentPropertiesFragmentDoc } from '../../../common/packages/data-access-layer/src/graphql/cad-electrical-components-fragment.generated';\nimport * as Apollo from '@apollo/client';\nconst defaultOptions = {} as const;\nexport type SystemComponentSearchQueryVariables = Types.Exact<{\n input: Types.ComponentSearchQuery;\n}>;\n\n\nexport type SystemComponentSearchQuery = { __typename: 'Query', componentSearch: { __typename: 'ComponentSearchResult', components: Array<{ __typename: 'Battery', id: string, name?: string | null | undefined, starred: boolean, manufacturer?: { __typename: 'Manufacturer', id: string, name?: string | null | undefined, displayName?: string | null | undefined } | null | undefined } | { __typename: 'CombinerBox', id: string, name?: string | null | undefined, starred: boolean, fuseRating?: number | null | undefined, voltageRating?: number | null | undefined, manufacturer?: { __typename: 'Manufacturer', id: string, name?: string | null | undefined, displayName?: string | null | undefined } | null | undefined } | { __typename: 'DcOptimizer', numInputs?: number | null | undefined, id: string, name?: string | null | undefined, starred: boolean, efficiency?: number | null | undefined, efficiencyMax?: number | null | undefined, hasGlobalMppt?: boolean | null | undefined, inputShortCircuitCurrentMax?: number | null | undefined, inputVoltageMax?: number | null | undefined, isExternalMppt?: boolean | null | undefined, isLongString?: boolean | null | undefined, isHuawei?: boolean | null | undefined, isSolarEdge?: boolean | null | undefined, maxInputCurrent?: number | null | undefined, mpptOperatingVoltageMax?: number | null | undefined, mpptOperatingVoltageMin?: number | null | undefined, mpptRangeMax?: number | null | undefined, mpptRangeMin?: number | null | undefined, operatingModel?: string | null | undefined, optimizationBehavior?: string | null | undefined, outputCurrentMax?: number | null | undefined, outputVoltageMax?: number | null | undefined, price?: number | null | undefined, stcInputPowerMax?: number | null | undefined, systemVoltageMax?: number | null | undefined, usesSelectiveOptimization?: boolean | null | undefined, manufacturer?: { __typename: 'Manufacturer', id: string, name?: string | null | undefined, displayName?: string | null | undefined } | null | undefined } | { __typename: 'Disconnect', id: string, name?: string | null | undefined, starred: boolean, fused?: boolean | null | undefined, fuseRating?: number | null | undefined, currentRating?: number | null | undefined, voltageRating?: number | null | undefined, manufacturer?: { __typename: 'Manufacturer', id: string, name?: string | null | undefined, displayName?: string | null | undefined } | null | undefined } | { __typename: 'LoadCenter', id: string, name?: string | null | undefined, starred: boolean, mainBreakerRating?: number | null | undefined, busRating?: number | null | undefined, isBreaker?: boolean | null | undefined, manufacturer?: { __typename: 'Manufacturer', id: string, name?: string | null | undefined, displayName?: string | null | undefined } | null | undefined } | { __typename: 'Meter', id: string, name?: string | null | undefined, starred: boolean, currentRating?: number | null | undefined, manufacturer?: { __typename: 'Manufacturer', id: string, name?: string | null | undefined, displayName?: string | null | undefined } | null | undefined } | { __typename: 'ServicePanel', id: string, name?: string | null | undefined, starred: boolean, breakerRating?: number | null | undefined, busRating?: number | null | undefined, main?: boolean | null | undefined, manufacturer?: { __typename: 'Manufacturer', id: string, name?: string | null | undefined, displayName?: string | null | undefined } | null | undefined } | { __typename: 'SolarInverter', mppts?: number | null | undefined, id: string, name?: string | null | undefined, starred: boolean, efficiencyCec?: number | null | undefined, efficiencyEuropean?: number | null | undefined, efficiencyMax?: number | null | undefined, hasExternalMppt?: boolean | null | undefined, hasGlobalMppt?: boolean | null | undefined, inputVoltageMax?: number | null | undefined, inputVoltageMin?: number | null | undefined, inputVoltageSE?: number | null | undefined, isHuawei?: boolean | null | undefined, isSolarEdge?: boolean | null | undefined, isMicroinverter?: boolean | null | undefined, mpptRatedPowerVoltageMax?: number | null | undefined, mpptRatedPowerVoltageMin?: number | null | undefined, numPhases?: number | null | undefined, numPhysicalDcInputs?: number | null | undefined, outputCurrent?: number | null | undefined, outputVoltageNominal?: number | null | undefined, price?: number | null | undefined, ratedPower?: number | null | undefined, usableInputCurrentMax?: number | null | undefined, usableInputPowerMax?: number | null | undefined, manufacturer?: { __typename: 'Manufacturer', id: string, name?: string | null | undefined, displayName?: string | null | undefined } | null | undefined } | { __typename: 'SolarPanel', id: string, name?: string | null | undefined, starred: boolean, efficiency?: number | null | undefined, height?: number | null | undefined, imp?: number | null | undefined, isc?: number | null | undefined, length?: number | null | undefined, noct?: number | null | undefined, panelType?: string | null | undefined, price?: number | null | undefined, ratingPtc?: number | null | undefined, ratingStc?: number | null | undefined, tempCoeffIsc?: number | null | undefined, tempCoeffPmax?: number | null | undefined, tempCoeffVoc?: number | null | undefined, vmp?: number | null | undefined, voc?: number | null | undefined, width?: number | null | undefined, manufacturer?: { __typename: 'Manufacturer', id: string, name?: string | null | undefined, displayName?: string | null | undefined } | null | undefined, mlpe?: { __typename: 'MLPE', id: string, type?: string | null | undefined, isSolarInverter?: boolean | null | undefined, isDcOptimizer?: boolean | null | undefined, isCellStringOptimizer?: boolean | null | undefined, solarInverter?: { __typename: 'SolarInverter', id: string, efficiencyCec?: number | null | undefined, efficiencyEuropean?: number | null | undefined, efficiencyMax?: number | null | undefined, hasExternalMppt?: boolean | null | undefined, hasGlobalMppt?: boolean | null | undefined, inputVoltageMax?: number | null | undefined, inputVoltageMin?: number | null | undefined, inputVoltageSE?: number | null | undefined, isHuawei?: boolean | null | undefined, isSolarEdge?: boolean | null | undefined, isMicroinverter?: boolean | null | undefined, mpptRatedPowerVoltageMax?: number | null | undefined, mpptRatedPowerVoltageMin?: number | null | undefined, mppts?: number | null | undefined, name?: string | null | undefined, numPhases?: number | null | undefined, numPhysicalDcInputs?: number | null | undefined, outputCurrent?: number | null | undefined, outputVoltageNominal?: number | null | undefined, price?: number | null | undefined, ratedPower?: number | null | undefined, usableInputCurrentMax?: number | null | undefined, usableInputPowerMax?: number | null | undefined, manufacturer?: { __typename: 'Manufacturer', id: string, displayName?: string | null | undefined, name?: string | null | undefined } | null | undefined } | null | undefined, dcOptimizer?: { __typename: 'DcOptimizer', id: string, efficiency?: number | null | undefined, efficiencyMax?: number | null | undefined, hasGlobalMppt?: boolean | null | undefined, inputShortCircuitCurrentMax?: number | null | undefined, inputVoltageMax?: number | null | undefined, isExternalMppt?: boolean | null | undefined, isLongString?: boolean | null | undefined, isHuawei?: boolean | null | undefined, isSolarEdge?: boolean | null | undefined, maxInputCurrent?: number | null | undefined, mpptOperatingVoltageMax?: number | null | undefined, mpptOperatingVoltageMin?: number | null | undefined, mpptRangeMax?: number | null | undefined, mpptRangeMin?: number | null | undefined, name?: string | null | undefined, numInputs?: number | null | undefined, operatingModel?: string | null | undefined, optimizationBehavior?: string | null | undefined, outputCurrentMax?: number | null | undefined, outputVoltageMax?: number | null | undefined, price?: number | null | undefined, stcInputPowerMax?: number | null | undefined, systemVoltageMax?: number | null | undefined, usesSelectiveOptimization?: boolean | null | undefined, manufacturer?: { __typename: 'Manufacturer', id: string, displayName?: string | null | undefined, name?: string | null | undefined } | null | undefined } | null | undefined, cellStringOptimizer?: { __typename: 'CellStringOptimizer', id: string, name?: string | null | undefined, voltageLimit?: boolean | null | undefined, maxOutputVoltage?: number | null | undefined, manufacturer?: { __typename: 'Manufacturer', id: string, displayName?: string | null | undefined, name?: string | null | undefined } | null | undefined } | null | undefined } | null | undefined }> } };\n\n\nexport const SystemComponentSearchDocument = gql`\n query SystemComponentSearch($input: ComponentSearchQuery!) @trace_info(traceInfo: {pod: cad}) {\n componentSearch(input: $input) {\n components {\n id\n name\n starred\n manufacturer {\n id\n name\n displayName\n }\n ... on SolarInverter {\n mppts\n }\n ... on DcOptimizer {\n numInputs\n }\n ...CadRequiredComponentProperties\n }\n }\n}\n ${CadRequiredComponentPropertiesFragmentDoc}`;\n\n/**\n * __useSystemComponentSearchQuery__\n *\n * To run a query within a React component, call `useSystemComponentSearchQuery` and pass it any options that fit your needs.\n * When your component renders, `useSystemComponentSearchQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useSystemComponentSearchQuery({\n * variables: {\n * input: // value for 'input'\n * },\n * });\n */\nexport function useSystemComponentSearchQuery(baseOptions: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(SystemComponentSearchDocument, options);\n }\nexport function useSystemComponentSearchLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(SystemComponentSearchDocument, options);\n }\nexport type SystemComponentSearchQueryHookResult = ReturnType;\nexport type SystemComponentSearchLazyQueryHookResult = ReturnType;\nexport type SystemComponentSearchQueryResult = Apollo.QueryResult;","// @ts-ignore: Ignore unused { * as Types } import\nimport * as Types from '@aurorasolar/graphql-client-schema';\n\nimport { gql } from '@apollo/client';\nimport * as Apollo from '@apollo/client';\nconst defaultOptions = {} as const;\nexport type UnsavedChangesGuardQueryVariables = Types.Exact<{ [key: string]: never; }>;\n\n\nexport type UnsavedChangesGuardQuery = { __typename: 'Query', CAD: { __typename: 'CAD', hasUnsavedChanges: boolean } };\n\n\nexport const UnsavedChangesGuardDocument = gql`\n query UnsavedChangesGuard @trace_info(traceInfo: {pod: cad}) {\n CAD @client {\n hasUnsavedChanges\n }\n}\n `;\n\n/**\n * __useUnsavedChangesGuardQuery__\n *\n * To run a query within a React component, call `useUnsavedChangesGuardQuery` and pass it any options that fit your needs.\n * When your component renders, `useUnsavedChangesGuardQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useUnsavedChangesGuardQuery({\n * variables: {\n * },\n * });\n */\nexport function useUnsavedChangesGuardQuery(baseOptions?: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(UnsavedChangesGuardDocument, options);\n }\nexport function useUnsavedChangesGuardLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(UnsavedChangesGuardDocument, options);\n }\nexport type UnsavedChangesGuardQueryHookResult = ReturnType;\nexport type UnsavedChangesGuardLazyQueryHookResult = ReturnType;\nexport type UnsavedChangesGuardQueryResult = Apollo.QueryResult;","import { Formik } from 'formik';\nimport * as yup from 'yup';\n\nimport * as DS from '@aurorasolar/ds';\n\ninterface RackingIntegrationModalResult {\n integrationSettingId: string;\n}\n\ninterface RackingIntegrationModalCoreProps {\n isOpen: boolean;\n onClose: () => void;\n options: DS.IDropdownOption[];\n defaultIntegrationSettingId?: string;\n loading: boolean;\n onSubmit: (result: RackingIntegrationModalResult) => void;\n save: () => void;\n}\n\nconst schema = yup.object().shape({\n integrationSettingId: yup.array().of(yup.string()).required('Manufacturer is required'),\n});\n\nexport const RackingIntegrationModalCore = ({\n isOpen,\n onClose,\n options,\n loading,\n onSubmit,\n defaultIntegrationSettingId,\n save,\n}: RackingIntegrationModalCoreProps) => {\n return (\n {\n save?.();\n onSubmit({ integrationSettingId: integrationSettingId[0] });\n resetForm();\n }}\n validationSchema={schema}\n >\n {({ submitForm, resetForm }) => (\n {\n onClose();\n resetForm();\n }}\n open={isOpen}\n size=\"sm\"\n >\n \n \n Open your manufacturer's page\n \n \n \n \n Aurora will open your manufacturer's racking form in Design Mode. Complete the\n racking form on their website. When you are finished, you will be brought back to\n Aurora Solar. Your design must be saved in order for the manufacturer's website\n to get this design's information.\n \n \n \n \n \n\n \n Save and open racking page\n {\n onClose();\n resetForm();\n }}\n variant=\"tertiary\"\n >\n Cancel\n \n \n \n )}\n \n );\n};\n","// @ts-ignore: Ignore unused { * as Types } import\nimport * as Types from '@aurorasolar/graphql-client-schema';\n\nimport { gql } from '@apollo/client';\nimport * as Apollo from '@apollo/client';\nconst defaultOptions = {} as const;\nexport type GetRackingIntegrationsQueryVariables = Types.Exact<{ [key: string]: never; }>;\n\n\nexport type GetRackingIntegrationsQuery = { __typename: 'Query', getIntegrationUnions: Array<{ __typename: 'DividendIntegration', id: string, name: string, setting?: { __typename: 'DividendIntegrationSettings', id: string } | null | undefined } | { __typename: 'GenericIntegration', id: string, name: string, setting?: { __typename: 'GenericIntegrationSetting', id: string } | null | undefined } | { __typename: 'GoodLeapIntegration', id: string, name: string, setting?: { __typename: 'GoodLeapIntegrationSettings', id: string } | null | undefined } | { __typename: 'MosaicIntegration', id: string, name: string, setting?: { __typename: 'MosaicIntegrationSettings', id: string } | null | undefined } | { __typename: 'RackingIntegration', id: string, name: string, setting?: { __typename: 'RackingIntegrationSetting', id: string } | null | undefined } | { __typename: 'SungageIntegration', id: string, name: string, setting?: { __typename: 'SungageIntegrationSettings', id: string } | null | undefined } | null | undefined> };\n\n\nexport const GetRackingIntegrationsDocument = gql`\n query GetRackingIntegrations @trace_info(traceInfo: {pod: api}) {\n getIntegrationUnions(integrationType: \"racking\") {\n ... on IntegrationInterface {\n id\n name\n setting {\n ... on IntegrationSettingInterface {\n id\n }\n }\n }\n }\n}\n `;\n\n/**\n * __useGetRackingIntegrationsQuery__\n *\n * To run a query within a React component, call `useGetRackingIntegrationsQuery` and pass it any options that fit your needs.\n * When your component renders, `useGetRackingIntegrationsQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useGetRackingIntegrationsQuery({\n * variables: {\n * },\n * });\n */\nexport function useGetRackingIntegrationsQuery(baseOptions?: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(GetRackingIntegrationsDocument, options);\n }\nexport function useGetRackingIntegrationsLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(GetRackingIntegrationsDocument, options);\n }\nexport type GetRackingIntegrationsQueryHookResult = ReturnType;\nexport type GetRackingIntegrationsLazyQueryHookResult = ReturnType;\nexport type GetRackingIntegrationsQueryResult = Apollo.QueryResult;","// @ts-ignore: Ignore unused { * as Types } import\nimport * as Types from '@aurorasolar/graphql-client-schema';\n\nimport { gql } from '@apollo/client';\nimport * as Apollo from '@apollo/client';\nconst defaultOptions = {} as const;\nexport type GetRackingIntegrationsQueryVariables = Types.Exact<{ [key: string]: never; }>;\n\n\nexport type GetRackingIntegrationsQuery = { __typename: 'Query', getIntegrationUnions: Array<{ __typename: 'DividendIntegration', id: string, setting?: { __typename: 'DividendIntegrationSettings', id: string } | null | undefined } | { __typename: 'GenericIntegration', id: string, setting?: { __typename: 'GenericIntegrationSetting', id: string } | null | undefined } | { __typename: 'GoodLeapIntegration', id: string, setting?: { __typename: 'GoodLeapIntegrationSettings', id: string } | null | undefined } | { __typename: 'MosaicIntegration', id: string, setting?: { __typename: 'MosaicIntegrationSettings', id: string } | null | undefined } | { __typename: 'RackingIntegration', id: string, setting?: { __typename: 'RackingIntegrationSetting', id: string } | null | undefined, configuration: { __typename: 'RackingIntegrationConfiguration', rackingIframeUrl: string } } | { __typename: 'SungageIntegration', id: string, setting?: { __typename: 'SungageIntegrationSettings', id: string } | null | undefined } | null | undefined> };\n\nexport type GetIdentityQueryVariables = Types.Exact<{ [key: string]: never; }>;\n\n\nexport type GetIdentityQuery = { __typename: 'Query', currentTenant?: { __typename: 'Tenant', id: string } | null | undefined, currentUser?: { __typename: 'User', id: string } | null | undefined };\n\nexport type GetProjectIdForDesignQueryVariables = Types.Exact<{\n designId: Types.Scalars['ID'];\n}>;\n\n\nexport type GetProjectIdForDesignQuery = { __typename: 'Query', designById: { __typename: 'Design', projectId: string } };\n\nexport type GenerateSessionTokenMutationVariables = Types.Exact<{\n integrationId: Types.Scalars['ID'];\n}>;\n\n\nexport type GenerateSessionTokenMutation = { __typename: 'Mutation', generateIntegrationSessionToken: { __typename: 'IntegrationSessionToken', token: string } };\n\n\nexport const GetRackingIntegrationsDocument = gql`\n query GetRackingIntegrations @trace_info(traceInfo: {pod: api}) {\n getIntegrationUnions(integrationType: \"racking\") {\n ... on IntegrationInterface {\n id\n setting {\n ... on IntegrationSettingInterface {\n id\n }\n }\n }\n ... on RackingIntegration {\n configuration {\n rackingIframeUrl\n }\n }\n }\n}\n `;\n\n/**\n * __useGetRackingIntegrationsQuery__\n *\n * To run a query within a React component, call `useGetRackingIntegrationsQuery` and pass it any options that fit your needs.\n * When your component renders, `useGetRackingIntegrationsQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useGetRackingIntegrationsQuery({\n * variables: {\n * },\n * });\n */\nexport function useGetRackingIntegrationsQuery(baseOptions?: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(GetRackingIntegrationsDocument, options);\n }\nexport function useGetRackingIntegrationsLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(GetRackingIntegrationsDocument, options);\n }\nexport type GetRackingIntegrationsQueryHookResult = ReturnType;\nexport type GetRackingIntegrationsLazyQueryHookResult = ReturnType;\nexport type GetRackingIntegrationsQueryResult = Apollo.QueryResult;\nexport const GetIdentityDocument = gql`\n query GetIdentity @trace_info(traceInfo: {pod: api}) {\n currentTenant {\n id\n }\n currentUser {\n id\n }\n}\n `;\n\n/**\n * __useGetIdentityQuery__\n *\n * To run a query within a React component, call `useGetIdentityQuery` and pass it any options that fit your needs.\n * When your component renders, `useGetIdentityQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useGetIdentityQuery({\n * variables: {\n * },\n * });\n */\nexport function useGetIdentityQuery(baseOptions?: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(GetIdentityDocument, options);\n }\nexport function useGetIdentityLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(GetIdentityDocument, options);\n }\nexport type GetIdentityQueryHookResult = ReturnType;\nexport type GetIdentityLazyQueryHookResult = ReturnType;\nexport type GetIdentityQueryResult = Apollo.QueryResult;\nexport const GetProjectIdForDesignDocument = gql`\n query GetProjectIdForDesign($designId: ID!) @trace_info(traceInfo: {pod: api}) {\n designById(id: $designId) {\n projectId\n }\n}\n `;\n\n/**\n * __useGetProjectIdForDesignQuery__\n *\n * To run a query within a React component, call `useGetProjectIdForDesignQuery` and pass it any options that fit your needs.\n * When your component renders, `useGetProjectIdForDesignQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useGetProjectIdForDesignQuery({\n * variables: {\n * designId: // value for 'designId'\n * },\n * });\n */\nexport function useGetProjectIdForDesignQuery(baseOptions: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(GetProjectIdForDesignDocument, options);\n }\nexport function useGetProjectIdForDesignLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(GetProjectIdForDesignDocument, options);\n }\nexport type GetProjectIdForDesignQueryHookResult = ReturnType;\nexport type GetProjectIdForDesignLazyQueryHookResult = ReturnType;\nexport type GetProjectIdForDesignQueryResult = Apollo.QueryResult;\nexport const GenerateSessionTokenDocument = gql`\n mutation GenerateSessionToken($integrationId: ID!) @trace_info(traceInfo: {pod: api}) {\n generateIntegrationSessionToken(integrationId: $integrationId) {\n token\n }\n}\n `;\nexport type GenerateSessionTokenMutationFn = Apollo.MutationFunction;\n\n/**\n * __useGenerateSessionTokenMutation__\n *\n * To run a mutation, you first call `useGenerateSessionTokenMutation` within a React component and pass it any options that fit your needs.\n * When your component renders, `useGenerateSessionTokenMutation` returns a tuple that includes:\n * - A mutate function that you can call at any time to execute the mutation\n * - An object with fields that represent the current status of the mutation's execution\n *\n * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2;\n *\n * @example\n * const [generateSessionTokenMutation, { data, loading, error }] = useGenerateSessionTokenMutation({\n * variables: {\n * integrationId: // value for 'integrationId'\n * },\n * });\n */\nexport function useGenerateSessionTokenMutation(baseOptions?: Apollo.MutationHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useMutation(GenerateSessionTokenDocument, options);\n }\nexport type GenerateSessionTokenMutationHookResult = ReturnType;\nexport type GenerateSessionTokenMutationResult = Apollo.MutationResult;\nexport type GenerateSessionTokenMutationOptions = Apollo.BaseMutationOptions;","/**\n * Will format a value when it is not null/undefined. If it is null/undefined it will return the fallback.\n */\nexport const formatOrFallback = (\n value: Value,\n format: (value: NonNullable) => ReturnType,\n fallback: ReturnType,\n) => (value == null ? fallback : format(value!));\n\nexport const NOT_APPLICABLE = 'N/A';\n\nexport const formatOrNA = (value: T, format: (value: NonNullable) => string) =>\n formatOrFallback(value, format, NOT_APPLICABLE);\n","import { useIntl } from '@aurorasolar/intl';\n\nimport { CurrencyTypes } from '../../constants';\nimport { formatOrFallback } from '../../utils';\n\n// Ideally energy units will be added to ECMAScript\n// https://tc39.es/proposal-unified-intl-numberformat/section6/locales-currencies-tz_proposed_out.html#sec-issanctionedsimpleunitidentifier\nenum EnergyUnits {\n KWH = 'kWh',\n}\n\nexport const formatCurrencyLogic = (\n formatNumber: (number: number, options?: Intl.NumberFormatOptions | undefined) => string,\n currency?: CurrencyTypes,\n) => {\n return {\n formatCurrency: (value?: number | null, minPlaces = 2, maxPlaces = 2, fallback = '-') =>\n formatOrFallback(\n value,\n (val) =>\n formatNumber(val, {\n currency,\n maximumFractionDigits: maxPlaces > minPlaces ? maxPlaces : minPlaces,\n minimumFractionDigits: minPlaces,\n style: 'currency',\n }),\n fallback,\n ),\n };\n};\n\nexport const useLocaleFormat = (currency?: CurrencyTypes) => {\n const {\n locale,\n formatNumber,\n formatDateTime,\n formatPhoneNumber,\n stringComparator,\n formatRelativeTime,\n } = useIntl();\n const { formatCurrency } = formatCurrencyLogic(formatNumber, currency);\n return {\n formatCurrency,\n formatDateTime: (date: string | Date | number, options?: Intl.DateTimeFormatOptions) =>\n formatDateTime(new Date(date), options),\n formatEnergy: (\n value: number | null,\n { maxPlaces = 2, minPlaces = 0, unit = EnergyUnits.KWH, fallback = '-' } = {},\n ) =>\n formatOrFallback(\n value,\n (val) =>\n `${formatNumber(val, {\n maximumFractionDigits: maxPlaces > minPlaces ? maxPlaces : minPlaces,\n minimumFractionDigits: minPlaces,\n })} ${unit}`,\n fallback,\n ),\n formatLatLong: (value?: number | null, fallback = '-') =>\n formatOrFallback(\n value,\n (val) => formatNumber(val, { maximumFractionDigits: 3, minimumFractionDigits: 3 }),\n fallback,\n ),\n formatNumber,\n formatPercent: (value?: number | null, fallback = '-') =>\n formatOrFallback(\n value,\n (val) =>\n formatNumber(val, {\n maximumFractionDigits: 2,\n minimumFractionDigits: 0,\n style: 'percent',\n }),\n fallback,\n ),\n formatPhoneNumber,\n formatRelativeTime,\n locale,\n stringComparator,\n toFixed: (value?: number | null, minPlaces = 2, maxPlaces = 2, fallback = '-') =>\n formatOrFallback(\n value,\n (val) =>\n formatNumber(val, {\n maximumFractionDigits: maxPlaces > minPlaces ? maxPlaces : minPlaces,\n minimumFractionDigits: minPlaces,\n }),\n fallback,\n ),\n };\n};\n","import { formatNumberFactory, IIntlProvider } from '@aurorasolar/intl';\n\ntype UnformattedWattageTuple = [value: number, suffix: string];\ntype WattageTuple = [value: string, suffix: string];\n\n/**\n * Get a wattage tuple without any wattage precision formatting.\n */\nexport const getUnformattedWattageTuple = (\n wattage: number,\n additionalSuffix = '',\n override = '',\n): UnformattedWattageTuple => {\n const kilo = 1000;\n const mega = kilo * kilo;\n const giga = mega * kilo;\n\n let div = kilo;\n let unit = override;\n\n if (override !== '') {\n switch (override) {\n case 'kW':\n div = kilo;\n break;\n case 'MW':\n div = mega;\n break;\n case 'GW':\n div = giga;\n break;\n default:\n break;\n }\n } else if (wattage < mega) {\n div = kilo;\n unit = 'kW';\n } else if (wattage < giga) {\n div = mega;\n unit = 'MW';\n } else {\n div = giga;\n unit = 'GW';\n }\n\n return [wattage / div, `${unit}${additionalSuffix}`];\n};\n\n/**\n * Use 2 decimals if n >= 100\n * else use 1 decimal if n >= 1000\n * else use 0 decimals\n */\nexport const getDecimalPlaces = (n: number) => {\n if (n < 100) {\n return 2;\n }\n if (n < 1000) {\n return 1;\n }\n return 0;\n};\n\n/**\n * Get a precision formatted wattage tuple\n */\nexport const formatWattageTuple = (\n wattage: number,\n locale: IIntlProvider['locale'],\n additionalSuffix?: string,\n override?: string,\n): WattageTuple => {\n const [value, suffix] = getUnformattedWattageTuple(wattage, additionalSuffix, override);\n const digits = getDecimalPlaces(value);\n return [\n // TODO: We may want to revist this to use `intlContextFactory`\n // once https://github.com/aurorasolar/intl/pull/31 has been merged.\n formatNumberFactory(locale || 'en-US')(value, {\n maximumFractionDigits: digits,\n minimumFractionDigits: digits,\n }),\n suffix,\n ];\n};\n\nexport const formatWattage = (\n wattage: number,\n locale: IIntlProvider['locale'],\n additionalSuffix?: string,\n override?: string,\n) => formatWattageTuple(wattage, locale, additionalSuffix, override).join('');\n\nexport const formatWattHours = (\n wattage: number,\n locale: IIntlProvider['locale'],\n override?: string,\n) => formatWattage(wattage, locale, 'h', override);\n\nexport const formatKilowattHours = (wattage: number, locale: IIntlProvider['locale']) =>\n formatWattage(wattage, locale, 'h', 'kW');\n","import { FC } from 'react';\n\nimport { Colors } from '@aurorasolar/common-core/src/colors';\nimport { useLocaleFormat } from '@aurorasolar/common-core/src/hooks';\nimport { AuroraIcon, AuroraIconType, IAuroraIconProps } from '@aurorasolar/common-core/src/icon';\nimport { SPACES } from '@aurorasolar/common-core/src/layout';\nimport { IconFontSize } from '@aurorasolar/common-core/src/typography';\nimport { getUnformattedWattageTuple } from '@aurorasolar/common-core/src/utils';\nimport { css, styled, x } from '@xstyled/styled-components';\n\nexport const ITEM_HEIGHT = 54;\n\nconst SelectedIcon = styled(AuroraIcon).attrs({\n fillColor: Colors.PRIMARY_GREEN,\n name: AuroraIconType.CHECKMARK,\n size: IconFontSize.EXTRA_SMALL,\n})``;\nconst formatWattageShort = (\n wattage: number,\n formatNumber: (number: number, options?: Intl.NumberFormatOptions | undefined) => string,\n) => {\n if (wattage < 1000) {\n return `${formatNumber(wattage)}W`;\n }\n const [value, suffix] = getUnformattedWattageTuple(wattage);\n return `${formatNumber(value, {\n maximumFractionDigits: 1,\n minimumFractionDigits: 0,\n })}${suffix}`;\n};\nconst SelectionChangeIcon = styled>(\n AuroraIcon,\n).attrs(({ isSelected }) => ({\n color: isSelected ? Colors.GRAY_700 : Colors.BLACK,\n name: isSelected ? AuroraIconType.CLOSE : AuroraIconType.BTN_PLUS,\n size: IconFontSize.EXTRA_SMALL,\n}))`\n display: none;\n`;\n\nexport const Text = styled.spanBox`\n overflow: hidden;\n text-overflow: ellipsis;\n font-size: 12px;\n line-height: 16px;\n`;\n\nconst FlexRow = styled.div`\n align-items: baseline;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n gap: ${SPACES[0] / 2}px;\n`;\nconst CheckboxWrap = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n width: ${SPACES[4]}px;\n height: 100%;\n flex: 0 0 ${SPACES[4]}px;\n`;\n\nconst StyledItem = styled.li<{ canSelect: boolean; isMultiSelect: boolean }>`\n display: flex;\n flex: 1 1 auto;\n align-items: flex-end;\n height: ${ITEM_HEIGHT}px;\n padding: ${SPACES[0]}px;\n border-radius: 6px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n ${({ canSelect, isMultiSelect }) => {\n if (canSelect) {\n return css`\n cursor: pointer;\n\n &:hover {\n background: ${Colors.GRAY_200};\n ${SelectionChangeIcon} {\n display: inline;\n }\n\n ${SelectedIcon} {\n display: ${isMultiSelect ? 'none' : 'inline'};\n }\n }\n `;\n }\n return css`\n opacity: 0.5;\n `;\n }}\n`;\nexport interface ComponentSelectItemData {\n id: string;\n inputCount: number;\n manufacturer: string;\n name: string;\n rating?: number;\n}\nexport interface ComponentSelectItemProps {\n component: ComponentSelectItemData;\n isSelected: boolean;\n canSelect: boolean;\n onClick: VoidFunction;\n isMultiSelect: boolean;\n}\n\nexport const ComponentSelectItem: FC = ({\n component: { inputCount, name, manufacturer, rating },\n onClick,\n canSelect,\n isSelected,\n isMultiSelect,\n}) => {\n const { formatNumber } = useLocaleFormat();\n\n return (\n {\n if (canSelect) {\n onClick();\n }\n }}\n >\n \n {isMultiSelect && canSelect && }\n {isSelected && }\n \n \n \n {manufacturer}\n {inputCount > 1 && (\n \n {inputCount}:1\n \n )}\n \n \n \n {name}\n \n {rating && (\n \n {rating === -1 ? '' : formatWattageShort(rating, formatNumber)}\n \n )}\n \n \n \n );\n};\n","import { FC, RefObject } from 'react';\n\nimport { Colors } from '@aurorasolar/common-core/src/colors';\nimport { AuroraIcon, AuroraIconType } from '@aurorasolar/common-core/src/icon';\nimport { DefaultInputCSS } from '@aurorasolar/common-core/src/input';\nimport {\n buttonHeight,\n defaultButtonBorderRadius,\n smallButtonBorderRadius,\n SPACES,\n} from '@aurorasolar/common-core/src/layout';\nimport { Text } from '@aurorasolar/common-core/src/typography';\nimport { Collapse, IInputGroupProps, InputGroup, Popover } from '@blueprintjs/core';\nimport { styled, x } from '@xstyled/styled-components';\n\nimport { ComponentSelectItem, ComponentSelectItemData, ITEM_HEIGHT } from './component-select-item';\nimport { ComponentSelectValidation } from './component-select-types';\n\nexport const ComponentSelectTestid = {\n Button: 'component-select-button',\n SearchInput: 'component-select-search-input',\n};\n\nconst SelectButton = styled.button<{ isActive: boolean; isDisabled?: boolean }>`\n display: flex;\n justify-content: space-between;\n align-items: center;\n height: ${buttonHeight}px;\n background: ${({ isDisabled }) => (isDisabled ? Colors.GRAY_100 : Colors.WHITE)};\n padding: 0 ${SPACES[2]}px;\n border-radius: ${defaultButtonBorderRadius}px;\n border: 1px solid ${({ isActive }) => (isActive ? Colors.PRIMARY_GREEN : Colors.GRAY_400)};\n flex: 1 1 auto;\n cursor: pointer;\n max-width: 100%;\n span {\n flex: 0 1 auto;\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n .fa {\n background: ${Colors.GRAY_200};\n border-radius: ${smallButtonBorderRadius}px;\n color: ${({ isDisabled }) => (isDisabled ? Colors.GRAY_400 : Colors.GRAY_700)};\n height: ${SPACES[3]}px;\n width: ${SPACES[3]}px;\n margin-left: ${SPACES[0] / 2}px;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n &:hover {\n background: ${Colors.GRAY_100};\n }\n`;\n\nconst NUMBER_OF_VISIBLE_ITEMS = 4;\nconst POPOVER_HEIGHT = buttonHeight + ITEM_HEIGHT * NUMBER_OF_VISIBLE_ITEMS + SPACES[4];\n\nconst SelectPopover = styled(Popover)`\n flex: 1 1 auto;\n display: flex;\n position: relative;\n\n .bp3-transition-container {\n width: 100%;\n }\n\n .bp3-popover-target {\n display: flex;\n flex: 1 1 auto;\n max-width: 100%;\n }\n .bp3-popover {\n user-select: none;\n margin-top: ${SPACES[0]}px !important;\n width: inherit;\n max-height: ${POPOVER_HEIGHT}px;\n overflow-y: auto;\n }\n\n .bp3-popover-content {\n padding: ${SPACES[0]}px;\n background: ${Colors.WHITE};\n }\n ul {\n list-style: none;\n margin: 0;\n padding: 0;\n }\n`;\n\nconst SearchInput = styled(InputGroup)`\n ${DefaultInputCSS}\n .bp3-input {\n margin-bottom: ${SPACES[0]}px;\n background: ${Colors.GRAY_100};\n }\n`;\n\nexport interface ComponentSelectCoreProps {\n buttonLabel: string;\n buttonTestid?: string;\n disabled?: boolean;\n isOpen: boolean;\n items: ComponentSelectItemData[];\n maxSelectionSize: number;\n minSelectionSize: number;\n onClickedAway: VoidFunction;\n onComponentSelect: (id: string) => void;\n onPopoverClosing: VoidFunction;\n onPopoverOpened: VoidFunction;\n onPopoverOpening: VoidFunction;\n onSearchStringChange: (v: string) => void;\n onToggleButtonClick: VoidFunction;\n searchInput: RefObject;\n searchTestid?: string;\n selectedItems: Set;\n validation: ComponentSelectValidation;\n}\n\nexport const ComponentSelectCore: FC = ({\n buttonLabel,\n buttonTestid,\n disabled,\n isOpen,\n items,\n maxSelectionSize,\n minSelectionSize,\n onClickedAway,\n onComponentSelect,\n onPopoverClosing,\n onPopoverOpened,\n onPopoverOpening,\n onSearchStringChange,\n onToggleButtonClick,\n searchInput,\n searchTestid,\n selectedItems,\n validation,\n}) => {\n const isMultiSelect = maxSelectionSize > 1;\n const textColor = selectedItems.size === 0 || disabled ? Colors.GRAY_500 : Colors.GRAY_800;\n return (\n \n onSearchStringChange(currentTarget.value)}\n placeholder=\"Search\"\n />\n\n
    \n {items.map((item) => {\n const isSelected = selectedItems.has(item.id);\n const canSelect =\n !isMultiSelect ||\n (isSelected && minSelectionSize < selectedItems.size) ||\n (!isSelected && maxSelectionSize > selectedItems.size);\n return (\n {\n onComponentSelect(item.id);\n }}\n />\n );\n })}\n
\n \n }\n isOpen={isOpen}\n minimal\n onClosing={onPopoverClosing}\n onInteraction={(shouldBeOpen) => {\n if (!shouldBeOpen) {\n onClickedAway();\n }\n }}\n onOpened={onPopoverOpened}\n onOpening={onPopoverOpening}\n position=\"bottom\"\n target={\n \n \n \n {buttonLabel}\n \n \n \n \n {!validation.isValid && validation.message}\n \n \n }\n usePortal={false}\n />\n );\n};\n","import { ComponentSelectItemData } from './component-select-item';\nimport { ComponentSelectQuery } from './component-select.generated';\n\n/** @deprecated for use in pre-Borealis only. Use `SystemComponentType` */\nexport enum ComponentSelectType {\n CombinerBox = 'Combiner Box',\n DcOptimizer = 'DC Optimizer',\n Disconnect = 'Disconnect',\n LoadCenter = 'Load Center',\n Meter = 'Meter',\n ServicePanel = 'Service Panel',\n SolarInverter = 'Solar Inverter',\n SolarPanel = 'Solar Panel',\n Microinverter = 'Microinverter',\n SingleInputMicroinverter = 'Single Input Microinverter',\n}\n\nexport type ComponentSelectComponent =\n ComponentSelectQuery['componentSearch']['components'][number];\n/**\n * @deprecated for use in pre-Borealis only. Use `SystemComponentTypename\n * Maps a `SystemComponentType` enum to the associated GraphQL __typename.\n */\nexport type SystemComponentTypename =\n T extends ComponentSelectType.CombinerBox\n ? 'CombinerBox'\n : T extends ComponentSelectType.DcOptimizer\n ? 'DcOptimizer'\n : T extends ComponentSelectType.Disconnect\n ? 'Disconnect'\n : T extends ComponentSelectType.LoadCenter\n ? 'LoadCenter'\n : T extends ComponentSelectType.Meter\n ? 'Meter'\n : T extends ComponentSelectType.ServicePanel\n ? 'ServicePanel'\n : T extends ComponentSelectType.SolarInverter\n ? 'SolarInverter'\n : T extends ComponentSelectType.SolarPanel\n ? 'SolarPanel'\n : T extends ComponentSelectType.Microinverter\n ? 'SolarInverter'\n : T extends ComponentSelectType.SingleInputMicroinverter\n ? 'SolarInverter'\n : never;\n\n/**\n * @deprecated for use in pre-Borealis only. Use `SystemComponent`\n */\nexport type GetComponentType =\n ComponentSelectComponent & {\n __typename: SystemComponentTypename;\n };\n\nexport interface ComponentSelectContext {\n queryResult: ComponentSelectQuery | undefined;\n selectedIds: Set;\n settings: ComponentSelectSettings;\n validation: ComponentSelectValidation;\n visibleItems: ComponentSelectItemData[];\n}\n\nexport type ComponentSelectValidation =\n | {\n isValid: true;\n }\n | {\n isValid: false;\n message: string;\n };\n\nexport type ComponentSelectValidationCheck = (\n selection: GetComponentType[],\n) => ComponentSelectValidation;\n\nexport interface ComponentSelectSettings {\n componentType: ComponentSelectType;\n disabled?: boolean;\n emptySelectionLabel?: string;\n hiddenIds?: string[];\n shouldSearchAllComponents?: boolean;\n selectionSize: { min: number; max: number };\n validationCheck?: ComponentSelectValidationCheck;\n}\n\nexport type ComponentSelectEventByType =\n ComponentSelectEvent & { type: T };\n\nexport type ComponentSelectEvent =\n | { type: 'TOGGLE_BUTTON_CLICKED' }\n | { type: 'POPOVER_CLOSING' }\n | { type: 'POPOVER_OPENING' }\n | { type: 'POPOVER_OPENED' }\n | { type: 'CLICKED_AWAY' }\n | { type: 'EXTERNAL_SELECTED_ITEMS_CHANGED'; selectedIds: Set }\n | { type: 'SEARCH_STRING_CHANGED'; searchString: string }\n | { type: 'SEARCH_STRING_READY'; searchString: string }\n | { type: 'COMPONENT_SELECTED'; id: string }\n | {\n type: 'SETTINGS_CHANGED';\n settings: ComponentSelectSettings;\n }\n | {\n type: 'BEGIN_DATA_REQUEST';\n }\n | {\n type: 'DATA_LOADED';\n data: ComponentSelectQuery;\n };\n","import { ComponentSearchQuery, ComponentTypes } from '@aurorasolar/graphql-client-schema';\n\nimport { ComponentSelectItemData } from './component-select-item';\nimport {\n ComponentSelectComponent,\n ComponentSelectContext,\n ComponentSelectEventByType,\n ComponentSelectSettings,\n ComponentSelectType,\n} from './component-select-types';\nimport { ComponentSelectQuery } from './component-select.generated';\n\nconst getComponentRating = (component: ComponentSelectComponent) => {\n if ('ratingStc' in component && component.ratingStc != null) {\n return component.ratingStc;\n }\n if ('ratedPower' in component && component.ratedPower != null) {\n return component.ratedPower;\n }\n return -1;\n};\n\nconst getInputCount = (componentType: ComponentSelectType, component: ComponentSelectComponent) => {\n if (\n componentType === ComponentSelectType.DcOptimizer ||\n componentType === ComponentSelectType.Microinverter\n ) {\n if (component.__typename === 'SolarInverter') {\n return component.mppts ?? 1;\n }\n if (component.__typename === 'DcOptimizer') {\n return component.numInputs ?? 1;\n }\n }\n return 1;\n};\n\nexport const getComponentItems = (\n data: ComponentSelectQuery | undefined,\n { hiddenIds, componentType }: ComponentSelectSettings,\n): ComponentSelectItemData[] =>\n Array.isArray(data?.componentSearch.components)\n ? data!.componentSearch.components\n .filter(({ id }) => !hiddenIds?.includes(id))\n .map((component) => ({\n id: component.id ?? '',\n inputCount: getInputCount(componentType, component),\n manufacturer: component.manufacturer?.name ?? '',\n name: component.name ?? '',\n rating: getComponentRating(component),\n }))\n : [];\n\nconst lookup: Record = {\n [ComponentSelectType.CombinerBox]: { type: ComponentTypes.CombinerBox },\n [ComponentSelectType.DcOptimizer]: { type: ComponentTypes.DcOptimizer },\n [ComponentSelectType.Disconnect]: { type: ComponentTypes.Disconnect },\n [ComponentSelectType.LoadCenter]: { type: ComponentTypes.LoadCenter },\n [ComponentSelectType.Meter]: { type: ComponentTypes.Meter },\n [ComponentSelectType.Microinverter]: {\n filter: { isMicroinverter: true, isSolarCompatible: true },\n type: ComponentTypes.SolarInverter,\n },\n [ComponentSelectType.ServicePanel]: { type: ComponentTypes.ServicePanel },\n [ComponentSelectType.SolarInverter]: {\n filter: { isMicroinverter: false, isSolarCompatible: true },\n type: ComponentTypes.SolarInverter,\n },\n [ComponentSelectType.SolarPanel]: {\n type: ComponentTypes.SolarPanel,\n },\n [ComponentSelectType.SingleInputMicroinverter]: {\n filter: { isMicroinverter: true, isSingleInputMicroinverter: true, isSolarCompatible: true },\n type: ComponentTypes.SolarInverter,\n },\n};\n\nexport const getComponentSelectQueryParams = (\n { settings, queryResult }: ComponentSelectContext,\n selectedIds?: Set,\n searchString?: string,\n projectId?: string,\n) => {\n const onlyEnabledComponents = !settings?.shouldSearchAllComponents;\n const isInitialQuery = queryResult == null;\n const typeParams = lookup[settings.componentType];\n const params: ComponentSearchQuery & { filter: NonNullable } = {\n ...typeParams,\n filter: {\n ...typeParams.filter,\n },\n };\n\n if (selectedIds != null) {\n params.includeIds = Array.from(selectedIds);\n }\n\n if (isInitialQuery || onlyEnabledComponents || searchString === '') {\n // only query for enabled components\n params.filter.isEnabled = true;\n }\n\n if (searchString) {\n params.filter.query = searchString;\n }\n\n if (projectId) {\n params.projectId = projectId;\n }\n\n return { variables: { input: params } };\n};\n\nconst filterComponent =\n ({ settings, selectedIds }: ComponentSelectContext, searchString: string) =>\n (item: ComponentSelectItemData) => {\n if (selectedIds.has(item.id) || settings?.shouldSearchAllComponents) {\n return true;\n }\n const searchWords = searchString.split(' ');\n const searchables = (\n [\n item.name,\n item.manufacturer,\n item.rating === -1 ? null : item.rating?.toString(), // extra logic to account for no value/ failsafe\n ].filter((value) => value != null) as string[]\n ).map((word) => word.toLowerCase());\n\n return searchables.some((searchable) =>\n searchWords.every((searchWord) => searchable.includes(searchWord.toLowerCase())),\n );\n };\nexport const filterComponents = (\n ctx: ComponentSelectContext,\n { searchString }: ComponentSelectEventByType<'SEARCH_STRING_CHANGED'>,\n) =>\n getComponentItems(ctx.queryResult, ctx.settings).filter(filterComponent(ctx, searchString)) ?? [];\n\nexport const getButtonLabel = ({\n selectedIds,\n queryResult,\n settings: { componentType, emptySelectionLabel, selectionSize },\n}: ComponentSelectContext) => {\n if (queryResult == null) {\n return '';\n }\n if (selectedIds.size === 1) {\n const id = selectedIds.values().next().value;\n const selectedItem = queryResult.componentSearch.components?.find((item) => item.id === id);\n return selectedItem?.name ?? `1 ${componentType} selected`;\n }\n if (selectedIds.size > 1) {\n return `${selectedIds.size} ${componentType}s selected`;\n }\n if (emptySelectionLabel != null) {\n return emptySelectionLabel;\n }\n return selectionSize.max > 1\n ? `Select up to ${selectionSize.max} ${componentType}s`\n : `Select a ${componentType}`;\n};\n","import { assign, createMachine } from '@xstate/fsm';\n\nimport {\n ComponentSelectContext,\n ComponentSelectEvent,\n ComponentSelectType,\n GetComponentType,\n} from './component-select-types';\nimport { filterComponents, getComponentItems } from './component-select-util';\n\ntype ComponentSelectStates =\n | 'uninitialized'\n | 'pendingDataRequest'\n | 'fetchingInitialData'\n | 'closed'\n | 'opening'\n | 'open';\n\ninterface ComponentSelectState {\n value: ComponentSelectStates;\n context: ComponentSelectContext;\n}\n\nconst commonActions = {\n applySettings: assign<\n ComponentSelectContext,\n ComponentSelectEvent & { type: 'SETTINGS_CHANGED' }\n >({\n settings: (_, { settings }) => settings,\n visibleItems: ({ queryResult }, { settings }) => getComponentItems(queryResult, settings),\n }),\n overrideSelectedIds: assign<\n ComponentSelectContext,\n ComponentSelectEvent & { type: 'EXTERNAL_SELECTED_ITEMS_CHANGED' }\n >({\n selectedIds: (_, { selectedIds }) => new Set(selectedIds),\n }),\n processLoadedData: assign(\n (ctx, { data }) => {\n return {\n ...ctx,\n queryResult: data,\n visibleItems: getComponentItems(data, ctx.settings),\n };\n },\n ),\n\n selectItems: [\n assign(\n (ctx, { id }) => {\n const selectedIds = new Set(ctx.selectedIds);\n if (selectedIds.has(id)) {\n if (selectedIds.size > ctx.settings.selectionSize.min) {\n selectedIds.delete(id);\n }\n } else {\n if (selectedIds.size >= ctx.settings.selectionSize.max) {\n selectedIds.delete(selectedIds.values().next().value);\n }\n selectedIds.add(id);\n }\n const allComponents = (ctx.queryResult?.componentSearch.components ??\n []) as GetComponentType[];\n const selectedComponents = allComponents.filter((component) =>\n selectedIds.has(component.id),\n );\n const validation = ctx.settings.validationCheck?.(selectedComponents) ?? { isValid: true };\n\n return {\n ...ctx,\n selectedIds,\n validation,\n };\n },\n ),\n 'selection',\n ],\n};\n\nconst componentSelectActions = [\n {\n actions: commonActions.selectItems,\n cond: ({ settings: { selectionSize } }: ComponentSelectContext) => selectionSize.max === 1,\n target: 'closed',\n },\n {\n actions: commonActions.selectItems,\n cond: ({ settings: { selectionSize } }: ComponentSelectContext) => selectionSize.max > 1,\n },\n];\n\nexport const componentSelectMachine = createMachine<\n ComponentSelectContext,\n ComponentSelectEvent,\n ComponentSelectState\n>({\n context: {\n queryResult: undefined,\n selectedIds: new Set(),\n settings: {\n componentType: ComponentSelectType.SolarPanel,\n selectionSize: { max: 1, min: 0 },\n },\n validation: { isValid: true },\n visibleItems: [],\n },\n id: 'componentSelect',\n initial: 'uninitialized',\n states: {\n closed: {\n on: {\n DATA_LOADED: {\n actions: commonActions.processLoadedData,\n },\n EXTERNAL_SELECTED_ITEMS_CHANGED: { actions: commonActions.overrideSelectedIds },\n SETTINGS_CHANGED: { actions: commonActions.applySettings },\n TOGGLE_BUTTON_CLICKED: 'opening',\n },\n },\n fetchingInitialData: {\n on: {\n DATA_LOADED: {\n actions: commonActions.processLoadedData,\n target: 'closed',\n },\n EXTERNAL_SELECTED_ITEMS_CHANGED: { actions: commonActions.overrideSelectedIds },\n SETTINGS_CHANGED: { actions: commonActions.applySettings },\n },\n },\n open: {\n entry: 'focusSearchInput',\n on: {\n CLICKED_AWAY: 'closed',\n COMPONENT_SELECTED: componentSelectActions,\n DATA_LOADED: {\n actions: commonActions.processLoadedData,\n },\n EXTERNAL_SELECTED_ITEMS_CHANGED: { actions: commonActions.overrideSelectedIds },\n SEARCH_STRING_CHANGED: [\n {\n actions: ['startSearchDebounce'],\n cond: ({ settings }: ComponentSelectContext) => !!settings?.shouldSearchAllComponents,\n },\n {\n actions: assign({\n visibleItems: (ctx: ComponentSelectContext, event) => filterComponents(ctx, event),\n }),\n cond: ({ settings }: ComponentSelectContext) => !settings?.shouldSearchAllComponents,\n },\n ],\n SEARCH_STRING_READY: { actions: 'queryComponents' },\n SETTINGS_CHANGED: { actions: commonActions.applySettings },\n TOGGLE_BUTTON_CLICKED: 'closed',\n },\n },\n opening: {\n on: {\n COMPONENT_SELECTED: componentSelectActions,\n DATA_LOADED: {\n actions: commonActions.processLoadedData,\n },\n EXTERNAL_SELECTED_ITEMS_CHANGED: { actions: commonActions.overrideSelectedIds },\n POPOVER_OPENED: 'open',\n SETTINGS_CHANGED: { actions: commonActions.applySettings },\n },\n },\n pendingDataRequest: {\n on: {\n BEGIN_DATA_REQUEST: 'fetchingInitialData',\n DATA_LOADED: {\n actions: commonActions.processLoadedData,\n target: 'closed',\n },\n EXTERNAL_SELECTED_ITEMS_CHANGED: { actions: commonActions.overrideSelectedIds },\n SETTINGS_CHANGED: { actions: commonActions.applySettings },\n },\n },\n uninitialized: {\n on: {\n EXTERNAL_SELECTED_ITEMS_CHANGED: { actions: commonActions.overrideSelectedIds },\n SETTINGS_CHANGED: {\n actions: [commonActions.applySettings, 'queryComponents'],\n target: 'pendingDataRequest',\n },\n },\n },\n },\n});\n","// @ts-ignore: Ignore unused { * as Types } import\nimport * as Types from '@aurorasolar/graphql-client-schema';\n\nimport { gql } from '@apollo/client';\nimport { CadRequiredComponentPropertiesFragmentDoc } from '../../../common/packages/data-access-layer/src/graphql/cad-electrical-components-fragment.generated';\nimport * as Apollo from '@apollo/client';\nconst defaultOptions = {} as const;\nexport type ComponentSelectQueryVariables = Types.Exact<{\n input: Types.ComponentSearchQuery;\n}>;\n\n\nexport type ComponentSelectQuery = { __typename: 'Query', componentSearch: { __typename: 'ComponentSearchResult', components: Array<{ __typename: 'Battery', id: string, name?: string | null | undefined, starred: boolean, manufacturer?: { __typename: 'Manufacturer', id: string, name?: string | null | undefined, displayName?: string | null | undefined } | null | undefined } | { __typename: 'CombinerBox', id: string, name?: string | null | undefined, starred: boolean, fuseRating?: number | null | undefined, voltageRating?: number | null | undefined, manufacturer?: { __typename: 'Manufacturer', id: string, name?: string | null | undefined, displayName?: string | null | undefined } | null | undefined } | { __typename: 'DcOptimizer', numInputs?: number | null | undefined, id: string, name?: string | null | undefined, starred: boolean, efficiency?: number | null | undefined, efficiencyMax?: number | null | undefined, hasGlobalMppt?: boolean | null | undefined, inputShortCircuitCurrentMax?: number | null | undefined, inputVoltageMax?: number | null | undefined, isExternalMppt?: boolean | null | undefined, isLongString?: boolean | null | undefined, isHuawei?: boolean | null | undefined, isSolarEdge?: boolean | null | undefined, maxInputCurrent?: number | null | undefined, mpptOperatingVoltageMax?: number | null | undefined, mpptOperatingVoltageMin?: number | null | undefined, mpptRangeMax?: number | null | undefined, mpptRangeMin?: number | null | undefined, operatingModel?: string | null | undefined, optimizationBehavior?: string | null | undefined, outputCurrentMax?: number | null | undefined, outputVoltageMax?: number | null | undefined, price?: number | null | undefined, stcInputPowerMax?: number | null | undefined, systemVoltageMax?: number | null | undefined, usesSelectiveOptimization?: boolean | null | undefined, manufacturer?: { __typename: 'Manufacturer', id: string, name?: string | null | undefined, displayName?: string | null | undefined } | null | undefined } | { __typename: 'Disconnect', id: string, name?: string | null | undefined, starred: boolean, fused?: boolean | null | undefined, fuseRating?: number | null | undefined, currentRating?: number | null | undefined, voltageRating?: number | null | undefined, manufacturer?: { __typename: 'Manufacturer', id: string, name?: string | null | undefined, displayName?: string | null | undefined } | null | undefined } | { __typename: 'LoadCenter', id: string, name?: string | null | undefined, starred: boolean, mainBreakerRating?: number | null | undefined, busRating?: number | null | undefined, isBreaker?: boolean | null | undefined, manufacturer?: { __typename: 'Manufacturer', id: string, name?: string | null | undefined, displayName?: string | null | undefined } | null | undefined } | { __typename: 'Meter', id: string, name?: string | null | undefined, starred: boolean, currentRating?: number | null | undefined, manufacturer?: { __typename: 'Manufacturer', id: string, name?: string | null | undefined, displayName?: string | null | undefined } | null | undefined } | { __typename: 'ServicePanel', id: string, name?: string | null | undefined, starred: boolean, breakerRating?: number | null | undefined, busRating?: number | null | undefined, main?: boolean | null | undefined, manufacturer?: { __typename: 'Manufacturer', id: string, name?: string | null | undefined, displayName?: string | null | undefined } | null | undefined } | { __typename: 'SolarInverter', mppts?: number | null | undefined, id: string, name?: string | null | undefined, starred: boolean, efficiencyCec?: number | null | undefined, efficiencyEuropean?: number | null | undefined, efficiencyMax?: number | null | undefined, hasExternalMppt?: boolean | null | undefined, hasGlobalMppt?: boolean | null | undefined, inputVoltageMax?: number | null | undefined, inputVoltageMin?: number | null | undefined, inputVoltageSE?: number | null | undefined, isHuawei?: boolean | null | undefined, isSolarEdge?: boolean | null | undefined, isMicroinverter?: boolean | null | undefined, mpptRatedPowerVoltageMax?: number | null | undefined, mpptRatedPowerVoltageMin?: number | null | undefined, numPhases?: number | null | undefined, numPhysicalDcInputs?: number | null | undefined, outputCurrent?: number | null | undefined, outputVoltageNominal?: number | null | undefined, price?: number | null | undefined, ratedPower?: number | null | undefined, usableInputCurrentMax?: number | null | undefined, usableInputPowerMax?: number | null | undefined, manufacturer?: { __typename: 'Manufacturer', id: string, name?: string | null | undefined, displayName?: string | null | undefined } | null | undefined } | { __typename: 'SolarPanel', id: string, name?: string | null | undefined, starred: boolean, efficiency?: number | null | undefined, height?: number | null | undefined, imp?: number | null | undefined, isc?: number | null | undefined, length?: number | null | undefined, noct?: number | null | undefined, panelType?: string | null | undefined, price?: number | null | undefined, ratingPtc?: number | null | undefined, ratingStc?: number | null | undefined, tempCoeffIsc?: number | null | undefined, tempCoeffPmax?: number | null | undefined, tempCoeffVoc?: number | null | undefined, vmp?: number | null | undefined, voc?: number | null | undefined, width?: number | null | undefined, manufacturer?: { __typename: 'Manufacturer', id: string, name?: string | null | undefined, displayName?: string | null | undefined } | null | undefined, mlpe?: { __typename: 'MLPE', id: string, type?: string | null | undefined, isSolarInverter?: boolean | null | undefined, isDcOptimizer?: boolean | null | undefined, isCellStringOptimizer?: boolean | null | undefined, solarInverter?: { __typename: 'SolarInverter', id: string, efficiencyCec?: number | null | undefined, efficiencyEuropean?: number | null | undefined, efficiencyMax?: number | null | undefined, hasExternalMppt?: boolean | null | undefined, hasGlobalMppt?: boolean | null | undefined, inputVoltageMax?: number | null | undefined, inputVoltageMin?: number | null | undefined, inputVoltageSE?: number | null | undefined, isHuawei?: boolean | null | undefined, isSolarEdge?: boolean | null | undefined, isMicroinverter?: boolean | null | undefined, mpptRatedPowerVoltageMax?: number | null | undefined, mpptRatedPowerVoltageMin?: number | null | undefined, mppts?: number | null | undefined, name?: string | null | undefined, numPhases?: number | null | undefined, numPhysicalDcInputs?: number | null | undefined, outputCurrent?: number | null | undefined, outputVoltageNominal?: number | null | undefined, price?: number | null | undefined, ratedPower?: number | null | undefined, usableInputCurrentMax?: number | null | undefined, usableInputPowerMax?: number | null | undefined, manufacturer?: { __typename: 'Manufacturer', id: string, displayName?: string | null | undefined, name?: string | null | undefined } | null | undefined } | null | undefined, dcOptimizer?: { __typename: 'DcOptimizer', id: string, efficiency?: number | null | undefined, efficiencyMax?: number | null | undefined, hasGlobalMppt?: boolean | null | undefined, inputShortCircuitCurrentMax?: number | null | undefined, inputVoltageMax?: number | null | undefined, isExternalMppt?: boolean | null | undefined, isLongString?: boolean | null | undefined, isHuawei?: boolean | null | undefined, isSolarEdge?: boolean | null | undefined, maxInputCurrent?: number | null | undefined, mpptOperatingVoltageMax?: number | null | undefined, mpptOperatingVoltageMin?: number | null | undefined, mpptRangeMax?: number | null | undefined, mpptRangeMin?: number | null | undefined, name?: string | null | undefined, numInputs?: number | null | undefined, operatingModel?: string | null | undefined, optimizationBehavior?: string | null | undefined, outputCurrentMax?: number | null | undefined, outputVoltageMax?: number | null | undefined, price?: number | null | undefined, stcInputPowerMax?: number | null | undefined, systemVoltageMax?: number | null | undefined, usesSelectiveOptimization?: boolean | null | undefined, manufacturer?: { __typename: 'Manufacturer', id: string, displayName?: string | null | undefined, name?: string | null | undefined } | null | undefined } | null | undefined, cellStringOptimizer?: { __typename: 'CellStringOptimizer', id: string, name?: string | null | undefined, voltageLimit?: boolean | null | undefined, maxOutputVoltage?: number | null | undefined, manufacturer?: { __typename: 'Manufacturer', id: string, displayName?: string | null | undefined, name?: string | null | undefined } | null | undefined } | null | undefined } | null | undefined }> } };\n\n\nexport const ComponentSelectDocument = gql`\n query ComponentSelect($input: ComponentSearchQuery!) @trace_info(traceInfo: {pod: cad}) {\n componentSearch(input: $input) {\n components {\n id\n name\n starred\n manufacturer {\n id\n name\n displayName\n }\n ... on SolarInverter {\n mppts\n }\n ... on DcOptimizer {\n numInputs\n }\n ...CadRequiredComponentProperties\n }\n }\n}\n ${CadRequiredComponentPropertiesFragmentDoc}`;\n\n/**\n * __useComponentSelectQuery__\n *\n * To run a query within a React component, call `useComponentSelectQuery` and pass it any options that fit your needs.\n * When your component renders, `useComponentSelectQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useComponentSelectQuery({\n * variables: {\n * input: // value for 'input'\n * },\n * });\n */\nexport function useComponentSelectQuery(baseOptions: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(ComponentSelectDocument, options);\n }\nexport function useComponentSelectLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(ComponentSelectDocument, options);\n }\nexport type ComponentSelectQueryHookResult = ReturnType;\nexport type ComponentSelectLazyQueryHookResult = ReturnType;\nexport type ComponentSelectQueryResult = Apollo.QueryResult;","import { FC, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { OrgPermission, OrgPermissions, useAppModule } from '@aurorasolar/common-module-loader';\nimport { useMachine } from '@xstate/react/lib/fsm';\n\nimport { ComponentSelectCore } from './component-select-core';\nimport { componentSelectMachine } from './component-select-machine';\nimport {\n ComponentSelectType,\n ComponentSelectValidationCheck,\n GetComponentType,\n} from './component-select-types';\nimport { getButtonLabel, getComponentSelectQueryParams } from './component-select-util';\nimport { useComponentSelectLazyQuery } from './component-select.generated';\n\nconst COMPONENT_SELECT_DEBOUNCE_DELAY = 500;\n\nexport interface ComponentSelectProps {\n buttonTestid?: string;\n disabled?: boolean;\n emptySelectionLabel?: string;\n hiddenIds?: string[];\n maxSelectionSize?: number;\n minSelectionSize?: number;\n onSelection: (selection: Set, components: GetComponentType[]) => void;\n projectId?: string;\n searchTestid?: string;\n selectedItems?: Set;\n type: T;\n validator?: ComponentSelectValidationCheck;\n}\n\nexport const getFirstSelection =\n (fn: (id: string, component: Component) => void) =>\n (selection: Set, items: Component[]) => {\n fn(selection.values().next().value, items[0]);\n };\n\ntype CSType = ((\n props: ComponentSelectProps,\n) => ReturnType) & { getFirstSelection: typeof getFirstSelection };\n\nexport const ComponentSelect: CSType = ({\n buttonTestid,\n disabled,\n emptySelectionLabel,\n hiddenIds,\n maxSelectionSize = 1,\n minSelectionSize = maxSelectionSize > 1 ? 0 : 1,\n onSelection,\n projectId,\n searchTestid,\n selectedItems,\n type,\n validator,\n}) => {\n const shouldSearchAllComponents = useAppModule(OrgPermissions)?.getPermission(\n OrgPermission.SearchAllComponents,\n );\n\n const searchInput = useRef(null);\n const searchTimeout = useRef(undefined);\n const [refreshItems, setRefreshItems] = useState(0);\n const [state, send] = useMachine(componentSelectMachine, {\n actions: {\n focusSearchInput: () => {\n searchInput.current?.focus();\n },\n queryComponents: (ctx, event) =>\n queryComponents(\n getComponentSelectQueryParams(\n ctx,\n selectedItems,\n 'searchString' in event ? event.searchString : undefined,\n projectId,\n ),\n ),\n selection: ({ queryResult, selectedIds, validation }) => {\n const validIds = validation.isValid ? selectedIds : new Set();\n const components = queryResult?.componentSearch.components as\n | GetComponentType[]\n | undefined;\n onSelection(validIds, components?.filter(({ id }) => validIds.has(id)) ?? []);\n setRefreshItems(refreshItems + 1);\n },\n\n startSearchDebounce: (_, event) => {\n clearTimeout(searchTimeout.current);\n searchTimeout.current = window.setTimeout(() => {\n if ('searchString' in event) {\n send({ searchString: event.searchString, type: 'SEARCH_STRING_READY' });\n }\n }, COMPONENT_SELECT_DEBOUNCE_DELAY);\n },\n },\n });\n\n const [queryComponents, { data, loading }] = useComponentSelectLazyQuery();\n\n useEffect(() => {\n if (loading) {\n send({ type: 'BEGIN_DATA_REQUEST' });\n } else if (!loading && data) {\n send({ data, type: 'DATA_LOADED' });\n }\n }, [send, loading, data]);\n\n useEffect(() => {\n send({\n settings: {\n componentType: type,\n disabled,\n emptySelectionLabel,\n hiddenIds,\n selectionSize: { max: maxSelectionSize, min: minSelectionSize },\n shouldSearchAllComponents,\n validationCheck: validator,\n },\n type: 'SETTINGS_CHANGED',\n });\n }, [\n disabled,\n emptySelectionLabel,\n hiddenIds,\n maxSelectionSize,\n minSelectionSize,\n shouldSearchAllComponents,\n send,\n type,\n validator,\n ]);\n\n useEffect(() => {\n if (selectedItems != null) {\n send({ selectedIds: selectedItems, type: 'EXTERNAL_SELECTED_ITEMS_CHANGED' });\n }\n }, [selectedItems, send, refreshItems]);\n\n const buttonLabel = useMemo(() => getButtonLabel(state.context), [state.context]);\n\n return (\n send({ type: 'CLICKED_AWAY' })}\n onComponentSelect={(id) => send({ id, type: 'COMPONENT_SELECTED' })}\n onPopoverClosing={() => send({ type: 'POPOVER_CLOSING' })}\n onPopoverOpened={() => send({ type: 'POPOVER_OPENED' })}\n onPopoverOpening={() => send({ type: 'POPOVER_OPENING' })}\n onSearchStringChange={(searchString) => send({ searchString, type: 'SEARCH_STRING_CHANGED' })}\n onToggleButtonClick={() => send({ type: 'TOGGLE_BUTTON_CLICKED' })}\n searchInput={searchInput}\n searchTestid={searchTestid}\n selectedItems={state.context.selectedIds}\n validation={state.context.validation}\n />\n );\n};\n\nComponentSelect.getFirstSelection = getFirstSelection;\n","import {\n ComponentSelectType,\n ComponentSelectValidationCheck,\n GetComponentType,\n} from './component-select-types';\n\ntype MultiInputComponentType = ComponentSelectType.DcOptimizer | ComponentSelectType.Microinverter;\n\nconst isSingleInput = (component: GetComponentType) => {\n if (component.__typename === 'DcOptimizer') {\n return (component.numInputs ?? 1) <= 1 && !component.isExternalMppt;\n }\n return (component.mppts ?? 1) <= 1;\n};\n\nexport const singleInputOnly =\n (message: string): ComponentSelectValidationCheck =>\n (components) =>\n components.every(isSingleInput) ? { isValid: true } : { isValid: false, message };\n","import { FC, useMemo, useState } from 'react';\n\nimport { CADTriggerActionTypes } from '@aurorasolar/common-data-store';\nimport { FeatureFlag, FeatureFlags, useAppModule } from '@aurorasolar/common-module-loader';\nimport { CadModal } from '@aurorasolar/graphql-client-schema';\n\nimport { ComponentSelectType } from '../component-select';\nimport { useTriggerCadAction } from '../hooks';\nimport { ComponentModalCore } from './component-modal-core';\nimport { InstrumentPanelModalProps } from './types';\n\nexport interface ComponentModalDefinition {\n actionType: CADTriggerActionTypes;\n cannotBeGeneric?: boolean;\n modal: CadModal;\n name: string;\n showExists: boolean;\n showMain: boolean;\n}\n\ntype NonModalComponents =\n | ComponentSelectType.DcOptimizer\n | ComponentSelectType.SolarPanel\n | ComponentSelectType.Microinverter\n | ComponentSelectType.SingleInputMicroinverter;\n\nexport type ModalComponents = Exclude;\n\nexport const modalComponentMap: Record = {\n [ComponentSelectType.CombinerBox]: {\n actionType: CADTriggerActionTypes.PlaceCombinerBox,\n modal: CadModal.PlaceCombinerBox,\n name: 'Combiner Box',\n showExists: false,\n showMain: false,\n },\n [ComponentSelectType.Disconnect]: {\n actionType: CADTriggerActionTypes.PlaceDisconnect,\n modal: CadModal.PlaceDisconnect,\n name: 'Disconnect',\n showExists: false,\n showMain: false,\n },\n [ComponentSelectType.SolarInverter]: {\n actionType: CADTriggerActionTypes.PlaceInverter,\n cannotBeGeneric: true,\n modal: CadModal.PlaceInverter,\n name: 'Inverter',\n showExists: false,\n showMain: false,\n },\n [ComponentSelectType.LoadCenter]: {\n actionType: CADTriggerActionTypes.PlaceLoadCenter,\n modal: CadModal.PlaceLoadCenter,\n name: 'Load Center',\n showExists: false,\n showMain: false,\n },\n [ComponentSelectType.Meter]: {\n actionType: CADTriggerActionTypes.PlaceMeter,\n modal: CadModal.PlaceMeter,\n name: 'Meter',\n showExists: true,\n showMain: false,\n },\n [ComponentSelectType.ServicePanel]: {\n actionType: CADTriggerActionTypes.PlaceServicePanel,\n modal: CadModal.PlaceServicePanel,\n name: 'Service Panel',\n showExists: true,\n showMain: true,\n },\n};\n\nexport interface ComponentModalProps extends InstrumentPanelModalProps {\n componentType: ModalComponents;\n}\nexport const ComponentModal: FC = ({ componentType, ...modalProps }) => {\n const [selectedComponentId, setSelectedComponent] = useState(null);\n const [exists, setExists] = useState(false);\n const [isMain, setIsMain] = useState(false);\n const featureFlags = useAppModule(FeatureFlags);\n const disableMain = useMemo(\n () =>\n featureFlags?.variation(FeatureFlag.ComponentInspectorLineDiagram) === true &&\n componentType === ComponentSelectType.ServicePanel,\n [componentType, featureFlags],\n );\n\n const { actionType, cannotBeGeneric, name, showExists, showMain } =\n modalComponentMap[componentType];\n\n const valid = !(cannotBeGeneric && !selectedComponentId);\n\n const confirm = useTriggerCadAction(actionType, {\n databaseId: selectedComponentId!,\n exists,\n main: isMain,\n });\n\n return (\n confirm(undefined)}\n exists={exists}\n genericDefault={!cannotBeGeneric}\n isMain={isMain}\n modalProps={modalProps}\n name={name}\n setSelectedComponent={setSelectedComponent}\n showExists={showExists}\n showMain={showMain && !disableMain}\n toggleExists={() => setExists((prev) => !prev)}\n toggleIsMain={() => setIsMain((prev) => !prev)}\n valid={valid}\n />\n );\n};\n","import { FC } from 'react';\nimport styled, { css } from 'styled-components';\n\nimport {\n AuroraThemedButton,\n AuroraThemedButtonIntent,\n MutedButton,\n} from '@aurorasolar/common-core/src/button';\nimport { Colors } from '@aurorasolar/common-core/src/colors';\nimport { SPACES } from '@aurorasolar/common-core/src/layout';\nimport { Text } from '@aurorasolar/common-core/src/typography';\nimport { Box, Flex } from '@rebass/grid';\n\nimport {\n ComponentSelect,\n ComponentSelectType,\n ComponentSelectValidationCheck,\n} from '../component-select';\n\nexport interface MlpeSelectionProps {\n hasSelectedPanel: boolean;\n integratedMlpeType?: string;\n onRemoveMlpe: VoidFunction;\n onSelectMlpe: (id: string) => void;\n onSelectMlpeType: (type: ComponentSelectType) => void;\n selectedMlpeId?: string;\n selectedMlpeType?: ComponentSelectType;\n vertical?: boolean;\n validator?: ComponentSelectValidationCheck<\n ComponentSelectType.DcOptimizer | ComponentSelectType.Microinverter\n >;\n}\n\nconst MlpeSelectionWrapper = styled.div<{ noSelection?: boolean; vertical?: boolean }>`\n margin-bottom: ${SPACES[4]}px;\n min-height: ${({ vertical }) => (vertical ? '90px' : '66px')};\n ${({ noSelection, vertical }) =>\n noSelection &&\n css`\n display: flex;\n justify-content: ${vertical ? 'space-between' : 'flex-start'};\n flex-direction: ${vertical ? 'column' : 'row'};\n `}\n`;\n\n/**\n * @deprecated: use `cad-pro` version\n */\nexport const MlpeSelection: FC = ({\n hasSelectedPanel,\n integratedMlpeType,\n onRemoveMlpe,\n onSelectMlpe,\n onSelectMlpeType,\n selectedMlpeId,\n selectedMlpeType,\n vertical = false,\n validator,\n}) => {\n if (integratedMlpeType != null) {\n return (\n \n \n \n Integrated MLPE\n \n \n \n \n {integratedMlpeType}\n \n \n \n );\n }\n if (selectedMlpeType != null) {\n return (\n \n \n \n \n {selectedMlpeType}\n \n \n \n Remove\n \n \n \n \n \n \n \n \n );\n }\n return (\n \n \n onSelectMlpeType(ComponentSelectType.Microinverter)}\n width={vertical ? '100%' : undefined}\n >\n + Microinverter\n \n \n \n onSelectMlpeType(ComponentSelectType.DcOptimizer)}\n width={vertical ? '100%' : undefined}\n >\n + DC Optimizer\n \n \n \n );\n};\n","import { CSSProperties, FC, useMemo } from 'react';\n\nimport { AuroraThemedButton, AuroraThemedButtonIntent } from '@aurorasolar/common-core/src/button';\nimport { AuroraButtonGroup } from '@aurorasolar/common-core/src/button-group';\nimport { AuroraCheckbox } from '@aurorasolar/common-core/src/checkbox';\nimport { Colors } from '@aurorasolar/common-core/src/colors';\nimport { AuroraIcon, AuroraIconType } from '@aurorasolar/common-core/src/icon';\nimport { AuroraNumericInput, NumericInputRightTag } from '@aurorasolar/common-core/src/input';\nimport { Modal, ModalActions } from '@aurorasolar/common-core/src/modal';\nimport { Text } from '@aurorasolar/common-core/src/typography';\nimport { NumericInputValidators } from '@aurorasolar/common-core/src/validator';\nimport { DrawArraySettings, StringingMode } from '@aurorasolar/common-data-store';\nimport { ConversionType, withNumericConversion } from '@aurorasolar/common-numeric-conversion';\nimport { PanelOrientation } from '@aurorasolar/graphql-client-schema';\nimport { Collapse } from '@blueprintjs/core';\nimport { Box, Flex } from '@rebass/grid';\n\nimport { ComponentSelect, ComponentSelectType, GetComponentType } from '../component-select';\nimport { getNumericInputLimitProps, limits } from '../property-limits';\nimport { GroundMountContext } from './ground-mount-modal-machine';\n\n// Needed because the collapsible area overlays the action buttons.\nconst INCREASE_BUTTON_Z: CSSProperties = { position: 'relative', zIndex: 1 };\n\nexport const groundMountModalTestid = {\n HEIGHT: 'ground-mount-modal-height',\n SPACING_X: 'ground-mount-modal-spacing-x',\n SPACING_Y: 'ground-mount-modal-spacing-y',\n STRINGING_LENGTH: 'ground-mount-modal-stringing-length',\n TILT: 'ground-mount-modal-tilt',\n};\nconst integerOnlyValidator: NumericInputValidators = [\n {\n condition: ({ value }) => value === Math.round(value),\n failureResult: {\n inline: 'Invalid Entry',\n tooltip: 'Please enter a whole number',\n },\n },\n];\nconst NumericInputWithConversion = withNumericConversion(AuroraNumericInput);\nconst orientations = [\n {\n icon: AuroraIconType.PANELS_PORTRAIT,\n key: PanelOrientation.P,\n },\n {\n icon: AuroraIconType.PANELS_LANDSCAPE,\n key: PanelOrientation.L,\n },\n];\n\nexport interface GroundMountModalCoreProps {\n isAdvancedOpen: boolean;\n isOpen: boolean;\n mlpeSection: JSX.Element;\n onClose: VoidFunction;\n onDrawButtonClick: VoidFunction;\n onPanelSelect: (panel: GetComponentType) => void;\n onStringingToggle: (checked: boolean) => void;\n onStringLengthChange: (length: number) => void;\n onToggleAdvancedSettings: VoidFunction;\n onUpdateSetting: (patch: Partial>) => void;\n portalContainer?: HTMLElement;\n projectId?: string;\n settingsForCad: GroundMountContext['settingsForCad'];\n}\n\nexport const GroundMountModalCore: FC = ({\n isAdvancedOpen,\n isOpen,\n mlpeSection,\n onClose,\n onDrawButtonClick,\n onPanelSelect,\n onStringingToggle,\n onStringLengthChange,\n onToggleAdvancedSettings,\n onUpdateSetting,\n portalContainer,\n projectId,\n settingsForCad,\n}) => {\n const selectedSolarPanelId = settingsForCad.solarPanelId;\n\n const modalActions = useMemo(\n () => ({\n Draw: [\n onDrawButtonClick,\n {\n disabled: selectedSolarPanelId == null,\n intent: AuroraThemedButtonIntent.PRIMARY,\n style: INCREASE_BUTTON_Z,\n },\n ],\n }),\n [onDrawButtonClick, selectedSolarPanelId],\n );\n\n return (\n \n \n \n Module\n \n \n \n {\n onPanelSelect(solarPanel);\n })}\n projectId={projectId}\n selectedItems={\n new Set(settingsForCad.solarPanelId == null ? [] : [settingsForCad.solarPanelId])\n }\n type={ComponentSelectType.SolarPanel}\n />\n \n {mlpeSection}\n \n \n \n \n Orientation\n \n \n icon}\n selectable={{\n items: orientations,\n onItemSelected: ({ key }) => onUpdateSetting({ orientation: key }),\n selectedItem: orientations.find(({ key }) => key === settingsForCad.orientation),\n }}\n />\n \n \n onUpdateSetting({ tilt })}\n rightElement={°}\n value={settingsForCad.tilt}\n />\n \n \n onUpdateSetting({ heightToBase })}\n tagComponent={NumericInputRightTag}\n value={settingsForCad.heightToBase}\n />\n \n \n \n \n \n onStringingToggle(checked)}\n />\n \n \n \n \n \n \n \n \n Advanced Settings\n\n \n \n \n \n \n \n onUpdateSetting({ interModuleSpacingX })\n }\n tagComponent={NumericInputRightTag}\n value={settingsForCad.interModuleSpacingX}\n />\n \n \n \n onUpdateSetting({ interModuleSpacingY })\n }\n tagComponent={NumericInputRightTag}\n value={settingsForCad.interModuleSpacingY}\n />\n \n \n \n * From Design Settings\n \n \n \n \n );\n};\n","interface Limits {\n max: number;\n min: number;\n sliderMax?: number;\n sliderMin?: number;\n stepSize: number;\n}\ntype PropertyLimits = { [key: string]: Limits };\n\nexport const getNumericInputLimitProps = ({ max, min, stepSize }: Limits) => ({\n max,\n min,\n stepSize,\n});\n\nexport const clampToLimits =\n ({ min, max }: Limits) =>\n (n: number) =>\n Math.max(Math.min(max, n), min);\n\nconst dormer = {\n pitch: {\n stepSize: 1, // other dormer limits are dynamic\n },\n};\nconst edge: PropertyLimits = {\n height: {\n max: 500,\n min: 0,\n sliderMax: 20,\n stepSize: 1,\n },\n length: {\n max: Infinity,\n min: 0.01,\n sliderMax: 20,\n stepSize: 1,\n },\n};\nconst fillZone: PropertyLimits = {\n minSap: {\n max: 99,\n min: 0,\n stepSize: 0.1,\n },\n};\nconst lidar: PropertyLimits = {\n offsetXY: {\n max: 12.88,\n min: -13.12,\n stepSize: 1,\n },\n offsetZ: {\n max: 97.57,\n min: -98.43,\n stepSize: 1,\n },\n};\nconst obstruction: PropertyLimits = {\n height: {\n max: Infinity,\n min: 0.1,\n sliderMax: 30,\n stepSize: 0.1,\n },\n radius: {\n max: Infinity,\n min: 0.1,\n sliderMax: 10,\n stepSize: 0.1,\n },\n setback: {\n max: Infinity,\n min: 0,\n sliderMax: 10,\n stepSize: 0.1,\n },\n};\n\nconst roof: PropertyLimits = {\n height: {\n max: Infinity,\n min: 0.1,\n sliderMax: 90,\n stepSize: 1,\n },\n pitch: {\n max: 80,\n min: 1,\n sliderMax: 80,\n stepSize: 1,\n },\n slope: {\n max: 68.1,\n min: 0.1,\n sliderMax: 12,\n stepSize: 1,\n },\n stories: {\n max: Infinity,\n min: 0,\n sliderMax: 30,\n stepSize: 1,\n },\n};\nconst roofNode: PropertyLimits = {\n angle: {\n max: 180,\n min: 0,\n stepSize: 1,\n },\n};\nconst ruler: PropertyLimits = {\n length: {\n max: Infinity,\n min: 0.1,\n sliderMax: 1000, // No slider in V1\n stepSize: 0.1,\n },\n};\n\nconst solarPanel: PropertyLimits = {\n rotation: {\n max: 179,\n min: -179,\n stepSize: 1,\n },\n spacing: {\n max: Infinity,\n min: 0,\n stepSize: 0.1,\n },\n tilt: {\n max: 89,\n min: 0,\n stepSize: 1,\n },\n};\nconst tree: PropertyLimits = {\n crownDiameter: {\n max: 30,\n min: 0.1,\n sliderMax: 20,\n stepSize: 1,\n },\n crownHeight: {\n max: 100,\n min: 0.1,\n sliderMax: 40,\n stepSize: 1,\n },\n height: {\n max: 100,\n min: 0.1,\n sliderMax: 40,\n stepSize: 1,\n },\n trunkDiameter: {\n max: 4,\n min: 0.1,\n stepSize: 0.1,\n },\n};\n\nconst walkway: PropertyLimits = {\n all: {\n max: 30,\n min: 0.1,\n stepSize: 0.1,\n },\n};\n\nconst firePathway: PropertyLimits = {\n width: {\n max: 10,\n min: 0,\n sliderMax: 3,\n stepSize: 1,\n },\n};\n\nconst groundMount: PropertyLimits = {\n heightToBase: {\n max: 100,\n min: 0,\n sliderMax: 16,\n stepSize: 0.1,\n },\n maxStringLength: {\n max: Infinity,\n min: 0,\n stepSize: 1,\n },\n rotation: solarPanel.rotation,\n // columns, rows (height, width) etc\n size: {\n max: 100,\n min: 1,\n stepSize: 1,\n },\n spacing: solarPanel.spacing,\n tilt: solarPanel.tilt,\n};\n\nconst customImage: PropertyLimits = {\n opacity: {\n max: 100,\n min: 0,\n stepSize: 1,\n },\n rotation: {\n max: 360,\n min: 0,\n stepSize: 1,\n },\n size: {\n max: Infinity,\n min: 1,\n sliderMax: 300,\n sliderMin: 5,\n stepSize: 1,\n },\n};\n\nexport const limits = {\n customImage,\n dormer,\n edge,\n fillZone,\n firePathway,\n groundMount,\n lidar,\n obstruction,\n roof,\n roofNode,\n ruler,\n solarPanel,\n tree,\n walkway,\n};\n","import { DrawArraySettings, StringingMode } from '@aurorasolar/common-data-store';\nimport { PanelOrientation } from '@aurorasolar/graphql-client-schema';\nimport { assign, createMachine } from '@xstate/fsm';\n\nimport { ComponentSelectType, GetComponentType } from '../component-select';\nimport { getMlpeLabel } from './util';\n\nexport interface GroundMountContext {\n settingsForCad: DrawArraySettings;\n isAdvancedOpen: boolean;\n integratedMlpeType?: string;\n selectedMlpeType?: ComponentSelectType;\n}\n\ntype GroundMountEvent =\n | { type: 'SETTING_CHANGED'; patch: Partial> }\n | { type: 'PANEL_SELECTED'; panel: GetComponentType }\n | { type: 'MLPE_TYPE_ADDED'; mlpeType: ComponentSelectType }\n | { type: 'MLPE_REMOVED' }\n | { type: 'ADVANCED_SETTINGS_TOGGLED' }\n | { type: 'MLPE_SELECTED'; mlpeId: string }\n | { type: 'DRAW_CLICKED' }\n | { type: 'STRINGING_TOGGLED'; checked: boolean }\n | { type: 'STRING_LENGTH_CHANGED'; length: number }\n | {\n type: 'SETTINGS_QUERY_RESPONDED';\n spacing: Pick;\n };\n\ntype EventOfType = Event & {\n type: EventType;\n};\n\ntype GroundMountState =\n | {\n value: 'notReady';\n context: {\n // The panel has not yet been selected\n settingsForCad: Omit;\n isAdvancedOpen: boolean;\n integratedMlpeType?: string;\n selectedMlpeType?: ComponentSelectType;\n };\n }\n | {\n value: 'panelIsSelected';\n context: {\n settingsForCad: DrawArraySettings;\n isAdvancedOpen: boolean;\n integratedMlpeType?: string;\n selectedMlpeType?: ComponentSelectType;\n };\n };\n\nconst sharedActions = {\n selectPanel: assign>({\n integratedMlpeType: (_, { panel }) => getMlpeLabel(panel.mlpe),\n settingsForCad: (context, { panel }) => {\n const settings = {\n ...context.settingsForCad,\n solarPanelId: panel.id,\n };\n // If there is an integrated MLPE, remove the selected one.\n if (panel.mlpe?.type != null) {\n settings.dcOptimizerId = undefined;\n settings.microinverterId = undefined;\n }\n return settings;\n },\n }),\n\n toggleAdvancedSettings: assign({\n isAdvancedOpen: (context) => !context.isAdvancedOpen,\n }),\n\n toggleStringing: assign>({\n settingsForCad: (context, { checked }) => ({\n ...context.settingsForCad,\n maxStringLength: undefined,\n stringingMode: checked ? StringingMode.EntireRow : StringingMode.None,\n }),\n }),\n\n updateSettings: assign>({\n settingsForCad: (context, { patch }) => ({ ...context.settingsForCad, ...patch }),\n }),\n\n updateStringLength: assign<\n GroundMountContext,\n EventOfType\n >({\n settingsForCad: (context, { length }) => ({\n ...context.settingsForCad,\n maxStringLength: length === 0 ? undefined : Math.round(length),\n stringingMode: length === 0 ? StringingMode.EntireRow : StringingMode.MaxLength,\n }),\n }),\n};\n\nexport const groundMountModalMachine = createMachine<\n GroundMountContext,\n GroundMountEvent,\n GroundMountState\n>({\n context: {\n isAdvancedOpen: false,\n settingsForCad: {\n arraySpacingX: 0,\n arraySpacingY: 0,\n heightToBase: 1,\n interModuleSpacingX: 0,\n interModuleSpacingY: 0,\n orientation: PanelOrientation.P,\n stringingMode: StringingMode.None,\n tilt: 0,\n },\n },\n id: 'groundMountModal',\n initial: 'notReady',\n states: {\n notReady: {\n on: {\n ADVANCED_SETTINGS_TOGGLED: { actions: sharedActions.toggleAdvancedSettings },\n PANEL_SELECTED: {\n actions: sharedActions.selectPanel,\n target: 'panelIsSelected',\n },\n SETTING_CHANGED: { actions: sharedActions.updateSettings },\n STRING_LENGTH_CHANGED: { actions: sharedActions.updateStringLength },\n STRINGING_TOGGLED: { actions: sharedActions.toggleStringing },\n },\n },\n panelIsSelected: {\n on: {\n ADVANCED_SETTINGS_TOGGLED: { actions: sharedActions.toggleAdvancedSettings },\n DRAW_CLICKED: { actions: 'startDrawing' },\n MLPE_REMOVED: {\n actions: assign({\n selectedMlpeType: (_) => undefined,\n settingsForCad: (context) => ({\n ...context.settingsForCad,\n dcOptimizerId: undefined,\n microinverterId: undefined,\n }),\n }),\n },\n MLPE_SELECTED: {\n actions: assign({\n settingsForCad: ({ settingsForCad, selectedMlpeType }, { mlpeId }) => ({\n ...settingsForCad,\n dcOptimizerId:\n selectedMlpeType === ComponentSelectType.DcOptimizer ? mlpeId : undefined,\n microinverterId:\n selectedMlpeType === ComponentSelectType.Microinverter ? mlpeId : undefined,\n }),\n }),\n },\n MLPE_TYPE_ADDED: {\n actions: assign({\n selectedMlpeType: (_, { mlpeType }) => mlpeType,\n }),\n },\n PANEL_SELECTED: { actions: sharedActions.selectPanel },\n SETTING_CHANGED: { actions: sharedActions.updateSettings },\n STRING_LENGTH_CHANGED: { actions: sharedActions.updateStringLength },\n STRINGING_TOGGLED: { actions: sharedActions.toggleStringing },\n },\n },\n },\n});\n","import { ComponentSelectType, GetComponentType } from '../component-select';\n\nexport const getMlpeLabel = (mlpe: GetComponentType['mlpe']) => {\n if (mlpe != null) {\n if (mlpe.isCellStringOptimizer) {\n return 'Cell String Optimizer';\n }\n if (mlpe.isDcOptimizer) {\n return 'DC Optimizer';\n }\n if (mlpe.isSolarInverter) {\n return 'Solar Inverter';\n }\n }\n return undefined;\n};\n","// @ts-ignore: Ignore unused { * as Types } import\nimport * as Types from '@aurorasolar/graphql-client-schema';\n\nimport { gql } from '@apollo/client';\nimport * as Apollo from '@apollo/client';\nconst defaultOptions = {} as const;\nexport type GroundMountModalQueryVariables = Types.Exact<{\n designId: Types.Scalars['ID'];\n}>;\n\n\nexport type GroundMountModalQuery = { __typename: 'Query', design: { __typename: 'Design', id: string, interModuleSpacingX?: number | null | undefined, interModuleSpacingY?: number | null | undefined } };\n\n\nexport const GroundMountModalDocument = gql`\n query GroundMountModal($designId: ID!) @trace_info(traceInfo: {pod: cad}) {\n design: designById(id: $designId) {\n id\n interModuleSpacingX\n interModuleSpacingY\n }\n}\n `;\n\n/**\n * __useGroundMountModalQuery__\n *\n * To run a query within a React component, call `useGroundMountModalQuery` and pass it any options that fit your needs.\n * When your component renders, `useGroundMountModalQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useGroundMountModalQuery({\n * variables: {\n * designId: // value for 'designId'\n * },\n * });\n */\nexport function useGroundMountModalQuery(baseOptions: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(GroundMountModalDocument, options);\n }\nexport function useGroundMountModalLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(GroundMountModalDocument, options);\n }\nexport type GroundMountModalQueryHookResult = ReturnType;\nexport type GroundMountModalLazyQueryHookResult = ReturnType;\nexport type GroundMountModalQueryResult = Apollo.QueryResult;","import { FC, useEffect } from 'react';\n\nimport { useProjectIdDesignIdOrSubRoute } from '@aurorasolar/common-core/src/hooks';\nimport {\n CADTriggerActionTypes,\n DrawArraySettings,\n StringingMode,\n} from '@aurorasolar/common-data-store';\nimport { AnalyticsEventTypes } from '@aurorasolar/common-module-loader';\nimport { PanelOrientation } from '@aurorasolar/graphql-client-schema';\nimport { useMachine } from '@xstate/react/lib/fsm';\n\nimport { componentSelectValidator } from '../component-select';\nimport { useTriggerCadAction } from '../hooks';\nimport { useAnalytics } from '../hooks/use-analytics';\nimport { MlpeSelection } from '../mlpe-selection';\nimport { GroundMountModalCore } from './ground-mount-modal-core';\nimport { groundMountModalMachine } from './ground-mount-modal-machine';\nimport { useGroundMountModalQuery } from './ground-mount-modal.generated';\n\nexport interface GroundMountModalProps {\n designId: string;\n isOpen: boolean;\n onClose: VoidFunction;\n portalContainer?: HTMLElement;\n}\nconst singleInputOnly = componentSelectValidator.singleInputOnly(\n 'Currently, ground mounts cannot contain multi-input components',\n);\n\nexport const GroundMountModal: FC = ({\n designId,\n isOpen,\n onClose,\n portalContainer,\n}) => {\n const startDrawingGroundMount = useTriggerCadAction(CADTriggerActionTypes.DrawArrays, {});\n const queryResult = useGroundMountModalQuery({ variables: { designId } });\n const { projectId } = useProjectIdDesignIdOrSubRoute();\n const track = useAnalytics();\n const [state, send] = useMachine(groundMountModalMachine, {\n actions: {\n startDrawing: (context) => {\n if (context.settingsForCad.solarPanelId != null) {\n onClose();\n startDrawingGroundMount(context.settingsForCad as DrawArraySettings);\n const dcOptimizer = context.settingsForCad.dcOptimizerId ? 'DC optimizer' : undefined;\n const micro = context.settingsForCad.microinverterId ? 'microinverter' : undefined;\n track(AnalyticsEventTypes.DesignAddedGroundmount, {\n added_strings: context.settingsForCad.stringingMode !== StringingMode.None,\n adder: micro || dcOptimizer,\n panel_orientation:\n context.settingsForCad.orientation === PanelOrientation.L ? 'landscape' : 'portrait',\n });\n }\n },\n },\n });\n\n useEffect(() => {\n const design = queryResult.data?.design;\n if (design != null) {\n send({\n patch: {\n interModuleSpacingX: design.interModuleSpacingX ?? 0,\n interModuleSpacingY: design.interModuleSpacingY ?? 0,\n },\n type: 'SETTING_CHANGED',\n });\n }\n }, [queryResult.data?.design, send]);\n\n const { settingsForCad, isAdvancedOpen, integratedMlpeType, selectedMlpeType } = state.context;\n\n return (\n send('MLPE_REMOVED')}\n onSelectMlpe={(mlpeId) => send({ mlpeId, type: 'MLPE_SELECTED' })}\n onSelectMlpeType={(mlpeType) => send({ mlpeType, type: 'MLPE_TYPE_ADDED' })}\n selectedMlpeId={\n settingsForCad.microinverterId ?? settingsForCad.dcOptimizerId ?? undefined\n }\n selectedMlpeType={selectedMlpeType}\n validator={singleInputOnly}\n />\n }\n onClose={onClose}\n onDrawButtonClick={() => send('DRAW_CLICKED')}\n onPanelSelect={(panel) => send({ panel, type: 'PANEL_SELECTED' })}\n onStringLengthChange={(length) => send({ length, type: 'STRING_LENGTH_CHANGED' })}\n onStringingToggle={(checked) => send({ checked, type: 'STRINGING_TOGGLED' })}\n onToggleAdvancedSettings={() => send('ADVANCED_SETTINGS_TOGGLED')}\n onUpdateSetting={(patch) => send({ patch, type: 'SETTING_CHANGED' })}\n portalContainer={portalContainer}\n projectId={projectId}\n settingsForCad={settingsForCad}\n />\n );\n};\n","import { useEffect, useState } from 'react';\n\nimport { AuroraThemedButtonIntent } from '@aurorasolar/common-core/src/button';\nimport { Colors } from '@aurorasolar/common-core/src/colors';\nimport { Modal, ModalActions } from '@aurorasolar/common-core/src/modal';\nimport { AuroraTooltip } from '@aurorasolar/common-core/src/tooltip';\nimport { Text } from '@aurorasolar/common-core/src/typography';\nimport { CADTriggerActionTypes } from '@aurorasolar/common-data-store';\nimport { Position, Switch } from '@blueprintjs/core';\nimport { Box, Flex } from '@rebass/grid';\nimport { styled, x } from '@xstyled/styled-components';\n\nimport { InstrumentPanelModalProps } from '../../component-modal/types';\nimport { useTriggerCadAction } from '../../hooks';\nimport { useProjectAhj } from '../../hooks/use-project-ahj';\nimport { getFireCodeYear } from './fire-pathway-helper-util';\n\nconst InfoText = styled(Text)`\n color: ${Colors.GRAY_700};\n font-size: 16px;\n`;\nconst SubTitle = styled(Text)`\n color: ${Colors.GRAY_700};\n font-weight: bold;\n font-size: 16px;\n`;\n\nconst AhjText = styled(Text)`\n color: ${Colors.NAVY};\n font-size: 16px;\n font-weight: bold;\n`;\n\nconst CodeYearText = styled(Text)`\n color: ${Colors.GRAY_700};\n font-size: 16px;\n`;\n\nconst FireSprinklerTitle = styled(Text)`\n color: ${Colors.GRAY_800};\n font-size: 14px;\n font-weight: 500;\n`;\n\nconst Section = styled(Flex)`\n flex-direction: column;\n margin-top: 16px;\n`;\n\nconst FireSprinklerToggle = styled(Flex)`\n flex-direction: row;\n align-items: center;\n margin-top: 16px;\n`;\n\nexport const AutoPlaceFirePathwayModalCore = ({\n onClose,\n ...modalProps\n}: InstrumentPanelModalProps) => {\n const [fireSprinklers, setFireSprinklers] = useState(false);\n const [fireCode, setFireCode] = useState('');\n\n // Only display modal if code year is 2015, 2018 or 2021\n const { ahj } = useProjectAhj();\n const codeYear = getFireCodeYear(ahj || undefined);\n\n useEffect(() => {\n setFireCode(codeYear || '');\n }, [codeYear]);\n\n const confirm = useTriggerCadAction(CADTriggerActionTypes.PlacePathways, {\n fireCode,\n fireSprinklers,\n });\n\n const actions = {\n 'Place fire pathways': [\n () => {\n onClose();\n confirm();\n },\n { intent: AuroraThemedButtonIntent.PRIMARY },\n ],\n } as ModalActions;\n return (\n \n \n

Auto place fire pathways

\n \n Based on AHJ and code year requirements, Aurora will auto place the minimum fire pathways\n for the system's design.\n \n
\n AHJ\n \n {ahj?.name ? (\n \n {ahj?.name}\n \n ) : (\n '-'\n )}\n \n
\n
\n \n Code year\n \n \n {ahj?.fireCode}\n
\n {codeYear && parseInt(codeYear, 10) >= 2018 && (\n \n \n Fire sprinklers\n \n \n setFireSprinklers(!fireSprinklers)}\n style={{ marginLeft: '32px' }}\n />\n \n )}\n
\n
\n );\n};\n","import { FunctionComponent, useMemo } from 'react';\nimport styled from 'styled-components';\n\nimport { Box, BoxProps } from '@rebass/grid';\n\nconst StyledBox = styled(Box)`\n min-height: 40px;\n`;\n\ntype CadInspectorRowProps = {\n tall?: boolean;\n noBottomPadding?: boolean;\n} & Omit;\n\nexport const CadInspectorRow: FunctionComponent = ({\n tall = false,\n noBottomPadding = false,\n ...props\n}: CadInspectorRowProps) => {\n const mb = useMemo(() => {\n if (noBottomPadding) {\n return 0;\n }\n if (tall) {\n return 6;\n }\n return 3;\n }, [tall, noBottomPadding]);\n return ;\n};\n","import { FC } from 'react';\nimport styled from 'styled-components';\n\nimport { FlatButton, MutedButton } from '@aurorasolar/common-core/src/button';\nimport { AuroraButtonGroup } from '@aurorasolar/common-core/src/button-group';\nimport { useLocaleFormat } from '@aurorasolar/common-core/src/hooks';\nimport { AuroraIcon, AuroraIconType } from '@aurorasolar/common-core/src/icon';\nimport { AuroraNumericInput, NumericInputRightTag } from '@aurorasolar/common-core/src/input';\nimport TooltipContent from '@aurorasolar/common-core/src/tooltip/tooltip-content';\nimport { AuroraText, TextType } from '@aurorasolar/common-core/src/typography';\nimport { ConversionType, withNumericConversion } from '@aurorasolar/common-numeric-conversion';\nimport { PanelOrientation } from '@aurorasolar/graphql-client-schema';\nimport { Collapse, Tooltip } from '@blueprintjs/core';\nimport { Box, Flex } from '@rebass/grid';\n\nimport {\n ComponentSelect,\n ComponentSelectType,\n componentSelectValidator,\n} from '../component-select';\nimport { LabeledDropDownWithRemoveButton } from '../inspector/cad-inspector-labeled-dropdown-with-remove';\nimport { limits } from '../property-limits';\nimport { SolarPanelModalState } from './solar-panel-modal-state';\n\nconst singleInputOnly = componentSelectValidator.singleInputOnly(\n 'Use AutoStringer to add multi-input components',\n);\nexport interface SolarPanelModalCoreProps {\n isIrradianceLoaded: boolean;\n onPanelSelected: (id: string) => void;\n projectId?: string;\n setState: (partial: Partial) => void;\n state: SolarPanelModalState;\n selectedPanelName?: string;\n}\nconst StyledToggleButton = styled(MutedButton)`\n padding: 0;\n`;\n\nconst testids = {\n microinverterSelectButton: 'solar-panel-modal-microinverter-select-button',\n microinverterSelectSearch: 'solar-panel-modal-microinverter-select-search',\n optimizerSelectButton: 'solar-panel-modal-optimizer-select-button',\n optimizerSelectSearch: 'solar-panel-modal-optimizer-select-search',\n panelSelectButton: 'solar-panel-modal-panel-select-button',\n panelSelectSearch: 'solar-panel-modal-panel-select-search',\n};\n\nconst OrientationButtonGroupItems = [\n {\n dataTestId: 'orientation-portrait-button',\n icon: AuroraIconType.PANELS_PORTRAIT,\n orientation: PanelOrientation.P,\n },\n {\n dataTestId: 'orientation-landscape-button',\n icon: AuroraIconType.PANELS_LANDSCAPE,\n orientation: PanelOrientation.L,\n },\n];\n\nconst CadNumericInputWithConversion = withNumericConversion(AuroraNumericInput);\nexport const SolarPanelModalCore: FC = ({\n isIrradianceLoaded,\n onPanelSelected,\n projectId,\n setState,\n state,\n}) => {\n const {\n collapseIsOpen,\n minSap,\n orientation,\n rotation,\n spacingX,\n spacingY,\n tilt,\n useDcOptimizer,\n useMicroinverter,\n } = state;\n const { formatNumber } = useLocaleFormat();\n\n const handleCollapse = () => {\n setState({ collapseIsOpen: !collapseIsOpen });\n };\n\n const widthSize = 10;\n\n const showAddComponentButtons = () => !useDcOptimizer && !useMicroinverter;\n\n return (\n \n \n \n \n Module\n \n (state.panelId ? [state.panelId] : [])}\n type={ComponentSelectType.SolarPanel}\n />\n \n \n \n Orientation\n \n item.icon}\n getItemKey={(item) => item.orientation}\n getItemTestId={(item) => item.dataTestId}\n selectable={{\n items: OrientationButtonGroupItems,\n onItemSelected: (item) => setState({ orientation: item!.orientation }),\n selectedItem: OrientationButtonGroupItems.find(\n (item) => item.orientation === orientation,\n ),\n }}\n />\n \n \n {showAddComponentButtons() && (\n \n \n setState({ useMicroinverter: true })}\n >\n + Microinverter\n \n \n \n setState({ useDcOptimizer: true })}\n >\n + DC Optimizer\n \n \n \n )}\n {useMicroinverter && (\n \n \n setState({ microinverterId: undefined, useMicroinverter: false })}\n rowProps={{ pl: 0 }}\n >\n \n setState({ microinverterId }),\n )}\n searchTestid={testids.microinverterSelectSearch}\n selectedItems={new Set(state.microinverterId ? [state.microinverterId] : [])}\n type={ComponentSelectType.Microinverter}\n validator={singleInputOnly}\n />\n \n \n \n \n )}\n {useDcOptimizer && (\n \n \n setState({ dcOptimizerId: undefined, useDcOptimizer: false })}\n rowProps={{ pl: 0 }}\n >\n \n setState({ dcOptimizerId }),\n )}\n searchTestid={testids.optimizerSelectSearch}\n selectedItems={new Set(state.dcOptimizerId ? [state.dcOptimizerId] : [])}\n type={ComponentSelectType.DcOptimizer}\n validator={singleInputOnly}\n />\n \n \n \n \n )}\n \n \n \n }\n >\n Advanced\n \n \n \n \n \n \n {\n setState({ tilt: value });\n }}\n rightElement={°}\n value={formatNumber(tilt)}\n {...limits.solarPanel.tilt}\n />\n \n \n setState({ rotation: value })}\n rightElement={°}\n value={formatNumber(rotation)}\n {...limits.solarPanel.rotation}\n />\n \n \n {\n setState({ spacingX: value });\n }}\n tagComponent={NumericInputRightTag}\n value={formatNumber(spacingX)}\n {...limits.solarPanel.spacing}\n />\n \n \n 0 ? 'Row Spacing *' : 'Spacing Y *'}\n onValueChange={(value: number) => {\n setState({ spacingY: value });\n }}\n tagComponent={NumericInputRightTag}\n value={formatNumber(spacingY)}\n {...limits.solarPanel.spacing}\n />\n \n \n {isIrradianceLoaded ? (\n setState({ minSap: value })}\n rightElement={%}\n value={formatNumber(minSap)}\n {...limits.fillZone.minSap}\n />\n ) : (\n \n %}\n value={formatNumber(0)}\n {...limits.fillZone.minSap}\n />\n \n )}\n \n \n \n \n \n * From Design Settings\n \n \n \n \n ** Fill Roof Face only\n \n \n \n \n \n );\n};\n","// @ts-ignore: Ignore unused { * as Types } import\nimport * as Types from '@aurorasolar/graphql-client-schema';\n\nimport { gql } from '@apollo/client';\nimport * as Apollo from '@apollo/client';\nconst defaultOptions = {} as const;\nexport type SolarPanelModalQueryVariables = Types.Exact<{\n designId: Types.Scalars['ID'];\n}>;\n\n\nexport type SolarPanelModalQuery = { __typename: 'Query', design: { __typename: 'Design', id: string, interModuleSpacingX?: number | null | undefined, interModuleSpacingY?: number | null | undefined } };\n\nexport type SolarPanelModalLocalQueryVariables = Types.Exact<{ [key: string]: never; }>;\n\n\nexport type SolarPanelModalLocalQuery = { __typename: 'Query', CAD: { __typename: 'CAD', irradianceState: { __typename: 'IrradianceState', roof: { __typename: 'IrradianceStateType', status?: Types.IrradianceStates | null | undefined } } } };\n\n\nexport const SolarPanelModalDocument = gql`\n query SolarPanelModal($designId: ID!) @trace_info(traceInfo: {pod: cad}) {\n design: designById(id: $designId) {\n id\n interModuleSpacingX\n interModuleSpacingY\n }\n}\n `;\n\n/**\n * __useSolarPanelModalQuery__\n *\n * To run a query within a React component, call `useSolarPanelModalQuery` and pass it any options that fit your needs.\n * When your component renders, `useSolarPanelModalQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useSolarPanelModalQuery({\n * variables: {\n * designId: // value for 'designId'\n * },\n * });\n */\nexport function useSolarPanelModalQuery(baseOptions: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(SolarPanelModalDocument, options);\n }\nexport function useSolarPanelModalLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(SolarPanelModalDocument, options);\n }\nexport type SolarPanelModalQueryHookResult = ReturnType;\nexport type SolarPanelModalLazyQueryHookResult = ReturnType;\nexport type SolarPanelModalQueryResult = Apollo.QueryResult;\nexport const SolarPanelModalLocalDocument = gql`\n query SolarPanelModalLocal @trace_info(traceInfo: {pod: cad}) {\n CAD @client {\n irradianceState {\n roof {\n status\n }\n }\n }\n}\n `;\n\n/**\n * __useSolarPanelModalLocalQuery__\n *\n * To run a query within a React component, call `useSolarPanelModalLocalQuery` and pass it any options that fit your needs.\n * When your component renders, `useSolarPanelModalLocalQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useSolarPanelModalLocalQuery({\n * variables: {\n * },\n * });\n */\nexport function useSolarPanelModalLocalQuery(baseOptions?: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(SolarPanelModalLocalDocument, options);\n }\nexport function useSolarPanelModalLocalLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(SolarPanelModalLocalDocument, options);\n }\nexport type SolarPanelModalLocalQueryHookResult = ReturnType;\nexport type SolarPanelModalLocalLazyQueryHookResult = ReturnType;\nexport type SolarPanelModalLocalQueryResult = Apollo.QueryResult;","import { FC, useMemo } from 'react';\nimport styled from 'styled-components';\n\nimport { GoogleMap, TileSelector, TileSelectorUpdate } from '@aurorasolar/common-google-map';\nimport * as DS from '@aurorasolar/ds';\n\nconst MapWrap = styled.div`\n flex: 1 0 auto;\n overflow: hidden;\n display: flex;\n position: relative;\n justify-content: center;\n\n @media (max-width: 1080px) {\n height: 35vh;\n }\n`;\n\nconst MapOverlay = styled.div`\n position: absolute;\n z-index: 1;\n\n /* To prevent the overlay from covering the map control buttons */\n @media (max-width: 1350px) {\n display: none;\n }\n`;\n\nexport const CloseStandardModalButton = styled.div`\n cursor: pointer;\n`;\n\nexport const STANDARD_IMAGERY_MODAL_TESTID = 'standard-imagery-modal';\n\nexport interface StandardImageryModalCoreProps {\n isOpen: boolean;\n mapLocation: google.maps.LatLngLiteral;\n mapStartingSelection?: google.maps.LatLngBounds;\n onClose: VoidFunction;\n onGetImagery: VoidFunction;\n onMapSelectionUpdate: (update: TileSelectorUpdate) => void;\n zoom: number;\n}\n\nexport const StandardImageryModalCore: FC = ({\n isOpen,\n mapLocation,\n mapStartingSelection,\n onClose,\n onGetImagery,\n onMapSelectionUpdate,\n zoom,\n}) => {\n const mapOptions = useMemo(\n () => ({\n center: mapLocation,\n fullscreenControl: false,\n mapTypeId: 'hybrid',\n minZoom: 16,\n rotateControl: false,\n streetViewControl: false,\n tilt: 0,\n zoom,\n }),\n [mapLocation, zoom],\n );\n\n return (\n \n \n \n \n \n \n Select the desired area\n \n \n \n \n \n \n \n \n \n \n \n Resize standard maps\n \n \n Change the box size to reduce or expand displayed map area of Google Maps, Google\n Maps HD, and Bing Maps.\n \n \n \n Update maps\n \n \n \n \n \n );\n};\n","// @ts-ignore: Ignore unused { * as Types } import\nimport * as Types from '@aurorasolar/graphql-client-schema';\n\nimport { gql } from '@apollo/client';\nimport * as Apollo from '@apollo/client';\nconst defaultOptions = {} as const;\nexport type CadModalsQueryVariables = Types.Exact<{ [key: string]: never; }>;\n\n\nexport type CadModalsQuery = { __typename: 'Query', CAD: { __typename: 'CAD', activeModal?: Types.CadModal | null | undefined, activeModalData?: any | null | undefined } };\n\n\nexport const CadModalsDocument = gql`\n query CadModals @trace_info(traceInfo: {pod: cad}) {\n CAD @client {\n activeModal\n activeModalData\n }\n}\n `;\n\n/**\n * __useCadModalsQuery__\n *\n * To run a query within a React component, call `useCadModalsQuery` and pass it any options that fit your needs.\n * When your component renders, `useCadModalsQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useCadModalsQuery({\n * variables: {\n * },\n * });\n */\nexport function useCadModalsQuery(baseOptions?: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(CadModalsDocument, options);\n }\nexport function useCadModalsLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(CadModalsDocument, options);\n }\nexport type CadModalsQueryHookResult = ReturnType;\nexport type CadModalsLazyQueryHookResult = ReturnType;\nexport type CadModalsQueryResult = Apollo.QueryResult;","import { FC, useCallback, useEffect, useRef } from 'react';\n\nimport { Analytics, AnalyticsEventTypes, useAppModule } from '@aurorasolar/common-module-loader';\nimport { CadModal } from '@aurorasolar/graphql-client-schema';\nimport { RackingIntegrationModal, RackingNavigateAwayModal } from '@aurorasolar/racking';\n\nimport { AutoStringMiMlpeModal } from '../autostring/autostring-modal';\nimport {\n ComponentModal,\n modalComponentMap,\n ModalComponents,\n} from '../component-modal/component-modal';\nimport { CurrentInverterModal } from '../component-modal/current-inverter-modal';\nimport { DownloadDxfModal } from '../downloads/dxf-modal';\nimport { GroundMountModal } from '../ground-mount-modal';\nimport { useSaveCad } from '../hooks';\nimport { useRackingNavigateAway } from '../hooks/use-racking-navigate-away';\nimport { AutoPlaceFirePathwayModal } from '../inspector/walkway/fire-pathway-modal';\nimport { LegacyThemeProvider } from '../legacy-theme';\nimport { SolarPanelModal } from '../solar-panel-modal/solar-panel-modal';\nimport { StandardImageryModal } from '../standard-imagery-modal';\nimport { UnsavedChangesModal } from '../unsaved-changes-modal/unsaved-changes-modal';\nimport { useCadModalsQuery } from './cad-modals.generated';\nimport { CameraHelperModal } from './camera-helper-modal';\nimport { useCadModal } from './use-cad-modal';\n\nconst modalAnalyticsMap = new Map([\n [CadModal.PlaceSolarPanels, AnalyticsEventTypes.DesignClickedInsertPanels],\n [CadModal.PlaceCombinerBox, AnalyticsEventTypes.DesignClickedCombinerBox],\n [CadModal.PlaceDisconnect, AnalyticsEventTypes.DesignClickedDisconnect],\n [CadModal.PlaceInverter, AnalyticsEventTypes.DesignClickedInverter],\n [CadModal.PlaceLoadCenter, AnalyticsEventTypes.DesignClickedLoadCenter],\n [CadModal.PlaceMeter, AnalyticsEventTypes.DesignClickedMeter],\n [CadModal.PlaceServicePanel, AnalyticsEventTypes.DesignClickedServicePanel],\n]);\nexport interface CadModalsProps {\n designId: string;\n portalContainer?: HTMLElement;\n setRackingIntegrationSettingId?: (id: string | null) => void;\n isRackingOpen: boolean;\n}\nexport const CadModals: FC = ({\n designId,\n isRackingOpen,\n portalContainer,\n setRackingIntegrationSettingId,\n}) => {\n const track = useAppModule(Analytics)?.track;\n const usePortal = portalContainer != null;\n const trackRef = useRef(track!);\n trackRef.current = track ?? (() => {});\n\n const [, setModal] = useCadModal();\n const { save } = useSaveCad();\n const closeModal = useCallback(() => {\n setModal();\n }, [setModal]);\n\n const cadQueryData = useCadModalsQuery({\n returnPartialData: true,\n })?.data?.CAD;\n\n const activeModal = cadQueryData?.activeModal ?? null;\n\n useEffect(() => {\n const analyticsEvent = modalAnalyticsMap.get(activeModal!);\n if (analyticsEvent && analyticsEvent !== AnalyticsEventTypes.DesignClickedInsertPanels) {\n trackRef.current(analyticsEvent, { used_shortcut: false });\n }\n }, [activeModal]);\n\n const { setRackingBlockNavigateAway } = useRackingNavigateAway();\n if (isRackingOpen) {\n setRackingBlockNavigateAway(true);\n } else {\n setRackingBlockNavigateAway(false);\n }\n\n return (\n <>\n {/* Override the Borealis theme for the modals not yet converted to borealis */}\n \n \n \n\n {Object.entries(modalComponentMap).map(([type, { modal }]) => (\n \n ))}\n \n \n \n \n \n \n {!isRackingOpen && }\n \n\n {isRackingOpen && }\n {setRackingIntegrationSettingId && (\n {\n closeModal();\n setRackingIntegrationSettingId(integrationSettingId);\n }}\n save={save}\n />\n )}\n \n );\n};\n","import { ComponentProps } from 'react';\nimport styled from 'styled-components';\n\nimport { AuroraThemedButton, AuroraThemedButtonIntent } from '@aurorasolar/common-core/src/button';\nimport { Colors } from '@aurorasolar/common-core/src/colors';\nimport { defaultButtonBorderRadius, SPACES } from '@aurorasolar/common-core/src/layout';\nimport { ButtonGroup } from '@blueprintjs/core';\n\nexport const DrawerTitle = styled.h4`\n text-transform: uppercase;\n margin: ${SPACES[4]}px 0;\n padding: 0;\n color: ${Colors.GRAY_700};\n font-size: 14px;\n font-weight: 700;\n line-height: 22px;\n`;\n\nexport const DrawerSection = styled.div`\n border-bottom: 1px solid ${Colors.GRAY_300};\n padding-top: ${SPACES[0]}px;\n\n &:last-child {\n border-bottom: none;\n }\n\n &:first-child {\n padding-top: 0;\n }\n`;\n\nexport const DrawerTabGroup = styled(ButtonGroup)`\n border: solid 1px ${Colors.GRAY_300};\n border-radius: ${defaultButtonBorderRadius}px;\n overflow: hidden;\n`;\n\ntype DrawerTabSelectedProps = ComponentProps;\n\nconst DrawerTabSelected = styled(AuroraThemedButton).attrs({\n grouped: true,\n intent: AuroraThemedButtonIntent.SECONDARY,\n})`\n && {\n border: none;\n border-radius: 0;\n box-shadow: inset 0 -2px ${Colors.GRAY_800};\n color: ${Colors.GRAY_800};\n font-weight: 500;\n }\n`;\n\ntype DrawerTabNotSelectedProps = ComponentProps;\n\nconst DrawerTabNotSelected = styled(AuroraThemedButton).attrs({\n grouped: true,\n intent: AuroraThemedButtonIntent.SECONDARY,\n})`\n border: none;\n border-radius: 0;\n color: ${Colors.GRAY_700};\n`;\n\ntype DrawerTabProps =\n | ({ isSelected: true } & DrawerTabSelectedProps)\n | ({ isSelected: false } & DrawerTabNotSelectedProps);\n\nexport const DrawerTab = ({ isSelected = false, ...props }: DrawerTabProps) => {\n return isSelected ? : ;\n};\n","import React, { FC } from 'react';\nimport styled from 'styled-components';\n\nimport { AuroraThemedButton, AuroraThemedButtonIntent } from '@aurorasolar/common-core/src/button';\nimport { Colors } from '@aurorasolar/common-core/src/colors';\nimport { Box, Flex } from '@rebass/grid';\n\nexport const AutoDesignerInputArea: FC<{\n alignTop?: boolean;\n numericInputOffset?: boolean;\n labelArea: React.ReactNode;\n fill?: boolean;\n}> = ({ alignTop = false, numericInputOffset = false, fill = false, labelArea, children }) => (\n \n \n {labelArea}\n \n {children}\n \n);\n\nexport const AutoDesignerRadioButton = styled(AuroraThemedButton).attrs({\n grouped: true,\n intent: AuroraThemedButtonIntent.TERTIARY,\n selectedBgOverlayColor: Colors.GRAY_300,\n})`\n min-width: initial;\n border-color: ${Colors.GRAY_300};\n`;\n","import { Immutable } from 'immer';\nimport { FC } from 'react';\n\nimport { DcOptimizer, SolarInverter, SolarPanel } from '@aurorasolar/graphql-client-schema';\n\nexport enum TargetMode {\n Energy = 'Energy',\n MaxFit = 'Max Fit',\n}\nexport enum FillerRowSetting {\n Auto,\n None,\n}\n\nexport type Patch = (patch: Partial) => void;\n\nexport enum PanelOrientation {\n Landscape = 'landscape',\n Portrait = 'portrait',\n Auto = 'landscape,portrait',\n}\n\nexport interface AutoDesignerReducerState {\n components: {\n dcOptimizers: DcOptimizer[];\n microinverters: SolarInverter[];\n stringInverters: SolarInverter[];\n };\n energy: {\n annual?: number;\n offset: number;\n target?: number;\n };\n minimumIrradiance: {\n sap?: number;\n tsrf?: number;\n };\n targetMode: {\n availableModes: TargetMode[];\n selectedMode: TargetMode;\n };\n panels: {\n fillerRow: FillerRowSetting;\n orientation: PanelOrientation;\n solarPanels: SolarPanel[];\n spacingX: number;\n spacingY: number;\n };\n}\nexport type AutoDesignerState = Immutable;\n\nexport type AutoDesignerStateComponent = FC<\n {\n [Key in K]: AutoDesignerState[Key];\n } & {\n [Key in K as `on${Capitalize}Change`]: Patch;\n } & { selectedMode: AutoDesignerState['targetMode']['selectedMode'] }\n>;\n","import { CadInspectorNumericInput } from '@aurorasolar/common-core/src/input';\nimport { Text } from '@aurorasolar/common-core/src/typography';\n\nimport { DrawerSection, DrawerTitle } from '../drawer';\nimport { AutoDesignerInputArea } from './shared';\nimport { AutoDesignerStateComponent, TargetMode } from './types';\n\nexport const testids = {\n MIN_SAP: 'autodesigner-min-sap',\n TSRF: 'autodesigner-tsrf',\n};\nexport const AutoDesignerMinimumIrradiance: AutoDesignerStateComponent<'minimumIrradiance'> = ({\n minimumIrradiance,\n onMinimumIrradianceChange,\n selectedMode,\n}) => {\n if (selectedMode === TargetMode.Energy) {\n return null;\n }\n return (\n \n Minimum Irradiance\n Solar Access Percentage}\n numericInputOffset\n >\n onMinimumIrradianceChange({ sap })}\n rightTag=\"%\"\n value={minimumIrradiance.sap}\n />\n \n Total Solar Resource Fraction}\n numericInputOffset\n >\n onMinimumIrradianceChange({ tsrf })}\n rightTag=\"%\"\n value={minimumIrradiance.tsrf}\n />\n \n \n );\n};\n","import { Box } from '@rebass/grid';\n\nimport { DrawerTab, DrawerTabGroup, DrawerTitle } from '../drawer';\nimport { AutoDesignerStateComponent, TargetMode } from './types';\n\nexport const AutoDesignerModeButtonTestIds: { [Key in TargetMode]: string } = {\n [TargetMode.Energy]: 'autodesigner-energy-button',\n [TargetMode.MaxFit]: 'autodesigner-max-fit-button',\n};\n\nconst allModes = [TargetMode.Energy, TargetMode.MaxFit];\nconst hiddenModes = [TargetMode.MaxFit];\n\nexport const AutoDesignerTargetMode: AutoDesignerStateComponent<'targetMode'> = ({\n targetMode,\n onTargetModeChange,\n}) => {\n const { selectedMode, availableModes } = targetMode;\n\n if (availableModes.length === 1 && availableModes[0] === TargetMode.MaxFit) {\n return null;\n }\n\n return (\n \n Target Mode\n \n {allModes.map((mode) => {\n const isDisabled = !availableModes.includes(mode);\n if (isDisabled && hiddenModes.includes(mode)) {\n return null;\n }\n return (\n onTargetModeChange({ selectedMode: mode })}\n >\n {mode}\n \n );\n })}\n \n \n );\n};\n","import styled from 'styled-components';\n\nimport { Divider } from '@blueprintjs/core';\n\nimport { Colors } from '../colors';\n\nexport const FullDivider = styled(Divider)<{ linecolor?: string }>`\n margin: 0;\n border-color: ${({ linecolor }) => linecolor};\n color: ${Colors.GRAY_300};\n`;\n","import { AppRouterNavigation, useAppModule, util } from '@aurorasolar/common-module-loader';\n\nconst { createGroupMatcher, projectDesignIdMatcher, projectDesignIdSubRouteMatcher } = util;\n\ntype Ids = (typeof util.Ids)[keyof typeof util.Ids];\n\ntype MatchedIds = {\n [_ in Ids]?: string;\n};\n\nexport const useUrlGroupMatcher = (matcher: RegExp) => {\n const navigation = useAppModule(AppRouterNavigation);\n if (navigation && Object.keys(navigation).length) {\n return createGroupMatcher(navigation, matcher);\n }\n return {};\n};\n\nexport const NoMatchedIdFoundWarning =\n 'useProjectOrDesignId: No matched project or design id found. Please check the matcher.';\n\nexport const useProjectOrDesignId: () => MatchedIds = () => {\n const { designId, projectId } = useUrlGroupMatcher(projectDesignIdMatcher) as MatchedIds;\n if (!designId && !projectId) {\n console.warn(NoMatchedIdFoundWarning);\n }\n return { designId, projectId };\n};\n\nexport const NoMatchedIdOrSubRouteFoundWarning =\n 'useProjectIdDesignIdOrSubRoute: No matched project id, design id, or sub route found. Please check the matcher.';\n\nexport const useProjectIdDesignIdOrSubRoute: () => MatchedIds = () => {\n const { designId, projectId, subRoute } = useUrlGroupMatcher(\n projectDesignIdSubRouteMatcher,\n ) as MatchedIds;\n if (!designId && !projectId && !subRoute) {\n console.warn(NoMatchedIdOrSubRouteFoundWarning);\n }\n return { designId, projectId, subRoute };\n};\n","import { FC, useMemo, useState } from 'react';\nimport styled from 'styled-components';\n\nimport { Colors } from '@aurorasolar/common-core/src/colors';\nimport { AuroraIcon, AuroraIconType } from '@aurorasolar/common-core/src/icon';\nimport { smallButtonBorderRadius, SPACES } from '@aurorasolar/common-core/src/layout';\nimport { Text } from '@aurorasolar/common-core/src/typography';\n\nconst SelectedComponent = styled.div`\n font-size: 14px;\n height: ${SPACES[5]}px;\n padding: 0 ${SPACES[0]}px 0 ${SPACES[1]}px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n border-radius: ${smallButtonBorderRadius}px;\n\n &:hover {\n background: ${Colors.GRAY_200};\n }\n`;\n\ninterface AutoDesignerSelectedComponentProps {\n name: string;\n onClick: () => void;\n}\n\nexport const AutoDesignerSelectedComponent: FC = ({\n name,\n onClick,\n}) => {\n const [isHovered, setIsHovered] = useState(false);\n const icon = useMemo(\n () =>\n isHovered\n ? { fillColor: Colors.GRAY_700, name: AuroraIconType.CLOSE }\n : { fillColor: Colors.PRIMARY_GREEN, name: AuroraIconType.CHECKMARK },\n [isHovered],\n );\n return (\n setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n {name}\n \n \n );\n};\n","import { Immutable } from 'immer';\nimport styled from 'styled-components';\n\nimport { Colors } from '@aurorasolar/common-core/src/colors';\nimport { FullDivider } from '@aurorasolar/common-core/src/divider';\nimport { useProjectIdDesignIdOrSubRoute } from '@aurorasolar/common-core/src/hooks';\nimport { defaultButtonBorderRadius, SPACES } from '@aurorasolar/common-core/src/layout';\nimport { Text } from '@aurorasolar/common-core/src/typography';\nimport { DcOptimizer, SolarInverter, SolarPanel } from '@aurorasolar/graphql-client-schema';\nimport { Flex } from '@rebass/grid';\n\nimport { ComponentSelect, ComponentSelectType } from '../component-select';\nimport { AutoDesignerSelectedComponent } from './autodesigner-selected-component';\nimport { AutoDesignerInputArea } from './shared';\n\nconst SelectedComponents = styled.div`\n background: ${Colors.WHITE};\n border-radius: ${defaultButtonBorderRadius}px;\n padding: ${SPACES[0]}px;\n border: 1px solid ${Colors.GRAY_300};\n margin-top: ${SPACES[0]}px;\n`;\n\nconst SelectionDivider = styled(FullDivider)`\n margin-left: -${SPACES[0]}px;\n margin-right: -${SPACES[0]}px;\n margin-top: ${SPACES[0]}px;\n margin-bottom: ${SPACES[0]}px;\n`;\n\nconst ListItem = styled.li`\n list-style: none;\n\n &:first-child {\n .divider {\n display: none;\n }\n }\n`;\n\nexport enum AutoDesignerComponentType {\n SolarPanels = 'Solar Panels',\n StringInverters = 'String Inverters',\n Microinverters = 'Microinverters',\n DcOptimizers = 'DC Optimizer',\n}\n\ntype ComponentLookup =\n T extends AutoDesignerComponentType.SolarPanels\n ? SolarPanel\n : T extends AutoDesignerComponentType.StringInverters\n ? SolarInverter\n : T extends AutoDesignerComponentType.Microinverters\n ? SolarInverter\n : T extends AutoDesignerComponentType.DcOptimizers\n ? DcOptimizer\n : never;\n\ninterface ComponentInformation {\n label: string;\n type: ComponentSelectType;\n filters?: { isMicroinverter: boolean; isSolarCompatible: true };\n}\nexport const componentMap: {\n [Key in AutoDesignerComponentType]: ComponentInformation;\n} = {\n [AutoDesignerComponentType.SolarPanels]: {\n label: 'solar panels',\n type: ComponentSelectType.SolarPanel,\n },\n [AutoDesignerComponentType.StringInverters]: {\n label: 'string inverters',\n type: ComponentSelectType.SolarInverter,\n },\n [AutoDesignerComponentType.Microinverters]: {\n label: 'microinverters',\n type: ComponentSelectType.Microinverter,\n },\n [AutoDesignerComponentType.DcOptimizers]: {\n label: 'DC optimizers',\n type: ComponentSelectType.DcOptimizer,\n },\n};\n\nexport interface AutoDesignerComponentSelectionProps<\n ComponentType extends AutoDesignerComponentType,\n Item extends Immutable> = Immutable<\n ComponentLookup\n >,\n> {\n type: ComponentType;\n items: readonly Item[];\n itemsChildren?: JSX.Element[];\n updateItems?: (newItems: Item[]) => void;\n addItem?: (item: Item) => void;\n removeItem?: (item: Item) => void;\n limit: number;\n alignSelectionBox?: boolean;\n}\n\nexport const AutoDesignerComponentSelection = <\n ComponentType extends AutoDesignerComponentType,\n Item extends Immutable> = Immutable<\n ComponentLookup\n >,\n>({\n type: lookupType,\n items,\n itemsChildren,\n updateItems,\n addItem,\n removeItem,\n limit,\n alignSelectionBox = true,\n}: AutoDesignerComponentSelectionProps) => {\n const ids = items.map(({ id }) => id);\n const { label, type } = componentMap[lookupType];\n const fieldLabel = `${label.charAt(0).toUpperCase()}${label.slice(1)}`;\n\n const removeItemInternal = (idToRemove: string) => () => {\n if (removeItem) {\n const item = items.find(({ id }) => id === idToRemove);\n if (item) {\n removeItem(item);\n }\n return;\n }\n updateItems?.(items.filter(({ id }) => id !== idToRemove));\n };\n\n const addItemInternal = (item: Item) => {\n if (addItem) {\n addItem(item);\n return;\n }\n updateItems?.([...items, item]);\n };\n\n const selections = items.length > 0 && (\n \n {items.map(({ id, name }, i) => (\n \n {itemsChildren && }\n \n {itemsChildren && itemsChildren[i]}\n \n ))}\n \n );\n\n // send the project ID to get project-scoped panels if available\n const { projectId }: { projectId?: string | undefined } = useProjectIdDesignIdOrSubRoute();\n\n return (\n \n \n
\n {fieldLabel}\n
\n
\n \n Up to {limit} {limit === 1 ? 'selection' : 'selections'}\n \n
\n \n }\n >\n = limit}\n emptySelectionLabel={`Select ${label}`}\n hiddenIds={ids}\n onSelection={ComponentSelect.getFirstSelection((_, item) => {\n addItemInternal(item as Item);\n })}\n projectId={projectId}\n selectedItems={new Set([])}\n type={type}\n />\n {alignSelectionBox && selections}\n \n \n {!alignSelectionBox && selections}\n \n
\n );\n};\n","import { useCallback } from 'react';\n\nimport { DrawerSection, DrawerTitle } from '../drawer';\nimport {\n AutoDesignerComponentSelection,\n AutoDesignerComponentType,\n} from './autodesigner-component-selection';\nimport { AutoDesignerState, AutoDesignerStateComponent, TargetMode } from './types';\n\nexport const AutoDesignerComponents: AutoDesignerStateComponent<'components'> = ({\n selectedMode,\n components,\n onComponentsChange,\n}) => {\n const updateItems = useCallback(\n (key: K) =>\n (newItems: AutoDesignerState['components'][K]) => {\n onComponentsChange({\n [key]: newItems,\n });\n },\n [onComponentsChange],\n );\n\n if (selectedMode === TargetMode.MaxFit) {\n return null;\n }\n\n return (\n \n Components\n \n \n \n \n );\n};\n","import { CSSProperties, FC } from 'react';\nimport styled from 'styled-components';\n\nimport { Colors } from '@aurorasolar/common-core/src/colors';\nimport { SPACES } from '@aurorasolar/common-core/src/layout';\nimport { Text } from '@aurorasolar/common-core/src/typography';\n\nexport const SHRINKABLE_HEADER_TESTID = 'shrinkable-header';\n\nconst StyledShrinkableHeader = styled.div`\n --shrink: 0;\n\n flex: 0 0 auto;\n background: white;\n display: flex;\n align-items: center;\n border-bottom: solid 1px #e0e0e0;\n min-height: 46px;\n height: calc(64px - calc(var(--shrink) / 4));\n box-shadow: 0 4px 28px rgba(0, 0, 0, 0.08);\n padding: 0 ${SPACES[4]}px;\n`;\n\nexport const ShrinkableHeader: FC<{ contentScrollTop: number }> = ({\n contentScrollTop,\n children,\n}) => (\n \n \n {children}\n \n \n);\n","import { FC } from 'react';\nimport styled from 'styled-components';\n\nimport { AuroraThemedButton, AuroraThemedButtonIntent } from '@aurorasolar/common-core/src/button';\nimport { SPACES } from '@aurorasolar/common-core/src/layout';\nimport { Tooltip } from '@blueprintjs/core';\nimport { Box, Flex } from '@rebass/grid';\n\nimport { ShrinkableHeader } from './shrinkable-header';\n\nconst PanelBody = styled(Box).attrs({ flex: '1 1 auto' })`\n padding: ${SPACES[0]}px ${SPACES[5]}px ${SPACES[4]}px ${SPACES[5]}px;\n overflow-y: auto;\n`;\n\nconst BottomArea = styled(Flex).attrs({ flexDirection: 'row-reverse' })`\n height: 80px;\n background: white;\n border-top: solid 1px #e0e0e0;\n padding: ${SPACES[3]}px;\n`;\ninterface AutoDesignerCoreProps {\n onCancel: () => void;\n onRun: () => void;\n scrollTop: number;\n setScrollTop: (value: number) => void;\n validationError: string | null;\n}\n\nexport const AutoDesignerCore: FC = ({\n children,\n onCancel,\n onRun,\n scrollTop,\n setScrollTop,\n validationError,\n}) => {\n return (\n \n AutoDesigner\n {\n setScrollTop(currentTarget.scrollTop);\n }}\n >\n {children}\n \n \n \n \n \n Run AutoDesigner\n \n \n \n \n \n Cancel\n \n \n \n \n );\n};\n","import styled from 'styled-components';\n\nimport { Colors } from '@aurorasolar/common-core/src/colors';\nimport { CadInspectorNumericInput } from '@aurorasolar/common-core/src/input';\nimport { Text } from '@aurorasolar/common-core/src/typography';\nimport { Box } from '@rebass/grid';\n\nimport { DrawerSection } from '../drawer';\nimport { AutoDesignerInputArea } from './shared';\nimport { AutoDesignerStateComponent, TargetMode } from './types';\n\nexport const DEFAULT_TARGET = 10000;\n\nconst EnergyTargetInput = styled(CadInspectorNumericInput)`\n && {\n .bp3-input-group {\n width: 182px;\n\n .bp3-input {\n width: 100%;\n padding-right: 0;\n }\n .bp3-tag {\n width: unset;\n padding: 0 16px;\n }\n }\n }\n`;\nexport const AUTODESIGNER_ENERGY_TARGET_TESTID = 'autodesigner-energy-target';\nexport const AUTODESIGNER_ENERGY_OFFSET_TESTID = 'autodesigner-energy-offset';\n\nexport const AutoDesignerEnergyMode: AutoDesignerStateComponent<'energy'> = ({\n energy,\n onEnergyChange,\n selectedMode,\n}) => {\n const hasAnnualEnergy = !!energy.annual;\n if (selectedMode !== TargetMode.Energy) {\n return null;\n }\n return (\n \n \n \n onEnergyChange({ target })}\n rightTag=\"kWh/year\"\n step={100}\n value={energy.target ?? DEFAULT_TARGET}\n />\n \n \n {hasAnnualEnergy ? (\n onEnergyChange({ offset })}\n rightTag=\"%\"\n value={energy.offset}\n />\n ) : (\n \n No Consumption profile defined\n \n )}\n \n \n \n );\n};\n","import { FunctionComponent } from 'react';\nimport styled from 'styled-components';\n\nimport { ITooltipProps, Position, Tooltip } from '@blueprintjs/core';\nimport { Box, Flex } from '@rebass/grid';\n\nimport { Colors } from '../colors';\nimport { AuroraIcon, AuroraIconType } from '../icon';\nimport { defaultButtonBorderRadius } from '../layout';\nimport { Text } from '../typography';\n\nexport enum AlertTooltipType {\n DANGER = 'DANGER',\n WARNING = 'WARNING',\n INFO = 'INFO',\n}\n\ninterface AlertTooltipProps {\n type?: AlertTooltipType;\n message: string;\n tooltipProps?: Omit;\n}\n\nconst Icons = {\n [AlertTooltipType.DANGER]: ,\n [AlertTooltipType.WARNING]: ,\n [AlertTooltipType.INFO]: ,\n};\n\nconst StyledTooltip = styled(Tooltip)`\n && {\n .bp3-popover {\n opacity: 0.95;\n border-radius: ${defaultButtonBorderRadius}px;\n box-shadow: 0 0 6px rgba(0, 0, 0, 0.25);\n border: solid 0.5px ${Colors.GRAY_700};\n }\n .bp3-popover-content {\n background: ${Colors.GRAY_800};\n border-radius: 6px;\n padding: ${({ theme: { space } }) =>\n `${space[4]}px ${space[7]}px ${space[4]}px ${space[4]}px`};\n }\n .bp3-popover-arrow-border {\n fill: ${Colors.GRAY_700};\n }\n .bp3-popover-arrow-fill {\n fill: ${Colors.GRAY_800};\n }\n }\n`;\n\nconst AlertTooltipContent: FunctionComponent = ({ type, message }) => {\n return (\n \n \n {type && Icons[type]}\n \n\n \n \n {message}\n \n \n \n );\n};\n\nexport const AlertTooltip: FunctionComponent = ({\n children,\n tooltipProps = {},\n ...props\n}) => {\n return (\n }\n position={Position.BOTTOM}\n usePortal={false}\n {...tooltipProps}\n >\n {children}\n \n );\n};\n","import { useReducer } from 'react';\n\nimport { AlertTooltip } from '@aurorasolar/common-core/src/alert-tooltip';\nimport { AuroraThemedButton, AuroraThemedButtonIntent } from '@aurorasolar/common-core/src/button';\nimport { Colors } from '@aurorasolar/common-core/src/colors';\nimport { AuroraIcon, AuroraIconType } from '@aurorasolar/common-core/src/icon';\nimport { AuroraNumericInput, NumericInputRightTag } from '@aurorasolar/common-core/src/input';\nimport { Text } from '@aurorasolar/common-core/src/typography';\nimport { ConversionType, withNumericConversion } from '@aurorasolar/common-numeric-conversion';\nimport { ButtonGroup, Collapse } from '@blueprintjs/core';\nimport { Box, Flex } from '@rebass/grid';\n\nimport { DrawerSection, DrawerTitle } from '../drawer';\nimport {\n AutoDesignerComponentSelection,\n AutoDesignerComponentType,\n} from './autodesigner-component-selection';\nimport { AutoDesignerInputArea, AutoDesignerRadioButton } from './shared';\nimport { AutoDesignerStateComponent, FillerRowSetting, TargetMode } from './types';\n\nconst ConversionInput = withNumericConversion(AuroraNumericInput);\n\nconst distanceLimits = {\n max: Infinity,\n min: 0,\n stepSize: 0.1,\n};\nexport const testids = {\n SPACING_X: 'autodesigner-module-spacing-x',\n SPACING_Y: 'autodesigner-module-spacing-y',\n};\nexport enum PanelOrientation {\n Landscape = 'landscape',\n Portrait = 'portrait',\n Auto = 'landscape,portrait',\n}\nconst fillerRowSettings = [\n { label: 'None', value: FillerRowSetting.None },\n { label: 'Auto', value: FillerRowSetting.Auto },\n];\n\nexport const orientationOptions = [\n {\n icon: AuroraIconType.PANELS_PORTRAIT,\n label: '',\n type: PanelOrientation.Portrait,\n },\n {\n icon: AuroraIconType.PANELS_LANDSCAPE,\n label: '',\n type: PanelOrientation.Landscape,\n },\n {\n label: 'Auto',\n type: PanelOrientation.Auto,\n },\n];\nexport const AutoDesignerPanels: AutoDesignerStateComponent<'panels'> = ({\n panels,\n onPanelsChange,\n selectedMode,\n}) => {\n const [isAdvancedOpen, toggleIsAdvancedOpen] = useReducer((v) => !v, false);\n return (\n \n Panels\n {\n onPanelsChange({ solarPanels });\n }}\n />\n Orientation}>\n \n \n {orientationOptions.map((item) => {\n const content = item.icon ? : item.label;\n return (\n {\n onPanelsChange({ orientation: item.type });\n }}\n >\n {content}\n \n );\n })}\n \n \n \n \n Advanced Settings\n \n \n \n \n \n {(selectedMode === TargetMode.MaxFit || selectedMode === TargetMode.Energy) && (\n \n Filler row\n \n \n \n \n \n \n }\n >\n \n {fillerRowSettings.map((setting) => (\n {\n onPanelsChange({ fillerRow: setting.value });\n }}\n >\n {setting.label}\n \n ))}\n \n \n )}\n Spacing X}\n numericInputOffset\n >\n onPanelsChange({ spacingX })}\n tagComponent={NumericInputRightTag}\n value={panels.spacingX}\n width=\"96px\"\n {...distanceLimits}\n />\n \n Spacing Y}\n numericInputOffset\n >\n onPanelsChange({ spacingY })}\n tagComponent={NumericInputRightTag}\n value={panels.spacingY}\n width=\"96px\"\n {...distanceLimits}\n />\n \n \n \n \n \n );\n};\n","import { AutoDesignerState, FillerRowSetting, PanelOrientation, TargetMode } from './types';\n\nexport const getInitialState = (): AutoDesignerState => ({\n components: {\n dcOptimizers: [],\n microinverters: [],\n stringInverters: [],\n },\n energy: {\n annual: undefined,\n offset: 80,\n target: undefined,\n },\n minimumIrradiance: {\n sap: undefined,\n tsrf: undefined,\n },\n panels: {\n fillerRow: FillerRowSetting.None,\n orientation: PanelOrientation.Auto,\n solarPanels: [],\n spacingX: 0,\n spacingY: 0,\n },\n targetMode: {\n availableModes: [TargetMode.Energy, TargetMode.MaxFit],\n selectedMode: TargetMode.MaxFit,\n },\n});\n\nexport enum ValidationError {\n NoModules = 'Please specify a module to continue',\n NoInverters = 'Please specify an inverter to continue',\n}\n\nexport const getValidationError = (\n state: AutoDesignerState,\n): ValidationError.NoModules | ValidationError.NoInverters | null => {\n if (state.panels.solarPanels.length < 1) {\n return ValidationError.NoModules;\n }\n const needsInverter =\n state.targetMode.selectedMode !== TargetMode.MaxFit &&\n !state.panels.solarPanels.some(({ mlpe }) => mlpe?.isSolarInverter ?? true);\n if (\n state.components.stringInverters.length < 1 &&\n state.components.microinverters.length < 1 &&\n needsInverter\n ) {\n return ValidationError.NoInverters;\n }\n return null;\n};\n","// @ts-ignore: Ignore unused { * as Types } import\nimport * as Types from '@aurorasolar/graphql-client-schema';\n\nimport { gql } from '@apollo/client';\nimport * as Apollo from '@apollo/client';\nconst defaultOptions = {} as const;\nexport type AutoDesignerQueryVariables = Types.Exact<{\n designId: Types.Scalars['ID'];\n}>;\n\n\nexport type AutoDesignerQuery = { __typename: 'Query', design: { __typename: 'Design', id: string, interModuleSpacingX?: number | null | undefined, interModuleSpacingY?: number | null | undefined, loadProfile: { __typename: 'LoadProfile', id: string, annualEnergy?: number | null | undefined } } };\n\n\nexport const AutoDesignerDocument = gql`\n query AutoDesigner($designId: ID!) @trace_info(traceInfo: {pod: cad}) {\n design: designById(id: $designId) {\n id\n interModuleSpacingX\n interModuleSpacingY\n loadProfile {\n id\n annualEnergy\n }\n }\n}\n `;\n\n/**\n * __useAutoDesignerQuery__\n *\n * To run a query within a React component, call `useAutoDesignerQuery` and pass it any options that fit your needs.\n * When your component renders, `useAutoDesignerQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useAutoDesignerQuery({\n * variables: {\n * designId: // value for 'designId'\n * },\n * });\n */\nexport function useAutoDesignerQuery(baseOptions: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(AutoDesignerDocument, options);\n }\nexport function useAutoDesignerLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(AutoDesignerDocument, options);\n }\nexport type AutoDesignerQueryHookResult = ReturnType;\nexport type AutoDesignerLazyQueryHookResult = ReturnType;\nexport type AutoDesignerQueryResult = Apollo.QueryResult;","import produce from 'immer';\nimport { FC, useCallback, useMemo, useReducer, useState } from 'react';\n\nimport { useStartAsyncJobMutation } from '@aurorasolar/common-data-access-layer';\nimport { CADTriggerActionTypes } from '@aurorasolar/common-data-store';\nimport { AnalyticsEventTypes } from '@aurorasolar/common-module-loader';\nimport {\n AsyncJobParameters,\n AsyncJobType,\n AutoDesigner as AutoDesignerResponse,\n} from '@aurorasolar/graphql-client-schema';\n\nimport { useSaveCad, useTriggerCadAction } from '../hooks';\nimport { useAnalytics } from '../hooks/use-analytics';\nimport { useCadState } from '../use-cad';\nimport { AutoDesignerComponents } from './autodesigner-components';\nimport { AutoDesignerCore } from './autodesigner-core';\nimport { AutoDesignerEnergyMode, DEFAULT_TARGET } from './autodesigner-energy-mode';\nimport { AutoDesignerMinimumIrradiance } from './autodesigner-minimum-irradiance';\nimport { AutoDesignerPanels } from './autodesigner-panels';\nimport { AutoDesignerTargetMode } from './autodesigner-target-mode';\nimport { getInitialState, getValidationError } from './autodesigner-utils';\nimport { useAutoDesignerQuery } from './autodesigner.generated';\nimport { AutoDesignerReducerState, AutoDesignerState, FillerRowSetting, TargetMode } from './types';\n\nconst autoDesignerReducer = produce(\n (\n draft: AutoDesignerReducerState,\n { key, payload }: { key: T; payload: AutoDesignerState[T] },\n ) => {\n draft[key] = {\n ...draft[key],\n ...payload,\n };\n if (key === 'energy') {\n const energy = payload as AutoDesignerState['energy'];\n const targetNeedsToBeSet = energy.target === undefined && draft.energy.target === undefined;\n\n if (!!draft.energy.annual && (energy.offset !== undefined || targetNeedsToBeSet)) {\n // calculate the target when the offset is changed or if the target is not set\n draft.energy.target = Math.round((draft.energy.offset / 100) * draft.energy.annual);\n }\n if (!!draft.energy.annual && energy.target !== undefined) {\n // calculate offset when the target is changed.\n draft.energy.offset = Math.round((draft.energy.target! / draft.energy.annual) * 100);\n }\n }\n },\n);\n\ninterface AutoDesignerProps {\n data: undefined;\n designId: string;\n onClose: () => void;\n}\n\nconst getAsyncJobParameters = ({\n components,\n minimumIrradiance,\n panels,\n targetMode,\n energy,\n}: AutoDesignerState): NonNullable => {\n const getId = ({ id }: T) => id;\n const isMaxFit = targetMode.selectedMode === TargetMode.MaxFit;\n const parameters: AsyncJobParameters['inputs'] = {\n components: {\n dc_optimizers: [] as string[],\n solar_inverters: [] as string[],\n solar_panels: panels.solarPanels.map(getId),\n },\n constraints: {\n energy: isMaxFit ? undefined : energy.target ?? DEFAULT_TARGET,\n max_fit: isMaxFit,\n savings: null,\n },\n objective: 'cost',\n options: {\n allow_filler_row: panels.fillerRow === FillerRowSetting.Auto,\n column_spacing_m: panels.spacingX,\n min_sap: minimumIrradiance.sap != null ? minimumIrradiance.sap / 100 : undefined,\n min_tsrf: minimumIrradiance.tsrf != null ? minimumIrradiance.tsrf / 100 : undefined,\n orientations: panels.orientation.split(','),\n row_spacing_m: panels.spacingY,\n },\n post_solar: {},\n };\n\n if (!isMaxFit) {\n parameters.components.solar_inverters = [\n ...components.stringInverters,\n ...components.microinverters,\n ].map(getId);\n parameters.components.dc_optimizers = components.dcOptimizers.map(getId);\n }\n return parameters;\n};\n\nexport const AutoDesigner: FC = ({ designId, onClose }) => {\n const [scrollTop, setScrollTop] = useState(0);\n\n const [startAsyncJob] = useStartAsyncJobMutation();\n const loadDesign = useTriggerCadAction(CADTriggerActionTypes.LoadSystemDesign);\n const { save } = useSaveCad();\n const track = useAnalytics();\n\n const [state, updateState] = useReducer(autoDesignerReducer, getInitialState());\n\n const update = useCallback(\n (key: K) =>\n (payload: Partial) =>\n updateState({ key, payload }),\n [updateState],\n );\n\n useAutoDesignerQuery({\n onCompleted: (data) => {\n const annual = data?.design?.loadProfile?.annualEnergy ?? undefined;\n if (annual != null) {\n update('energy')({ annual });\n }\n const spacingX = data?.design?.interModuleSpacingX;\n const spacingY = data?.design?.interModuleSpacingY;\n if (spacingX != null && spacingY != null) {\n update('panels')({ spacingX, spacingY });\n }\n },\n variables: { designId },\n });\n\n const validationError = useMemo(() => getValidationError(state), [state]);\n const { autoDesignerFinish, autoDesignerStart } = useCadState((cadState) => {\n return {\n autoDesignerFinish: cadState?.actions?.autoDesignerActions?.autoDesignerFinish,\n autoDesignerStart: cadState?.actions.autoDesignerActions.autoDesignerStart,\n };\n });\n\n const onRun = useCallback(async () => {\n const parameters = getAsyncJobParameters(state);\n onClose();\n track(AnalyticsEventTypes.DesignRanAutoDesigner, {\n mode: state.targetMode.selectedMode as 'Energy' | 'Max Fit',\n offset: state.energy.offset,\n panel_orientation: state.panels.orientation,\n });\n await save?.();\n autoDesignerStart?.();\n const design = await startAsyncJob({\n variables: {\n settings: {\n design_id: designId,\n inputs: parameters,\n },\n type: AsyncJobType.Autodes,\n },\n })\n .then((response) => {\n if (response.data?.startAsyncJob == null) {\n return undefined;\n }\n\n return JSON.parse((response.data?.startAsyncJob as AutoDesignerResponse).design);\n })\n .catch(() => {\n console.warn('Failed to parse AutoDesigner design');\n })\n .finally(() => {\n autoDesignerFinish?.();\n });\n if (design) {\n loadDesign({ design });\n }\n }, [\n save,\n designId,\n state,\n startAsyncJob,\n onClose,\n loadDesign,\n track,\n autoDesignerStart,\n autoDesignerFinish,\n ]);\n\n const { selectedMode } = state.targetMode;\n return (\n \n \n \n \n \n \n \n );\n};\n","import { FC } from 'react';\n\nimport { AuroraNumericInput } from '@aurorasolar/common-core/src/input';\nimport { SPACES } from '@aurorasolar/common-core/src/layout';\nimport { withNumericConversion } from '@aurorasolar/common-numeric-conversion';\nimport { Flex } from '@rebass/grid';\n\nexport enum AutoStringInverter {\n StringInverter,\n Microinverter,\n}\n\nexport type AutoStringInverterOption = {\n minStringLength: number;\n maxStringLength: number;\n dcAcRatio: number;\n};\n\nexport type AutoStringInverterOptions = {\n inverters: Record;\n microinverters: Record;\n};\n\ninterface AutoStringInverterParamsProps {\n dcAcRatio: number;\n updateDcAcRatio: (value: number) => void;\n maxStringLength: number;\n updateMaxStringLength: (value: number) => void;\n minStringLength: number;\n updateMinStringLength: (value: number) => void;\n}\n\nconst NumericInput = withNumericConversion(AuroraNumericInput);\n\nexport const AutoStringInverterParams: FC = ({\n dcAcRatio,\n updateDcAcRatio,\n maxStringLength,\n updateMaxStringLength,\n minStringLength,\n updateMinStringLength,\n}) => {\n return (\n \n \n \n \n \n \n \n );\n};\n","import { Immutable } from 'immer';\nimport { FC } from 'react';\nimport styled from 'styled-components';\n\nimport { AuroraThemedButton, AuroraThemedButtonIntent } from '@aurorasolar/common-core/src/button';\nimport { AuroraCheckbox } from '@aurorasolar/common-core/src/checkbox/checkbox';\nimport { Colors } from '@aurorasolar/common-core/src/colors';\nimport { SPACES } from '@aurorasolar/common-core/src/layout';\nimport { Text } from '@aurorasolar/common-core/src/typography';\nimport { DcOptimizer, SolarInverter } from '@aurorasolar/graphql-client-schema';\nimport { Tooltip } from '@blueprintjs/core';\nimport { Box, Flex } from '@rebass/grid';\n\nimport {\n AutoDesignerComponentSelection,\n AutoDesignerComponentType,\n} from '../autodesigner/autodesigner-component-selection';\nimport { ShrinkableHeader } from '../autodesigner/shrinkable-header';\nimport { DrawerSection, DrawerTab, DrawerTabGroup, DrawerTitle } from '../drawer';\nimport { AutoStringInverterQuery, SolarPanelAutoStringQuery } from './components.generated';\nimport {\n AutoStringInverter,\n AutoStringInverterOption,\n AutoStringInverterOptions,\n AutoStringInverterParams,\n} from './inverter-params';\n\ninterface AutoStringerCoreProps {\n onCancel: () => void;\n onRun: () => void;\n validationError: string | null | undefined;\n inverters: SolarInverter[];\n microinverters: SolarInverter[];\n addMicroinverter: (inverter: Immutable) => void;\n removeMicroinverter: (inverter: Immutable) => void;\n inverterType: AutoStringInverter;\n setInverterType: (inverterType: AutoStringInverter) => void;\n addInverter: (inverter: Immutable) => void;\n removeInverter: (inverter: Immutable) => void;\n settings: AutoStringInverterOptions;\n updateSettings: (id: string, prop: keyof AutoStringInverterOption, value: number) => void;\n autoParams: boolean;\n updateAutoParams(on: boolean): void;\n solarPanel?: SolarPanelAutoStringQuery['component'];\n integratedMicroinverter?: AutoStringInverterQuery['component'];\n dcOptimizer: DcOptimizer | undefined;\n addDcOptimizer: (dcOptimizer: Immutable) => void;\n removeDcOptimizer: (dcOptimizer: Immutable) => void;\n currentSelectionSection: JSX.Element;\n}\n\nconst PanelBody = styled(Box).attrs({ flex: '1 1 auto' })`\n padding: 0 20px 24px 20px;\n overflow-y: auto;\n`;\n\nconst BottomArea = styled(Flex).attrs({ flexDirection: 'row-reverse' })`\n height: 80px;\n background: white;\n border-top: solid 1px #e0e0e0;\n padding: 20px;\n`;\n\nexport const AutoStringerCore = ({\n addDcOptimizer,\n addInverter,\n addMicroinverter,\n autoParams,\n currentSelectionSection,\n dcOptimizer,\n inverters,\n inverterType,\n setInverterType,\n microinverters,\n integratedMicroinverter,\n onCancel,\n onRun,\n removeDcOptimizer,\n removeInverter,\n removeMicroinverter,\n settings,\n solarPanel,\n updateAutoParams,\n updateSettings,\n validationError,\n}: AutoStringerCoreProps) => {\n const itemsChildren = autoParams\n ? undefined\n : inverters.map((inv) => {\n const setting = settings.inverters[inv.id];\n return (\n !!setting && (\n updateSettings(inv.id, 'dcAcRatio', value)}\n updateMaxStringLength={(value) => updateSettings(inv.id, 'maxStringLength', value)}\n updateMinStringLength={(value) => updateSettings(inv.id, 'minStringLength', value)}\n />\n )\n );\n });\n\n const hasIntegratedMlpe = !!solarPanel?.mlpe;\n const dcOptimizers = dcOptimizer ? [dcOptimizer] : [];\n\n return (\n \n AutoStringer\n \n {currentSelectionSection}\n\n {!integratedMicroinverter ? (\n <>\n Inverter type\n\n \n setInverterType(AutoStringInverter.StringInverter)}\n >\n String Inverter\n \n setInverterType(AutoStringInverter.Microinverter)}\n >\n Microinverter\n \n \n\n {inverterType === AutoStringInverter.StringInverter ? (\n \n \n\n {inverters.length > 0 && (\n \n updateAutoParams(event.currentTarget.checked)}\n />\n Automatic electrical parameters\n \n )}\n\n {!hasIntegratedMlpe ? (\n \n ) : (\n \n )}\n \n ) : (\n \n {!hasIntegratedMlpe ? (\n \n ) : (\n <>\n \n \n This module uses an integrated optimizer and cannot be connected to a\n microinverter.\n \n \n\n \n \n )}\n \n )}\n \n ) : (\n <>\n \n \n This module uses an integrated microinverter and does not require stringing within\n Aurora.\n \n \n\n \n \n )}\n \n\n \n \n \n \n Run AutoStringer\n \n \n \n \n \n Cancel\n \n \n \n \n );\n};\n\nconst AutoStringerMlpe: FC<{\n solarPanel?: SolarPanelAutoStringQuery['component'];\n integratedMicroinverter?: AutoStringInverterQuery['component'];\n}> = ({ solarPanel, integratedMicroinverter }) => {\n const mlpe =\n solarPanel?.mlpe?.cellStringOptimizer ||\n solarPanel?.mlpe?.solarInverter ||\n solarPanel?.mlpe?.dcOptimizer;\n\n const chosenMlpe = mlpe || integratedMicroinverter;\n\n if (!chosenMlpe) {\n return null;\n }\n\n const manufacturerName = chosenMlpe.manufacturer?.name;\n\n return (\n <>\n \n \n Module level power electronics\n \n \n\n \n \n {manufacturerName ? `${manufacturerName}, ` : ''}\n {chosenMlpe.name}\n \n \n \n );\n};\n","import produce, { Immutable } from 'immer';\n\nimport { getDcAcRatio, getMaxStringSize, getMinStringSize } from '@aurorasolar/cad-services';\nimport {\n CadFillZone,\n CadSolarPanelFree,\n DcOptimizer,\n SolarInverter,\n} from '@aurorasolar/graphql-client-schema';\n\nimport { GetDesignByIdQuery } from '../cad.generated';\nimport { AutoStringDcOptimizerQuery, SolarPanelAutoStringQuery } from './components.generated';\nimport {\n AutoStringInverter,\n AutoStringInverterOption,\n AutoStringInverterOptions,\n} from './inverter-params';\n\nexport enum AutoStringSelectionType {\n Nothing,\n SolarPanel,\n FillZone,\n}\n\nexport interface AutoStringState {\n dcOptimizer: DcOptimizer | undefined | null;\n design: GetDesignByIdQuery['designById'] | undefined;\n integratedDcOptimizer: DcOptimizer | undefined | null;\n inverterType: AutoStringInverter;\n inverters: SolarInverter[];\n microinverters: SolarInverter[];\n selectionType: AutoStringSelectionType;\n settings: AutoStringInverterOptions;\n solarPanel: SolarPanelAutoStringQuery['component'] | undefined;\n selectedSolarPanel: CadSolarPanelFree | undefined;\n selectedFillZone: CadFillZone | undefined;\n}\n\nexport enum AutoStringActionType {\n SetInverterType,\n AddInverter,\n RemoveInverter,\n AddMicroinverter,\n RemoveMicroinverter,\n AddDcOptimizer,\n RemoveDcOptimizer,\n SolarPanelQueryFinished,\n UpdateIntegratedDcOptimizer,\n DesignChanged,\n UpdateAutoParams,\n UpdateSetting,\n FillZoneSelectionChanged,\n SelectionTypeChanged,\n SolarPanelSelectionChanged,\n}\n\ntype AutoStringAction =\n | {\n type: AutoStringActionType.UpdateIntegratedDcOptimizer;\n payload: {\n integratedDcOptimizer: AutoStringDcOptimizerQuery['component'];\n };\n }\n | {\n type: AutoStringActionType.UpdateSetting;\n payload: {\n id: string;\n prop: keyof AutoStringInverterOption;\n value: number;\n };\n }\n | { type: AutoStringActionType.UpdateAutoParams }\n | {\n type: AutoStringActionType.DesignChanged;\n payload: {\n design: GetDesignByIdQuery['designById'] | undefined;\n };\n }\n | {\n type: AutoStringActionType.FillZoneSelectionChanged;\n payload: {\n selectedFillZone: CadFillZone | undefined;\n };\n }\n | {\n type: AutoStringActionType.SelectionTypeChanged;\n payload: {\n selectionId: string | undefined;\n selectionType: AutoStringSelectionType;\n };\n }\n | {\n type: AutoStringActionType.SetInverterType;\n payload: { inverterType: AutoStringInverter };\n }\n | {\n type: AutoStringActionType.AddInverter;\n payload: { inverter: Immutable };\n }\n | {\n type: AutoStringActionType.RemoveInverter;\n payload: { inverter: Immutable };\n }\n | {\n type: AutoStringActionType.AddMicroinverter;\n payload: { microinverter: Immutable };\n }\n | {\n type: AutoStringActionType.RemoveMicroinverter;\n payload: { microinverter: Immutable };\n }\n | {\n type: AutoStringActionType.AddDcOptimizer;\n payload: { dcOptimizer: Immutable };\n }\n | {\n type: AutoStringActionType.RemoveDcOptimizer;\n payload: { dcOptimizer: Immutable };\n }\n | {\n type: AutoStringActionType.SolarPanelQueryFinished;\n payload: { solarPanel: SolarPanelAutoStringQuery['component'] };\n }\n | {\n type: AutoStringActionType.SolarPanelSelectionChanged;\n payload: { selectedSolarPanel: CadSolarPanelFree | undefined };\n };\n\nconst getInverterParams = ({\n dcOptimizer,\n design,\n inverters,\n inverterType,\n integratedDcOptimizer,\n microinverters,\n solarPanel,\n}: AutoStringState): AutoStringInverterOption => {\n if (solarPanel == null) {\n return { dcAcRatio: NaN, maxStringLength: NaN, minStringLength: NaN };\n }\n\n const actualDcOpt =\n inverterType === AutoStringInverter.StringInverter\n ? integratedDcOptimizer || dcOptimizer\n : undefined;\n\n const inverter =\n inverterType === AutoStringInverter.StringInverter ? inverters[0] : microinverters[0];\n\n return {\n dcAcRatio: getDcAcRatio(inverter),\n maxStringLength:\n getMaxStringSize(solarPanel, inverter, design?.temperatureMin, [], actualDcOpt) || NaN,\n minStringLength:\n getMinStringSize(solarPanel, inverter, design?.temperatureMax, actualDcOpt) || NaN,\n };\n};\n\nconst getNewSettings = (params: AutoStringState): AutoStringInverterOptions => ({\n inverters:\n params.inverterType !== AutoStringInverter.StringInverter\n ? params.settings.inverters\n : params.inverters.reduce(\n (settings, inverter) => ({\n ...settings,\n [inverter.id]: getInverterParams({ ...params, inverters: [inverter] }),\n }),\n {} as Record,\n ),\n microinverters:\n params.inverterType !== AutoStringInverter.Microinverter\n ? params.settings.microinverters\n : params.microinverters.reduce(\n (settings, microinverter) => ({\n ...settings,\n [microinverter.id]: getInverterParams({ ...params, microinverters: [microinverter] }),\n }),\n {} as Record,\n ),\n});\n\nconst omit = (obj: Record, key: string) => {\n delete obj[key];\n return obj;\n};\n\nexport const getEmptyAutoStringState = (): AutoStringState => ({\n dcOptimizer: undefined,\n design: undefined,\n integratedDcOptimizer: undefined,\n inverters: [],\n inverterType: AutoStringInverter.StringInverter,\n microinverters: [],\n selectedFillZone: undefined,\n selectedSolarPanel: undefined,\n selectionType: AutoStringSelectionType.Nothing,\n settings: {\n inverters: {},\n microinverters: {},\n },\n solarPanel: undefined,\n});\n\nexport const settingsReducer = produce((draft: AutoStringState, action: AutoStringAction) => {\n if (action.type === AutoStringActionType.FillZoneSelectionChanged) {\n draft.selectedFillZone = action.payload.selectedFillZone;\n return draft;\n }\n\n if (action.type === AutoStringActionType.SelectionTypeChanged) {\n if (action.payload.selectionType === AutoStringSelectionType.Nothing) {\n draft.solarPanel = undefined;\n draft.selectedSolarPanel = undefined;\n draft.integratedDcOptimizer = undefined;\n draft.dcOptimizer = undefined;\n }\n draft.selectionType = action.payload.selectionType;\n return draft;\n }\n\n if (action.type === AutoStringActionType.SetInverterType) {\n draft.inverterType = action.payload.inverterType;\n return draft;\n }\n\n if (action.type === AutoStringActionType.AddInverter) {\n const newSetting = getInverterParams({\n ...draft,\n inverters: [action.payload.inverter as SolarInverter],\n });\n draft.inverters.push(action.payload.inverter as SolarInverter);\n draft.settings.inverters[action.payload.inverter.id] = newSetting;\n return draft;\n }\n\n if (action.type === AutoStringActionType.RemoveInverter) {\n draft.inverters = draft.inverters.filter(({ id }) => id !== action.payload.inverter!.id);\n omit(draft.settings.inverters, action.payload.inverter.id);\n return draft;\n }\n\n if (action.type === AutoStringActionType.AddMicroinverter) {\n const newSetting = getInverterParams({\n ...draft,\n microinverters: [action.payload.microinverter as SolarInverter],\n });\n draft.microinverters.push(action.payload.microinverter as SolarInverter);\n draft.settings.microinverters[action.payload.microinverter.id] = newSetting;\n return draft;\n }\n\n if (action.type === AutoStringActionType.RemoveMicroinverter) {\n draft.microinverters = draft.microinverters.filter(\n ({ id }) => id !== action.payload.microinverter!.id,\n );\n omit(draft.settings.microinverters, action.payload.microinverter.id);\n return draft;\n }\n\n if (action.type === AutoStringActionType.AddDcOptimizer) {\n draft.dcOptimizer = action.payload.dcOptimizer as DcOptimizer;\n draft.settings = getNewSettings(draft);\n return draft;\n }\n\n if (action.type === AutoStringActionType.RemoveDcOptimizer) {\n draft.dcOptimizer = undefined;\n draft.settings = getNewSettings(draft);\n return draft;\n }\n\n if (action.type === AutoStringActionType.SolarPanelQueryFinished) {\n draft.solarPanel = action.payload.solarPanel;\n draft.settings = getNewSettings(draft);\n return draft;\n }\n\n if (action.type === AutoStringActionType.UpdateIntegratedDcOptimizer) {\n draft.integratedDcOptimizer = action.payload.integratedDcOptimizer;\n draft.settings = getNewSettings(draft);\n return draft;\n }\n\n if (action.type === AutoStringActionType.DesignChanged) {\n draft.design = action.payload.design;\n draft.settings = getNewSettings(draft);\n return draft;\n }\n\n if (action.type === AutoStringActionType.UpdateAutoParams) {\n // Revert settings back to being derived from the rest of the state\n draft.settings = getNewSettings(draft);\n return draft;\n }\n\n if (action.type === AutoStringActionType.UpdateSetting) {\n // Manual input settings that deviate from the main state\n if (\n draft.inverterType === AutoStringInverter.StringInverter &&\n draft.settings.inverters[action.payload.id]\n ) {\n draft.settings.inverters[action.payload.id][action.payload.prop] = action.payload.value;\n } else if (draft.settings.microinverters[action.payload.id]) {\n draft.settings.microinverters[action.payload.id][action.payload.prop] = action.payload.value;\n }\n return draft;\n }\n\n if (action.type === AutoStringActionType.SolarPanelSelectionChanged) {\n draft.selectedSolarPanel = action.payload.selectedSolarPanel;\n return draft;\n }\n\n return draft;\n});\n","import { FC } from 'react';\n\nimport { Colors } from '@aurorasolar/common-core/src/colors';\nimport { useLocaleFormat } from '@aurorasolar/common-core/src/hooks';\nimport { Text } from '@aurorasolar/common-core/src/typography';\nimport { formatWattage } from '@aurorasolar/common-core/src/utils';\nimport { Box } from '@rebass/grid';\n\nimport { AutoStringSelectionType, AutoStringState } from './settings-reducer';\n\ntype AutoStringSelectionSectionProps = Pick<\n AutoStringState,\n 'selectionType' | 'selectedSolarPanel' | 'selectedFillZone'\n>;\n\nconst SelectionDetails: FC<{\n componentLabel: string;\n count?: number | null;\n wattage?: number | null;\n minCount?: number;\n prefixLabel?: string;\n}> = ({ componentLabel, count, wattage, minCount = 1, prefixLabel }) => {\n const { locale } = useLocaleFormat();\n if (wattage == null || (count ?? 1) < minCount) {\n return null;\n }\n return (\n \n \n {prefixLabel != null ? `${prefixLabel} ` : null}\n {count} {componentLabel} ({formatWattage(wattage, locale)}) selected\n \n \n );\n};\n\nexport const AutoStringSelectionSection: FC = ({\n selectedFillZone,\n selectedSolarPanel,\n selectionType,\n}) => {\n if (selectionType === AutoStringSelectionType.SolarPanel) {\n return (\n \n );\n }\n if (selectionType === AutoStringSelectionType.FillZone) {\n if (selectedFillZone?.panelCount == null) {\n return (\n \n Multiple fill zones selected\n \n );\n }\n return (\n \n );\n }\n return ;\n};\n","// @ts-ignore: Ignore unused { * as Types } import\nimport * as Types from '@aurorasolar/graphql-client-schema';\n\nimport { gql } from '@apollo/client';\nimport * as Apollo from '@apollo/client';\nconst defaultOptions = {} as const;\nexport type AutoStringInverterFragmentFragment = { __typename: 'SolarInverter', id: string, starred: boolean, isCustom: boolean, efficiencyCec?: number | null | undefined, efficiencyEuropean?: number | null | undefined, efficiencyMax?: number | null | undefined, hasExternalMppt?: boolean | null | undefined, hasGlobalMppt?: boolean | null | undefined, inputVoltageMax?: number | null | undefined, inputVoltageMin?: number | null | undefined, inputVoltageSE?: number | null | undefined, isHuawei?: boolean | null | undefined, isSolarEdge?: boolean | null | undefined, mpptRatedPowerVoltageMax?: number | null | undefined, mpptRatedPowerVoltageMin?: number | null | undefined, mppts?: number | null | undefined, name?: string | null | undefined, numPhases?: number | null | undefined, numPhysicalDcInputs?: number | null | undefined, outputCurrent?: number | null | undefined, outputVoltageNominal?: number | null | undefined, price?: number | null | undefined, ratedPower?: number | null | undefined, usableInputCurrentMax?: number | null | undefined, usableInputPowerMax?: number | null | undefined, manufacturer?: { __typename: 'Manufacturer', id: string, name?: string | null | undefined, displayName?: string | null | undefined, isCustom: boolean } | null | undefined };\n\nexport type AutoStringDcOptimizerFragmentFragment = { __typename: 'DcOptimizer', id: string, starred: boolean, isCustom?: boolean | null | undefined, efficiency?: number | null | undefined, efficiencyMax?: number | null | undefined, hasGlobalMppt?: boolean | null | undefined, inputShortCircuitCurrentMax?: number | null | undefined, inputVoltageMax?: number | null | undefined, isExternalMppt?: boolean | null | undefined, isLongString?: boolean | null | undefined, isHuawei?: boolean | null | undefined, isSolarEdge?: boolean | null | undefined, maxInputCurrent?: number | null | undefined, mpptOperatingVoltageMax?: number | null | undefined, mpptOperatingVoltageMin?: number | null | undefined, mpptRangeMax?: number | null | undefined, mpptRangeMin?: number | null | undefined, name?: string | null | undefined, numInputs?: number | null | undefined, operatingModel?: string | null | undefined, optimizationBehavior?: string | null | undefined, outputCurrentMax?: number | null | undefined, outputVoltageMax?: number | null | undefined, price?: number | null | undefined, stcInputPowerMax?: number | null | undefined, systemVoltageMax?: number | null | undefined, usesSelectiveOptimization?: boolean | null | undefined, manufacturer?: { __typename: 'Manufacturer', id: string, name?: string | null | undefined, displayName?: string | null | undefined, isCustom: boolean } | null | undefined };\n\nexport type SolarPanelAutoStringQueryVariables = Types.Exact<{\n id: Types.Scalars['ID'];\n}>;\n\n\nexport type SolarPanelAutoStringQuery = { __typename: 'Query', component?: { __typename: 'SolarPanel', id: string, starred: boolean, isCustom: boolean, efficiency?: number | null | undefined, height?: number | null | undefined, imp?: number | null | undefined, isc?: number | null | undefined, length?: number | null | undefined, name?: string | null | undefined, noct?: number | null | undefined, panelType?: string | null | undefined, price?: number | null | undefined, ratingPtc?: number | null | undefined, ratingStc?: number | null | undefined, tempCoeffIsc?: number | null | undefined, tempCoeffPmax?: number | null | undefined, tempCoeffVoc?: number | null | undefined, vmp?: number | null | undefined, voc?: number | null | undefined, width?: number | null | undefined, manufacturer?: { __typename: 'Manufacturer', id: string, name?: string | null | undefined, displayName?: string | null | undefined, isCustom: boolean } | null | undefined, mlpe?: { __typename: 'MLPE', id: string, type?: string | null | undefined, isSolarInverter?: boolean | null | undefined, isDcOptimizer?: boolean | null | undefined, isCellStringOptimizer?: boolean | null | undefined, solarInverter?: { __typename: 'SolarInverter', id: string, starred: boolean, isCustom: boolean, efficiencyCec?: number | null | undefined, efficiencyEuropean?: number | null | undefined, efficiencyMax?: number | null | undefined, hasExternalMppt?: boolean | null | undefined, hasGlobalMppt?: boolean | null | undefined, inputVoltageMax?: number | null | undefined, inputVoltageMin?: number | null | undefined, inputVoltageSE?: number | null | undefined, isHuawei?: boolean | null | undefined, isSolarEdge?: boolean | null | undefined, mpptRatedPowerVoltageMax?: number | null | undefined, mpptRatedPowerVoltageMin?: number | null | undefined, mppts?: number | null | undefined, name?: string | null | undefined, numPhases?: number | null | undefined, numPhysicalDcInputs?: number | null | undefined, outputCurrent?: number | null | undefined, outputVoltageNominal?: number | null | undefined, price?: number | null | undefined, ratedPower?: number | null | undefined, usableInputCurrentMax?: number | null | undefined, usableInputPowerMax?: number | null | undefined, manufacturer?: { __typename: 'Manufacturer', id: string, name?: string | null | undefined, displayName?: string | null | undefined, isCustom: boolean } | null | undefined } | null | undefined, dcOptimizer?: { __typename: 'DcOptimizer', id: string, starred: boolean, isCustom?: boolean | null | undefined, efficiency?: number | null | undefined, efficiencyMax?: number | null | undefined, hasGlobalMppt?: boolean | null | undefined, inputShortCircuitCurrentMax?: number | null | undefined, inputVoltageMax?: number | null | undefined, isExternalMppt?: boolean | null | undefined, isLongString?: boolean | null | undefined, isHuawei?: boolean | null | undefined, isSolarEdge?: boolean | null | undefined, maxInputCurrent?: number | null | undefined, mpptOperatingVoltageMax?: number | null | undefined, mpptOperatingVoltageMin?: number | null | undefined, mpptRangeMax?: number | null | undefined, mpptRangeMin?: number | null | undefined, name?: string | null | undefined, numInputs?: number | null | undefined, operatingModel?: string | null | undefined, optimizationBehavior?: string | null | undefined, outputCurrentMax?: number | null | undefined, outputVoltageMax?: number | null | undefined, price?: number | null | undefined, stcInputPowerMax?: number | null | undefined, systemVoltageMax?: number | null | undefined, usesSelectiveOptimization?: boolean | null | undefined, manufacturer?: { __typename: 'Manufacturer', id: string, name?: string | null | undefined, displayName?: string | null | undefined, isCustom: boolean } | null | undefined } | null | undefined, cellStringOptimizer?: { __typename: 'CellStringOptimizer', id: string, name?: string | null | undefined, voltageLimit?: boolean | null | undefined, maxOutputVoltage?: number | null | undefined, manufacturer?: { __typename: 'Manufacturer', id: string, name?: string | null | undefined, displayName?: string | null | undefined, isCustom: boolean } | null | undefined } | null | undefined } | null | undefined } | null | undefined };\n\nexport type AutoStringInverterQueryVariables = Types.Exact<{\n id: Types.Scalars['ID'];\n}>;\n\n\nexport type AutoStringInverterQuery = { __typename: 'Query', component?: { __typename: 'SolarInverter', id: string, starred: boolean, isCustom: boolean, efficiencyCec?: number | null | undefined, efficiencyEuropean?: number | null | undefined, efficiencyMax?: number | null | undefined, hasExternalMppt?: boolean | null | undefined, hasGlobalMppt?: boolean | null | undefined, inputVoltageMax?: number | null | undefined, inputVoltageMin?: number | null | undefined, inputVoltageSE?: number | null | undefined, isHuawei?: boolean | null | undefined, isSolarEdge?: boolean | null | undefined, mpptRatedPowerVoltageMax?: number | null | undefined, mpptRatedPowerVoltageMin?: number | null | undefined, mppts?: number | null | undefined, name?: string | null | undefined, numPhases?: number | null | undefined, numPhysicalDcInputs?: number | null | undefined, outputCurrent?: number | null | undefined, outputVoltageNominal?: number | null | undefined, price?: number | null | undefined, ratedPower?: number | null | undefined, usableInputCurrentMax?: number | null | undefined, usableInputPowerMax?: number | null | undefined, manufacturer?: { __typename: 'Manufacturer', id: string, name?: string | null | undefined, displayName?: string | null | undefined, isCustom: boolean } | null | undefined } | null | undefined };\n\nexport type AutoStringDcOptimizerQueryVariables = Types.Exact<{\n id: Types.Scalars['ID'];\n}>;\n\n\nexport type AutoStringDcOptimizerQuery = { __typename: 'Query', component: { __typename: 'DcOptimizer', id: string, starred: boolean, isCustom?: boolean | null | undefined, efficiency?: number | null | undefined, efficiencyMax?: number | null | undefined, hasGlobalMppt?: boolean | null | undefined, inputShortCircuitCurrentMax?: number | null | undefined, inputVoltageMax?: number | null | undefined, isExternalMppt?: boolean | null | undefined, isLongString?: boolean | null | undefined, isHuawei?: boolean | null | undefined, isSolarEdge?: boolean | null | undefined, maxInputCurrent?: number | null | undefined, mpptOperatingVoltageMax?: number | null | undefined, mpptOperatingVoltageMin?: number | null | undefined, mpptRangeMax?: number | null | undefined, mpptRangeMin?: number | null | undefined, name?: string | null | undefined, numInputs?: number | null | undefined, operatingModel?: string | null | undefined, optimizationBehavior?: string | null | undefined, outputCurrentMax?: number | null | undefined, outputVoltageMax?: number | null | undefined, price?: number | null | undefined, stcInputPowerMax?: number | null | undefined, systemVoltageMax?: number | null | undefined, usesSelectiveOptimization?: boolean | null | undefined, manufacturer?: { __typename: 'Manufacturer', id: string, name?: string | null | undefined, displayName?: string | null | undefined, isCustom: boolean } | null | undefined } };\n\nexport const AutoStringInverterFragmentFragmentDoc = gql`\n fragment AutoStringInverterFragment on SolarInverter {\n id\n starred\n isCustom\n efficiencyCec\n efficiencyEuropean\n efficiencyMax\n hasExternalMppt\n hasGlobalMppt\n inputVoltageMax\n inputVoltageMin\n inputVoltageSE\n isHuawei\n isSolarEdge\n mpptRatedPowerVoltageMax\n mpptRatedPowerVoltageMin\n mppts\n name\n numPhases\n numPhysicalDcInputs\n outputCurrent\n outputVoltageNominal\n price\n ratedPower\n usableInputCurrentMax\n usableInputPowerMax\n manufacturer {\n id\n name\n displayName\n isCustom\n }\n}\n `;\nexport const AutoStringDcOptimizerFragmentFragmentDoc = gql`\n fragment AutoStringDcOptimizerFragment on DcOptimizer {\n id\n starred\n isCustom\n efficiency\n efficiencyMax\n hasGlobalMppt\n inputShortCircuitCurrentMax\n inputVoltageMax\n isExternalMppt\n isLongString\n isHuawei\n isSolarEdge\n maxInputCurrent\n mpptOperatingVoltageMax\n mpptOperatingVoltageMin\n mpptRangeMax\n mpptRangeMin\n name\n numInputs\n operatingModel\n optimizationBehavior\n outputCurrentMax\n outputVoltageMax\n price\n stcInputPowerMax\n systemVoltageMax\n usesSelectiveOptimization\n manufacturer {\n id\n name\n displayName\n isCustom\n }\n}\n `;\nexport const SolarPanelAutoStringDocument = gql`\n query SolarPanelAutoString($id: ID!) @trace_info(traceInfo: {pod: cad}) {\n component: solarPanelById(id: $id) {\n id\n starred\n isCustom\n efficiency\n height\n imp\n isc\n length\n name\n noct\n panelType\n price\n ratingPtc\n ratingStc\n tempCoeffIsc\n tempCoeffPmax\n tempCoeffVoc\n vmp\n voc\n width\n manufacturer {\n id\n name\n displayName\n isCustom\n }\n mlpe {\n id\n type\n isSolarInverter\n isDcOptimizer\n isCellStringOptimizer\n solarInverter {\n ...AutoStringInverterFragment\n }\n dcOptimizer {\n ...AutoStringDcOptimizerFragment\n }\n cellStringOptimizer {\n id\n name\n voltageLimit\n maxOutputVoltage\n manufacturer {\n id\n name\n displayName\n isCustom\n }\n }\n }\n }\n}\n ${AutoStringInverterFragmentFragmentDoc}\n${AutoStringDcOptimizerFragmentFragmentDoc}`;\n\n/**\n * __useSolarPanelAutoStringQuery__\n *\n * To run a query within a React component, call `useSolarPanelAutoStringQuery` and pass it any options that fit your needs.\n * When your component renders, `useSolarPanelAutoStringQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useSolarPanelAutoStringQuery({\n * variables: {\n * id: // value for 'id'\n * },\n * });\n */\nexport function useSolarPanelAutoStringQuery(baseOptions: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(SolarPanelAutoStringDocument, options);\n }\nexport function useSolarPanelAutoStringLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(SolarPanelAutoStringDocument, options);\n }\nexport type SolarPanelAutoStringQueryHookResult = ReturnType;\nexport type SolarPanelAutoStringLazyQueryHookResult = ReturnType;\nexport type SolarPanelAutoStringQueryResult = Apollo.QueryResult;\nexport const AutoStringInverterDocument = gql`\n query AutoStringInverter($id: ID!) @trace_info(traceInfo: {pod: cad}) {\n component: solarInverterById(id: $id) {\n ...AutoStringInverterFragment\n }\n}\n ${AutoStringInverterFragmentFragmentDoc}`;\n\n/**\n * __useAutoStringInverterQuery__\n *\n * To run a query within a React component, call `useAutoStringInverterQuery` and pass it any options that fit your needs.\n * When your component renders, `useAutoStringInverterQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useAutoStringInverterQuery({\n * variables: {\n * id: // value for 'id'\n * },\n * });\n */\nexport function useAutoStringInverterQuery(baseOptions: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(AutoStringInverterDocument, options);\n }\nexport function useAutoStringInverterLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(AutoStringInverterDocument, options);\n }\nexport type AutoStringInverterQueryHookResult = ReturnType;\nexport type AutoStringInverterLazyQueryHookResult = ReturnType;\nexport type AutoStringInverterQueryResult = Apollo.QueryResult;\nexport const AutoStringDcOptimizerDocument = gql`\n query AutoStringDcOptimizer($id: ID!) @trace_info(traceInfo: {pod: cad}) {\n component: dcOptimizerById(id: $id) {\n ...AutoStringDcOptimizerFragment\n }\n}\n ${AutoStringDcOptimizerFragmentFragmentDoc}`;\n\n/**\n * __useAutoStringDcOptimizerQuery__\n *\n * To run a query within a React component, call `useAutoStringDcOptimizerQuery` and pass it any options that fit your needs.\n * When your component renders, `useAutoStringDcOptimizerQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useAutoStringDcOptimizerQuery({\n * variables: {\n * id: // value for 'id'\n * },\n * });\n */\nexport function useAutoStringDcOptimizerQuery(baseOptions: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(AutoStringDcOptimizerDocument, options);\n }\nexport function useAutoStringDcOptimizerLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(AutoStringDcOptimizerDocument, options);\n }\nexport type AutoStringDcOptimizerQueryHookResult = ReturnType;\nexport type AutoStringDcOptimizerLazyQueryHookResult = ReturnType;\nexport type AutoStringDcOptimizerQueryResult = Apollo.QueryResult;","import { useEffect, useMemo } from 'react';\n\nimport { ApolloClient, useAppModule } from '@aurorasolar/common-module-loader';\n\nimport {\n SolarPanelAutoStringDocument,\n SolarPanelAutoStringQuery,\n SolarPanelAutoStringQueryVariables,\n} from './components.generated';\n\n/**\n * Apollo cache has a bug that results in returning\n * null for cellStringOptimizer on panels when\n * panel is switched from one to another. The fix is to\n * use \"network-only\" requests and \"manage\" cache locally\n * within the component.\n */\nexport const useSolarPanelQueryFixed = ({\n selectedPanelId,\n onCompleted,\n}: {\n selectedPanelId: string | null | undefined;\n onCompleted: (data: SolarPanelAutoStringQuery['component']) => void;\n}) => {\n const client = useAppModule(ApolloClient);\n const solarPanelCache = useMemo(\n () => new Map(),\n [],\n );\n\n useEffect(() => {\n if (!client) {\n return undefined;\n }\n\n if (!selectedPanelId) {\n onCompleted(undefined);\n return undefined;\n }\n\n const solarPanel = solarPanelCache.get(selectedPanelId);\n if (solarPanel) {\n onCompleted(solarPanel);\n return undefined;\n }\n\n let isCancelled = false;\n client\n .query({\n fetchPolicy: 'network-only',\n query: SolarPanelAutoStringDocument,\n variables: {\n id: selectedPanelId,\n },\n })\n .then(({ data }) => {\n if (!isCancelled) {\n solarPanelCache.set(selectedPanelId, data.component);\n onCompleted(data.component);\n }\n return null;\n })\n .catch((error) => {\n console.error(error);\n });\n\n return () => {\n isCancelled = true;\n };\n }, [onCompleted, selectedPanelId, solarPanelCache, client]);\n};\n","import { Immutable } from 'immer';\nimport { FC, useCallback, useEffect, useMemo, useReducer, useRef, useState } from 'react';\n\nimport {\n AutoStringModalInitType,\n AutoStringPanelInit,\n CADTriggerActionTypes,\n FillZonePreset,\n StringingSettings,\n} from '@aurorasolar/common-data-store';\nimport { CadSolarPanelFree, DcOptimizer, SolarInverter } from '@aurorasolar/graphql-client-schema';\n\nimport { useGetDesignByIdQuery } from '../cad.generated';\nimport { useInspectorSelectedModel, useInspectorState, useTriggerCadAction } from '../hooks';\nimport { AutoStringerCore } from './autostring-core';\nimport { AutoStringSelectionSection } from './autostring-selection-section';\nimport { useSolarPanelQueryFixed } from './component-query-fixed';\nimport {\n SolarPanelAutoStringQuery,\n useAutoStringDcOptimizerQuery,\n useAutoStringInverterQuery,\n} from './components.generated';\nimport { AutoStringInverter, AutoStringInverterOption } from './inverter-params';\nimport {\n AutoStringActionType,\n AutoStringSelectionType,\n AutoStringState,\n getEmptyAutoStringState,\n settingsReducer,\n} from './settings-reducer';\nimport { useAutostringValidationError } from './use-validation-error';\n\ninterface AutoStringerProps {\n data: null | AutoStringPanelInit;\n designId: string;\n onClose: () => void;\n}\n\nconst removeEmptyFields = (obj: T) => {\n Object.keys(obj).forEach((key) => {\n if (obj[key] == null) {\n delete obj[key];\n }\n });\n};\n\nconst getSelectedId = ({ selectedFillZone, selectedSolarPanel, selectionType }: AutoStringState) =>\n selectionType === AutoStringSelectionType.FillZone\n ? selectedFillZone?.solarPanelId\n : selectedSolarPanel?.databaseId;\n\nconst DEFAULT_DC_AC_RATIO = 1.2;\nconst EMPTY_STRING_LENGTH = NaN;\n\nconst getSettings = (\n {\n inverterType,\n selectionType,\n selectedFillZone,\n settings,\n integratedDcOptimizer,\n dcOptimizer,\n selectedSolarPanel,\n }: AutoStringState,\n microinverterId: string | null | undefined,\n): StringingSettings | undefined => {\n if (\n selectionType === AutoStringSelectionType.SolarPanel &&\n selectedSolarPanel?.databaseId == null\n ) {\n console.warn('no solar panel id found');\n return undefined;\n }\n\n if (\n selectionType === AutoStringSelectionType.FillZone &&\n selectedFillZone?.solarPanelId == null\n ) {\n console.warn('no fill zone solar panel id found');\n return undefined;\n }\n\n const inverterSettings =\n inverterType === AutoStringInverter.StringInverter\n ? settings.inverters\n : settings.microinverters;\n\n const dcOptimizerId =\n inverterType === AutoStringInverter.StringInverter\n ? integratedDcOptimizer?.id || dcOptimizer?.id\n : undefined;\n\n const [setting1, setting2, setting3] = Object.entries(inverterSettings).map(([id, value]) => ({\n id,\n ...value,\n }));\n\n const params = {\n dcAcRatio1: setting1?.dcAcRatio ?? DEFAULT_DC_AC_RATIO,\n dcAcRatio2: setting2?.dcAcRatio ?? DEFAULT_DC_AC_RATIO,\n dcAcRatio3: setting3?.dcAcRatio ?? DEFAULT_DC_AC_RATIO,\n dcOptimizerId,\n inverterId1: setting1?.id,\n inverterId2: setting2?.id,\n inverterId3: setting3?.id,\n maxStringLength1: setting1?.maxStringLength ?? EMPTY_STRING_LENGTH,\n maxStringLength2: setting2?.maxStringLength ?? EMPTY_STRING_LENGTH,\n maxStringLength3: setting3?.maxStringLength ?? EMPTY_STRING_LENGTH,\n microinverterId,\n minStringLength1: setting1?.minStringLength ?? EMPTY_STRING_LENGTH,\n minStringLength2: setting2?.minStringLength ?? EMPTY_STRING_LENGTH,\n minStringLength3: setting3?.minStringLength ?? EMPTY_STRING_LENGTH,\n preset: FillZonePreset['(none selected)'],\n solarPanelId:\n selectionType === AutoStringSelectionType.FillZone\n ? selectedFillZone!.solarPanelId\n : selectedSolarPanel!.databaseId,\n };\n\n removeEmptyFields(params);\n\n return params;\n};\n\nconst useAutoStringInitialComponents = ({\n state,\n initData,\n}: {\n state: AutoStringState;\n initData: null | AutoStringPanelInit;\n}) => {\n let initialDcOptimizerId: string | null | undefined = null;\n let initialMicroinverterId: string | null | undefined = null;\n\n const initialSolarPanelRefs = useRef<{\n selectedSolarPanel: CadSolarPanelFree | undefined;\n solarPanel: AutoStringState['solarPanel'] | undefined;\n }>({\n selectedSolarPanel: undefined,\n solarPanel: undefined,\n });\n\n if (!initData) {\n if (!initialSolarPanelRefs.current.selectedSolarPanel) {\n initialSolarPanelRefs.current.selectedSolarPanel = state.selectedSolarPanel;\n }\n if (!initialSolarPanelRefs.current.solarPanel) {\n initialSolarPanelRefs.current.solarPanel = state.solarPanel;\n }\n initialDcOptimizerId = initialSolarPanelRefs.current.solarPanel?.mlpe?.isDcOptimizer\n ? undefined\n : initialSolarPanelRefs.current.selectedSolarPanel?.dcOptimizerId;\n } else if (initData.type === AutoStringModalInitType.DcOptimizer) {\n initialDcOptimizerId = initData.id;\n } else {\n initialMicroinverterId = initData.id;\n }\n\n const initialDcOptimizerResult = useAutoStringDcOptimizerQuery({\n fetchPolicy: 'cache-first',\n skip: !initialDcOptimizerId,\n variables: {\n id: initialDcOptimizerId!,\n },\n }).data?.component;\n\n const initialMicroinverterResult = useAutoStringInverterQuery({\n fetchPolicy: 'cache-first',\n skip: !initialMicroinverterId,\n variables: {\n id: initialMicroinverterId!,\n },\n }).data?.component;\n\n return {\n initialDcOptimizerResult,\n initialMicroinverterResult,\n };\n};\n\nexport const AutoStringer: FC = ({ designId, onClose, data: initData }) => {\n const [autoParams, updateAutoParams] = useState(true);\n const [selectedSolarPanel] = useInspectorState('solarPanel_free');\n const [selectedFillZone] = useInspectorState('fillZone');\n const { isSelected } = useInspectorSelectedModel();\n const [state, dispatch] = useReducer(settingsReducer, getEmptyAutoStringState());\n const { inverterType, microinverters, dcOptimizer, settings, inverters } = state;\n const { selectionSize } = selectedSolarPanel;\n\n useEffect(() => {\n const payload = { selectionId: undefined, selectionType: AutoStringSelectionType.Nothing };\n\n if (isSelected('fillZone')) {\n payload.selectionType = AutoStringSelectionType.FillZone;\n } else if (isSelected('solarPanel_free')) {\n payload.selectionType = AutoStringSelectionType.SolarPanel;\n }\n\n dispatch({ payload, type: AutoStringActionType.SelectionTypeChanged });\n }, [isSelected]);\n\n useEffect(() => {\n dispatch({\n payload: { selectedSolarPanel },\n type: AutoStringActionType.SolarPanelSelectionChanged,\n });\n }, [selectedSolarPanel]);\n\n const selectedPanelId = useMemo(() => getSelectedId(state), [state]);\n\n useGetDesignByIdQuery({\n onCompleted: (data) => {\n dispatch({ payload: { design: data.designById }, type: AutoStringActionType.DesignChanged });\n },\n skip: !designId,\n variables: {\n id: designId,\n },\n });\n\n const onSolarPanelQueryCompleted = useCallback(\n (solarPanel: SolarPanelAutoStringQuery['component']) => {\n dispatch({\n payload: { solarPanel },\n type: AutoStringActionType.SolarPanelQueryFinished,\n });\n },\n [dispatch],\n );\n\n useSolarPanelQueryFixed({\n onCompleted: onSolarPanelQueryCompleted,\n selectedPanelId,\n });\n\n const microinverterId = state.solarPanel?.mlpe?.isSolarInverter ? state.solarPanel.mlpe.id : null;\n\n const microinverterResult = useAutoStringInverterQuery({\n fetchPolicy: 'cache-first',\n skip: !microinverterId,\n variables: {\n id: microinverterId!,\n },\n }).data?.component;\n\n const integratedDcOptimizerId = state.solarPanel?.mlpe?.isDcOptimizer\n ? state.solarPanel.mlpe.id\n : null;\n\n const integratedDcOptimizerResult = useAutoStringDcOptimizerQuery({\n fetchPolicy: 'cache-first',\n skip: !integratedDcOptimizerId,\n variables: {\n id: integratedDcOptimizerId!,\n },\n }).data?.component;\n\n const validationError: string | undefined = useAutostringValidationError({\n dcOptimizerResult: integratedDcOptimizerResult || dcOptimizer || undefined,\n microinverterResult,\n panelCount: selectionSize,\n state,\n });\n\n useEffect(() => {\n if (integratedDcOptimizerResult != null) {\n dispatch({\n payload: { integratedDcOptimizer: integratedDcOptimizerResult },\n type: AutoStringActionType.UpdateIntegratedDcOptimizer,\n });\n }\n }, [integratedDcOptimizerResult]);\n\n const { initialDcOptimizerResult, initialMicroinverterResult } = useAutoStringInitialComponents({\n initData,\n state,\n });\n\n useEffect(() => {\n if (initData?.type === AutoStringModalInitType.DcOptimizer) {\n dispatch({\n payload: { inverterType: AutoStringInverter.StringInverter },\n type: AutoStringActionType.SetInverterType,\n });\n } else if (initData?.type === AutoStringModalInitType.Microinverter) {\n dispatch({\n payload: { inverterType: AutoStringInverter.Microinverter },\n type: AutoStringActionType.SetInverterType,\n });\n }\n }, [initData]);\n\n useEffect(() => {\n if (initialDcOptimizerResult) {\n dispatch({\n payload: { dcOptimizer: initialDcOptimizerResult },\n type: AutoStringActionType.AddDcOptimizer,\n });\n }\n }, [initialDcOptimizerResult]);\n\n useEffect(() => {\n if (initialMicroinverterResult) {\n dispatch({\n payload: { microinverter: initialMicroinverterResult },\n type: AutoStringActionType.AddMicroinverter,\n });\n }\n }, [initialMicroinverterResult]);\n\n useEffect(() => {\n dispatch({\n payload: { selectedFillZone },\n type: AutoStringActionType.FillZoneSelectionChanged,\n });\n }, [selectedFillZone]);\n\n const setInverterType = (newInverterType: AutoStringInverter) =>\n dispatch({\n payload: { inverterType: newInverterType },\n type: AutoStringActionType.SetInverterType,\n });\n\n const addInverter = (newInverter: Immutable) =>\n dispatch({\n payload: { inverter: newInverter },\n type: AutoStringActionType.AddInverter,\n });\n\n const removeInverter = (oldInverter: Immutable) =>\n dispatch({\n payload: { inverter: oldInverter },\n type: AutoStringActionType.RemoveInverter,\n });\n\n const addMicroinverter = (newMicroinverter: Immutable) =>\n dispatch({\n payload: { microinverter: newMicroinverter },\n type: AutoStringActionType.AddMicroinverter,\n });\n\n const removeMicroinverter = (oldMicroinverter: Immutable) =>\n dispatch({\n payload: { microinverter: oldMicroinverter },\n type: AutoStringActionType.RemoveMicroinverter,\n });\n\n const updateAutoParamsSettings = (value: boolean) => {\n updateAutoParams(value);\n if (value) {\n dispatch({ type: AutoStringActionType.UpdateAutoParams });\n }\n };\n\n const updateSetting = (id: string, prop: keyof AutoStringInverterOption, value: number) => {\n dispatch({ payload: { id, prop, value }, type: AutoStringActionType.UpdateSetting });\n };\n\n const addDcOptimizer = (newDcOptimizer: Immutable) =>\n dispatch({\n payload: { dcOptimizer: newDcOptimizer },\n type: AutoStringActionType.AddDcOptimizer,\n });\n\n const removeDcOptimizer = (oldDcOptimizer: Immutable) =>\n dispatch({\n payload: { dcOptimizer: oldDcOptimizer },\n type: AutoStringActionType.RemoveDcOptimizer,\n });\n\n const stringFillZone = useTriggerCadAction(CADTriggerActionTypes.StringFillZones);\n const stringPanels = useTriggerCadAction(CADTriggerActionTypes.RunAutoStringer);\n const run = useCallback(() => {\n const params = { settings: getSettings(state, microinverterId) };\n if (params.settings == null) {\n return;\n }\n if (state.selectionType === AutoStringSelectionType.FillZone) {\n stringFillZone(params);\n onClose();\n return;\n }\n if (state.selectionType === AutoStringSelectionType.SolarPanel) {\n stringPanels(params);\n onClose();\n }\n }, [state, microinverterId, onClose, stringFillZone, stringPanels]);\n\n return (\n \n }\n dcOptimizer={dcOptimizer || undefined}\n integratedMicroinverter={microinverterResult || undefined}\n inverterType={inverterType}\n inverters={inverters}\n microinverters={microinverters}\n onCancel={onClose}\n onRun={run}\n removeDcOptimizer={removeDcOptimizer}\n removeInverter={removeInverter}\n removeMicroinverter={removeMicroinverter}\n setInverterType={setInverterType}\n settings={settings}\n solarPanel={state.solarPanel || undefined}\n updateAutoParams={updateAutoParamsSettings}\n updateSettings={updateSetting}\n validationError={validationError}\n />\n );\n};\n","import { FC } from 'react';\nimport styled from 'styled-components';\n\nimport { Colors } from '@aurorasolar/common-core/src/colors';\nimport { useLocaleFormat } from '@aurorasolar/common-core/src/hooks';\nimport { defaultButtonBorderRadius, SPACES } from '@aurorasolar/common-core/src/layout';\nimport { Text } from '@aurorasolar/common-core/src/typography';\nimport { formatOrFallback, formatWattage } from '@aurorasolar/common-core/src/utils';\nimport { Radio } from '@blueprintjs/core';\nimport { Flex } from '@rebass/grid';\n\nimport { useSolarPanelAutoStringQuery } from './components.generated';\n\nconst Row = styled(Flex)`\n background: ${Colors.WHITE};\n border-radius: ${defaultButtonBorderRadius}px;\n padding: ${SPACES[0]}px;\n border: 1px solid ${Colors.GRAY_300};\n margin-top: ${SPACES[0]}px;\n flex-grow: 1;\n justify-content: space-between;\n`;\nconst ListItem = styled.li`\n list-style: none;\n`;\nconst RadioEl = styled(Radio)`\n margin: 0;\n`;\n\ninterface AutoStringerChoosePanelItemProps {\n solarPanelId: string;\n onSelect(): void;\n selectedId?: string;\n}\n\nexport const AutoStringerChoosePanelItem: FC = ({\n solarPanelId,\n onSelect,\n selectedId,\n}) => {\n const { locale } = useLocaleFormat();\n\n const solarPanel = useSolarPanelAutoStringQuery({\n fetchPolicy: 'cache-first',\n variables: { id: solarPanelId },\n }).data?.component;\n\n if (!solarPanel) {\n return ;\n }\n return (\n \n \n \n \n \n \n {solarPanel?.manufacturer?.name}\n \n {solarPanel?.name}\n \n \n {formatOrFallback(solarPanel?.ratingStc, (value) => formatWattage(value, locale), '')}\n \n \n \n \n );\n};\n","// @ts-ignore: Ignore unused { * as Types } import\nimport * as Types from '@aurorasolar/graphql-client-schema';\n\nimport { gql } from '@apollo/client';\nimport * as Apollo from '@apollo/client';\nconst defaultOptions = {} as const;\nexport type AutoStringerChoosePanelsTypesQueryVariables = Types.Exact<{ [key: string]: never; }>;\n\n\nexport type AutoStringerChoosePanelsTypesQuery = { __typename: 'Query', CAD: { __typename: 'CAD', panelTypes: Array } };\n\n\nexport const AutoStringerChoosePanelsTypesDocument = gql`\n query AutoStringerChoosePanelsTypes @trace_info(traceInfo: {pod: cad}) {\n CAD @client {\n panelTypes\n }\n}\n `;\n\n/**\n * __useAutoStringerChoosePanelsTypesQuery__\n *\n * To run a query within a React component, call `useAutoStringerChoosePanelsTypesQuery` and pass it any options that fit your needs.\n * When your component renders, `useAutoStringerChoosePanelsTypesQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useAutoStringerChoosePanelsTypesQuery({\n * variables: {\n * },\n * });\n */\nexport function useAutoStringerChoosePanelsTypesQuery(baseOptions?: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(AutoStringerChoosePanelsTypesDocument, options);\n }\nexport function useAutoStringerChoosePanelsTypesLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(AutoStringerChoosePanelsTypesDocument, options);\n }\nexport type AutoStringerChoosePanelsTypesQueryHookResult = ReturnType;\nexport type AutoStringerChoosePanelsTypesLazyQueryHookResult = ReturnType;\nexport type AutoStringerChoosePanelsTypesQueryResult = Apollo.QueryResult;","import { FC, useCallback, useState } from 'react';\nimport styled from 'styled-components';\n\nimport { AuroraThemedButton, AuroraThemedButtonIntent } from '@aurorasolar/common-core/src/button';\nimport { Text } from '@aurorasolar/common-core/src/typography';\nimport { CADTriggerActionTypes } from '@aurorasolar/common-data-store';\nimport { Box, Flex } from '@rebass/grid';\n\nimport { ShrinkableHeader } from '../autodesigner/shrinkable-header';\nimport { useCadRightPanelAction, useTriggerCadAction } from '../hooks';\nimport { AutoStringerChoosePanelItem } from './choose-panel-item';\nimport { useAutoStringerChoosePanelsTypesQuery } from './choose-panel.generated';\n\nconst PanelBody = styled(Box).attrs({ flex: '1 1 auto' })`\n padding: 0 20px 24px 20px;\n overflow-y: auto;\n`;\nconst BottomArea = styled(Flex).attrs({ flexDirection: 'row-reverse' })`\n height: 80px;\n background: white;\n border-top: solid 1px #e0e0e0;\n padding: 20px;\n`;\n\ninterface AutoStringerChoosePanelProps {\n data: undefined;\n onClose(): void;\n designId: string;\n}\n\nexport const AutoStringerChoosePanel: FC = ({ onClose }) => {\n const openAutoStringer = useCadRightPanelAction(CADTriggerActionTypes.BeforeRunAutoStringer);\n const selectPanelInCad = useTriggerCadAction(CADTriggerActionTypes.SelectPanelType);\n const choosePanel = useCallback(\n (solarPanelId: string) => {\n selectPanelInCad({ solarPanelId });\n openAutoStringer(null);\n },\n [openAutoStringer, selectPanelInCad],\n );\n\n const solarPanelTypes = useAutoStringerChoosePanelsTypesQuery({\n returnPartialData: true,\n })?.data?.CAD?.panelTypes;\n\n const [selected, setSelected] = useState();\n\n return (\n \n AutoString\n \n \n Multiple module types are present: Select a module type to AutoString.\n \n \n \n *AutoString is not available for ground mounts at this time.\n \n \n \n {solarPanelTypes?.map((typeId) => (\n setSelected(typeId)}\n selectedId={selected}\n solarPanelId={typeId}\n />\n ))}\n \n \n\n \n \n choosePanel(selected!)}\n >\n Continue\n \n \n \n \n Cancel\n \n \n \n \n );\n};\n","// @ts-ignore: Ignore unused { * as Types } import\nimport * as Types from '@aurorasolar/graphql-client-schema';\n\nimport { gql } from '@apollo/client';\nimport * as Apollo from '@apollo/client';\nconst defaultOptions = {} as const;\nexport type CadRightPanelQueryVariables = Types.Exact<{ [key: string]: never; }>;\n\n\nexport type CadRightPanelQuery = { __typename: 'Query', CAD: { __typename: 'CAD', activeRightPanel?: Types.CadRightPanel | null | undefined, activeRightPanelData?: any | null | undefined } };\n\n\nexport const CadRightPanelDocument = gql`\n query CadRightPanel @trace_info(traceInfo: {pod: cad}) {\n CAD @client {\n activeRightPanel\n activeRightPanelData\n }\n}\n `;\n\n/**\n * __useCadRightPanelQuery__\n *\n * To run a query within a React component, call `useCadRightPanelQuery` and pass it any options that fit your needs.\n * When your component renders, `useCadRightPanelQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useCadRightPanelQuery({\n * variables: {\n * },\n * });\n */\nexport function useCadRightPanelQuery(baseOptions?: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(CadRightPanelDocument, options);\n }\nexport function useCadRightPanelLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(CadRightPanelDocument, options);\n }\nexport type CadRightPanelQueryHookResult = ReturnType;\nexport type CadRightPanelLazyQueryHookResult = ReturnType;\nexport type CadRightPanelQueryResult = Apollo.QueryResult;","import { FC } from 'react';\nimport styled from 'styled-components';\n\nimport { Colors } from '@aurorasolar/common-core/src/colors';\nimport { cadSlideInPanelWidth } from '@aurorasolar/common-core/src/layout';\n\nimport { cadZIndex } from '../z-index';\n\nconst StyledSlideInPanel = styled.div`\n background: ${Colors.GRAY_100};\n position: absolute;\n right: 0;\n top: 0;\n bottom: 0;\n transform: translateX(101%);\n transition: transform 0.2s ease;\n display: flex;\n\n &[aria-label='open panel'] {\n width: ${cadSlideInPanelWidth}px;\n transform: translateX(0);\n }\n`;\n\nexport interface SlideInPanelProps {\n isOpen: boolean;\n onClosed: () => void;\n /**\n * Used for compatibility with new borealis styles\n */\n zIndex?: number;\n}\n\nexport const SlideInPanel: FC = ({\n isOpen,\n children,\n onClosed,\n zIndex = cadZIndex.slideInPanel,\n}) => {\n const onTransitionEnd = () => {\n if (!isOpen) {\n onClosed();\n }\n };\n return (\n \n {children}\n \n );\n};\n","import { FC, useCallback, useState } from 'react';\nimport { useCurrentRoute } from 'react-navi';\n\nimport { tokens, useAppModule } from '@aurorasolar/common-module-loader';\nimport { CadRightPanel as CadRightPanelType } from '@aurorasolar/graphql-client-schema';\n\nimport { AutoDesigner } from '../autodesigner';\nimport { AutoStringer, AutoStringerChoosePanel } from '../autostring';\nimport {\n CadRightPanelDocument,\n CadRightPanelQuery,\n useCadRightPanelQuery,\n} from './cad-right-panel.generated';\nimport { SlideInPanel } from './slide-in-panel';\n\ntype RightPanelProps = {\n data: CadRightPanelQuery['CAD']['activeRightPanelData'];\n onClose(): void;\n designId: string;\n};\n\nconst panelMap = new Map>([\n [CadRightPanelType.AutoDesigner, AutoDesigner],\n [CadRightPanelType.AutoStringer, AutoStringer],\n [CadRightPanelType.AutoStringerChoosePanel, AutoStringerChoosePanel],\n]);\n\nconst isPanelActive = (panel: CadRightPanelType | null | undefined): panel is CadRightPanelType =>\n panel != null;\n\nexport const CadRightPanel: FC<{ zIndex?: number }> = ({ zIndex }) => {\n const { designId }: { designId?: string } = useCurrentRoute()?.data ?? {};\n const cadQuery = useCadRightPanelQuery({\n returnPartialData: true,\n }).data?.CAD;\n const activePanel = cadQuery?.activeRightPanel ?? null;\n const activePanelData = cadQuery?.activeRightPanelData ?? null;\n const client = useAppModule(tokens.ApolloClient);\n const [isClosing, setIsClosing] = useState(false);\n const closePanel = useCallback(() => {\n client?.writeQuery({\n data: {\n __typename: 'Query',\n CAD: {\n __typename: 'CAD',\n activeRightPanel: null,\n activeRightPanelData: null,\n },\n },\n query: CadRightPanelDocument,\n });\n setIsClosing(false);\n }, [client]);\n const hasActivePanel = isPanelActive(activePanel);\n const Contents = hasActivePanel && panelMap.get(activePanel!);\n return (\n \n {designId && Contents && (\n setIsClosing(true)} />\n )}\n \n );\n};\n","import { useMemo } from 'react';\n\nimport { checkStringingRules } from '@aurorasolar/cad-services';\nimport { DcOptimizer, SolarPanel } from '@aurorasolar/graphql-client-schema';\n\nimport { AutoStringDcOptimizerQuery, AutoStringInverterQuery } from './components.generated';\nimport { AutoStringInverter } from './inverter-params';\nimport { AutoStringSelectionType, AutoStringState } from './settings-reducer';\n\nexport const useAutostringValidationError = ({\n panelCount,\n state: {\n inverterType,\n microinverters,\n inverters,\n design,\n solarPanel,\n selectionType,\n selectedFillZone,\n },\n dcOptimizerResult,\n microinverterResult,\n}: {\n panelCount?: number | null;\n state: AutoStringState;\n dcOptimizerResult?: AutoStringDcOptimizerQuery['component'] | DcOptimizer;\n microinverterResult?: AutoStringInverterQuery['component'];\n}) => {\n return useMemo(() => {\n const invertersToCheck =\n inverterType === AutoStringInverter.StringInverter\n ? [...inverters, ...(microinverterResult ? [microinverterResult] : [])]\n : [...microinverters];\n\n if (design?.temperatureMin == null || design?.temperatureMax == null) {\n return 'Set min and max temperature in the \"System\" tab of your design settings';\n }\n\n if (\n selectionType === AutoStringSelectionType.FillZone &&\n selectedFillZone?.solarPanelId == null\n ) {\n return 'Select only one fill zone';\n }\n\n if (solarPanel == null || (panelCount != null && panelCount < 2)) {\n return 'Select at least 2 modules';\n }\n\n if (invertersToCheck.length === 0) {\n return inverterType === AutoStringInverter.StringInverter\n ? 'Select an inverter'\n : 'Select an microinverter';\n }\n\n return checkStringingRules({\n dcOptimizer:\n inverterType === AutoStringInverter.StringInverter ? dcOptimizerResult : undefined,\n inverters: invertersToCheck,\n solarPanel: solarPanel as SolarPanel,\n temperatureMax: design?.temperatureMax,\n temperatureMin: design?.temperatureMin,\n })[0];\n }, [\n panelCount,\n design,\n microinverters,\n inverterType,\n inverters,\n solarPanel,\n dcOptimizerResult,\n microinverterResult,\n selectionType,\n selectedFillZone,\n ]);\n};\n","import { FC } from 'react';\nimport styled from 'styled-components';\n\nimport { NovoToastContainer } from '@aurorasolar/common-notifications';\n\nconst SPACER_HEIGHT = 46;\n\nconst CadToastGrow = styled.div`\n min-width: 0;\n width: 0;\n display: flex;\n height: 0;\n position: relative;\n top: -${SPACER_HEIGHT - 16}px;\n flex-wrap: wrap;\n flex: 1 1 33%;\n justify-content: center;\n align-items: flex-end;\n`;\nconst Spacer = styled.div`\n height: ${SPACER_HEIGHT}px;\n width: 0.5px;\n`;\n\nexport const CadToast: FC = () => {\n return (\n \n \n \n \n );\n};\n","import isChromatic from 'chromatic';\nimport { FunctionComponent } from 'react';\nimport styled from 'styled-components';\n\nimport { ITabsProps, Tabs } from '@blueprintjs/core';\n\nimport { Colors } from '../colors';\n\nexport interface IAuroraTabsProps extends ITabsProps {\n tabColor?: string;\n selectedTextColor?: string;\n notSelectedTextColor?: string;\n hoverTextColor?: string;\n}\n\nexport const UnderlineTabs = styled>((props) => (\n \n))`\n .bp3-tab[aria-selected='true'] {\n box-shadow: inset 0 -3px 0 ${(props: IAuroraTabsProps) => props.selectedTextColor ?? Colors.GRAY_800};\n color: ${(props: IAuroraTabsProps) => props.selectedTextColor ?? Colors.GRAY_800};\n }\n\n .bp3-tab-indicator {\n background-color: ${(props: IAuroraTabsProps) => props.tabColor ?? Colors.GRAY_800};\n }\n\n .bp3-tab {\n color: ${(props: IAuroraTabsProps) => props.notSelectedTextColor ?? Colors.GRAY_600};\n\n :hover {\n color: ${(props: IAuroraTabsProps) => props.hoverTextColor ?? Colors.GRAY_800};\n }\n }\n`;\n\nexport const PillTabs = styled>((props) => (\n \n))`\n && {\n .bp3-tab-list {\n z-index: 1;\n }\n\n .bp3-tab-list > *:not(:last-child) {\n margin-right: 0;\n }\n\n .bp3-tab-indicator-wrapper {\n height: 28px;\n margin-top: -4px;\n }\n\n .bp3-tab-indicator {\n border-radius: 12px;\n height: 28px;\n background-color: ${(props: IAuroraTabsProps) => props.tabColor || Colors.GRAY_200};\n }\n\n .bp3-tab {\n padding: 4px;\n z-index: 0;\n\n &[aria-selected='true'] {\n box-shadow: none !important;\n color: ${(props: IAuroraTabsProps) => props.selectedTextColor || Colors.GRAY_800};\n\n &::before {\n background-color: ${(props: IAuroraTabsProps) => props.tabColor || Colors.GRAY_200};\n border-radius: 12px;\n content: '';\n display: block;\n position: absolute;\n top: 6px;\n bottom: 4px;\n left: 1px;\n right: 0;\n z-index: -1;\n }\n\n button:hover {\n background-color: ${(props: IAuroraTabsProps) => props.tabColor || Colors.GRAY_200};\n }\n }\n\n button.bp3-button {\n border-radius: 12px;\n padding: 4px;\n min-height: 0;\n }\n\n color: ${(props: IAuroraTabsProps) => props.notSelectedTextColor || Colors.GRAY_600};\n\n :hover {\n color: ${(props: IAuroraTabsProps) => props.hoverTextColor || Colors.GRAY_800};\n }\n }\n\n .bp3-tab-indicator-wrapper ~ .bp3-tab[aria-selected='true']::before {\n display: none;\n }\n }\n`;\n","import { FunctionComponent, useState } from 'react';\nimport styled from 'styled-components';\n\nimport { AuroraThemedButton, AuroraThemedButtonIntent } from '@aurorasolar/common-core/src/button';\nimport { useLocaleFormat } from '@aurorasolar/common-core/src/hooks';\nimport { AuroraIcon, AuroraIconType } from '@aurorasolar/common-core/src/icon';\nimport { AuroraText, TextType } from '@aurorasolar/common-core/src/typography';\nimport { Collapse } from '@blueprintjs/core';\nimport { Box, Flex } from '@rebass/grid';\n\nimport { LossData, LossTreeCore } from './loss-tree';\n\nexport interface IAdvancedSectionCore {\n kwhPerKwp: number;\n performanceRatio: number;\n lossTreeData: LossData[][];\n simulationLogs: string[];\n}\n\nconst SimLog = styled.div`\n font-family: AndaleMono, monospace;\n line-height: 20px;\n`;\n\nexport const AdvancedSectionCore: FunctionComponent = ({\n kwhPerKwp,\n performanceRatio,\n lossTreeData,\n simulationLogs,\n}) => {\n const { formatNumber } = useLocaleFormat();\n\n const [simulationLogIsOpen, toggleSimulationLog] = useState(false);\n const [collapseIsOpen, toggleCollapse] = useState(false);\n const handleSimulationLog = () => {\n toggleSimulationLog(!simulationLogIsOpen);\n };\n const handleCollapse = () => {\n toggleCollapse(!collapseIsOpen);\n };\n\n return (\n \n \n Advanced\n \n \n \n \n \n \n \n yield\n \n
\n \n {formatNumber(kwhPerKwp, {\n maximumFractionDigits: 0,\n minimumFractionDigits: 0,\n })}\n kWh/kWp\n \n
\n
\n \n \n Performance Ratio\n \n
\n \n {formatNumber(performanceRatio, {\n maximumFractionDigits: 2,\n minimumFractionDigits: 2,\n })}\n \n
\n
\n
\n \n \n \n \n Simulation Logs\n \n \n \n \n {simulationLogs.map((simLogs, index) => (\n
{simLogs}
\n ))}\n
\n
\n
\n
\n
\n
\n
\n );\n};\n","import { DefaultTheme } from 'styled-components';\n\nexport type StyledSystemResponsiveValues =\n | T\n | T[]\n | (IsSmall extends true\n ? {\n sm: T;\n md?: T;\n lg?: T;\n }\n : IsSmall extends false\n ? {\n sm?: T;\n md: T;\n lg?: T;\n }\n : {\n sm?: T;\n md?: T;\n lg?: T;\n });\n\nexport type PotentialStyleValue = string | number | boolean | undefined | null;\n\nexport type ThemeWithBreakpoints = DefaultTheme & {\n breakpoints: string[] & { sm?: string; md?: string; lg?: string };\n};\n\nexport function buildResponsiveGridRule(\n values: ValueStructure,\n rule: string | ((value: PotentialStyleValue) => string),\n isSmall?: boolean,\n) {\n const makeRule =\n typeof rule === 'function'\n ? rule\n : (value: PotentialStyleValue) => (value !== undefined ? `${rule}: ${value};` : '');\n\n if (typeof values === 'object') {\n if (!isSmall) {\n if (Array.isArray(values)) {\n let modifiedArray = [...values];\n if (modifiedArray.length === 2) {\n modifiedArray = [modifiedArray[0], ...modifiedArray];\n }\n return responsive(modifiedArray, makeRule);\n }\n const modifiedValues = { ...values };\n modifiedValues.sm = modifiedValues.md;\n return responsive(modifiedValues, makeRule);\n }\n return responsive(values, makeRule);\n }\n\n return responsive(values, makeRule);\n}\n\ntype StyledComponentsFunction = (props: { theme: ThemeWithBreakpoints }) => string;\ntype ValueStructure =\n | PotentialStyleValue\n | { sm?: PotentialStyleValue; md?: PotentialStyleValue; lg?: PotentialStyleValue }\n | PotentialStyleValue[];\n\nexport function responsive(\n values: ValueType,\n ruleName: string,\n): StyledComponentsFunction;\nexport function responsive(\n values: ValueType,\n buildRule: (\n value: ValueType extends Array\n ? ValueType[number]\n : ValueType extends { [key: string]: PotentialStyleValue }\n ? ValueType[keyof ValueType]\n : PotentialStyleValue,\n key: ValueType extends { [key: string]: unknown } ? keyof ValueType : number,\n ) => string,\n): StyledComponentsFunction;\nexport function responsive(\n values: ValueType,\n rule: string | ((value: PotentialStyleValue, index: string | number) => string),\n): StyledComponentsFunction {\n const makeRule =\n typeof rule === 'function'\n ? rule\n : (value: PotentialStyleValue) => (value !== undefined ? `${rule}: ${value};` : '');\n\n switch (typeof values) {\n case 'object': {\n if (Array.isArray(values)) {\n return ({ theme }: { theme: ThemeWithBreakpoints }) => {\n const { breakpoints } = theme;\n return values\n .reduce((rules, value, index) => {\n const cssRule = makeRule(value, index);\n if (index === 0) {\n rules.push(cssRule);\n } else {\n const breakpoint = breakpoints[index - 1];\n if (breakpoint === undefined) {\n console.warn('Responsive rule out of range');\n } else {\n rules.push(`@media screen and (min-width: ${breakpoints[index - 1]}) {\n ${cssRule}\n }`);\n }\n }\n return rules;\n }, [] as string[])\n .join('\\n');\n };\n }\n return ({ theme }: { theme: ThemeWithBreakpoints }) => {\n const { breakpoints } = theme;\n const typedValues = {\n ...(values as {\n sm?: PotentialStyleValue;\n md?: PotentialStyleValue;\n lg?: PotentialStyleValue;\n }),\n };\n\n const mediumBreakpoint = breakpoints.md;\n const largeBreakpoint = breakpoints.lg;\n\n return `\n ${makeRule(typedValues.sm, 'sm')}\n @media screen and (min-width: ${mediumBreakpoint}) {\n ${makeRule(typedValues.md, 'md')}\n }\n @media screen and (min-width: ${largeBreakpoint}) {\n ${makeRule(typedValues.lg, 'lg')}\n }\n `;\n };\n }\n default: {\n return () => makeRule(values as PotentialStyleValue, 0);\n }\n }\n}\n","import { Box } from 'reflexbox/styled-components';\nimport styled from 'styled-components';\n\nimport { responsive, StyledSystemResponsiveValues } from './grid-shared';\n\nexport interface BoxGridProps {\n column?: StyledSystemResponsiveValues;\n columnStart?: StyledSystemResponsiveValues;\n columnEnd?: StyledSystemResponsiveValues;\n row?: StyledSystemResponsiveValues;\n rowStart?: StyledSystemResponsiveValues;\n rowEnd?: StyledSystemResponsiveValues;\n}\n\nexport const BoxGrid = styled(Box)`\n ${({ theme, column, columnEnd, columnStart, row, rowEnd, rowStart }) => `\n ${responsive(column, 'grid-column')({ theme })};\n ${responsive(columnStart, 'grid-column-start')({ theme })};\n ${responsive(columnEnd, 'grid-column-end')({ theme })};\n ${responsive(row, 'grid-row')({ theme })};\n ${responsive(rowStart, 'grid-row-start')({ theme })};\n ${responsive(rowEnd, 'grid-row-end')({ theme })};\n `}\n`;\n\nexport interface GridProps {\n columnGap?: StyledSystemResponsiveValues;\n columns?: StyledSystemResponsiveValues;\n gap?: StyledSystemResponsiveValues;\n rowGap?: StyledSystemResponsiveValues;\n rows?: StyledSystemResponsiveValues;\n gridFlow?: StyledSystemResponsiveValues<\n 'row' | 'column' | 'dense' | 'row dense' | 'column dense'\n >;\n}\n\nexport const Grid = styled(BoxGrid)`\n display: grid;\n ${({ columns, rows, columnGap, rowGap, gap, gridFlow, theme }) => `\n ${responsive(columns, 'grid-template-columns')({ theme })};\n ${responsive(rows, 'grid-template-rows')({ theme })};\n ${responsive(columnGap, 'column-gap')({ theme })};\n ${responsive(rowGap, 'row-gap')({ theme })};\n ${responsive(gap, 'grid-gap')({ theme })};\n ${responsive(gridFlow, 'grid-auto-flow')({ theme })};\n `}\n`;\n","export const MONTHS = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n];\n\nexport const MONTH_HEADER_LENGTH = 3;\n\nexport const THREE_LETTER_MONTH_ABBREVIATIONS = MONTHS.map((m) => m.slice(0, MONTH_HEADER_LENGTH));\n","import {\n CurrencyTypes,\n ElecRateType,\n ExportRule,\n NetSurplusCompensationType,\n RateTariff,\n} from '@aurorasolar/graphql-client-schema';\n\nexport enum FixedChargeUnit {\n DAY = 'day',\n MONTH = 'month',\n}\n\nexport enum MONTHLY_ANNUAL {\n MONTHLY = 'monthly',\n ANNUAL = 'annual',\n}\n\nexport interface FormItem {\n label: string;\n value: string | number;\n}\n\nexport interface BillSavingFormShape {\n id: string;\n exportRule: ExportRule | undefined;\n exportPenalty: number | undefined;\n elecRateType: ElecRateType | undefined;\n percentExport: number | undefined;\n flatExportRate: number | undefined;\n billingFrequency: MONTHLY_ANNUAL | undefined;\n trueUpPeriod: MONTHLY_ANNUAL | undefined;\n endOfBillingCycle: number | undefined;\n flatRate: number | undefined;\n netSurplusCompensation: number | undefined;\n netSurplusCompensationType: NetSurplusCompensationType | undefined;\n fixedCharge: number | undefined;\n fixedChargeUnit: FixedChargeUnit | undefined;\n minimumBill: number | undefined;\n minimumBillUnit: FixedChargeUnit | undefined;\n feedInTariffs: {\n id: string;\n startPeriod: number;\n rate: number;\n escalation: number;\n }[];\n preSolarTariff: RateTariff | undefined;\n postSolarTariff: RateTariff | undefined;\n preSolarEscalationRate: number | undefined;\n postSolarTariffOverwriteSettings: boolean;\n}\n\nexport interface BillSavingFormSharedProps {\n values: BillSavingFormShape;\n setFieldValue: (field: string, value: unknown) => void;\n submitForm: () => Promise;\n currency: CurrencyTypes;\n}\n","import { CURRENCIES, MONTHS } from '@aurorasolar/common-core/src/constants';\nimport {\n CurrencyTypes,\n ElecRateType,\n ExportRule,\n NetSurplusCompensationType,\n} from '@aurorasolar/graphql-client-schema';\n\nimport { FixedChargeUnit, MONTHLY_ANNUAL } from './shared-form-types';\n\nexport const EXPORT_RATE_OPTIONS = [\n { label: 'Retail Rate', value: ExportRule.RetailRate },\n { label: 'Retail Rate with Fixed Reduction', value: ExportRule.ExportPenalty },\n { label: 'Retails Rate with Percent Reduction', value: ExportRule.PercentExport },\n { label: 'Fixed Export Rate', value: ExportRule.FlatExportRate },\n { label: 'Schedule', value: ExportRule.Schedule },\n];\nexport const ELECTRICITY_RATE_TYPE = [\n { label: 'Net Energy Metering (Utility Rate)', value: ElecRateType.Tou },\n { label: 'Net Energy Metering (Quick Estimate)', value: ElecRateType.FlatRate },\n { label: 'Feed-in Tariff', value: ElecRateType.Fit },\n];\nexport const getFixedChargeUnitOptions = (currency: CurrencyTypes) => {\n const { symbol } = CURRENCIES[currency];\n\n return [\n { label: `${symbol}/day`, value: FixedChargeUnit.DAY },\n { label: `${symbol}/month`, value: FixedChargeUnit.MONTH },\n ];\n};\nexport const NET_SURPLUS_COMPENSATION_OPTIONS = [\n {\n label: 'Cash',\n value: NetSurplusCompensationType.Cash,\n },\n {\n label: 'Credit',\n value: NetSurplusCompensationType.Credit,\n },\n];\n\nexport const MONTHLY_ANNUAL_OPTIONS = [\n {\n label: 'Monthly',\n value: MONTHLY_ANNUAL.MONTHLY,\n },\n {\n label: 'Annual',\n value: MONTHLY_ANNUAL.ANNUAL,\n },\n];\nexport const MONTH_OPTIONS = MONTHS.map((month, index) => ({\n label: month,\n value: index + 1,\n}));\n\nexport const getBillingFrequencyOptions = (trueUpPeriod: string) =>\n trueUpPeriod === 'monthly' ? [MONTHLY_ANNUAL_OPTIONS[0]] : MONTHLY_ANNUAL_OPTIONS;\n\nexport const getTrueUpPeriodOptions = (billingFrequency: string) =>\n billingFrequency === 'monthly' ? MONTHLY_ANNUAL_OPTIONS : [MONTHLY_ANNUAL_OPTIONS[1]];\n","import styled from 'styled-components';\n\nimport { RoundedButton } from '@aurorasolar/common-core/src/button';\nimport { Colors } from '@aurorasolar/common-core/src/colors';\nimport { BoxGrid, Grid } from '@aurorasolar/common-core/src/grid';\nimport { AuroraIcon, AuroraIconType } from '@aurorasolar/common-core/src/icon';\nimport { AuroraNumericInput, NumericInputRightTag } from '@aurorasolar/common-core/src/input';\nimport { Text } from '@aurorasolar/common-core/src/typography';\nimport { CurrencyTypes } from '@aurorasolar/graphql-client-schema';\nimport { Box, Flex } from '@rebass/grid';\n\nimport { FormPricePerUnit, LabelWithTooltip } from '../shared/shared-form-components';\n\nconst Card = styled(Box)`\n background-color: ${Colors.GRAY_100};\n`;\n\nexport interface TariffCardProps {\n index: number;\n startPeriod: number;\n rate: number;\n escalation: number;\n onCardFieldEdit: (\n index: number,\n key: 'startPeriod' | 'rate' | 'escalation',\n value: number,\n ) => void;\n onBlur: () => void;\n onCardDelete: (index: number) => void;\n currency: CurrencyTypes;\n}\n\nexport const FeedInTariffCard = ({\n index,\n startPeriod,\n rate,\n escalation,\n onCardFieldEdit,\n onCardDelete,\n onBlur,\n currency,\n}: TariffCardProps) => {\n return (\n \n \n \n \n TARIFF {index + 1}\n \n {\n onCardDelete(index);\n }}\n >\n \n \n \n \n \n \n \n onCardFieldEdit(index, 'startPeriod', value)}\n value={startPeriod}\n />\n \n \n \n \n onCardFieldEdit(index, 'rate', value)}\n unit=\"kWh\"\n value={rate}\n />\n \n \n \n \n onCardFieldEdit(index, 'escalation', value)}\n rightElement={%}\n value={escalation}\n />\n \n \n \n \n );\n};\n","import { useState } from 'react';\nimport { Flex } from 'reflexbox/styled-components';\nimport styled from 'styled-components';\n\nimport { AuroraIcon, AuroraIconType } from '@aurorasolar/common-core/src/icon';\nimport { AuroraInputGroup } from '@aurorasolar/common-core/src/input';\nimport { Tariff } from '@aurorasolar/graphql-client-schema';\n\nimport { RateSelectionModalForm, RateSelectionModalOutput } from './rate-selection-modal-form';\n\nconst ReadOnlyAuroraInputGroup = styled(AuroraInputGroup)`\n cursor: pointer;\n\n &.bp3-input-group {\n width: 100%;\n }\n`;\n\ninterface RateSelectionModalProps {\n onTariffSearch: (query: string) => void;\n tariffOptions: Tariff[];\n onSave: (values: RateSelectionModalOutput) => Promise;\n defaultTariff: Tariff | undefined;\n defaultEscalationRate?: number | undefined;\n modalLabel: string;\n isPostSolar?: boolean;\n 'data-testid'?: string;\n}\n\nexport const RateSelectionModal = ({\n defaultTariff,\n onTariffSearch,\n tariffOptions,\n onSave,\n modalLabel,\n defaultEscalationRate,\n isPostSolar,\n 'data-testid': testId,\n}: RateSelectionModalProps) => {\n const [isOpen, setIsOpen] = useState(false);\n\n return (\n <>\n setIsOpen(true)}\n readOnly\n rightElement={\n setIsOpen(true)}\n >\n \n
\n }\n value={defaultTariff?.name ?? ''}\n />\n {isOpen && (\n setIsOpen(false)}\n defaultEscalationRate={defaultEscalationRate}\n defaultTariff={defaultTariff}\n isPostSolar={isPostSolar}\n modalLabel={modalLabel}\n onChangeTariff={onSave}\n onTariffSearch={onTariffSearch}\n tariffOptions={tariffOptions}\n />\n )}\n \n );\n};\n","import { FieldArray, Formik } from 'formik';\nimport styled from 'styled-components';\n\nimport { BoxGrid } from '@aurorasolar/common-core/src/grid';\nimport { CurrencyTypes, RateTariff } from '@aurorasolar/graphql-client-schema';\nimport { Collapse } from '@blueprintjs/core';\nimport { Flex } from '@rebass/grid';\n\nimport { FitForm } from './fit-form/fit-form';\nimport { FlatRateForm } from './flat-rate-form/flat-rate-form';\nimport { FormGridRow, FormSelectInput } from './shared/shared-form-components';\nimport { ELECTRICITY_RATE_TYPE } from './shared/shared-form-options';\nimport { BillSavingFormShape } from './shared/shared-form-types';\nimport { TouForm } from './tou-form/tou-form';\n\nconst SelectStyleOverwrite = styled(BoxGrid)`\n .bp3-popover-target .bp3-button {\n max-width: unset;\n }\n`;\n\ninterface BillSavingFormCoreProps {\n onSubmit: (\n values: BillSavingFormShape,\n updateForm: (newValue: BillSavingFormShape) => void,\n ) => Promise;\n preSolarTariffOptions: RateTariff[];\n searchPreSolarTariffs: (query: string) => void;\n postSolarTariffOptions: RateTariff[];\n searchPostSolarTariffs: (query: string) => void;\n currency: CurrencyTypes;\n initialValues: BillSavingFormShape;\n}\n\nexport const BillSavingFormCore = ({\n preSolarTariffOptions,\n searchPreSolarTariffs,\n postSolarTariffOptions,\n searchPostSolarTariffs,\n onSubmit,\n currency,\n initialValues,\n}: BillSavingFormCoreProps) => {\n return (\n {\n await onSubmit(values, (data) => setValues(data));\n }}\n >\n {({ values, submitForm, setFieldValue }) => (\n \n \n \n {\n setFieldValue('elecRateType', value);\n submitForm();\n }}\n value={ELECTRICITY_RATE_TYPE.find(({ value }) => value === values.elecRateType)}\n />\n \n \n \n \n \n \n \n \n \n \n {({ push, remove }) => (\n \n )}\n \n \n \n )}\n \n );\n};\n","// @ts-ignore: Ignore unused { * as Types } import\nimport * as Types from '@aurorasolar/graphql-client-schema';\n\nimport { gql } from '@apollo/client';\nimport { BillSavingAvoidedCostDataFragmentDoc, BillSavingProjectDataFragmentDoc } from '../../hooks/use-simulations/simulation-results.generated';\nimport * as Apollo from '@apollo/client';\nconst defaultOptions = {} as const;\nexport type BillSavingFormMutationVariables = Types.Exact<{\n id: Types.Scalars['ID'];\n updatedAvoidedCost: Types.UpdatedAvoidedCost;\n}>;\n\n\nexport type BillSavingFormMutation = { __typename: 'Mutation', updateAvoidedCost: { __typename: 'AvoidedCost', id: string, billingFrequency?: string | null | undefined, billOffset?: string | null | undefined, elecRateTypeStrict?: Types.ElecRateType | null | undefined, endOfBillingCycle?: number | null | undefined, exportPenalty?: number | null | undefined, exportRuleStrict?: Types.ExportRule | null | undefined, fixedCharge?: number | null | undefined, fixedChargeUnit?: string | null | undefined, flatExportRate?: number | null | undefined, flatRate: number, minimumBill?: number | null | undefined, minimumBillUnit?: string | null | undefined, monthlySaving?: number | null | undefined, name?: string | null | undefined, netSurplusCompensation?: number | null | undefined, netSurplusCompensationType?: Types.NetSurplusCompensationType | null | undefined, percentExport?: number | null | undefined, trueUpPeriod?: string | null | undefined, valid?: boolean | null | undefined, year1FitRevenues: Array, year1MonthlyPostSolarUtilBill: Array, year1PostSolarConsumption: number, year1PostSolarUtilBill: number, year1PostSolarDemandCharges: Array, year1PreSolarConsumption: number, year1PreSolarUtilBill: number, year1PreSolarDemandCharges: Array, feedInTariffs: Array<{ __typename: 'FeedInTariff', escalation: number, rate: number, startPeriod: number }>, postSolarTariff?: { __typename: 'Tariff', id: string, name?: string | null | undefined, tariffType?: Types.TariffType | null | undefined, tariffKey?: string | null | undefined } | { __typename: 'UtilityRateVersion', id: string, name?: string | null | undefined, tariffType?: Types.TariffType | null | undefined, tariffKey?: string | null | undefined } | null | undefined } };\n\nexport type UpdatePreSolarTariffMutationVariables = Types.Exact<{\n projectId: Types.Scalars['ID'];\n tariff?: Types.InputMaybe;\n escalationRate?: Types.InputMaybe;\n}>;\n\n\nexport type UpdatePreSolarTariffMutation = { __typename: 'Mutation', setTariffOnProject?: { __typename: 'Project', id: string, utilityRateEscalation?: number | null | undefined, projectType: Types.ProjectType, preSolarTariff?: { __typename: 'Tariff', id: string, name?: string | null | undefined, tariffType?: Types.TariffType | null | undefined, tariffKey?: string | null | undefined } | { __typename: 'UtilityRateVersion', id: string, name?: string | null | undefined, tariffType?: Types.TariffType | null | undefined, tariffKey?: string | null | undefined } | null | undefined } | null | undefined, updateProject?: { __typename: 'Project', id: string, utilityRateEscalation?: number | null | undefined } | null | undefined };\n\nexport type UpdateAvoidedCostSolarTariffMutationVariables = Types.Exact<{\n projectId: Types.Scalars['ID'];\n avoidedCostId: Types.Scalars['ID'];\n tariff?: Types.InputMaybe;\n overwriteAdvancedSettings?: Types.InputMaybe;\n}>;\n\n\nexport type UpdateAvoidedCostSolarTariffMutation = { __typename: 'Mutation', setPostSolarTariffOnAvoidedCost?: { __typename: 'AvoidedCost', id: string, billingFrequency?: string | null | undefined, billOffset?: string | null | undefined, elecRateTypeStrict?: Types.ElecRateType | null | undefined, endOfBillingCycle?: number | null | undefined, exportPenalty?: number | null | undefined, exportRuleStrict?: Types.ExportRule | null | undefined, fixedCharge?: number | null | undefined, fixedChargeUnit?: string | null | undefined, flatExportRate?: number | null | undefined, flatRate: number, minimumBill?: number | null | undefined, minimumBillUnit?: string | null | undefined, monthlySaving?: number | null | undefined, name?: string | null | undefined, netSurplusCompensation?: number | null | undefined, netSurplusCompensationType?: Types.NetSurplusCompensationType | null | undefined, percentExport?: number | null | undefined, trueUpPeriod?: string | null | undefined, valid?: boolean | null | undefined, year1FitRevenues: Array, year1MonthlyPostSolarUtilBill: Array, year1PostSolarConsumption: number, year1PostSolarUtilBill: number, year1PostSolarDemandCharges: Array, year1PreSolarConsumption: number, year1PreSolarUtilBill: number, year1PreSolarDemandCharges: Array, feedInTariffs: Array<{ __typename: 'FeedInTariff', escalation: number, rate: number, startPeriod: number }>, postSolarTariff?: { __typename: 'Tariff', id: string, name?: string | null | undefined, tariffType?: Types.TariffType | null | undefined, tariffKey?: string | null | undefined } | { __typename: 'UtilityRateVersion', id: string, name?: string | null | undefined, tariffType?: Types.TariffType | null | undefined, tariffKey?: string | null | undefined } | null | undefined } | null | undefined };\n\n\nexport const BillSavingFormDocument = gql`\n mutation BillSavingForm($id: ID!, $updatedAvoidedCost: UpdatedAvoidedCost!) @trace_info(traceInfo: {pod: consumption}) {\n updateAvoidedCost(id: $id, updatedAvoidedCost: $updatedAvoidedCost) {\n ...BillSavingAvoidedCostData\n }\n}\n ${BillSavingAvoidedCostDataFragmentDoc}`;\nexport type BillSavingFormMutationFn = Apollo.MutationFunction;\n\n/**\n * __useBillSavingFormMutation__\n *\n * To run a mutation, you first call `useBillSavingFormMutation` within a React component and pass it any options that fit your needs.\n * When your component renders, `useBillSavingFormMutation` returns a tuple that includes:\n * - A mutate function that you can call at any time to execute the mutation\n * - An object with fields that represent the current status of the mutation's execution\n *\n * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2;\n *\n * @example\n * const [billSavingFormMutation, { data, loading, error }] = useBillSavingFormMutation({\n * variables: {\n * id: // value for 'id'\n * updatedAvoidedCost: // value for 'updatedAvoidedCost'\n * },\n * });\n */\nexport function useBillSavingFormMutation(baseOptions?: Apollo.MutationHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useMutation(BillSavingFormDocument, options);\n }\nexport type BillSavingFormMutationHookResult = ReturnType;\nexport type BillSavingFormMutationResult = Apollo.MutationResult;\nexport type BillSavingFormMutationOptions = Apollo.BaseMutationOptions;\nexport const UpdatePreSolarTariffDocument = gql`\n mutation UpdatePreSolarTariff($projectId: ID!, $tariff: InputTariff, $escalationRate: Float) @trace_info(traceInfo: {pod: consumption}) {\n setTariffOnProject(projectId: $projectId, tariff: $tariff) {\n ...BillSavingProjectData\n }\n updateProject(project: {id: $projectId, utilityRateEscalation: $escalationRate}) {\n id\n utilityRateEscalation\n }\n}\n ${BillSavingProjectDataFragmentDoc}`;\nexport type UpdatePreSolarTariffMutationFn = Apollo.MutationFunction;\n\n/**\n * __useUpdatePreSolarTariffMutation__\n *\n * To run a mutation, you first call `useUpdatePreSolarTariffMutation` within a React component and pass it any options that fit your needs.\n * When your component renders, `useUpdatePreSolarTariffMutation` returns a tuple that includes:\n * - A mutate function that you can call at any time to execute the mutation\n * - An object with fields that represent the current status of the mutation's execution\n *\n * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2;\n *\n * @example\n * const [updatePreSolarTariffMutation, { data, loading, error }] = useUpdatePreSolarTariffMutation({\n * variables: {\n * projectId: // value for 'projectId'\n * tariff: // value for 'tariff'\n * escalationRate: // value for 'escalationRate'\n * },\n * });\n */\nexport function useUpdatePreSolarTariffMutation(baseOptions?: Apollo.MutationHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useMutation(UpdatePreSolarTariffDocument, options);\n }\nexport type UpdatePreSolarTariffMutationHookResult = ReturnType;\nexport type UpdatePreSolarTariffMutationResult = Apollo.MutationResult;\nexport type UpdatePreSolarTariffMutationOptions = Apollo.BaseMutationOptions;\nexport const UpdateAvoidedCostSolarTariffDocument = gql`\n mutation UpdateAvoidedCostSolarTariff($projectId: ID!, $avoidedCostId: ID!, $tariff: InputTariff, $overwriteAdvancedSettings: Boolean) @trace_info(traceInfo: {pod: consumption}) {\n setPostSolarTariffOnAvoidedCost(\n avoidedCostId: $avoidedCostId\n projectId: $projectId\n tariff: $tariff\n overwriteAdvancedSettings: $overwriteAdvancedSettings\n ) {\n ...BillSavingAvoidedCostData\n }\n}\n ${BillSavingAvoidedCostDataFragmentDoc}`;\nexport type UpdateAvoidedCostSolarTariffMutationFn = Apollo.MutationFunction;\n\n/**\n * __useUpdateAvoidedCostSolarTariffMutation__\n *\n * To run a mutation, you first call `useUpdateAvoidedCostSolarTariffMutation` within a React component and pass it any options that fit your needs.\n * When your component renders, `useUpdateAvoidedCostSolarTariffMutation` returns a tuple that includes:\n * - A mutate function that you can call at any time to execute the mutation\n * - An object with fields that represent the current status of the mutation's execution\n *\n * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2;\n *\n * @example\n * const [updateAvoidedCostSolarTariffMutation, { data, loading, error }] = useUpdateAvoidedCostSolarTariffMutation({\n * variables: {\n * projectId: // value for 'projectId'\n * avoidedCostId: // value for 'avoidedCostId'\n * tariff: // value for 'tariff'\n * overwriteAdvancedSettings: // value for 'overwriteAdvancedSettings'\n * },\n * });\n */\nexport function useUpdateAvoidedCostSolarTariffMutation(baseOptions?: Apollo.MutationHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useMutation(UpdateAvoidedCostSolarTariffDocument, options);\n }\nexport type UpdateAvoidedCostSolarTariffMutationHookResult = ReturnType;\nexport type UpdateAvoidedCostSolarTariffMutationResult = Apollo.MutationResult;\nexport type UpdateAvoidedCostSolarTariffMutationOptions = Apollo.BaseMutationOptions;","import styled from 'styled-components';\n\nimport { Colors } from '@aurorasolar/common-core/src/colors';\nimport { useLocaleFormat } from '@aurorasolar/common-core/src/hooks';\nimport { AuroraText, Text, TextType } from '@aurorasolar/common-core/src/typography';\nimport { Box, Flex } from '@rebass/grid';\n\ntype CADPerformanceCalloutStatType = {\n name: string;\n value: string | number;\n};\n\ninterface CADPerformanceCalloutProps {\n title: string;\n stats: Array;\n}\n\nconst StyledBox = styled(Box)`\n background-color: ${Colors.GRAY_100};\n border-radius: 5px;\n`;\n\nexport const CADPerformanceCallout = ({ title, stats }: CADPerformanceCalloutProps) => {\n const { formatNumber } = useLocaleFormat();\n\n return (\n \n \n \n \n \n {title}\n \n \n \n \n \n {stats.map((stat) => {\n return !stat ? null : (\n \n \n \n \n {typeof stat.value === 'string' ? stat.value : formatNumber(stat.value)}\n \n \n {stat.name}\n \n \n );\n })}\n \n \n \n \n );\n};\n","import React, { ReactNode, useContext, useEffect, useState } from 'react';\nimport { Observable } from 'rxjs';\n\nimport styled from '@xstyled/styled-components';\n\nimport { Chart } from '../types';\n\nimport type { TooltipDataPoints } from '../types';\n/**\n * Using the built in external tooltip support directly creates\n * a separate render pipeline that isn't a part of the normal react tree.\n * By using a ref callback we can get the tooltip info out of the chart\n * and into react.\n */\n\nexport interface TooltipData {\n animate: boolean;\n opacity: number;\n top: number;\n left: number;\n flip: boolean;\n dataPoints: TooltipDataPoints;\n}\n\nconst TooltipContext = React.createContext([]);\n\n/**\n * Provides information about the currently highlighted\n * datapoints\n */\nexport function useTooltipContext() {\n return useContext(TooltipContext);\n}\n\n/**\n * Calls the tooltipCallback with the current values\n */\nexport function externalTooltipFactory(\n onTooltipUpdate: (value: TooltipData) => void,\n animate: boolean,\n) {\n return ({ chart }: { chart: Chart }) => {\n if (!chart.tooltip) {\n return;\n }\n // Round down to prevent half-pixel rendering issues\n const left = Math.floor(chart.tooltip.caretX);\n const top = Math.floor(chart.tooltip.caretY);\n const flip = chart.tooltip?.caretX > chart.width / 2;\n const { opacity, dataPoints } = chart.tooltip;\n\n // All this data changes on each invocation so no need to memoize\n onTooltipUpdate({\n animate,\n dataPoints,\n flip,\n left,\n opacity,\n top,\n });\n };\n}\n\nconst tooltipOffset = 10;\n\nfunction buildTranslate(left: number, top: number, flip: boolean) {\n const yTranslate = `calc(-50% + ${top}px)`;\n const xTranslate = flip ? `calc(-100% + ${left - tooltipOffset}px)` : `${left + tooltipOffset}px`;\n\n return `translate(${xTranslate}, ${yTranslate})`;\n}\n\ninterface TooltipContainerProps {\n animate: boolean;\n top: number;\n left: number;\n flip: boolean;\n opacity: number;\n}\n/**\n * Positions the tooltip. Naive implementation that can\n * probably handle positioning better.\n */\nconst TooltipContainer = styled.div`\n opacity: ${({ opacity }) => opacity};\n position: absolute;\n pointer-events: none;\n transition: ${({ animate }) => (animate ? 'opacity 0.3s' : 'unset')};\n transform: ${({ left, top, flip }) => buildTranslate(left, top, flip)};\n top: 0;\n left: 0;\n z-index: ${({ theme }) => theme?.zIndices?.tooltip ?? 5};\n`;\n\ninterface TooltipPortalProps {\n tooltip$: Observable;\n children: ReactNode;\n}\n\nexport const CustomTooltip = ({ tooltip$, children }: TooltipPortalProps) => {\n const [tooltipState, setTooltipState] = useState({\n animate: true,\n dataPoints: [],\n flip: false,\n left: 0,\n opacity: 0,\n top: 0,\n });\n\n useEffect(() => {\n const subscription = tooltip$.subscribe((data) => {\n setTooltipState(data);\n });\n\n return () => {\n subscription.unsubscribe();\n };\n }, [tooltip$]);\n\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\nimport { Subject } from 'rxjs';\n\nimport { useInstanceRef } from '@aurorasolar/common-core/src/hooks';\nimport styled from '@xstyled/styled-components';\n\nimport { useChart } from './load-chart-library';\nimport type { Chart, ChartConfiguration, ChartDataset, ChartOptions, ChartType } from './types';\nimport { CustomTooltip, externalTooltipFactory, TooltipData } from './utils/custom-tooltip';\n\nfunction mergeWhileRetainingReference<\n Original = Record,\n NewProperties = Record,\n>(a: Original, b: NewProperties): NewProperties {\n // Must fully clear out object before adding new fields\n Object.keys(a).forEach((key) => {\n if (key !== '_meta') {\n delete a[key];\n }\n });\n Object.keys(b).forEach((key) => {\n a[key] = b[key];\n });\n\n return a as unknown as NewProperties;\n}\n\n// If we want the chart to animate we must maintain the chart dataset object references.\n// This assumes that data order doesn't change (if there are the same amount of sets)\nfunction useBuildChartDataset(data: ChartDataset[]) {\n const holder = React.useRef[]>([]);\n const [toReturn, setToReturn] = React.useState[]>([]);\n\n React.useEffect(() => {\n if (holder.current.length !== data.length) {\n holder.current = Array.from({ length: data.length }, () => ({} as ChartDataset));\n }\n const arr = holder.current;\n data.map((element, i) => mergeWhileRetainingReference(arr[i], element));\n setToReturn(arr);\n }, [data]);\n return toReturn;\n}\n\nfunction enableReactTooltip(\n options: Exclude['options'], Array>,\n hasReactTooltip: boolean,\n onTooltipUpdate: (value: TooltipData) => void,\n) {\n const optionsOrDefault =\n options ?? ({} as Exclude, undefined | Array>);\n\n if (!hasReactTooltip) {\n return optionsOrDefault;\n }\n\n return {\n ...optionsOrDefault,\n plugins: {\n ...(optionsOrDefault.plugins ?? {}),\n tooltip: {\n ...(optionsOrDefault.plugins?.tooltip ?? {}),\n enabled: false,\n external: externalTooltipFactory(onTooltipUpdate, optionsOrDefault.animation !== false),\n },\n },\n };\n}\n\nexport interface ChartCoreProps extends ChartConfiguration {\n options?: Exclude, Array>;\n // Making tooltip its own prop so changing it doesn't re-render the chart\n reactTooltip?: React.ReactElement;\n}\n\nconst ChartContainer = styled.div`\n position: relative;\n height: 100%;\n width: 100%;\n`;\n\n/** Simplified version of Chart.js component. Should only be used in the new-charts package internally */\nexport function ChartCore(props: ChartCoreProps) {\n const ChartImpl = useChart();\n const canvasRef = React.useRef();\n const chartInstance = React.useRef>();\n const tooltipSubjectRef = useInstanceRef(() => new Subject());\n\n // eslint-disable-next-line react/destructuring-assignment\n const datasets = useBuildChartDataset(props.data.datasets);\n const { reactTooltip } = props;\n\n const launchChart = React.useCallback(\n (node: HTMLCanvasElement | null) => {\n if (ChartImpl && node && node !== canvasRef.current) {\n canvasRef.current = node;\n chartInstance.current = new ChartImpl(node, {\n data: {\n ...props.data,\n datasets,\n },\n options: enableReactTooltip(props.options, !!props.reactTooltip, (data) =>\n tooltipSubjectRef.current.next(data),\n ),\n plugins: props.plugins,\n type: props.type,\n });\n }\n },\n [ChartImpl, props, datasets, tooltipSubjectRef],\n );\n\n React.useEffect(() => {\n if (chartInstance.current) {\n const chart = chartInstance.current;\n\n if (props.data) {\n chart.data = {\n ...props.data,\n datasets,\n };\n }\n if (props.options) {\n chart.options = enableReactTooltip(props.options, !!props.reactTooltip, (data) =>\n tooltipSubjectRef.current.next(data),\n );\n }\n\n chart.update();\n }\n }, [props, datasets, tooltipSubjectRef]);\n\n React.useEffect(() => {\n const observable$ = tooltipSubjectRef.current;\n\n return () => {\n observable$.complete();\n };\n }, [tooltipSubjectRef]);\n\n if (!ChartImpl) {\n return null;\n }\n\n return (\n \n \n {reactTooltip ? (\n \n {reactTooltip}\n \n ) : null}\n \n );\n}\n","import { FunctionComponent } from 'react';\n\nimport { StackSumChartProps } from '@aurorasolar/common-charts-lib';\nimport { CURRENCIES } from '@aurorasolar/common-core/src/constants';\nimport { FullDivider } from '@aurorasolar/common-core/src/divider';\nimport { IChartDataSet } from '@aurorasolar/common-deprecated-charts';\nimport { CurrencyTypes, ElecRateType } from '@aurorasolar/graphql-client-schema';\nimport { Box, Flex } from '@rebass/grid';\n\nimport { AdvancedSectionCore, IAdvancedSectionCore } from './advanced-section-core';\nimport { BillSavingForm } from './bill-saving-form/bill-saving-form';\nimport { AvoidedCostData, ProjectData } from './bill-saving-form/types';\nimport { CADPerformanceCallout } from './cad-performance-callout';\nimport { CadPerformanceDropdownGraphCore } from './cad-performance-dropdown-graph-core';\nimport { CadPerformanceStackedGraph } from './cad-performance-stacked-graph';\n\nexport const MONTHLY_FEED_IN_TARIFF_REVENUE = 'monthly feed-in tariff revenue';\nexport const MONTHLY_UTILITY_BILL_SAVINGS = 'monthly utility bill savings';\nconst PanelInnerWidth = 700;\n\nexport const UTILITY_BILL_PANEL_TEST_ID = 'utility-bill-savings-panel';\n\nexport const enum CADPerformancePanelType {\n PRODUCTION = 'production',\n SAVINGS = 'savings',\n}\n\nexport type CADPerformancePanelStatType = {\n name: string;\n value: string | number;\n};\n\nexport interface IPerformanceDropdownPanelProps {\n chartData: IChartDataSet[];\n calloutData: {\n offset: CADPerformancePanelStatType;\n panelCount?: CADPerformancePanelStatType;\n primaryStat: CADPerformancePanelStatType;\n };\n}\n\nexport interface IProductionPanelProps extends IPerformanceDropdownPanelProps {\n advancedData: IAdvancedSectionCore;\n}\n\nexport const ProductionPanel: FunctionComponent = ({\n chartData,\n calloutData,\n advancedData,\n}) => {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport interface IUtilityBillSavingPanelProps extends IPerformanceDropdownPanelProps {\n avoidedCostData: AvoidedCostData;\n projectData: ProjectData;\n currency: CurrencyTypes;\n performanceWithDemandChargesChartData: StackSumChartProps['datasets'];\n}\n\nexport const UtilityBillSavingPanel: FunctionComponent = ({\n chartData,\n calloutData,\n avoidedCostData,\n projectData,\n currency,\n performanceWithDemandChargesChartData,\n}) => {\n const hasDemandCharges =\n avoidedCostData.year1PreSolarDemandCharges.some((a) => a !== 0) ||\n avoidedCostData.year1PostSolarDemandCharges.some((a) => a !== 0);\n\n return (\n \n \n \n \n \n \n {hasDemandCharges && avoidedCostData.elecRateTypeStrict !== ElecRateType.Fit ? (\n \n ) : (\n \n )}\n\n \n \n \n );\n};\n","import styled from '@xstyled/styled-components';\nimport { FC, RefObject, useMemo } from 'react';\n\nimport { StackSumChartProps } from '@aurorasolar/common-charts-lib';\nimport { UnderlineTabs } from '@aurorasolar/common-core/src/tab';\nimport { CurrencyTypes } from '@aurorasolar/graphql-client-schema';\nimport { Overlay, Tab } from '@blueprintjs/core';\nimport { Box, Flex } from '@rebass/grid';\n\nimport { ProjectData } from './bill-saving-form/types';\nimport {\n CADPerformancePanelType,\n IPerformanceDropdownPanelProps,\n IProductionPanelProps,\n IUtilityBillSavingPanelProps,\n ProductionPanel,\n UtilityBillSavingPanel,\n} from './cad-performance-dropdown-panel';\n\nconst PerformanceDropdownWrapper = styled.div`\n position: absolute;\n overflow: hidden;\n overflow-y: auto;\n background: white;\n z-index: popover;\n top: 0;\n right: 0;\n bottom: 0;\n`;\n\nconst CustomTabs = styled(UnderlineTabs)`\n .bp3-tab-list > *:not(:last-child) {\n margin-right: 4px;\n }\n\n .bp3-tab-panel {\n margin-top: 0;\n }\n`;\n\nconst TabWidth = 180;\nexport interface CadPerformanceDropdownCoreProps {\n dropdownPortal?: RefObject;\n handleClose: () => void;\n isOpen: boolean;\n productionData: IProductionPanelProps;\n utilityBillSavingData: IPerformanceDropdownPanelProps; // TODO: change this for APP-223\n projectData: ProjectData;\n currency: CurrencyTypes;\n performanceWithDemandChargesChartData: StackSumChartProps['datasets'];\n}\n\nexport const CadPerformanceDropdownCore: FC = ({\n dropdownPortal,\n handleClose,\n isOpen,\n productionData,\n utilityBillSavingData,\n projectData,\n currency,\n performanceWithDemandChargesChartData,\n}) => {\n const tabs = useMemo(() => {\n return [\n {\n panel: ,\n text: 'Production',\n type: CADPerformancePanelType.PRODUCTION,\n },\n {\n panel: (\n \n ),\n text: 'Utility Bill Savings',\n type: CADPerformancePanelType.SAVINGS,\n },\n ].map(({ panel, text, type }) => (\n \n \n \n {text}\n \n \n \n ));\n }, [\n productionData,\n utilityBillSavingData,\n currency,\n projectData,\n performanceWithDemandChargesChartData,\n ]);\n\n return (\n \n \n \n \n {tabs}\n \n \n \n \n );\n};\n","import { FC } from 'react';\nimport styled from 'styled-components';\n\nimport { Colors } from '@aurorasolar/common-core/src/colors';\nimport { AuroraIcon, AuroraIconType } from '@aurorasolar/common-core/src/icon';\nimport { Text } from '@aurorasolar/common-core/src/typography';\nimport { formatOrNA } from '@aurorasolar/common-core/src/utils';\nimport { useIntl } from '@aurorasolar/intl';\nimport { Box, Flex } from '@rebass/grid';\n\nexport const BILL_SAVINGS_SUMMARY_TEST_ID = 'bill savings summary';\nexport const CAD_PERFORMANCE_DROPDOWN = 'cad-performance-dropdown';\n\nconst toKwString = (\n wattage: number,\n formatNumber?: (number: number, options?: Intl.NumberFormatOptions | undefined) => string,\n) =>\n formatNumber\n ? `${formatNumber(Math.round(wattage / 10) / 100)}kW`\n : `${(Math.round(wattage / 10) / 100).toLocaleString()}kW`;\n\nconst PerformanceSummaryArea = styled(Flex)`\n && {\n cursor: pointer;\n background: ${(props: { isDrawerOpen: boolean }) =>\n props.isDrawerOpen ? Colors.GRAY_200 : undefined};\n\n &:hover {\n background: ${Colors.GRAY_200};\n }\n }\n`;\n\nexport interface PerformaceSummaryProps {\n billSavingsValue: string;\n productionValue: string;\n systemSize?: number | null;\n toggleDrawer: () => void;\n isDrawerOpen: boolean;\n}\nexport const PerformanceSummary: FC = ({\n billSavingsValue,\n productionValue,\n systemSize,\n toggleDrawer,\n isDrawerOpen,\n}) => {\n const { formatNumber } = useIntl();\n return (\n \n \n \n \n \n \n {formatOrNA(systemSize, (value) => toKwString(value, formatNumber))}\n \n \n Size\n \n \n \n \n \n {productionValue}\n \n \n Production\n \n \n \n \n {billSavingsValue}\n \n \n Savings\n \n \n \n \n \n \n
\n \n );\n};\n","import { FC, useCallback, useMemo } from 'react';\n\nimport { AuroraThemedButton, AuroraThemedButtonIntent } from '@aurorasolar/common-core/src/button';\nimport { Analytics, AnalyticsEventTypes, useAppModule } from '@aurorasolar/common-module-loader';\nimport { Position, Tooltip } from '@blueprintjs/core';\n\nimport { SimulationRunResult, SimulationState } from '../../hooks';\n\nexport const SIMULATION_LOADING_ARIA_LABEL = 'simulation loading';\nexport const RUN_SIMULATION_ARIA_LABEL = 'run simulation';\n\nconst tooltipMap: Record = {\n [SimulationState.CanRun]: 'Run a Performance Simulation',\n [SimulationState.Running]: 'The Simulations are running',\n [SimulationState.CannotRunValid]: 'Make a change to Enable Performance Simulations',\n [SimulationState.CannotRunNoRoofs]: 'Add A Roof Face to Enable Performance Simulations',\n};\n\ninterface SimulationButtonProps {\n runSimulations: () => Promise;\n simulationState: SimulationState;\n}\n\nexport const SimulationButton: FC = ({\n runSimulations,\n simulationState,\n}) => {\n const tooltipMessage = useMemo(() => tooltipMap[simulationState], [simulationState]);\n const analytics = useAppModule(Analytics);\n const handleRunSimulations = useCallback(async () => {\n const result = await runSimulations();\n\n analytics?.track(\n AnalyticsEventTypes.DesignClickedSimulate,\n result.type === 'error'\n ? { error: true, error_type: result.error?.message ?? '' }\n : { error: false, error_type: '' },\n );\n }, [analytics, runSimulations]);\n\n return (\n \n \n Simulate\n \n \n );\n};\n","import { AiRoofType, AutoRoofCompletion, AutoRoofError } from '@aurorasolar/common-data-store';\nimport { AutoroofRequest } from '@aurorasolar/graphql-client-schema';\nimport { createMachine } from '@xstate/fsm';\n\nexport type AutoRoofEvent =\n | { type: 'TOOLBAR_ITEM_SELECTED'; roofType: AiRoofType }\n | { type: 'JOB_STARTED'; roofType: AiRoofType }\n | { type: 'JOB_CANCELLED'; roofType: AiRoofType }\n | { type: 'JOB_FINISHED'; results: AutoRoofCompletion }\n | { type: 'JOB_ERRORED'; results?: AutoRoofError }\n | { type: 'REQUEST_CAD_DATA' }\n | { type: 'MODAL_OVERRIDE_ROOFS_CLICKED'; roofType: AiRoofType }\n | { type: 'MODAL_KEEP_ROOFS_CLICKED'; roofType: AiRoofType }\n | { type: 'MODAL_CLOSED' }\n | { type: 'CHECK_PRERUN_REQUEST' }\n | { type: 'EXISTING_ROOF_QUERY_LOADED'; hasExistingRoof: boolean }\n | {\n type: 'DETERMINED_PRERUN_REQUEST';\n prerunRequest: AutoroofRequest | false;\n }\n | { type: 'RESULT_ACTION_CLICKED'; actionType: 'edit' | 'delete' | 'keep' };\n\ntype AutoRoofStates =\n | 'idle'\n | 'confirmingStart'\n | 'running'\n | 'checkingForExistingRoofs'\n | 'checkingForPrerunRequests';\n\ninterface AutoRoofState {\n value: AutoRoofStates;\n context: { roofType: AiRoofType };\n}\n\nexport const autoRoofMachine = createMachine<\n { roofType: AiRoofType },\n AutoRoofEvent,\n AutoRoofState\n>({\n context: { roofType: AiRoofType.RoofPlane },\n id: 'autoRoof',\n initial: 'checkingForPrerunRequests',\n states: {\n checkingForExistingRoofs: {\n entry: 'checkIfCadHasExistingRoof',\n on: {\n EXISTING_ROOF_QUERY_LOADED: [\n {\n // If there is an existing roof, open the modal.\n cond: (_, { hasExistingRoof }) => hasExistingRoof,\n target: 'confirmingStart',\n },\n {\n // If no roof already exists, just run the job\n actions: ['startJob', 'startJobWithNoExistingRoof'],\n cond: (_, { hasExistingRoof }) => !hasExistingRoof,\n },\n ],\n JOB_STARTED: {\n actions: 'setRoofType',\n target: 'running',\n },\n },\n },\n checkingForPrerunRequests: {\n on: {\n CHECK_PRERUN_REQUEST: {\n actions: 'checkIfHasPrerunRequest',\n },\n DETERMINED_PRERUN_REQUEST: [\n {\n // If no AutoRoofRequest, do nothing on start\n cond: (_, { prerunRequest }) => !prerunRequest,\n target: 'idle',\n },\n {\n // If AutoRoofRequest exists, fetch results\n actions: ['fetchResults'],\n cond: (_, { prerunRequest }) => !!prerunRequest,\n target: 'running',\n },\n ],\n },\n },\n confirmingStart: {\n on: {\n JOB_STARTED: {\n actions: 'setRoofType',\n target: 'running',\n },\n MODAL_CLOSED: {\n target: 'idle',\n },\n MODAL_KEEP_ROOFS_CLICKED: {\n actions: 'startJob',\n },\n MODAL_OVERRIDE_ROOFS_CLICKED: {\n actions: ['clearRoofs', 'startJob'],\n },\n },\n },\n idle: {\n on: {\n TOOLBAR_ITEM_SELECTED: {\n actions: 'setRoofType',\n target: 'checkingForExistingRoofs',\n },\n },\n },\n running: {\n entry: 'emitRunningTrue',\n exit: 'emitRunningFalse',\n on: {\n JOB_CANCELLED: {\n actions: 'showCancelToast',\n target: 'idle',\n },\n JOB_ERRORED: {\n actions: 'showErrorToast',\n target: 'idle',\n },\n JOB_FINISHED: {\n actions: 'showSuccessToast',\n target: 'idle',\n },\n },\n },\n },\n});\n","// @ts-ignore: Ignore unused { * as Types } import\nimport * as Types from '@aurorasolar/graphql-client-schema';\n\nimport { gql } from '@apollo/client';\nimport * as Apollo from '@apollo/client';\nconst defaultOptions = {} as const;\nexport type RoofCountQueryVariables = Types.Exact<{ [key: string]: never; }>;\n\n\nexport type RoofCountQuery = { __typename: 'Query', cadState: { __typename: 'CAD', roofCount: number } };\n\nexport type CadModalQueryVariables = Types.Exact<{ [key: string]: never; }>;\n\n\nexport type CadModalQuery = { __typename: 'Query', cadState: { __typename: 'CAD', activeModal?: Types.CadModal | null | undefined, activeModalData?: any | null | undefined } };\n\nexport type AutoRoofRunningStateQueryVariables = Types.Exact<{ [key: string]: never; }>;\n\n\nexport type AutoRoofRunningStateQuery = { __typename: 'Query', cadState: { __typename: 'CAD', isAutoRoofRunning: boolean } };\n\nexport type UpdateAutoroofRequestMutationVariables = Types.Exact<{\n updatedAutoroofRequest: Types.AutoRoofRequestInput;\n id: Types.Scalars['ID'];\n}>;\n\n\nexport type UpdateAutoroofRequestMutation = { __typename: 'Mutation', updateAutoroofRequest?: { __typename: 'AutoroofRequest', id?: string | null | undefined, state?: string | null | undefined } | null | undefined };\n\nexport type CancelAutoroofRequestMutationVariables = Types.Exact<{\n id: Types.Scalars['ID'];\n}>;\n\n\nexport type CancelAutoroofRequestMutation = { __typename: 'Mutation', cancelAutoroofRequest: string };\n\n\nexport const RoofCountDocument = gql`\n query RoofCount @trace_info(traceInfo: {pod: cad}) {\n cadState: CAD @client {\n roofCount\n }\n}\n `;\n\n/**\n * __useRoofCountQuery__\n *\n * To run a query within a React component, call `useRoofCountQuery` and pass it any options that fit your needs.\n * When your component renders, `useRoofCountQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useRoofCountQuery({\n * variables: {\n * },\n * });\n */\nexport function useRoofCountQuery(baseOptions?: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(RoofCountDocument, options);\n }\nexport function useRoofCountLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(RoofCountDocument, options);\n }\nexport type RoofCountQueryHookResult = ReturnType;\nexport type RoofCountLazyQueryHookResult = ReturnType;\nexport type RoofCountQueryResult = Apollo.QueryResult;\nexport const CadModalDocument = gql`\n query CadModal @trace_info(traceInfo: {pod: cad}) {\n cadState: CAD @client {\n activeModal\n activeModalData\n }\n}\n `;\n\n/**\n * __useCadModalQuery__\n *\n * To run a query within a React component, call `useCadModalQuery` and pass it any options that fit your needs.\n * When your component renders, `useCadModalQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useCadModalQuery({\n * variables: {\n * },\n * });\n */\nexport function useCadModalQuery(baseOptions?: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(CadModalDocument, options);\n }\nexport function useCadModalLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(CadModalDocument, options);\n }\nexport type CadModalQueryHookResult = ReturnType;\nexport type CadModalLazyQueryHookResult = ReturnType;\nexport type CadModalQueryResult = Apollo.QueryResult;\nexport const AutoRoofRunningStateDocument = gql`\n query AutoRoofRunningState @trace_info(traceInfo: {pod: cad}) {\n cadState: CAD @client {\n isAutoRoofRunning\n }\n}\n `;\n\n/**\n * __useAutoRoofRunningStateQuery__\n *\n * To run a query within a React component, call `useAutoRoofRunningStateQuery` and pass it any options that fit your needs.\n * When your component renders, `useAutoRoofRunningStateQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useAutoRoofRunningStateQuery({\n * variables: {\n * },\n * });\n */\nexport function useAutoRoofRunningStateQuery(baseOptions?: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(AutoRoofRunningStateDocument, options);\n }\nexport function useAutoRoofRunningStateLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(AutoRoofRunningStateDocument, options);\n }\nexport type AutoRoofRunningStateQueryHookResult = ReturnType;\nexport type AutoRoofRunningStateLazyQueryHookResult = ReturnType;\nexport type AutoRoofRunningStateQueryResult = Apollo.QueryResult;\nexport const UpdateAutoroofRequestDocument = gql`\n mutation UpdateAutoroofRequest($updatedAutoroofRequest: AutoRoofRequestInput!, $id: ID!) @trace_info(traceInfo: {pod: cad}) {\n updateAutoroofRequest(updatedAutoroofRequest: $updatedAutoroofRequest, id: $id) {\n id\n state\n }\n}\n `;\nexport type UpdateAutoroofRequestMutationFn = Apollo.MutationFunction;\n\n/**\n * __useUpdateAutoroofRequestMutation__\n *\n * To run a mutation, you first call `useUpdateAutoroofRequestMutation` within a React component and pass it any options that fit your needs.\n * When your component renders, `useUpdateAutoroofRequestMutation` returns a tuple that includes:\n * - A mutate function that you can call at any time to execute the mutation\n * - An object with fields that represent the current status of the mutation's execution\n *\n * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2;\n *\n * @example\n * const [updateAutoroofRequestMutation, { data, loading, error }] = useUpdateAutoroofRequestMutation({\n * variables: {\n * updatedAutoroofRequest: // value for 'updatedAutoroofRequest'\n * id: // value for 'id'\n * },\n * });\n */\nexport function useUpdateAutoroofRequestMutation(baseOptions?: Apollo.MutationHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useMutation(UpdateAutoroofRequestDocument, options);\n }\nexport type UpdateAutoroofRequestMutationHookResult = ReturnType;\nexport type UpdateAutoroofRequestMutationResult = Apollo.MutationResult;\nexport type UpdateAutoroofRequestMutationOptions = Apollo.BaseMutationOptions;\nexport const CancelAutoroofRequestDocument = gql`\n mutation CancelAutoroofRequest($id: ID!) @trace_info(traceInfo: {pod: cad}) {\n cancelAutoroofRequest(id: $id)\n}\n `;\nexport type CancelAutoroofRequestMutationFn = Apollo.MutationFunction;\n\n/**\n * __useCancelAutoroofRequestMutation__\n *\n * To run a mutation, you first call `useCancelAutoroofRequestMutation` within a React component and pass it any options that fit your needs.\n * When your component renders, `useCancelAutoroofRequestMutation` returns a tuple that includes:\n * - A mutate function that you can call at any time to execute the mutation\n * - An object with fields that represent the current status of the mutation's execution\n *\n * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2;\n *\n * @example\n * const [cancelAutoroofRequestMutation, { data, loading, error }] = useCancelAutoroofRequestMutation({\n * variables: {\n * id: // value for 'id'\n * },\n * });\n */\nexport function useCancelAutoroofRequestMutation(baseOptions?: Apollo.MutationHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useMutation(CancelAutoroofRequestDocument, options);\n }\nexport type CancelAutoroofRequestMutationHookResult = ReturnType;\nexport type CancelAutoroofRequestMutationResult = Apollo.MutationResult;\nexport type CancelAutoroofRequestMutationOptions = Apollo.BaseMutationOptions;","// USER LEVEL\nexport const ADMIN_USER_LEVEL = 'Admin';\nexport const TEAM_MEMBER_USER_LEVEL = 'Team Member';\nexport const LIMITED_TEAM_MEMBER_USER_LEVEL = 'Limited Team Member';\n\n// ACCOUNT TYPE\nexport const ENTERPRISE_ACCOUNT_TYPE = 'Enterprise Account';\nexport const DESIGN_ACCOUNT_TYPE = 'Design Account';\n\n// ELEVATION TENANT IDS\nconst ELEVATION_SOLAR_PRODUCTION_TENANT_ID = 'c7082ecd-52e6-4bc6-a5ce-775d30e45a67';\nconst ELEVATION_SOLAR_SANDBOX_TENANT_ID = 'd38ed100-8b51-4be7-8f42-edabe83ea6e2';\nexport const ELEVATION_TENANT_IDS = [\n ELEVATION_SOLAR_PRODUCTION_TENANT_ID,\n ELEVATION_SOLAR_SANDBOX_TENANT_ID,\n];\n\n// MODERN CONCEPTS TENANT ID\nexport const MODERN_CONCEPTS_PRODUCTION_TENANT_ID = '2265c7ac-de77-47c5-baa4-e9863ecb2cb7';\n\n// FREEDOM FOREVER TENANT ID\nexport const FREEDOM_FOREVER_PRODUCTION_TENANT_ID = 'dd2290f8-d7a2-48e6-b866-d7ff1a7f58c1';\nexport const FREEDOM_FOREVER_SANDBOX_TENANT_ID_1 = '3c6c21d3-e85e-44da-ab02-f3de36b64cc1';\nexport const FREEDOM_FOREVER_SANDBOX_TENANT_ID_2 = 'a9acbfa8-9754-4ce7-b773-7e9eeb79e24b';\nexport const FREEDOM_FOREVER_SANDBOX_TENANT_ID_3 = 'c8511deb-a979-48fc-aed7-40db6b56bb4d';\nexport const FREEDOM_FOREVER_TENANT_IDS = [\n FREEDOM_FOREVER_PRODUCTION_TENANT_ID,\n FREEDOM_FOREVER_SANDBOX_TENANT_ID_1,\n FREEDOM_FOREVER_SANDBOX_TENANT_ID_2,\n FREEDOM_FOREVER_SANDBOX_TENANT_ID_3,\n];\n\n// EMPOWER HOME SOLAR TENANT ID\nexport const EMPOWER_HOME_SOLAR_SANDBOX_TENANT_ID = 'e2854770-e5f5-4a66-82db-120fb08a9030';\nexport const EMPOWER_HOME_SOLAR_PRODUCTION_TENANT_ID = '288b84f6-363e-4d9d-a7d9-96e5e58607f0';\nexport const EMPOWER_HOME_SOLAR_TENANT_IDS = [\n EMPOWER_HOME_SOLAR_SANDBOX_TENANT_ID,\n EMPOWER_HOME_SOLAR_PRODUCTION_TENANT_ID,\n];\n\nexport const GAS_FAST_PRODUCTION_TENANT_ID = '76cd9651-4966-49d4-b170-5a79b7467570';\n\n// SALES MODE FEATURES\n// SALES MODE EXIT BUTTON\nexport const SALES_MODE_EXIT_BUTTON_TENANT_IDS = [...FREEDOM_FOREVER_TENANT_IDS];\n","import { PermissionsMode, Role, RolePermission } from '@aurorasolar/graphql-client-schema';\n\nexport enum UserAccountType {\n Engineering = 'Engineering',\n Designer = 'Designer',\n Sales = 'Sales',\n Unassigned = 'Unassigned',\n}\n\nexport interface OrgPermissionAttributes {\n email: string;\n isAuroraAdmin: boolean;\n isSecureMode: boolean;\n permissionsMode: PermissionsMode;\n tenantAccountType: string;\n tenantId: string;\n userAccountType: UserAccountType;\n userLevel: string;\n recurlyEnabled: boolean;\n rolePermissions: RolePermission;\n role: Omit;\n partnerId: string | undefined | null;\n teamIds: string[] | undefined;\n}\n","import { PermissionsMode } from '@aurorasolar/graphql-client-schema';\n\nimport {\n ADMIN_USER_LEVEL,\n DESIGN_ACCOUNT_TYPE,\n ELEVATION_TENANT_IDS,\n EMPOWER_HOME_SOLAR_TENANT_IDS,\n ENTERPRISE_ACCOUNT_TYPE,\n FREEDOM_FOREVER_TENANT_IDS,\n GAS_FAST_PRODUCTION_TENANT_ID,\n LIMITED_TEAM_MEMBER_USER_LEVEL,\n MODERN_CONCEPTS_PRODUCTION_TENANT_ID,\n SALES_MODE_EXIT_BUTTON_TENANT_IDS,\n TEAM_MEMBER_USER_LEVEL,\n} from './constants';\nimport { OrgPermissionAttributes, UserAccountType } from './type';\n\nexport const isAuroraUser = ({ email }: OrgPermissionAttributes) =>\n email.endsWith('aurorasolar.com');\nexport const isAuroraAdmin = ({ isAuroraAdmin: _isAuroraAdmin }: OrgPermissionAttributes) =>\n _isAuroraAdmin;\n// USER LEVEL & ROLE\nexport const isAdmin = ({ userLevel }: OrgPermissionAttributes) => userLevel === ADMIN_USER_LEVEL;\nexport const isTeamMember = ({ role }: OrgPermissionAttributes) =>\n role.name === TEAM_MEMBER_USER_LEVEL && !role.custom;\nexport const isLimitedTeamMember = ({ role }: OrgPermissionAttributes) =>\n role.name === LIMITED_TEAM_MEMBER_USER_LEVEL && !role.custom;\n// USER ACCOUNT TYPE\nexport const isPremiumAccount = ({ userAccountType }: OrgPermissionAttributes) =>\n userAccountType === UserAccountType.Engineering;\nexport const isDesignerAccount = ({ userAccountType }: OrgPermissionAttributes) =>\n userAccountType === UserAccountType.Designer; // Note: \"Designer\" account is meant for 3DMS users only.\nexport const isBasicAccount = ({ userAccountType }: OrgPermissionAttributes) =>\n userAccountType === UserAccountType.Sales;\n// TENANT ACCOUNT TYPE\nexport const isEnterpriseAccount = ({ tenantAccountType }: OrgPermissionAttributes) =>\n tenantAccountType === ENTERPRISE_ACCOUNT_TYPE;\nexport const isDesignAccount = ({ tenantAccountType }: OrgPermissionAttributes) =>\n tenantAccountType === DESIGN_ACCOUNT_TYPE;\nexport const isRecurlyEnabled = ({ recurlyEnabled }: OrgPermissionAttributes) => recurlyEnabled;\nexport const isSecureMode = (props: OrgPermissionAttributes) => props.isSecureMode;\n// TENANT IDS\nexport const isElevationTenant = ({ tenantId }: OrgPermissionAttributes) =>\n ELEVATION_TENANT_IDS.includes(tenantId);\nexport const isEmpowerHomeSolarTenant = ({ tenantId }: OrgPermissionAttributes) =>\n EMPOWER_HOME_SOLAR_TENANT_IDS.includes(tenantId);\nexport const isGasFastTenant = ({ tenantId }: OrgPermissionAttributes) =>\n tenantId === GAS_FAST_PRODUCTION_TENANT_ID;\n// TENANT PERMISSIONS MODE\nexport const isLockedMode = ({ permissionsMode }: OrgPermissionAttributes) =>\n permissionsMode === PermissionsMode.Restricted;\nexport const isUnlockedMode = ({ permissionsMode }: OrgPermissionAttributes) =>\n permissionsMode === PermissionsMode.Open;\nexport const isModernConceptsTenant = ({ tenantId }: OrgPermissionAttributes) =>\n tenantId === MODERN_CONCEPTS_PRODUCTION_TENANT_ID;\nexport const isFreedomForeverTenant = ({ tenantId }: OrgPermissionAttributes) =>\n FREEDOM_FOREVER_TENANT_IDS.includes(tenantId);\nexport const isSalesModeExitButtonTenant = ({ tenantId }: OrgPermissionAttributes) =>\n SALES_MODE_EXIT_BUTTON_TENANT_IDS.includes(tenantId);\n// role permissions\nexport const canAccessDesignMode = ({ rolePermissions }: OrgPermissionAttributes) =>\n !!rolePermissions.accessDesignMode;\nexport const canEditSiteMode = ({ rolePermissions }: OrgPermissionAttributes) =>\n !!rolePermissions.editSiteModel;\nexport const canEditPricing = ({ rolePermissions }: OrgPermissionAttributes) =>\n !!rolePermissions.updatePricing;\nexport const canCreateProjects = ({ rolePermissions }: OrgPermissionAttributes) =>\n !!rolePermissions.createProjects;\nexport const canAccessDatabase = ({ rolePermissions }: OrgPermissionAttributes) =>\n !!rolePermissions.accessDatabasePage;\nexport const canAccessProjectIndex = ({ rolePermissions }: OrgPermissionAttributes) =>\n !!rolePermissions.accessProjectIndexPage;\n// Partner\nexport const isEPCTenant = ({ partnerId }: OrgPermissionAttributes) => !partnerId;\nexport const isTenantTeamlessTeamMember = ({ partnerId, teamIds, role }: OrgPermissionAttributes) =>\n !partnerId && !teamIds?.length && role.name === TEAM_MEMBER_USER_LEVEL && !role.custom;\n","import { OrgPermission } from '@aurorasolar/common-module-loader';\n\nimport {\n canAccessDatabase,\n canAccessDesignMode,\n canAccessProjectIndex,\n canCreateProjects,\n canEditPricing,\n canEditSiteMode,\n isAdmin,\n isAuroraAdmin,\n isDesignAccount,\n isDesignerAccount,\n isElevationTenant,\n isEmpowerHomeSolarTenant,\n isEnterpriseAccount,\n isEPCTenant,\n isFreedomForeverTenant,\n isGasFastTenant,\n isLimitedTeamMember,\n isModernConceptsTenant,\n isPremiumAccount,\n isRecurlyEnabled,\n isSalesModeExitButtonTenant,\n isSecureMode,\n isTeamMember,\n isTenantTeamlessTeamMember,\n isUnlockedMode,\n} from './segment';\nimport { OrgPermissionAttributes } from './type';\n\ninterface OrgPermissionCheck {\n condition: {\n fn: (props: OrgPermissionAttributes) => boolean;\n value: boolean;\n };\n default: boolean;\n}\n\nconst PERMISSIONS: Record = {\n [OrgPermission.RouterAuthorizationForbidUtilityAndTaxRates]: {\n condition: {\n fn: (props) => isAdmin(props) && !isDesignAccount(props),\n value: false,\n },\n default: true,\n },\n [OrgPermission.RouterAuthorizationForbidSettingSalesAgreement]: {\n condition: {\n fn: (props) => isAdmin(props) && !isDesignAccount(props),\n value: false,\n },\n default: true,\n },\n [OrgPermission.RouterAuthorizationForbidSettingApiSettings]: {\n condition: {\n fn: (props) => {\n return (\n (isAdmin(props) && isEnterpriseAccount(props)) ||\n (isAuroraAdmin(props) && isEnterpriseAccount(props))\n );\n },\n value: false,\n },\n default: true,\n },\n [OrgPermission.RouterAuthorizationForbidSettingBilling]: {\n condition: {\n fn: (props) => isAdmin(props) && !isEnterpriseAccount(props) && isRecurlyEnabled(props),\n value: false,\n },\n default: true,\n },\n [OrgPermission.RouterAuthorizationForbidSettingDesign]: {\n condition: {\n fn: (props) => isAdmin(props) && !isDesignAccount(props),\n value: false,\n },\n default: true,\n },\n [OrgPermission.RouterAuthorizationForbidSettingFinancing]: {\n condition: {\n fn: (props) => isAdmin(props) && !isDesignAccount(props),\n value: false,\n },\n default: true,\n },\n [OrgPermission.RouterAuthorizationForbidSettingGeneral]: {\n condition: {\n fn: isAdmin,\n value: false,\n },\n default: true,\n },\n [OrgPermission.RouterAuthorizationForbidSettingOnDemandServices]: {\n condition: {\n fn: (props) => isAdmin(props) && !isEnterpriseAccount(props) && isRecurlyEnabled(props),\n value: false,\n },\n default: true,\n },\n [OrgPermission.RouterAuthorizationForbidSettingPerformanceSimulation]: {\n condition: {\n fn: (props) => isAdmin(props) && !isDesignAccount(props),\n value: false,\n },\n default: true,\n },\n [OrgPermission.RouterAuthorizationForbidSettingUsersAndLicenses]: {\n condition: {\n fn: isAdmin,\n value: false,\n },\n default: true,\n },\n [OrgPermission.RouterAuthorizationForbidSettingPdfTemplates]: {\n condition: {\n fn: isAdmin,\n value: false,\n },\n default: true,\n },\n [OrgPermission.RouterAuthorizationForbidPartners]: {\n condition: {\n fn: (props: OrgPermissionAttributes) =>\n isAdmin(props) && isEPCTenant(props) && !isDesignAccount(props),\n value: false,\n },\n default: true,\n },\n [OrgPermission.RouterAuthorizationForbidLeads]: {\n condition: {\n fn: (props: OrgPermissionAttributes) => !isDesignAccount(props),\n value: false,\n },\n default: true,\n },\n [OrgPermission.RouterAuthorizationForbidLeadCaptureSettings]: {\n condition: {\n fn: (props: OrgPermissionAttributes) => isAdmin(props) && !isDesignAccount(props),\n value: false,\n },\n default: true,\n },\n [OrgPermission.RouterAuthorizationForbidPlanSets]: {\n condition: {\n fn: (props) => !isDesignAccount(props),\n value: true,\n },\n default: false,\n },\n [OrgPermission.RouterAuthorizationForbidDatabase]: {\n condition: {\n fn: (props) =>\n !canAccessDatabase(props) ||\n (isTeamMember(props) && isElevationTenant(props)) ||\n (isFreedomForeverTenant(props) && (isLimitedTeamMember(props) || isTeamMember(props))) ||\n (isEmpowerHomeSolarTenant(props) && (isLimitedTeamMember(props) || isTeamMember(props))),\n value: true,\n },\n default: false,\n },\n [OrgPermission.RouterAuthorizationForbidProjectIndex]: {\n condition: {\n fn: (props) =>\n !canAccessProjectIndex(props) ||\n isDesignAccount(props) ||\n (isTeamMember(props) && isElevationTenant(props)) ||\n (isTeamMember(props) && isModernConceptsTenant(props)) ||\n ((isTeamMember(props) || isLimitedTeamMember(props)) && isFreedomForeverTenant(props)) ||\n ((isTeamMember(props) || isLimitedTeamMember(props)) && isGasFastTenant(props)) ||\n isDesignerAccount(props),\n value: true,\n },\n default: false,\n },\n [OrgPermission.RouterAuthorizationForbidSetting]: {\n condition: {\n fn: (props) =>\n (isTeamMember(props) && isElevationTenant(props)) ||\n (isFreedomForeverTenant(props) && (isLimitedTeamMember(props) || isTeamMember(props))) ||\n (isEmpowerHomeSolarTenant(props) && (isLimitedTeamMember(props) || isTeamMember(props))),\n value: true,\n },\n default: false,\n },\n [OrgPermission.RouterAuthorizationForbidSettingPricingGeneral]: {\n condition: {\n fn: (props) => isAdmin(props) && !isDesignAccount(props),\n value: false,\n },\n default: true,\n },\n [OrgPermission.RouterAuthorizationForbidDatabaseAddersAndDiscounts]: {\n condition: {\n fn: isAdmin,\n value: false,\n },\n default: true,\n },\n [OrgPermission.HideProjectAssigneeFilter]: {\n condition: {\n fn: isLimitedTeamMember,\n value: true,\n },\n default: false,\n },\n [OrgPermission.RouterAuthorizationForbidDesignMode]: {\n condition: {\n fn: (props) =>\n (isFreedomForeverTenant(props) && (isLimitedTeamMember(props) || isTeamMember(props))) ||\n !canAccessDesignMode(props),\n value: true,\n },\n default: false,\n },\n [OrgPermission.RouterAuthorizationForbidProjectOverview]: {\n condition: {\n fn: (props) => isDesignAccount(props),\n value: true,\n },\n default: false,\n },\n [OrgPermission.RouterAuthorizationForbidSettingIntegration]: {\n condition: {\n fn: (props) => isAdmin(props) && !isDesignAccount(props),\n value: false,\n },\n default: true,\n },\n [OrgPermission.RouterAuthorizationForbidFinancingProducts]: {\n condition: {\n fn: isAdmin,\n value: false,\n },\n default: true,\n },\n [OrgPermission.RouterAuthorizationForbidDatabaseIncentives]: {\n condition: {\n fn: isAdmin,\n value: false,\n },\n default: true,\n },\n [OrgPermission.ShowNoTeamOptionAtProjectCreation]: {\n condition: {\n fn: (props) => isAdmin(props) || isTenantTeamlessTeamMember(props),\n value: true,\n },\n default: false,\n },\n [OrgPermission.ShowCreateProjectCommercialOption]: {\n condition: {\n fn: isPremiumAccount,\n value: true,\n },\n default: false,\n },\n [OrgPermission.CanViewAndCreatePartnerProjects]: {\n condition: {\n fn: (props) => isAdmin(props) || isTenantTeamlessTeamMember(props),\n value: true,\n },\n default: false,\n },\n // Design - CAD\n [OrgPermission.DesignCadShadeReport]: {\n condition: {\n fn: (props) => isPremiumAccount(props) || isDesignerAccount(props),\n value: true,\n },\n default: false,\n },\n [OrgPermission.DesignCadLidar]: {\n condition: {\n fn: (props) => isPremiumAccount(props) || isDesignerAccount(props),\n value: true,\n },\n default: false,\n },\n [OrgPermission.DesignCadLidarShading]: {\n condition: {\n fn: (props) => isPremiumAccount(props) || isDesignerAccount(props),\n value: true,\n },\n default: false,\n },\n [OrgPermission.DesignCadSiteEdit]: {\n condition: {\n // Notice: `fn` here means permission not available\n fn: (props) =>\n (isEnterpriseAccount(props) && isSecureMode(props) && isLimitedTeamMember(props)) ||\n !canEditSiteMode(props),\n value: false,\n },\n default: true,\n },\n [OrgPermission.DesignCadBalanceOfSystem]: {\n condition: {\n fn: isPremiumAccount,\n value: true,\n },\n default: false,\n },\n [OrgPermission.DesignCadRoofFaceMonthlyIrradiance]: {\n condition: {\n fn: isPremiumAccount,\n value: true,\n },\n default: false,\n },\n [OrgPermission.DesignCadFillZone]: {\n condition: {\n fn: () => false,\n value: true,\n },\n default: false,\n },\n [OrgPermission.DesignCadWalkway]: {\n condition: {\n fn: () => false,\n value: true,\n },\n default: false,\n },\n [OrgPermission.SearchAllComponents]: {\n condition: {\n fn: (props) => isUnlockedMode(props) || isAdmin(props),\n value: true,\n },\n default: false,\n },\n [OrgPermission.RouterAuthorizationForbidSettingRole]: {\n condition: {\n fn: isAdmin,\n value: false,\n },\n default: true,\n },\n [OrgPermission.RouterAuthorizationForbidSettingTeam]: {\n condition: {\n fn: isAdmin,\n value: false,\n },\n default: true,\n },\n [OrgPermission.CanDeleteOthersProject]: {\n condition: {\n fn: isAdmin,\n value: true,\n },\n default: false,\n },\n [OrgPermission.CanOnlyUnassign]: {\n condition: {\n fn: isLimitedTeamMember,\n value: true,\n },\n default: false,\n },\n [OrgPermission.CanMoveProjectIntoPartner]: {\n condition: {\n fn: isAdmin,\n value: true,\n },\n default: false,\n },\n [OrgPermission.ShowReassignOption]: {\n condition: {\n fn: isLimitedTeamMember,\n value: false,\n },\n default: true,\n },\n [OrgPermission.RouterAuthorizationForbidSettingSalesModeCustomization]: {\n condition: {\n fn: (props) => isAdmin(props) && !isDesignAccount(props),\n value: false,\n },\n default: true,\n },\n [OrgPermission.SalesModeExitButton]: {\n condition: {\n fn: (props) =>\n isSalesModeExitButtonTenant(props) || (isEnterpriseAccount(props) && isAuroraAdmin(props)),\n value: true,\n },\n default: false,\n },\n [OrgPermission.CanEditPricing]: {\n condition: {\n fn: canEditPricing,\n value: true,\n },\n default: false,\n },\n [OrgPermission.ShowProjectAssigneeDropdownLeadConvertModal]: {\n condition: {\n fn: isLimitedTeamMember,\n value: false,\n },\n default: true,\n },\n [OrgPermission.ShowLeadAssigneeDropdown]: {\n condition: {\n fn: isLimitedTeamMember,\n value: false,\n },\n default: true,\n },\n [OrgPermission.CanViewLimitedTeamMember]: {\n condition: {\n fn: isEnterpriseAccount,\n value: true,\n },\n default: false,\n },\n [OrgPermission.CanSpecifyComponentAvailability]: {\n condition: {\n fn: isAdmin,\n value: true,\n },\n default: false,\n },\n [OrgPermission.ShowComponentPartnerAssignment]: {\n condition: {\n fn: isAdmin,\n value: true,\n },\n default: false,\n },\n [OrgPermission.CanEditDatabaseComponent]: {\n condition: {\n fn: isAdmin,\n value: true,\n },\n default: false,\n },\n [OrgPermission.RouterAuthorizationForbidCreateNewProjects]: {\n condition: {\n fn: (props) => canAccessProjectIndex(props) && canCreateProjects(props),\n value: false,\n },\n default: true,\n },\n [OrgPermission.CanEditGlobalAhj]: {\n condition: {\n fn: isAuroraAdmin,\n value: true,\n },\n default: false,\n },\n [OrgPermission.CanEditTenantAhj]: {\n condition: {\n fn: isAdmin,\n value: true,\n },\n default: false,\n },\n [OrgPermission.CanEditGlobalUtilityRequirement]: {\n condition: {\n fn: isAuroraAdmin,\n value: true,\n },\n default: false,\n },\n [OrgPermission.CanEditTenantUtilityRequirement]: {\n condition: {\n fn: isAdmin,\n value: true,\n },\n default: false,\n },\n};\n\nexport const checkUserOrgPermission = (\n props: OrgPermissionAttributes | null,\n permission: string,\n debugLogger: debug.Debugger,\n) => {\n if (!PERMISSIONS[permission] || !props) {\n return false;\n }\n\n const result = PERMISSIONS[permission].condition.fn(props)\n ? PERMISSIONS[permission].condition.value\n : PERMISSIONS[permission].default;\n\n if (CYPRESS_BUILD) {\n const cypressOverride =\n window?.orgPermissions?.[permission] !== undefined\n ? window?.orgPermissions?.[permission]\n : result;\n debugLogger(\n `Evaluating flag for cypress: ${permission} as a user org permission. User Props: %o Result: ${cypressOverride}`,\n props,\n );\n return cypressOverride;\n }\n\n if (PERMISSIONS[permission]) {\n debugLogger(\n `Evaluating flag: ${permission} as a user org permission. User Props: %o Result: ${result}`,\n props,\n );\n }\n\n return result;\n};\n","import debug from 'debug';\nimport { BehaviorSubject, combineLatest } from 'rxjs';\nimport { switchMap } from 'rxjs/operators';\n\nimport {\n IApiInfo,\n IOrgPermissions,\n OrgPermission,\n provide,\n tokens,\n} from '@aurorasolar/common-module-loader';\nimport { PermissionsMode } from '@aurorasolar/graphql-client-schema';\n\nimport { checkUserOrgPermission } from './org-permission-rules';\nimport { OrgPermissionAttributes, UserAccountType } from './type';\n\nconst debugLogger = debug('v2').extend('org-permission');\n\nconst getUserData = (apiInfo: IApiInfo | undefined): OrgPermissionAttributes | null => {\n if (apiInfo) {\n const user = apiInfo.user[0];\n const permissions = user.role?.permissions;\n const role = {\n custom: user.role?.custom ?? false,\n id: user.role?.id ?? '',\n name: user.role?.name ?? '',\n permissions: permissions\n ? {\n accessDatabasePage: permissions.access_database_page ?? true,\n accessDesignMode: permissions.access_design_mode ?? false,\n accessProjectIndexPage: permissions.access_project_index_page ?? true,\n createProjects: permissions.create_projects ?? false,\n editSiteModel: permissions.edit_site_model ?? false,\n readTeamProject: permissions.read_team_project ?? false,\n updateConsumptionData: permissions.update_consumption_data ?? false,\n updatePricing: permissions.update_pricing ?? false,\n }\n : {},\n };\n return {\n email: user.email ?? '',\n isAuroraAdmin: user.aurora_admin ?? false,\n isSecureMode:\n !!apiInfo.tenant.permissions_mode?.limited_team_members_cannot_update_site_model,\n partnerId: user.partner_id,\n permissionsMode:\n (apiInfo.tenant.permissions_mode?.permission_mode as PermissionsMode) ??\n PermissionsMode.Restricted,\n recurlyEnabled: !!apiInfo.tenant.has_automated_billing,\n role,\n rolePermissions: role.permissions,\n teamIds: user.team_ids,\n tenantAccountType: apiInfo.tenant.account_type,\n tenantId: apiInfo.tenant.id,\n userAccountType: user.account_type as UserAccountType,\n userLevel: user.user_level,\n };\n }\n return null;\n};\n\nexport const provideOrgPermissions = provide(tokens.OrgPermissions, [\n tokens.LocalStorage,\n tokens.ApiInfo,\n] as const)((localStorage, apiInfo$) => {\n const orgPermission: IOrgPermissions = {\n getPermission: () => false,\n ready$: new BehaviorSubject(false),\n };\n\n return combineLatest([apiInfo$]).pipe(\n switchMap(async ([apiInfo]) => {\n debugLogger('Getting user data for: %o', apiInfo?.user[0].email);\n // fetching user data when token is not ready will cause an error\n // however, we can bypass this if using mock response\n if (apiInfo === undefined && localStorage.getItem('CYPRESS_MOCK_RESPONSE') !== 'true') {\n orgPermission.ready$.next(false);\n return orgPermission;\n }\n const orgProps = getUserData(apiInfo);\n if (orgProps === null) {\n return orgPermission;\n }\n\n debugLogger('Setting org permissions: %O', orgProps);\n orgPermission.getPermission = (permission: OrgPermission) =>\n checkUserOrgPermission(orgProps, permission, debugLogger);\n orgPermission.ready$.next(true);\n return orgPermission;\n }),\n );\n});\n","import { ChangeEvent, FC } from 'react';\n\nimport { DropdownButtonType, StandardSelect } from '@aurorasolar/common-core/src/select';\nimport { AuroraSwitch } from '@aurorasolar/common-core/src/switch/switch';\nimport { capitalize } from '@aurorasolar/common-core/src/utils';\nimport { DisplayWeatherDataset } from '@aurorasolar/common-shared-domain';\nimport { UpdatedDesign, UpdatedPerformanceSimulation } from '@aurorasolar/graphql-client-schema';\n\nimport { SettingsInputArea } from '../shared-components';\nimport {\n SimulationSettingsQuery,\n SimulationSettingsWeatherStationsQuery,\n} from './simulation-settings.generated';\n\nexport const capitalizeWords = (words: string) => words.split(' ').map(capitalize).join(' ');\n\nexport interface LegacyAuroraSimulationFormProps {\n design: SimulationSettingsQuery['design'];\n irradianceModels: string[];\n updateDesign: (updatedDesign: UpdatedDesign) => void;\n updateCadIrradiance: () => void;\n weatherDatasets: DisplayWeatherDataset[];\n weatherStations?: SimulationSettingsWeatherStationsQuery['allWeatherStations'][number];\n updatePerformanceSimulation: (updatedPerfSim: UpdatedPerformanceSimulation) => void;\n setWeatherDataset: (id: string) => boolean;\n}\nexport enum AuroraSimulationFormTestid {\n WEATHER_DATA = 'simulation-settings-weather-data',\n WEATHER_STATION = 'simulation-settings-weather-station',\n IRRADIANCE_MODEL = 'simulation-settings-irradiance-model',\n INVERTER_CLIPPING = 'simulation-settings-inverter-clipping',\n SUBMODULE_SIMULATION = 'simulation-settings-submodule-simulation',\n}\n\nexport const LegacyAuroraSimulationForm: FC = ({\n design,\n weatherStations,\n weatherDatasets,\n updateDesign,\n updateCadIrradiance,\n irradianceModels,\n updatePerformanceSimulation,\n setWeatherDataset,\n}) => {\n const perfSim = design.masterPerformanceSimulation;\n\n const activeWeatherDataset = weatherDatasets.find(\n ({ id }) => id === design.irradianceWeatherDatasetId,\n );\n\n const rawWeatherStations = weatherStations?.weatherStations || [];\n const activeWeatherStation = rawWeatherStations.find(\n ({ id }) => id === design.irradianceWeatherStationId,\n );\n return (\n <>\n \n id}\n getItemLabel={({ name }) => name}\n selectable={{\n items: weatherDatasets,\n onItemSelected: (weatherDataset) => {\n if (setWeatherDataset(weatherDataset!.id)) {\n updateCadIrradiance();\n }\n },\n selectedItem: activeWeatherDataset,\n }}\n />\n \n \n id}\n getItemLabel={({ name }) => name}\n selectable={{\n items: rawWeatherStations,\n onItemSelected: (weatherStation) => {\n updateDesign({\n irradianceWeatherStationId: weatherStation!.id,\n });\n updateCadIrradiance();\n },\n selectedItem: activeWeatherStation,\n }}\n />\n \n \n item}\n getItemLabel={capitalizeWords}\n selectable={{\n items: irradianceModels,\n onItemSelected: (irradianceModel) => {\n updateDesign({\n irradianceModel,\n });\n updateCadIrradiance();\n },\n selectedItem: irradianceModels.find((model) => model === design.irradianceModel),\n }}\n />\n \n \n ) =>\n updatePerformanceSimulation({\n inverterClipping: target.checked,\n })\n }\n />\n \n \n ) =>\n updatePerformanceSimulation({\n submoduleSimulation: target.checked,\n })\n }\n />\n \n \n );\n};\n","import { FC } from 'react';\n\nimport { AuroraNumericInput, NumericInputRightTag } from '@aurorasolar/common-core/src/input';\nimport { DropdownButtonType, StandardSelect } from '@aurorasolar/common-core/src/select';\nimport { PvWattsDataset, UpdatedPerformanceSimulation } from '@aurorasolar/graphql-client-schema';\nimport { Box } from '@rebass/grid';\n\nimport { SettingsInputArea } from '../shared-components';\nimport { SimulationSettingsQuery } from './simulation-settings.generated';\n\nexport const pvWattsWeatherDatasets = [\n {\n id: PvWattsDataset.Unknown,\n name: 'Default',\n },\n {\n id: PvWattsDataset.Nsrdb,\n name: 'NSRDB - PSM3',\n },\n {\n id: PvWattsDataset.Tmy3,\n name: 'TMY3',\n },\n {\n id: PvWattsDataset.Tmy2,\n name: 'TMY2',\n },\n {\n id: PvWattsDataset.Intl,\n name: 'International',\n },\n];\n\nexport enum PVWattsSimulationFormTestid {\n INVERTER_EFFICIENCY = 'pvwatts-form-inverter-efficiency',\n DC_AC_RATIO = 'pvwatts-form-dc-ac-ratio',\n HORIZON_SHADING = 'pvwatts-form-horizon-shading',\n WEATHER_DATASET = 'pvwatts-form-weather-dataset',\n}\nexport interface PVWattsSimulationFormProps {\n design: SimulationSettingsQuery['design'];\n updatePerformanceSimulation: (updatedPerfSim: UpdatedPerformanceSimulation) => void;\n}\n\nexport const PVWattsSimulationForm: FC = ({\n design,\n updatePerformanceSimulation,\n}) => {\n const perfSim = design.masterPerformanceSimulation;\n return (\n <>\n \n id}\n getItemLabel={({ name }) => name}\n selectable={{\n items: pvWattsWeatherDatasets,\n onItemSelected: (dataset) => {\n updatePerformanceSimulation({\n pvwattsWeatherDataset: dataset?.id ?? PvWattsDataset.Unknown,\n });\n },\n selectedItem: pvWattsWeatherDatasets.find(\n ({ id }) => id === perfSim?.pvwattsWeatherDataset,\n ),\n }}\n />\n \n \n \n \n updatePerformanceSimulation({\n inverterEfficiency: value,\n })\n }\n rightElement={%}\n value={perfSim.inverterEfficiency}\n />\n \n \n \n \n \n updatePerformanceSimulation({\n dcAcRatio: value,\n })\n }\n stepSize={0.1}\n value={perfSim.dcAcRatio}\n />\n \n \n \n );\n};\n","import { FC } from 'react';\nimport styled from 'styled-components';\n\nimport { Colors } from '@aurorasolar/common-core/src/colors';\nimport { AuroraNumericInput } from '@aurorasolar/common-core/src/input';\nimport { SPACES } from '@aurorasolar/common-core/src/layout';\nimport { Box } from '@rebass/grid';\n\nimport { Loss } from './types';\n\nexport const monthlyColumnLabels = [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec',\n] as const;\n\nconst StyledLossColumn = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: ${SPACES[0]}px ${SPACES[0]}px ${SPACES[4]}px ${SPACES[0]}px;\n\n &:nth-child(even) {\n background: ${Colors.GRAY_100};\n border-radius: 6px;\n }\n\n & > div:first-child {\n color: ${Colors.GRAY_700};\n }\n`;\n\ninterface MonthlyLossColumnProps {\n index: number;\n losses: Loss[];\n monthlyTotalLoss: number;\n onUpdateLoss: (lossName: string, value: number) => void;\n visibleLosses: string[];\n}\n\nexport const MonthlyLossColumn: FC = ({\n index,\n losses,\n monthlyTotalLoss,\n onUpdateLoss,\n visibleLosses,\n}) => {\n const month = monthlyColumnLabels[index];\n const lowercaseMonth = month.toLowerCase();\n return (\n \n {month}\n {visibleLosses.map((lossName) => {\n const value = losses?.find((loss) => loss.name === lossName)?.monthlyValues?.[index] ?? 0;\n return (\n {\n onUpdateLoss(lossName, Math.round(updatedValue * 10) / 1000);\n }}\n value={value * 100}\n width=\"56px\"\n />\n );\n })}\n \n {(monthlyTotalLoss * 100).toFixed(1)}\n \n \n );\n};\n","import { assign, createMachine } from '@xstate/fsm';\n\nimport { Loss } from './types';\n\ninterface MonthlyLossModalContext {\n losses: Loss[];\n}\n\ntype MonthlyLossModalEvent =\n | { type: 'MODAL_OPENED'; initialLosses: Loss[]; openedWith: string }\n | { type: 'DONE_CLICKED' }\n | { type: 'CANCEL_CLICKED' }\n | { type: 'MONTHLY_LOSS_ADDED'; lossName: string }\n | { type: 'MONTHLY_LOSS_REMOVED'; lossName: string }\n | { type: 'MONTHLY_LOSS_UPDATED'; lossName: string; index: number; value: number };\n\ntype MonthlyLossModalState =\n | { value: 'closed'; context: MonthlyLossModalContext }\n | { value: 'opened'; context: MonthlyLossModalContext };\n\nexport const monthlyLossModalMachine = createMachine<\n MonthlyLossModalContext,\n MonthlyLossModalEvent,\n MonthlyLossModalState\n>({\n context: {\n losses: [],\n },\n id: 'monthlyLossModal',\n initial: 'closed',\n states: {\n closed: {\n entry: 'closeExternal',\n on: {\n MODAL_OPENED: {\n actions: assign({\n losses: (_, { initialLosses, openedWith }) =>\n initialLosses.map((loss) => ({\n ...loss,\n monthlyValues: loss.monthlyValues?.slice(),\n type: loss.name === openedWith ? 'monthly' : loss.type,\n })),\n }),\n target: 'opened',\n },\n },\n },\n opened: {\n on: {\n CANCEL_CLICKED: {\n target: 'closed',\n },\n\n DONE_CLICKED: {\n actions: 'updateLosses',\n target: 'closed',\n },\n\n MONTHLY_LOSS_ADDED: {\n actions: assign({\n losses: ({ losses }, { lossName }) =>\n losses.map((loss) => {\n if (loss.name === lossName) {\n loss.type = 'monthly';\n }\n return loss;\n }),\n }),\n },\n\n MONTHLY_LOSS_REMOVED: [\n {\n actions: 'setLossTypesToAnnual',\n // If all monthly losses are removed, close\n cond: ({ losses }, { lossName }) => {\n const monthlyLosses = losses.filter(({ type }) => type === 'monthly');\n return monthlyLosses.length === 1 && monthlyLosses[0].name === lossName;\n },\n target: 'closed',\n },\n {\n actions: assign({\n losses: ({ losses }, { lossName }) =>\n losses.map((loss) => {\n if (loss.name === lossName) {\n loss.type = 'annual';\n }\n return loss;\n }),\n }),\n },\n ],\n\n MONTHLY_LOSS_UPDATED: {\n actions: assign({\n losses: ({ losses }, { lossName, index, value }) =>\n losses.map((loss) => {\n if (loss.name === lossName && loss.monthlyValues != null) {\n loss.monthlyValues[index] = value;\n }\n return loss;\n }),\n }),\n },\n },\n },\n },\n});\n","import { FC, useEffect, useMemo } from 'react';\nimport styled from 'styled-components';\n\nimport { AlertTooltip } from '@aurorasolar/common-core/src/alert-tooltip';\nimport { AuroraThemedButton, AuroraThemedButtonIntent } from '@aurorasolar/common-core/src/button';\nimport { Colors } from '@aurorasolar/common-core/src/colors';\nimport { AuroraIcon, AuroraIconType } from '@aurorasolar/common-core/src/icon';\nimport { SPACES } from '@aurorasolar/common-core/src/layout';\nimport { AuroraModal } from '@aurorasolar/common-core/src/modal';\nimport { IconFontSize, Text } from '@aurorasolar/common-core/src/typography';\nimport { capitalize } from '@aurorasolar/common-core/src/utils';\nimport { Box, Flex } from '@rebass/grid';\nimport { useMachine } from '@xstate/react/lib/fsm';\n\nimport { monthlyColumnLabels, MonthlyLossColumn } from './monthly-loss-column';\nimport { monthlyLossModalMachine } from './monthly-loss-modal-machine';\nimport { Loss } from './types';\n\nexport const monthlyAllowedLosses = ['soiling', 'snow'];\n\nconst TEXT_HEIGHT = 22.984;\nconst BUTTON_HEIGHT = 40;\n\nconst LossLabelColumn = styled.div`\n flex-direction: column;\n padding-top: ${TEXT_HEIGHT + SPACES[0] + SPACES[2]}px;\n padding-right: ${SPACES[1]}px;\n\n & > div {\n margin-bottom: ${SPACES[4]}px;\n &:not(:last-child) > ${Text} {\n display: block;\n height: ${BUTTON_HEIGHT}px;\n line-height: ${BUTTON_HEIGHT}px;\n }\n }\n`;\n\nconst calculateMonthlyTotalLosses = (losses: Loss[]) =>\n losses.reduce(\n (totals, loss) =>\n totals.map(\n (value, i) =>\n value +\n (loss.type === 'monthly' && loss.monthlyValues != null\n ? loss.monthlyValues[i] ?? 0\n : loss.annualValue ?? 0),\n ),\n Array.from({ length: 12 }, () => 0),\n );\nexport interface MonthlyLossModalProps {\n openedWith: string | undefined;\n losses: Loss[];\n onClose: VoidFunction;\n onUpdateLosses: (losses: Loss[]) => void;\n}\n\nexport const MonthlyLossModal: FC = ({\n losses,\n onClose,\n openedWith,\n onUpdateLosses,\n}) => {\n const [state, send] = useMachine(monthlyLossModalMachine, {\n actions: {\n closeExternal: () => onClose(),\n setLossTypesToAnnual: () => {\n onUpdateLosses(\n losses.map((loss) => ({\n ...loss,\n type: 'annual',\n })),\n );\n },\n updateLosses: (ctx) => {\n if (ctx.losses.length) {\n onUpdateLosses(ctx.losses);\n } else {\n console.error('no losses');\n }\n },\n },\n });\n\n useEffect(() => {\n if (openedWith != null) {\n send({\n initialLosses: losses,\n openedWith,\n type: 'MODAL_OPENED',\n });\n }\n }, [openedWith, losses, send]);\n\n const { hiddenLosses, monthlyTotalLosses, visibleLosses } = useMemo(() => {\n const visible = state.context.losses\n .filter(({ type }) => type === 'monthly')\n .map(({ name }) => name);\n return {\n hiddenLosses: monthlyAllowedLosses.filter((name) => !visible.includes(name)),\n monthlyTotalLosses: calculateMonthlyTotalLosses(state.context.losses),\n visibleLosses: visible,\n };\n }, [state.context.losses]);\n\n return (\n {\n send({ type: 'CANCEL_CLICKED' });\n },\n text: 'Cancel',\n },\n {\n intent: AuroraThemedButtonIntent.PRIMARY,\n onClick: () => {\n send({ type: 'DONE_CLICKED' });\n },\n text: 'Done',\n },\n ]}\n isOpen={state.value === 'opened'}\n leftActionArea={\n <>\n {hiddenLosses.map((lossName) => (\n send({ lossName, type: 'MONTHLY_LOSS_ADDED' })}\n >\n \n Edit {capitalize(lossName)} Monthly\n \n ))}\n \n }\n onClose={() => send({ type: 'CANCEL_CLICKED' })}\n subTitle=\"Input and view monthly system losses. To enter annual, remove the field.\"\n title=\"Set Monthly System Losses\"\n >\n \n \n {visibleLosses.map((lossName) => (\n \n \n \n {\n send({ lossName, type: 'MONTHLY_LOSS_REMOVED' });\n }}\n >\n \n \n \n \n \n {capitalize(lossName)}\n \n \n ))}\n \n \n Estimated total loss\n \n \n \n {monthlyColumnLabels.map((monthLabel, index) => (\n {\n send({\n index,\n lossName,\n type: 'MONTHLY_LOSS_UPDATED',\n value,\n });\n }}\n visibleLosses={visibleLosses}\n />\n ))}\n \n {[...visibleLosses, 'total'].map((key) => (\n \n \n %\n \n \n ))}\n \n \n \n );\n};\n","import { FC, useMemo } from 'react';\nimport styled from 'styled-components';\n\nimport { AlertTooltip, AlertTooltipType } from '@aurorasolar/common-core/src/alert-tooltip';\nimport { AuroraCheckbox } from '@aurorasolar/common-core/src/checkbox';\nimport { Colors } from '@aurorasolar/common-core/src/colors';\nimport { AuroraIcon, AuroraIconType } from '@aurorasolar/common-core/src/icon';\nimport { AuroraNumericInput, NumericInputRightTag } from '@aurorasolar/common-core/src/input';\nimport { Text } from '@aurorasolar/common-core/src/typography';\nimport { capitalize } from '@aurorasolar/common-core/src/utils';\nimport { Box, Flex } from '@rebass/grid';\n\nimport { SettingsInputArea } from '../shared-components';\nimport { monthlyAllowedLosses } from './monthly-loss-modal';\nimport { Loss } from './types';\n\nexport interface AnnualSystemLossInputProps extends Loss {\n disabledReason?: string;\n onLossUpdate: (patch: Partial) => void;\n onOpenMonthlyModal: (lossName: string) => void;\n}\n\nexport const SYSTEM_LOSS_INPUT_TESTID_PREFIX = 'annual-system-loss-input-';\nexport const getAnnualInputTestIdForLoss = (loss: string) =>\n `${SYSTEM_LOSS_INPUT_TESTID_PREFIX}${loss}`;\n\nconst StyledLink = styled.span`\n &:hover {\n text-decoration: underline;\n cursor: pointer;\n }\n`;\nconst ButtonHeightCheckbox = styled(AuroraCheckbox)`\n height: 40px;\n line-height: 40px;\n margin-bottom: 0;\n`;\nconst lossLabelOverrides = new Map([\n ['rating', 'Module nameplate rating'],\n ['light_induced_degradation', 'Light-induced degradation'],\n ['availability', 'System Availability'],\n]);\n\nexport const getLossInfo = (name: string) => ({\n isMonthlyEditingAllowed: monthlyAllowedLosses.includes(name),\n label: lossLabelOverrides.get(name) ?? capitalize(name),\n});\n\nexport const AnnualSystemLossInput: FC = ({\n name,\n type,\n disabledReason,\n annualValue,\n onLossUpdate,\n onOpenMonthlyModal,\n}) => {\n const { label, isMonthlyEditingAllowed } = useMemo(() => getLossInfo(name), [name]);\n\n return (\n \n \n \n {type === 'annual' ? (\n {\n onLossUpdate({ annualValue: value / 100 });\n }}\n rightElement={%}\n value={annualValue * 100}\n />\n ) : (\n \n onOpenMonthlyModal(name)}>\n \n (Edit Monthly)\n \n \n \n )}\n \n {disabledReason && (\n \n \n \n \n \n )}\n {!disabledReason && isMonthlyEditingAllowed && (\n \n \n checked ? onLossUpdate({ type: 'annual' }) : onOpenMonthlyModal(name)\n }\n />\n \n )}\n \n \n );\n};\n","import { FC, useCallback, useMemo, useState } from 'react';\n\nimport { Colors } from '@aurorasolar/common-core/src/colors';\nimport { useLocaleFormat } from '@aurorasolar/common-core/src/hooks';\nimport { Text } from '@aurorasolar/common-core/src/typography';\nimport { capitalize } from '@aurorasolar/common-core/src/utils';\nimport { UpdatedPerformanceSimulation } from '@aurorasolar/graphql-client-schema';\n\nimport { SettingsInputArea, SettingsTitle } from '../shared-components';\nimport { AnnualSystemLossInput, AnnualSystemLossInputProps } from './annual-system-loss-input';\nimport { MonthlyLossModal } from './monthly-loss-modal';\nimport { SimulationSettingsQuery } from './simulation-settings.generated';\nimport { Loss } from './types';\n\ninterface SystemLossesProps {\n performanceSimulation: SimulationSettingsQuery['design']['masterPerformanceSimulation'];\n updatePerformanceSimulation: (updatedPerfSim: UpdatedPerformanceSimulation) => void;\n}\ninterface DisableCheckParams {\n isSimulationShadingEnabled: boolean;\n isUsingMLPE: boolean;\n}\nconst disabledMap = new Map string | undefined>([\n [\n 'shading',\n ({ isSimulationShadingEnabled }) =>\n isSimulationShadingEnabled ? 'Calculated by shading engine' : undefined,\n ],\n [\n 'mismatch',\n ({ isUsingMLPE }) => (isUsingMLPE ? 'No mismatch losses when using MLPE devices' : undefined),\n ],\n]);\n\nconst disabledCheck = (loss: Loss, params: DisableCheckParams) =>\n disabledMap.get(loss.name)?.(params);\n\nconst lossNameMap = new Map([\n ['rating', 'Module nameplate rating'],\n ['light_induced_degradation', 'Light-induced degradation'],\n ['availability', 'System Availability'],\n]);\nexport const transformLossName = (name: string) => lossNameMap.get(name) || capitalize(name);\n\n/**\n * We want to use the formula 1 - ( Π (1 - x) )\n * to calculate cumulative losses, for example\n * losses of 4%, 5%, and 6% would be calculated as\n * 1 - (96% * 95% * 94%)\n */\nexport const getTotalLoss = (systemLosses: Loss[], isSimulationShadingEnabled: boolean) => {\n const total = systemLosses.reduce((acc, loss) => {\n if (loss.name === 'shading' && isSimulationShadingEnabled) {\n return acc;\n }\n\n const value =\n loss.type === 'monthly' && loss.monthlyValues != null\n ? loss.monthlyValues.reduce((average, v, _, { length }) => (average + v) / length, 0)\n : loss.annualValue;\n\n return acc * (1 - value);\n }, 1);\n\n // Return as percentage, rounded to nearest 10th (for example `21.3`):\n return Math.round((1 - total) * 1000) / 10;\n};\n\nfunction stripTypename>(ob: T): Omit {\n const { __typename, ...rest } = ob;\n return rest as Omit;\n}\n\n// TODO: determine where to get this\nconst isUsingMLPE = false;\n\nexport const SystemLosses: FC = ({\n performanceSimulation,\n updatePerformanceSimulation,\n}) => {\n const [monthlyOpenedWith, setMonthlyOpenedWith] = useState(undefined);\n const isSimulationShadingEnabled = !!performanceSimulation?.shadingEngineEnabled;\n const updateLoss = useCallback(\n (lossName: string, patch: Partial) => {\n const newLosses = performanceSimulation.systemLosses.map((loss) => {\n const newLoss = stripTypename(loss);\n if (newLoss.name === lossName) {\n return {\n ...newLoss,\n ...patch,\n };\n }\n return newLoss;\n });\n updatePerformanceSimulation({ systemLosses: newLosses });\n },\n [performanceSimulation, updatePerformanceSimulation],\n );\n\n const updateLosses = useCallback(\n (newLosses: Loss[]) => {\n updatePerformanceSimulation({ systemLosses: newLosses.map(stripTypename) });\n },\n [updatePerformanceSimulation],\n );\n\n const { systemLosses } = performanceSimulation;\n\n const annualLossInputProps = useMemo(\n () =>\n systemLosses.map(\n (loss) =>\n ({\n ...loss,\n disabledReason: disabledCheck(loss, { isSimulationShadingEnabled, isUsingMLPE }),\n onLossUpdate: (patch) => updateLoss(loss.name, patch),\n onOpenMonthlyModal: setMonthlyOpenedWith,\n } ?? []),\n ),\n [isSimulationShadingEnabled, updateLoss, systemLosses],\n );\n\n /**\n Unfortunately we cannot easily use a useMemo here\n because changing the deeply nested monthly values\n does not create a new system loss array from the graphQL response\n */\n const totalLoss = getTotalLoss(systemLosses, isSimulationShadingEnabled);\n const { formatNumber } = useLocaleFormat();\n\n return (\n <>\n setMonthlyOpenedWith(undefined)}\n onUpdateLosses={updateLosses}\n openedWith={monthlyOpenedWith}\n />\n System Losses (annual)\n {annualLossInputProps.map((props) => (\n \n ))}\n \n Estimated Total Loss\n \n }\n >\n \n {formatNumber(totalLoss)}%\n \n \n \n );\n};\n","import { ChangeEvent, FC } from 'react';\n\nimport { DropdownButtonType, StandardSelect } from '@aurorasolar/common-core/src/select';\nimport { AuroraSwitch } from '@aurorasolar/common-core/src/switch/switch';\nimport { capitalize } from '@aurorasolar/common-core/src/utils';\nimport { CADTriggerActionProps, CADTriggerActionTypes } from '@aurorasolar/common-data-store';\nimport { OrgPermission } from '@aurorasolar/common-module-loader';\nimport { OrgPermissionGuard } from '@aurorasolar/common-org-permissions';\nimport { DisplayWeatherDataset } from '@aurorasolar/common-shared-domain';\nimport {\n SimulationEngine,\n UpdatedDesign,\n UpdatedPerformanceSimulation,\n} from '@aurorasolar/graphql-client-schema';\nimport { Flex } from '@rebass/grid';\n\nimport { SettingsDivider, SettingsInputArea, SettingsTitle } from '../shared-components';\nimport { LegacyAuroraSimulationForm } from './legacy-aurora-simulation-form';\nimport { PVWattsSimulationForm } from './pvwatts-simulation-form';\nimport {\n SimulationSettingsQuery,\n SimulationSettingsWeatherStationsQuery,\n} from './simulation-settings.generated';\nimport { SystemLosses } from './system-losses';\n\nexport enum SimulationSettingsTestid {\n SIMULATION_ENGINE = 'simulation-settings-simulation-engine',\n SHADING_ENGINE = 'simulation-settings-shading-engine',\n HORIZON_SHADING = 'simulation-settings-horizon-shading',\n LIDAR_SHADING = 'simulation-settings-lidar-shading',\n}\ninterface LegacySimulationSettingsCoreProps {\n design: SimulationSettingsQuery['design'];\n irradianceModels: string[];\n simulationEngines: { id: SimulationEngine; name: string }[];\n updateDesign: (updatedDesign: UpdatedDesign) => void;\n updatePerformanceSimulation: (updatedPerfSim: UpdatedPerformanceSimulation) => void;\n updateCadIrradiance(params?: CADTriggerActionProps[CADTriggerActionTypes.ApplySettings]): void;\n weatherDatasets: DisplayWeatherDataset[];\n weatherStations?: SimulationSettingsWeatherStationsQuery['allWeatherStations'][number];\n setWeatherDataset: (id: string) => boolean;\n}\n\nexport const capitalizeWords = (words: string) => words.split(' ').map(capitalize).join(' ');\n\nexport const LegacySimulationSettingsCore: FC = ({\n design,\n irradianceModels,\n simulationEngines,\n updateCadIrradiance,\n updateDesign,\n updatePerformanceSimulation,\n weatherDatasets,\n weatherStations,\n setWeatherDataset,\n}) => {\n const perfSim = design.masterPerformanceSimulation;\n const { simulationEngine } = perfSim;\n const engineMatches = (...matches: SimulationEngine[]) =>\n matches.includes(perfSim.simulationEngine);\n\n return (\n \n Simulation\n \n id}\n getItemLabel={({ name }) => name}\n selectable={{\n items: simulationEngines,\n onItemSelected: (selectedEngine) => {\n updatePerformanceSimulation({\n simulationEngine: selectedEngine?.id ?? SimulationEngine.Auto,\n });\n },\n selectedItem: simulationEngines.find(({ id }) => id === simulationEngine),\n }}\n />\n \n \n ) =>\n updatePerformanceSimulation({\n shadingEngineEnabled: target.checked,\n })\n }\n />\n \n \n ) => {\n // Backend handles update to Design\n updatePerformanceSimulation({\n useHorizonProfile: target.checked,\n });\n }}\n />\n \n \n \n ) => {\n // Backend handles update to Design\n updatePerformanceSimulation({\n useLidarShading: target.checked,\n });\n }}\n />\n \n \n \n {engineMatches(SimulationEngine.Auto) && Aurora}\n {engineMatches(SimulationEngine.Auto, SimulationEngine.Aurora) && (\n \n )}\n {engineMatches(SimulationEngine.Auto) && (\n <>\n \n PVWatts\n \n )}\n {engineMatches(SimulationEngine.Auto, SimulationEngine.Pvwatts) && (\n \n )}\n \n \n \n );\n};\n","// @ts-ignore: Ignore unused { * as Types } import\nimport * as Types from '@aurorasolar/graphql-client-schema';\n\nimport { gql } from '@apollo/client';\nimport * as Apollo from '@apollo/client';\nconst defaultOptions = {} as const;\nexport type PerformanceSimSettingsFragment = { __typename: 'PerformanceSimulation', id: string, dcAcRatio: number, inverterClipping: boolean, inverterEfficiency: number, shadingEngineEnabled: boolean, simulationEngine: Types.SimulationEngine, pvwattsWeatherDataset?: Types.PvWattsDataset | null | undefined, submoduleSimulation: boolean, useHorizonProfile?: boolean | null | undefined, useLidarShading?: boolean | null | undefined, valid?: boolean | null | undefined, systemLosses: Array<{ __typename: 'SystemLoss', name: string, annualValue: number, monthlyValues?: Array | null | undefined, type: string }> };\n\nexport type SimulationSettingsFragment = { __typename: 'Design', id: string, irradianceModel?: string | null | undefined, irradianceWeatherDatasetId?: string | null | undefined, irradianceWeatherStationId?: string | null | undefined, project: { __typename: 'Project', id: string, country?: string | null | undefined, latitude?: number | null | undefined, longitude?: number | null | undefined } };\n\nexport type SimulationSettingsQueryVariables = Types.Exact<{\n designId: Types.Scalars['ID'];\n}>;\n\n\nexport type SimulationSettingsQuery = { __typename: 'Query', design: { __typename: 'Design', id: string, irradianceModel?: string | null | undefined, irradianceWeatherDatasetId?: string | null | undefined, irradianceWeatherStationId?: string | null | undefined, masterPerformanceSimulation: { __typename: 'PerformanceSimulation', id: string, dcAcRatio: number, inverterClipping: boolean, inverterEfficiency: number, shadingEngineEnabled: boolean, simulationEngine: Types.SimulationEngine, pvwattsWeatherDataset?: Types.PvWattsDataset | null | undefined, submoduleSimulation: boolean, useHorizonProfile?: boolean | null | undefined, useLidarShading?: boolean | null | undefined, valid?: boolean | null | undefined, systemLosses: Array<{ __typename: 'SystemLoss', name: string, annualValue: number, monthlyValues?: Array | null | undefined, type: string }> }, project: { __typename: 'Project', id: string, country?: string | null | undefined, latitude?: number | null | undefined, longitude?: number | null | undefined } }, weatherDatasets: Array<{ __typename: 'WeatherDataset', id: string, name: string, geography: string }> };\n\nexport type SimulationSettingsWeatherStationsQueryVariables = Types.Exact<{\n weatherDatasetIds: Array | Types.Scalars['ID'];\n location: Types.GeoCoordinates;\n}>;\n\n\nexport type SimulationSettingsWeatherStationsQuery = { __typename: 'Query', allWeatherStations: Array<{ __typename: 'LoadedWeatherDataset', id: string, latitude: number, longitude: number, weatherStations: Array<{ __typename: 'WeatherStation', id: string, code: string, elevation: number, latitude: number, longitude: number, name: string, timeZone: number }> }> };\n\nexport type ClosestWeatherStationsQueryVariables = Types.Exact<{\n weatherDatasets: Array | Types.LoadedWeatherDatasetInput;\n location: Types.GeoCoordinates;\n projectId: Types.Scalars['ID'];\n}>;\n\n\nexport type ClosestWeatherStationsQuery = { __typename: 'Query', closestWeatherStations: Array<{ __typename: 'LoadedWeatherDataset', id: string, latitude: number, longitude: number, weatherStations: Array<{ __typename: 'WeatherStation', id: string, code: string, elevation: number, latitude: number, longitude: number, name: string, timeZone: number, weatherDatasetId?: string | null | undefined }> }> };\n\nexport type UpdateSimulationDesignMutationVariables = Types.Exact<{\n designId: Types.Scalars['ID'];\n updatedDesign: Types.UpdatedDesign;\n}>;\n\n\nexport type UpdateSimulationDesignMutation = { __typename: 'Mutation', updateDesign: { __typename: 'Design', id: string, irradianceModel?: string | null | undefined, irradianceWeatherDatasetId?: string | null | undefined, irradianceWeatherStationId?: string | null | undefined, masterPerformanceSimulation: { __typename: 'PerformanceSimulation', id: string, valid?: boolean | null | undefined }, project: { __typename: 'Project', id: string, country?: string | null | undefined, latitude?: number | null | undefined, longitude?: number | null | undefined } } };\n\nexport type UpdatePerformanceSimMutationVariables = Types.Exact<{\n perfSimId: Types.Scalars['ID'];\n updatedPerformanceSimulation: Types.UpdatedPerformanceSimulation;\n}>;\n\n\nexport type UpdatePerformanceSimMutation = { __typename: 'Mutation', updatePerformanceSimulation: { __typename: 'PerformanceSimulation', id: string, dcAcRatio: number, inverterClipping: boolean, inverterEfficiency: number, shadingEngineEnabled: boolean, simulationEngine: Types.SimulationEngine, pvwattsWeatherDataset?: Types.PvWattsDataset | null | undefined, submoduleSimulation: boolean, useHorizonProfile?: boolean | null | undefined, useLidarShading?: boolean | null | undefined, valid?: boolean | null | undefined, systemLosses: Array<{ __typename: 'SystemLoss', name: string, annualValue: number, monthlyValues?: Array | null | undefined, type: string }> } };\n\nexport const PerformanceSimSettingsFragmentDoc = gql`\n fragment PerformanceSimSettings on PerformanceSimulation {\n id\n dcAcRatio\n inverterClipping\n inverterEfficiency\n shadingEngineEnabled\n simulationEngine\n pvwattsWeatherDataset\n submoduleSimulation\n systemLosses {\n name\n annualValue\n monthlyValues\n type\n }\n useHorizonProfile\n useLidarShading\n valid\n}\n `;\nexport const SimulationSettingsFragmentDoc = gql`\n fragment SimulationSettings on Design {\n id\n irradianceModel\n project {\n id\n country\n latitude\n longitude\n }\n irradianceWeatherDatasetId\n irradianceWeatherStationId\n}\n `;\nexport const SimulationSettingsDocument = gql`\n query SimulationSettings($designId: ID!) @trace_info(traceInfo: {pod: cad}) {\n design: designById(id: $designId) {\n ...SimulationSettings\n masterPerformanceSimulation {\n ...PerformanceSimSettings\n }\n }\n weatherDatasets {\n id\n name\n geography\n }\n}\n ${SimulationSettingsFragmentDoc}\n${PerformanceSimSettingsFragmentDoc}`;\n\n/**\n * __useSimulationSettingsQuery__\n *\n * To run a query within a React component, call `useSimulationSettingsQuery` and pass it any options that fit your needs.\n * When your component renders, `useSimulationSettingsQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useSimulationSettingsQuery({\n * variables: {\n * designId: // value for 'designId'\n * },\n * });\n */\nexport function useSimulationSettingsQuery(baseOptions: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(SimulationSettingsDocument, options);\n }\nexport function useSimulationSettingsLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(SimulationSettingsDocument, options);\n }\nexport type SimulationSettingsQueryHookResult = ReturnType;\nexport type SimulationSettingsLazyQueryHookResult = ReturnType;\nexport type SimulationSettingsQueryResult = Apollo.QueryResult;\nexport const SimulationSettingsWeatherStationsDocument = gql`\n query SimulationSettingsWeatherStations($weatherDatasetIds: [ID!]!, $location: GeoCoordinates!) @trace_info(traceInfo: {pod: cad}) {\n allWeatherStations(weatherDatasetIds: $weatherDatasetIds, location: $location) {\n id\n latitude\n longitude\n weatherStations {\n id\n code\n elevation\n latitude\n longitude\n name\n timeZone\n }\n }\n}\n `;\n\n/**\n * __useSimulationSettingsWeatherStationsQuery__\n *\n * To run a query within a React component, call `useSimulationSettingsWeatherStationsQuery` and pass it any options that fit your needs.\n * When your component renders, `useSimulationSettingsWeatherStationsQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useSimulationSettingsWeatherStationsQuery({\n * variables: {\n * weatherDatasetIds: // value for 'weatherDatasetIds'\n * location: // value for 'location'\n * },\n * });\n */\nexport function useSimulationSettingsWeatherStationsQuery(baseOptions: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(SimulationSettingsWeatherStationsDocument, options);\n }\nexport function useSimulationSettingsWeatherStationsLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(SimulationSettingsWeatherStationsDocument, options);\n }\nexport type SimulationSettingsWeatherStationsQueryHookResult = ReturnType;\nexport type SimulationSettingsWeatherStationsLazyQueryHookResult = ReturnType;\nexport type SimulationSettingsWeatherStationsQueryResult = Apollo.QueryResult;\nexport const ClosestWeatherStationsDocument = gql`\n query ClosestWeatherStations($weatherDatasets: [LoadedWeatherDatasetInput!]!, $location: GeoCoordinates!, $projectId: ID!) @trace_info(traceInfo: {pod: cad}) {\n closestWeatherStations(\n weatherDatasets: $weatherDatasets\n location: $location\n projectId: $projectId\n ) {\n id\n latitude\n longitude\n weatherStations {\n id\n code\n elevation\n latitude\n longitude\n name\n timeZone\n weatherDatasetId\n }\n }\n}\n `;\n\n/**\n * __useClosestWeatherStationsQuery__\n *\n * To run a query within a React component, call `useClosestWeatherStationsQuery` and pass it any options that fit your needs.\n * When your component renders, `useClosestWeatherStationsQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useClosestWeatherStationsQuery({\n * variables: {\n * weatherDatasets: // value for 'weatherDatasets'\n * location: // value for 'location'\n * projectId: // value for 'projectId'\n * },\n * });\n */\nexport function useClosestWeatherStationsQuery(baseOptions: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(ClosestWeatherStationsDocument, options);\n }\nexport function useClosestWeatherStationsLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(ClosestWeatherStationsDocument, options);\n }\nexport type ClosestWeatherStationsQueryHookResult = ReturnType;\nexport type ClosestWeatherStationsLazyQueryHookResult = ReturnType;\nexport type ClosestWeatherStationsQueryResult = Apollo.QueryResult;\nexport const UpdateSimulationDesignDocument = gql`\n mutation UpdateSimulationDesign($designId: ID!, $updatedDesign: UpdatedDesign!) @trace_info(traceInfo: {pod: cad}) {\n updateDesign(id: $designId, updatedDesign: $updatedDesign) {\n ...SimulationSettings\n masterPerformanceSimulation {\n id\n valid\n }\n }\n}\n ${SimulationSettingsFragmentDoc}`;\nexport type UpdateSimulationDesignMutationFn = Apollo.MutationFunction;\n\n/**\n * __useUpdateSimulationDesignMutation__\n *\n * To run a mutation, you first call `useUpdateSimulationDesignMutation` within a React component and pass it any options that fit your needs.\n * When your component renders, `useUpdateSimulationDesignMutation` returns a tuple that includes:\n * - A mutate function that you can call at any time to execute the mutation\n * - An object with fields that represent the current status of the mutation's execution\n *\n * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2;\n *\n * @example\n * const [updateSimulationDesignMutation, { data, loading, error }] = useUpdateSimulationDesignMutation({\n * variables: {\n * designId: // value for 'designId'\n * updatedDesign: // value for 'updatedDesign'\n * },\n * });\n */\nexport function useUpdateSimulationDesignMutation(baseOptions?: Apollo.MutationHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useMutation(UpdateSimulationDesignDocument, options);\n }\nexport type UpdateSimulationDesignMutationHookResult = ReturnType;\nexport type UpdateSimulationDesignMutationResult = Apollo.MutationResult;\nexport type UpdateSimulationDesignMutationOptions = Apollo.BaseMutationOptions;\nexport const UpdatePerformanceSimDocument = gql`\n mutation UpdatePerformanceSim($perfSimId: ID!, $updatedPerformanceSimulation: UpdatedPerformanceSimulation!) @trace_info(traceInfo: {pod: cad}) {\n updatePerformanceSimulation(\n id: $perfSimId\n updatedPerformanceSimulation: $updatedPerformanceSimulation\n ) {\n ...PerformanceSimSettings\n }\n}\n ${PerformanceSimSettingsFragmentDoc}`;\nexport type UpdatePerformanceSimMutationFn = Apollo.MutationFunction;\n\n/**\n * __useUpdatePerformanceSimMutation__\n *\n * To run a mutation, you first call `useUpdatePerformanceSimMutation` within a React component and pass it any options that fit your needs.\n * When your component renders, `useUpdatePerformanceSimMutation` returns a tuple that includes:\n * - A mutate function that you can call at any time to execute the mutation\n * - An object with fields that represent the current status of the mutation's execution\n *\n * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2;\n *\n * @example\n * const [updatePerformanceSimMutation, { data, loading, error }] = useUpdatePerformanceSimMutation({\n * variables: {\n * perfSimId: // value for 'perfSimId'\n * updatedPerformanceSimulation: // value for 'updatedPerformanceSimulation'\n * },\n * });\n */\nexport function useUpdatePerformanceSimMutation(baseOptions?: Apollo.MutationHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useMutation(UpdatePerformanceSimDocument, options);\n }\nexport type UpdatePerformanceSimMutationHookResult = ReturnType;\nexport type UpdatePerformanceSimMutationResult = Apollo.MutationResult;\nexport type UpdatePerformanceSimMutationOptions = Apollo.BaseMutationOptions;","import React, { FC, useMemo } from 'react';\n\nimport { useDebouncedCallback } from '@aurorasolar/common-core/src/hooks';\nimport { ErrorMessage, Loader } from '@aurorasolar/common-core/src/loader';\nimport { mergeDeep } from '@aurorasolar/common-core/src/utils';\nimport { CADTriggerActionTypes } from '@aurorasolar/common-data-store';\nimport { designSettingWeatherDatasets } from '@aurorasolar/common-shared-domain';\nimport {\n SimulationEngine,\n UpdatedDesign,\n UpdatedPerformanceSimulation,\n} from '@aurorasolar/graphql-client-schema';\n\nimport { useTriggerCadAction } from '../../hooks';\nimport { LegacySimulationSettingsCore } from './legacy-simulation-settings-core';\nimport {\n SimulationSettingsDocument,\n SimulationSettingsQuery,\n UpdatePerformanceSimMutation,\n useSimulationSettingsQuery,\n useSimulationSettingsWeatherStationsQuery,\n useUpdatePerformanceSimMutation,\n useUpdateSimulationDesignMutation,\n} from './simulation-settings.generated';\n\nconst irradianceModels = ['hay davies', 'reindl', 'perez'];\n\nconst simulationEngines = [\n {\n id: SimulationEngine.Auto,\n name: 'Auto',\n },\n {\n id: SimulationEngine.Aurora,\n name: 'Aurora',\n },\n {\n id: SimulationEngine.Pvwatts,\n name: 'PVWatts v6',\n },\n];\n\nconst DEBOUNCE_WAIT = 500;\n\nconst getOptimisticPerfSimResponse = (\n perfSim: SimulationSettingsQuery['design']['masterPerformanceSimulation'],\n updatedPerfSim: UpdatedPerformanceSimulation,\n): UpdatePerformanceSimMutation => {\n const mergedPerfSim = mergeDeep(perfSim, updatedPerfSim as Partial);\n if (updatedPerfSim.systemLosses != null) {\n mergedPerfSim.systemLosses = updatedPerfSim.systemLosses as (typeof perfSim)['systemLosses'];\n }\n return {\n __typename: 'Mutation',\n updatePerformanceSimulation: mergedPerfSim,\n };\n};\n\n/**\n * TEMPORARY. A more stable solution depends on backend work that is being planned.\n */\nconst countryIsIncluded = (geography: string, country: string | null | undefined) => {\n if (geography === 'Global') {\n return true;\n }\n if (geography === 'United States' && country) {\n return ['United States', 'US', 'USA'].includes(country);\n }\n if (geography === 'Canada' && country) {\n return ['Canada', 'CA', 'CAN'].includes(country);\n }\n if (geography === 'Australia' && country) {\n return ['Australia', 'AUS'].includes(country);\n }\n return false;\n};\n\ninterface LegacySimulationSettingsProps {\n designId: string;\n}\nexport const LegacySimulationSettings: FC = ({ designId }) => {\n const result = useSimulationSettingsQuery({ variables: { designId } });\n const [updateDesignMutation] = useUpdateSimulationDesignMutation();\n const [updatePerfSimMutation] = useUpdatePerformanceSimMutation({\n refetchQueries: [{ query: SimulationSettingsDocument, variables: { designId } }],\n });\n const design = result?.data?.design;\n\n const perfSimId = design?.masterPerformanceSimulation?.id;\n\n const updateCadIrradiance = useTriggerCadAction(CADTriggerActionTypes.ApplySettings, {\n irradianceSettingsChanged: true,\n });\n\n const updatePerformanceSimulation = React.useCallback(\n (updatedPerformanceSimulation: UpdatedPerformanceSimulation) => {\n if (!perfSimId || !design) {\n return undefined;\n }\n if (\n Object.keys(updatedPerformanceSimulation).some(\n (key) => key === 'useLidarShading' || key === 'useHorizonProfile',\n )\n ) {\n updateCadIrradiance({});\n }\n\n return updatePerfSimMutation({\n optimisticResponse: getOptimisticPerfSimResponse(\n design.masterPerformanceSimulation,\n updatedPerformanceSimulation,\n ),\n variables: {\n perfSimId,\n updatedPerformanceSimulation,\n },\n });\n },\n [perfSimId, updatePerfSimMutation, design, updateCadIrradiance],\n );\n\n const weatherDatasetId = design?.irradianceWeatherDatasetId;\n const latitude = design?.project.latitude;\n const longitude = design?.project.longitude;\n const updateDesign = useDebouncedCallback(\n (updatedDesign: UpdatedDesign) => {\n updateDesignMutation({\n variables: {\n designId,\n updatedDesign,\n },\n });\n },\n [designId, updateDesignMutation],\n DEBOUNCE_WAIT,\n );\n\n const allWeatherDatasets = designSettingWeatherDatasets(result?.data?.weatherDatasets ?? []);\n const searchWeatherDatasetIds = useMemo(() => {\n if (!design) {\n return [];\n }\n // Filtering out the NREL-PSM dataset\n const datasets = allWeatherDatasets.filter(({ geography }) => {\n return countryIsIncluded(geography, design!.project.country);\n });\n return datasets.map(({ id }) => id);\n }, [design, allWeatherDatasets]);\n\n const skip = searchWeatherDatasetIds.length < 1 || latitude == null || longitude == null;\n const weatherStationsResult = useSimulationSettingsWeatherStationsQuery({\n skip,\n variables: {\n location: {\n latitude: latitude!,\n longitude: longitude!,\n },\n weatherDatasetIds: searchWeatherDatasetIds,\n },\n });\n const allWeatherStations = (weatherStationsResult.data?.allWeatherStations || []).filter(\n (set) => set.weatherStations.length > 0,\n );\n const weatherStations = allWeatherStations.find((set) => set?.id === weatherDatasetId);\n const weatherDatasets = allWeatherDatasets.filter(({ id }) =>\n allWeatherStations.some((set) => set?.id === id),\n );\n\n const hasErrors = [result, weatherStationsResult].some(({ error }) => !!error);\n const isLoading = !design;\n // UI is ready if there are stations available for some sets, even if for whatever reason stations not available for current dataset\n const weatherReady =\n !!design && allWeatherStations.some((entry) => entry.weatherStations.length > 0);\n\n if (hasErrors) {\n return ;\n }\n if (isLoading) {\n return ;\n }\n\n const setWeatherDataset = (id: string) => {\n const weatherStation = allWeatherStations.find((set) => set?.id === id)?.weatherStations[0];\n if (!weatherStation) {\n return false;\n }\n\n updateDesign({\n irradianceWeatherDatasetId: id,\n irradianceWeatherStationId: weatherStation.id,\n });\n return true;\n };\n\n return (\n \n );\n};\n","import { ChangeEvent, FC, useMemo } from 'react';\n\nimport { Colors } from '@aurorasolar/common-core/src/colors';\nimport { DropdownButtonType, StandardSelect } from '@aurorasolar/common-core/src/select';\nimport { AuroraSwitch } from '@aurorasolar/common-core/src/switch/switch';\nimport { Text } from '@aurorasolar/common-core/src/typography';\nimport { capitalizeWords } from '@aurorasolar/common-core/src/utils';\nimport { DisplayWeatherDataset } from '@aurorasolar/common-shared-domain';\nimport { UpdatedDesign, UpdatedPerformanceSimulation } from '@aurorasolar/graphql-client-schema';\n\nimport { SettingsInputArea } from '../shared-components';\nimport { SimulationSettingsQuery } from './simulation-settings.generated';\nimport { DisplayWeatherStation } from './types';\n\nexport interface AuroraSimulationFormProps {\n design: SimulationSettingsQuery['design'];\n irradianceModels: string[];\n setWeatherDataset: (id: string) => void;\n updateDesign: (updatedDesign: UpdatedDesign) => void;\n updateCadIrradiance: () => void;\n updatePerformanceSimulation: (updatedPerfSim: UpdatedPerformanceSimulation) => void;\n weatherDatasets: DisplayWeatherDataset[];\n weatherStations: DisplayWeatherStation[] | null;\n weatherStationsReloading: boolean;\n}\nexport enum AuroraSimulationFormTestid {\n WEATHER_DATA = 'simulation-settings-weather-data',\n WEATHER_STATION = 'simulation-settings-weather-station',\n IRRADIANCE_MODEL = 'simulation-settings-irradiance-model',\n INVERTER_CLIPPING = 'simulation-settings-inverter-clipping',\n SUBMODULE_SIMULATION = 'simulation-settings-submodule-simulation',\n}\n\nexport const AuroraSimulationForm: FC = ({\n design,\n weatherStations,\n weatherDatasets,\n updateDesign,\n updateCadIrradiance,\n irradianceModels,\n updatePerformanceSimulation,\n setWeatherDataset,\n weatherStationsReloading,\n}) => {\n const perfSim = design.masterPerformanceSimulation;\n\n const activeWeatherDataset = weatherDatasets.find(\n ({ id }) => id === design.irradianceWeatherDatasetId,\n );\n\n const rawWeatherStations = weatherStations || [];\n const activeWeatherStation = rawWeatherStations.find(\n ({ id }) => id === design.irradianceWeatherStationId,\n );\n\n const initialLoad = weatherStations == null;\n const emptyStations = rawWeatherStations.length === 0;\n const invalidDataset = !initialLoad && !weatherStationsReloading && emptyStations;\n\n const defaultWeatherDatasetText = useMemo(() => {\n if (initialLoad) {\n return 'Loading...';\n }\n return activeWeatherDataset?.name;\n }, [activeWeatherDataset, initialLoad]);\n\n const defaultWeatherStationText = useMemo(() => {\n if (initialLoad || weatherStationsReloading) {\n return 'Loading...';\n }\n if (invalidDataset) {\n return `None`;\n }\n return activeWeatherStation?.name;\n }, [activeWeatherStation, initialLoad, invalidDataset, weatherStationsReloading]);\n\n const renderAfter = () => {\n return (\n \n No weather stations found\n \n );\n };\n\n return (\n <>\n \n id}\n getItemLabel={({ name }) => name}\n renderAfter={invalidDataset ? renderAfter() : undefined}\n selectable={{\n items: weatherDatasets,\n onItemSelected: (weatherDataset) => setWeatherDataset(weatherDataset!.id),\n selectedItem: activeWeatherDataset,\n }}\n />\n \n \n id}\n getItemLabel={({ name }) => name}\n selectable={{\n items: rawWeatherStations,\n onItemSelected: (weatherStation) => {\n updateDesign({\n irradianceWeatherStationId: weatherStation!.id,\n });\n updateCadIrradiance();\n },\n selectedItem: activeWeatherStation,\n }}\n />\n \n \n item}\n getItemLabel={capitalizeWords}\n selectable={{\n items: irradianceModels,\n onItemSelected: (irradianceModel) => {\n updateDesign({\n irradianceModel,\n });\n updateCadIrradiance();\n },\n selectedItem: irradianceModels.find((model) => model === design.irradianceModel),\n }}\n />\n \n \n ) =>\n updatePerformanceSimulation({\n inverterClipping: target.checked,\n })\n }\n />\n \n \n ) =>\n updatePerformanceSimulation({\n submoduleSimulation: target.checked,\n })\n }\n />\n \n \n );\n};\n","import { ChangeEvent, FC } from 'react';\n\nimport { DropdownButtonType, StandardSelect } from '@aurorasolar/common-core/src/select';\nimport { AuroraSwitch } from '@aurorasolar/common-core/src/switch/switch';\nimport { CADTriggerActionProps, CADTriggerActionTypes } from '@aurorasolar/common-data-store';\nimport { OrgPermission } from '@aurorasolar/common-module-loader';\nimport { OrgPermissionGuard } from '@aurorasolar/common-org-permissions';\nimport { DisplayWeatherDataset } from '@aurorasolar/common-shared-domain';\nimport {\n SimulationEngine,\n UpdatedDesign,\n UpdatedPerformanceSimulation,\n} from '@aurorasolar/graphql-client-schema';\nimport { Flex } from '@rebass/grid';\n\nimport { SettingsDivider, SettingsInputArea, SettingsTitle } from '../shared-components';\nimport { AuroraSimulationForm } from './aurora-simulation-form';\nimport { PVWattsSimulationForm } from './pvwatts-simulation-form';\nimport { SimulationSettingsQuery } from './simulation-settings.generated';\nimport { SystemLosses } from './system-losses';\nimport { DisplayWeatherStation } from './types';\n\nexport enum SimulationSettingsTestid {\n SIMULATION_ENGINE = 'simulation-settings-simulation-engine',\n SHADING_ENGINE = 'simulation-settings-shading-engine',\n HORIZON_SHADING = 'simulation-settings-horizon-shading',\n LIDAR_SHADING = 'simulation-settings-lidar-shading',\n}\ninterface SimulationSettingsCoreProps {\n design: SimulationSettingsQuery['design'];\n irradianceModels: string[];\n setWeatherDataset: (id: string) => void;\n simulationEngines: { id: SimulationEngine; name: string }[];\n updateDesign: (updatedDesign: UpdatedDesign) => void;\n updatePerformanceSimulation: (updatedPerfSim: UpdatedPerformanceSimulation) => void;\n updateCadIrradiance(params?: CADTriggerActionProps[CADTriggerActionTypes.ApplySettings]): void;\n weatherDatasets: DisplayWeatherDataset[];\n weatherStations: DisplayWeatherStation[] | null;\n weatherStationsReloading: boolean;\n}\n\nexport const SimulationSettingsCore: FC = ({\n design,\n irradianceModels,\n setWeatherDataset,\n simulationEngines,\n updateCadIrradiance,\n updateDesign,\n updatePerformanceSimulation,\n weatherDatasets,\n weatherStations,\n weatherStationsReloading,\n}) => {\n const perfSim = design.masterPerformanceSimulation;\n const { simulationEngine } = perfSim;\n const engineMatches = (...matches: SimulationEngine[]) =>\n matches.includes(perfSim.simulationEngine);\n\n return (\n \n Simulation\n \n id}\n getItemLabel={({ name }) => name}\n selectable={{\n items: simulationEngines,\n onItemSelected: (selectedEngine) => {\n updatePerformanceSimulation({\n simulationEngine: selectedEngine?.id ?? SimulationEngine.Auto,\n });\n },\n selectedItem: simulationEngines.find(({ id }) => id === simulationEngine),\n }}\n />\n \n \n ) =>\n updatePerformanceSimulation({\n shadingEngineEnabled: target.checked,\n })\n }\n />\n \n \n ) => {\n // Backend handles update to Design\n updatePerformanceSimulation({\n useHorizonProfile: target.checked,\n });\n }}\n />\n \n \n \n ) => {\n // Backend handles update to Design\n updatePerformanceSimulation({\n useLidarShading: target.checked,\n });\n }}\n />\n \n \n \n {engineMatches(SimulationEngine.Auto) && Aurora}\n {engineMatches(SimulationEngine.Auto, SimulationEngine.Aurora) && (\n \n )}\n {engineMatches(SimulationEngine.Auto) && (\n <>\n \n PVWatts\n \n )}\n {engineMatches(SimulationEngine.Auto, SimulationEngine.Pvwatts) && (\n \n )}\n \n \n \n );\n};\n","import React, { FC, useMemo, useState } from 'react';\n\nimport { useDebouncedCallback } from '@aurorasolar/common-core/src/hooks';\nimport { ErrorMessage, Loader } from '@aurorasolar/common-core/src/loader';\nimport { mergeDeep } from '@aurorasolar/common-core/src/utils';\nimport { CADTriggerActionTypes } from '@aurorasolar/common-data-store';\nimport {\n designSettingWeatherDatasets,\n DisplayWeatherDataset,\n isDynamicWeatherDataset as isDynamic,\n mapDisplayWeatherDatasetToInput,\n} from '@aurorasolar/common-shared-domain';\nimport {\n LoadedWeatherDataset,\n SimulationEngine,\n UpdatedDesign,\n UpdatedPerformanceSimulation,\n} from '@aurorasolar/graphql-client-schema';\n\nimport { useTriggerCadAction } from '../../hooks';\nimport { SimulationSettingsCore } from './simulation-settings-core';\nimport {\n SimulationSettingsDocument,\n SimulationSettingsQuery,\n UpdatePerformanceSimMutation,\n useClosestWeatherStationsQuery,\n useSimulationSettingsQuery,\n useUpdatePerformanceSimMutation,\n useUpdateSimulationDesignMutation,\n} from './simulation-settings.generated';\nimport { DisplayWeatherStation } from './types';\n\nconst irradianceModels = ['hay davies', 'reindl', 'perez'];\n\nconst simulationEngines = [\n {\n id: SimulationEngine.Auto,\n name: 'Auto',\n },\n {\n id: SimulationEngine.Aurora,\n name: 'Aurora',\n },\n {\n id: SimulationEngine.Pvwatts,\n name: 'PVWatts v6',\n },\n];\n\nconst DEBOUNCE_WAIT = 500;\n\nconst getOptimisticPerfSimResponse = (\n perfSim: SimulationSettingsQuery['design']['masterPerformanceSimulation'],\n updatedPerfSim: UpdatedPerformanceSimulation,\n): UpdatePerformanceSimMutation => {\n const mergedPerfSim = mergeDeep(perfSim, updatedPerfSim as Partial);\n if (updatedPerfSim.systemLosses != null) {\n mergedPerfSim.systemLosses = updatedPerfSim.systemLosses as (typeof perfSim)['systemLosses'];\n }\n return {\n __typename: 'Mutation',\n updatePerformanceSimulation: mergedPerfSim,\n };\n};\n\ninterface SimulationSettingsProps {\n designId: string;\n solcastEnabled: boolean;\n}\n\nexport const SimulationSettings: FC = ({ designId, solcastEnabled }) => {\n // Fetch design and weather datasets\n const {\n data,\n error: queryError,\n loading: queryLoading,\n } = useSimulationSettingsQuery({\n onCompleted({ design }) {\n const isInitialDatasetDynamic = isDynamic(design.irradianceWeatherDatasetId);\n setInit(isInitialDatasetDynamic);\n },\n variables: { designId },\n });\n const design = data?.design;\n const latitude = design?.project.latitude;\n const longitude = design?.project.longitude;\n const perfSimId = design?.masterPerformanceSimulation?.id;\n const projectId = design?.project.id;\n const activeDatasetId = design?.irradianceWeatherDatasetId;\n const allDatasets = designSettingWeatherDatasets(data?.weatherDatasets ?? [], solcastEnabled);\n const [isInitialDatasetDynamic, setInit]: [\n boolean | undefined,\n React.Dispatch>,\n ] = useState();\n\n // Fetch up to 5 nearby weather stations for each weather dataset\n // omit dynamic datasets (Solcast) from station prefetch unless actively selected\n const {\n data: weatherStationsData,\n error: weatherStationsError,\n refetch: refetchWeatherStations,\n } = useClosestWeatherStationsQuery({\n skip: isInitialDatasetDynamic == null || latitude == null || longitude == null,\n variables: {\n location: {\n latitude: latitude!,\n longitude: longitude!,\n },\n projectId: projectId!,\n weatherDatasets: isInitialDatasetDynamic\n ? allDatasets.map(mapDisplayWeatherDatasetToInput)\n : allDatasets.filter(({ id }) => !isDynamic(id)).map(mapDisplayWeatherDatasetToInput),\n },\n });\n const [weatherStationsReloading, setWeatherStationsReloading] = useState(false);\n\n const loadedDatasets: LoadedWeatherDataset[] = useMemo(() => {\n return weatherStationsData?.closestWeatherStations || [];\n }, [weatherStationsData]);\n\n const availableStations = useMemo(() => {\n if (weatherStationsData == null) {\n return null;\n }\n if (weatherStationsReloading) {\n return [];\n }\n const activeDataset = loadedDatasets.find(({ id }) => id === activeDatasetId);\n return (activeDataset?.weatherStations || []) as DisplayWeatherStation[];\n }, [activeDatasetId, loadedDatasets, weatherStationsData, weatherStationsReloading]);\n\n const availableDatasets = useMemo(() => {\n const result: DisplayWeatherDataset[] = [];\n const loadedDatasetIds = loadedDatasets.map(({ id }) => id);\n allDatasets.forEach((dataset) => {\n // always append Solcast as a dropdown option\n if (isDynamic(dataset.id) || loadedDatasetIds.includes(dataset.id)) {\n result.push(dataset);\n }\n });\n return result;\n }, [loadedDatasets, allDatasets]);\n\n const [updateDesignMutation] = useUpdateSimulationDesignMutation({\n onCompleted: () => setWeatherStationsReloading(false),\n onError: () => setWeatherStationsReloading(false),\n });\n\n const [updatePerfSimMutation] = useUpdatePerformanceSimMutation({\n refetchQueries: [{ query: SimulationSettingsDocument, variables: { designId } }],\n });\n\n const updateCadIrradiance = useTriggerCadAction(CADTriggerActionTypes.ApplySettings, {\n irradianceSettingsChanged: true,\n });\n\n const updatePerformanceSimulation = React.useCallback(\n (updatedPerformanceSimulation: UpdatedPerformanceSimulation) => {\n if (!perfSimId || !design) {\n return undefined;\n }\n if (\n Object.keys(updatedPerformanceSimulation).some(\n (key) => key === 'useLidarShading' || key === 'useHorizonProfile',\n )\n ) {\n updateCadIrradiance({});\n }\n\n return updatePerfSimMutation({\n optimisticResponse: getOptimisticPerfSimResponse(\n design.masterPerformanceSimulation,\n updatedPerformanceSimulation,\n ),\n variables: {\n perfSimId,\n updatedPerformanceSimulation,\n },\n });\n },\n [perfSimId, updatePerfSimMutation, design, updateCadIrradiance],\n );\n\n const updateDesign = useDebouncedCallback(\n (updatedDesign: UpdatedDesign) => {\n updateDesignMutation({\n variables: {\n designId,\n updatedDesign,\n },\n });\n },\n [designId, updateDesignMutation],\n DEBOUNCE_WAIT,\n );\n\n const setWeatherDataset = (newId: string) => {\n // When weather dataset changes, also update the weather station since previous will be invalid\n // Disable the weather station input until both the station and design updates have completed\n setWeatherStationsReloading(true);\n\n const closestStation = loadedDatasets.find(({ id }) => id === newId)?.weatherStations[0];\n\n if (closestStation) {\n updateDesign({\n irradianceWeatherDatasetId: newId,\n irradianceWeatherStationId: closestStation.id,\n });\n updateCadIrradiance();\n } else {\n // If the new dataset's stations weren't included in the initial prefetch, then refetch\n refetchWeatherStations({ weatherDatasets: allDatasets.map(mapDisplayWeatherDatasetToInput) })\n .then(({ data: newData }) => {\n const newDataset = newData.closestWeatherStations.find(\n (loadedDataset) => loadedDataset.id === newId,\n );\n\n const newClosestStation = newDataset?.weatherStations[0];\n if (!newClosestStation) {\n throw new Error('Could not update weather data');\n }\n\n updateDesign({\n irradianceWeatherDatasetId: newId,\n irradianceWeatherStationId: newClosestStation.id,\n });\n updateCadIrradiance();\n return true;\n })\n .catch((_err) => {\n setWeatherStationsReloading(false);\n return false;\n });\n }\n };\n\n if (queryError || weatherStationsError) {\n return ;\n }\n if (queryLoading) {\n return ;\n }\n\n return (\n \n );\n};\n","import { ChangeEvent, FC } from 'react';\nimport styled from 'styled-components';\n\nimport { FullDivider } from '@aurorasolar/common-core/src/divider';\nimport { AuroraNumericInput, NumericInputRightTag } from '@aurorasolar/common-core/src/input';\nimport { DropdownButtonType, StandardSelect } from '@aurorasolar/common-core/src/select';\nimport { AuroraSwitch } from '@aurorasolar/common-core/src/switch/switch';\nimport { withDisabledTooltip } from '@aurorasolar/common-core/src/tooltip/with-disabled-tooltip';\nimport { Text } from '@aurorasolar/common-core/src/typography';\nimport { capitalize } from '@aurorasolar/common-core/src/utils';\nimport { FeatureFlagGuard } from '@aurorasolar/common-feature-flag';\nimport {\n FeatureFlag,\n OrgPermission,\n OrgPermissions,\n useAppModule,\n} from '@aurorasolar/common-module-loader';\nimport { ConversionType, withNumericConversion } from '@aurorasolar/common-numeric-conversion';\nimport { SetbackSettings } from '@aurorasolar/graphql-client-schema';\nimport { Button } from '@blueprintjs/core';\nimport { Box, Flex } from '@rebass/grid';\n\nimport { Colors } from '@aurorasolar/common-core/src/colors';\nimport { GroupedBox, SettingsInputArea, SettingsTitle } from '../shared-components';\nimport { SystemSettingsLocalQuery, SystemSettingsQuery } from './system-settings.generated';\n\n// eslint-disable-next-line\nimport type { O } from 'ts-toolbelt';\n\nconst StyledButton = styled(Button)``;\n\ntype NumericSetback = Omit<\n SystemSettingsLocalQuery['CAD']['setbacks'],\n '__typename' | 'all' | 'dormers'\n>;\n\nexport enum SystemSettingsTestid {\n DESIGN_TYPE = 'system-settings-design-type',\n JURISDICTION = 'system-settings-jurisdiction',\n SETBACKS_ALL = 'system-settings-setbacks-all',\n SETBACKS_VALLEYS = 'system-settings-setbacks-valleys',\n SETBACKS_DORMERS = 'system-settings-setbacks-dormers',\n ROW_SPACING = 'system-settings-row-spacing',\n MODULE_SPACING_X = 'system-settings-module-spacing-x',\n MODULE_SPACING_Y = 'system-settings-module-spacing-y',\n TEMPERATURE_MIN = 'system-settings-module-temperature-min',\n TEMPERATURE_MAX = 'system-settings-module-temperature-max',\n}\n\ninterface SystemSettingsCoreProps {\n design: SystemSettingsQuery['design'];\n jurisdictions: SystemSettingsQuery['jurisdictions'];\n resetSetbacks: () => void;\n setbacks: SetbackSettings;\n updateDesign: (updatedDesign: O.Partial) => void;\n updateSetbackSettings: (patch: Partial) => void;\n}\n\nconst round = (n: number, places: number) => {\n const multiplier = 10 ** places;\n return Math.round(n * multiplier) / multiplier;\n};\nconst NumericInputWithConversion = withNumericConversion(AuroraNumericInput);\n\nconst distanceLimits = {\n max: Infinity,\n min: 0,\n stepSize: 0.1,\n};\n\nexport const SystemSettingsCore: FC = ({\n design,\n jurisdictions,\n updateDesign,\n updateSetbackSettings,\n resetSetbacks,\n setbacks,\n}) => {\n const permissions = useAppModule(OrgPermissions);\n const canEditSite = permissions?.getPermission(OrgPermission.DesignCadSiteEdit);\n const jurisdictionName = design.jurisdiction ? design.jurisdiction.name ?? '' : 'None';\n const numericSetbacks = Object.keys(setbacks!).filter(\n (setback) => !['__typename', 'all', 'dormers'].includes(setback),\n ) as (keyof NumericSetback)[];\n\n const setbackInputs = numericSetbacks.map((setback) => (\n \n updateSetbackSettings({ [setback]: value })}\n tagComponent={NumericInputRightTag}\n />\n \n ));\n\n return (\n \n setbacks\n \n Jurisdiction\n \n }\n twoThirds\n >\n item.id}\n getItemLabel={(item) => item.name}\n selectable={{\n items: jurisdictions,\n onItemSelected: (jurisdiction) => updateDesign({ jurisdictionId: jurisdiction!.id }),\n selectedItem: jurisdictions.find(\n (jurisdiction) => jurisdiction.name === jurisdictionName,\n ),\n }}\n />\n \n {canEditSite && (\n \n \n Reset to Jurisdiction Setbacks\n \n \n )}\n \n \n {\n updateSetbackSettings({ all: value });\n }}\n tagComponent={NumericInputRightTag}\n value={round(setbacks?.all ?? 0, 2)}\n />\n \n \n \n \n \n {setbackInputs}\n \n \n \n \n {withDisabledTooltip(\n !canEditSite,\n !canEditSite ? 'Site mode is restricted by your account Admin' : undefined,\n ) => {\n updateSetbackSettings({ dormers: target.checked });\n }}\n />,\n )}\n \n \n \n \n Spacing}\n flag={FeatureFlag.SolarPanelDefaults}\n >\n Ground mount spacing\n \n \n \n {\n updateDesign({ rowSpacing });\n }}\n tagComponent={NumericInputRightTag}\n value={design.rowSpacing ?? 0}\n />\n \n \n Module Spacing} twoThirds>\n \n \n \n {\n updateDesign({ interModuleSpacingX });\n }}\n tagComponent={NumericInputRightTag}\n value={design.interModuleSpacingX ?? 0}\n />\n \n \n \n {\n updateDesign({ interModuleSpacingY });\n }}\n tagComponent={NumericInputRightTag}\n value={design.interModuleSpacingY ?? 0}\n />\n \n \n \n \n \n Temperature\n \n {design.temperatureSource && (\n \n Data from {design.temperatureSource.toUpperCase()}\n \n )}\n \n }\n twoThirds\n >\n \n \n {\n updateDesign({ temperatureMin: value });\n }}\n stepSize\n tagComponent={NumericInputRightTag}\n value={round(Number(design.temperatureMin), 2)}\n />\n \n \n {\n updateDesign({ temperatureMax: value });\n }}\n stepSize={10}\n tagComponent={NumericInputRightTag}\n value={round(Number(design.temperatureMax), 2)}\n />\n \n \n \n \n );\n};\n","// @ts-ignore: Ignore unused { * as Types } import\nimport * as Types from '@aurorasolar/graphql-client-schema';\n\nimport { gql } from '@apollo/client';\nimport * as Apollo from '@apollo/client';\nconst defaultOptions = {} as const;\nexport type SystemSettingsQueryVariables = Types.Exact<{\n designId: Types.Scalars['ID'];\n}>;\n\n\nexport type SystemSettingsQuery = { __typename: 'Query', design: { __typename: 'Design', id: string, interModuleSpacingX?: number | null | undefined, interModuleSpacingY?: number | null | undefined, jurisdictionId?: string | null | undefined, rowSpacing?: number | null | undefined, temperatureMax?: number | null | undefined, temperatureMin?: number | null | undefined, temperatureSource?: string | null | undefined, jurisdiction?: { __typename: 'Jurisdiction', id: string, name: string, setbacks: { __typename: 'Setbacks', all?: number | null | undefined, dormers?: boolean | null | undefined, eaves?: number | null | undefined, hips?: number | null | undefined, obstructions?: number | null | undefined, rakes?: number | null | undefined, ridges?: number | null | undefined, valleys?: number | null | undefined } } | null | undefined }, jurisdictions: Array<{ __typename: 'Jurisdiction', id: string, name: string, jurisdictionType?: string | null | undefined }> };\n\nexport type SystemSettingsLocalQueryVariables = Types.Exact<{ [key: string]: never; }>;\n\n\nexport type SystemSettingsLocalQuery = { __typename: 'Query', CAD: { __typename: 'CAD', setbacks: { __typename: 'SetbackSettings', all?: number | null | undefined, dormers?: boolean | null | undefined, eaves?: number | null | undefined, hips?: number | null | undefined, obstructions?: number | null | undefined, rakes?: number | null | undefined, ridges?: number | null | undefined, valleys?: number | null | undefined } } };\n\nexport type UpdateSystemSettingsMutationVariables = Types.Exact<{\n designId: Types.Scalars['ID'];\n updatedSettings: Types.UpdatedDesign;\n}>;\n\n\nexport type UpdateSystemSettingsMutation = { __typename: 'Mutation', updateDesign: { __typename: 'Design', id: string } };\n\n\nexport const SystemSettingsDocument = gql`\n query SystemSettings($designId: ID!) @trace_info(traceInfo: {pod: cad}) {\n design: designById(id: $designId) {\n id\n interModuleSpacingX\n interModuleSpacingY\n jurisdictionId\n jurisdiction {\n id\n name\n setbacks {\n all\n dormers\n eaves\n hips\n obstructions\n rakes\n ridges\n valleys\n }\n }\n rowSpacing\n temperatureMax\n temperatureMin\n temperatureSource\n }\n jurisdictions(designId: $designId) {\n id\n name\n jurisdictionType\n }\n}\n `;\n\n/**\n * __useSystemSettingsQuery__\n *\n * To run a query within a React component, call `useSystemSettingsQuery` and pass it any options that fit your needs.\n * When your component renders, `useSystemSettingsQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useSystemSettingsQuery({\n * variables: {\n * designId: // value for 'designId'\n * },\n * });\n */\nexport function useSystemSettingsQuery(baseOptions: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(SystemSettingsDocument, options);\n }\nexport function useSystemSettingsLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(SystemSettingsDocument, options);\n }\nexport type SystemSettingsQueryHookResult = ReturnType;\nexport type SystemSettingsLazyQueryHookResult = ReturnType;\nexport type SystemSettingsQueryResult = Apollo.QueryResult;\nexport const SystemSettingsLocalDocument = gql`\n query SystemSettingsLocal @trace_info(traceInfo: {pod: cad}) {\n CAD @client {\n setbacks: setbackSettings {\n all\n dormers\n eaves\n hips\n obstructions\n rakes\n ridges\n valleys\n }\n }\n}\n `;\n\n/**\n * __useSystemSettingsLocalQuery__\n *\n * To run a query within a React component, call `useSystemSettingsLocalQuery` and pass it any options that fit your needs.\n * When your component renders, `useSystemSettingsLocalQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useSystemSettingsLocalQuery({\n * variables: {\n * },\n * });\n */\nexport function useSystemSettingsLocalQuery(baseOptions?: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(SystemSettingsLocalDocument, options);\n }\nexport function useSystemSettingsLocalLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(SystemSettingsLocalDocument, options);\n }\nexport type SystemSettingsLocalQueryHookResult = ReturnType;\nexport type SystemSettingsLocalLazyQueryHookResult = ReturnType;\nexport type SystemSettingsLocalQueryResult = Apollo.QueryResult;\nexport const UpdateSystemSettingsDocument = gql`\n mutation UpdateSystemSettings($designId: ID!, $updatedSettings: UpdatedDesign!) @trace_info(traceInfo: {pod: cad}) {\n updateDesign(id: $designId, updatedDesign: $updatedSettings) {\n id\n }\n}\n `;\nexport type UpdateSystemSettingsMutationFn = Apollo.MutationFunction;\n\n/**\n * __useUpdateSystemSettingsMutation__\n *\n * To run a mutation, you first call `useUpdateSystemSettingsMutation` within a React component and pass it any options that fit your needs.\n * When your component renders, `useUpdateSystemSettingsMutation` returns a tuple that includes:\n * - A mutate function that you can call at any time to execute the mutation\n * - An object with fields that represent the current status of the mutation's execution\n *\n * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2;\n *\n * @example\n * const [updateSystemSettingsMutation, { data, loading, error }] = useUpdateSystemSettingsMutation({\n * variables: {\n * designId: // value for 'designId'\n * updatedSettings: // value for 'updatedSettings'\n * },\n * });\n */\nexport function useUpdateSystemSettingsMutation(baseOptions?: Apollo.MutationHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useMutation(UpdateSystemSettingsDocument, options);\n }\nexport type UpdateSystemSettingsMutationHookResult = ReturnType;\nexport type UpdateSystemSettingsMutationResult = Apollo.MutationResult;\nexport type UpdateSystemSettingsMutationOptions = Apollo.BaseMutationOptions;","import styled from '@xstyled/styled-components';\nimport { FC, useMemo, useState } from 'react';\n\nimport { Colors } from '@aurorasolar/common-core/src/colors';\nimport { UnderlineTabs } from '@aurorasolar/common-core/src/tab';\nimport { FeatureFlag, FeatureFlags, useAppModule } from '@aurorasolar/common-module-loader';\nimport { Overlay, Tab } from '@blueprintjs/core';\n\nimport { LegacySimulationSettings } from './simulation-settings/legacy-simulation-settings';\nimport { SimulationSettings } from './simulation-settings/simulation-settings';\nimport { SystemSettings } from './system-settings/system-settings';\n\nconst DropdownWrapper = styled.div`\n position: absolute;\n right: 0;\n max-height: 90vh;\n min-width: 500px;\n background: white;\n overflow-y: auto;\n z-index: 101;\n`;\n\nconst CustomTabs = styled(UnderlineTabs)`\n .bp3-tab-list {\n border-bottom: solid 1px ${Colors.GRAY_300};\n padding: 32px 16px 0 32px;\n\n .bp3-tab {\n width: 50%;\n min-width: 180px;\n margin-right: 0;\n text-align: center;\n padding-bottom: 4px;\n }\n }\n\n .bp3-tab-panel {\n margin-top: 0;\n padding: 32px;\n }\n`;\nexport interface DesignSettingsProps {\n designId: string;\n isOpen: boolean | undefined;\n onClose: () => void;\n onClosed: () => void;\n portalContainer: HTMLElement | undefined;\n usePortal: boolean | undefined;\n}\nexport enum DesignSettingsTab {\n SYSTEM = 'design-settings-system-tab',\n SIMULATION = 'design-settings-simulation-tab',\n}\nexport const DesignSettings: FC = ({\n designId,\n isOpen,\n onClose,\n onClosed,\n portalContainer,\n usePortal,\n}) => {\n const [selectedTab, setSelectedTab] = useState(DesignSettingsTab.SYSTEM);\n\n const featureFlags = useAppModule(FeatureFlags);\n const solcastEnabled = useMemo(\n () =>\n featureFlags?.variation(FeatureFlag.AuroraSimWeatherDatasetDefault) === true &&\n featureFlags?.variation(FeatureFlag.SolcastWeatherDataset) === true,\n [featureFlags],\n );\n\n return (\n \n \n setSelectedTab(tab)}\n renderActiveTabPanelOnly\n selectedTabId={selectedTab}\n >\n }>\n System\n \n \n ) : (\n \n )\n }\n >\n Simulation\n \n \n \n \n );\n};\n","// @ts-ignore: Ignore unused { * as Types } import\nimport * as Types from '@aurorasolar/graphql-client-schema';\n\nimport { gql } from '@apollo/client';\nimport * as Apollo from '@apollo/client';\nconst defaultOptions = {} as const;\nexport type DesignSettingsButtonQueryVariables = Types.Exact<{ [key: string]: never; }>;\n\n\nexport type DesignSettingsButtonQuery = { __typename: 'Query', CAD: { __typename: 'CAD', setbackSettings: { __typename: 'SetbackSettings', all?: number | null | undefined } } };\n\n\nexport const DesignSettingsButtonDocument = gql`\n query DesignSettingsButton @trace_info(traceInfo: {pod: cad}) {\n CAD @client {\n setbackSettings {\n all\n }\n }\n}\n `;\n\n/**\n * __useDesignSettingsButtonQuery__\n *\n * To run a query within a React component, call `useDesignSettingsButtonQuery` and pass it any options that fit your needs.\n * When your component renders, `useDesignSettingsButtonQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useDesignSettingsButtonQuery({\n * variables: {\n * },\n * });\n */\nexport function useDesignSettingsButtonQuery(baseOptions?: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(DesignSettingsButtonDocument, options);\n }\nexport function useDesignSettingsButtonLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(DesignSettingsButtonDocument, options);\n }\nexport type DesignSettingsButtonQueryHookResult = ReturnType;\nexport type DesignSettingsButtonLazyQueryHookResult = ReturnType;\nexport type DesignSettingsButtonQueryResult = Apollo.QueryResult;","// @ts-ignore: Ignore unused { * as Types } import\nimport * as Types from '@aurorasolar/graphql-client-schema';\n\nimport { gql } from '@apollo/client';\nimport * as Apollo from '@apollo/client';\nconst defaultOptions = {} as const;\nexport type NearmapAvailabilityInfoQueryVariables = Types.Exact<{\n designId: Types.Scalars['ID'];\n}>;\n\n\nexport type NearmapAvailabilityInfoQuery = { __typename: 'Query', design: { __typename: 'Design', id: string, latitude: number, longitude: number }, nearmapService?: { __typename: 'AddOnService', id: string, remainingCredits?: number | null | undefined, setting?: { __typename: 'AddOnServiceSettings', apiKeyPresent?: boolean | null | undefined, credentials?: { __typename: 'AddOnServiceCredentials', id: string } | null | undefined } | null | undefined } | null | undefined };\n\n\nexport const NearmapAvailabilityInfoDocument = gql`\n query NearmapAvailabilityInfo($designId: ID!) @trace_info(traceInfo: {pod: cad}) {\n design: designById(id: $designId) {\n id\n latitude\n longitude\n }\n nearmapService: addOnServiceByName(name: \"Nearmap Imagery\") {\n id\n remainingCredits\n setting {\n apiKeyPresent\n credentials {\n id\n }\n }\n }\n}\n `;\n\n/**\n * __useNearmapAvailabilityInfoQuery__\n *\n * To run a query within a React component, call `useNearmapAvailabilityInfoQuery` and pass it any options that fit your needs.\n * When your component renders, `useNearmapAvailabilityInfoQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useNearmapAvailabilityInfoQuery({\n * variables: {\n * designId: // value for 'designId'\n * },\n * });\n */\nexport function useNearmapAvailabilityInfoQuery(baseOptions: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(NearmapAvailabilityInfoDocument, options);\n }\nexport function useNearmapAvailabilityInfoLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(NearmapAvailabilityInfoDocument, options);\n }\nexport type NearmapAvailabilityInfoQueryHookResult = ReturnType;\nexport type NearmapAvailabilityInfoLazyQueryHookResult = ReturnType;\nexport type NearmapAvailabilityInfoQueryResult = Apollo.QueryResult;","import { FC } from 'react';\nimport styled from 'styled-components';\n\nimport { AuroraCheckbox } from '@aurorasolar/common-core/src/checkbox/checkbox';\nimport { Colors } from '@aurorasolar/common-core/src/colors';\nimport { SPACES } from '@aurorasolar/common-core/src/layout';\nimport { Text } from '@aurorasolar/common-core/src/typography';\nimport { NearMapAvailableImage } from '@aurorasolar/graphql-client-schema';\nimport { Box } from '@rebass/grid';\n\nimport { MapImageryItem } from '../map-imagery-selector/map-imagery-selector-item';\n\nconst StyledImagerySelection = styled.div`\n width: 346px;\n border: solid 1px ${Colors.GRAY_400};\n border-radius: 6px;\n overflow-y: auto;\n flex: 1 0;\n`;\nconst StyledRow = styled.label`\n display: flex;\n align-items: center;\n padding: ${SPACES[0] / 2}px ${SPACES[2]}px;\n\n &:first-child {\n padding-top: ${SPACES[2]}px;\n }\n\n &:last-child {\n padding-bottom: ${SPACES[2]}px;\n }\n\n .bp3-control {\n margin: 0;\n padding: 0;\n\n .bp3-control-indicator {\n margin: 0;\n }\n }\n`;\n\nexport const NearmapImagerySelection: FC<{\n images: NearMapAvailableImage[];\n selection: Set;\n onChange: (selection: Set) => void;\n trueOrthoItems: MapImageryItem[];\n}> = ({ images, onChange, selection, trueOrthoItems }) => {\n const getDate = (item: MapImageryItem | NearMapAvailableImage): number => {\n if ('nearmapDate' in item) {\n return Number(new Date(item.readableDate!));\n }\n if ('label' in item) {\n // TEMPORARY\n return Number(new Date(item.label.split('(True Ortho)')[0]));\n }\n return -1;\n };\n const sortedItems: (MapImageryItem | NearMapAvailableImage)[] = [\n ...trueOrthoItems,\n ...images,\n ].sort((imageA, imageB) => getDate(imageB) - getDate(imageA));\n\n return (\n \n {sortedItems.map((item, index) => {\n if ('readableDate' in item && item.readableDate) {\n return (\n \n \n {\n const newSelection = new Set(selection);\n if ((target as HTMLInputElement).checked) {\n newSelection.add(item.readableDate!);\n } else {\n newSelection.delete(item.readableDate!);\n }\n onChange(newSelection);\n }}\n />\n \n \n \n {item.readableDate}\n \n \n\n {index === 0 && (\n \n Latest\n \n )}\n \n );\n }\n if ('label' in item) {\n return (\n \n \n \n \n \n \n {item.label}\n \n \n\n {index === 0 && (\n \n Latest\n \n )}\n \n );\n }\n return null;\n })}\n \n );\n};\n","import { FC, useState } from 'react';\nimport styled from 'styled-components';\n\nimport { Colors } from '@aurorasolar/common-core/src/colors';\nimport { AuroraIcon, AuroraIconType } from '@aurorasolar/common-core/src/icon';\nimport { SPACES } from '@aurorasolar/common-core/src/layout';\nimport { Text } from '@aurorasolar/common-core/src/typography';\nimport { Popover } from '@blueprintjs/core';\nimport { Box } from '@rebass/grid';\n\ninterface NearmapModalCreditPopoverProps {\n creditsToConsume: number;\n availableCredits: number;\n}\n\nconst StyledCreditPopover = styled.div`\n .bp3-popover-wrapper {\n display: block;\n }\n\n button {\n background: none;\n border: none;\n padding: 0 ${SPACES[0]}px;\n display: flex;\n align-items: center;\n height: ${SPACES[4]}px;\n }\n`;\nexport const NearmapModalCreditPopover: FC = ({\n creditsToConsume,\n availableCredits,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n return (\n \n setIsOpen(false)} position=\"bottom-right\">\n \n \n {availableCredits} credits in account\n \n \n \n );\n};\n","import { FC, useMemo } from 'react';\nimport styled from 'styled-components';\n\nimport { AuroraThemedButton, AuroraThemedButtonIntent } from '@aurorasolar/common-core/src/button';\nimport { Colors } from '@aurorasolar/common-core/src/colors';\nimport { AuroraIcon, AuroraIconType } from '@aurorasolar/common-core/src/icon';\nimport { MaxHeightFlex, modalBorderRadius, SPACES } from '@aurorasolar/common-core/src/layout';\nimport { IconFontSize, Text } from '@aurorasolar/common-core/src/typography';\nimport { GoogleMap, TileSelector, TileSelectorUpdate } from '@aurorasolar/common-google-map';\nimport { FeatureFlag, FeatureFlags, useAppModule } from '@aurorasolar/common-module-loader';\nimport { NearMapAvailableImage } from '@aurorasolar/graphql-client-schema';\nimport { Dialog } from '@blueprintjs/core';\nimport { Box, Flex } from '@rebass/grid';\n\nimport { MapImageryItem } from '../map-imagery-selector/map-imagery-selector-item';\nimport { NearmapImagerySelection } from './nearmap-imagery-selection';\nimport { NearmapModalCreditPopover } from './nearmap-modal-credit-popover';\n\nexport const StyledNearmapDialog = styled(Dialog)`\n padding: 0;\n width: 70vw;\n background: ${Colors.WHITE};\n height: 70vh;\n border: solid 1px ${Colors.GRAY_300};\n border-radius: ${modalBorderRadius}px;\n box-shadow: 0 0 6px rgba(0, 0, 0, 0.25);\n\n h2 {\n font-weight: 500;\n margin: 0;\n padding: 0;\n }\n`;\n\nconst MapWrap = styled.div`\n flex: 1 0 auto;\n border-radius: ${modalBorderRadius}px 0 0 ${modalBorderRadius}px;\n overflow: hidden;\n display: flex;\n position: relative;\n justify-content: center;\n\n /* To cover the modal's border */\n margin: -1px;\n`;\n\nconst MapOverlay = styled.div`\n position: absolute;\n z-index: 1;\n top: ${SPACES[3]}px;\n\n /* To prevent the overlay from covering the map control buttons */\n @media (max-width: 1350px) {\n display: none;\n }\n`;\n\nexport const CloseNearmapModalButton = styled.div`\n cursor: pointer;\n`;\n\nconst Divider = styled.div`\n border-bottom: solid 1px ${Colors.GRAY_400};\n margin: ${SPACES[4]}px ${SPACES[2]}px ${SPACES[1]}px ${SPACES[2]}px;\n`;\nexport interface NearMapModalCoreProps {\n availableCredits?: number;\n availableImages: NearMapAvailableImage[];\n creditsToConsume: number;\n ignoreCredits: boolean;\n isOpen: boolean;\n mapLocation: google.maps.LatLngLiteral;\n mapStartingSelection?: google.maps.LatLngBounds;\n onClose: VoidFunction;\n onGetImagery: VoidFunction;\n onMapSelectionUpdate: (update: TileSelectorUpdate) => void;\n selectedImages: Set;\n setSelectedImages: (selection: Set) => void;\n trueOrthoItems: MapImageryItem[];\n}\n\nexport const NearmapModalCore: FC = ({\n availableCredits = 0,\n availableImages,\n creditsToConsume,\n ignoreCredits,\n isOpen,\n mapLocation,\n mapStartingSelection,\n onClose,\n onGetImagery,\n onMapSelectionUpdate,\n selectedImages,\n setSelectedImages,\n trueOrthoItems,\n}) => {\n const mapOptions = useMemo(\n () => ({\n center: mapLocation,\n fullscreenControl: false,\n mapTypeId: 'hybrid',\n minZoom: 14,\n rotateControl: false,\n streetViewControl: false,\n tilt: 0,\n zoom: 18,\n }),\n [mapLocation],\n );\n const featureFlags = useAppModule(FeatureFlags);\n const showEMSCredits = featureFlags?.variation(FeatureFlag.ShowEMSCredits);\n const hasEnoughCredits = creditsToConsume <= availableCredits;\n return (\n \n \n \n \n \n Select the desired area\n \n \n \n \n \n \n \n \n

Nearmap Imagery

\n \n \n \n
\n \n \n Purchase high quality aerial images for a selected area.\n \n \n\n \n\n \n {!ignoreCredits && showEMSCredits && (\n \n \n The selected area uses\n \n \n \n )}\n \n Get Imagery\n \n
\n
\n
\n );\n};\n","// @ts-ignore: Ignore unused { * as Types } import\nimport * as Types from '@aurorasolar/graphql-client-schema';\n\nimport { gql } from '@apollo/client';\nimport * as Apollo from '@apollo/client';\nconst defaultOptions = {} as const;\nexport type ConsumeCreditsMutationVariables = Types.Exact<{\n id: Types.Scalars['ID'];\n input: Types.ConsumeAddOnServiceCredits;\n}>;\n\n\nexport type ConsumeCreditsMutation = { __typename: 'Mutation', consumeAddOnServiceCredits: { __typename: 'AddOnServiceCreditConsumed', remainingCredits?: number | null | undefined, status?: string | null | undefined } };\n\n\nexport const ConsumeCreditsDocument = gql`\n mutation ConsumeCredits($id: ID!, $input: ConsumeAddOnServiceCredits!) @trace_info(traceInfo: {pod: cad}) {\n consumeAddOnServiceCredits(id: $id, input: $input) {\n remainingCredits\n status\n }\n}\n `;\nexport type ConsumeCreditsMutationFn = Apollo.MutationFunction;\n\n/**\n * __useConsumeCreditsMutation__\n *\n * To run a mutation, you first call `useConsumeCreditsMutation` within a React component and pass it any options that fit your needs.\n * When your component renders, `useConsumeCreditsMutation` returns a tuple that includes:\n * - A mutate function that you can call at any time to execute the mutation\n * - An object with fields that represent the current status of the mutation's execution\n *\n * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2;\n *\n * @example\n * const [consumeCreditsMutation, { data, loading, error }] = useConsumeCreditsMutation({\n * variables: {\n * id: // value for 'id'\n * input: // value for 'input'\n * },\n * });\n */\nexport function useConsumeCreditsMutation(baseOptions?: Apollo.MutationHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useMutation(ConsumeCreditsDocument, options);\n }\nexport type ConsumeCreditsMutationHookResult = ReturnType;\nexport type ConsumeCreditsMutationResult = Apollo.MutationResult;\nexport type ConsumeCreditsMutationOptions = Apollo.BaseMutationOptions;","import { NearMapAvailableImage } from '@aurorasolar/graphql-client-schema';\n\nexport enum NearmapAvailabilityType {\n LOADING,\n NO_IMAGERY,\n NO_SERVICE,\n AVAILABLE,\n}\n\nexport interface NearmapAvailabilityInfo {\n apiKey?: string;\n availability: NearmapAvailabilityType;\n images: NearMapAvailableImage[];\n location?: { latitude: number; longitude: number };\n remainingCredits?: number;\n serviceId?: string;\n}\n","// @ts-ignore: Ignore unused { * as Types } import\nimport * as Types from '@aurorasolar/graphql-client-schema';\n\nimport { gql } from '@apollo/client';\nimport * as Apollo from '@apollo/client';\nconst defaultOptions = {} as const;\nexport type RemoveConflictingImagesMutationVariables = Types.Exact<{\n ids: Array | Types.Scalars['ID'];\n}>;\n\n\nexport type RemoveConflictingImagesMutation = { __typename: 'Mutation', deleteOrthoImages: Array };\n\n\nexport const RemoveConflictingImagesDocument = gql`\n mutation removeConflictingImages($ids: [ID!]!) @trace_info(traceInfo: {pod: cad}) {\n deleteOrthoImages(ids: $ids)\n}\n `;\nexport type RemoveConflictingImagesMutationFn = Apollo.MutationFunction;\n\n/**\n * __useRemoveConflictingImagesMutation__\n *\n * To run a mutation, you first call `useRemoveConflictingImagesMutation` within a React component and pass it any options that fit your needs.\n * When your component renders, `useRemoveConflictingImagesMutation` returns a tuple that includes:\n * - A mutate function that you can call at any time to execute the mutation\n * - An object with fields that represent the current status of the mutation's execution\n *\n * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2;\n *\n * @example\n * const [removeConflictingImagesMutation, { data, loading, error }] = useRemoveConflictingImagesMutation({\n * variables: {\n * ids: // value for 'ids'\n * },\n * });\n */\nexport function useRemoveConflictingImagesMutation(baseOptions?: Apollo.MutationHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useMutation(RemoveConflictingImagesDocument, options);\n }\nexport type RemoveConflictingImagesMutationHookResult = ReturnType;\nexport type RemoveConflictingImagesMutationResult = Apollo.MutationResult;\nexport type RemoveConflictingImagesMutationOptions = Apollo.BaseMutationOptions;","import React, { FC } from 'react';\nimport styled from 'styled-components';\n\nimport { Colors } from '@aurorasolar/common-core/src/colors';\nimport { AuroraIcon } from '@aurorasolar/common-core/src/icon';\nimport { SPACES } from '@aurorasolar/common-core/src/layout';\nimport { Text } from '@aurorasolar/common-core/src/typography';\nimport { Position, Tooltip } from '@blueprintjs/core';\n\nimport { MapImageryItem } from './map-imagery-selector-item';\n\ninterface MapImagerySectionTitleProps {\n item: MapImageryItem;\n onClick: (event: React.MouseEvent) => void;\n uploadInProgress?: boolean;\n}\n\nconst StyledTitle = styled.li`\n padding: ${SPACES[2]}px ${SPACES[2]}px ${SPACES[0]}px;\n text-transform: capitalize;\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n position: relative;\n min-width: 200px;\n\n button {\n background: transparent;\n border: none;\n padding: 4px 6px;\n margin: -4px;\n border-radius: 6px;\n cursor: pointer;\n\n :hover {\n background: ${Colors.GRAY_200};\n }\n }\n &:not(:first-child) {\n border-top: solid 1px transparent;\n padding-bottom: 16px;\n\n /* Horizontal Rule */\n &::before {\n content: '';\n position: absolute;\n left: 0;\n right: 0;\n top: -1px;\n display: block;\n margin: 0 ${SPACES[2]}px;\n border-bottom: solid 1px ${Colors.GRAY_300};\n }\n }\n &:last-child {\n padding: ${SPACES[2]}px ${SPACES[2]}px ${SPACES[2]}px;\n }\n`;\n\nexport const MapImagerySectionTitle: FC = ({\n item,\n onClick,\n uploadInProgress,\n}) => {\n return (\n \n \n {item.label}\n \n {item.titleIcon && item.action && (\n {\n event.stopPropagation();\n onClick(event);\n }}\n type=\"button\"\n >\n {item.tooltip ? (\n \n \n \n ) : (\n \n )}\n \n )}\n \n );\n};\n","import React, { useState } from 'react';\nimport styled from 'styled-components';\n\nimport { Colors } from '@aurorasolar/common-core/src/colors';\nimport { AuroraIcon, AuroraIconType } from '@aurorasolar/common-core/src/icon';\nimport { SPACES } from '@aurorasolar/common-core/src/layout';\nimport { Text } from '@aurorasolar/common-core/src/typography';\nimport * as DS from '@aurorasolar/ds';\nimport { Position, Tooltip } from '@blueprintjs/core';\nimport { Flex } from '@rebass/grid';\n\nexport interface MapImageryItem {\n id: string;\n active?: boolean;\n action?: VoidFunction;\n secondaryAction?: VoidFunction;\n isCustom?: boolean;\n isTitle?: boolean;\n label: string;\n selectedLabel?: string;\n titleIcon?: AuroraIconType;\n isEdited?: boolean;\n finishEditing?: () => void;\n isUploading?: boolean;\n tooltip?: string;\n}\n\nconst StyledImagerySelectItem = styled.li<{\n isSelected: boolean;\n isEdited: boolean;\n isUploading: boolean;\n isMaxImageryTooltipShown: boolean;\n}>`\n color: ${Colors.GRAY_800};\n padding: ${SPACES[1]}px ${SPACES[2]}px ${SPACES[1]}px ${SPACES[4]}px;\n font-size: 12px;\n cursor: ${({ isMaxImageryTooltipShown }) =>\n isMaxImageryTooltipShown ? `not-allowed` : `pointer`};\n ${({ isSelected }) => isSelected && `font-weight: 500`};\n ${({ isEdited, isUploading }) =>\n (isEdited || isUploading) && `background: ${isEdited ? Colors.GRAY_100 : Colors.GRAY_200}`};\n\n .bp3-popover-target {\n display: flex;\n min-width: 200px;\n }\n\n :hover {\n background: ${Colors.GRAY_200};\n }\n\n :active {\n background: ${Colors.GRAY_300};\n }\n\n button {\n background: transparent;\n border: none;\n padding: 4px;\n margin: -4px;\n margin-left: 4px;\n border-radius: 6px;\n cursor: pointer;\n\n :hover {\n background: ${Colors.GRAY_300};\n }\n }\n\n button[disabled] {\n cursor: not-allowed;\n\n :hover {\n background: none;\n }\n }\n\n &:last-child {\n padding-bottom: ${SPACES[2]}px;\n }\n`;\n\nconst ActiveMapLabelContainer = styled(Flex)`\n min-width: 0;\n overflow: hidden;\n`;\n\nconst OverflowText = styled(Text)`\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n`;\n\ninterface MapSelectorItemProps {\n item: MapImageryItem;\n onClick?: (event: React.MouseEvent) => void;\n isMaxImageryReached?: boolean;\n isSelected: boolean;\n uploadInProgress?: boolean;\n}\n\nconst MapImagerySelectorItemEditTestID = 'MapImagerySelectorItemEdit';\nconst MapImagerySelectorItemCheckmarkTestID = 'MapImagerySelectorItemCheckmark';\nconst MapImagerySelectorItemCloseTestID = 'MapImagerySelectorItemClose';\n\nexport const MapImagerySelectorItem = ({\n item,\n onClick,\n isMaxImageryReached,\n isSelected,\n uploadInProgress,\n}: MapSelectorItemProps) => {\n const [isHovered, setHovered] = useState(false);\n const isMaxImageryTooltipShown = !!(\n item.isCustom &&\n isHovered &&\n isMaxImageryReached &&\n !item.active\n );\n const color = uploadInProgress && item.isCustom ? Colors.GRAY_400 : Colors.GRAY_800;\n let secondaryIcon: null | 'checkmark' | 'edit' | 'finish-editing' = null;\n if (item.isEdited && isHovered) {\n secondaryIcon = 'finish-editing';\n } else if (item.secondaryAction && isHovered) {\n secondaryIcon = 'edit';\n } else if (isSelected) {\n secondaryIcon = 'checkmark';\n }\n return (\n \n {\n if (uploadInProgress && item.isCustom) {\n return;\n }\n onClick?.(event);\n }\n }\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n >\n \n \n \n {item.label?.replace(/ /g, '\\u00A0')}\n \n {secondaryIcon === 'checkmark' && (\n \n \n \n )}\n {secondaryIcon === 'edit' && (\n {\n e.stopPropagation();\n item.secondaryAction?.();\n }}\n type=\"button\"\n >\n \n \n )}\n {secondaryIcon === 'finish-editing' && (\n {\n e.stopPropagation();\n if (item.finishEditing) {\n item.finishEditing();\n }\n }}\n type=\"button\"\n >\n \n \n )}\n \n \n \n \n );\n};\n","import React, { FC, useMemo } from 'react';\nimport styled from 'styled-components';\n\nimport { AuroraIconType } from '@aurorasolar/common-core/src/icon';\nimport { SPACES } from '@aurorasolar/common-core/src/layout';\nimport * as DS from '@aurorasolar/ds';\nimport { CadModal } from '@aurorasolar/graphql-client-schema';\nimport { ButtonGroup, Popover, PopoverInteractionKind, PopoverPosition } from '@blueprintjs/core';\nimport { x } from '@xstyled/styled-components';\n\nimport { FeatureFlag, FeatureFlags, useAppModule } from '@aurorasolar/common-module-loader';\nimport { useCadModal } from '../cad-modals';\nimport { CadScreenButton } from '../cad-screen-button/cad-screen-button';\nimport { MapImagerySectionTitle } from './map-imagery-section-title';\nimport { MapImageryItem, MapImagerySelectorItem } from './map-imagery-selector-item';\n\nconst MapSelectorList = styled.ul`\n list-style-type: none;\n padding: 0;\n margin: 0;\n max-width: 290px;\n border-radius: 5px;\n overflow: hidden;\n`;\n\ninterface MapImagerySelectorCoreProps {\n isActive: boolean;\n isMaxImageryReached?: boolean;\n isMenuToggleButtonSelected?: boolean;\n items: MapImageryItem[];\n onFinishEditing?: () => void;\n selectedId?: string;\n setIsMenuToggleButtonSelected?: React.Dispatch>;\n toggleMap: () => void;\n uploadInProgress?: boolean;\n useDS?: boolean;\n}\n\nconst OldMapSelectorButtonWrap = styled(ButtonGroup)`\n position: relative;\n margin-right: ${SPACES[0]}px;\n max-width: 290px;\n max-height: 30px;\n\n * {\n overflow: hidden;\n max-width: 100%;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n`;\n\nconst DSMapSelectorButtonWrap = styled(DS.ButtonGroup).attrs({\n boxShadow: 3,\n})`\n gap: 1px;\n`;\n\nconst CustomDSButton = styled(DS.Button)`\n background-color: 'uiBg';\n max-width: 280px;\n :hover {\n background-color: 'gray-200';\n }\n &[aria-pressed='true'] {\n background-color: 'gray-300';\n }\n`;\n\nexport const TOGGLE_MAP_IMAGERY_TESTID = 'toggle-map-imagery';\nexport const MAP_IMAGERY_SELECT_BUTTON_TESTID = 'map-imagery-select-button';\nconst MAP_IMAGERY_RESIZE_BUTTON_TESTID = 'map-imagery-resize-button';\n\nexport const MapImagerySelectorCore = ({\n isActive,\n isMaxImageryReached,\n isMenuToggleButtonSelected,\n items,\n setIsMenuToggleButtonSelected = () => {},\n toggleMap,\n uploadInProgress,\n useDS = false,\n}: MapImagerySelectorCoreProps) => {\n const disabledMapResizing = (selectedItem: MapImageryItem[]) => {\n const disabledMaps: string[] = [];\n selectedItem.forEach((item) => {\n if (\n item.label.toLowerCase().includes('nearmap') ||\n item.label.toLowerCase().includes('custom') ||\n item.label.toLowerCase().includes('vexcel')\n ) {\n disabledMaps.push(item.label);\n }\n if (\n item.selectedLabel &&\n (item.selectedLabel.toLowerCase().includes('vexcel') ||\n item.selectedLabel.toLowerCase().includes('custom') ||\n item.selectedLabel.toLowerCase().includes('nearmap'))\n ) {\n disabledMaps.push(item.selectedLabel.slice(0, item.selectedLabel.indexOf(':')));\n }\n });\n return disabledMaps;\n };\n\n const { title, isMapResizeDisabled, mapResizeTooltipCopy } = useMemo((): {\n title: string;\n isMapResizeDisabled: boolean;\n mapResizeTooltipCopy: string;\n } => {\n const selectedItem = items.filter(({ active }) => active);\n const disabled = disabledMapResizing(selectedItem);\n if (selectedItem.length === 0) {\n return {\n isMapResizeDisabled: true,\n mapResizeTooltipCopy: 'Select a map before resizing',\n title: 'No map selected',\n };\n }\n if (selectedItem.length > 1) {\n return {\n isMapResizeDisabled: disabled.length === selectedItem.length,\n mapResizeTooltipCopy:\n disabled.length === selectedItem.length\n ? `Resizing not available for ${disabled.join(' or ')} images`\n : 'Resize Map',\n title: `${selectedItem.length} maps selected`,\n };\n }\n return {\n isMapResizeDisabled: disabled.length > 0,\n mapResizeTooltipCopy:\n disabled.length > 0 ? `Resizing not available for ${disabled[0]} images` : 'Resize Map',\n title: selectedItem[0]?.selectedLabel || selectedItem[0]?.label || 'No map selected',\n };\n }, [items]);\n const [activeModal, setActiveModal] = useCadModal();\n const featureFlags = useAppModule(FeatureFlags);\n\n const hasMapResizeFF = featureFlags?.variation(FeatureFlag.HideMapExpansion);\n const MapSelectorButtonWrap = (useDS ? DSMapSelectorButtonWrap : OldMapSelectorButtonWrap) as FC;\n return (\n \n {!useDS ? (\n \n ) : (\n <>\n )}\n setIsMenuToggleButtonSelected(false)}\n onOpening={() => setIsMenuToggleButtonSelected(true)}\n position={PopoverPosition.TOP_LEFT}\n >\n {!useDS ? (\n \n ) : (\n \n setIsMenuToggleButtonSelected(!isMenuToggleButtonSelected)}\n pressed={isMenuToggleButtonSelected}\n pressedIcon={DS.IconMapFill}\n variant=\"tertiary\"\n >\n {title}\n {isMenuToggleButtonSelected ? (\n \n ) : (\n \n )}\n \n \n )}\n \n {items.map((item) =>\n item.isTitle ? (\n {})}\n uploadInProgress={uploadInProgress}\n />\n ) : (\n \n ),\n )}\n \n \n {!useDS ? (\n <>\n ) : (\n <>\n \n \n }\n preferredAlignment=\"N\"\n >\n {isActive ? 'Hide map' : 'Show map'}\n \n \n \n setActiveModal(CadModal.ImageryExpansion)}\n data-testid={MAP_IMAGERY_RESIZE_BUTTON_TESTID}\n disabled={!!hasMapResizeFF && isMapResizeDisabled}\n icon={DS.IconResizeCanvas}\n pressed={activeModal === CadModal.ImageryExpansion}\n pressedIcon={DS.IconResizeCanvasFill}\n variant=\"tertiary\"\n />\n }\n enabled={!!hasMapResizeFF}\n preferredAlignment=\"N\"\n >\n {hasMapResizeFF && mapResizeTooltipCopy}\n \n \n \n )}\n \n );\n};\n","// @ts-ignore: Ignore unused { * as Types } import\nimport * as Types from '@aurorasolar/graphql-client-schema';\n\nimport { gql } from '@apollo/client';\nimport * as Apollo from '@apollo/client';\nconst defaultOptions = {} as const;\nexport type MapSelectionFragment = { __typename: 'OrthoImage', id: string, source: Types.OrthoImageSource, active: boolean, name: string, captureDate?: string | null | undefined, resource?: { __typename: 'GeodataResource', id?: string | null | undefined } | null | undefined };\n\nexport type MapImageryItemsQueryVariables = Types.Exact<{\n designId: Types.Scalars['ID'];\n}>;\n\n\nexport type MapImageryItemsQuery = { __typename: 'Query', design: { __typename: 'Design', id: string, project: { __typename: 'Project', id: string, orthoImages: Array<{ __typename: 'OrthoImage', id: string, source: Types.OrthoImageSource, active: boolean, name: string, captureDate?: string | null | undefined, resource?: { __typename: 'GeodataResource', id?: string | null | undefined } | null | undefined }> } } };\n\nexport type ImageryVisibilityQueryVariables = Types.Exact<{ [key: string]: never; }>;\n\n\nexport type ImageryVisibilityQuery = { __typename: 'Query', CAD: { __typename: 'CAD', viewSettings: { __typename: 'ViewSettings', design3d?: { __typename: 'ViewPortViewSettings', mapImagery?: boolean | null | undefined } | null | undefined } } };\n\nexport const MapSelectionFragmentDoc = gql`\n fragment MapSelection on OrthoImage {\n id\n source\n active\n name\n captureDate\n resource {\n id\n }\n}\n `;\nexport const MapImageryItemsDocument = gql`\n query MapImageryItems($designId: ID!) @trace_info(traceInfo: {pod: cad}) {\n design: designById(id: $designId) {\n id\n project {\n id\n orthoImages {\n ...MapSelection\n }\n }\n }\n}\n ${MapSelectionFragmentDoc}`;\n\n/**\n * __useMapImageryItemsQuery__\n *\n * To run a query within a React component, call `useMapImageryItemsQuery` and pass it any options that fit your needs.\n * When your component renders, `useMapImageryItemsQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useMapImageryItemsQuery({\n * variables: {\n * designId: // value for 'designId'\n * },\n * });\n */\nexport function useMapImageryItemsQuery(baseOptions: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(MapImageryItemsDocument, options);\n }\nexport function useMapImageryItemsLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(MapImageryItemsDocument, options);\n }\nexport type MapImageryItemsQueryHookResult = ReturnType;\nexport type MapImageryItemsLazyQueryHookResult = ReturnType;\nexport type MapImageryItemsQueryResult = Apollo.QueryResult;\nexport const ImageryVisibilityDocument = gql`\n query ImageryVisibility @trace_info(traceInfo: {pod: cad}) {\n CAD @client {\n viewSettings {\n design3d {\n mapImagery\n }\n }\n }\n}\n `;\n\n/**\n * __useImageryVisibilityQuery__\n *\n * To run a query within a React component, call `useImageryVisibilityQuery` and pass it any options that fit your needs.\n * When your component renders, `useImageryVisibilityQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useImageryVisibilityQuery({\n * variables: {\n * },\n * });\n */\nexport function useImageryVisibilityQuery(baseOptions?: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(ImageryVisibilityDocument, options);\n }\nexport function useImageryVisibilityLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(ImageryVisibilityDocument, options);\n }\nexport type ImageryVisibilityQueryHookResult = ReturnType;\nexport type ImageryVisibilityLazyQueryHookResult = ReturnType;\nexport type ImageryVisibilityQueryResult = Apollo.QueryResult;","// @ts-ignore: Ignore unused { * as Types } import\nimport * as Types from '@aurorasolar/graphql-client-schema';\n\nimport { gql } from '@apollo/client';\nimport * as Apollo from '@apollo/client';\nconst defaultOptions = {} as const;\nexport type GetUploadInfoMutationVariables = Types.Exact<{\n projectId: Types.Scalars['ID'];\n input: Types.OrthoImageUpload;\n}>;\n\n\nexport type GetUploadInfoMutation = { __typename: 'Mutation', uploadOrthoImage: { __typename: 'OrthoImageUploadUrl', id: string, url: string } };\n\n\nexport const GetUploadInfoDocument = gql`\n mutation GetUploadInfo($projectId: ID!, $input: OrthoImageUpload!) @trace_info(traceInfo: {pod: cad}) {\n uploadOrthoImage(projectId: $projectId, input: $input) {\n id\n url\n }\n}\n `;\nexport type GetUploadInfoMutationFn = Apollo.MutationFunction;\n\n/**\n * __useGetUploadInfoMutation__\n *\n * To run a mutation, you first call `useGetUploadInfoMutation` within a React component and pass it any options that fit your needs.\n * When your component renders, `useGetUploadInfoMutation` returns a tuple that includes:\n * - A mutate function that you can call at any time to execute the mutation\n * - An object with fields that represent the current status of the mutation's execution\n *\n * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2;\n *\n * @example\n * const [getUploadInfoMutation, { data, loading, error }] = useGetUploadInfoMutation({\n * variables: {\n * projectId: // value for 'projectId'\n * input: // value for 'input'\n * },\n * });\n */\nexport function useGetUploadInfoMutation(baseOptions?: Apollo.MutationHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useMutation(GetUploadInfoDocument, options);\n }\nexport type GetUploadInfoMutationHookResult = ReturnType;\nexport type GetUploadInfoMutationResult = Apollo.MutationResult;\nexport type GetUploadInfoMutationOptions = Apollo.BaseMutationOptions;","import { Formik, FormikConfig } from 'formik';\nimport { useMemo } from 'react';\nimport * as yup from 'yup';\n\nimport * as DS from '@aurorasolar/ds';\n\nimport { SystemComponentType } from '../system-components';\nimport {\n ComponentDropdownInput,\n ComponentDropdownInputBaseProps,\n} from './component-dropdown-input';\n\nexport type ComponentDropdownValidate = FormikConfig<{ value: string[] }>['validate'];\n\ntype ComponentDropdownFormProps = { validate?: ComponentDropdownValidate };\n\nexport type ComponentDropdownProps = ComponentDropdownFormProps &\n Omit, 'name'> & {\n selectedId?: string | null;\n onSelection: (id: string) => void;\n error?: string;\n };\n\n/**\n * A dropdown that allows the user to select a single component.\n *\n * Technically this is a wrapper around the ComponentMultiSelectDropdown,\n * but it helps avoid a foot-gun of passing in an un-memoized array of selectedIds.\n */\nexport function ComponentDropdown({\n selectedId,\n onSelection,\n ...inputProps\n}: ComponentDropdownProps) {\n const selectedIds = useMemo(() => (selectedId ? [selectedId] : []), [selectedId]);\n return (\n onSelection(value[0])}\n selectedIds={selectedIds}\n />\n );\n}\n\ntype ComponentMultiSelectDropdownProps = ComponentDropdownFormProps &\n Omit, 'name'> & {\n selectedIds?: string[];\n onSelection: (ids: string[]) => void;\n error?: string;\n };\n\nconst NO_SELECTED_IDS: string[] = [];\nconst schema = yup.array().of(yup.string()).required();\n\n/**\n * A dropdown that allows the user to select multiple components.\n */\nexport function ComponentMultiSelectDropdown({\n selectedIds = NO_SELECTED_IDS,\n onSelection,\n error,\n validate,\n ...inputProps\n}: ComponentMultiSelectDropdownProps) {\n return (\n {\n onSelection(data.value);\n }}\n validate={validate}\n validationSchema={schema}\n >\n \n \n \n \n );\n}\n","import isChromatic from 'chromatic';\nimport { FC, useMemo } from 'react';\nimport styled from 'styled-components';\n\nimport { Colors } from '@aurorasolar/common-core/src/colors';\nimport { AuroraIcon, AuroraIconType } from '@aurorasolar/common-core/src/icon';\nimport { SPACES } from '@aurorasolar/common-core/src/layout';\nimport { Text } from '@aurorasolar/common-core/src/typography';\nimport { BarChart, IChartDataSet } from '@aurorasolar/common-deprecated-charts';\nimport { Tab, Tabs } from '@blueprintjs/core';\nimport { Box, Flex } from '@rebass/grid';\n\nconst CHART_WIDTH = 270;\nconst CHART_HEIGHT = 128;\n\nconst WHITE = [Colors.WHITE];\nconst ORANGE = [Colors.ORANGE, Colors.WHITE, Colors.WHITE];\nconst EMPTY_DATA = Array.from({ length: 12 }, () => 1);\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\nconst labelMonths = months.filter((_, i) => i % 3 === 0);\nconst getDataset = (\n data: number[] | null | undefined,\n max: number,\n labelSuffix = '',\n): IChartDataSet[] => [\n {\n data: [...(data ?? EMPTY_DATA), max],\n label: 'Solar Access',\n labelFormatter: (label) => `${label}${labelSuffix}`,\n },\n];\n\nconst StyledIrradianceMonthly = styled.div`\n flex-direction: column;\n\n .bp3-tab-panel {\n margin-top: ${SPACES[0]}px;\n }\n\n .bp3-tab-list {\n display: flex;\n align-items: center;\n & > *:not(:last-child) {\n margin-right: ${SPACES[1]}px;\n }\n }\n\n .bp3-tab {\n color: ${Colors.WHITE};\n line-height: ${SPACES[4]}px;\n\n &[aria-selected='true'] {\n box-shadow: inset 0 -3px 0 ${Colors.WHITE};\n }\n\n &:hover {\n color: inherit;\n }\n }\n\n . .bp3-tab-indicator-wrapper .bp3-tab-indicator {\n background-color: ${Colors.WHITE};\n }\n`;\n\nconst ChartWrap = styled.div`\n height: ${CHART_HEIGHT}px;\n width: ${CHART_WIDTH}px;\n margin-left: -${SPACES[0]}px;\n`;\n\ninterface IrradianceInspectorMonthlyChartProps {\n monthlySap?: number[] | null;\n monthlyIrradiance?: number[] | null;\n onClose: VoidFunction;\n}\nconst SOLAR_ACCESS_TAB = 'monthly-solar-access';\nconst IRRADIANCE_TAB = 'monthly-irradiance';\nexport const IrradianceInspectorMonthlyChart: FC = ({\n monthlySap,\n monthlyIrradiance,\n onClose,\n}) => {\n const solarAccessData = useMemo(() => getDataset(monthlySap, 100, '%'), [monthlySap]);\n const irradianceData = useMemo(() => getDataset(monthlyIrradiance, 300), [monthlyIrradiance]);\n return (\n \n \n \n Monthly\n \n\n \n \n \n \n {/* Margin and width to match chart labels */}\n \n {labelMonths.map((month) => (\n \n {month}\n \n ))}\n \n \n }\n title=\"Solar Access\"\n />\n \n \n \n \n {/* Margin and width to match chart labels */}\n \n {labelMonths.map((month) => (\n \n {month}\n \n ))}\n \n \n }\n title=\"Irradiance\"\n />\n \n \n \n \n \n );\n};\n","import { FC } from 'react';\nimport styled, { css } from 'styled-components';\n\nimport { Colors } from '@aurorasolar/common-core/src/colors';\nimport { AuroraIcon, AuroraIconType } from '@aurorasolar/common-core/src/icon';\nimport { SPACES } from '@aurorasolar/common-core/src/layout';\nimport { Text } from '@aurorasolar/common-core/src/typography';\nimport { Maybe } from '@aurorasolar/graphql-client-schema';\nimport { Box, Flex } from '@rebass/grid';\n\nimport { IrradianceInspectorMonthlyChart } from './irradiance-inspector-monthly-chart';\n\nconst roundOrBlank = (n?: number | null) => (n != null ? Math.round(n).toLocaleString() : '-');\n\nconst HEIGHT = 182;\nconst ERROR_HEIGHT = 222;\nconst EXPANDED_HEIGHT = 226;\n\nconst WIDTH = 250;\nconst EXPANDED_WIDTH = 562;\n\nconst StyledIrradianceInspector = styled.div<{ isExpanded: boolean; hasError: boolean }>`\n ${({ isExpanded, hasError }) =>\n isExpanded\n ? css`\n padding: ${SPACES[3]}px ${SPACES[3]}px;\n height: ${EXPANDED_HEIGHT}px;\n `\n : css`\n padding: ${hasError ? SPACES[3] : SPACES[2]}px ${SPACES[3]}px;\n height: ${hasError ? ERROR_HEIGHT : HEIGHT}px;\n `};\n justify-content: flex-start;\n width: ${({ isExpanded }) => (isExpanded ? EXPANDED_WIDTH : WIDTH)}px;\n flex: 0 0 auto;\n background: ${Colors.GRAY_800};\n display: flex;\n opacity: 0.8;\n border-radius: ${SPACES[0]}px;\n backdrop-filter: blur(${SPACES[0] / 2}px);\n color: ${Colors.WHITE};\n transition: height 0.2s ease, width 0.2s ease, padding 0.2s ease;\n overflow: hidden;\n h4 {\n text-transform: uppercase;\n color: inherit;\n margin: 0;\n }\n\n button {\n background: none;\n border: none;\n padding: 0;\n color: inherit;\n outline: none;\n cursor: pointer;\n animation: fade-in 0.2s ease;\n }\n`;\nexport interface IrradianceInspectorCoreProps {\n error?: string;\n irradiance?: Maybe;\n isExpanded: boolean;\n monthlyIrradiance?: Maybe;\n monthlySap?: Maybe;\n sap?: Maybe;\n tof?: Maybe;\n toggleExpanded: VoidFunction;\n tsrf?: Maybe;\n type: string;\n isAverage?: boolean;\n}\nexport const IrradianceInspectorCore: FC = ({\n error,\n irradiance,\n isExpanded,\n monthlyIrradiance,\n monthlySap,\n sap,\n isAverage,\n tof,\n toggleExpanded,\n tsrf,\n type,\n}) => {\n return (\n \n \n \n \n Annual\n \n\n \n \n \n ({type})\n \n \n\n \n {isAverage ? 'average' : 'point'}\n \n \n\n {!isExpanded && (\n \n )}\n \n \n Irradiance\n {roundOrBlank(irradiance)} kWh/m²/yr\n \n \n Solar Access\n {roundOrBlank(sap)}%\n \n \n TOF\n {roundOrBlank(tof)}%\n \n \n TSRF\n {roundOrBlank(tsrf)}%\n \n {error && (\n \n \n \n \n \n {error}\n \n \n )}\n \n \n \n \n \n );\n};\n","// @ts-ignore: Ignore unused { * as Types } import\nimport * as Types from '@aurorasolar/graphql-client-schema';\n\nimport { gql } from '@apollo/client';\nimport * as Apollo from '@apollo/client';\nconst defaultOptions = {} as const;\nexport type IrradianceInspectorQueryVariables = Types.Exact<{ [key: string]: never; }>;\n\n\nexport type IrradianceInspectorQuery = { __typename: 'Query', CAD: { __typename: 'CAD', averageIrradiance?: number | null | undefined, averageSap?: number | null | undefined, averageTof?: number | null | undefined, averageTsrf?: number | null | undefined, panelCount: number, irradianceValuesType: Types.IrradianceValuesType, irradianceValue?: number | null | undefined, sapValue: number, tofValue: number, tsrfValue: number, irrMonthlyValues?: Array | null | undefined, sapMonthlyValues?: Array | null | undefined, viewSettings: { __typename: 'ViewSettings', design3d?: { __typename: 'ViewPortViewSettings', irradianceMap?: boolean | null | undefined, irradianceMapPanels?: boolean | null | undefined } | null | undefined } } };\n\n\nexport const IrradianceInspectorDocument = gql`\n query IrradianceInspector @trace_info(traceInfo: {pod: cad}) {\n CAD @client {\n averageIrradiance\n averageSap\n averageTof\n averageTsrf\n panelCount\n irradianceValuesType\n irradianceValue\n sapValue\n tofValue\n tsrfValue\n irrMonthlyValues\n sapMonthlyValues\n viewSettings {\n design3d {\n irradianceMap\n irradianceMapPanels\n }\n }\n }\n}\n `;\n\n/**\n * __useIrradianceInspectorQuery__\n *\n * To run a query within a React component, call `useIrradianceInspectorQuery` and pass it any options that fit your needs.\n * When your component renders, `useIrradianceInspectorQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useIrradianceInspectorQuery({\n * variables: {\n * },\n * });\n */\nexport function useIrradianceInspectorQuery(baseOptions?: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(IrradianceInspectorDocument, options);\n }\nexport function useIrradianceInspectorLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(IrradianceInspectorDocument, options);\n }\nexport type IrradianceInspectorQueryHookResult = ReturnType;\nexport type IrradianceInspectorLazyQueryHookResult = ReturnType;\nexport type IrradianceInspectorQueryResult = Apollo.QueryResult;","import { useMemo, useRef } from 'react';\n\nimport { CadEventTypes, CADTriggerActionTypes } from '@aurorasolar/common-data-store';\nimport {\n FeatureFlag,\n FeatureFlags,\n Notification,\n useAppModule,\n} from '@aurorasolar/common-module-loader';\nimport {\n createErrorNotification,\n createProgressNotification,\n createSuccessNotification,\n TOAST_CHANNEL,\n useNotifications,\n} from '@aurorasolar/common-notifications';\n\nimport { useNextCadEvent, useSaveCad, useSubscribeToCadEvent, useTriggerCadAction } from '../hooks';\n\nconst AUTODESIGNER_RUNNING_NOTIFICATION = Symbol('AutoDesigner Running Notification');\nconst AUTODESIGNER_ERROR_NOTIFICATION = Symbol('AutoDesigner Error Notification');\nconst AUTODESIGNER_CANCEL_NOTIFICATION = Symbol('AutoDesigner Cancel Notification');\n\nexport const useAutoDesignerToasts = () => {\n const toast = useNotifications(TOAST_CHANNEL);\n const undo = useTriggerCadAction(CADTriggerActionTypes.Undo);\n const undoPathwaysRef = useRef(false);\n\n const featureFlag = useAppModule(FeatureFlags);\n const cancelAutoDesignerSalesFlag = featureFlag?.variation(FeatureFlag.CancelAutoDesignerSales);\n\n useSubscribeToCadEvent(CadEventTypes.PlacePathwaysFinished, ({ isChanged }) => {\n undoPathwaysRef.current = isChanged;\n });\n\n const nextCadEvent = useNextCadEvent();\n const { save } = useSaveCad();\n const saveRef = useRef(save);\n saveRef.current = save;\n\n return useMemo(() => {\n const restore = async () => {\n if (undoPathwaysRef.current && cancelAutoDesignerSalesFlag) {\n const asyncUndoFinished = nextCadEvent(CadEventTypes.UndoFinished);\n undo();\n await asyncUndoFinished;\n await saveRef.current();\n }\n };\n return {\n cancelToast: () => {\n toast.dismiss?.(AUTODESIGNER_RUNNING_NOTIFICATION);\n const message = 'Canceled placing panels';\n toast.push?.(createSuccessNotification(message), AUTODESIGNER_CANCEL_NOTIFICATION);\n restore();\n },\n errorToast: (errorToastMessage: string) => {\n toast.dismiss?.(AUTODESIGNER_RUNNING_NOTIFICATION);\n toast.dismiss?.(AUTODESIGNER_CANCEL_NOTIFICATION);\n const message = errorToastMessage ?? 'Panel placement failed';\n toast.push?.(createErrorNotification(message), AUTODESIGNER_ERROR_NOTIFICATION);\n restore();\n },\n finishToast: () => {\n toast.dismiss?.(AUTODESIGNER_RUNNING_NOTIFICATION);\n const message = 'Panels placed';\n toast.push?.(createSuccessNotification(message));\n },\n // Remove once CancelAutoDesignerSales feature flag is removed\n legacyProgressToast: () => {\n toast.dismiss?.(AUTODESIGNER_CANCEL_NOTIFICATION);\n toast.dismiss?.(AUTODESIGNER_ERROR_NOTIFICATION);\n const message = 'Placing panels';\n toast.push?.(createProgressNotification(message), AUTODESIGNER_RUNNING_NOTIFICATION);\n },\n progressToast: (cancelAutoDesignerCallback: () => void) => {\n toast.dismiss?.(AUTODESIGNER_CANCEL_NOTIFICATION);\n toast.dismiss?.(AUTODESIGNER_ERROR_NOTIFICATION);\n const message = 'Placing panels';\n toast.push?.(\n createProgressNotification(message, Notification.DismissType.STATE, [\n {\n callback: () => {\n cancelAutoDesignerCallback();\n },\n style: Notification.ActionStyle.CTA,\n text: 'Cancel',\n },\n ]),\n AUTODESIGNER_RUNNING_NOTIFICATION,\n );\n },\n };\n }, [toast, undo, cancelAutoDesignerSalesFlag, nextCadEvent, saveRef]);\n};\n","import { darken } from 'polished';\nimport styled from 'styled-components';\n\nimport { Checkbox } from '@blueprintjs/core';\n\nimport { Colors } from '../colors';\n\nexport const AuroraCheckbox = styled(Checkbox)`\n color: ${Colors.GRAY_800};\n margin-bottom: 12;\n\n && {\n .bp3-control-indicator {\n border: 1px solid ${Colors.GRAY_400};\n border-radius: 3px;\n box-shadow: unset;\n background: white;\n font-size: 18px;\n margin-right: 11px;\n }\n\n input:checked ~ .bp3-control-indicator {\n box-shadow: unset;\n border: unset;\n background-color: #010619;\n\n &::before {\n /* stylelint-disable-next-line */\n font: normal normal normal 20px/1 FrontendV2;\n\n /* unicode for component-enabled */\n content: '\\f065';\n height: inherit;\n width: inherit;\n position: absolute;\n right: 1px;\n bottom: 1px;\n }\n }\n\n input:indeterminate ~ .bp3-control-indicator {\n box-shadow: unset;\n border: unset;\n background-color: #010619;\n\n &::before {\n /* stylelint-disable-next-line */\n font: normal normal normal 20px/1 FrontendV2;\n\n /* unicode for component-disabled */\n content: '\\f063';\n height: inherit;\n width: inherit;\n position: absolute;\n right: 1px;\n bottom: 1px;\n }\n }\n\n input:disabled:not(:checked) ~ .bp3-control-indicator {\n border: 1px solid ${Colors.GRAY_300};\n background: white;\n }\n\n input:disabled:checked ~ .bp3-control-indicator {\n background: ${Colors.GRAY_400};\n }\n }\n\n &:hover {\n input:checked:not(:disabled) ~ .bp3-control-indicator {\n background-color: ${darken(0.1, '#010619')};\n }\n\n input:indeterminate:not(:disabled) ~ .bp3-control-indicator {\n background-color: ${darken(0.1, '#010619')};\n box-shadow: unset !important;\n }\n\n input:not(:checked):not(:indeterminate):not(:disabled) ~ .bp3-control-indicator {\n box-shadow: 0 0 4px rgba(0, 0, 0, 0.3);\n border: 1px solid ${Colors.GRAY_400};\n }\n }\n`;\n","import { FC, useState } from 'react';\nimport styled from 'styled-components';\n\nimport { HTMLInputProps, IInputGroupProps, InputGroup } from '@blueprintjs/core';\nimport { Box, Flex } from '@rebass/grid';\n\nimport { Colors } from '../../colors';\nimport { Text } from '../../typography';\nimport { generateUuid } from '../../utils';\nimport { TextInputValidators, useValidator } from '../../validator';\nimport { DefaultInputCSS } from '../base';\nimport { InputError } from '../input-error';\n\nexport const MAX_INPUT_LENGTH = 255;\n\nconst StyledInputGroup = styled(InputGroup)`\n ${DefaultInputCSS}\n\n &.bp3-input-group {\n width: ${(props) => (!props.fill ? '300px' : '100%')};\n }\n`;\n\nexport interface AuroraInputGroupCustomProps {\n disableSelectAllOnFocus?: boolean;\n maxLength?: number;\n label?: string;\n validators?: TextInputValidators;\n noInlineErrors?: boolean;\n passedInErrors?: string[];\n}\n\nexport type AuroraInputGroupsProps = HTMLInputProps &\n IInputGroupProps &\n AuroraInputGroupCustomProps;\n\nexport const AuroraInputGroup: FC = ({\n disableSelectAllOnFocus,\n id,\n maxLength = MAX_INPUT_LENGTH,\n label,\n noInlineErrors = false,\n validators,\n passedInErrors = [],\n ...props\n}) => {\n const [inputId] = useState(id ?? generateUuid());\n const { disabled } = props;\n const [errors, validate] = useValidator(validators);\n\n return (\n \n {label && (\n \n \n {label}\n \n \n )}\n {\n const newValue = event.currentTarget.value;\n\n if (validate({ value: newValue })) {\n props.onInput?.(event);\n }\n }}\n onFocus={(e) => {\n if (!disableSelectAllOnFocus) {\n e.target.select();\n }\n return props.onFocus?.(e);\n }}\n {...props}\n />\n\n {!noInlineErrors && (\n \n \n \n )}\n \n );\n};\n","import { FinancingOptions } from '@aurorasolar/graphql-client-schema';\n\nexport const totalCostHeadings: Record = {\n [FinancingOptions.Cash]: 'Total Cost',\n [FinancingOptions.Lease]: 'Total System Cost',\n [FinancingOptions.Ppa]: 'Total System Cost',\n [FinancingOptions.Loans]: 'Financed Amount',\n};\n\nexport const totalCostHeadingsSentenceCase: Record = {\n [FinancingOptions.Cash]: 'Total cost',\n [FinancingOptions.Lease]: 'Total system cost',\n [FinancingOptions.Ppa]: 'Total system cost',\n [FinancingOptions.Loans]: 'Financed amount',\n};\n","// @ts-ignore: Ignore unused { * as Types } import\nimport * as Types from '@aurorasolar/graphql-client-schema';\n\nimport { gql } from '@apollo/client';\nimport * as Apollo from '@apollo/client';\nconst defaultOptions = {} as const;\nexport type TariffOutputFragment = { __typename: 'Tariff', id: string, tariffKey?: string | null | undefined, tariffType?: Types.TariffType | null | undefined, name?: string | null | undefined, utilityName?: string | null | undefined, isSolarPvEligible?: boolean | null | undefined };\n\nexport type TariffSearchQueryVariables = Types.Exact<{\n query: Types.FullTextSearchQuery;\n}>;\n\n\nexport type TariffSearchQuery = { __typename: 'Query', fullTextSearch: Array<{ __typename: 'Battery' } | { __typename: 'CombinerBox' } | { __typename: 'DcOptimizer' } | { __typename: 'Disconnect' } | { __typename: 'LoadCenter' } | { __typename: 'Meter' } | { __typename: 'ServicePanel' } | { __typename: 'SolarInverter' } | { __typename: 'SolarPanel' } | { __typename: 'Tariff', id: string, tariffKey?: string | null | undefined, tariffType?: Types.TariffType | null | undefined, name?: string | null | undefined, utilityName?: string | null | undefined, isSolarPvEligible?: boolean | null | undefined }> };\n\nexport const TariffOutputFragmentDoc = gql`\n fragment TariffOutput on Tariff {\n id\n tariffKey\n tariffType\n name\n utilityName\n isSolarPvEligible\n}\n `;\nexport const TariffSearchDocument = gql`\n query TariffSearch($query: FullTextSearchQuery!) @trace_info(traceInfo: {pod: pricing}) {\n fullTextSearch(query: $query) {\n ...TariffOutput\n }\n}\n ${TariffOutputFragmentDoc}`;\n\n/**\n * __useTariffSearchQuery__\n *\n * To run a query within a React component, call `useTariffSearchQuery` and pass it any options that fit your needs.\n * When your component renders, `useTariffSearchQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useTariffSearchQuery({\n * variables: {\n * query: // value for 'query'\n * },\n * });\n */\nexport function useTariffSearchQuery(baseOptions: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(TariffSearchDocument, options);\n }\nexport function useTariffSearchLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(TariffSearchDocument, options);\n }\nexport type TariffSearchQueryHookResult = ReturnType;\nexport type TariffSearchLazyQueryHookResult = ReturnType;\nexport type TariffSearchQueryResult = Apollo.QueryResult;","import { useMemo } from 'react';\n\nimport { FeatureFlag, FeatureFlags, useAppModule } from '@aurorasolar/common-module-loader';\nimport * as DS from '@aurorasolar/ds';\nimport { Tariff } from '@aurorasolar/graphql-client-schema';\n\nimport { TariffSearchResult } from './use-search-tariff-types';\n\n// Needed to avoid client side filtering\nfunction alwaysTrue() {\n return true;\n}\n\nexport function sortTariffs(t: T[]): T[] {\n return [\n ...t.filter(({ isSolarPvEligible }) => isSolarPvEligible === true),\n ...t.filter(\n ({ isSolarPvEligible }) =>\n isSolarPvEligible === null || typeof isSolarPvEligible === 'undefined',\n ),\n ...t.filter(({ isSolarPvEligible }) => isSolarPvEligible === false),\n ];\n}\n\nconst loadingProps = {\n icon: DS.IconProgressSpinner,\n iconProps: {\n animation: {\n animationDuration: 'base',\n motionSafe: 'spin',\n },\n },\n};\n\ninterface DSTariffOption extends DS.IDropdownOption {\n isSolarPvEligible?: boolean | null;\n utilityName: string;\n}\n\nexport interface TariffSearchInputProps\n extends Omit<\n DS.IAutocompleteInput,\n 'options' | 'handleUserInput' | 'filterAlgorithm' | 'optionLabelTemplate' | 'loading'\n > {\n onQuery: (value: string) => void;\n tariffs: TariffSearchResult[];\n loading?: boolean;\n isPostSolarRate?: boolean;\n}\n\nexport const TariffSearchInput = ({\n isPostSolarRate,\n onQuery,\n tariffs,\n loading,\n ...props\n}: TariffSearchInputProps) => {\n const featureFlags = useAppModule(FeatureFlags);\n const autoPopulatePostSolarRates =\n featureFlags?.variation(FeatureFlag.AutoPopulatePostSolarRates) === true;\n\n // eslint-disable-next-line prefer-destructuring, react/destructuring-assignment\n const value: TariffSearchResult | undefined = props.field.value?.[0];\n const additionalProps = loading ? loadingProps : {};\n\n const transformedOptions: DSTariffOption[] = useMemo(() => {\n let needsValue = true;\n\n const sortedTariffs =\n autoPopulatePostSolarRates && isPostSolarRate ? sortTariffs(tariffs) : tariffs;\n const output = sortedTariffs.map((opt) => {\n let optionValue = opt;\n\n if (value && opt.name === value.name && opt.utilityName === value.utilityName) {\n needsValue = false;\n optionValue = value;\n }\n return {\n isSolarPvEligible: opt.isSolarPvEligible,\n label: opt.name,\n utilityName: opt.utilityName,\n value: optionValue,\n };\n });\n\n if (needsValue && value) {\n output.push({\n isSolarPvEligible: value.isSolarPvEligible,\n label: value.name,\n utilityName: value.utilityName,\n value,\n });\n }\n\n return output;\n }, [autoPopulatePostSolarRates, isPostSolarRate, tariffs, value]);\n\n return (\n (\n \n \n {isPostSolarRate && option.isSolarPvEligible ? (\n \n Solar\n \n ) : null}\n {option.utilityName}\n \n }\n value={option.label}\n />\n \n )}\n options={transformedOptions}\n {...props}\n {...additionalProps}\n />\n );\n};\n","// @ts-ignore: Ignore unused { * as Types } import\nimport * as Types from '@aurorasolar/graphql-client-schema';\n\nimport { gql } from '@apollo/client';\nimport * as Apollo from '@apollo/client';\nconst defaultOptions = {} as const;\nexport type DeleteProjectMutationVariables = Types.Exact<{\n projectId: Types.Scalars['ID'];\n}>;\n\n\nexport type DeleteProjectMutation = { __typename: 'Mutation', deleteProject: string };\n\n\nexport const DeleteProjectDocument = gql`\n mutation DeleteProject($projectId: ID!) @trace_info(traceInfo: {pod: projectCollaboration}) {\n deleteProject(id: $projectId)\n}\n `;\nexport type DeleteProjectMutationFn = Apollo.MutationFunction;\n\n/**\n * __useDeleteProjectMutation__\n *\n * To run a mutation, you first call `useDeleteProjectMutation` within a React component and pass it any options that fit your needs.\n * When your component renders, `useDeleteProjectMutation` returns a tuple that includes:\n * - A mutate function that you can call at any time to execute the mutation\n * - An object with fields that represent the current status of the mutation's execution\n *\n * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2;\n *\n * @example\n * const [deleteProjectMutation, { data, loading, error }] = useDeleteProjectMutation({\n * variables: {\n * projectId: // value for 'projectId'\n * },\n * });\n */\nexport function useDeleteProjectMutation(baseOptions?: Apollo.MutationHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useMutation(DeleteProjectDocument, options);\n }\nexport type DeleteProjectMutationHookResult = ReturnType;\nexport type DeleteProjectMutationResult = Apollo.MutationResult;\nexport type DeleteProjectMutationOptions = Apollo.BaseMutationOptions;","// @ts-ignore: Ignore unused { * as Types } import\nimport * as Types from '@aurorasolar/graphql-client-schema';\n\nimport { gql } from '@apollo/client';\nimport * as Apollo from '@apollo/client';\nconst defaultOptions = {} as const;\nexport type GetIncentiveErrorsQueryVariables = Types.Exact<{\n designId: Types.Scalars['ID'];\n}>;\n\n\nexport type GetIncentiveErrorsQuery = { __typename: 'Query', designById: { __typename: 'Design', id: string, eProposalFinancing?: { __typename: 'Financing', id: string, financialAnalysis?: { __typename: 'FinancialAnalysis', id: string, incentiveErrors?: Array | null | undefined } | null | undefined } | null | undefined } };\n\n\nexport const GetIncentiveErrorsDocument = gql`\n query GetIncentiveErrors($designId: ID!) @trace_info(traceInfo: {pod: pricing}) {\n designById(id: $designId) {\n id\n eProposalFinancing {\n id\n financialAnalysis {\n id\n incentiveErrors\n }\n }\n }\n}\n `;\n\n/**\n * __useGetIncentiveErrorsQuery__\n *\n * To run a query within a React component, call `useGetIncentiveErrorsQuery` and pass it any options that fit your needs.\n * When your component renders, `useGetIncentiveErrorsQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useGetIncentiveErrorsQuery({\n * variables: {\n * designId: // value for 'designId'\n * },\n * });\n */\nexport function useGetIncentiveErrorsQuery(baseOptions: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(GetIncentiveErrorsDocument, options);\n }\nexport function useGetIncentiveErrorsLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(GetIncentiveErrorsDocument, options);\n }\nexport type GetIncentiveErrorsQueryHookResult = ReturnType;\nexport type GetIncentiveErrorsLazyQueryHookResult = ReturnType;\nexport type GetIncentiveErrorsQueryResult = Apollo.QueryResult;","import * as DS from '@aurorasolar/ds';\n\ninterface DeleteLeadProps {\n confirmDeleteOpen: boolean;\n setConfirmDeleteOpen: (value: boolean) => void;\n onDelete: () => void;\n}\n\nexport const DELETE_SELECTED_LEAD_TESTID = 'delete-selected-lead';\nexport const CANCEL_SELECTED_LEAD_TESTID = 'cancel-selected-lead';\n\nexport const DeleteLeadModal = ({\n confirmDeleteOpen,\n setConfirmDeleteOpen,\n onDelete,\n}: DeleteLeadProps) => {\n const closeConfirmDeleteModal = () => setConfirmDeleteOpen(false);\n\n return (\n \n \n \n Delete lead\n \n \n Are you sure you want to permanently delete your selected lead?\n \n \n This action is irreversible.\n \n \n \n \n \n Cancel\n \n onDelete()}\n variant=\"destructive\"\n >\n Delete\n \n \n \n \n );\n};\n","import { useEffect, useState } from 'react';\n\ninterface UseInterceptMouseProps {\n cadDomNode?: HTMLCanvasElement | null;\n}\n\nexport const useInterceptMouse = ({ cadDomNode }: UseInterceptMouseProps) => {\n const [clicked, setClicked] = useState(false);\n\n useEffect(() => {\n if (!cadDomNode) return undefined;\n const onMouse = () => {\n setClicked(true);\n };\n const options = { capture: true, once: true, passive: true };\n // NOTE: This may fire more than once, but the total number of events should be small\n cadDomNode.addEventListener('pointerdown', onMouse, options);\n\n return () => {\n cadDomNode.removeEventListener('pointerdown', onMouse, options);\n };\n }, [cadDomNode]);\n\n return clicked;\n};\n","// @ts-ignore: Ignore unused { * as Types } import\nimport * as Types from '@aurorasolar/graphql-client-schema';\n\nimport { gql } from '@apollo/client';\nimport * as Apollo from '@apollo/client';\nconst defaultOptions = {} as const;\nexport type GetCurrentUserQueryVariables = Types.Exact<{ [key: string]: never; }>;\n\n\nexport type GetCurrentUserQuery = { __typename: 'Query', currentUser?: { __typename: 'User', id: string, partnerId?: string | null | undefined } | null | undefined };\n\n\nexport const GetCurrentUserDocument = gql`\n query GetCurrentUser @trace_info(traceInfo: {pod: projectCollaboration}) {\n currentUser {\n id\n partnerId\n }\n}\n `;\n\n/**\n * __useGetCurrentUserQuery__\n *\n * To run a query within a React component, call `useGetCurrentUserQuery` and pass it any options that fit your needs.\n * When your component renders, `useGetCurrentUserQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useGetCurrentUserQuery({\n * variables: {\n * },\n * });\n */\nexport function useGetCurrentUserQuery(baseOptions?: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(GetCurrentUserDocument, options);\n }\nexport function useGetCurrentUserLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(GetCurrentUserDocument, options);\n }\nexport type GetCurrentUserQueryHookResult = ReturnType;\nexport type GetCurrentUserLazyQueryHookResult = ReturnType;\nexport type GetCurrentUserQueryResult = Apollo.QueryResult;","// @ts-ignore: Ignore unused { * as Types } import\nimport * as Types from '@aurorasolar/graphql-client-schema';\n\nimport { gql } from '@apollo/client';\nimport * as Apollo from '@apollo/client';\nconst defaultOptions = {} as const;\nexport type GetPartnersQueryVariables = Types.Exact<{\n pagination?: Types.InputMaybe;\n search?: Types.InputMaybe;\n}>;\n\n\nexport type GetPartnersQuery = { __typename: 'Query', getPartners: { __typename: 'PartnerSearchResult', partners: Array<{ __typename: 'Partner', id: string, name: string }> } };\n\nexport type GetTeamsQueryVariables = Types.Exact<{ [key: string]: never; }>;\n\n\nexport type GetTeamsQuery = { __typename: 'Query', teams?: Array<{ __typename: 'Team', id: string, name?: string | null | undefined, partner?: { __typename: 'TeamPartner', id: string } | null | undefined } | null | undefined> | null | undefined };\n\n\nexport const GetPartnersDocument = gql`\n query GetPartners($pagination: SearchPagination, $search: String) @trace_info(traceInfo: {pod: projectCollaboration}) {\n getPartners(pagination: $pagination, search: $search) {\n partners {\n id\n name\n }\n }\n}\n `;\n\n/**\n * __useGetPartnersQuery__\n *\n * To run a query within a React component, call `useGetPartnersQuery` and pass it any options that fit your needs.\n * When your component renders, `useGetPartnersQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useGetPartnersQuery({\n * variables: {\n * pagination: // value for 'pagination'\n * search: // value for 'search'\n * },\n * });\n */\nexport function useGetPartnersQuery(baseOptions?: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(GetPartnersDocument, options);\n }\nexport function useGetPartnersLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(GetPartnersDocument, options);\n }\nexport type GetPartnersQueryHookResult = ReturnType;\nexport type GetPartnersLazyQueryHookResult = ReturnType;\nexport type GetPartnersQueryResult = Apollo.QueryResult;\nexport const GetTeamsDocument = gql`\n query GetTeams @trace_info(traceInfo: {pod: projectCollaboration}) {\n teams {\n id\n name\n partner {\n id\n }\n }\n}\n `;\n\n/**\n * __useGetTeamsQuery__\n *\n * To run a query within a React component, call `useGetTeamsQuery` and pass it any options that fit your needs.\n * When your component renders, `useGetTeamsQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useGetTeamsQuery({\n * variables: {\n * },\n * });\n */\nexport function useGetTeamsQuery(baseOptions?: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(GetTeamsDocument, options);\n }\nexport function useGetTeamsLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(GetTeamsDocument, options);\n }\nexport type GetTeamsQueryHookResult = ReturnType;\nexport type GetTeamsLazyQueryHookResult = ReturnType;\nexport type GetTeamsQueryResult = Apollo.QueryResult;","// @ts-ignore: Ignore unused { * as Types } import\nimport * as Types from '@aurorasolar/graphql-client-schema';\n\nimport { gql } from '@apollo/client';\nimport * as Apollo from '@apollo/client';\nconst defaultOptions = {} as const;\nexport type GetTenantNameQueryVariables = Types.Exact<{ [key: string]: never; }>;\n\n\nexport type GetTenantNameQuery = { __typename: 'Query', currentTenant?: { __typename: 'Tenant', id: string, name?: string | null | undefined } | null | undefined };\n\n\nexport const GetTenantNameDocument = gql`\n query GetTenantName @trace_info(traceInfo: {pod: projectCollaboration}) {\n currentTenant {\n id\n name\n }\n}\n `;\n\n/**\n * __useGetTenantNameQuery__\n *\n * To run a query within a React component, call `useGetTenantNameQuery` and pass it any options that fit your needs.\n * When your component renders, `useGetTenantNameQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useGetTenantNameQuery({\n * variables: {\n * },\n * });\n */\nexport function useGetTenantNameQuery(baseOptions?: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(GetTenantNameDocument, options);\n }\nexport function useGetTenantNameLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(GetTenantNameDocument, options);\n }\nexport type GetTenantNameQueryHookResult = ReturnType;\nexport type GetTenantNameLazyQueryHookResult = ReturnType;\nexport type GetTenantNameQueryResult = Apollo.QueryResult;","import { format, isToday, isTomorrow, isYesterday } from 'date-fns';\n\ninterface FormatType {\n month?: string;\n day?: string;\n separator?: string;\n time?: string;\n}\n\n/* eslint-disable sort-keys */\nconst defaultFormat = {\n month: 'MMMM',\n day: 'd',\n separator: ', ',\n time: `h:mm a`,\n};\n\nconst getPrefix = (timestamp: Date, fm: FormatType): string => {\n switch (true) {\n case isYesterday(timestamp):\n return 'Yesterday';\n case isToday(timestamp):\n return 'Today';\n case isTomorrow(timestamp):\n return 'Tomorrow';\n default:\n return format(timestamp, `${fm.month} ${fm.day}`);\n }\n};\n\n/**\n * Formats a date in words relative to the given timestamp, using\n * 'yesterday', 'today', and 'tomorrow' nouns.\n */\nexport const formatRelativeDate = (timestamp: Date, customFormat: FormatType = {}): string => {\n const fm = {\n ...defaultFormat,\n ...customFormat,\n };\n\n const preffix = getPrefix(timestamp, fm);\n\n return `${preffix}${fm.separator}${format(timestamp, fm.time)}`;\n};\n","import { AgreementStatus } from '@aurorasolar/graphql-client-schema';\n\nconst badStatusColor = 'red-500';\n\nexport const agreementStatusMap: Record<\n AgreementStatus,\n {\n color: string;\n description: string;\n }\n> = {\n [AgreementStatus.Signed]: {\n color: 'green-400',\n description: 'Agreement Completed',\n },\n [AgreementStatus.Viewed]: {\n color: 'cyan-300',\n description: 'Agreement Viewed',\n },\n [AgreementStatus.Sent]: {\n color: 'cyan-300',\n description: 'Agreement Sent',\n },\n [AgreementStatus.Error]: {\n color: badStatusColor,\n description: 'Agreement Error',\n },\n [AgreementStatus.Declined]: {\n color: badStatusColor,\n description: 'Agreement Declined',\n },\n [AgreementStatus.CancelPending]: {\n color: badStatusColor,\n description: 'Agreement Error',\n },\n [AgreementStatus.Canceled]: {\n color: badStatusColor,\n description: 'Agreement Error',\n },\n [AgreementStatus.Draft]: {\n color: badStatusColor,\n description: 'Agreement Error',\n },\n};\n\nexport const agreementStatusPriorityMap = {\n [AgreementStatus.Signed]: 0,\n [AgreementStatus.Declined]: 1,\n [AgreementStatus.Viewed]: 2,\n [AgreementStatus.Sent]: 3,\n [AgreementStatus.Error]: 4,\n [AgreementStatus.Canceled]: 5,\n [AgreementStatus.CancelPending]: 5,\n [AgreementStatus.Draft]: 5,\n};\n\nexport function sortAgreementsByPriority(\n a: Agreement,\n b: Agreement,\n): number {\n return (\n (a.status ? agreementStatusPriorityMap[a.status] : 99) -\n (b.status ? agreementStatusPriorityMap[b.status] : 99)\n );\n}\n","import { DesignRequestStatus } from '@aurorasolar/graphql-client-schema';\n\nexport const designRequestStatusMap: Record<\n DesignRequestStatus,\n { color: string; description: string }\n> = {\n [DesignRequestStatus.Accepted]: {\n color: 'black',\n description: 'Design Accepted',\n },\n [DesignRequestStatus.DesignerRejected]: {\n color: 'red-500',\n description: 'Design Request rejected',\n },\n [DesignRequestStatus.Submitted]: {\n color: 'cyan-300',\n description: 'Design In progress',\n },\n [DesignRequestStatus.DesignerCompleted]: {\n color: 'green-400',\n description: 'Design Completed',\n },\n [DesignRequestStatus.Rejected]: {\n color: 'red-500',\n description: 'Design Rejected',\n },\n};\n","import { AgreementStatus, DesignRequestStatus } from '@aurorasolar/graphql-client-schema';\n\nexport enum ProposalShareStatus {\n FOLLOWUP_REQUESTED = 'followup_requested',\n VIEWED = 'viewed',\n SENT = 'sent',\n LINK_EXPIRED = 'link_expired',\n}\n\nexport interface ProposalShareStatusInfo {\n status: ProposalShareStatus;\n timestamp: Date;\n onClick?: () => void;\n}\n\nexport interface AgreementStatusInfo {\n status: AgreementStatus;\n timestamp?: Date;\n onClick?: () => void;\n}\n\nexport interface DesignRequestStatusInfo {\n status: DesignRequestStatus;\n timestamp?: Date;\n onClick?: () => void;\n}\n\nexport const proposalShareStatusMap: Record =\n {\n [ProposalShareStatus.FOLLOWUP_REQUESTED]: {\n color: 'orange-400',\n text: 'Proposal Followup Requested',\n },\n [ProposalShareStatus.VIEWED]: {\n color: 'green-500',\n text: 'Proposal Viewed',\n },\n [ProposalShareStatus.SENT]: {\n color: 'green-500',\n text: 'Proposal Sent',\n },\n [ProposalShareStatus.LINK_EXPIRED]: {\n color: 'red-500',\n text: 'Proposal Link Expired',\n },\n };\n\nexport function proposalShareInfoToStatus({\n tokenExpiry,\n lastViewedAt,\n lastSentAt,\n followUpRequestedAt,\n followUpRequested,\n}: {\n tokenExpiry: string | null;\n lastViewedAt: string | null;\n lastSentAt: string | null;\n followUpRequestedAt: string | null;\n followUpRequested: boolean | null;\n}): ProposalShareStatusInfo | undefined {\n if (followUpRequested && followUpRequestedAt) {\n return {\n status: ProposalShareStatus.FOLLOWUP_REQUESTED,\n timestamp: new Date(followUpRequestedAt),\n };\n }\n if (tokenExpiry && new Date(tokenExpiry).getTime() < Date.now()) {\n return { status: ProposalShareStatus.LINK_EXPIRED, timestamp: new Date(tokenExpiry) };\n }\n if (lastViewedAt) {\n return { status: ProposalShareStatus.VIEWED, timestamp: new Date(lastViewedAt) };\n }\n if (lastSentAt) {\n return { status: ProposalShareStatus.SENT, timestamp: new Date(lastSentAt) };\n }\n\n return undefined;\n}\n","import React, { ReactElement } from 'react';\n\nimport { formatRelativeDate } from '@aurorasolar/common-core/src/utils';\nimport * as DS from '@aurorasolar/ds';\nimport { styled } from '@xstyled/styled-components';\n\nimport { agreementStatusMap } from '../agreement-status/agreement-status';\nimport { designRequestStatusMap } from '../design-request-status';\nimport {\n AgreementStatusInfo,\n DesignRequestStatusInfo,\n ProposalShareStatusInfo,\n proposalShareStatusMap,\n} from '../proposal-share-status/proposal-share-status';\n\ninterface StatusChild {\n color: string;\n text: string;\n timestamp?: Date;\n onClick?: () => void;\n icon: ReactElement;\n}\n\nfunction buildStatusChildren({\n designRequestStatus,\n agreementStatus,\n webProposalStatus,\n}: StatusSelectorProps) {\n const output: StatusChild[] = [];\n\n if (designRequestStatus) {\n output.push({\n color: designRequestStatusMap[designRequestStatus.status].color,\n icon: ,\n text: designRequestStatusMap[designRequestStatus.status].description,\n ...designRequestStatus,\n });\n }\n\n if (agreementStatus) {\n output.push({\n color: agreementStatusMap[agreementStatus.status].color,\n icon: ,\n text: agreementStatusMap[agreementStatus.status].description,\n ...agreementStatus,\n });\n }\n\n if (webProposalStatus) {\n output.push({\n color: proposalShareStatusMap[webProposalStatus.status].color,\n icon: ,\n text: proposalShareStatusMap[webProposalStatus.status].text,\n ...webProposalStatus,\n });\n }\n\n return output;\n}\n\nconst StatusRow = styled(DS.Flex)`\n > * {\n border-left: 2px solid background;\n\n &:not(:first-child) {\n margin-left: -4px;\n }\n }\n &:hover > *:not(:first-child) {\n margin-left: 0px;\n }\n`;\n\ninterface ExpandedStatusProps {\n status: StatusChild;\n}\n\nconst ExpandedStatus = ({ status }: ExpandedStatusProps) => {\n return (\n \n {status.icon}\n \n {status.text}\n {status.timestamp && (\n \n {formatRelativeDate(status.timestamp, {\n month: 'MMM',\n separator: ' | ',\n time: 'hh:mm a',\n })}\n \n )}\n \n \n );\n};\n\ninterface IconContainerProps {\n children: ReactElement;\n backgroundColor: string;\n}\n\nconst IconContainer = ({ children, backgroundColor }: IconContainerProps) => {\n return (\n \n {children}\n \n );\n};\n\nexport interface StatusSelectorProps {\n designRequestStatus?: DesignRequestStatusInfo;\n agreementStatus?: AgreementStatusInfo;\n webProposalStatus?: ProposalShareStatusInfo;\n _open?: boolean;\n 'data-testid'?: string;\n}\n\nexport const StatusSelector = React.memo((props: StatusSelectorProps) => {\n const statuses: StatusChild[] = buildStatusChildren(props);\n\n return (\n \n {statuses.map(({ icon, text, color }) => (\n \n {icon}\n \n ))}\n \n }\n defaultVisible={props._open}\n disableChildPadding\n >\n \n {statuses.map((status, i) => (\n \n \n {i !== statuses.length - 1 ? : null}\n \n ))}\n \n \n );\n});\n","// @ts-ignore: Ignore unused { * as Types } import\nimport * as Types from '@aurorasolar/graphql-client-schema';\n\nimport { gql } from '@apollo/client';\nimport * as Apollo from '@apollo/client';\nconst defaultOptions = {} as const;\nexport type ProposalInfoFragment = { __typename: 'ProposalShareInfo', id: string, token?: string | null | undefined, tokenExpiry?: string | null | undefined, lastViewedAt?: string | null | undefined, createdAt?: string | null | undefined, followUpRequested?: boolean | null | undefined, followUpRequestedAt?: string | null | undefined };\n\nexport type GetProposalShareInfoQueryVariables = Types.Exact<{\n designId: Types.Scalars['ID'];\n}>;\n\n\nexport type GetProposalShareInfoQuery = { __typename: 'Query', proposalShareInfoByDesignId?: { __typename: 'ProposalShareInfo', id: string, token?: string | null | undefined, tokenExpiry?: string | null | undefined, lastViewedAt?: string | null | undefined, createdAt?: string | null | undefined, followUpRequested?: boolean | null | undefined, followUpRequestedAt?: string | null | undefined } | null | undefined };\n\nexport type GetProposalShareEmailsQueryVariables = Types.Exact<{\n projectId: Types.Scalars['ID'];\n}>;\n\n\nexport type GetProposalShareEmailsQuery = { __typename: 'Query', proposalShareEmailsByProjectId?: Array<{ __typename: 'ProposalShareEmail', lastSent?: string | null | undefined, emails?: Array | null | undefined, designId: string } | null | undefined> | null | undefined };\n\nexport type CreateProposalShareMutationVariables = Types.Exact<{\n designId: Types.Scalars['String'];\n}>;\n\n\nexport type CreateProposalShareMutation = { __typename: 'Mutation', createProposalShare: { __typename: 'ProposalShareInfo', id: string, token?: string | null | undefined, tokenExpiry?: string | null | undefined, lastViewedAt?: string | null | undefined, createdAt?: string | null | undefined, followUpRequested?: boolean | null | undefined, followUpRequestedAt?: string | null | undefined } };\n\nexport type UpdateProposalShareMutationVariables = Types.Exact<{\n designId: Types.Scalars['ID'];\n updatedProposalShare: Types.UpdatedProposalShare;\n}>;\n\n\nexport type UpdateProposalShareMutation = { __typename: 'Mutation', updateProposalShare: { __typename: 'ProposalShareInfo', id: string, token?: string | null | undefined, tokenExpiry?: string | null | undefined, lastViewedAt?: string | null | undefined, createdAt?: string | null | undefined, followUpRequested?: boolean | null | undefined, followUpRequestedAt?: string | null | undefined } };\n\nexport type RefreshProposalShareTokenMutationVariables = Types.Exact<{\n designId: Types.Scalars['ID'];\n}>;\n\n\nexport type RefreshProposalShareTokenMutation = { __typename: 'Mutation', refreshProposalShareToken: { __typename: 'ProposalShareToken', token?: string | null | undefined } };\n\nexport type SendProposalShareEmailsMutationVariables = Types.Exact<{\n designId: Types.Scalars['ID'];\n input: Types.ProposalShareDesignEmailsInput;\n}>;\n\n\nexport type SendProposalShareEmailsMutation = { __typename: 'Mutation', sendProposalShareEmails: { __typename: 'ProposalShareDesignEmails', design?: { __typename: 'ProposalShareEmails', emails?: Array | null | undefined } | null | undefined } };\n\nexport const ProposalInfoFragmentDoc = gql`\n fragment proposalInfo on ProposalShareInfo {\n id\n token\n tokenExpiry\n lastViewedAt\n createdAt\n followUpRequested\n followUpRequestedAt\n}\n `;\nexport const GetProposalShareInfoDocument = gql`\n query GetProposalShareInfo($designId: ID!) @trace_info(traceInfo: {pod: proposals}) {\n proposalShareInfoByDesignId(designId: $designId) {\n ...proposalInfo\n }\n}\n ${ProposalInfoFragmentDoc}`;\n\n/**\n * __useGetProposalShareInfoQuery__\n *\n * To run a query within a React component, call `useGetProposalShareInfoQuery` and pass it any options that fit your needs.\n * When your component renders, `useGetProposalShareInfoQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useGetProposalShareInfoQuery({\n * variables: {\n * designId: // value for 'designId'\n * },\n * });\n */\nexport function useGetProposalShareInfoQuery(baseOptions: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(GetProposalShareInfoDocument, options);\n }\nexport function useGetProposalShareInfoLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(GetProposalShareInfoDocument, options);\n }\nexport type GetProposalShareInfoQueryHookResult = ReturnType;\nexport type GetProposalShareInfoLazyQueryHookResult = ReturnType;\nexport type GetProposalShareInfoQueryResult = Apollo.QueryResult;\nexport const GetProposalShareEmailsDocument = gql`\n query GetProposalShareEmails($projectId: ID!) @trace_info(traceInfo: {pod: proposals}) {\n proposalShareEmailsByProjectId(projectId: $projectId) {\n lastSent\n emails\n designId\n }\n}\n `;\n\n/**\n * __useGetProposalShareEmailsQuery__\n *\n * To run a query within a React component, call `useGetProposalShareEmailsQuery` and pass it any options that fit your needs.\n * When your component renders, `useGetProposalShareEmailsQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useGetProposalShareEmailsQuery({\n * variables: {\n * projectId: // value for 'projectId'\n * },\n * });\n */\nexport function useGetProposalShareEmailsQuery(baseOptions: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(GetProposalShareEmailsDocument, options);\n }\nexport function useGetProposalShareEmailsLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(GetProposalShareEmailsDocument, options);\n }\nexport type GetProposalShareEmailsQueryHookResult = ReturnType;\nexport type GetProposalShareEmailsLazyQueryHookResult = ReturnType;\nexport type GetProposalShareEmailsQueryResult = Apollo.QueryResult;\nexport const CreateProposalShareDocument = gql`\n mutation CreateProposalShare($designId: String!) @trace_info(traceInfo: {pod: proposals}) {\n createProposalShare(designId: $designId) {\n ...proposalInfo\n }\n}\n ${ProposalInfoFragmentDoc}`;\nexport type CreateProposalShareMutationFn = Apollo.MutationFunction;\n\n/**\n * __useCreateProposalShareMutation__\n *\n * To run a mutation, you first call `useCreateProposalShareMutation` within a React component and pass it any options that fit your needs.\n * When your component renders, `useCreateProposalShareMutation` returns a tuple that includes:\n * - A mutate function that you can call at any time to execute the mutation\n * - An object with fields that represent the current status of the mutation's execution\n *\n * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2;\n *\n * @example\n * const [createProposalShareMutation, { data, loading, error }] = useCreateProposalShareMutation({\n * variables: {\n * designId: // value for 'designId'\n * },\n * });\n */\nexport function useCreateProposalShareMutation(baseOptions?: Apollo.MutationHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useMutation(CreateProposalShareDocument, options);\n }\nexport type CreateProposalShareMutationHookResult = ReturnType;\nexport type CreateProposalShareMutationResult = Apollo.MutationResult;\nexport type CreateProposalShareMutationOptions = Apollo.BaseMutationOptions;\nexport const UpdateProposalShareDocument = gql`\n mutation UpdateProposalShare($designId: ID!, $updatedProposalShare: UpdatedProposalShare!) @trace_info(traceInfo: {pod: proposals}) {\n updateProposalShare(\n designId: $designId\n updatedProposalShare: $updatedProposalShare\n ) {\n ...proposalInfo\n }\n}\n ${ProposalInfoFragmentDoc}`;\nexport type UpdateProposalShareMutationFn = Apollo.MutationFunction;\n\n/**\n * __useUpdateProposalShareMutation__\n *\n * To run a mutation, you first call `useUpdateProposalShareMutation` within a React component and pass it any options that fit your needs.\n * When your component renders, `useUpdateProposalShareMutation` returns a tuple that includes:\n * - A mutate function that you can call at any time to execute the mutation\n * - An object with fields that represent the current status of the mutation's execution\n *\n * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2;\n *\n * @example\n * const [updateProposalShareMutation, { data, loading, error }] = useUpdateProposalShareMutation({\n * variables: {\n * designId: // value for 'designId'\n * updatedProposalShare: // value for 'updatedProposalShare'\n * },\n * });\n */\nexport function useUpdateProposalShareMutation(baseOptions?: Apollo.MutationHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useMutation(UpdateProposalShareDocument, options);\n }\nexport type UpdateProposalShareMutationHookResult = ReturnType;\nexport type UpdateProposalShareMutationResult = Apollo.MutationResult;\nexport type UpdateProposalShareMutationOptions = Apollo.BaseMutationOptions;\nexport const RefreshProposalShareTokenDocument = gql`\n mutation RefreshProposalShareToken($designId: ID!) @trace_info(traceInfo: {pod: proposals}) {\n refreshProposalShareToken(designId: $designId) {\n token\n }\n}\n `;\nexport type RefreshProposalShareTokenMutationFn = Apollo.MutationFunction;\n\n/**\n * __useRefreshProposalShareTokenMutation__\n *\n * To run a mutation, you first call `useRefreshProposalShareTokenMutation` within a React component and pass it any options that fit your needs.\n * When your component renders, `useRefreshProposalShareTokenMutation` returns a tuple that includes:\n * - A mutate function that you can call at any time to execute the mutation\n * - An object with fields that represent the current status of the mutation's execution\n *\n * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2;\n *\n * @example\n * const [refreshProposalShareTokenMutation, { data, loading, error }] = useRefreshProposalShareTokenMutation({\n * variables: {\n * designId: // value for 'designId'\n * },\n * });\n */\nexport function useRefreshProposalShareTokenMutation(baseOptions?: Apollo.MutationHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useMutation(RefreshProposalShareTokenDocument, options);\n }\nexport type RefreshProposalShareTokenMutationHookResult = ReturnType;\nexport type RefreshProposalShareTokenMutationResult = Apollo.MutationResult;\nexport type RefreshProposalShareTokenMutationOptions = Apollo.BaseMutationOptions;\nexport const SendProposalShareEmailsDocument = gql`\n mutation SendProposalShareEmails($designId: ID!, $input: ProposalShareDesignEmailsInput!) @trace_info(traceInfo: {pod: proposals}) {\n sendProposalShareEmails(designId: $designId, input: $input) {\n design {\n emails\n }\n }\n}\n `;\nexport type SendProposalShareEmailsMutationFn = Apollo.MutationFunction;\n\n/**\n * __useSendProposalShareEmailsMutation__\n *\n * To run a mutation, you first call `useSendProposalShareEmailsMutation` within a React component and pass it any options that fit your needs.\n * When your component renders, `useSendProposalShareEmailsMutation` returns a tuple that includes:\n * - A mutate function that you can call at any time to execute the mutation\n * - An object with fields that represent the current status of the mutation's execution\n *\n * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2;\n *\n * @example\n * const [sendProposalShareEmailsMutation, { data, loading, error }] = useSendProposalShareEmailsMutation({\n * variables: {\n * designId: // value for 'designId'\n * input: // value for 'input'\n * },\n * });\n */\nexport function useSendProposalShareEmailsMutation(baseOptions?: Apollo.MutationHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useMutation(SendProposalShareEmailsDocument, options);\n }\nexport type SendProposalShareEmailsMutationHookResult = ReturnType;\nexport type SendProposalShareEmailsMutationResult = Apollo.MutationResult;\nexport type SendProposalShareEmailsMutationOptions = Apollo.BaseMutationOptions;","export interface SearchablePartnerOption {\n label: string;\n value: string;\n}\n\nexport interface SearchablePartnerGroupOption {\n groupTitle: string;\n options: SearchablePartnerOption[];\n}\n\nexport enum StaticPartnerOptionLabels {\n AllPartners = 'All partners',\n NoPartner = 'No partner',\n}\n\nexport enum StaticPartnerOptionValues {\n All = 'all',\n}\n\nexport enum PartnerOptionGroupTitles {\n StaticGroup = 'Select all or no partners',\n QueryGroup = 'Select specific partners',\n}\n","import { Unassigned } from '@aurorasolar/graphql-client-schema';\n\nimport {\n PartnerOptionGroupTitles,\n SearchablePartnerGroupOption,\n SearchablePartnerOption,\n StaticPartnerOptionLabels,\n StaticPartnerOptionValues,\n} from './types';\n\n// 'set-to-all-partners': user has clicked on 'All partners'\n// 'set-to-no-partner': user has clicked on 'No partner'\n// 'exclude-all-partner': user had prev selected 'All partners' then chooses another option\n// 'exclude-no-partner': user had prev selected 'No partner' then chooses another option\n// 'default': user had prev selected a specific partner and again chooses a specific partner\nenum UpdatePartnerActionType {\n SetToAllPartners = 'set-to-all-partners',\n SetToNoPartner = 'set-to-no-partner',\n ExcludeAllPartners = 'exclude-all-parters',\n ExcludeNoPartner = 'exclude-no-partner',\n Default = 'default',\n}\n\n// compare the prev and curr sets of selections to identify what type of action is needed\nconst getActionType = (prev: string[], curr: string[]): UpdatePartnerActionType => {\n if (\n !!curr.find((id) => id === StaticPartnerOptionValues.All) &&\n !prev.find((id) => id === StaticPartnerOptionValues.All)\n ) {\n return UpdatePartnerActionType.SetToAllPartners;\n }\n if (\n !!curr.find((id) => id === Unassigned.Partner) &&\n !prev.find((id) => id === Unassigned.Partner)\n ) {\n return UpdatePartnerActionType.SetToNoPartner;\n }\n if (!!curr.find((id) => id === StaticPartnerOptionValues.All) && curr.length > 1) {\n return UpdatePartnerActionType.ExcludeAllPartners;\n }\n if (!!curr.find((id) => id === Unassigned.Partner) && curr.length > 1) {\n return UpdatePartnerActionType.ExcludeNoPartner;\n }\n return UpdatePartnerActionType.Default;\n};\n\n// the partner multiselect needs to automatically remove some selections when certain new selections are made\n// evaluating the prev and curr sets of selections allows us to make those changes\nexport const getUpdatedPartnerSelections = (\n previousSelectedIds: string[],\n currentSelectedIds: string[],\n options: SearchablePartnerGroupOption[],\n) => {\n let updatedSelectedPartnerIds: string[] = [];\n let updatedSelectedPartnerOptions: SearchablePartnerOption[] = [];\n\n switch (getActionType(previousSelectedIds, currentSelectedIds)) {\n // only include 'All partners'\n case UpdatePartnerActionType.SetToAllPartners: {\n updatedSelectedPartnerIds = [StaticPartnerOptionValues.All];\n updatedSelectedPartnerOptions = [\n {\n label: StaticPartnerOptionLabels.AllPartners,\n value: StaticPartnerOptionValues.All,\n },\n ];\n break;\n }\n // only include 'No partner'\n case UpdatePartnerActionType.SetToNoPartner: {\n updatedSelectedPartnerIds = [Unassigned.Partner];\n updatedSelectedPartnerOptions = [\n {\n label: StaticPartnerOptionLabels.NoPartner,\n value: Unassigned.Partner,\n },\n ];\n break;\n }\n // include all selections except 'All partners'\n case UpdatePartnerActionType.ExcludeAllPartners: {\n updatedSelectedPartnerIds = currentSelectedIds.filter(\n (id) => id !== StaticPartnerOptionValues.All,\n );\n updatedSelectedPartnerOptions = currentSelectedIds\n .filter((id) => id !== StaticPartnerOptionValues.All)\n .map((id) => {\n return {\n label:\n options\n .find((o) => o.groupTitle === PartnerOptionGroupTitles.QueryGroup)!\n .options.find((o) => o.value === id)?.label ?? '',\n value: id,\n };\n });\n break;\n }\n // include all selections except 'No partner'\n case UpdatePartnerActionType.ExcludeNoPartner: {\n updatedSelectedPartnerIds = currentSelectedIds.filter((id) => id !== Unassigned.Partner);\n updatedSelectedPartnerOptions = currentSelectedIds\n .filter((id) => id !== Unassigned.Partner)\n .map((id) => {\n return {\n label:\n options\n .find((o) => o.groupTitle === PartnerOptionGroupTitles.QueryGroup)!\n .options.find((o) => o.value === id)?.label ?? '',\n value: id,\n };\n });\n break;\n }\n default: {\n updatedSelectedPartnerIds = currentSelectedIds;\n updatedSelectedPartnerOptions = currentSelectedIds.map((id) => {\n return {\n label:\n options\n .find((o) => o.groupTitle === PartnerOptionGroupTitles.QueryGroup)!\n .options.find((o) => o.value === id)?.label ?? '',\n value: id,\n };\n });\n }\n }\n\n return {\n updatedSelectedPartnerIds,\n updatedSelectedPartnerOptions,\n };\n};\n","import { Unassigned } from '@aurorasolar/graphql-client-schema';\n\nimport {\n SearchablePartnerOption,\n StaticPartnerOptionLabels,\n StaticPartnerOptionValues,\n} from './types';\n\nexport const TEST_ID_PREFACE = 'partner-searchable-multi-select';\n\nexport const STATIC_PARTNER_OPTIONS: SearchablePartnerOption[] = [\n {\n label: StaticPartnerOptionLabels.AllPartners,\n value: StaticPartnerOptionValues.All,\n },\n {\n label: StaticPartnerOptionLabels.NoPartner,\n value: Unassigned.Partner,\n },\n];\n","// @ts-ignore: Ignore unused { * as Types } import\nimport * as Types from '@aurorasolar/graphql-client-schema';\n\nimport { gql } from '@apollo/client';\nimport * as Apollo from '@apollo/client';\nconst defaultOptions = {} as const;\nexport type SearchPartnersQueryVariables = Types.Exact<{\n pagination?: Types.InputMaybe;\n search?: Types.InputMaybe;\n}>;\n\n\nexport type SearchPartnersQuery = { __typename: 'Query', getPartners: { __typename: 'PartnerSearchResult', partners: Array<{ __typename: 'Partner', id: string, name: string }> } };\n\nexport type GetTenantNameQueryVariables = Types.Exact<{ [key: string]: never; }>;\n\n\nexport type GetTenantNameQuery = { __typename: 'Query', currentTenant?: { __typename: 'Tenant', id: string, name?: string | null | undefined } | null | undefined };\n\n\nexport const SearchPartnersDocument = gql`\n query SearchPartners($pagination: SearchPagination, $search: String) @trace_info(traceInfo: {pod: pricing}) {\n getPartners(pagination: $pagination, search: $search) {\n partners {\n id\n name\n }\n }\n}\n `;\n\n/**\n * __useSearchPartnersQuery__\n *\n * To run a query within a React component, call `useSearchPartnersQuery` and pass it any options that fit your needs.\n * When your component renders, `useSearchPartnersQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useSearchPartnersQuery({\n * variables: {\n * pagination: // value for 'pagination'\n * search: // value for 'search'\n * },\n * });\n */\nexport function useSearchPartnersQuery(baseOptions?: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(SearchPartnersDocument, options);\n }\nexport function useSearchPartnersLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(SearchPartnersDocument, options);\n }\nexport type SearchPartnersQueryHookResult = ReturnType;\nexport type SearchPartnersLazyQueryHookResult = ReturnType;\nexport type SearchPartnersQueryResult = Apollo.QueryResult;\nexport const GetTenantNameDocument = gql`\n query GetTenantName @trace_info(traceInfo: {pod: projectCollaboration}) {\n currentTenant {\n id\n name\n }\n}\n `;\n\n/**\n * __useGetTenantNameQuery__\n *\n * To run a query within a React component, call `useGetTenantNameQuery` and pass it any options that fit your needs.\n * When your component renders, `useGetTenantNameQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useGetTenantNameQuery({\n * variables: {\n * },\n * });\n */\nexport function useGetTenantNameQuery(baseOptions?: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(GetTenantNameDocument, options);\n }\nexport function useGetTenantNameLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(GetTenantNameDocument, options);\n }\nexport type GetTenantNameQueryHookResult = ReturnType;\nexport type GetTenantNameLazyQueryHookResult = ReturnType;\nexport type GetTenantNameQueryResult = Apollo.QueryResult;","// @ts-ignore: Ignore unused { * as Types } import\nimport * as Types from '@aurorasolar/graphql-client-schema';\n\nimport { gql } from '@apollo/client';\nimport * as Apollo from '@apollo/client';\nconst defaultOptions = {} as const;\nexport type DownloadAgreementQueryVariables = Types.Exact<{\n id: Types.Scalars['ID'];\n}>;\n\n\nexport type DownloadAgreementQuery = { __typename: 'Query', downloadAgreement?: { __typename: 'AgreementDownload', base64?: string | null | undefined, filename?: string | null | undefined } | null | undefined };\n\n\nexport const DownloadAgreementDocument = gql`\n query DownloadAgreement($id: ID!) @trace_info(traceInfo: {pod: proposals}) {\n downloadAgreement(id: $id, fileType: pdf) {\n base64\n filename\n }\n}\n `;\n\n/**\n * __useDownloadAgreementQuery__\n *\n * To run a query within a React component, call `useDownloadAgreementQuery` and pass it any options that fit your needs.\n * When your component renders, `useDownloadAgreementQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useDownloadAgreementQuery({\n * variables: {\n * id: // value for 'id'\n * },\n * });\n */\nexport function useDownloadAgreementQuery(baseOptions: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(DownloadAgreementDocument, options);\n }\nexport function useDownloadAgreementLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(DownloadAgreementDocument, options);\n }\nexport type DownloadAgreementQueryHookResult = ReturnType;\nexport type DownloadAgreementLazyQueryHookResult = ReturnType;\nexport type DownloadAgreementQueryResult = Apollo.QueryResult;","// @ts-ignore: Ignore unused { * as Types } import\nimport * as Types from '@aurorasolar/graphql-client-schema';\n\nimport { gql } from '@apollo/client';\nimport * as Apollo from '@apollo/client';\nconst defaultOptions = {} as const;\nexport type ProjectTeamAndAssigneeFragment = { __typename: 'Project', teamId?: string | null | undefined, ownerId?: string | null | undefined };\n\nexport type TeamDropdownDataFragment = { __typename: 'Team', id: string, name?: string | null | undefined, userCount?: number | null | undefined };\n\nexport type GetAvailableTeamsQueryVariables = Types.Exact<{\n partnerId: Types.Scalars['ID'];\n}>;\n\n\nexport type GetAvailableTeamsQuery = { __typename: 'Query', currentUser?: { __typename: 'User', id: string, teams?: Array<{ __typename: 'Team', id: string } | null | undefined> | null | undefined } | null | undefined, teamsByPartnerId?: Array<{ __typename: 'Team', id: string, name?: string | null | undefined, userCount?: number | null | undefined } | null | undefined> | null | undefined };\n\nexport type GetAssignableUsersQueryVariables = Types.Exact<{\n teamIds?: Types.InputMaybe | Types.Scalars['String']>;\n partnerIds?: Types.InputMaybe | Types.Scalars['String']>;\n includeAdmin?: Types.InputMaybe;\n}>;\n\n\nexport type GetAssignableUsersQuery = { __typename: 'Query', assignableUsers: Array<{ __typename: 'User', id: string, email?: string | null | undefined, firstName?: string | null | undefined, lastName?: string | null | undefined, role?: { __typename: 'Role', id: string, name: string, userLevel: string } | null | undefined }> };\n\nexport type AssigneeSearchQueryVariables = Types.Exact<{\n pagination?: Types.InputMaybe;\n filter?: Types.InputMaybe;\n query?: Types.InputMaybe;\n}>;\n\n\nexport type AssigneeSearchQuery = { __typename: 'Query', userSearch: { __typename: 'UserSearchResult', user: Array<{ __typename: 'User', id: string, email?: string | null | undefined, firstName?: string | null | undefined, lastName?: string | null | undefined, role?: { __typename: 'Role', id: string, name: string, userLevel: string } | null | undefined }>, meta?: { __typename: 'PaginationMeta', totalEntries?: number | null | undefined } | null | undefined } };\n\nexport type AssignTeamMutationVariables = Types.Exact<{\n type: Types.AsyncJobType;\n projectIds: Array | Types.Scalars['ID'];\n teamId?: Types.InputMaybe;\n userId?: Types.InputMaybe;\n}>;\n\n\nexport type AssignTeamMutation = { __typename: 'Mutation', startAsyncJob: { __typename: 'AsyncDxf' } | { __typename: 'AutoDesigner' } | { __typename: 'AutoStringing' } | { __typename: 'AvoidedCost' } | { __typename: 'BaseAsyncJobResult', jobType: string } | { __typename: 'EmailCreditApplicationResult' } | { __typename: 'ExternalPDFGeneration' } | { __typename: 'FileUploaderResult' } | { __typename: 'Financing' } | { __typename: 'GeodataMessage' } | { __typename: 'GetFinancingProducts' } | { __typename: 'GetFinancings' } | { __typename: 'IntegrationSettingValidation' } | { __typename: 'IrradianceResult' } | { __typename: 'LineDiagramDxf' } | { __typename: 'LinkToResource' } | { __typename: 'NearmapAvailability' } | { __typename: 'PerformanceSimulation' } | { __typename: 'PlanSetZipfile' } | { __typename: 'PricingAsyncJobResult' } | { __typename: 'VexcelAvailability' } };\n\nexport const ProjectTeamAndAssigneeFragmentDoc = gql`\n fragment ProjectTeamAndAssignee on Project {\n teamId\n ownerId\n}\n `;\nexport const TeamDropdownDataFragmentDoc = gql`\n fragment TeamDropdownData on Team {\n id\n name\n userCount\n}\n `;\nexport const GetAvailableTeamsDocument = gql`\n query GetAvailableTeams($partnerId: ID!) @trace_info(traceInfo: {pod: projectCollaboration}) {\n currentUser {\n id\n teams {\n id\n }\n }\n teamsByPartnerId(partnerId: $partnerId) {\n ...TeamDropdownData\n }\n}\n ${TeamDropdownDataFragmentDoc}`;\n\n/**\n * __useGetAvailableTeamsQuery__\n *\n * To run a query within a React component, call `useGetAvailableTeamsQuery` and pass it any options that fit your needs.\n * When your component renders, `useGetAvailableTeamsQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useGetAvailableTeamsQuery({\n * variables: {\n * partnerId: // value for 'partnerId'\n * },\n * });\n */\nexport function useGetAvailableTeamsQuery(baseOptions: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(GetAvailableTeamsDocument, options);\n }\nexport function useGetAvailableTeamsLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(GetAvailableTeamsDocument, options);\n }\nexport type GetAvailableTeamsQueryHookResult = ReturnType;\nexport type GetAvailableTeamsLazyQueryHookResult = ReturnType;\nexport type GetAvailableTeamsQueryResult = Apollo.QueryResult;\nexport const GetAssignableUsersDocument = gql`\n query GetAssignableUsers($teamIds: [String!], $partnerIds: [String!], $includeAdmin: Boolean) @trace_info(traceInfo: {pod: projectCollaboration}) {\n assignableUsers(\n teamIds: $teamIds\n partnerIds: $partnerIds\n includeAdmin: $includeAdmin\n ) {\n id\n email\n firstName\n lastName\n role {\n id\n name\n userLevel\n }\n }\n}\n `;\n\n/**\n * __useGetAssignableUsersQuery__\n *\n * To run a query within a React component, call `useGetAssignableUsersQuery` and pass it any options that fit your needs.\n * When your component renders, `useGetAssignableUsersQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useGetAssignableUsersQuery({\n * variables: {\n * teamIds: // value for 'teamIds'\n * partnerIds: // value for 'partnerIds'\n * includeAdmin: // value for 'includeAdmin'\n * },\n * });\n */\nexport function useGetAssignableUsersQuery(baseOptions?: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(GetAssignableUsersDocument, options);\n }\nexport function useGetAssignableUsersLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(GetAssignableUsersDocument, options);\n }\nexport type GetAssignableUsersQueryHookResult = ReturnType;\nexport type GetAssignableUsersLazyQueryHookResult = ReturnType;\nexport type GetAssignableUsersQueryResult = Apollo.QueryResult;\nexport const AssigneeSearchDocument = gql`\n query AssigneeSearch($pagination: SearchPagination, $filter: UserSearchFilter, $query: String) @trace_info(traceInfo: {pod: projectCollaboration}) {\n userSearch(filter: $filter, pagination: $pagination, query: $query) {\n user {\n id\n email\n firstName\n lastName\n role {\n id\n name\n userLevel\n }\n }\n meta {\n totalEntries\n }\n }\n}\n `;\n\n/**\n * __useAssigneeSearchQuery__\n *\n * To run a query within a React component, call `useAssigneeSearchQuery` and pass it any options that fit your needs.\n * When your component renders, `useAssigneeSearchQuery` returns an object from Apollo Client that contains loading, error, and data properties\n * you can use to render your UI.\n *\n * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;\n *\n * @example\n * const { data, loading, error } = useAssigneeSearchQuery({\n * variables: {\n * pagination: // value for 'pagination'\n * filter: // value for 'filter'\n * query: // value for 'query'\n * },\n * });\n */\nexport function useAssigneeSearchQuery(baseOptions?: Apollo.QueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useQuery(AssigneeSearchDocument, options);\n }\nexport function useAssigneeSearchLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useLazyQuery(AssigneeSearchDocument, options);\n }\nexport type AssigneeSearchQueryHookResult = ReturnType;\nexport type AssigneeSearchLazyQueryHookResult = ReturnType;\nexport type AssigneeSearchQueryResult = Apollo.QueryResult;\nexport const AssignTeamDocument = gql`\n mutation AssignTeam($type: AsyncJobType!, $projectIds: [ID!]!, $teamId: ID, $userId: ID) @trace_info(traceInfo: {pod: projectCollaboration}) {\n startAsyncJob(\n type: $type\n settings: {projectIds: $projectIds, teamId: $teamId, userId: $userId}\n ) {\n ... on BaseAsyncJobResult {\n jobType\n }\n }\n}\n `;\nexport type AssignTeamMutationFn = Apollo.MutationFunction;\n\n/**\n * __useAssignTeamMutation__\n *\n * To run a mutation, you first call `useAssignTeamMutation` within a React component and pass it any options that fit your needs.\n * When your component renders, `useAssignTeamMutation` returns a tuple that includes:\n * - A mutate function that you can call at any time to execute the mutation\n * - An object with fields that represent the current status of the mutation's execution\n *\n * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2;\n *\n * @example\n * const [assignTeamMutation, { data, loading, error }] = useAssignTeamMutation({\n * variables: {\n * type: // value for 'type'\n * projectIds: // value for 'projectIds'\n * teamId: // value for 'teamId'\n * userId: // value for 'userId'\n * },\n * });\n */\nexport function useAssignTeamMutation(baseOptions?: Apollo.MutationHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useMutation(AssignTeamDocument, options);\n }\nexport type AssignTeamMutationHookResult = ReturnType;\nexport type AssignTeamMutationResult = Apollo.MutationResult;\nexport type AssignTeamMutationOptions = Apollo.BaseMutationOptions;","import { Unassigned } from '@aurorasolar/graphql-client-schema';\n\nimport { TeamDropdownDataFragment, useGetAvailableTeamsQuery } from '../reassign-project.generated';\n\nimport type { SelectableTeam } from '../shared';\n\nconst noTeamOption = {\n description: 'Unassigned from team',\n isUnassignedOption: true,\n label: 'No team',\n userCount: 0,\n value: Unassigned.Team,\n};\n\nexport const convertTeamToSelectable: (\n showNoTeamOption: boolean,\n data: (TeamDropdownDataFragment | undefined | null)[] | undefined | null,\n) => SelectableTeam[] = (showNoTeamOption, data) => {\n const teamOptions = [...(showNoTeamOption ? [noTeamOption] : [])];\n\n if (data == null) {\n return teamOptions;\n }\n return [\n ...teamOptions,\n ...data.map((team) => ({\n label: team?.name ?? '',\n userCount: team?.userCount ?? 0,\n value: team?.id ?? '',\n })),\n ];\n};\n\nexport const useTeamOptions = ({\n skip,\n isTeamsEnabled,\n partnerId,\n}: {\n skip: boolean;\n isTeamsEnabled: boolean;\n partnerId: string | undefined | null;\n}) => {\n const { data } = useGetAvailableTeamsQuery({\n fetchPolicy: 'cache-and-network',\n skip: skip || !isTeamsEnabled,\n variables: { partnerId: partnerId ?? Unassigned.Partner },\n });\n const showNoTeamOption = data?.currentUser?.teams?.length === 0;\n const teamData = data?.teamsByPartnerId;\n return convertTeamToSelectable(showNoTeamOption, teamData);\n};\n","import { useCallback, useEffect, useState } from 'react';\n\nimport { useStartAsyncJobMutation } from '@aurorasolar/common-data-access-layer';\nimport {\n Analytics,\n AnalyticsEventTypes,\n OrgPermission,\n OrgPermissions,\n useAppModule,\n} from '@aurorasolar/common-module-loader';\nimport { AsyncJobType, Unassigned } from '@aurorasolar/graphql-client-schema';\n\nimport { usePartnersTeams } from '../use-partners-teams/use-partners-teams';\nimport { useUpdateProjectToast } from '../use-update-project-toast/use-update-project-toast';\nimport { ReassignProjectModalCore } from './reassign-project-modal-core';\nimport {\n ProjectTeamAndAssigneeFragment,\n ProjectTeamAndAssigneeFragmentDoc,\n} from './reassign-project.generated';\nimport { useSearchAssigneeOptions } from './use-search-assignee-options/use-search-assignee-options';\nimport { useTeamOptions } from './use-team-options/use-team-options';\n\nimport type { SelectableUser, SelectedProject } from './shared';\n\nconst unassignedUserOption: SelectableUser = {\n description: 'Unassigned from user',\n isUnassignedOption: true,\n label: 'No assignee',\n roleName: '',\n value: Unassigned.Project,\n};\n\nexport const ReassignProjectModal = ({\n isOpen,\n onClose,\n selectedProjects,\n}: {\n isOpen: boolean;\n onClose: () => void;\n selectedProjects: SelectedProject[];\n}) => {\n const orgPermission = useAppModule(OrgPermissions);\n const handleSaveCompleteOrError = useUpdateProjectToast();\n const analytics = useAppModule(Analytics);\n\n const canOnlyUnassign = Boolean(orgPermission?.getPermission(OrgPermission.CanOnlyUnassign));\n const { showTeams } = usePartnersTeams({ skipPartners: true, skipTeams: true });\n\n const [saveProjectAssignation, { loading: isSavingInProgress }] = useStartAsyncJobMutation({\n onCompleted: () => {\n handleSaveCompleteOrError('completed');\n onClose();\n },\n onError: () => {\n handleSaveCompleteOrError('error');\n onClose();\n },\n });\n const [selectedTeamId, setSelectedTeamId] = useState();\n\n const teamOptions = useTeamOptions({\n isTeamsEnabled: showTeams,\n partnerId: selectedProjects[0]?.partnerId ?? Unassigned.Partner,\n skip: !isOpen,\n });\n\n const { search, options } = useSearchAssigneeOptions({\n canOnlyUnassign,\n selectedProjectPartnerId: selectedProjects[0]?.partnerId,\n selectedTeamId,\n });\n\n useEffect(() => {\n if (isOpen) {\n search();\n }\n }, [isOpen, search]);\n\n const handleSave = useCallback(\n (assigneeId: string, teamId?: string) => {\n const projectIds = selectedProjects?.map(({ id }) => id) ?? [];\n const convertedTeamId = teamId === Unassigned.Team ? null : teamId;\n const convertedAssigneeId = assigneeId === Unassigned.Project ? null : assigneeId;\n saveProjectAssignation({\n update: (cache) => {\n projectIds.forEach((projectId) => {\n cache.writeFragment({\n data: {\n __typename: 'Project',\n ownerId: convertedAssigneeId,\n teamId: convertedTeamId,\n },\n fragment: ProjectTeamAndAssigneeFragmentDoc,\n id: `Project:${projectId}`,\n });\n });\n },\n variables: {\n settings: {\n projectIds,\n teamId: convertedTeamId,\n userId: convertedAssigneeId,\n },\n type: AsyncJobType.ProjectAssignation,\n },\n });\n analytics?.track(AnalyticsEventTypes.ReassignedProject, {\n has_assignee: convertedAssigneeId != null,\n has_team: convertedTeamId != null,\n reassign_method: projectIds.length === 1 ? 'individual' : 'bulk',\n source: 'project_index',\n });\n },\n [analytics, saveProjectAssignation, selectedProjects],\n );\n\n return (\n \n );\n};\n"],"names":["ZoneView","children","PageContent","Symbol","ProposalPath","StyledIFrame","iframe","StyledLoader","ProposalIFrame","iframeSrc","useLoader","useRef","loading","setLoading","useState","handleIFrameLoad","useCallback","event","target","focus","ref","onLoad","src","title","ShadeReportState","ShadeReportLoader","white","WHITE","PRIMARY_GREEN","EmptyShadeReport","div","GRAY_500","state","ROUTE_LOADING","ShadeReport","designId","projectId","setState","setIframeSrc","token$","appConfig","useEffect","listenForPortalLoad","previousState","data","MODEL_LOADING","LOADED","window","addEventListener","removeEventListener","tokenSubscription","subscribe","token","host","proposalsIFrameHost","unsubscribe","request","section","view","params","SystemComponentType","CombinerBox","DcOptimizer","Disconnect","LoadCenter","Meter","Microinverter","SolarInverter","ServicePanel","SolarPanel","SingleInputMicroinverter","shape","integrationSettingId","of","required","formatOrFallback","value","format","fallback","EnergyUnits","currency","locale","formatNumber","formatDateTime","formatPhoneNumber","stringComparator","formatRelativeTime","formatCurrency","minPlaces","maxPlaces","val","maximumFractionDigits","minimumFractionDigits","style","formatCurrencyLogic","date","options","Date","formatEnergy","unit","KWH","formatLatLong","formatPercent","toFixed","wattage","additionalSuffix","override","kilo","mega","giga","formatWattage","suffix","digits","n","formatWattageTuple","join","SelectedIcon","attrs","fillColor","name","CHECKMARK","size","EXTRA_SMALL","formatWattageShort","SelectionChangeIcon","isSelected","color","GRAY_700","BLACK","CLOSE","BTN_PLUS","spanBox","FlexRow","CheckboxWrap","StyledItem","li","canSelect","isMultiSelect","GRAY_200","ComponentSelectItem","component","inputCount","manufacturer","rating","onClick","x","display","flex","flexDirection","overflow","GRAY_800","ComponentSelectTestid","SelectButton","button","isDisabled","GRAY_100","isActive","GRAY_400","POPOVER_HEIGHT","ITEM_HEIGHT","SelectPopover","SearchInput","ComponentSelectCore","buttonLabel","buttonTestid","disabled","isOpen","items","maxSelectionSize","minSelectionSize","onClickedAway","onComponentSelect","onPopoverClosing","onPopoverOpened","onPopoverOpening","onSearchStringChange","onToggleButtonClick","searchInput","searchTestid","selectedItems","validation","textColor","content","inputRef","leftIcon","onInput","currentTarget","placeholder","map","item","has","id","minimal","onClosing","onInteraction","shouldBeOpen","onOpened","onOpening","position","maxWidth","undefined","fontSize","type","CHEVRON_DOWN","isValid","RED","message","usePortal","ComponentSelectType","getComponentRating","ratingStc","ratedPower","getInputCount","componentType","__typename","mppts","numInputs","getComponentItems","hiddenIds","Array","isArray","componentSearch","components","filter","includes","lookup","isMicroinverter","isSolarCompatible","isSingleInputMicroinverter","commonActions","applySettings","assign","settings","_","visibleItems","queryResult","overrideSelectedIds","selectedIds","Set","processLoadedData","ctx","selectItems","selectionSize","min","delete","max","values","next","add","selectedComponents","validationCheck","componentSelectActions","actions","cond","componentSelectMachine","createMachine","context","initial","states","closed","on","DATA_LOADED","EXTERNAL_SELECTED_ITEMS_CHANGED","SETTINGS_CHANGED","TOGGLE_BUTTON_CLICKED","fetchingInitialData","open","entry","CLICKED_AWAY","COMPONENT_SELECTED","SEARCH_STRING_CHANGED","shouldSearchAllComponents","searchString","searchWords","split","toString","word","toLowerCase","some","searchable","every","searchWord","filterComponent","filterComponents","SEARCH_STRING_READY","opening","POPOVER_OPENED","pendingDataRequest","BEGIN_DATA_REQUEST","uninitialized","ComponentSelectDocument","emptySelectionLabel","onSelection","validator","getPermission","SearchAllComponents","searchTimeout","refreshItems","setRefreshItems","send","useMachine","focusSearchInput","current","queryComponents","onlyEnabledComponents","isInitialQuery","typeParams","includeIds","from","isEnabled","query","variables","input","getComponentSelectQueryParams","selection","validIds","startSearchDebounce","clearTimeout","setTimeout","baseOptions","useComponentSelectLazyQuery","useMemo","selectedItem","find","getButtonLabel","getFirstSelection","fn","isSingleInput","isExternalMppt","singleInputOnly","PlaceCombinerBox","PlaceDisconnect","PlaceInverter","PlaceLoadCenter","PlaceMeter","PlaceServicePanel","vertical","noSelection","css","PANELS_PORTRAIT","P","PANELS_LANDSCAPE","L","sharedActions","selectPanel","integratedMlpeType","panel","mlpe","isCellStringOptimizer","isDcOptimizer","isSolarInverter","getMlpeLabel","settingsForCad","solarPanelId","dcOptimizerId","microinverterId","toggleAdvancedSettings","isAdvancedOpen","toggleStringing","checked","maxStringLength","stringingMode","EntireRow","None","updateSettings","patch","updateStringLength","length","Math","round","MaxLength","arraySpacingX","arraySpacingY","heightToBase","interModuleSpacingX","interModuleSpacingY","orientation","tilt","notReady","ADVANCED_SETTINGS_TOGGLED","PANEL_SELECTED","SETTING_CHANGED","STRING_LENGTH_CHANGED","STRINGING_TOGGLED","panelIsSelected","DRAW_CLICKED","MLPE_REMOVED","selectedMlpeType","MLPE_SELECTED","mlpeId","MLPE_TYPE_ADDED","mlpeType","NAVY","Map","PlaceSolarPanels","DesignClickedInsertPanels","DesignClickedCombinerBox","DesignClickedDisconnect","DesignClickedInverter","DesignClickedLoadCenter","DesignClickedMeter","DesignClickedServicePanel","DrawerTitle","h4","DrawerSection","GRAY_300","DrawerTabGroup","DrawerTabSelected","grouped","intent","SECONDARY","DrawerTabNotSelected","DrawerTab","props","AutoDesignerInputArea","alignTop","numericInputOffset","fill","labelArea","alignItems","justifyContent","mb","pr","AutoDesignerRadioButton","TERTIARY","selectedBgOverlayColor","TargetMode","FillerRowSetting","PanelOrientation","AutoDesignerMinimumIrradiance","minimumIrradiance","onMinimumIrradianceChange","selectedMode","Energy","onValueChange","sap","rightTag","tsrf","AutoDesignerModeButtonTestIds","MaxFit","allModes","hiddenModes","AutoDesignerTargetMode","targetMode","onTargetModeChange","availableModes","mode","linecolor","createGroupMatcher","projectDesignIdMatcher","projectDesignIdSubRouteMatcher","util","useUrlGroupMatcher","matcher","navigation","Object","keys","SelectedComponent","AutoDesignerSelectedComponent","isHovered","setIsHovered","icon","onMouseEnter","onMouseLeave","SelectedComponents","SelectionDivider","ListItem","AutoDesignerComponentType","componentMap","SolarPanels","label","StringInverters","Microinverters","DcOptimizers","AutoDesignerComponentSelection","lookupType","itemsChildren","updateItems","addItem","removeItem","limit","alignSelectionBox","ids","fieldLabel","charAt","toUpperCase","slice","selections","i","className","idToRemove","subRoute","console","warn","addItemInternal","mt","AutoDesignerComponents","onComponentsChange","key","newItems","stringInverters","microinverters","dcOptimizers","StyledShrinkableHeader","ShrinkableHeader","contentScrollTop","m","textTransform","PanelBody","BottomArea","AutoDesignerCore","onCancel","onRun","scrollTop","setScrollTop","validationError","width","onScroll","ml","PRIMARY","EnergyTargetInput","AutoDesignerEnergyMode","energy","onEnergyChange","hasAnnualEnergy","annual","step","offset","AlertTooltipType","Icons","DANGER","ALERT","WARNING","ORANGE","INFO","INFO_SOLID","StyledTooltip","theme","space","AlertTooltipContent","mr","lineHeight","tooltipProps","BOTTOM","ConversionInput","distanceLimits","Infinity","stepSize","fillerRowSettings","Auto","orientationOptions","Portrait","Landscape","AutoDesignerPanels","panels","onPanelsChange","toggleIsAdvancedOpen","useReducer","v","solarPanels","flip","pt","pb","pl","INFO_OUTLINE","setting","fillerRow","conversionType","DistanceSmall","maxDecimalPlaces","spacingX","tagComponent","spacingY","ValidationError","AutoDesignerDocument","autoDesignerReducer","draft","payload","targetNeedsToBeSet","AutoStringInverter","NumericInput","AutoStringInverterParams","dcAcRatio","updateDcAcRatio","updateMaxStringLength","minStringLength","updateMinStringLength","Number","isNaN","AutoStringerCore","addDcOptimizer","addInverter","addMicroinverter","autoParams","currentSelectionSection","dcOptimizer","inverters","inverterType","setInverterType","integratedMicroinverter","removeDcOptimizer","removeInverter","removeMicroinverter","solarPanel","updateAutoParams","inv","hasIntegratedMlpe","fontStyle","AutoStringerMlpe","marginTop","marginBottom","StringInverter","onChange","chosenMlpe","cellStringOptimizer","solarInverter","manufacturerName","AutoStringSelectionType","AutoStringActionType","getInverterParams","design","integratedDcOptimizer","NaN","actualDcOpt","inverter","temperatureMin","temperatureMax","getNewSettings","reduce","microinverter","omit","obj","settingsReducer","action","FillZoneSelectionChanged","selectedFillZone","SelectionTypeChanged","selectionType","Nothing","selectedSolarPanel","SetInverterType","AddInverter","newSetting","push","RemoveInverter","AddMicroinverter","RemoveMicroinverter","AddDcOptimizer","RemoveDcOptimizer","SolarPanelQueryFinished","UpdateIntegratedDcOptimizer","DesignChanged","UpdateAutoParams","UpdateSetting","prop","SolarPanelSelectionChanged","SelectionDetails","componentLabel","count","minCount","prefixLabel","py","GRAY_600","AutoStringSelectionSection","wattageCumulative","FillZone","panelCount","AutoStringInverterFragmentFragmentDoc","AutoStringDcOptimizerFragmentFragmentDoc","SolarPanelAutoStringDocument","AutoStringInverterDocument","useAutoStringInverterQuery","AutoStringDcOptimizerDocument","useAutoStringDcOptimizerQuery","EMPTY_STRING_LENGTH","getSettings","databaseId","inverterSettings","setting1","setting2","setting3","entries","dcAcRatio1","dcAcRatio2","dcAcRatio3","inverterId1","inverterId2","inverterId3","maxStringLength1","maxStringLength2","maxStringLength3","minStringLength1","minStringLength2","minStringLength3","preset","forEach","Row","RadioEl","AutoStringerChoosePanelItem","onSelect","selectedId","useSolarPanelAutoStringQuery","fetchPolicy","alignSelf","AutoStringerChoosePanelsTypesDocument","AutoDesigner","onClose","startAsyncJob","loadDesign","LoadSystemDesign","save","track","updateState","update","useAutoDesignerQuery","onCompleted","loadProfile","annualEnergy","NoModules","needsInverter","NoInverters","getValidationError","autoDesignerFinish","autoDesignerStart","cadState","autoDesignerActions","async","parameters","getId","isMaxFit","dc_optimizers","solar_inverters","solar_panels","constraints","max_fit","savings","objective","allow_filler_row","column_spacing_m","min_sap","min_tsrf","orientations","row_spacing_m","post_solar","getAsyncJobParameters","DesignRanAutoDesigner","panel_orientation","design_id","inputs","Autodes","then","response","JSON","parse","catch","finally","AutoStringer","initData","dispatch","selectionId","selectedPanelId","getSelectedId","designById","skip","onSolarPanelQueryCompleted","client","solarPanelCache","get","isCancelled","set","error","useSolarPanelQueryFixed","microinverterResult","integratedDcOptimizerId","integratedDcOptimizerResult","dcOptimizerResult","invertersToCheck","useAutostringValidationError","initialDcOptimizerResult","initialMicroinverterResult","initialDcOptimizerId","initialMicroinverterId","initialSolarPanelRefs","useAutoStringInitialComponents","stringFillZone","StringFillZones","stringPanels","RunAutoStringer","run","newDcOptimizer","newInverter","newMicroinverter","oldDcOptimizer","oldInverter","oldMicroinverter","newInverterType","AutoStringerChoosePanel","openAutoStringer","BeforeRunAutoStringer","selectPanelInCad","SelectPanelType","choosePanel","solarPanelTypes","useAutoStringerChoosePanelsTypesQuery","returnPartialData","CAD","panelTypes","selected","setSelected","typeId","SPACER_HEIGHT","UnderlineTabs","animate","selectedTextColor","tabColor","notSelectedTextColor","hoverTextColor","responsive","rule","makeRule","breakpoints","rules","index","cssRule","typedValues","mediumBreakpoint","md","largeBreakpoint","lg","sm","column","columnEnd","columnStart","row","rowEnd","rowStart","columns","rows","columnGap","rowGap","gap","gridFlow","MONTHLY_ANNUAL","FixedChargeUnit","RetailRate","ExportPenalty","PercentExport","FlatExportRate","Schedule","Tou","FlatRate","Fit","Cash","Credit","MONTHLY","ANNUAL","month","opacity","left","top","buildTranslate","zIndices","tooltip","CADPerformancePanelType","isDrawerOpen","CanRun","Running","CannotRunValid","CannotRunNoRoofs","roofType","RoofPlane","checkingForExistingRoofs","EXISTING_ROOF_QUERY_LOADED","hasExistingRoof","JOB_STARTED","checkingForPrerunRequests","CHECK_PRERUN_REQUEST","DETERMINED_PRERUN_REQUEST","prerunRequest","confirmingStart","MODAL_CLOSED","MODAL_KEEP_ROOFS_CLICKED","MODAL_OVERRIDE_ROOFS_CLICKED","idle","TOOLBAR_ITEM_SELECTED","running","exit","JOB_CANCELLED","JOB_ERRORED","JOB_FINISHED","TEAM_MEMBER_USER_LEVEL","ELEVATION_TENANT_IDS","FREEDOM_FOREVER_TENANT_IDS","EMPOWER_HOME_SOLAR_TENANT_IDS","SALES_MODE_EXIT_BUTTON_TENANT_IDS","UserAccountType","isAuroraAdmin","_isAuroraAdmin","isAdmin","userLevel","isTeamMember","role","custom","isLimitedTeamMember","isPremiumAccount","userAccountType","Engineering","isDesignerAccount","Designer","isEnterpriseAccount","tenantAccountType","isDesignAccount","isRecurlyEnabled","recurlyEnabled","isElevationTenant","tenantId","isEmpowerHomeSolarTenant","isFreedomForeverTenant","canAccessProjectIndex","rolePermissions","accessProjectIndexPage","isTenantTeamlessTeamMember","partnerId","teamIds","PERMISSIONS","RouterAuthorizationForbidUtilityAndTaxRates","condition","default","RouterAuthorizationForbidSettingSalesAgreement","RouterAuthorizationForbidSettingApiSettings","RouterAuthorizationForbidSettingBilling","RouterAuthorizationForbidSettingDesign","RouterAuthorizationForbidSettingFinancing","RouterAuthorizationForbidSettingGeneral","RouterAuthorizationForbidSettingOnDemandServices","RouterAuthorizationForbidSettingPerformanceSimulation","RouterAuthorizationForbidSettingUsersAndLicenses","RouterAuthorizationForbidSettingPdfTemplates","RouterAuthorizationForbidPartners","isEPCTenant","RouterAuthorizationForbidLeads","RouterAuthorizationForbidLeadCaptureSettings","RouterAuthorizationForbidPlanSets","RouterAuthorizationForbidDatabase","accessDatabasePage","canAccessDatabase","RouterAuthorizationForbidProjectIndex","isModernConceptsTenant","isGasFastTenant","RouterAuthorizationForbidSetting","RouterAuthorizationForbidSettingPricingGeneral","RouterAuthorizationForbidDatabaseAddersAndDiscounts","HideProjectAssigneeFilter","RouterAuthorizationForbidDesignMode","accessDesignMode","canAccessDesignMode","RouterAuthorizationForbidProjectOverview","RouterAuthorizationForbidSettingIntegration","RouterAuthorizationForbidFinancingProducts","RouterAuthorizationForbidDatabaseIncentives","ShowNoTeamOptionAtProjectCreation","ShowCreateProjectCommercialOption","CanViewAndCreatePartnerProjects","DesignCadShadeReport","DesignCadLidar","DesignCadLidarShading","DesignCadSiteEdit","isSecureMode","editSiteModel","canEditSiteMode","DesignCadBalanceOfSystem","DesignCadRoofFaceMonthlyIrradiance","DesignCadFillZone","DesignCadWalkway","permissionsMode","Open","isUnlockedMode","RouterAuthorizationForbidSettingRole","RouterAuthorizationForbidSettingTeam","CanDeleteOthersProject","CanOnlyUnassign","CanMoveProjectIntoPartner","ShowReassignOption","RouterAuthorizationForbidSettingSalesModeCustomization","SalesModeExitButton","isSalesModeExitButtonTenant","CanEditPricing","updatePricing","ShowProjectAssigneeDropdownLeadConvertModal","ShowLeadAssigneeDropdown","CanViewLimitedTeamMember","CanSpecifyComponentAvailability","ShowComponentPartnerAssignment","CanEditDatabaseComponent","RouterAuthorizationForbidCreateNewProjects","createProjects","canCreateProjects","CanEditGlobalAhj","CanEditTenantAhj","CanEditGlobalUtilityRequirement","CanEditTenantUtilityRequirement","debugLogger","extend","localStorage","apiInfo$","orgPermission","ready$","combineLatest","pipe","switchMap","apiInfo","user","email","getItem","orgProps","permissions","access_database_page","access_design_mode","access_project_index_page","create_projects","edit_site_model","readTeamProject","read_team_project","updateConsumptionData","update_consumption_data","update_pricing","aurora_admin","tenant","permissions_mode","limited_team_members_cannot_update_site_model","partner_id","permission_mode","Restricted","has_automated_billing","team_ids","account_type","user_level","getUserData","permission","result","checkUserOrgPermission","AuroraSimulationFormTestid","Unknown","Nsrdb","Tmy3","Tmy2","Intl","PVWattsSimulationFormTestid","losses","MODAL_OPENED","initialLosses","openedWith","loss","monthlyValues","opened","CANCEL_CLICKED","DONE_CLICKED","MONTHLY_LOSS_ADDED","lossName","MONTHLY_LOSS_REMOVED","monthlyLosses","MONTHLY_LOSS_UPDATED","span","isSimulationShadingEnabled","isUsingMLPE","SimulationSettingsTestid","PerformanceSimSettingsFragmentDoc","SimulationSettingsFragmentDoc","Aurora","Pvwatts","SystemSettingsTestid","DesignSettingsTab","NearmapAvailabilityType","isMaxImageryTooltipShown","isEdited","isUploading","ul","boxShadow","MapSelectionFragmentDoc","months","isExpanded","hasError","AuroraCheckbox","StyledInputGroup","AuroraInputGroup","disableSelectAllOnFocus","maxLength","noInlineErrors","validators","passedInErrors","inputId","errors","validate","as","htmlFor","onBlur","newValue","onFocus","e","select","Lease","Ppa","Loans","TariffOutputFragmentDoc","useInterceptMouse","cadDomNode","clicked","setClicked","onMouse","capture","once","passive","defaultFormat","day","separator","time","formatRelativeDate","timestamp","customFormat","fm","preffix","isYesterday","isToday","isTomorrow","getPrefix","badStatusColor","agreementStatusMap","Signed","description","Viewed","Sent","Error","Declined","CancelPending","Canceled","Draft","designRequestStatusMap","Accepted","DesignerRejected","Submitted","DesignerCompleted","Rejected","ProposalShareStatus","proposalShareStatusMap","FOLLOWUP_REQUESTED","text","VIEWED","SENT","LINK_EXPIRED","StatusRow","ExpandedStatus","status","cursor","px","w","IconContainer","backgroundColor","h","transitionDuration","transitionProperty","transitionTimingFunction","ProposalInfoFragmentDoc","statuses","designRequestStatus","agreementStatus","webProposalStatus","output","buildStatusChildren","anchor","defaultVisible","_open","disableChildPadding","UpdatePartnerActionType","StaticPartnerOptionLabels","StaticPartnerOptionValues","PartnerOptionGroupTitles","AllPartners","All","NoPartner","Partner","TeamDropdownDataFragmentDoc","Team","Project"],"sourceRoot":""}