@flightctl/ui-components 1.1.0-rc1 → 1.1.0-rc3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/components/Repository/CreateRepository/CreateRepositoryForm.css +5 -1
- package/dist/types/imagebuilder/index.d.ts +2 -0
- package/dist/types/imagebuilder/index.d.ts.map +1 -1
- package/dist/types/imagebuilder/index.js +3 -1
- package/dist/types/imagebuilder/index.js.map +1 -1
- package/dist/types/imagebuilder/models/ApiVersion.d.ts +8 -0
- package/dist/types/imagebuilder/models/ApiVersion.d.ts.map +1 -0
- package/dist/types/imagebuilder/models/ApiVersion.js +16 -0
- package/dist/types/imagebuilder/models/ApiVersion.js.map +1 -0
- package/dist/types/imagebuilder/models/ImageBuild.d.ts +2 -4
- package/dist/types/imagebuilder/models/ImageBuild.d.ts.map +1 -1
- package/dist/types/imagebuilder/models/ImageBuildList.d.ts +2 -4
- package/dist/types/imagebuilder/models/ImageBuildList.d.ts.map +1 -1
- package/dist/types/imagebuilder/models/ImageExport.d.ts +2 -4
- package/dist/types/imagebuilder/models/ImageExport.d.ts.map +1 -1
- package/dist/types/imagebuilder/models/ImageExportList.d.ts +2 -4
- package/dist/types/imagebuilder/models/ImageExportList.d.ts.map +1 -1
- package/dist/types/imagebuilder/models/Status.d.ts +28 -0
- package/dist/types/imagebuilder/models/Status.d.ts.map +1 -0
- package/dist/types/imagebuilder/models/Status.js +3 -0
- package/dist/types/imagebuilder/models/Status.js.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +3 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/models/ApiVersion.d.ts +9 -0
- package/dist/types/models/ApiVersion.d.ts.map +1 -0
- package/dist/types/models/ApiVersion.js +17 -0
- package/dist/types/models/ApiVersion.js.map +1 -0
- package/dist/types/models/ApplicationProviderBase.d.ts +12 -0
- package/dist/types/models/ApplicationProviderBase.d.ts.map +1 -0
- package/dist/types/models/ApplicationProviderBase.js +3 -0
- package/dist/types/models/ApplicationProviderBase.js.map +1 -0
- package/dist/types/models/ApplicationProviderSpec.d.ts +5 -15
- package/dist/types/models/ApplicationProviderSpec.d.ts.map +1 -1
- package/dist/types/models/ApplicationUser.d.ts +7 -0
- package/dist/types/models/ApplicationUser.d.ts.map +1 -0
- package/dist/types/models/ApplicationUser.js +3 -0
- package/dist/types/models/ApplicationUser.js.map +1 -0
- package/dist/types/models/AuthConfig.d.ts +2 -4
- package/dist/types/models/AuthConfig.d.ts.map +1 -1
- package/dist/types/models/AuthProvider.d.ts +2 -4
- package/dist/types/models/AuthProvider.d.ts.map +1 -1
- package/dist/types/models/AuthProviderList.d.ts +2 -4
- package/dist/types/models/AuthProviderList.d.ts.map +1 -1
- package/dist/types/models/CertificateSigningRequest.d.ts +2 -4
- package/dist/types/models/CertificateSigningRequest.d.ts.map +1 -1
- package/dist/types/models/CertificateSigningRequestList.d.ts +2 -4
- package/dist/types/models/CertificateSigningRequestList.d.ts.map +1 -1
- package/dist/types/models/ComposeApplication.d.ts +7 -0
- package/dist/types/models/ComposeApplication.d.ts.map +1 -0
- package/dist/types/models/ComposeApplication.js +3 -0
- package/dist/types/models/ComposeApplication.js.map +1 -0
- package/dist/types/models/ContainerApplication.d.ts +18 -0
- package/dist/types/models/ContainerApplication.d.ts.map +1 -0
- package/dist/types/models/ContainerApplication.js +3 -0
- package/dist/types/models/ContainerApplication.js.map +1 -0
- package/dist/types/models/ContainerApplicationProperties.d.ts +13 -0
- package/dist/types/models/ContainerApplicationProperties.d.ts.map +1 -0
- package/dist/types/models/ContainerApplicationProperties.js +3 -0
- package/dist/types/models/ContainerApplicationProperties.js.map +1 -0
- package/dist/types/models/Device.d.ts +2 -4
- package/dist/types/models/Device.d.ts.map +1 -1
- package/dist/types/models/DeviceList.d.ts +2 -4
- package/dist/types/models/DeviceList.d.ts.map +1 -1
- package/dist/types/models/EnrollmentRequest.d.ts +2 -4
- package/dist/types/models/EnrollmentRequest.d.ts.map +1 -1
- package/dist/types/models/EnrollmentRequestList.d.ts +2 -4
- package/dist/types/models/EnrollmentRequestList.d.ts.map +1 -1
- package/dist/types/models/Event.d.ts +2 -4
- package/dist/types/models/Event.d.ts.map +1 -1
- package/dist/types/models/Event.js.map +1 -1
- package/dist/types/models/EventList.d.ts +2 -4
- package/dist/types/models/EventList.d.ts.map +1 -1
- package/dist/types/models/Fleet.d.ts +2 -4
- package/dist/types/models/Fleet.d.ts.map +1 -1
- package/dist/types/models/FleetList.d.ts +2 -4
- package/dist/types/models/FleetList.d.ts.map +1 -1
- package/dist/types/models/HelmApplication.d.ts +20 -0
- package/dist/types/models/HelmApplication.d.ts.map +1 -0
- package/dist/types/models/HelmApplication.js +3 -0
- package/dist/types/models/HelmApplication.js.map +1 -0
- package/dist/types/models/ImageApplicationProviderSpec.d.ts +2 -22
- package/dist/types/models/ImageApplicationProviderSpec.d.ts.map +1 -1
- package/dist/types/models/InlineApplicationProviderSpec.d.ts +2 -3
- package/dist/types/models/InlineApplicationProviderSpec.d.ts.map +1 -1
- package/dist/types/models/Organization.d.ts +2 -4
- package/dist/types/models/Organization.d.ts.map +1 -1
- package/dist/types/models/OrganizationList.d.ts +2 -4
- package/dist/types/models/OrganizationList.d.ts.map +1 -1
- package/dist/types/models/QuadletApplication.d.ts +8 -0
- package/dist/types/models/QuadletApplication.d.ts.map +1 -0
- package/dist/types/models/QuadletApplication.js +3 -0
- package/dist/types/models/QuadletApplication.js.map +1 -0
- package/dist/types/models/Repository.d.ts +2 -4
- package/dist/types/models/Repository.d.ts.map +1 -1
- package/dist/types/models/RepositoryList.d.ts +2 -4
- package/dist/types/models/RepositoryList.d.ts.map +1 -1
- package/dist/types/models/ResourceSync.d.ts +2 -4
- package/dist/types/models/ResourceSync.d.ts.map +1 -1
- package/dist/types/models/ResourceSyncList.d.ts +2 -4
- package/dist/types/models/ResourceSyncList.d.ts.map +1 -1
- package/dist/types/models/Status.d.ts +2 -4
- package/dist/types/models/Status.d.ts.map +1 -1
- package/dist/types/models/TemplateVersion.d.ts +2 -4
- package/dist/types/models/TemplateVersion.d.ts.map +1 -1
- package/dist/types/models/TemplateVersionList.d.ts +2 -4
- package/dist/types/models/TemplateVersionList.d.ts.map +1 -1
- package/dist/ui-components/src/components/AuthProvider/CreateAuthProvider/utils.d.ts.map +1 -1
- package/dist/ui-components/src/components/AuthProvider/CreateAuthProvider/utils.js +51 -51
- package/dist/ui-components/src/components/AuthProvider/CreateAuthProvider/utils.js.map +1 -1
- package/dist/ui-components/src/components/DetailsPage/Tables/ApplicationsTable.js +1 -1
- package/dist/ui-components/src/components/DetailsPage/Tables/ApplicationsTable.js.map +1 -1
- package/dist/ui-components/src/components/Device/DeviceDetails/DeviceDetailsPage.d.ts.map +1 -1
- package/dist/ui-components/src/components/Device/DeviceDetails/DeviceDetailsPage.js +5 -4
- package/dist/ui-components/src/components/Device/DeviceDetails/DeviceDetailsPage.js.map +1 -1
- package/dist/ui-components/src/components/Device/DeviceDetails/TerminalTab.d.ts.map +1 -1
- package/dist/ui-components/src/components/Device/DeviceDetails/TerminalTab.js +5 -1
- package/dist/ui-components/src/components/Device/DeviceDetails/TerminalTab.js.map +1 -1
- package/dist/ui-components/src/components/Device/EditDeviceWizard/deviceSpecUtils.d.ts +3 -3
- package/dist/ui-components/src/components/Device/EditDeviceWizard/deviceSpecUtils.d.ts.map +1 -1
- package/dist/ui-components/src/components/Device/EditDeviceWizard/deviceSpecUtils.js +310 -363
- package/dist/ui-components/src/components/Device/EditDeviceWizard/deviceSpecUtils.js.map +1 -1
- package/dist/ui-components/src/components/Device/EditDeviceWizard/steps/ApplicationContainerForm.d.ts +1 -3
- package/dist/ui-components/src/components/Device/EditDeviceWizard/steps/ApplicationContainerForm.d.ts.map +1 -1
- package/dist/ui-components/src/components/Device/EditDeviceWizard/steps/ApplicationContainerForm.js +18 -19
- package/dist/ui-components/src/components/Device/EditDeviceWizard/steps/ApplicationContainerForm.js.map +1 -1
- package/dist/ui-components/src/components/Device/EditDeviceWizard/steps/ApplicationHelmForm.d.ts +1 -3
- package/dist/ui-components/src/components/Device/EditDeviceWizard/steps/ApplicationHelmForm.d.ts.map +1 -1
- package/dist/ui-components/src/components/Device/EditDeviceWizard/steps/ApplicationHelmForm.js +5 -4
- package/dist/ui-components/src/components/Device/EditDeviceWizard/steps/ApplicationHelmForm.js.map +1 -1
- package/dist/ui-components/src/components/Device/EditDeviceWizard/steps/ApplicationImageForm.d.ts +1 -3
- package/dist/ui-components/src/components/Device/EditDeviceWizard/steps/ApplicationImageForm.d.ts.map +1 -1
- package/dist/ui-components/src/components/Device/EditDeviceWizard/steps/ApplicationImageForm.js +2 -2
- package/dist/ui-components/src/components/Device/EditDeviceWizard/steps/ApplicationImageForm.js.map +1 -1
- package/dist/ui-components/src/components/Device/EditDeviceWizard/steps/ApplicationInlineForm.d.ts +3 -3
- package/dist/ui-components/src/components/Device/EditDeviceWizard/steps/ApplicationInlineForm.d.ts.map +1 -1
- package/dist/ui-components/src/components/Device/EditDeviceWizard/steps/ApplicationInlineForm.js +20 -23
- package/dist/ui-components/src/components/Device/EditDeviceWizard/steps/ApplicationInlineForm.js.map +1 -1
- package/dist/ui-components/src/components/Device/EditDeviceWizard/steps/ApplicationIntegritySettings.js +3 -3
- package/dist/ui-components/src/components/Device/EditDeviceWizard/steps/ApplicationIntegritySettings.js.map +1 -1
- package/dist/ui-components/src/components/Device/EditDeviceWizard/steps/ApplicationTemplates.d.ts.map +1 -1
- package/dist/ui-components/src/components/Device/EditDeviceWizard/steps/ApplicationTemplates.js +25 -45
- package/dist/ui-components/src/components/Device/EditDeviceWizard/steps/ApplicationTemplates.js.map +1 -1
- package/dist/ui-components/src/components/Device/EditDeviceWizard/steps/ApplicationVariablesForm.d.ts +8 -0
- package/dist/ui-components/src/components/Device/EditDeviceWizard/steps/ApplicationVariablesForm.d.ts.map +1 -0
- package/dist/ui-components/src/components/Device/EditDeviceWizard/steps/ApplicationVariablesForm.js +37 -0
- package/dist/ui-components/src/components/Device/EditDeviceWizard/steps/ApplicationVariablesForm.js.map +1 -0
- package/dist/ui-components/src/components/Device/EditDeviceWizard/steps/ApplicationVolumeForm.d.ts +1 -3
- package/dist/ui-components/src/components/Device/EditDeviceWizard/steps/ApplicationVolumeForm.d.ts.map +1 -1
- package/dist/ui-components/src/components/Device/EditDeviceWizard/steps/ApplicationVolumeForm.js +5 -8
- package/dist/ui-components/src/components/Device/EditDeviceWizard/steps/ApplicationVolumeForm.js.map +1 -1
- package/dist/ui-components/src/components/Device/EditDeviceWizard/utils.d.ts +18 -18
- package/dist/ui-components/src/components/ErrorAlert/ErrorAlert.d.ts +4 -2
- package/dist/ui-components/src/components/ErrorAlert/ErrorAlert.d.ts.map +1 -1
- package/dist/ui-components/src/components/ErrorAlert/ErrorAlert.js +2 -2
- package/dist/ui-components/src/components/ErrorAlert/ErrorAlert.js.map +1 -1
- package/dist/ui-components/src/components/Fleet/CreateFleet/utils.d.ts +1 -1
- package/dist/ui-components/src/components/Fleet/CreateFleet/utils.d.ts.map +1 -1
- package/dist/ui-components/src/components/Fleet/CreateFleet/utils.js +3 -3
- package/dist/ui-components/src/components/Fleet/CreateFleet/utils.js.map +1 -1
- package/dist/ui-components/src/components/Fleet/ImportFleetWizard/steps/RepositoryStep.d.ts.map +1 -1
- package/dist/ui-components/src/components/Fleet/ImportFleetWizard/steps/RepositoryStep.js +3 -1
- package/dist/ui-components/src/components/Fleet/ImportFleetWizard/steps/RepositoryStep.js.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/CancelImageBuildModal/CancelImageBuildModal.d.ts +7 -0
- package/dist/ui-components/src/components/ImageBuilds/CancelImageBuildModal/CancelImageBuildModal.d.ts.map +1 -0
- package/dist/ui-components/src/components/ImageBuilds/CancelImageBuildModal/CancelImageBuildModal.js +40 -0
- package/dist/ui-components/src/components/ImageBuilds/CancelImageBuildModal/CancelImageBuildModal.js.map +1 -0
- package/dist/ui-components/src/components/ImageBuilds/ConfirmImageExportModal/ConfirmImageExportModal.d.ts +8 -0
- package/dist/ui-components/src/components/ImageBuilds/ConfirmImageExportModal/ConfirmImageExportModal.d.ts.map +1 -0
- package/dist/ui-components/src/components/ImageBuilds/ConfirmImageExportModal/ConfirmImageExportModal.js +37 -0
- package/dist/ui-components/src/components/ImageBuilds/ConfirmImageExportModal/ConfirmImageExportModal.js.map +1 -0
- package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/CreateImageBuildWizard.d.ts.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/CreateImageBuildWizard.js +4 -3
- package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/CreateImageBuildWizard.js.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/OutputImageStep.js +1 -1
- package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/OutputImageStep.js.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/RegistrationStep.d.ts.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/RegistrationStep.js +13 -10
- package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/RegistrationStep.js.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/ReviewStep.d.ts.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/ReviewStep.js +4 -2
- package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/ReviewStep.js.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/SourceImageStep.d.ts.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/SourceImageStep.js +7 -1
- package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/steps/SourceImageStep.js.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/types.d.ts +3 -5
- package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/types.d.ts.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/utils.d.ts +3 -2
- package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/utils.d.ts.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/utils.js +139 -34
- package/dist/ui-components/src/components/ImageBuilds/CreateImageBuildWizard/utils.js.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/ImageBuildDetails/ImageBuildDetailsPage.d.ts.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/ImageBuildDetails/ImageBuildDetailsPage.js +23 -12
- package/dist/ui-components/src/components/ImageBuilds/ImageBuildDetails/ImageBuildDetailsPage.js.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/ImageBuildDetails/ImageBuildExportsGallery.d.ts.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/ImageBuildDetails/ImageBuildExportsGallery.js +115 -39
- package/dist/ui-components/src/components/ImageBuilds/ImageBuildDetails/ImageBuildExportsGallery.js.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/ImageBuildDetails/ImageBuildLogsTab.d.ts +1 -0
- package/dist/ui-components/src/components/ImageBuilds/ImageBuildDetails/ImageBuildLogsTab.d.ts.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/ImageBuildDetails/ImageBuildLogsTab.js +17 -18
- package/dist/ui-components/src/components/ImageBuilds/ImageBuildDetails/ImageBuildLogsTab.js.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/ImageBuildRow.d.ts +5 -2
- package/dist/ui-components/src/components/ImageBuilds/ImageBuildRow.d.ts.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/ImageBuildRow.js +22 -12
- package/dist/ui-components/src/components/ImageBuilds/ImageBuildRow.js.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/ImageBuildsPage.d.ts.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/ImageBuildsPage.js +17 -8
- package/dist/ui-components/src/components/ImageBuilds/ImageBuildsPage.js.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/ImageExportCards.d.ts +10 -9
- package/dist/ui-components/src/components/ImageBuilds/ImageExportCards.d.ts.map +1 -1
- package/dist/ui-components/src/components/ImageBuilds/ImageExportCards.js +122 -26
- package/dist/ui-components/src/components/ImageBuilds/ImageExportCards.js.map +1 -1
- package/dist/ui-components/src/components/Repository/CreateRepository/CreateRepositoryForm.d.ts +2 -1
- package/dist/ui-components/src/components/Repository/CreateRepository/CreateRepositoryForm.d.ts.map +1 -1
- package/dist/ui-components/src/components/Repository/CreateRepository/CreateRepositoryForm.js +10 -4
- package/dist/ui-components/src/components/Repository/CreateRepository/CreateRepositoryForm.js.map +1 -1
- package/dist/ui-components/src/components/Repository/CreateRepository/utils.d.ts.map +1 -1
- package/dist/ui-components/src/components/Repository/CreateRepository/utils.js +3 -4
- package/dist/ui-components/src/components/Repository/CreateRepository/utils.js.map +1 -1
- package/dist/ui-components/src/components/form/RepositorySelect.d.ts.map +1 -1
- package/dist/ui-components/src/components/form/RepositorySelect.js +1 -1
- package/dist/ui-components/src/components/form/RepositorySelect.js.map +1 -1
- package/dist/ui-components/src/components/form/UploadField.d.ts.map +1 -1
- package/dist/ui-components/src/components/form/UploadField.js +25 -16
- package/dist/ui-components/src/components/form/UploadField.js.map +1 -1
- package/dist/ui-components/src/components/form/validations.d.ts +25 -18
- package/dist/ui-components/src/components/form/validations.d.ts.map +1 -1
- package/dist/ui-components/src/components/form/validations.js +79 -33
- package/dist/ui-components/src/components/form/validations.js.map +1 -1
- package/dist/ui-components/src/components/modals/CreateRepositoryModal/CreateRepositoryModal.d.ts +2 -1
- package/dist/ui-components/src/components/modals/CreateRepositoryModal/CreateRepositoryModal.d.ts.map +1 -1
- package/dist/ui-components/src/components/modals/CreateRepositoryModal/CreateRepositoryModal.js +2 -2
- package/dist/ui-components/src/components/modals/CreateRepositoryModal/CreateRepositoryModal.js.map +1 -1
- package/dist/ui-components/src/constants.d.ts +5 -6
- package/dist/ui-components/src/constants.d.ts.map +1 -1
- package/dist/ui-components/src/constants.js +19 -11
- package/dist/ui-components/src/constants.js.map +1 -1
- package/dist/ui-components/src/hooks/useWebSocket.d.ts.map +1 -1
- package/dist/ui-components/src/hooks/useWebSocket.js +25 -4
- package/dist/ui-components/src/hooks/useWebSocket.js.map +1 -1
- package/dist/ui-components/src/types/deviceSpec.d.ts +44 -76
- package/dist/ui-components/src/types/deviceSpec.d.ts.map +1 -1
- package/dist/ui-components/src/types/deviceSpec.js +13 -26
- package/dist/ui-components/src/types/deviceSpec.js.map +1 -1
- package/dist/ui-components/src/types/extraTypes.d.ts +1 -7
- package/dist/ui-components/src/types/extraTypes.d.ts.map +1 -1
- package/dist/ui-components/src/types/extraTypes.js.map +1 -1
- package/dist/ui-components/src/types/rbac.d.ts +7 -1
- package/dist/ui-components/src/types/rbac.d.ts.map +1 -1
- package/dist/ui-components/src/types/rbac.js +6 -0
- package/dist/ui-components/src/types/rbac.js.map +1 -1
- package/dist/ui-components/src/utils/imageBuilds.d.ts +1 -0
- package/dist/ui-components/src/utils/imageBuilds.d.ts.map +1 -1
- package/dist/ui-components/src/utils/imageBuilds.js +20 -29
- package/dist/ui-components/src/utils/imageBuilds.js.map +1 -1
- package/dist/ui-components/src/utils/search.d.ts +2 -1
- package/dist/ui-components/src/utils/search.d.ts.map +1 -1
- package/dist/ui-components/src/utils/search.js +2 -2
- package/dist/ui-components/src/utils/search.js.map +1 -1
- package/package.json +2 -2
- package/src/components/AuthProvider/CreateAuthProvider/utils.ts +2 -2
- package/src/components/DetailsPage/Tables/ApplicationsTable.tsx +2 -2
- package/src/components/Device/DeviceDetails/DeviceDetailsPage.tsx +10 -4
- package/src/components/Device/DeviceDetails/TerminalTab.tsx +9 -1
- package/src/components/Device/EditDeviceWizard/deviceSpecUtils.ts +361 -425
- package/src/components/Device/EditDeviceWizard/steps/ApplicationContainerForm.tsx +19 -29
- package/src/components/Device/EditDeviceWizard/steps/ApplicationHelmForm.tsx +5 -13
- package/src/components/Device/EditDeviceWizard/steps/ApplicationImageForm.tsx +2 -16
- package/src/components/Device/EditDeviceWizard/steps/ApplicationInlineForm.tsx +8 -7
- package/src/components/Device/EditDeviceWizard/steps/ApplicationIntegritySettings.tsx +5 -5
- package/src/components/Device/EditDeviceWizard/steps/ApplicationTemplates.tsx +29 -101
- package/src/components/Device/EditDeviceWizard/steps/ApplicationVariablesForm.tsx +87 -0
- package/src/components/Device/EditDeviceWizard/steps/ApplicationVolumeForm.tsx +5 -10
- package/src/components/ErrorAlert/ErrorAlert.tsx +13 -3
- package/src/components/Fleet/CreateFleet/utils.ts +4 -5
- package/src/components/Fleet/ImportFleetWizard/steps/RepositoryStep.tsx +11 -8
- package/src/components/ImageBuilds/CancelImageBuildModal/CancelImageBuildModal.tsx +81 -0
- package/src/components/ImageBuilds/ConfirmImageExportModal/ConfirmImageExportModal.tsx +61 -0
- package/src/components/ImageBuilds/CreateImageBuildWizard/CreateImageBuildWizard.tsx +8 -3
- package/src/components/ImageBuilds/CreateImageBuildWizard/steps/OutputImageStep.tsx +1 -1
- package/src/components/ImageBuilds/CreateImageBuildWizard/steps/RegistrationStep.tsx +18 -10
- package/src/components/ImageBuilds/CreateImageBuildWizard/steps/ReviewStep.tsx +5 -1
- package/src/components/ImageBuilds/CreateImageBuildWizard/steps/SourceImageStep.tsx +13 -1
- package/src/components/ImageBuilds/CreateImageBuildWizard/types.ts +3 -6
- package/src/components/ImageBuilds/CreateImageBuildWizard/utils.ts +161 -37
- package/src/components/ImageBuilds/ImageBuildDetails/ImageBuildDetailsPage.tsx +36 -17
- package/src/components/ImageBuilds/ImageBuildDetails/ImageBuildExportsGallery.tsx +131 -44
- package/src/components/ImageBuilds/ImageBuildDetails/ImageBuildLogsTab.tsx +22 -26
- package/src/components/ImageBuilds/ImageBuildRow.tsx +41 -20
- package/src/components/ImageBuilds/ImageBuildsPage.tsx +34 -15
- package/src/components/ImageBuilds/ImageExportCards.tsx +198 -80
- package/src/components/Repository/CreateRepository/CreateRepositoryForm.css +5 -1
- package/src/components/Repository/CreateRepository/CreateRepositoryForm.tsx +14 -4
- package/src/components/Repository/CreateRepository/utils.ts +4 -4
- package/src/components/form/RepositorySelect.tsx +1 -0
- package/src/components/form/UploadField.tsx +29 -30
- package/src/components/form/validations.ts +156 -106
- package/src/components/modals/CreateRepositoryModal/CreateRepositoryModal.tsx +3 -1
- package/src/constants.ts +19 -6
- package/src/hooks/useWebSocket.ts +25 -3
- package/src/types/deviceSpec.ts +68 -108
- package/src/types/extraTypes.ts +2 -12
- package/src/types/rbac.ts +6 -0
- package/src/utils/imageBuilds.ts +22 -32
- package/src/utils/search.ts +2 -2
package/src/types/deviceSpec.ts
CHANGED
|
@@ -1,20 +1,25 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
ApplicationProviderSpec,
|
|
3
|
+
ComposeApplication,
|
|
4
4
|
ConfigProviderSpec,
|
|
5
|
+
ContainerApplication,
|
|
5
6
|
DisruptionBudget,
|
|
6
7
|
GitConfigProviderSpec,
|
|
8
|
+
HelmApplication,
|
|
7
9
|
HttpConfigProviderSpec,
|
|
8
10
|
ImageApplicationProviderSpec,
|
|
9
11
|
ImagePullPolicy,
|
|
12
|
+
InlineApplicationProviderSpec,
|
|
10
13
|
InlineConfigProviderSpec,
|
|
11
14
|
KubernetesSecretProviderSpec,
|
|
15
|
+
QuadletApplication,
|
|
12
16
|
} from '@flightctl/types';
|
|
13
|
-
import {
|
|
17
|
+
import { FlightCtlLabel } from './extraTypes';
|
|
14
18
|
import { UpdateScheduleMode } from '../utils/time';
|
|
15
19
|
|
|
16
|
-
|
|
20
|
+
// At the moment the "root" user is the default user when no user is specified.
|
|
17
21
|
export const RUN_AS_ROOT_USER = 'root';
|
|
22
|
+
export const RUN_AS_FLIGHTCTL_USER = 'flightctl';
|
|
18
23
|
|
|
19
24
|
export enum ConfigType {
|
|
20
25
|
GIT = 'git',
|
|
@@ -35,77 +40,12 @@ export type GitConfigTemplate = ConfigTemplate & {
|
|
|
35
40
|
path: string;
|
|
36
41
|
};
|
|
37
42
|
|
|
43
|
+
/** Used when adding a Compose/Quadlet app to choose image vs inline source. */
|
|
38
44
|
export enum AppSpecType {
|
|
39
45
|
OCI_IMAGE = 'image',
|
|
40
46
|
INLINE = 'inline',
|
|
41
47
|
}
|
|
42
48
|
|
|
43
|
-
type InlineContent = {
|
|
44
|
-
content?: string;
|
|
45
|
-
path: string;
|
|
46
|
-
base64?: boolean;
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
type AppBase = {
|
|
50
|
-
appType: AppType;
|
|
51
|
-
specType: AppSpecType;
|
|
52
|
-
name?: string;
|
|
53
|
-
variables: { name: string; value: string }[];
|
|
54
|
-
volumes?: ApplicationVolumeForm[];
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
export type PortMapping = {
|
|
58
|
-
hostPort: string;
|
|
59
|
-
containerPort: string;
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
export type SingleContainerAppForm = AppBase & {
|
|
63
|
-
appType: AppType.AppTypeContainer;
|
|
64
|
-
specType: AppSpecType.OCI_IMAGE;
|
|
65
|
-
name: string;
|
|
66
|
-
image: string;
|
|
67
|
-
ports?: PortMapping[];
|
|
68
|
-
limits?: ApplicationResourceLimits;
|
|
69
|
-
runAs?: string;
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
export type QuadletImageAppForm = AppBase & {
|
|
73
|
-
appType: AppType.AppTypeQuadlet;
|
|
74
|
-
specType: AppSpecType.OCI_IMAGE;
|
|
75
|
-
image: string;
|
|
76
|
-
runAs?: string;
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
export type QuadletInlineAppForm = AppBase & {
|
|
80
|
-
appType: AppType.AppTypeQuadlet;
|
|
81
|
-
specType: AppSpecType.INLINE;
|
|
82
|
-
name: string; // transforms the field in required
|
|
83
|
-
files: InlineContent[];
|
|
84
|
-
runAs?: string;
|
|
85
|
-
};
|
|
86
|
-
|
|
87
|
-
export type ComposeImageAppForm = AppBase & {
|
|
88
|
-
appType: AppType.AppTypeCompose;
|
|
89
|
-
specType: AppSpecType.OCI_IMAGE;
|
|
90
|
-
image: string;
|
|
91
|
-
};
|
|
92
|
-
|
|
93
|
-
export type ComposeInlineAppForm = AppBase & {
|
|
94
|
-
appType: AppType.AppTypeCompose;
|
|
95
|
-
specType: AppSpecType.INLINE;
|
|
96
|
-
name: string;
|
|
97
|
-
files: InlineContent[];
|
|
98
|
-
};
|
|
99
|
-
|
|
100
|
-
export type HelmImageAppForm = Omit<AppBase, 'variables' | 'volumes'> & {
|
|
101
|
-
appType: AppType.AppTypeHelm;
|
|
102
|
-
specType: AppSpecType.OCI_IMAGE;
|
|
103
|
-
image: string;
|
|
104
|
-
namespace?: string;
|
|
105
|
-
valuesFiles: Array<string>;
|
|
106
|
-
valuesYaml?: string;
|
|
107
|
-
};
|
|
108
|
-
|
|
109
49
|
export const isGitConfigTemplate = (configTemplate: ConfigTemplate): configTemplate is GitConfigTemplate =>
|
|
110
50
|
configTemplate.type === ConfigType.GIT;
|
|
111
51
|
|
|
@@ -123,50 +63,70 @@ export type RepoConfig = GitConfigProviderSpec | HttpConfigProviderSpec;
|
|
|
123
63
|
export const isRepoConfig = (config: ConfigSourceProvider): config is RepoConfig =>
|
|
124
64
|
isGitProviderSpec(config) || isHttpProviderSpec(config);
|
|
125
65
|
|
|
126
|
-
export
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
| HelmImageAppForm;
|
|
133
|
-
|
|
134
|
-
export const isImageAppProvider = (
|
|
135
|
-
app: ApplicationProviderSpecFixed,
|
|
136
|
-
): app is ApplicationProviderSpecFixed & ImageApplicationProviderSpec => 'image' in app;
|
|
137
|
-
|
|
138
|
-
// Type guards for the 5 explicit types
|
|
139
|
-
export const isQuadletImageAppForm = (app: AppForm): app is QuadletImageAppForm =>
|
|
140
|
-
app.appType === AppType.AppTypeQuadlet && app.specType === AppSpecType.OCI_IMAGE;
|
|
141
|
-
export const isQuadletInlineAppForm = (app: AppForm): app is QuadletInlineAppForm =>
|
|
142
|
-
app.appType === AppType.AppTypeQuadlet && app.specType === AppSpecType.INLINE;
|
|
143
|
-
export const isComposeImageAppForm = (app: AppForm): app is ComposeImageAppForm =>
|
|
144
|
-
app.appType === AppType.AppTypeCompose && app.specType === AppSpecType.OCI_IMAGE;
|
|
145
|
-
export const isComposeInlineAppForm = (app: AppForm): app is ComposeInlineAppForm =>
|
|
146
|
-
app.appType === AppType.AppTypeCompose && app.specType === AppSpecType.INLINE;
|
|
147
|
-
export const isSingleContainerAppForm = (app: AppForm): app is SingleContainerAppForm =>
|
|
148
|
-
app.appType === AppType.AppTypeContainer;
|
|
149
|
-
export const isHelmImageAppForm = (app: AppForm): app is HelmImageAppForm =>
|
|
150
|
-
app.appType === AppType.AppTypeHelm && app.specType === AppSpecType.OCI_IMAGE;
|
|
66
|
+
export const isImageVariantApp = (
|
|
67
|
+
app: ApplicationProviderSpec,
|
|
68
|
+
): app is ApplicationProviderSpec & ImageApplicationProviderSpec => 'image' in app;
|
|
69
|
+
export const isInlineVariantApp = (
|
|
70
|
+
app: ApplicationProviderSpec,
|
|
71
|
+
): app is ApplicationProviderSpec & InlineApplicationProviderSpec => 'inline' in app;
|
|
151
72
|
|
|
152
73
|
export type ApplicationVolumeForm = {
|
|
153
74
|
name: string;
|
|
154
|
-
imageRef
|
|
155
|
-
imagePullPolicy
|
|
156
|
-
mountPath
|
|
75
|
+
imageRef: string;
|
|
76
|
+
imagePullPolicy: ImagePullPolicy;
|
|
77
|
+
mountPath: string;
|
|
157
78
|
};
|
|
158
79
|
|
|
80
|
+
export type PortMapping = {
|
|
81
|
+
hostPort: string;
|
|
82
|
+
containerPort: string;
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export type VariablesForm = { name: string; value: string }[];
|
|
86
|
+
|
|
87
|
+
export type InlineFileForm = { path: string; content?: string; base64?: boolean };
|
|
88
|
+
|
|
89
|
+
type InlineOrImageVariantForm = {
|
|
90
|
+
specType: AppSpecType;
|
|
91
|
+
image: string;
|
|
92
|
+
files: InlineFileForm[];
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
export type SingleContainerAppForm = Omit<ContainerApplication, 'ports' | 'resources' | 'envVars' | 'volumes'> & {
|
|
96
|
+
specType: AppSpecType.OCI_IMAGE;
|
|
97
|
+
ports: PortMapping[];
|
|
98
|
+
cpuLimit: string;
|
|
99
|
+
memoryLimit: string;
|
|
100
|
+
variables: VariablesForm;
|
|
101
|
+
volumes: ApplicationVolumeForm[];
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
export type HelmAppForm = Omit<HelmApplication, 'values'> & {
|
|
105
|
+
specType: AppSpecType.OCI_IMAGE;
|
|
106
|
+
valuesYaml?: string;
|
|
107
|
+
valuesFiles: string[];
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
export type QuadletAppForm = Omit<QuadletApplication, 'envVars' | 'volumes' | 'image' | 'inline'> &
|
|
111
|
+
InlineOrImageVariantForm & {
|
|
112
|
+
variables: VariablesForm;
|
|
113
|
+
volumes: ApplicationVolumeForm[];
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
export type ComposeAppForm = Omit<ComposeApplication, 'envVars' | 'volumes' | 'image' | 'inline'> &
|
|
117
|
+
InlineOrImageVariantForm & {
|
|
118
|
+
variables: VariablesForm;
|
|
119
|
+
volumes: ApplicationVolumeForm[];
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
export type AppForm = SingleContainerAppForm | HelmAppForm | QuadletAppForm | ComposeAppForm;
|
|
123
|
+
|
|
159
124
|
const hasTemplateVariables = (str: string) => /{{.+?}}/.test(str);
|
|
160
125
|
|
|
161
|
-
export const getAppIdentifier = (app: AppForm) => {
|
|
162
|
-
if (
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
if (isQuadletImageAppForm(app) || isComposeImageAppForm(app)) {
|
|
166
|
-
return app.name || app.image;
|
|
167
|
-
}
|
|
168
|
-
// Name is mandatory for inline applications
|
|
169
|
-
return app.name;
|
|
126
|
+
export const getAppIdentifier = (app: AppForm | ApplicationProviderSpec): string => {
|
|
127
|
+
if (app.name) return app.name;
|
|
128
|
+
if ('image' in app && app.image) return app.image;
|
|
129
|
+
return '';
|
|
170
130
|
};
|
|
171
131
|
|
|
172
132
|
const removeSlashes = (url: string | undefined) => (url || '').replace(/^\/+|\/+$/g, '');
|
|
@@ -214,7 +174,7 @@ export const isKubeProviderSpec = (providerSpec: ConfigProviderSpec): providerSp
|
|
|
214
174
|
|
|
215
175
|
export type InlineConfigTemplate = ConfigTemplate & {
|
|
216
176
|
type: ConfigType.INLINE;
|
|
217
|
-
files: Array<
|
|
177
|
+
files: Array<InlineFileForm & { permissions?: string; user?: string; group?: string }>;
|
|
218
178
|
};
|
|
219
179
|
|
|
220
180
|
export const isInlineConfigTemplate = (configTemplate: ConfigTemplate): configTemplate is InlineConfigTemplate =>
|
package/src/types/extraTypes.ts
CHANGED
|
@@ -1,7 +1,4 @@
|
|
|
1
1
|
import {
|
|
2
|
-
AppType,
|
|
3
|
-
ApplicationEnvVars,
|
|
4
|
-
ApplicationVolumeProviderSpec,
|
|
5
2
|
AuthProvider,
|
|
6
3
|
Condition,
|
|
7
4
|
ConditionType,
|
|
@@ -9,7 +6,6 @@ import {
|
|
|
9
6
|
EnrollmentRequest,
|
|
10
7
|
FileContent,
|
|
11
8
|
Fleet,
|
|
12
|
-
ImageApplicationProviderSpec,
|
|
13
9
|
OAuth2ProviderSpec,
|
|
14
10
|
OIDCProviderSpec,
|
|
15
11
|
RelativePath,
|
|
@@ -55,16 +51,10 @@ export type AnnotationType = DeviceAnnotation; // Add more types when they are a
|
|
|
55
51
|
|
|
56
52
|
export const isFleet = (resource: ResourceSync | Fleet): resource is Fleet => resource.kind === 'Fleet';
|
|
57
53
|
|
|
58
|
-
// ApplicationProviderSpec's definition for inline files adds a Record<string, any>.
|
|
54
|
+
// ApplicationProviderSpec's definition for inline files adds a Record<string, any>.
|
|
55
|
+
// We use the fixed type to get proper Typescript checks for the field
|
|
59
56
|
export type InlineApplicationFileFixed = FileContent & RelativePath;
|
|
60
57
|
|
|
61
|
-
// "FixedApplicationProviderSpec" will need to be manually adjusted whenever the API definition changes
|
|
62
|
-
export type ApplicationProviderSpecFixed = ApplicationEnvVars &
|
|
63
|
-
ApplicationVolumeProviderSpec & {
|
|
64
|
-
name?: string;
|
|
65
|
-
appType: AppType;
|
|
66
|
-
} & (ImageApplicationProviderSpec | { inline: InlineApplicationFileFixed[] });
|
|
67
|
-
|
|
68
58
|
type CliArtifact = {
|
|
69
59
|
os: string;
|
|
70
60
|
arch: string;
|
package/src/types/rbac.ts
CHANGED
|
@@ -21,4 +21,10 @@ export enum RESOURCE {
|
|
|
21
21
|
ALERTS = 'alerts',
|
|
22
22
|
AUTH_PROVIDER = 'authproviders',
|
|
23
23
|
IMAGE_BUILD = 'imagebuilds',
|
|
24
|
+
IMAGE_BUILD_LOG = 'imagebuilds/log',
|
|
25
|
+
IMAGE_BUILD_CANCEL = 'imagebuilds/cancel',
|
|
26
|
+
IMAGE_EXPORT = 'imageexports',
|
|
27
|
+
IMAGE_EXPORT_LOG = 'imageexports/log',
|
|
28
|
+
IMAGE_EXPORT_CANCEL = 'imageexports/cancel',
|
|
29
|
+
IMAGE_EXPORT_DOWNLOAD = 'imageexports/download',
|
|
24
30
|
}
|
package/src/utils/imageBuilds.ts
CHANGED
|
@@ -99,6 +99,14 @@ export const isImageBuildActiveReason = (reason: ImageBuildConditionReason): boo
|
|
|
99
99
|
);
|
|
100
100
|
};
|
|
101
101
|
|
|
102
|
+
export const isImageBuildCancelable = (reason: ImageBuildConditionReason): boolean => {
|
|
103
|
+
return (
|
|
104
|
+
reason === ImageBuildConditionReason.ImageBuildConditionReasonPending ||
|
|
105
|
+
reason === ImageBuildConditionReason.ImageBuildConditionReasonBuilding ||
|
|
106
|
+
reason === ImageBuildConditionReason.ImageBuildConditionReasonPushing
|
|
107
|
+
);
|
|
108
|
+
};
|
|
109
|
+
|
|
102
110
|
export const isImageExportActiveReason = (reason: ImageExportConditionReason): boolean => {
|
|
103
111
|
return (
|
|
104
112
|
reason === ImageExportConditionReason.ImageExportConditionReasonPending ||
|
|
@@ -108,17 +116,6 @@ export const isImageExportActiveReason = (reason: ImageExportConditionReason): b
|
|
|
108
116
|
);
|
|
109
117
|
};
|
|
110
118
|
|
|
111
|
-
const isDownloadResultRedirect = (response: Response): boolean => {
|
|
112
|
-
return (
|
|
113
|
-
response.status === 302 ||
|
|
114
|
-
response.status === 301 ||
|
|
115
|
-
response.status === 307 ||
|
|
116
|
-
response.status === 308 ||
|
|
117
|
-
response.type === 'opaqueredirect' ||
|
|
118
|
-
response.status === 0
|
|
119
|
-
);
|
|
120
|
-
};
|
|
121
|
-
|
|
122
119
|
// Validate that a URL is safe to use for download (only http/https protocols)
|
|
123
120
|
const isValidDownloadUrl = (url: string): boolean => {
|
|
124
121
|
try {
|
|
@@ -129,37 +126,30 @@ const isValidDownloadUrl = (url: string): boolean => {
|
|
|
129
126
|
}
|
|
130
127
|
};
|
|
131
128
|
|
|
132
|
-
const getRedirectUrl = (response: Response): string | undefined => {
|
|
133
|
-
// If the Location header is present, it indicates a redirect.
|
|
134
|
-
const redirectUrl = response.headers.get('Location');
|
|
135
|
-
if (redirectUrl) {
|
|
136
|
-
return redirectUrl;
|
|
137
|
-
}
|
|
138
|
-
if (isDownloadResultRedirect(response) && response.url) {
|
|
139
|
-
return response.url;
|
|
140
|
-
}
|
|
141
|
-
return undefined;
|
|
142
|
-
};
|
|
143
|
-
|
|
144
129
|
export type ExportDownloadResult =
|
|
145
130
|
| { type: 'redirect'; url: string }
|
|
146
131
|
| { type: 'blob'; blob: Blob; filename: string | undefined };
|
|
147
132
|
|
|
148
|
-
// The download endpoint returns two types of responses: a redirect URL or a blob.
|
|
149
|
-
//
|
|
150
|
-
//
|
|
133
|
+
// The ImageBuilder API download endpoint returns two types of responses: a redirect URL or a blob.
|
|
134
|
+
// When it returns a redirect URL, the UI proxy rewrites the response to 200 with { redirectUrl: CDN_URL }
|
|
135
|
+
// When no redirect URL is found, we should download the blob directly.
|
|
151
136
|
export const getExportDownloadResult = async (response: Response): Promise<ExportDownloadResult | null> => {
|
|
152
|
-
if (!response.ok
|
|
137
|
+
if (!response.ok || response.type === 'opaqueredirect' || response.status === 0) {
|
|
153
138
|
return null;
|
|
154
139
|
}
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
140
|
+
|
|
141
|
+
// Extract the redirect URL returned by the UI proxy
|
|
142
|
+
const contentType = response.headers.get('Content-Type') || '';
|
|
143
|
+
if (response.ok && contentType.includes('application/json')) {
|
|
144
|
+
const data = (await response.json()) as { redirectUrl?: string };
|
|
145
|
+
const url = data?.redirectUrl;
|
|
146
|
+
if (url && isValidDownloadUrl(url)) {
|
|
147
|
+
return { type: 'redirect', url };
|
|
159
148
|
}
|
|
160
|
-
return
|
|
149
|
+
return null;
|
|
161
150
|
}
|
|
162
151
|
|
|
152
|
+
// Download the blob directly
|
|
163
153
|
const blob = await response.blob();
|
|
164
154
|
|
|
165
155
|
let filename = '';
|
package/src/utils/search.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import fuzzy from 'fuzzysearch';
|
|
2
|
-
import {
|
|
2
|
+
import { ApiVersion } from '@flightctl/types';
|
|
3
3
|
|
|
4
4
|
// Must be an even number for "getSearchResultsCount" to work
|
|
5
5
|
export const MAX_TOTAL_SEARCH_RESULTS = 10;
|
|
@@ -26,7 +26,7 @@ export const getSearchResultsCount = (labelCount: number, fleetCount: number) =>
|
|
|
26
26
|
};
|
|
27
27
|
|
|
28
28
|
export const getEmptyFleetSearch = () => ({
|
|
29
|
-
apiVersion:
|
|
29
|
+
apiVersion: ApiVersion.ApiVersionV1beta1,
|
|
30
30
|
kind: 'Fleet',
|
|
31
31
|
metadata: {},
|
|
32
32
|
items: [],
|