{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./app/kubernetes/models/application/models/index.js","webpack:///./app/portainer/error.js","webpack:///./app/portainer/models/endpoint/models.js","webpack:///./app/kubernetes/models/common/params.js","webpack:///./app/portainer/feature-flags/feature-ids.js","webpack:///./app/kubernetes/helpers/resourceReservationHelper.js","webpack:///./app/kubernetes/models/deploy.js","webpack:///./app/kubernetes/helpers/application/index.js","webpack:///./app/kubernetes/models/application/formValues.js","webpack:///./app/kubernetes/models/configuration/models.js","webpack:///./app/kubernetes/helpers/namespaceHelper.js","webpack:///./app/portainer/models/resourceControl/resourceControlOwnership.js","webpack:///./app/portainer/models/registryTypes.js","webpack:///./app/kubernetes/rest/response/transform.js","webpack:///./app/docker/rest/response/handlers.js","webpack:///./app/kubernetes/models/resource-quota/models.js","webpack:///./app/kubernetes/models/resource-types/models.js","webpack:///./app/kubernetes/models/service/models.js","webpack:///./app/portainer/components/accessControlForm/porAccessControlFormModel.js","webpack:///./app/portainer/components/box-selector/index.js","webpack:///./app/kubernetes/pod/models/index.js","webpack:///./app/kubernetes/helpers/commonHelper.js","webpack:///./app/kubernetes/models/common/payloads.js","webpack:///./app/kubernetes/ingress/converter.js","webpack:///./app/portainer/feature-flags/enums.js","webpack:///./app/portainer/models/resourceControl/resourceControl.js","webpack:///./app/kubernetes/helpers/formValidationHelper.js","webpack:///./app/kubernetes/models/resource-pool/formValues.js","webpack:///./app/docker/models/porImageRegistry.js","webpack:///./app/kubernetes/helpers/configurationHelper.js","webpack:///./app/kubernetes/models/config-map/models.js","webpack:///./app/kubernetes/converters/application.js","webpack:///./app/kubernetes/node/models.js","webpack:///./app/kubernetes/models/configuration/formvalues.js","webpack:///./app/kubernetes/ingress/constants.js","webpack:///./app/kubernetes/converters/configMap.js","webpack:///./app/portainer/filters/filters.js","webpack:///./app/kubernetes/helpers/volumeHelper.js","webpack:///./app/portainer/rbac/models/role.js","webpack:///./app/constants.js","webpack:///./app/kubernetes/horizontal-pod-auto-scaler/converter.js","webpack:///./app/portainer/helpers/env-vars.js","webpack:///./app/portainer/models/access.js","webpack:///./app/kubernetes/models/stateful-set/models.js","webpack:///./app/kubernetes/models/resource-pool/models.js","webpack:///./app/kubernetes/models/application/payloads.js","webpack:///./app/kubernetes/converters/persistentVolumeClaim.js","webpack:///./app/kubernetes/node/converter.js","webpack:///./app/kubernetes/helpers/eventHelper.js","webpack:///./app/kubernetes/models/resource-reservation/models.js","webpack:///./app/kubernetes/converters/resourceQuota.js","webpack:///./app/kubernetes/horizontal-pod-auto-scaler/helper.js","webpack:///./app/portainer/helpers/endpointHelper.js","webpack:///./app/kubernetes/helpers/resourceQuotaHelper.js","webpack:///./app/integrations/storidge/models/profile.js","webpack:///./app/kubernetes/converters/resourcePool.js","webpack:///./app/kubernetes/converters/secret.js","webpack:///./app/kubernetes/models/history/models.js","webpack:///./app/portainer/models/resourceControl/resourceControlTypes.js","webpack:///./app/kubernetes/models/deployment/models.js","webpack:///./app/kubernetes/models/daemon-set/models.js","webpack:///./app/portainer/views/endpoints/helpers.js","webpack:///./app/portainer/models/dockerhub.js","webpack:///./app/kubernetes/converters/service.js","webpack:///./app/kubernetes/pod/converter.js","webpack:///./app/kubernetes/converters/configuration.js","webpack:///./app/portainer/models/stack.js","webpack:///./app/kubernetes/models/namespace/models.js","webpack:///./app/kubernetes/models/storage-class/models.js","webpack:///./app/portainer/components/endpointSecurity/porEndpointSecurityModel.js","webpack:///./app/kubernetes/ingress/models.js","webpack:///./app/kubernetes/node/formValues.js","webpack:///./app/portainer/models/registry.js","webpack:///./app/portainer/settings/authentication/auth-type-constants.js","webpack:///./app/docker/helpers/imageHelper.js","webpack:///./app/portainer/models/teamMembership.js","webpack:///./app/portainer/settings/authentication/ldap/ldap-settings.model.js","webpack:///./app/azure/models/container_group.js","webpack:///./app/docker/helpers/networkHelper.js","webpack:///./app/docker/models/container.js","webpack:///./app/docker/models/image.js","webpack:///./app/kubernetes/node/helper.js","webpack:///./app/portainer/models/group.js","webpack:///./app/kubernetes/pod/payloads/affinities.js","webpack:///./app/kubernetes/store/namespace.js","webpack:///./app/kubernetes/converters/deployment.js","webpack:///./app/kubernetes/converters/daemonSet.js","webpack:///./app/kubernetes/converters/statefulSet.js","webpack:///./app/kubernetes/models/volume/models.js","webpack:///./app/kubernetes/helpers/serviceHelper.js","webpack:///./app/portainer/services/session-storage.js","webpack:///./app/portainer/rbac/models/access.js","webpack:///./app/portainer/settings/authentication/auth-method-constants.js","webpack:///./app/docker/models/containerCapabilities.js","webpack:///./app/portainer/models/resourceControl/resourceControlOwnershipParameters.js","webpack:///./app/agent/rest/response/browse.js","webpack:///./app/kubernetes/helpers/stackHelper.js","webpack:///./app/portainer/services/allSettled.js","webpack:///./app/portainer/helpers/tagHelper.js","webpack:///./app/docker/models/volume.js","webpack:///./app/portainer/models/schedule.js","webpack:///./app/kubernetes/models/config-map/payloads.js","webpack:///./app/kubernetes/converters/namespace.js","webpack:///./app/kubernetes/ingress/payloads.js","webpack:///./app/kubernetes/endpoint/models.js","webpack:///./app/kubernetes/helpers/configMapHelper.js","webpack:///./app/kubernetes/helpers/history/deployment.js","webpack:///./app/kubernetes/views/summary/resources/helpers.js","webpack:///./app/portainer/models/user.js","webpack:///./app/assets/images/logo_alt.svg","webpack:///./app/azure/models/resource_group.js","webpack:///./app/azure/models/subscription.js","webpack:///./app/docker/models/config.js","webpack:///./app/docker/models/network.js","webpack:///./app/docker/models/node.js","webpack:///./app/docker/models/secret.js","webpack:///./app/docker/models/service.js","webpack:///./app/docker/models/task.js","webpack:///./app/integrations/storidge/models/drive.js","webpack:///./app/integrations/storidge/models/node.js","webpack:///./app/integrations/storidge/models/snapshot.js","webpack:///./app/integrations/storidge/models/volume.js","webpack:///./app/kubernetes/models/port/models.js","webpack:///./app/kubernetes/models/secret/payloads.js","webpack:///./app/kubernetes/models/secret/models.js","webpack:///./app/kubernetes/converters/storageClass.js","webpack:///./app/kubernetes/converters/volume.js","webpack:///./app/kubernetes/helpers/history/daemonset.js","webpack:///./app/kubernetes/helpers/history/statefulset.js","webpack:///./app/kubernetes/horizontal-pod-auto-scaler/models.js","webpack:///./app/kubernetes/node/payload.js","webpack:///./app/portainer/models/endpoint/formValues.js","webpack:///./app/portainer/models/settings.js","webpack:///./app/portainer/models/status.js","webpack:///./app/portainer/models/tag.js","webpack:///./app/portainer/models/team.js","webpack:///./app/portainer/oauth/components/oauth-settings/providers.js","webpack:///./app/portainer/rest/transform/gitlabResponseGetLink.js","webpack:///./app/kubernetes/models/application/models/constants.js","webpack:///./app/kubernetes/pod/models/affinities.js","webpack:///./app/angulartics.matomo/index.js","webpack:///./app/edge/views/edge-stacks/index.js","webpack:///./app/edge/views/edge-stacks/createEdgeStackView/index.js","webpack:///./app/edge/views/edge-stacks/createEdgeStackView/create-edge-stack-view.js","webpack:///./app/edge/views/edge-stacks/createEdgeStackView/create-edge-stack-view.controller.js","webpack:///./app/edge/views/edge-stacks/createEdgeStackView/docker-compose-form/index.js","webpack:///./app/edge/views/edge-stacks/createEdgeStackView/docker-compose-form/docker-compose-form.controller.js","webpack:///./app/edge/views/edge-stacks/createEdgeStackView/kube-manifest-form/index.js","webpack:///./app/edge/views/edge-stacks/createEdgeStackView/kube-manifest-form/kube-manifest-form.controller.js","webpack:///./app/edge/views/edge-stacks/createEdgeStackView/kube-deploy-description/index.js","webpack:///./app/portainer/rbac/views/roles/index.js","webpack:///./app/portainer/rbac/views/roles/roles.controller.js","webpack:///./app/portainer/rbac/components/access-viewer/index.js","webpack:///./app/portainer/rbac/components/access-viewer/access-viewer.controller.js","webpack:///./app/portainer/rbac/components/access-viewer/access-viewer-datatable/index.js","webpack:///./app/portainer/rbac/components/roles-datatable/roles-datatable.controller.js","webpack:///./app/portainer/rbac/services/role.service.js","webpack:///./app/portainer/rbac/services/role.rest.js","webpack:///./app/portainer/components/sidebar/sidebar-menu/sidebar-menu.controller.js","webpack:///./app/portainer/components/sidebar/sidebar-section/index.js","webpack:///./app/portainer/components/forms/git-form/index.js","webpack:///./app/portainer/components/forms/git-form/git-form.js","webpack:///./app/portainer/components/forms/git-form/git-form.controller.js","webpack:///./app/portainer/components/forms/git-form/git-form-auth-fieldset/git-form-auth-fieldset.controller.js","webpack:///./app/portainer/components/forms/git-form/git-form-additional-files-panel/index.js","webpack:///./app/portainer/components/forms/git-form/git-form-additional-files-panel/git-form-additional-files-panel.controller.js","webpack:///./app/portainer/components/forms/git-form/git-form-additional-files-panel/git-form-additional-file-item/index.js","webpack:///./app/portainer/components/forms/git-form/git-form-additional-files-panel/git-form-additional-file-item/git-form-additional-file-item.controller.js","webpack:///./app/portainer/components/forms/git-form/git-form-auto-update-fieldset/index.js","webpack:///./app/portainer/components/forms/git-form/git-form-auto-update-fieldset/git-form-auto-update-fieldset.controller.js","webpack:///./app/portainer/components/forms/git-form/git-form-compose-path-field/index.js","webpack:///./app/portainer/components/forms/git-form/git-form-ref-field/index.js","webpack:///./app/portainer/components/forms/git-form/git-form-url-field/index.js","webpack:///./app/portainer/components/forms/git-form/git-form-info-panel/index.js","webpack:///./app/portainer/components/accessManagement/index.js","webpack:///./app/portainer/components/accessManagement/por-access-management.js","webpack:///./app/portainer/components/accessManagement/por-access-management-users-selector/index.js","webpack:///./app/portainer/components/form-components/index.js","webpack:///./app/portainer/components/form-components/web-editor-form/index.js","webpack:///./app/portainer/components/form-components/web-editor-form/web-editor-form.controller.js","webpack:///./app/portainer/components/form-components/file-upload-form/index.js","webpack:///./app/portainer/settings/index.js","webpack:///./app/portainer/settings/authentication/index.js","webpack:///./app/portainer/settings/authentication/ldap/index.js","webpack:///./app/portainer/settings/authentication/ldap/ad-settings/index.js","webpack:///./app/portainer/settings/authentication/ldap/ad-settings/ad-settings.controller.js","webpack:///./app/portainer/settings/authentication/ldap/ldap-settings/index.js","webpack:///./app/portainer/settings/authentication/ldap/ldap-settings/ldap-settings.controller.js","webpack:///./app/portainer/settings/authentication/ldap/ldap-settings-custom/ldap-settings-custom.controller.js","webpack:///./app/portainer/settings/authentication/ldap/ldap-settings-openldap/index.js","webpack:///./app/portainer/settings/authentication/ldap/ldap-settings-openldap/ldap-settings-openldap.controller.js","webpack:///./app/portainer/settings/authentication/ldap/ldap-connectivity-check/index.js","webpack:///./app/portainer/settings/authentication/ldap/ldap-groups-datatable/index.js","webpack:///./app/portainer/settings/authentication/ldap/ldap-group-search/index.js","webpack:///./app/portainer/settings/authentication/ldap/ldap-group-search/ldap-group-search.controller.js","webpack:///./app/portainer/settings/authentication/ldap/ldap-group-search-item/index.js","webpack:///./app/portainer/settings/authentication/ldap/ldap-group-search-item/ldap-group-search-item.controller.js","webpack:///./app/portainer/settings/authentication/ldap/ldap-user-search/index.js","webpack:///./app/portainer/settings/authentication/ldap/ldap-user-search/ldap-user-search.controller.js","webpack:///./app/portainer/settings/authentication/ldap/ldap-user-search-item/index.js","webpack:///./app/portainer/settings/authentication/ldap/ldap-user-search-item/ldap-user-search-item.controller.js","webpack:///./app/portainer/settings/authentication/ldap/ldap-settings-dn-builder/index.js","webpack:///./app/portainer/settings/authentication/ldap/ldap-settings-dn-builder/ldap-settings-dn-builder.controller.js","webpack:///./app/portainer/settings/authentication/ldap/ldap-settings-group-dn-builder/index.js","webpack:///./app/portainer/settings/authentication/ldap/ldap-settings-group-dn-builder/ldap-settings-group-dn-builder.controller.js","webpack:///./app/portainer/settings/authentication/ldap/ldap-custom-group-search/index.js","webpack:///./app/portainer/settings/authentication/ldap/ldap-custom-group-search/ldap-custom-group-search.controller.js","webpack:///./app/portainer/settings/authentication/ldap/ldap-custom-admin-group/ldap-custom-admin-group.controller.js","webpack:///./app/portainer/settings/authentication/ldap/ldap-settings-security/index.js","webpack:///./app/portainer/settings/authentication/ldap/ldap-settings-test-login/ldap-settings-test-login.controller.js","webpack:///./app/portainer/settings/authentication/ldap/ldap-custom-user-search/index.js","webpack:///./app/portainer/settings/authentication/ldap/ldap-custom-user-search/ldap-custom-user-search.controller.js","webpack:///./app/portainer/settings/authentication/ldap/ldap-users-datatable/index.js","webpack:///./app/portainer/settings/authentication/ldap/ldap.service.js","webpack:///./app/portainer/settings/authentication/ldap/ldap.rest.js","webpack:///./app/portainer/settings/authentication/auto-user-provision-toggle/index.js","webpack:///./app/portainer/settings/authentication/save-auth-settings-button/index.js","webpack:///./app/portainer/settings/authentication/internal-auth/index.js","webpack:///./app/portainer/settings/general/index.js","webpack:///./app/portainer/settings/general/ssl-certificate/index.js","webpack:///./app/portainer/settings/general/ssl-certificate/ssl-certificate.controller.js","webpack:///./app/portainer/feature-flags/limited-feature.directive.js","webpack:///./app/portainer/feature-flags/feature-flags.service.js","webpack:///./app/portainer/user-activity/index.js","webpack:///./app/portainer/user-activity/auth-logs-view/index.js","webpack:///./app/portainer/user-activity/auth-logs-view/auth-logs-view.js","webpack:///./app/portainer/user-activity/auth-logs-view/auth-logs-view.controller.js","webpack:///./app/portainer/user-activity/auth-logs-view/auth-logs-datatable/index.js","webpack:///./app/portainer/user-activity/auth-logs-view/auth-logs-datatable/auth-logs-datatable.controller.js","webpack:///./app/portainer/user-activity/activity-logs-view/index.js","webpack:///./app/portainer/user-activity/activity-logs-view/activity-logs-view.js","webpack:///./app/portainer/user-activity/activity-logs-view/activity-logs-view.controller.js","webpack:///./app/portainer/user-activity/activity-logs-view/activity-logs-datatable/activity-logs-datatable.controller.js","webpack:///./app/agent/components/file-uploader/fileUploaderController.js","webpack:///./app/agent/components/host-browser/hostBrowserController.js","webpack:///./app/agent/components/node-selector/nodeSelectorController.js","webpack:///./app/agent/components/volume-browser/volumeBrowserController.js","webpack:///./app/agent/models/agent.js","webpack:///./app/azure/models/location.js","webpack:///./app/azure/models/provider.js","webpack:///./app/azure/views/containerinstances/container-instance-details/containerInstanceDetailsController.js","webpack:///./app/docker/components/imageRegistry/por-image-registry-rate-limits.controller.js","webpack:///./app/docker/components/network-macvlan-form/networkMacvlanFormModel.js","webpack:///./app/docker/components/volumesCIFSForm/volumesCifsFormModel.js","webpack:///./app/docker/components/volumesNFSForm/volumesNFSFormModel.js","webpack:///./app/docker/models/event.js","webpack:///./app/docker/models/imageDetails.js","webpack:///./app/docker/models/imageLayer.js","webpack:///./app/docker/models/plugin.js","webpack:///./app/docker/models/swarm.js","webpack:///./app/docker/rest/response/image.js","webpack:///./app/docker/views/docker-features-configuration/docker-features-configuration.controller.js","webpack:///./app/edge/components/associated-endpoints-datatable/associatedEndpointsDatatableController.js","webpack:///./app/edge/components/edge-job-form/edgeJobFormController.js","webpack:///./app/edge/components/edge-job-results-datatable/edgeJobResultsDatatableController.js","webpack:///./app/edge/components/edge-stack-deployment-type-selector/edge-stack-deployment-type-selector.controller.js","webpack:///./app/edge/components/edge-stack-endpoints-datatable/edgeStackEndpointsDatatableController.js","webpack:///./app/edge/components/edge-stack-status/edgeStackStatusController.js","webpack:///./app/edge/components/edit-edge-stack-form/editEdgeStackFormController.js","webpack:///./app/edge/components/group-form/groupFormController.js","webpack:///./app/edge/components/groups-datatable/groupsDatatableController.js","webpack:///./app/edge/views/edge-groups/createEdgeGroupView/createEdgeGroupViewController.js","webpack:///./app/edge/views/edge-groups/edgeGroupsView/edgeGroupsViewController.js","webpack:///./app/edge/views/edge-groups/editEdgeGroupView/editEdgeGroupViewController.js","webpack:///./app/edge/views/edge-jobs/createEdgeJobView/createEdgeJobViewController.js","webpack:///./app/edge/views/edge-jobs/edgeJob/edgeJobController.js","webpack:///./app/edge/views/edge-jobs/edgeJobsView/edgeJobsViewController.js","webpack:///./app/edge/views/edge-stacks/edgeStacksView/edgeStacksViewController.js","webpack:///./app/edge/views/edge-stacks/editEdgeStackView/editEdgeStackViewController.js","webpack:///./app/integrations/storidge/models/events.js","webpack:///./app/integrations/storidge/models/info.js","webpack:///./app/kubernetes/registries/index.js","webpack:///./app/kubernetes/registries/kube-registry-access-view/index.js","webpack:///./app/kubernetes/registries/kube-registry-access-view/kube-registry-access-view.controller.js","webpack:///./app/kubernetes/custom-templates/index.js","webpack:///./app/kubernetes/custom-templates/kube-custom-templates-view/index.js","webpack:///./app/kubernetes/custom-templates/kube-custom-templates-view/kube-custom-templates-view.controller.js","webpack:///./app/kubernetes/custom-templates/kube-edit-custom-template-view/index.js","webpack:///./app/kubernetes/custom-templates/kube-edit-custom-template-view/kube-edit-custom-template-view.controller.js","webpack:///./app/kubernetes/custom-templates/kube-create-custom-template-view/index.js","webpack:///./app/kubernetes/custom-templates/kube-create-custom-template-view/kube-create-custom-template-view.controller.js","webpack:///./app/portainer/components/box-selector/box-selector.controller.js","webpack:///./app/kubernetes/components/datatables/applications-datatable-details/applications-datatable-details.controller.js","webpack:///./app/kubernetes/components/helm/helm-templates/helm-add-repository/helm-add-repository.controller.js","webpack:///./app/kubernetes/components/helm/helm-templates/helm-templates-list/helm-templates-list.controller.js","webpack:///./app/kubernetes/components/helm/helm-templates/helm-templates.controller.js","webpack:///./app/kubernetes/components/kubectl-shell/kubectl-shell.controller.js","webpack:///./app/kubernetes/models/deployment/payloads.js","webpack:///./app/kubernetes/models/daemon-set/payloads.js","webpack:///./app/kubernetes/models/stateful-set/payloads.js","webpack:///./app/kubernetes/models/volume/payloads.js","webpack:///./app/kubernetes/models/service/payloads.js","webpack:///./app/kubernetes/ingress/helper.js","webpack:///./app/kubernetes/converters/event.js","webpack:///./app/kubernetes/models/event/models.js","webpack:///./app/kubernetes/models/namespace/payloads.js","webpack:///./app/kubernetes/models/resource-quota/payloads.js","webpack:///./app/kubernetes/models/storage-class/payload.js","webpack:///./app/kubernetes/endpoint/converter.js","webpack:///./app/kubernetes/helpers/application/rollback.js","webpack:///./app/kubernetes/helpers/history/index.js","webpack:///./app/kubernetes/models/stack/models.js","webpack:///./app/kubernetes/horizontal-pod-auto-scaler/payload.js","webpack:///./app/kubernetes/models/nodes-limits/models.js","webpack:///./app/kubernetes/pod/payloads/create.js","webpack:///./app/kubernetes/views/applications/helm/helm.controller.js","webpack:///./app/kubernetes/views/resource-pools/create/createResourcePoolController.js","webpack:///./app/kubernetes/views/summary/resources/applicationResources.js","webpack:///./app/kubernetes/views/summary/resources/configurationResources.js","webpack:///./app/kubernetes/views/summary/resources/namespaceResources.js","webpack:///./app/portainer/components/accessControlPanel/porAccessControlPanelModel.js","webpack:///./app/portainer/components/associated-endpoints-selector/associatedEndpointsSelectorController.js","webpack:///./app/portainer/components/be-feature-indicator/be-feature-indicator.controller.js","webpack:///./app/portainer/components/box-selector/box-selector-item/box-selector-item.controller.js","webpack:///./app/portainer/components/copy-button/copy-button.controller.js","webpack:///./app/portainer/components/custom-template-common-fields/customTemplateCommonFieldsController.js","webpack:///./app/portainer/components/custom-template-selector/custom-template-selector.controller.js","webpack:///./app/portainer/components/datatables/access-tokens-datatable/access-tokens-datatable.controller.js","webpack:///./app/portainer/components/datatables/datatable-columns-visibility/datatable-columns-visibility.controller.js","webpack:///./app/portainer/components/datatables/filter/datatable-filter.controller.js","webpack:///./app/portainer/components/datatables/filter/index.js","webpack:///./app/portainer/components/datatables/titlebar/index.js","webpack:///./app/portainer/components/datatables/searchbar/index.js","webpack:///./app/portainer/components/datatables/sort-icon/index.js","webpack:///./app/portainer/components/datatables/sort-icon/datatable-sort-icon.controller.js","webpack:///./app/portainer/components/datatables/pagination/index.js","webpack:///./app/portainer/components/datatables/users-datatable/usersDatatableController.js","webpack:///./app/portainer/components/endpoint-list/endpoint-item/endpoint-item-controller.js","webpack:///./app/portainer/components/environment-variables-panel/environment-variables-panel.controller.js","webpack:///./app/portainer/components/environment-variables-panel/environment-variables-simple-mode/environment-variables-simple-mode-item/environment-variables-simple-mode-item.controller.js","webpack:///./app/portainer/components/environment-variables-panel/environment-variables-simple-mode/environment-variables-simple-mode.controller.js","webpack:///./app/portainer/components/forms/group-form/groupFormController.js","webpack:///./app/portainer/components/forms/kubernetes-app-git-form/kubernetes-app-git-form.controller.js","webpack:///./app/portainer/components/forms/kubernetes-redeploy-app-git-form/kubernetes-redeploy-app-git-form.controller.js","webpack:///./app/portainer/components/forms/por-switch/por-switch.controller.js","webpack:///./app/portainer/components/forms/stack-redeploy-git-form/stack-redeploy-git-form.controller.js","webpack:///./app/portainer/components/theme/theme-settings.controller.js","webpack:///./app/portainer/helpers/genericHelper.js","webpack:///./app/portainer/models/gitlabRegistry.js","webpack:///./app/portainer/models/motd.js","webpack:///./app/portainer/models/registryRepository.js","webpack:///./app/portainer/models/template.js","webpack:///./app/portainer/models/webhook.js","webpack:///./app/portainer/oauth/components/oauth-providers-selector/oauth-provider-selector.controller.js","webpack:///./app/portainer/oauth/components/oauth-settings/oauth-settings.controller.js","webpack:///./app/portainer/rest/transform/getEndpointsTotalCount.js","webpack:///./app/portainer/views/account/create-user-access-token/create-user-access-token.controller.js","webpack:///./app/portainer/views/custom-templates/create-custom-template-view/createCustomTemplateViewController.js","webpack:///./app/portainer/views/custom-templates/custom-templates-view/customTemplatesViewController.js","webpack:///./app/portainer/views/custom-templates/edit-custom-template-view/editCustomTemplateViewController.js","webpack:///./app/portainer/views/registries/create/createRegistryController.js","webpack:///./app/portainer/views/wizard/wizard-view.controller.js","webpack:///./app/portainer/views/wizard/wizard-endpoints/wizard-endpoints.controller.js","webpack:///./app/portainer/views/wizard/wizard-endpoints/wizard-endpoint-aci/wizard-aci.controller.js","webpack:///./app/portainer/views/wizard/wizard-endpoints/wizard-endpoint-docker/wizard-docker.controller.js","webpack:///./app/portainer/views/wizard/wizard-endpoints/wizard-endpoint-kubernetes/wizard-kubernetes.controller.js","webpack:///./app/react-tools/RootProvider.tsx","webpack:///./app/react-tools/react2angular.tsx","webpack:///./app/portainer/components/widget/Loading.tsx","webpack:///./app/portainer/components/widget/Widget.tsx","webpack:///./app/portainer/components/widget/WidgetBody.tsx","webpack:///./app/portainer/components/widget/index.ts","webpack:///./app/portainer/components/widget/WidgetCustomHeader.tsx","webpack:///./app/portainer/components/widget/WidgetFooter.tsx","webpack:///./app/portainer/components/widget/WidgetTitle.tsx","webpack:///./app/portainer/components/widget/WidgetTaskbar.tsx","webpack:///./app/portainer/components/Tip/Tooltip/Tooltip.module.css?fc20","webpack:///./app/portainer/components/Tip/Tooltip/Tooltip.tsx","webpack:///./app/portainer/components/Tip/Tooltip/TooltipAngular.ts","webpack:///./app/portainer/components/form-components/FormControl/FormControl.module.css?bf28","webpack:///./app/portainer/components/form-components/FormControl/FormControl.tsx","webpack:///./app/portainer/components/form-components/Input/BaseInput.tsx","webpack:///./app/portainer/components/form-components/Input/TextInput.tsx","webpack:///./app/portainer/components/Button/Button.tsx","webpack:///./app/portainer/components/form-components/FormSectionTitle/FormSectionTitle.tsx","webpack:///./app/portainer/components/Tip/TextTip/TextTip.module.css?76a9","webpack:///./app/portainer/components/Tip/TextTip/TextTip.tsx","webpack:///./app/portainer/components/Code/Code.module.css?da79","webpack:///./app/portainer/components/Code/Code.tsx","webpack:///./app/portainer/components/Button/CopyButton/CopyButton.module.css?6811","webpack:///./app/portainer/components/Button/CopyButton/CopyButton.tsx","webpack:///./app/portainer/views/account/CreateAccessToken/CreateAccessToken.module.css?940d","webpack:///./app/portainer/views/account/CreateAccessToken/index.ts","webpack:///./app/portainer/views/account/CreateAccessToken/CreateAccessToken.tsx","webpack:///./app/portainer/components/Link.tsx","webpack:///./app/portainer/components/ReactExample.module.css?4433","webpack:///./app/portainer/components/ReactExample.tsx","webpack:///./app/portainer/components/index.js","webpack:///./app/portainer/rbac/components/roles-datatable/index.js","webpack:///./app/portainer/components/sidebar/index.js","webpack:///./app/portainer/components/sidebar/sidebar-menu/index.js","webpack:///./app/portainer/components/sidebar/sidebar-menu-item/index.js","webpack:///./app/portainer/components/forms/git-form/git-form-auth-fieldset/index.js","webpack:///./app/portainer/settings/authentication/ldap/ldap-settings-custom/index.js","webpack:///./app/portainer/settings/authentication/ldap/ldap-custom-admin-group/index.js","webpack:///./app/portainer/settings/authentication/ldap/ldap-settings-test-login/index.js","webpack:///./app/portainer/feature-flags/index.js","webpack:///./app/portainer/user-activity/activity-logs-view/activity-logs-datatable/index.js","webpack:///./app/__module.js","webpack:///./app/matomo-setup.js","webpack:///./app/agent/index.js","webpack:///./app/azure/_module.js","webpack:///./app/docker/__module.js","webpack:///./app/edge/__module.js","webpack:///./app/portainer/__module.js","webpack:///./app/portainer/rbac/index.js","webpack:///./app/azure/views/containerinstances/containerinstances.html","webpack:///./app/azure/views/containerinstances/create/createcontainerinstance.html","webpack:///./app/azure/views/dashboard/dashboard.html","webpack:///./app/docker/views/configs/configs.html","webpack:///./app/docker/views/configs/edit/config.html","webpack:///./app/docker/views/configs/create/createconfig.html","webpack:///./app/docker/views/containers/containers.html","webpack:///./app/docker/views/containers/edit/container.html","webpack:///./app/docker/views/containers/console/attach.html","webpack:///./app/docker/views/containers/console/exec.html","webpack:///./app/docker/views/containers/create/createcontainer.html","webpack:///./app/docker/views/containers/inspect/containerinspect.html","webpack:///./app/docker/views/containers/logs/containerlogs.html","webpack:///./app/docker/views/containers/stats/containerstats.html","webpack:///./app/docker/views/dashboard/dashboard.html","webpack:///./app/docker/views/events/events.html","webpack:///./app/docker/views/images/images.html","webpack:///./app/docker/views/images/edit/image.html","webpack:///./app/docker/views/images/build/buildimage.html","webpack:///./app/docker/views/images/import/importimage.html","webpack:///./app/docker/views/networks/networks.html","webpack:///./app/docker/views/networks/edit/network.html","webpack:///./app/docker/views/networks/create/createnetwork.html","webpack:///./app/docker/views/secrets/secrets.html","webpack:///./app/docker/views/secrets/edit/secret.html","webpack:///./app/docker/views/secrets/create/createsecret.html","webpack:///./app/docker/views/services/services.html","webpack:///./app/docker/views/services/edit/service.html","webpack:///./app/docker/views/services/create/createservice.html","webpack:///./app/docker/views/services/logs/servicelogs.html","webpack:///./app/portainer/views/stacks/stacks.html","webpack:///./app/portainer/views/stacks/edit/stack.html","webpack:///./app/portainer/views/stacks/create/createstack.html","webpack:///./app/docker/views/swarm/swarm.html","webpack:///./app/docker/views/swarm/visualizer/swarmvisualizer.html","webpack:///./app/docker/views/tasks/edit/task.html","webpack:///./app/docker/views/tasks/logs/tasklogs.html","webpack:///./app/portainer/views/templates/templates.html","webpack:///./app/docker/views/volumes/volumes.html","webpack:///./app/docker/views/volumes/edit/volume.html","webpack:///./app/docker/views/volumes/browse/browsevolume.html","webpack:///./app/docker/views/volumes/create/createvolume.html","webpack:///./app/edge/views/edge-stacks/createEdgeStackView/create-edge-stack-view.html","webpack:///./app/edge/views/edge-stacks/createEdgeStackView/docker-compose-form/docker-compose-form.html","webpack:///./app/edge/views/edge-stacks/createEdgeStackView/kube-manifest-form/kube-manifest-form.html","webpack:///./app/edge/views/edge-stacks/createEdgeStackView/kube-deploy-description/kube-deploy-description.html","webpack:///./app/portainer/views/sidebar/sidebar.html","webpack:///./app/assets/images/logo.png","webpack:///./app/assets/images/logo_small.png","webpack:///./app/portainer/views/account/account.html","webpack:///./app/portainer/views/auth/auth.html","webpack:///./app/portainer/views/logout/logout.html","webpack:///./app/portainer/views/endpoints/endpoints.html","webpack:///./app/portainer/views/endpoints/edit/endpoint.html","webpack:///./app/kubernetes/views/configure/configure.html","webpack:///./app/portainer/views/endpoints/create/createendpoint.html","webpack:///./app/portainer/views/endpoints/access/endpointAccess.html","webpack:///./app/portainer/views/groups/groups.html","webpack:///./app/portainer/views/groups/edit/group.html","webpack:///./app/portainer/views/groups/create/creategroup.html","webpack:///./app/portainer/views/groups/access/groupAccess.html","webpack:///./app/portainer/views/home/home.html","webpack:///./app/portainer/views/init/endpoint/initEndpoint.html","webpack:///./app/portainer/views/init/admin/initAdmin.html","webpack:///./app/portainer/views/registries/registries.html","webpack:///./app/portainer/views/registries/edit/registry.html","webpack:///./app/portainer/views/settings/settings.html","webpack:///./app/portainer/views/settings/authentication/settingsAuthentication.html","webpack:///./app/portainer/views/tags/tags.html","webpack:///./app/portainer/views/users/users.html","webpack:///./app/portainer/views/users/edit/user.html","webpack:///./app/portainer/views/teams/teams.html","webpack:///./app/portainer/views/teams/edit/team.html","webpack:///./app/portainer/rbac/views/roles/roles.html","webpack:///./app/portainer/rbac/components/access-viewer/access-viewer.html","webpack:///./app/portainer/rbac/components/access-viewer/access-viewer-datatable/access-viewer-datatable.html","webpack:///./app/portainer/rbac/components/roles-datatable/roles-datatable.html","webpack:///./app/portainer/components/sidebar/sidebar-menu/sidebar-menu.html","webpack:///./app/portainer/components/sidebar/sidebar-section/sidebar-section.html","webpack:///./app/portainer/components/sidebar/sidebar-menu-item/sidebar-menu-item.html","webpack:///./app/portainer/components/forms/git-form/git-form.html","webpack:///./app/portainer/components/forms/git-form/git-form-auth-fieldset/git-form-auth-fieldset.html","webpack:///./app/portainer/components/forms/git-form/git-form-additional-files-panel/git-form-additional-files-panel.html","webpack:///./app/portainer/components/forms/git-form/git-form-additional-files-panel/git-form-additional-file-item/git-form-additional-file-item.html","webpack:///./app/portainer/components/forms/git-form/git-form-auto-update-fieldset/git-form-auto-update-fieldset.html","webpack:///./app/portainer/components/forms/git-form/git-form-compose-path-field/git-form-compose-path-field.html","webpack:///./app/portainer/components/forms/git-form/git-form-ref-field/git-form-ref-field.html","webpack:///./app/portainer/components/forms/git-form/git-form-url-field/git-form-url-field.html","webpack:///./app/portainer/components/forms/git-form/git-form-info-panel/git-form-info-panel.html","webpack:///./app/portainer/components/accessManagement/porAccessManagement.html","webpack:///./app/portainer/components/accessManagement/por-access-management-users-selector/por-access-management-users-selector.html","webpack:///./app/portainer/components/form-components/web-editor-form/web-editor-form.html","webpack:///./app/portainer/components/form-components/file-upload-form/file-upload-form.html","webpack:///./app/portainer/settings/authentication/ldap/ad-settings/ad-settings.html","webpack:///./app/portainer/settings/authentication/ldap/ldap-settings/ldap-settings.html","webpack:///./app/portainer/settings/authentication/ldap/ldap-settings-custom/ldap-settings-custom.html","webpack:///./app/portainer/settings/authentication/ldap/ldap-settings-openldap/ldap-settings-openldap.html","webpack:///./app/portainer/settings/authentication/ldap/ldap-connectivity-check/ldap-connectivity-check.html","webpack:///./app/portainer/settings/authentication/ldap/ldap-groups-datatable/ldap-groups-datatable.html","webpack:///./app/portainer/settings/authentication/ldap/ldap-group-search/ldap-group-search.html","webpack:///./app/portainer/settings/authentication/ldap/ldap-group-search-item/ldap-group-search-item.html","webpack:///./app/portainer/settings/authentication/ldap/ldap-user-search/ldap-user-search.html","webpack:///./app/portainer/settings/authentication/ldap/ldap-user-search-item/ldap-user-search-item.html","webpack:///./app/portainer/settings/authentication/ldap/ldap-settings-dn-builder/ldap-settings-dn-builder.html","webpack:///./app/portainer/settings/authentication/ldap/ldap-settings-group-dn-builder/ldap-settings-group-dn-builder.html","webpack:///./app/portainer/settings/authentication/ldap/ldap-custom-group-search/ldap-custom-group-search.html","webpack:///./app/portainer/settings/authentication/ldap/ldap-custom-admin-group/ldap-custom-admin-group.html","webpack:///./app/portainer/settings/authentication/ldap/ldap-settings-security/ldap-settings-security.html","webpack:///./app/portainer/settings/authentication/ldap/ldap-settings-test-login/ldap-settings-test-login.html","webpack:///./app/portainer/settings/authentication/ldap/ldap-custom-user-search/ldap-custom-user-search.html","webpack:///./app/portainer/settings/authentication/ldap/ldap-users-datatable/ldap-users-datatable.html","webpack:///./app/portainer/settings/authentication/auto-user-provision-toggle/auto-user-provision-toggle.html","webpack:///./app/portainer/settings/authentication/save-auth-settings-button/save-auth-settings-button.html","webpack:///./app/portainer/settings/authentication/internal-auth/internal-auth.html","webpack:///./app/portainer/settings/general/ssl-certificate/ssl-certificate.html","webpack:///./app/portainer/user-activity/auth-logs-view/auth-logs-view.html","webpack:///./app/portainer/user-activity/auth-logs-view/auth-logs-datatable/auth-logs-datatable.html","webpack:///./app/portainer/user-activity/activity-logs-view/activity-logs-view.html","webpack:///./app/portainer/user-activity/activity-logs-view/activity-logs-datatable/activity-logs-datatable.html","webpack:///./app sync ^(.*\\.(js$))[^.]*$/i","webpack:///./app/__mocks__/fileMock.js","webpack:///./app/__mocks__/styleMock.js","webpack:///./app/agent/components/file-uploader/index.js","webpack:///./app/agent/components/file-uploader/fileUploader.html","webpack:///./app/agent/components/files-datatable/index.js","webpack:///./app/agent/components/files-datatable/filesDatatable.html","webpack:///./app/agent/components/host-browser/index.js","webpack:///./app/agent/components/host-browser/hostBrowser.html","webpack:///./app/agent/components/node-selector/index.js","webpack:///./app/agent/components/node-selector/nodeSelector.html","webpack:///./app/agent/components/volume-browser/index.js","webpack:///./app/agent/components/volume-browser/volumeBrowser.html","webpack:///./app/agent/rest/agent.js","webpack:///./app/agent/rest/browse.js","webpack:///./app/agent/rest/dockerhub.js","webpack:///./app/agent/rest/host.js","webpack:///./app/agent/rest/ping.js","webpack:///./app/agent/rest/v1/agent.js","webpack:///./app/agent/rest/v1/browse.js","webpack:///./app/agent/services/agentService.js","webpack:///./app/agent/services/hostBrowserService.js","webpack:///./app/agent/services/pingService.js","webpack:///./app/agent/services/volumeBrowserService.js","webpack:///./app/app.js","webpack:///./app/azure/components/azure-endpoint-config/azure-endpoint-config.js","webpack:///./app/azure/components/azure-endpoint-config/azureEndpointConfig.html","webpack:///./app/azure/components/azure-sidebar/index.js","webpack:///./app/azure/components/azure-sidebar/azure-sidebar.html","webpack:///./app/azure/components/datatables/containergroups-datatable/containerGroupsDatatable.js","webpack:///./app/azure/components/datatables/containergroups-datatable/containerGroupsDatatable.html","webpack:///./app/azure/rest/azure.js","webpack:///./app/azure/rest/container_group.js","webpack:///./app/azure/rest/location.js","webpack:///./app/azure/rest/provider.js","webpack:///./app/azure/rest/resource_group.js","webpack:///./app/azure/rest/subscription.js","webpack:///./app/azure/services/azureService.js","webpack:///./app/azure/services/containerGroupService.js","webpack:///./app/azure/services/locationService.js","webpack:///./app/azure/services/providerService.js","webpack:///./app/azure/services/resourceGroupService.js","webpack:///./app/azure/services/subscriptionService.js","webpack:///./app/azure/views/containerinstances/container-instance-details/index.js","webpack:///./app/azure/views/containerinstances/container-instance-details/containerInstanceDetails.html","webpack:///./app/azure/views/containerinstances/containerInstancesController.js","webpack:///./app/azure/views/containerinstances/create/createContainerInstanceController.js","webpack:///./app/azure/views/dashboard/dashboardController.js","webpack:///./app/config.js","webpack:///./app/docker/components/container-capabilities/container-capabilities.js","webpack:///./app/docker/components/container-capabilities/containerCapabilities.html","webpack:///./app/docker/components/container-quick-actions/containerQuickActions.js","webpack:///./app/docker/components/container-quick-actions/containerQuickActions.html","webpack:///./app/docker/components/container-restart-policy/container-restart-policy-controller.js","webpack:///./app/docker/components/container-restart-policy/container-restart-policy.js","webpack:///./app/docker/components/container-restart-policy/container-restart-policy.html","webpack:///./app/docker/components/dashboard-cluster-agent-info/dashboard-cluster-agent-info.js","webpack:///./app/docker/components/dashboard-cluster-agent-info/dashboardClusterAgentInfo.html","webpack:///./app/docker/components/dashboard-cluster-agent-info/dashboardClusterAgentInfoController.js","webpack:///./app/docker/components/datatables/configs-datatable/configsDatatable.js","webpack:///./app/docker/components/datatables/configs-datatable/configsDatatable.html","webpack:///./app/docker/components/datatables/container-networks-datatable/containerNetworksDatatable.js","webpack:///./app/docker/components/datatables/container-networks-datatable/containerNetworksDatatable.html","webpack:///./app/docker/components/datatables/container-networks-datatable/containerNetworksDatatableController.js","webpack:///./app/docker/components/datatables/container-processes-datatable/containerProcessesDatatable.js","webpack:///./app/docker/components/datatables/container-processes-datatable/containerProcessesDatatable.html","webpack:///./app/docker/components/datatables/containers-datatable/actions/containersDatatableActions.js","webpack:///./app/docker/components/datatables/containers-datatable/actions/containersDatatableActions.html","webpack:///./app/docker/components/datatables/containers-datatable/actions/containersDatatableActionsController.js","webpack:///./app/docker/components/datatables/containers-datatable/containersDatatable.js","webpack:///./app/docker/components/datatables/containers-datatable/containersDatatable.html","webpack:///./app/docker/components/datatables/containers-datatable/containersDatatableController.js","webpack:///./app/docker/components/datatables/events-datatable/eventsDatatable.js","webpack:///./app/docker/components/datatables/events-datatable/eventsDatatable.html","webpack:///./app/docker/components/datatables/images-datatable/imagesDatatable.js","webpack:///./app/docker/components/datatables/images-datatable/imagesDatatable.html","webpack:///./app/docker/components/datatables/images-datatable/imagesDatatableController.js","webpack:///./app/docker/components/datatables/macvlan-nodes-datatable/macvlanNodesDatatable.js","webpack:///./app/docker/components/datatables/macvlan-nodes-datatable/macvlanNodesDatatable.html","webpack:///./app/docker/components/datatables/networks-datatable/network-row-content/networkRowContent.js","webpack:///./app/docker/components/datatables/networks-datatable/network-row-content/networkRowContent.html","webpack:///./app/docker/components/datatables/networks-datatable/networksDatatable.js","webpack:///./app/docker/components/datatables/networks-datatable/networksDatatable.html","webpack:///./app/docker/components/datatables/networks-datatable/networksDatatableController.js","webpack:///./app/docker/components/datatables/node-tasks-datatable/nodeTasksDatatable.js","webpack:///./app/docker/components/datatables/node-tasks-datatable/nodeTasksDatatable.html","webpack:///./app/docker/components/datatables/nodes-datatable/nodesDatatable.js","webpack:///./app/docker/components/datatables/nodes-datatable/nodesDatatable.html","webpack:///./app/docker/components/datatables/secrets-datatable/secretsDatatable.js","webpack:///./app/docker/components/datatables/secrets-datatable/secretsDatatable.html","webpack:///./app/docker/components/datatables/service-tasks-datatable/serviceTasksDatatable.js","webpack:///./app/docker/components/datatables/service-tasks-datatable/serviceTasksDatatable.html","webpack:///./app/docker/components/datatables/service-tasks-datatable/serviceTasksDatatableController.js","webpack:///./app/docker/components/datatables/services-datatable/actions/servicesDatatableActions.js","webpack:///./app/docker/components/datatables/services-datatable/actions/servicesDatatableActions.html","webpack:///./app/docker/components/datatables/services-datatable/actions/servicesDatatableActionsController.js","webpack:///./app/docker/components/datatables/services-datatable/servicesDatatable.js","webpack:///./app/docker/components/datatables/services-datatable/servicesDatatable.html","webpack:///./app/docker/components/datatables/services-datatable/servicesDatatableController.js","webpack:///./app/docker/components/datatables/tasks-datatable/tasksDatatable.js","webpack:///./app/docker/components/datatables/tasks-datatable/tasksDatatable.html","webpack:///./app/docker/components/datatables/tasks-datatable/tasksDatatableController.js","webpack:///./app/docker/components/datatables/volumes-datatable/volumesDatatable.js","webpack:///./app/docker/components/datatables/volumes-datatable/volumesDatatable.html","webpack:///./app/docker/components/datatables/volumes-datatable/volumesDatatableController.js","webpack:///./app/docker/components/docker-sidebar/docker-sidebar.js","webpack:///./app/docker/components/docker-sidebar/docker-sidebar.html","webpack:///./app/docker/components/host-overview/host-overview.js","webpack:///./app/docker/components/host-overview/host-overview.html","webpack:///./app/docker/components/host-view-panels/devices-panel/devices-panel.js","webpack:///./app/docker/components/host-view-panels/devices-panel/devices-panel.html","webpack:///./app/docker/components/host-view-panels/disks-panel/disks-panel.js","webpack:///./app/docker/components/host-view-panels/disks-panel/disks-panel.html","webpack:///./app/docker/components/host-view-panels/engine-details-panel/engine-details-panel.js","webpack:///./app/docker/components/host-view-panels/engine-details-panel/engine-details-panel.html","webpack:///./app/docker/components/host-view-panels/host-details-panel/host-details-panel.js","webpack:///./app/docker/components/host-view-panels/host-details-panel/host-details-panel.html","webpack:///./app/docker/components/host-view-panels/node-availability-select/node-availability-select-controller.js","webpack:///./app/docker/components/host-view-panels/node-availability-select/node-availability-select.js","webpack:///./app/docker/components/host-view-panels/node-availability-select/node-availability-select.html","webpack:///./app/docker/components/host-view-panels/node-labels-table/node-labels-table-controller.js","webpack:///./app/docker/components/host-view-panels/node-labels-table/node-labels-table.js","webpack:///./app/docker/components/host-view-panels/node-labels-table/node-labels-table.html","webpack:///./app/docker/components/host-view-panels/swarm-node-details-panel/swarm-node-details-panel-controller.js","webpack:///./app/docker/components/host-view-panels/swarm-node-details-panel/swarm-node-details-panel.js","webpack:///./app/docker/components/host-view-panels/swarm-node-details-panel/swarm-node-details-panel.html","webpack:///./app/docker/components/imageRegistry/por-image-registry-rate-limits.js","webpack:///./app/docker/components/imageRegistry/por-image-registry-rate-limits.html","webpack:///./app/docker/components/imageRegistry/por-image-registry.controller.js","webpack:///./app/docker/components/imageRegistry/por-image-registry.js","webpack:///./app/docker/components/imageRegistry/por-image-registry.html","webpack:///./app/docker/components/log-viewer/log-viewer.js","webpack:///./app/docker/components/log-viewer/logViewer.html","webpack:///./app/docker/components/log-viewer/logViewerController.js","webpack:///./app/docker/components/network-macvlan-form/network-macvlan-form.js","webpack:///./app/docker/components/network-macvlan-form/networkMacvlanForm.html","webpack:///./app/docker/components/network-macvlan-form/networkMacvlanFormController.js","webpack:///./app/docker/components/volumesCIFSForm/volumesCifsForm.js","webpack:///./app/docker/components/volumesCIFSForm/volumesCifsForm.html","webpack:///./app/docker/components/volumesNFSForm/volumes-nfs-form.js","webpack:///./app/docker/components/volumesNFSForm/volumesnfsForm.html","webpack:///./app/docker/filters/filters.js","webpack:///./app/docker/helpers/configHelper.js","webpack:///./app/docker/helpers/constraintsHelper.js","webpack:///./app/docker/helpers/containerHelper.js","webpack:///./app/docker/helpers/infoHelper.js","webpack:///./app/docker/helpers/labelHelper.js","webpack:///./app/docker/helpers/logHelper.js","webpack:///./app/docker/helpers/nodeHelper.js","webpack:///./app/docker/helpers/secretHelper.js","webpack:///./app/docker/helpers/serviceHelper.js","webpack:///./app/docker/helpers/taskHelper.js","webpack:///./app/docker/helpers/volumeHelper.js","webpack:///./app/docker/interceptors/containersInterceptor.js","webpack:///./app/docker/interceptors/imagesInterceptor.js","webpack:///./app/docker/interceptors/infoInterceptor.js","webpack:///./app/docker/interceptors/networksInterceptor.js","webpack:///./app/docker/interceptors/versionInterceptor.js","webpack:///./app/docker/interceptors/volumesInterceptor.js","webpack:///./app/docker/rest/build.js","webpack:///./app/docker/rest/commit.js","webpack:///./app/docker/rest/config.js","webpack:///./app/docker/rest/container.js","webpack:///./app/docker/rest/exec.js","webpack:///./app/docker/rest/image.js","webpack:///./app/docker/rest/network.js","webpack:///./app/docker/rest/node.js","webpack:///./app/docker/rest/plugin.js","webpack:///./app/docker/rest/secret.js","webpack:///./app/docker/rest/service.js","webpack:///./app/docker/rest/swarm.js","webpack:///./app/docker/rest/system.js","webpack:///./app/docker/rest/systemEndpoint.js","webpack:///./app/docker/rest/task.js","webpack:///./app/docker/rest/volume.js","webpack:///./app/docker/services/buildService.js","webpack:///./app/docker/services/configService.js","webpack:///./app/docker/services/containerService.js","webpack:///./app/docker/services/execService.js","webpack:///./app/docker/services/imageService.js","webpack:///./app/docker/services/networkService.js","webpack:///./app/docker/services/nodeService.js","webpack:///./app/docker/services/pluginService.js","webpack:///./app/docker/services/secretService.js","webpack:///./app/docker/services/serviceService.js","webpack:///./app/docker/services/swarmService.js","webpack:///./app/docker/services/systemService.js","webpack:///./app/docker/services/taskService.js","webpack:///./app/docker/services/volumeService.js","webpack:///./app/docker/views/configs/configsController.js","webpack:///./app/docker/views/configs/create/createConfigController.js","webpack:///./app/docker/views/configs/edit/configController.js","webpack:///./app/docker/views/containers/console/containerConsoleController.js","webpack:///./app/docker/views/containers/containersController.js","webpack:///./app/docker/views/containers/edit/containerController.js","webpack:///./app/docker/views/containers/inspect/containerInspectController.js","webpack:///./app/docker/views/containers/logs/containerLogsController.js","webpack:///./app/docker/views/containers/stats/containerStatsController.js","webpack:///./app/docker/views/dashboard/dashboardController.js","webpack:///./app/docker/views/docker-features-configuration/index.js","webpack:///./app/docker/views/docker-features-configuration/docker-features-configuration.html","webpack:///./app/docker/views/events/eventsController.js","webpack:///./app/docker/views/host/host-browser-view/host-browser-view-controller.js","webpack:///./app/docker/views/host/host-browser-view/host-browser-view.js","webpack:///./app/docker/views/host/host-browser-view/host-browser-view.html","webpack:///./app/docker/views/host/host-view-controller.js","webpack:///./app/docker/views/host/host-view.js","webpack:///./app/docker/views/host/host-view.html","webpack:///./app/docker/views/images/build/buildImageController.js","webpack:///./app/docker/views/images/edit/imageController.js","webpack:///./app/docker/views/images/imagesController.js","webpack:///./app/docker/views/images/import/importImageController.js","webpack:///./app/docker/views/networks/create/createNetworkController.js","webpack:///./app/docker/views/networks/edit/networkController.js","webpack:///./app/docker/views/networks/networksController.js","webpack:///./app/docker/views/nodes/node-browser/node-browser-controller.js","webpack:///./app/docker/views/nodes/node-browser/node-browser.js","webpack:///./app/docker/views/nodes/node-browser/node-browser.html","webpack:///./app/docker/views/nodes/node-details/node-details-view-controller.js","webpack:///./app/docker/views/nodes/node-details/node-details-view.js","webpack:///./app/docker/views/nodes/node-details/node-details-view.html","webpack:///./app/docker/views/registries/access/registryAccess.js","webpack:///./app/docker/views/registries/access/registryAccess.html","webpack:///./app/docker/views/registries/access/registryAccessController.js","webpack:///./app/docker/views/secrets/create/createSecretController.js","webpack:///./app/docker/views/secrets/edit/secretController.js","webpack:///./app/docker/views/secrets/secretsController.js","webpack:///./app/docker/views/services/create/createServiceController.js","webpack:///./app/docker/views/services/create/includes/update-restart.html","webpack:///./app/docker/views/services/create/includes/secret.html","webpack:///./app/docker/views/services/create/includes/config.html","webpack:///./app/docker/views/services/create/includes/resources-placement.html","webpack:///./app/docker/views/services/edit/serviceController.js","webpack:///./app/docker/views/services/edit/includes/configs.html","webpack:///./app/docker/views/services/edit/includes/constraints.html","webpack:///./app/docker/views/services/edit/includes/container-specs.html","webpack:///./app/docker/views/services/edit/includes/containerlabels.html","webpack:///./app/docker/views/services/edit/includes/environmentvariables.html","webpack:///./app/docker/views/services/edit/includes/hosts.html","webpack:///./app/docker/views/services/edit/includes/image.html","webpack:///./app/docker/views/services/edit/includes/logging.html","webpack:///./app/docker/views/services/edit/includes/mounts.html","webpack:///./app/docker/views/services/edit/includes/networks.html","webpack:///./app/docker/views/services/edit/includes/placementPreferences.html","webpack:///./app/docker/views/services/edit/includes/ports.html","webpack:///./app/docker/views/services/edit/includes/resources.html","webpack:///./app/docker/views/services/edit/includes/restart.html","webpack:///./app/docker/views/services/edit/includes/secrets.html","webpack:///./app/docker/views/services/edit/includes/servicelabels.html","webpack:///./app/docker/views/services/edit/includes/tasks.html","webpack:///./app/docker/views/services/edit/includes/updateconfig.html","webpack:///./app/docker/views/services/logs/serviceLogsController.js","webpack:///./app/docker/views/services/servicesController.js","webpack:///./app/docker/views/swarm/swarmController.js","webpack:///./app/docker/views/swarm/visualizer/swarmVisualizerController.js","webpack:///./app/docker/views/tasks/edit/taskController.js","webpack:///./app/docker/views/tasks/logs/taskLogsController.js","webpack:///./app/docker/views/volumes/browse/browseVolumeController.js","webpack:///./app/docker/views/volumes/create/createVolumeController.js","webpack:///./app/docker/views/volumes/edit/volumeController.js","webpack:///./app/docker/views/volumes/volumesController.js","webpack:///./app/edge/components/associated-endpoints-datatable/index.js","webpack:///./app/edge/components/associated-endpoints-datatable/associatedEndpointsDatatable.html","webpack:///./app/edge/components/edge-groups-selector/index.js","webpack:///./app/edge/components/edge-groups-selector/edgeGroupsSelector.html","webpack:///./app/edge/components/edge-job-form/index.js","webpack:///./app/edge/components/edge-job-form/edgeJobForm.html","webpack:///./app/edge/components/edge-job-results-datatable/edgeJobResultsDatatable.html","webpack:///./app/edge/components/edge-jobs-datatable/index.js","webpack:///./app/edge/components/edge-jobs-datatable/edgeJobsDatatable.html","webpack:///./app/edge/components/edge-stack-deployment-type-selector/index.js","webpack:///./app/edge/components/edge-stack-deployment-type-selector/edge-stack-deployment-type-selector.html","webpack:///./app/edge/components/edge-stack-endpoints-datatable/index.js","webpack:///./app/edge/components/edge-stack-endpoints-datatable/edgeStackEndpointsDatatable.html","webpack:///./app/edge/components/edge-stack-status/edgeStackStatus.html","webpack:///./app/edge/components/edge-stacks-datatable/index.js","webpack:///./app/edge/components/edge-stacks-datatable/edgeStacksDatatable.html","webpack:///./app/edge/components/edit-edge-stack-form/index.js","webpack:///./app/edge/components/edit-edge-stack-form/editEdgeStackForm.html","webpack:///./app/edge/components/group-form/index.js","webpack:///./app/edge/components/group-form/groupForm.html","webpack:///./app/edge/components/groups-datatable/index.js","webpack:///./app/edge/components/groups-datatable/groupsDatatable.html","webpack:///./app/edge/rest/edge-groups.js","webpack:///./app/edge/rest/edge-job-results.js","webpack:///./app/edge/rest/edge-jobs.js","webpack:///./app/edge/rest/edge-stacks.js","webpack:///./app/edge/rest/edge-templates.js","webpack:///./app/edge/services/edge-group.js","webpack:///./app/edge/services/edge-job.js","webpack:///./app/edge/services/edge-stack.js","webpack:///./app/edge/services/edge-template.js","webpack:///./app/edge/views/edge-groups/createEdgeGroupView/index.js","webpack:///./app/edge/views/edge-groups/createEdgeGroupView/createEdgeGroupView.html","webpack:///./app/edge/views/edge-groups/edgeGroupsView/index.js","webpack:///./app/edge/views/edge-groups/edgeGroupsView/edgeGroupsView.html","webpack:///./app/edge/views/edge-groups/editEdgeGroupView/index.js","webpack:///./app/edge/views/edge-groups/editEdgeGroupView/editEdgeGroupView.html","webpack:///./app/edge/views/edge-jobs/createEdgeJobView/index.js","webpack:///./app/edge/views/edge-jobs/createEdgeJobView/createEdgeJobView.html","webpack:///./app/edge/views/edge-jobs/edgeJob/index.js","webpack:///./app/edge/views/edge-jobs/edgeJob/edgeJob.html","webpack:///./app/edge/views/edge-jobs/edgeJobsView/index.js","webpack:///./app/edge/views/edge-jobs/edgeJobsView/edgeJobsView.html","webpack:///./app/edge/views/edge-stacks/edgeStacksView/index.js","webpack:///./app/edge/views/edge-stacks/edgeStacksView/edgeStacksView.html","webpack:///./app/edge/views/edge-stacks/editEdgeStackView/index.js","webpack:///./app/edge/views/edge-stacks/editEdgeStackView/editEdgeStackView.html","webpack:///./app/integrations/_module.js","webpack:///./app/integrations/storidge/_module.js","webpack:///./app/integrations/storidge/views/profiles/profiles.html","webpack:///./app/integrations/storidge/views/profiles/edit/profile.html","webpack:///./app/integrations/storidge/views/drives/drives.html","webpack:///./app/integrations/storidge/views/drives/inspect/drive.html","webpack:///./app/integrations/storidge/views/snapshots/inspect/snapshot.html","webpack:///./app/integrations/storidge/views/profiles/create/createprofile.html","webpack:///./app/integrations/storidge/views/cluster/cluster.html","webpack:///./app/integrations/storidge/views/nodes/inspect/node.html","webpack:///./app/integrations/storidge/views/monitor/monitor.html","webpack:///./app/integrations/storidge/components/cluster-events-datatable/storidgeClusterEventsDatatable.js","webpack:///./app/integrations/storidge/components/cluster-events-datatable/storidgeClusterEventsDatatable.html","webpack:///./app/integrations/storidge/components/drives-datatable/storidgeDrivesDatatable.js","webpack:///./app/integrations/storidge/components/drives-datatable/storidgeDrivesDatatable.html","webpack:///./app/integrations/storidge/components/drives-datatable/storidgeDrivesDatatableController.js","webpack:///./app/integrations/storidge/components/nodes-datatable/storidgeNodesDatatable.js","webpack:///./app/integrations/storidge/components/nodes-datatable/storidgeNodesDatatable.html","webpack:///./app/integrations/storidge/components/nodes-datatable/storidgeNodesDatatableController.js","webpack:///./app/integrations/storidge/components/profileSelector/storidgeProfileSelector.js","webpack:///./app/integrations/storidge/components/profileSelector/storidgeProfileSelector.html","webpack:///./app/integrations/storidge/components/profileSelector/storidgeProfileSelectorController.js","webpack:///./app/integrations/storidge/components/profiles-datatable/storidgeProfilesDatatable.js","webpack:///./app/integrations/storidge/components/profiles-datatable/storidgeProfilesDatatable.html","webpack:///./app/integrations/storidge/components/snapshot-creation/storidgeSnapshotCreation.js","webpack:///./app/integrations/storidge/components/snapshot-creation/storidgeSnapshotCreation.html","webpack:///./app/integrations/storidge/components/snapshot-creation/storidgeSnapshotCreationController.js","webpack:///./app/integrations/storidge/components/snapshots-datatable/storidgeSnapshotsDatatable.js","webpack:///./app/integrations/storidge/components/snapshots-datatable/storidgeSnapshotsDatatable.html","webpack:///./app/integrations/storidge/components/volume-storidge-info/volumeStoridgeInfo.js","webpack:///./app/integrations/storidge/components/volume-storidge-info/volumeStoridgeInfo.html","webpack:///./app/integrations/storidge/components/volume-storidge-info/volumeStoridgeInfoController.js","webpack:///./app/integrations/storidge/filters/filters.js","webpack:///./app/integrations/storidge/rest/storidge.js","webpack:///./app/integrations/storidge/services/chartService.js","webpack:///./app/integrations/storidge/services/clusterService.js","webpack:///./app/integrations/storidge/services/driveService.js","webpack:///./app/integrations/storidge/services/nodeService.js","webpack:///./app/integrations/storidge/services/profileService.js","webpack:///./app/integrations/storidge/services/snapshotService.js","webpack:///./app/integrations/storidge/services/volumeService.js","webpack:///./app/integrations/storidge/views/cluster/clusterController.js","webpack:///./app/integrations/storidge/views/drives/drivesController.js","webpack:///./app/integrations/storidge/views/drives/inspect/driveController.js","webpack:///./app/integrations/storidge/views/monitor/monitorController.js","webpack:///./app/integrations/storidge/views/nodes/inspect/nodeController.js","webpack:///./app/integrations/storidge/views/profiles/create/createProfileController.js","webpack:///./app/integrations/storidge/views/profiles/edit/profileController.js","webpack:///./app/integrations/storidge/views/profiles/profilesController.js","webpack:///./app/integrations/storidge/views/snapshots/inspect/snapshotController.js","webpack:///./app/kubernetes/__module.js","webpack:///./app/kubernetes/registries/kube-registry-access-view/kube-registry-access-view.html","webpack:///./app/kubernetes/custom-templates/kube-custom-templates-view/kube-custom-templates-view.html","webpack:///./app/kubernetes/custom-templates/kube-edit-custom-template-view/kube-edit-custom-template-view.html","webpack:///./app/kubernetes/custom-templates/kube-create-custom-template-view/kube-create-custom-template-view.html","webpack:///./app/portainer/components/box-selector/box-selector.html","webpack:///./app/kubernetes/components/datatables/application/containers-datatable/containersDatatable.js","webpack:///./app/kubernetes/components/datatables/application/containers-datatable/containersDatatable.html","webpack:///./app/kubernetes/components/datatables/applications-datatable-details/applications-datatable-details.js","webpack:///./app/kubernetes/components/datatables/applications-datatable-details/applications-datatable-details.html","webpack:///./app/kubernetes/components/datatables/applications-datatable-url/applications-datatable-url.html","webpack:///./app/kubernetes/components/datatables/applications-datatable/applicationsDatatable.html","webpack:///./app/kubernetes/components/datatables/applications-datatable/applicationsDatatableController.js","webpack:///./app/kubernetes/components/datatables/applications-ports-datatable/applicationsPortsDatatable.js","webpack:///./app/kubernetes/components/datatables/applications-ports-datatable/applicationsPortsDatatable.html","webpack:///./app/kubernetes/components/datatables/applications-ports-datatable/applicationsPortsDatatableController.js","webpack:///./app/kubernetes/components/datatables/applications-stacks-datatable/applicationsStacksDatatable.js","webpack:///./app/kubernetes/components/datatables/applications-stacks-datatable/applicationsStacksDatatable.html","webpack:///./app/kubernetes/components/datatables/applications-stacks-datatable/applicationsStacksDatatableController.js","webpack:///./app/kubernetes/components/datatables/configurations-datatable/configurationsDatatable.js","webpack:///./app/kubernetes/components/datatables/configurations-datatable/configurationsDatatable.html","webpack:///./app/kubernetes/components/datatables/configurations-datatable/configurationsDatatableController.js","webpack:///./app/kubernetes/components/datatables/events-datatable/eventsDatatable.js","webpack:///./app/kubernetes/components/datatables/events-datatable/eventsDatatable.html","webpack:///./app/kubernetes/components/datatables/integrated-applications-datatable/integratedApplicationsDatatable.js","webpack:///./app/kubernetes/components/datatables/integrated-applications-datatable/integratedApplicationsDatatable.html","webpack:///./app/kubernetes/components/datatables/node-applications-datatable/nodeApplicationsDatatable.js","webpack:///./app/kubernetes/components/datatables/node-applications-datatable/nodeApplicationsDatatable.html","webpack:///./app/kubernetes/components/datatables/node-applications-datatable/nodeApplicationsDatatableController.js","webpack:///./app/kubernetes/components/datatables/nodes-datatable/nodesDatatable.js","webpack:///./app/kubernetes/components/datatables/nodes-datatable/nodesDatatable.html","webpack:///./app/kubernetes/components/datatables/resource-pool-applications-datatable/resourcePoolApplicationsDatatable.js","webpack:///./app/kubernetes/components/datatables/resource-pool-applications-datatable/resourcePoolApplicationsDatatable.html","webpack:///./app/kubernetes/components/datatables/resource-pool-applications-datatable/resourcePoolApplicationsDatatableController.js","webpack:///./app/kubernetes/components/datatables/resource-pools-datatable/resourcePoolsDatatable.js","webpack:///./app/kubernetes/components/datatables/resource-pools-datatable/resourcePoolsDatatable.html","webpack:///./app/kubernetes/components/datatables/resource-pools-datatable/resourcePoolsDatatableController.js","webpack:///./app/kubernetes/components/datatables/volumes-datatable/volumesDatatable.js","webpack:///./app/kubernetes/components/datatables/volumes-datatable/volumesDatatable.html","webpack:///./app/kubernetes/components/datatables/volumes-datatable/volumesDatatableController.js","webpack:///./app/kubernetes/components/helm/helm-templates/helm-add-repository/helm-add-repository.js","webpack:///./app/kubernetes/components/helm/helm-templates/helm-add-repository/helm-add-repository.html","webpack:///./app/kubernetes/components/helm/helm-templates/helm-templates-list/helm-templates-list-item/helm-templates-list-item.html","webpack:///./app/kubernetes/components/helm/helm-templates/helm-templates-list/helm-templates-list.js","webpack:///./app/kubernetes/components/helm/helm-templates/helm-templates-list/helm-templates-list.html","webpack:///./app/kubernetes/components/helm/helm-templates/helm-templates.js","webpack:///./app/kubernetes/components/helm/helm-templates/helm-templates.html","webpack:///./app/kubernetes/components/kubectl-shell/kubectl-shell.html","webpack:///./app/kubernetes/components/kubernetes-configuration-data/kubernetesConfigurationData.js","webpack:///./app/kubernetes/components/kubernetes-configuration-data/kubernetesConfigurationData.html","webpack:///./app/kubernetes/components/kubernetes-configuration-data/kubernetesConfigurationDataController.js","webpack:///./app/kubernetes/components/kubernetes-sidebar/index.js","webpack:///./app/kubernetes/components/kubernetes-sidebar/kubernetes-sidebar.html","webpack:///./app/kubernetes/components/resource-reservation/resourceReservation.js","webpack:///./app/kubernetes/components/resource-reservation/resourceReservation.html","webpack:///./app/kubernetes/components/resource-reservation/resourceReservationController.js","webpack:///./app/kubernetes/components/view-header/viewHeader.js","webpack:///./app/kubernetes/components/view-header/viewHeader.html","webpack:///./app/kubernetes/components/view-loading/viewLoading.js","webpack:///./app/kubernetes/components/view-loading/viewLoading.html","webpack:///./app/kubernetes/components/yaml-inspector/yamlInspector.js","webpack:///./app/kubernetes/components/yaml-inspector/yamlInspector.html","webpack:///./app/kubernetes/components/yaml-inspector/yamlInspectorController.js","webpack:///./app/kubernetes/endpoint/rest.js","webpack:///./app/kubernetes/endpoint/service.js","webpack:///./app/kubernetes/filters/applicationFilters.js","webpack:///./app/kubernetes/filters/configurationFilters.js","webpack:///./app/kubernetes/filters/eventFilters.js","webpack:///./app/kubernetes/filters/filters.js","webpack:///./app/kubernetes/helm/rest.js","webpack:///./app/kubernetes/helm/service.js","webpack:///./app/kubernetes/helpers/stackHelper.test.js","webpack:///./app/kubernetes/horizontal-pod-auto-scaler/rest.js","webpack:///./app/kubernetes/horizontal-pod-auto-scaler/service.js","webpack:///./app/kubernetes/ingress/rest.js","webpack:///./app/kubernetes/ingress/service.js","webpack:///./app/kubernetes/metrics/metrics.js","webpack:///./app/kubernetes/metrics/rest.js","webpack:///./app/kubernetes/node/filters.js","webpack:///./app/kubernetes/node/rest.js","webpack:///./app/kubernetes/node/service.js","webpack:///./app/kubernetes/pod/filters.js","webpack:///./app/kubernetes/pod/service.js","webpack:///./app/kubernetes/rest/configMap.js","webpack:///./app/kubernetes/rest/controllerRevision.js","webpack:///./app/kubernetes/rest/daemonSet.js","webpack:///./app/kubernetes/rest/deployment.js","webpack:///./app/kubernetes/rest/endpoint.js","webpack:///./app/kubernetes/rest/event.js","webpack:///./app/kubernetes/rest/health.js","webpack:///./app/kubernetes/rest/kubeconfig.js","webpack:///./app/kubernetes/rest/namespace.js","webpack:///./app/kubernetes/rest/nodesLimits.js","webpack:///./app/kubernetes/rest/persistentVolumeClaim.js","webpack:///./app/kubernetes/rest/pod.js","webpack:///./app/kubernetes/rest/portainer-namespace.js","webpack:///./app/kubernetes/rest/replicaSet.js","webpack:///./app/kubernetes/rest/resourceQuota.js","webpack:///./app/kubernetes/rest/secret.js","webpack:///./app/kubernetes/rest/service.js","webpack:///./app/kubernetes/rest/statefulSet.js","webpack:///./app/kubernetes/rest/storage.js","webpack:///./app/kubernetes/services/applicationService.js","webpack:///./app/kubernetes/services/configMapService.js","webpack:///./app/kubernetes/services/configurationService.js","webpack:///./app/kubernetes/services/controllerRevisionService.js","webpack:///./app/kubernetes/services/daemonSetService.js","webpack:///./app/kubernetes/services/deploymentService.js","webpack:///./app/kubernetes/services/eventService.js","webpack:///./app/kubernetes/services/healthService.js","webpack:///./app/kubernetes/services/historyService.js","webpack:///./app/kubernetes/services/kubeconfigService.js","webpack:///./app/kubernetes/services/namespaceService.js","webpack:///./app/kubernetes/services/nodesLimitsService.js","webpack:///./app/kubernetes/services/persistentVolumeClaimService.js","webpack:///./app/kubernetes/services/replicaSetService.js","webpack:///./app/kubernetes/services/resourcePoolService.js","webpack:///./app/kubernetes/services/resourceQuotaService.js","webpack:///./app/kubernetes/services/secretService.js","webpack:///./app/kubernetes/services/serviceService.js","webpack:///./app/kubernetes/services/stackService.js","webpack:///./app/kubernetes/services/statefulSetService.js","webpack:///./app/kubernetes/services/storageService.js","webpack:///./app/kubernetes/services/volumeService.js","webpack:///./app/kubernetes/views/applications/applications.js","webpack:///./app/kubernetes/views/applications/applications.html","webpack:///./app/kubernetes/views/applications/applicationsController.js","webpack:///./app/kubernetes/views/applications/console/console.js","webpack:///./app/kubernetes/views/applications/console/console.html","webpack:///./app/kubernetes/views/applications/console/consoleController.js","webpack:///./app/kubernetes/views/applications/create/createApplication.js","webpack:///./app/kubernetes/views/applications/create/createApplication.html","webpack:///./app/kubernetes/views/applications/create/createApplicationController.js","webpack:///./app/kubernetes/views/applications/edit/application.js","webpack:///./app/kubernetes/views/applications/edit/application.html","webpack:///./app/kubernetes/views/applications/edit/applicationController.js","webpack:///./app/kubernetes/views/applications/edit/components/placements-datatable/controller.js","webpack:///./app/kubernetes/views/applications/edit/components/placements-datatable/index.js","webpack:///./app/kubernetes/views/applications/edit/components/placements-datatable/template.html","webpack:///./app/kubernetes/views/applications/helm/helm.html","webpack:///./app/kubernetes/views/applications/logs/logs.js","webpack:///./app/kubernetes/views/applications/logs/logs.html","webpack:///./app/kubernetes/views/applications/logs/logsController.js","webpack:///./app/kubernetes/views/applications/stats/stats.js","webpack:///./app/kubernetes/views/applications/stats/stats.html","webpack:///./app/kubernetes/views/applications/stats/statsController.js","webpack:///./app/kubernetes/views/cluster/cluster.js","webpack:///./app/kubernetes/views/cluster/cluster.html","webpack:///./app/kubernetes/views/cluster/clusterController.js","webpack:///./app/kubernetes/views/cluster/node/node.js","webpack:///./app/kubernetes/views/cluster/node/node.html","webpack:///./app/kubernetes/views/cluster/node/nodeController.js","webpack:///./app/kubernetes/views/cluster/node/stats/stats.js","webpack:///./app/kubernetes/views/cluster/node/stats/stats.html","webpack:///./app/kubernetes/views/cluster/node/stats/statsController.js","webpack:///./app/kubernetes/views/configurations/configurations.js","webpack:///./app/kubernetes/views/configurations/configurations.html","webpack:///./app/kubernetes/views/configurations/configurationsController.js","webpack:///./app/kubernetes/views/configurations/create/createConfiguration.js","webpack:///./app/kubernetes/views/configurations/create/createConfiguration.html","webpack:///./app/kubernetes/views/configurations/create/createConfigurationController.js","webpack:///./app/kubernetes/views/configurations/edit/configuration.js","webpack:///./app/kubernetes/views/configurations/edit/configuration.html","webpack:///./app/kubernetes/views/configurations/edit/configurationController.js","webpack:///./app/kubernetes/views/configure/configureController.js","webpack:///./app/kubernetes/views/dashboard/dashboard.js","webpack:///./app/kubernetes/views/dashboard/dashboard.html","webpack:///./app/kubernetes/views/dashboard/dashboardController.js","webpack:///./app/kubernetes/views/deploy/deploy.js","webpack:///./app/kubernetes/views/deploy/deploy.html","webpack:///./app/kubernetes/views/deploy/deployController.js","webpack:///./app/kubernetes/views/resource-pools/access/resourcePoolAccess.js","webpack:///./app/kubernetes/views/resource-pools/access/resourcePoolAccess.html","webpack:///./app/kubernetes/views/resource-pools/access/resourcePoolAccessController.js","webpack:///./app/kubernetes/views/resource-pools/create/createResourcePool.js","webpack:///./app/kubernetes/views/resource-pools/create/createResourcePool.html","webpack:///./app/kubernetes/views/resource-pools/edit/components/ingresses-datatable/controller.js","webpack:///./app/kubernetes/views/resource-pools/edit/components/ingresses-datatable/index.js","webpack:///./app/kubernetes/views/resource-pools/edit/components/ingresses-datatable/template.html","webpack:///./app/kubernetes/views/resource-pools/edit/resourcePool.js","webpack:///./app/kubernetes/views/resource-pools/edit/resourcePool.html","webpack:///./app/kubernetes/views/resource-pools/edit/resourcePoolController.js","webpack:///./app/kubernetes/views/resource-pools/resourcePools.js","webpack:///./app/kubernetes/views/resource-pools/resourcePools.html","webpack:///./app/kubernetes/views/resource-pools/resourcePoolsController.js","webpack:///./app/kubernetes/views/stacks/logs/logs.js","webpack:///./app/kubernetes/views/stacks/logs/logs.html","webpack:///./app/kubernetes/views/stacks/logs/logsController.js","webpack:///./app/kubernetes/views/summary/summary.js","webpack:///./app/kubernetes/views/summary/summary.html","webpack:///./app/kubernetes/views/summary/summaryController.js","webpack:///./app/kubernetes/views/volumes/components/volumes-storages-datatable/controller.js","webpack:///./app/kubernetes/views/volumes/components/volumes-storages-datatable/index.js","webpack:///./app/kubernetes/views/volumes/components/volumes-storages-datatable/template.html","webpack:///./app/kubernetes/views/volumes/edit/volume.js","webpack:///./app/kubernetes/views/volumes/edit/volume.html","webpack:///./app/kubernetes/views/volumes/edit/volumeController.js","webpack:///./app/kubernetes/views/volumes/volumes.js","webpack:///./app/kubernetes/views/volumes/volumes.html","webpack:///./app/kubernetes/views/volumes/volumesController.js","webpack:///./app/portainer/components/access-datatable/accessDatatable.js","webpack:///./app/portainer/components/access-datatable/accessDatatable.html","webpack:///./app/portainer/components/access-datatable/accessDatatableController.js","webpack:///./app/portainer/components/access-table/access-table.js","webpack:///./app/portainer/components/access-table/accessTable.html","webpack:///./app/portainer/components/accessControlForm/por-access-control-form.js","webpack:///./app/portainer/components/accessControlForm/porAccessControlForm.html","webpack:///./app/portainer/components/accessControlForm/porAccessControlFormController.js","webpack:///./app/portainer/components/accessControlPanel/por-access-control-panel.js","webpack:///./app/portainer/components/accessControlPanel/porAccessControlPanel.html","webpack:///./app/portainer/components/accessControlPanel/porAccessControlPanelController.js","webpack:///./app/portainer/components/accessManagement/porAccessManagementController.js","webpack:///./app/portainer/components/associated-endpoints-selector/associatedEndpointsSelector.js","webpack:///./app/portainer/components/associated-endpoints-selector/associatedEndpointsSelector.html","webpack:///./app/portainer/components/autofocus.js","webpack:///./app/portainer/components/be-feature-indicator/be-feature-indicator.html","webpack:///./app/portainer/components/beta-panel/betaPanel.js","webpack:///./app/portainer/components/beta-panel/betaPanel.html","webpack:///./app/portainer/components/box-selector/box-selector-item/box-selector-item.html","webpack:///./app/portainer/components/buttonSpinner.js","webpack:///./app/portainer/components/code-editor/code-editor.js","webpack:///./app/portainer/components/code-editor/codeEditor.html","webpack:///./app/portainer/components/code-editor/codeEditorController.js","webpack:///./app/portainer/components/copy-button/copy-button.html","webpack:///./app/portainer/components/custom-template-common-fields/index.js","webpack:///./app/portainer/components/custom-template-common-fields/customTemplateCommonFields.html","webpack:///./app/portainer/components/custom-template-selector/index.js","webpack:///./app/portainer/components/custom-template-selector/custom-template-selector.html","webpack:///./app/portainer/components/custom-templates-list/customTemplatesListController.js","webpack:///./app/portainer/components/custom-templates-list/index.js","webpack:///./app/portainer/components/custom-templates-list/customTemplatesList.html","webpack:///./app/portainer/components/datatables/access-tokens-datatable/index.js","webpack:///./app/portainer/components/datatables/access-tokens-datatable/access-tokens-datatable.html","webpack:///./app/portainer/components/datatables/datatable-columns-visibility/index.js","webpack:///./app/portainer/components/datatables/datatable-columns-visibility/datatable-columns-visibility.html","webpack:///./app/portainer/components/datatables/endpoints-datatable/endpointsDatatable.js","webpack:///./app/portainer/components/datatables/endpoints-datatable/endpointsDatatable.html","webpack:///./app/portainer/components/datatables/endpoints-datatable/endpointsDatatableController.js","webpack:///./app/portainer/components/datatables/filter/datatable-filter.html","webpack:///./app/portainer/components/datatables/genericDatatableController.js","webpack:///./app/portainer/components/datatables/groups-datatable/groupsDatatable.js","webpack:///./app/portainer/components/datatables/groups-datatable/groupsDatatable.html","webpack:///./app/portainer/components/datatables/index.js","webpack:///./app/portainer/components/datatables/titlebar/datatable-titlebar.html","webpack:///./app/portainer/components/datatables/searchbar/datatable-searchbar.html","webpack:///./app/portainer/components/datatables/sort-icon/datatable-sort-icon.html","webpack:///./app/portainer/components/datatables/pagination/pagination.html","webpack:///./app/portainer/components/datatables/registries-datatable/registriesDatatable.js","webpack:///./app/portainer/components/datatables/registries-datatable/registriesDatatable.html","webpack:///./app/portainer/components/datatables/registries-datatable/registriesDatatableController.js","webpack:///./app/portainer/components/datatables/stacks-datatable/stacksDatatable.js","webpack:///./app/portainer/components/datatables/stacks-datatable/stacksDatatable.html","webpack:///./app/portainer/components/datatables/stacks-datatable/stacksDatatableController.js","webpack:///./app/portainer/components/datatables/strings-datatable/index.js","webpack:///./app/portainer/components/datatables/strings-datatable/strings-datatable.html","webpack:///./app/portainer/components/datatables/tags-datatable/tagsDatatable.js","webpack:///./app/portainer/components/datatables/tags-datatable/tagsDatatable.html","webpack:///./app/portainer/components/datatables/teams-datatable/teamsDatatable.js","webpack:///./app/portainer/components/datatables/teams-datatable/teamsDatatable.html","webpack:///./app/portainer/components/datatables/users-datatable/usersDatatable.js","webpack:///./app/portainer/components/datatables/users-datatable/usersDatatable.html","webpack:///./app/portainer/components/endpoint-list/endpoint-item/endpointItem.js","webpack:///./app/portainer/components/endpoint-list/endpoint-item/endpointItem.html","webpack:///./app/assets/images/edge_endpoint.png","webpack:///./app/assets/images/kubernetes_endpoint.png","webpack:///./app/assets/images/kubernetes_edge_endpoint.png","webpack:///./app/portainer/components/endpoint-list/endpoint-list-controller.js","webpack:///./app/portainer/components/endpoint-list/endpoint-list.js","webpack:///./app/portainer/components/endpoint-list/endpointList.html","webpack:///./app/portainer/components/endpoint-selector/endpoint-selector.js","webpack:///./app/portainer/components/endpoint-selector/endpointSelector.html","webpack:///./app/portainer/components/endpoint-selector/endpointSelectorController.js","webpack:///./app/portainer/components/endpointSecurity/por-endpoint-security.js","webpack:///./app/portainer/components/endpointSecurity/porEndpointSecurity.html","webpack:///./app/portainer/components/endpointSecurity/porEndpointSecurityController.js","webpack:///./app/portainer/components/environment-variables-panel/environment-variables-simple-mode/environment-variables-simple-mode-item/index.js","webpack:///./app/portainer/components/environment-variables-panel/environment-variables-simple-mode/environment-variables-simple-mode-item/environment-variables-simple-mode-item.html","webpack:///./app/portainer/components/environment-variables-panel/environment-variables-simple-mode/environment-variables-simple-mode.html","webpack:///./app/portainer/components/environment-variables-panel/environment-variables-panel.html","webpack:///./app/portainer/components/focusIf.js","webpack:///./app/portainer/components/forms/group-form/group-form.js","webpack:///./app/portainer/components/forms/group-form/groupForm.html","webpack:///./app/portainer/components/forms/kubernetes-app-git-form/kubernetes-app-git-form.js","webpack:///./app/portainer/components/forms/kubernetes-app-git-form/kubernetes-app-git-form.html","webpack:///./app/portainer/components/forms/kubernetes-redeploy-app-git-form/kubernetes-redeploy-app-git-form.js","webpack:///./app/portainer/components/forms/kubernetes-redeploy-app-git-form/kubernetes-redeploy-app-git-form.html","webpack:///./app/portainer/components/forms/por-switch-field/por-switch-field.js","webpack:///./app/portainer/components/forms/por-switch-field/por-switch-field.html","webpack:///./app/portainer/components/forms/por-switch/por-switch.html","webpack:///./app/portainer/components/forms/registry-form-aws-ecr/registry-form-ecr.js","webpack:///./app/portainer/components/forms/registry-form-aws-ecr/registry-form-ecr.html","webpack:///./app/portainer/components/forms/registry-form-azure/registry-form-azure.js","webpack:///./app/portainer/components/forms/registry-form-azure/registry-form-azure.html","webpack:///./app/portainer/components/forms/registry-form-custom/registry-form-custom.js","webpack:///./app/portainer/components/forms/registry-form-custom/registry-form-custom.html","webpack:///./app/portainer/components/forms/registry-form-dockerhub/registry-form-dockerhub.js","webpack:///./app/portainer/components/forms/registry-form-dockerhub/registry-form-dockerhub.html","webpack:///./app/portainer/components/forms/registry-form-gitlab/gitlab-projects-datatable/gitlabProjectsDatatable.js","webpack:///./app/portainer/components/forms/registry-form-gitlab/gitlab-projects-datatable/gitlabProjectsDatatable.html","webpack:///./app/portainer/components/forms/registry-form-gitlab/gitlab-projects-datatable/gitlabProjectsDatatableController.js","webpack:///./app/portainer/components/forms/registry-form-gitlab/registry-form-gitlab.js","webpack:///./app/portainer/components/forms/registry-form-gitlab/registry-form-gitlab.html","webpack:///./app/portainer/components/forms/registry-form-proget/registry-form-proget.js","webpack:///./app/portainer/components/forms/registry-form-proget/registry-form-proget.html","webpack:///./app/portainer/components/forms/registry-form-quay/registry-form-quay.js","webpack:///./app/portainer/components/forms/registry-form-quay/registry-form-quay.html","webpack:///./app/portainer/components/forms/stack-from-template-form/index.js","webpack:///./app/portainer/components/forms/stack-from-template-form/stackFromTemplateForm.html","webpack:///./app/portainer/components/forms/stack-redeploy-git-form/index.js","webpack:///./app/portainer/components/forms/stack-redeploy-git-form/stack-redeploy-git-form.html","webpack:///./app/portainer/components/group-association-table/group-association-table.js","webpack:///./app/portainer/components/group-association-table/groupAssociationTable.html","webpack:///./app/portainer/components/header-content.js","webpack:///./app/portainer/components/header-title.js","webpack:///./app/portainer/components/header.js","webpack:///./app/portainer/components/information-panel-offline/informationPanelOffline.js","webpack:///./app/portainer/components/information-panel-offline/informationPanelOffline.html","webpack:///./app/portainer/components/information-panel-offline/informationPanelOfflineController.js","webpack:///./app/portainer/components/information-panel/information-panel.js","webpack:///./app/portainer/components/information-panel/informationPanel.html","webpack:///./app/portainer/components/intervalFormat.js","webpack:///./app/portainer/components/motd-panel/motd-panel.js","webpack:///./app/portainer/components/motd-panel/motdPanel.html","webpack:///./app/portainer/components/onEnterKey.js","webpack:///./app/portainer/components/product-list/product-item/product-item.js","webpack:///./app/portainer/components/product-list/product-item/productItem.html","webpack:///./app/assets/images/support_1.png","webpack:///./app/assets/images/support_2.png","webpack:///./app/portainer/components/product-list/product-list.js","webpack:///./app/portainer/components/product-list/productList.html","webpack:///./app/portainer/components/registry-details/index.js","webpack:///./app/portainer/components/registry-details/registry-details.html","webpack:///./app/portainer/components/sensitive-details/sensitive-details.html","webpack:///./app/portainer/components/show-hide/show-hide.js","webpack:///./app/portainer/components/show-hide/show-hide.html","webpack:///./app/portainer/components/slider/slider.js","webpack:///./app/portainer/components/slider/slider.html","webpack:///./app/portainer/components/slider/sliderController.js","webpack:///./app/portainer/components/stack-duplication-form/stack-duplication-form-controller.js","webpack:///./app/portainer/components/stack-duplication-form/stack-duplication-form.js","webpack:///./app/portainer/components/stack-duplication-form/stack-duplication-form.html","webpack:///./app/portainer/components/status-indicator/status-indicator.html","webpack:///./app/portainer/components/tag-selector/tag-selector.js","webpack:///./app/portainer/components/tag-selector/tagSelector.html","webpack:///./app/portainer/components/tag-selector/tagSelectorController.js","webpack:///./app/portainer/components/template-list/template-item/templateItem.html","webpack:///./app/portainer/components/template-list/template-list-controller.js","webpack:///./app/portainer/components/template-list/template-list.js","webpack:///./app/portainer/components/template-list/templateList.html","webpack:///./app/portainer/components/template-widget.js","webpack:///./app/portainer/components/theme/theme-settings.js","webpack:///./app/portainer/components/theme/theme-settings.html","webpack:///./app/portainer/filters/index.js","webpack:///./app/portainer/helpers/formHelper.js","webpack:///./app/portainer/helpers/networkHelper.js","webpack:///./app/portainer/helpers/resourceControlHelper.js","webpack:///./app/portainer/helpers/stackHelper.js","webpack:///./app/portainer/helpers/templateHelper.js","webpack:///./app/portainer/helpers/urlHelper.js","webpack:///./app/portainer/helpers/userHelper.js","webpack:///./app/portainer/helpers/webhookHelper.js","webpack:///./app/portainer/interceptors/endpointStatusInterceptor.js","webpack:///./app/portainer/models/resourceControl/resourceControlCreatePayload.js","webpack:///./app/portainer/models/resourceControl/resourceControlUpdatePayload.js","webpack:///./app/portainer/oauth/__module.js","webpack:///./app/portainer/oauth/components/oauth-providers-selector/index.js","webpack:///./app/portainer/oauth/components/oauth-providers-selector/oauth-providers-selector.html","webpack:///./app/portainer/oauth/components/oauth-settings/index.js","webpack:///./app/portainer/oauth/components/oauth-settings/oauth-settings.html","webpack:///./app/portainer/oauth/services/rest/oauth.js","webpack:///./app/portainer/rest/auth.js","webpack:///./app/portainer/rest/backup.js","webpack:///./app/portainer/rest/customTemplate.js","webpack:///./app/portainer/rest/endpoint.js","webpack:///./app/portainer/rest/gitlab.js","webpack:///./app/portainer/rest/group.js","webpack:///./app/portainer/rest/legacyExtension.js","webpack:///./app/portainer/rest/motd.js","webpack:///./app/portainer/rest/registry.js","webpack:///./app/portainer/rest/resourceControl.js","webpack:///./app/portainer/rest/settings.js","webpack:///./app/portainer/rest/ssl.js","webpack:///./app/portainer/rest/stack.js","webpack:///./app/portainer/rest/status.js","webpack:///./app/portainer/rest/support.js","webpack:///./app/portainer/rest/tag.js","webpack:///./app/portainer/rest/team.js","webpack:///./app/portainer/rest/teamMembership.js","webpack:///./app/portainer/rest/template.js","webpack:///./app/portainer/rest/user.js","webpack:///./app/portainer/rest/webhooks.js","webpack:///./app/portainer/services/api/accessService.js","webpack:///./app/portainer/services/api/backupService.js","webpack:///./app/portainer/services/api/customTemplate.js","webpack:///./app/portainer/services/api/dockerhubService.js","webpack:///./app/portainer/services/api/endpointService.js","webpack:///./app/portainer/services/api/groupService.js","webpack:///./app/portainer/services/api/legacyExtensionService.js","webpack:///./app/portainer/services/api/motdService.js","webpack:///./app/portainer/services/api/registryService.js","webpack:///./app/portainer/services/api/resourceControlService.js","webpack:///./app/portainer/services/api/settingsService.js","webpack:///./app/portainer/services/api/sslService.js","webpack:///./app/portainer/services/api/stackService.js","webpack:///./app/portainer/services/api/statusService.js","webpack:///./app/portainer/services/api/supportService.js","webpack:///./app/portainer/services/api/tagService.js","webpack:///./app/portainer/services/api/teamMembershipService.js","webpack:///./app/portainer/services/api/teamService.js","webpack:///./app/portainer/services/api/templateService.js","webpack:///./app/portainer/services/api/userService.js","webpack:///./app/portainer/services/api/webhookService.js","webpack:///./app/portainer/services/async.js","webpack:///./app/portainer/services/authentication.js","webpack:///./app/portainer/services/chartService.js","webpack:///./app/portainer/services/codeMirror.js","webpack:///./app/portainer/services/datatableService.js","webpack:///./app/portainer/services/endpointProvider.js","webpack:///./app/portainer/services/fileUpload.js","webpack:///./app/portainer/services/formValidator.js","webpack:///./app/portainer/services/httpRequestHelper.js","webpack:///./app/portainer/services/legacyExtensionManager.js","webpack:///./app/portainer/services/localStorage.js","webpack:///./app/portainer/services/modalService.js","webpack:///./app/portainer/services/nameValidator.js","webpack:///./app/portainer/services/notifications.js","webpack:///./app/portainer/services/pagination.js","webpack:///./app/portainer/services/registryGitlabService.js","webpack:///./app/portainer/services/registryModalService.js","webpack:///./app/portainer/services/stateManager.js","webpack:///./app/portainer/services/terminal-window.js","webpack:///./app/portainer/services/themeManager.js","webpack:///./app/portainer/views/account/accountController.js","webpack:///./app/portainer/views/account/create-user-access-token/index.js","webpack:///./app/portainer/views/account/create-user-access-token/create-user-access-token.html","webpack:///./app/portainer/views/auth/authController.js","webpack:///./app/portainer/views/custom-templates/create-custom-template-view/index.js","webpack:///./app/portainer/views/custom-templates/create-custom-template-view/createCustomTemplateView.html","webpack:///./app/portainer/views/custom-templates/custom-templates-view/index.js","webpack:///./app/portainer/views/custom-templates/custom-templates-view/customTemplatesView.html","webpack:///./app/portainer/views/custom-templates/edit-custom-template-view/index.js","webpack:///./app/portainer/views/custom-templates/edit-custom-template-view/editCustomTemplateView.html","webpack:///./app/portainer/views/endpoint-registries/registries.js","webpack:///./app/portainer/views/endpoint-registries/registries.html","webpack:///./app/portainer/views/endpoint-registries/registriesController.js","webpack:///./app/portainer/views/endpoints/access/endpointAccessController.js","webpack:///./app/portainer/views/endpoints/create/createEndpointController.js","webpack:///./app/portainer/views/endpoints/edit/endpointController.js","webpack:///./app/portainer/views/endpoints/endpointsController.js","webpack:///./app/portainer/views/groups/access/groupAccessController.js","webpack:///./app/portainer/views/groups/create/createGroupController.js","webpack:///./app/portainer/views/groups/edit/groupController.js","webpack:///./app/portainer/views/groups/groupsController.js","webpack:///./app/portainer/views/home/homeController.js","webpack:///./app/portainer/views/init/admin/initAdminController.js","webpack:///./app/portainer/views/init/endpoint/initEndpointController.js","webpack:///./app/portainer/views/init/endpoint/includes/localDocker.html","webpack:///./app/portainer/views/init/endpoint/includes/localKubernetes.html","webpack:///./app/portainer/views/init/endpoint/includes/agent.html","webpack:///./app/portainer/views/logout/logoutController.js","webpack:///./app/portainer/views/main/mainController.js","webpack:///./app/portainer/views/registries/create/createRegistry.js","webpack:///./app/portainer/views/registries/create/createRegistry.html","webpack:///./app/portainer/views/registries/edit/registryController.js","webpack:///./app/portainer/views/registries/registriesController.js","webpack:///./app/portainer/views/settings/authentication/settingsAuthenticationController.js","webpack:///./app/portainer/views/settings/settingsController.js","webpack:///./app/portainer/views/sidebar/sidebarController.js","webpack:///./app/portainer/views/stacks/create/createStackController.js","webpack:///./app/portainer/views/stacks/edit/stackController.js","webpack:///./app/portainer/views/stacks/stacksController.js","webpack:///./app/portainer/views/tags/tagsController.js","webpack:///./app/portainer/views/teams/edit/teamController.js","webpack:///./app/portainer/views/teams/teamsController.js","webpack:///./app/portainer/views/templates/templatesController.js","webpack:///./app/portainer/views/users/edit/userController.js","webpack:///./app/portainer/views/users/usersController.js","webpack:///./app/portainer/views/wizard/index.js","webpack:///./app/portainer/views/wizard/wizard-view.html","webpack:///./app/portainer/views/wizard/wizard-endpoints/wizard-endpoints.html","webpack:///./app/portainer/views/wizard/wizard-endpoints/wizard-endpoint-aci/index.js","webpack:///./app/portainer/views/wizard/wizard-endpoints/wizard-endpoint-aci/wizard-aci.html","webpack:///./app/portainer/views/wizard/wizard-endpoints/wizard-endpoint-docker/index.js","webpack:///./app/portainer/views/wizard/wizard-endpoints/wizard-endpoint-docker/wizard-docker.html","webpack:///./app/portainer/views/wizard/wizard-endpoints/wizard-endpoint-kubernetes/index.js","webpack:///./app/portainer/views/wizard/wizard-endpoints/wizard-endpoint-kubernetes/wizard-kubernetes.html","webpack:///./app/portainer/views/wizard/wizard-endpoints/wizard-endpoint-list/wizard-endpoint-list.html","webpack:///./app/portainer/views/wizard/wizard-endpoints/wizard-stepper/wizard-stepper.html","webpack:///./app/portainer/views/wizard/wizard-endpoints/wizard-stepper/wizard-endpoint-type/index.js","webpack:///./app/portainer/views/wizard/wizard-endpoints/wizard-stepper/wizard-endpoint-type/wizard-endpoint-type.html","webpack:///./app/portainer/views/wizard/wizard-link/wizard-link.html","webpack:///./app/portainer/views/wizard/wizard-tls/index.js","webpack:///./app/portainer/views/wizard/wizard-tls/wizard-tls.html","webpack:///./app/setup-tests.js","webpack:///./app/vendors.js","webpack:///./app/docker/views/containers/create/createContainerController.js","webpack:///./app/edge/components/edge-job-results-datatable/index.js","webpack:///./app/edge/components/edge-stack-status/index.js","webpack:///./app/kubernetes/components/datatables/applications-datatable-url/applications-datatable-url.js","webpack:///./app/kubernetes/components/datatables/applications-datatable/applicationsDatatable.js","webpack:///./app/kubernetes/components/helm/helm-templates/helm-templates-list/helm-templates-list-item/helm-templates-list-item.js","webpack:///./app/kubernetes/components/kubectl-shell/kubectl-shell.js","webpack:///./app/kubernetes/views/applications/helm/index.js","webpack:///./app/portainer/components/be-feature-indicator/index.js","webpack:///./app/portainer/components/box-selector/box-selector-item/index.js","webpack:///./app/portainer/components/copy-button/copy-button.js","webpack:///./app/portainer/components/environment-variables-panel/environment-variables-simple-mode/index.js","webpack:///./app/portainer/components/environment-variables-panel/index.js","webpack:///./app/portainer/components/forms/por-switch/por-switch.js","webpack:///./app/portainer/components/sensitive-details/sensitive-details.js","webpack:///./app/portainer/components/status-indicator/index.js","webpack:///./app/portainer/components/template-list/template-item/template-item.js","webpack:///./app/portainer/views/wizard/wizard-endpoints/index.js","webpack:///./app/portainer/views/wizard/wizard-endpoints/wizard-endpoint-list/index.js","webpack:///./app/portainer/views/wizard/wizard-endpoints/wizard-stepper/index.js","webpack:///./app/portainer/views/wizard/wizard-link/index.js"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","0","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice","_KubernetesApplication","freeze","Id","Name","StackName","StackId","ApplicationKind","ApplicationOwner","ApplicationName","ResourcePool","Image","CreationDate","Pods","Containers","Metadata","Limits","ServiceType","ServiceId","ServiceName","HeadlessServiceName","undefined","LoadBalancerIPAddress","PublishedPorts","Volumes","Env","PersistedFolders","ConfigurationVolumes","DeploymentType","DataAccessPolicy","ApplicationType","RunningPodsCount","TotalPodsCount","Yaml","Note","Revisions","CurrentRevision","Raw","AutoScaler","KubernetesApplication","constructor","assign","this","JSON","parse","stringify","HelmApplication","KubernetesApplications","Status","_KubernetesApplicationPersistedFolder","MountPath","PersistentVolumeClaimName","HostPath","KubernetesApplicationPersistedFolder","_KubernetesApplicationConfigurationVolume","fileMountPath","rootMountPath","configurationKey","configurationName","KubernetesApplicationConfigurationVolume","_KubernetesApplicationPort","IngressRules","NodePort","TargetPort","Port","Protocol","KubernetesApplicationPort","KubernetesDeploymentTypes","GIT","CONTENT","APPLICATION_FORM","URL","PortainerError","msg","err","PortainerEndpointTypes","DockerEnvironment","AgentOnDockerEnvironment","AzureEnvironment","EdgeAgentOnDockerEnvironment","KubernetesLocalEnvironment","AgentOnKubernetesEnvironment","EdgeAgentOnKubernetesEnvironment","PortainerEndpointCreationTypes","LocalDockerEnvironment","AgentEnvironment","EdgeAgentEnvironment","LocalKubernetesEnvironment","PortainerEndpointConnectionTypes","DOCKER_LOCAL","KUBERNETES_LOCAL","REMOTE","AZURE","AGENT","EDGE","KubernetesCommonParams","id","K8S_RESOURCE_POOL_LB_QUOTA","K8S_RESOURCE_POOL_STORAGE_QUOTA","RBAC_ROLES","REGISTRY_MANAGEMENT","K8S_SETUP_DEFAULT","S3_BACKUP_SETTING","HIDE_INTERNAL_AUTHENTICATION_PROMPT","TEAM_MEMBERSHIP","HIDE_INTERNAL_AUTH","EXTERNAL_AUTH_LDAP","ACTIVITY_AUDIT","HIDE_AUTO_UPDATE_WINDOW","FORCE_REDEPLOYMENT","KubernetesResourceReservationHelper","pods","containers","acc","pod","container","Requests","memory","Memory","filesizeParser","base","cpu","CPU","parseCPU","KubernetesResourceReservation","res","parseInt","Math","floor","mem","KubernetesDeployManifestTypes","KUBERNETES","COMPOSE","KubernetesDeployBuildMethods","WEB_EDITOR","CUSTOM_TEMPLATE","KubernetesDeployRequestMethods","REPOSITORY","STRING","RepositoryMechanismTypes","WEBHOOK","INTERVAL","PodKubernetesInstanceLabel","PodManagedByLabel","KubernetesApplicationHelper","application","selector","matchLabels","app","pf","VolumeMounts","cv","associateContainerPersistedFoldersAndConfigurations","applications","mapping","KubernetesPortMapping","Ports","item","port","KubernetesPortMappingPort","KubernetesServiceTypes","NODE_PORT","envVariables","NeedsDeletion","KubernetesApplicationEnvPayload","Value","env","valueFrom","KubernetesApplicationEnvironmentVariableFormValue","IsNew","NameIndex","volumes","configurations","finalRes","cfg","filterCondition","Type","KubernetesConfigurationTypes","CONFIGMAP","cfgEnv","cfgVol","keys","Data","k","keyEnv","keyVol","Key","Count","Sum","EnvCount","VolCount","max","overrideThreshold","Array","KubernetesApplicationConfigurationFormValue","index","SelectedConfiguration","Overriden","OverridenKeys","fvKey","KubernetesApplicationConfigurationFormValueOverridenKey","KubernetesApplicationConfigurationFormValueOverridenKeyTypes","ENVIRONMENT","FILESYSTEM","Path","NONE","finalEnv","finalVolumes","finalMounts","config","isBasic","envKeys","KubernetesApplicationEnvConfigMapPayload","KubernetesApplicationEnvSecretPayload","configMapKeyRef","secretKeyRef","volKeys","groupedVolKeys","items","path","volumeName","KubernetesVolumeHelper","generatedApplicationConfigVolumeName","itemsMap","entry","KubernetesApplicationVolumeEntryPayload","mount","KubernetesApplicationVolumeMountPayload","volume","KubernetesApplicationVolumeConfigMapPayload","KubernetesApplicationVolumeSecretPayload","mountPath","configMap","secret","secretName","serviceType","publishedPorts","ingress","generatePort","rule","KubernetesApplicationPublishedPortFormValue","IngressName","IngressRoute","IngressHost","Host","IngressHosts","find","Hosts","ContainerPort","LOAD_BALANCER","LoadBalancerPort","LoadBalancerNodePort","autoScaler","replicasCount","KubernetesApplicationAutoScalerFormValue","IsUsed","MinReplicas","MaxReplicas","TargetCPUUtilization","ApiVersion","persistedFolders","persistentVolumeClaims","folder","pvc","KubernetesApplicationPersistedFolderFormValue","StorageClass","Size","Storage","SizeUnit","ContainerPath","volumeClaims","volumeMount","KubernetesApplicationVolumePersistentPayload","persistentVolumeClaim","claimName","formValues","AccessModes","claims","podAffinity","nodesLabels","placements","Placements","type","PlacementType","affinity","nodeAffinity","requiredDuringSchedulingIgnoredDuringExecution","KubernetesApplicationPlacementTypes","MANDATORY","nodeSelectorTerms","term","matchExpressions","exp","placement","KubernetesApplicationPlacementFormValue","label","Label","values","preferredDuringSchedulingIgnoredDuringExecution","PREFERRED","preference","KubernetesApplicationDeploymentTypes","REPLICATED","KubernetesPodNodeAffinityPayload","expressions","KubernetesNodeSelectorRequirementPayload","operator","KubernetesPodNodeAffinityNodeSelectorRequirementOperators","IN","EXISTS","KubernetesNodeSelectorTermPayload","KubernetesPreferredSchedulingTermPayload","Affinity","KubernetesPodAffinity","helmManagedApps","filter","labels","namespacedHelmReleases","forEach","namespace","instanceLabel","flatMap","entries","map","helmInstance","helmApp","KubernetesApplicationTypes","HELM","appsNotReady","some","sort","a","b","Date","toLowerCase","replaceAll","helmApplications","getHelmApplications","helmAppNames","Set","hma","nonHelmApplications","includes","KubernetesApplicationFormValues","ImageModel","PorImageRegistryModel","MemoryLimit","CpuLimit","ReplicaCount","EnvironmentVariables","KubernetesApplicationDataAccessPolicies","ISOLATED","Configurations","PublishingType","KubernetesApplicationPublishingTypes","CLUSTER_IP","OriginalIngresses","IsPublishingService","_KubernetesApplicationConfigurationFormValueOverridenKey","_KubernetesApplicationConfigurationFormValue","_KubernetesApplicationEnvironmentVariableFormValue","IsSecret","_KubernetesApplicationPersistedFolderFormValue","ExistingVolume","UseNewVolume","storageClass","_KubernetesApplicationAutoScalerFormValue","KubernetesFormValidationReferences","refs","hasRefs","KubernetesPortainerConfigurationOwnerLabel","KubernetesPortainerConfigurationDataAnnotation","_KubernetesConfiguration","Namespace","ConfigurationOwner","Used","Applications","KubernetesConfiguration","SECRET","KubernetesNamespaceHelper","isSystem","KUBERNETES_DEFAULT_NAMESPACE","KUBERNETES_DEFAULT_SYSTEM_NAMESPACES","ResourceControlOwnership","PUBLIC","PRIVATE","RESTRICTED","ADMINISTRATORS","RegistryTypes","ANONYMOUS","QUAY","CUSTOM","GITLAB","PROGET","DOCKERHUB","ECR","rawResponse","isJSON","jsonString","e","jsonObjectsToArrayHandler","str","replace","angular","fromJson","genericHandler","response","message","logsHandler","logs","deleteImageHandler","toString","json","KubernetesPortainerResourceQuotaPrefix","KubernetesPortainerResourceQuotaCPULimit","KubernetesPortainerResourceQuotaMemoryLimit","KubernetesPortainerResourceQuotaCPURequest","KubernetesPortainerResourceQuotaMemoryRequest","KubernetesResourceQuotaDefaults","KubernetesResourceQuota","KubernetesResourceQuotaHelper","generateResourceQuotaName","CpuLimitUsed","MemoryLimitUsed","ResourcePoolName","ResourcePoolOwner","KubernetesResourceTypes","NAMESPACE","RESOURCEQUOTA","DEPLOYMENT","STATEFULSET","DAEMONSET","PERSISTENT_VOLUME_CLAIM","SERVICE","INGRESS","HORIZONTAL_POD_AUTOSCALER","KubernetesResourceActions","CREATE","UPDATE","DELETE","KubernetesServiceHeadlessPrefix","KubernetesServiceHeadlessClusterIP","_KubernetesService","Headless","ClusterIP","KubernetesService","_KubernetesServicePort","targetPort","protocol","nodePort","KubernetesServicePort","AccessControlFormData","AccessControlEnabled","Ownership","RCO","AuthorizedUsers","AuthorizedTeams","autoNgTemplateLoaderTemplate1","require","buildOption","icon","description","feature","component","templateUrl","controller","bindings","radioName","ngModel","options","onChange","_KubernetesPod","Images","Restarts","Node","Labels","Tolerations","NodeSelector","KubernetesPod","_KubernetesPodToleration","Operator","TolerationSeconds","Effect","KubernetesPodToleration","_KubernetesPodContainer","PodName","ImagePullPolicy","KubernetesPodContainer","_KubernetesPodEviction","apiVersion","kind","metadata","KubernetesPodEviction","KubernetesPodContainerTypes","INIT","APP","KubernetesCommonHelper","obj","owner","omission","_KubernetesCommonMetadataPayload","uid","annotations","KubernetesCommonMetadataPayload","KubernetesIngressConverter","paths","spec","rules","http","ingRule","KubernetesIngressRule","backend","service","host","IP","status","loadBalancer","ip","number","KubernetesIngress","Annotations","IngressClassName","KubernetesIngressClassAnnotation","ingressClassName","Paths","idx","h","serviceName","isPublishingToIngress","ingresses","copy","IngressClass","pairs","RewriteTarget","KubernetesIngressClassRewriteTargetAnnotations","ics","ic","fv","KubernetesResourcePoolIngressClassFormValue","Selected","WasSelected","hfv","KubernetesResourcePoolIngressClassHostFormValue","PreviousHost","rewriteKey","annotation","KubernetesResourcePoolIngressClassAnnotationFormValue","AdvancedConfig","KubernetesIngressCreatePayload","hostsWithRules","groups","updatedHost","KubernetesIngressRuleCreatePayload","assignOrDeleteIfEmpty","KubernetesIngressRulePathCreatePayload","keptHosts","hostsWithoutRules","emptyRules","oldData","newData","oldPayload","createPayload","newPayload","JsonPatch","EDITIONS","CE","BE","STATES","HIDDEN","VISIBLE","LIMITED_BE","ResourceControlViewModel","resourceControl","ResourceId","UserAccesses","TeamAccesses","Public","System","KubernetesFormValidationHelper","names","test","groupped","KubernetesResourcePoolFormValues","defaults","HasQuota","IngressClasses","Registries","EndpointId","IsSystem","ingressClass","UseRegistry","Registry","KubernetesConfigurationHelper","envFind","volumeFind","encoding","getUsingApplications","setConfigurationUsed","configurationsUsed","configMappedByName","configMappedByVolume","YAML","defaultOptions","customTags","DataYaml","KubernetesConfigurationFormValuesEntry","oldEntry","IsBinary","configuration","KubernetesPortainerConfigMapNamespace","KubernetesPortainerConfigMapConfigName","KubernetesPortainerConfigMapAccessKey","KubernetesPortainerAccessConfigMap","_KubernetesConfigMap","KubernetesConfigMap","KubernetesApplicationConverter","template","initContainers","KubernetesPortainerApplicationStackIdLabel","KubernetesPortainerApplicationStackNameLabel","KubernetesPortainerApplicationKindLabel","KubernetesPortainerApplicationOwnerLabel","KubernetesPortainerApplicationNameLabel","KubernetesPortainerApplicationNote","image","imagePullSecrets","RegistryId","creationTimestamp","associatePodsAndApplication","resources","limits","Cpu","requests","hostname","portsRefs","ports","pList","pRefs","isNaN","containerPort","_apiPortsToPublishedPorts","KubernetesIngressHelper","findSBoundServiceIngressesRules","volumeClaimTemplates","vcTemplates","vc","inexistingPVC","hostPath","volumeMounts","matchingVolumeMount","persistedFolder","configurationVolume","applicationCommon","POD","SHARED","availableReplicas","replicas","unavailableReplicas","GLOBAL","numberAvailable","desiredNumberScheduled","numberUnavailable","readyReplicas","resourcePools","megaBytesValue","generateEnvVariablesFromEnv","generatePersistedFoldersFormValuesFromPersistedFolders","generateConfigurationFormValuesFromEnvAndVolumes","generateAutoScalerFormValueFromHorizontalPodAutoScaler","generatePublishedPortsFormValuesFromPublishedPorts","isIngress","generatePlacementsFormValuesFromAffinity","ownerToLabel","KubernetesPersistentVolumeClaimConverter","applicationFormValuesToVolumeClaims","rwx","hasRWX","deployment","statefulSet","daemonSet","headlessService","KubernetesDeploymentConverter","applicationFormValuesToDeployment","KubernetesStatefulSetConverter","applicationFormValuesToStatefulSet","KubernetesDaemonSetConverter","applicationFormValuesToDaemonSet","KubernetesServiceConverter","applicationFormValuesToHeadlessService","applicationFormValuesToService","KubernetesPortainerNodeDrainLabel","_KubernetesNode","Role","Version","IPAddress","Api","Taints","Availability","KubernetesNode","_KubernetesNodeDetails","OS","Architecture","Platform","Conditions","KubernetesNodeDetails","_KubernetesNodeTaint","KubernetesNodeTaint","KubernetesNodeAvailabilities","ACTIVE","PAUSE","DRAIN","KubernetesNodeTaintEffects","NOSCHEDULE","PREFERNOSCHEDULE","NOEXECUTE","_KubernetesConfigurationFormValues","IsSimple","KubernetesConfigurationFormValues","_KubernetesConfigurationFormValuesEntry","nginx","traefik","KubernetesIngressClassTypes","NGINX","TRAEFIK","KubernetesConfigMapConverter","KubernetesConfigMapCreatePayload","createAccessPayload","yaml","binaryData","configurationOwner","KubernetesConfigMapUpdatePayload","truncateLeftRight","text","left","right","substring","stripProtocol","url","humanize","bytes","round","filesize","isoDateFromTimestamp","timestamp","moment","unix","format","isoDate","date","getPairKey","pair","separator","indexOf","getPairValue","ipAddress","arrayToStr","arr","labelsToStr","endpointTypeName","endpointTypeIcon","ownershipIcon","ownership","truncate","end","String","endpointStatusBadge","matchingNames","PersistentVolumeClaim","uuidv4","RoleViewModel","authorizations","ID","Description","Authorizations","RoleTypes","ENDPOINT_ADMIN","HELPDESK","STANDARD","READ_ONLY","OPERATOR","constant","PORTAINER_FADEOUT","STACK_NAME_VALIDATION_REGEX","TEMPLATE_NAME_VALIDATION_REGEX","BROWSER_OS_PLATFORM","navigator","userAgent","NEW_LINE_BREAKER","KubernetesHorizontalPodAutoScalerConverter","KubernetesHorizontalPodAutoScaler","minReplicas","maxReplicas","targetCPUUtilizationPercentage","scaleTargetRef","TargetEntity","Kind","payload","KubernetesHorizontalPodAutoScalerCreatePayload","oldScaler","newScaler","KEY_REGEX","source","VALUE_REGEX","KEY_VALUE_REGEX","RegExp","NEWLINES_REGEX","parseDotEnvFile","src","parseArrayOfStrings","split","v","trim","startsWith","array","variableString","parsedKeyValArr","match","convertToArrayOfStrings","variable","UserAccessViewModel","Username","Inherited","Override","TeamAccessViewModel","_KubernetesStatefulSet","Secret","VolumeClaims","KubernetesStatefulSet","KubernetesPortainerResourcePoolNameLabel","KubernetesPortainerResourcePoolOwnerLabel","KubernetesPortainerNamespaceSystemLabel","KubernetesResourcePool","Quota","Ingresses","_KubernetesApplicationVolumeMount","readOnly","_KubernetesApplicationVolumePersistentPayload","_KubernetesApplicationVolumeConfigMapPayload","_KubernetesApplicationVolumeSecretPayload","_KubernetesApplicationVolumeEntryPayload","_KubernetesApplicationEnvPayload","_KubernetesApplicationEnvConfigMapPayload","_KubernetesApplicationEnvSecretPayload","storageClasses","KubernetesPersistentVolumeClaim","storage","storageClassName","PreviousName","charAt","existantPVC","KubernetesPersistentVolumClaimCreatePayload","oldPVC","newPVC","KubernetesNodeConverter","hostName","addresses","address","ready","conditions","KubernetesNodeConditionTypes","READY","memoryPressure","MEMORY_PRESSURE","PIDPressure","PID_PRESSURE","diskPressure","DISK_PRESSURE","networkUnavailable","NETWORK_UNAVAILABLE","MemoryPressure","DiskPressure","NetworkUnavailable","unschedulable","allocatable","nodeInfo","kubeletVersion","internalIP","taints","taint","effect","apiToNode","architecture","operatingSystem","osImage","node","KubernetesNodeFormValues","KubernetesNodeTaintFormValues","KubernetesNodeLabelFormValues","filteredTaints","filteredLabels","KubernetesNodeCreatePayload","KubernetesNodeTaintPayload","oldNode","newNode","KubernetesEventHelper","events","event","_KubernetesResourceReservation","KubernetesResourceQuotaConverter","hard","used","quota","KubernetesResourceQuotaCreatePayload","assignOrDeleteIfEmptyOrZero","oldQuota","newQuota","StorageClasses","StorageRequests","bytesValue","Owner","KubernetesHorizontalPodAutoScalerHelper","sList","getApplicationTypeString","KubernetesDeployment","KubernetesApplicationTypeStrings","KubernetesDaemonSet","findAssociatedGroup","endpoint","group","GroupId","EndpointHelper","endpoints","GroupName","decimals","base10","dm","log","parseFloat","pow","toFixed","StoridgeProfileDefaultModel","Directory","Capacity","Redundancy","Provisioning","MinIOPS","MaxIOPS","MinBandwidth","MaxBandwidth","Filesystem","SnapshotEnabled","SnapshotInterval","SnapshotMax","EncryptionEnabled","InterfaceType","InterfaceDriver","InterfaceNetwork","InterfaceConf","StoridgeProfileListModel","Checked","StoridgeProfileModel","directory","capacity","provision","level","iops","min","bandwidth","filesystem","snapshot","enabled","interval","encryption","interface","driver","network","conf","StoridgeCreateProfileRequest","model","KubernetesResourcePoolConverter","KubernetesNamespace","resourcePoolFormValuesToResourceQuota","ingMap","resourcePoolIngressClassFormValueToIngress","registries","RegistryAccesses","Namespaces","KubernetesSecretConverter","KubernetesSecretCreatePayload","stringData","KubernetesSecretUpdatePayload","KubernetesApplicationSecret","IsRegistrySecret","atob","KubernetesSystem_DefaultDeploymentUniqueLabelKey","KubernetesSystem_RevisionAnnotation","KubernetesSystem_RevisionHistoryAnnotation","KubernetesSystem_ChangeCauseAnnotation","KubernetesSystem_DesiredReplicasAnnotation","KubernetesSystem_MaxReplicasAnnotation","KubernetesSystem_AnnotationsToSkip","ResourceControlTypeString","CONFIG","CONTAINER","NETWORK","STACK","VOLUME","CONTAINER_GROUP","ResourceControlTypeInt","_KubernetesDeployment","_KubernetesDaemonSet","VoluemMounts","getAgentShortVersion","agentVersion","numbers","DockerHubViewModel","publishedPort","_publishedPortToServicePort","KubernetesServiceHelper","generateHeadlessServiceName","KubernetesServiceCreatePayload","clusterIP","oldService","newService","computeContainerStatus","statuses","state","waiting","running","KubernetesPodConverter","tolerations","containerStatuses","computeStatus","nodeName","startTime","PodIP","podIP","imagePullPolicy","computeContainers","computeAffinity","nodeSelector","tolerationSeconds","oldPod","newPod","createPayloadFactory","KubernetesConfigurationConverter","StackViewModel","SwarmId","IsComposeFormat","ResourceControl","CreatedBy","UpdateDate","UpdatedBy","Regular","External","Orphaned","GitConfig","AdditionalFiles","AutoUpdate","ExternalStackViewModel","creationDate","OrphanedStackViewModel","OrphanedRunning","_KubernetesStorageClassAccessPolicies","selected","KubernetesStorageClassAccessPolicies","_KubernetesStorageClass","Provisioner","AllowVolumeExpansion","KubernetesStorageClass","EndpointSecurityFormData","TLS","TLSMode","TLSCACert","TLSCert","TLSKey","KubernetesIngressClass","_KubernetesNodeFormValues","_KubernetesNodeTaintFormValues","Values","IsChanged","_KubernetesNodeLabelFormValues","RegistryViewModel","BaseURL","Authentication","Password","Gitlab","Quay","Ecr","RegistryManagementConfigurationDefaultModel","registry","TLSSkipVerify","TLSCACertFile","TLSCertFile","TLSKeyFile","Region","RegistryCreateFormValues","RegistryCreateRequest","ProjectId","InstanceURL","ProjectPath","useOrganisation","organisationName","authenticationActivityTypesMap","AuthSuccess","AuthFailure","Logout","authenticationActivityTypesLabels","buildImageFullURI","imageModel","ensureTag","slash","buildImageURIForGitLab","UseOrganisation","OrganisationName","buildImageURIForQuay","buildImageURIForOtherRegistry","buildImageFullURIWithRegistry","defaultTag","factory","isValidTag","tag","createImageConfigForContainer","fromImage","getImagesNamesForDownload","images","RepoTags","removeDigestFromRepository","repository","imageContainsURL","TeamMembershipModel","UserId","UserID","TeamId","TeamID","buildLdapSettingsModel","AnonymousMode","ReaderDN","URLs","ServerType","TLSConfig","StartTLS","SearchSettings","BaseDN","Filter","UserNameAttribute","GroupSearchSettings","GroupBaseDN","GroupFilter","GroupAttribute","AdminGroupSearchSettings","AutoCreateUsers","buildAdSettingsModel","settings","buildOpenLDAPSettingsModel","ContainerGroupDefaultModel","Location","OSType","AllocatePublicIP","AccessControlData","ContainerGroupViewModel","addressPorts","properties","containerPorts","location","binding","osType","memoryInGB","Portainer","CreateContainerGroupRequest","DockerNetworkHelper","configs","Subnet","getIPV4Configs","createStatus","statusText","ContainerViewModel","State","Created","Names","NetworkSettings","Networks","ImageID","Command","Mounts","PublicPort","private","PrivatePort","public","Agent","NodeName","ContainerStatsViewModel","read","preread","memory_stats","privateworkingset","MemoryUsage","MemoryCache","NumProcs","num_procs","isWindows","stats","usage","cache","PreviousCPUTotalUsage","precpu_stats","cpu_usage","total_usage","PreviousCPUSystemUsage","system_cpu_usage","CurrentCPUTotalUsage","cpu_stats","CurrentCPUSystemUsage","CPUCores","percpu_usage","online_cpus","networks","blkio_stats","io_service_bytes_recursive","readData","op","BytesRead","writeData","BytesWrite","noIOdata","ContainerDetailsViewModel","Model","Args","Config","HostConfig","ImageViewModel","Tag","Repository","RepoDigests","digest","VirtualSize","ContainerCount","ImageBuildModel","hasError","buildLogs","line","stream","errorDetail","KubernetesNodeHelper","isSystemLabel","nodeSelectors","nodes","EndpointGroupDefaultModel","TagIds","EndpointGroupModel","UserAccessPolicies","TeamAccessPolicies","EndpointGroupCreateRequest","AssociatedEndpoints","EndpointGroupUpdateRequest","weight","storeNamespaces","updateNamespaces","namespaces","generateEnvFromEnvVariables","generateVolumesFromPersistentVolumClaims","generateEnvOrVolumesFromConfigurations","generateAffinityFromPlacements","KubernetesDeploymentCreatePayload","oldDeployment","newDeployment","KubernetesDaemonSetCreatePayload","oldDaemonSet","newDaemonSet","KubernetesStatefulSetCreatePayload","oldSFS","newSFS","_KubernetesPersistentVolumeClaim","_KubernetesVolume","KubernetesVolume","services","rawApp","clear","sessionStorage","save","setItem","getItem","AccessViewerPolicyModel","policy","roles","team","EndpointName","RoleId","RoleName","RolePriority","Priority","TeamName","AccessLocation","authenticationMethodTypesMap","INTERNAL","LDAP","OAUTH","authenticationMethodTypesLabels","capDesc","SETPCAP","MKNOD","AUDIT_WRITE","CHOWN","NET_RAW","DAC_OVERRIDE","FOWNER","FSETID","KILL","SETGID","SETUID","NET_BIND_SERVICE","SYS_CHROOT","SETFCAP","SYS_MODULE","SYS_RAWIO","SYS_PACCT","SYS_ADMIN","SYS_NICE","SYS_RESOURCE","SYS_TIME","SYS_TTY_CONFIG","AUDIT_CONTROL","MAC_ADMIN","MAC_OVERRIDE","NET_ADMIN","SYSLOG","DAC_READ_SEARCH","LINUX_IMMUTABLE","NET_BROADCAST","IPC_LOCK","IPC_OWNER","SYS_PTRACE","SYS_BOOT","LEASE","WAKE_ALARM","BLOCK_SUSPEND","ContainerCapabilities","ContainerCapability","capability","cap","allowed","ResourceControlOwnershipParameters","adminOnly","publicOnly","users","teams","subResources","AdministratorsOnly","Users","Teams","SubResourceIDs","browseGetResponse","file","KubernetesStackHelper","stack","KubernetesStack","async","$allSettled","promises","rejected","Promise","allSettled","reason","PortainerEndpointTagHelper","tags","ids","filteredTags","VolumeViewModel","CreatedAt","Driver","Options","Mountpoint","ResourceID","ScheduleCreateRequest","Recurring","CronExpression","Endpoints","FileContent","File","ScheduleUpdateRequest","_KubernetesConfigMapCreatePayload","_KubernetesConfigMapUpdatePayload","KubernetesNamespaceConverter","phase","isDefaultSystemNamespace","systemLabel","KubernetesNamespaceCreatePayload","resourcePoolOwner","pathType","KubernetesEndpointAnnotationLeader","_KubernetesEndpoint","HolderIdentity","Subsets","KubernetesEndpoint","_KubernetesEndpointSubset","Ips","KubernetesEndpointSubset","KubernetesConfigMapHelper","accesses","KubernetesDeploymentHistoryHelper","ownerReferences","rsList","sameLabelsRS","controlledRS","_isControlledBy","rsListOriginal","current","revision","filteredRS","findCreateResources","newResources","oldResources","findDeleteResources","findUpdateResources","newResource","oldResource","patches","change","isEqual","doGetResourcesSummary","action","actionFilter","resource","getResourcesSummary","isArray","UserViewModel","UserTheme","AuthenticationMethod","UserTokenModel","userId","prefix","dateCreated","lastUsed","ResourceGroupViewModel","subscriptionId","SubscriptionId","SubscriptionViewModel","displayName","ConfigViewModel","UpdatedAt","Index","Spec","decodeURIComponent","charCodeAt","join","b64DecodeUnicode","NetworkViewModel","Scope","Attachable","Internal","IPAM","Ingress","ConfigFrom","ConfigOnly","NodeViewModel","originalKey","originalValue","added","engineLabels","Engine","EngineLabels","Hostname","PlatformArchitecture","PlatformOS","CPUs","Resources","NanoCPUs","MemoryBytes","EngineVersion","Plugins","Addr","ManagerStatus","Leader","Reachability","ManagerAddr","SecretViewModel","ServiceViewModel","runningTasks","allTasks","Tasks","TaskTemplate","ContainerSpec","Mode","Replicated","Replicas","Running","LimitNanoCPUs","LimitMemoryBytes","Reservations","ReservationNanoCPUs","ReservationMemoryBytes","RestartPolicy","RestartCondition","Condition","RestartDelay","Delay","RestartMaxAttempts","MaxAttempts","RestartWindow","Window","LogDriver","LogDriverName","LogDriverOpts","Constraints","Placement","Preferences","Platforms","containerSpec","ContainerLabels","Arguments","Dir","User","Groups","TTY","OpenStdin","ReadOnly","StopSignal","StopGracePeriod","HealthCheck","DNSConfig","Secrets","Configs","Endpoint","Runtime","VirtualIPs","UpdateConfig","UpdateParallelism","Parallelism","UpdateDelay","UpdateFailureAction","FailureAction","UpdateOrder","Order","RollbackConfig","Scale","EditName","TaskViewModel","Updated","Slot","DesiredState","ServiceID","NodeId","NodeID","ContainerStatus","ContainerID","ContainerId","StoridgeDriveModel","driveid","Use","use","drivestatus","size","Device","device","StoridgeNodeModel","role","StoridgeNodeDetailedModel","condition","Domain","domain","DomainID","domainID","FreeBandwidth","freeBandwidth","FreeCapacity","freeCapacity","FreeIOPS","freeIOPS","Hdds","hdds","MetadataVersion","metadataVersion","Nodes","ProvisionedBandwidth","provisionedBandwidth","ProvisionedCapacity","provisionedCapacity","ProvisionedIOPS","provisionedIOPS","Ssds","ssds","TotalBandwidth","totalBandwidth","TotalCapacity","totalCapacity","TotalIOPS","totalIOPS","UsedBandwidth","usedBandwidth","UsedCapacity","usedCapacity","UsedIOPS","usedIOPS","Vdisks","vdisks","StoridgeSnapshotModel","identifier","SourceID","sourceid","Source","StoridgeVolumeModel","Allocated","allocated","IOPSMax","maximumIOPS","IOPSMin","minimumIOPS","BandwidthMin","minimumBandwidth","BandwidthMax","maximumBandwidth","LocalDriveOnly","localDriveOnly","nodeid","provisioning","redundancy","Uuid","uuid","Vdisk","vdisk","ipaddr","DriveType","driveType","Encryption","snapInterval","maximumSnapshots","StoridgeVolumeUpdateModel","opts","iopsmin","iopsmax","bandwidthmin","bandwidthmax","_KubernetesPortMappingPort","_KubernetesPortMapping","Expanded","Highlighted","_KubernetesSecretCreatePayload","_KubernetesSecretUpdatePayload","_KubernetesApplicationSecret","KubernetesStorageClassConverter","provisioner","allowVolumeExpansion","KubernetesStorageClassCreatePayload","oldStorageClass","newStorageClass","KubernetesVolumeConverter","claim","pool","KubernetesDaemonSetHistoryHelper","crList","sameLabelsCR","controlledCR","KubernetesStatefulSetHistoryHelper","_KubernetesHorizontalPodAutoScaler","_KubernetesNodeCreatePayload","_KubernetesNodeTaintPayload","PortainerEndpointInitFormValues","ConnectionType","TLSSKipClientVerify","AzureApplicationId","AzureTenantId","AzureAuthenticationKey","PortainerEndpointInitFormValueEndpointSection","title","classes","Title","Classes","PortainerEndpointInitFormValueEndpointSections","SettingsViewModel","LogoURL","BlackListedLabels","LDAPSettings","OAuthSettings","OAuthSettingsViewModel","TemplatesURL","EdgeAgentCheckinInterval","EnableEdgeComputeFeatures","FeatureFlagSettings","UserSessionTimeout","EnableTelemetry","KubeconfigExpiry","HelmRepositoryURL","PublicSettingsViewModel","OAuthLoginURI","OAuthLogoutURI","LDAPSettingsViewModel","LDAPSearchSettings","UsernameAttribute","LDAPGroupSearchSettings","ClientID","ClientSecret","AccessTokenURI","AuthorizationURI","ResourceURI","RedirectURI","UserIdentifier","Scopes","OAuthAutoCreateUsers","DefaultTeamID","SSO","LogoutURI","StatusViewModel","Snapshot","Edition","InstanceID","StatusVersionViewModel","UpdateAvailable","LatestVersion","TagViewModel","TeamViewModel","getProviderByUrl","providerAuthURL","microsoft","authUrl","accessTokenUrl","resourceUrl","logoutUrl","origin","userIdentifier","scopes","google","github","custom","gitlabResponseGetLink","headers","next","error","KubernetesApplicationQuotaDefaults","NOT_IN","DOES_NOT_EXIST","GREATER_THAN","LOWER_THAN","dimensions","categories","$analyticsProvider","$windowProvider","$window","$get","args","_paq","setCustomDimension","dimensionId","deleteCustomDimension","pageTracking","trackRelativePath","api","setPortainerStatus","instanceID","version","setUserRole","clearUserRole","setUserEndpointRole","clearUserEndpointRole","setCustomVariable","varIndex","varName","scope","deleteCustomVariable","trackSiteSearch","keyword","category","searchCount","params","isDefined","trackGoal","goalID","revenue","trackLink","linkType","registerSetUsername","username","registerPageTrack","document","registerEventTrack","parsed","Error","metadataString","kebabCasedMetadata","fromEntries","registerExceptionTrack","createModule","createEdgeStackView","edgeStacksDockerComposeForm","kubeManifestForm","kubeDeployDescription","CreateEdgeStackViewController","$state","ModalService","EdgeStackService","EdgeGroupService","EdgeTemplateService","Notifications","FormHelper","$async","StackFileContent","StackFile","RepositoryURL","RepositoryReferenceName","RepositoryAuthentication","RepositoryUsername","RepositoryPassword","ComposeFilePathInRepository","Method","formValidationError","actionInProgress","StackType","isEditorDirty","hasKubeEndpoint","endpointTypes","edgeGroups","createStack","validateForm","createStackByMethod","createStackFromFileContent","createStackFromFileUpload","createStackFromGitRepository","onChangeGroups","hasDockerEndpoint","onChangeDeploymentType","buildAnalyticsProperties","method","methodLabel","templateName","selectedTemplate","uiCanExit","confirmWebEditorDiscard","noGroups","onbeforeunload","$onDestroy","success","go","checkIfEndpointTypes","EndpointTypes","EdgeGroups","repositoryOptions","FilePathInRepository","deploymentType","formIsInvalid","form","$invalid","DockerComposeFormController","methodOptions","onChangeFileContent","onChangeFile","onChangeTemplate","onChangeMethod","onChangeFormValues","fileContent","edgeTemplate","templates","edgeTemplates","KubeManifestFormController","rolesView","RolesController","RoleService","accessViewer","AccessViewerController","featureService","UserService","EndpointService","GroupService","TeamService","TeamMembershipService","limitedFeature","onUserSelect","userRoles","user","selectedUser","userMemberships","teamMemberships","getRoleFromUserEndpointPolicy","getRoleFromUserEndpointGroupPolicy","getRoleFromTeamEndpointPolicies","getRoleFromTeamEndpointGroupPolicies","findLowestRole","policies","policyRoles","accessPolicy","groupUserAccessPolicies","memberships","membership","groupTeamAccessPolicies","isLimitedToBE","accessViewerDatatable","titleText","titleIcon","tableKey","orderBy","dataset","RolesDatatableController","$controller","$scope","extend","isDefaultItem","rolesData","RolesFactory","$resource","API_ENDPOINT_ROLES","ignoreLoadingBar","query","update","remove","SidebarMenuController","forceOpen","isOpen","isSidebarOpen","isOpenByPathState","currentName","childrenPaths","onClickArrow","stopPropagation","preventDefault","$onInit","sidebarSection","transclude","gitFormComposePathField","gitFormRefField","gitForm","gitFormUrlField","gitFormInfoPanel","gitFormAdditionalFilesPanel","gitFormAdditionalFileItem","gitFormAutoUpdateFieldset","gitFormAuthFieldset","deployMethod","additionalFile","autoUpdate","showAuthExplanation","GitFormController","onChangeField","onChangeURL","onChangeRefName","onChangeComposePath","field","GitFormComposeAuthFieldsetController","authValues","password","onChangeAuth","onChangeUsername","onChangePassword","auth","GitFormAutoUpdateFieldsetController","add","onChangeVariable","onRemove","GitFormAdditionalFileItemController","onChangePath","removeValue","formName","clipboard","onChangeAutoUpdate","onChangeMechanism","onChangeInterval","copyWebhook","copyText","RepositoryWebhookURL","$","show","fadeOut","configFilePath","additionalFiles","className","porAccessManagement","porAccessManagementUsersSelector","controllerAs","accessControlledEntity","inheritFrom","entityType","updateAccess","filterUsers","webEditorForm","fileUploadForm","placeholder","yml","WebEditorFormController","editorUpdate","cm","getValue","ngRequired","authenticationModule","generalModule","ldapModule","internalAuth","saveAuthSettingsButton","autoUserProvisionToggle","LDAPService","ldapConnectivityCheck","ldapGroupsDatatable","ldapSettings","adSettings","ldapGroupSearch","ldapGroupSearchItem","ldapUserSearch","ldapUserSearchItem","ldapSettingsCustom","ldapSettingsDnBuilder","ldapSettingsGroupDnBuilder","ldapCustomGroupSearch","ldapCustomAdminGroup","ldapSettingsOpenLdap","ldapSettingsSecurity","ldapSettingsTestLogin","ldapCustomUserSearch","ldapUsersDatatable","tlscaCert","connectivityCheck","onSaveSettings","saveButtonState","isLdapFormValid","AdSettingsController","domainSuffix","limitedFeatureId","onTlscaCertChange","searchUsers","searchGroups","parseDomainName","onAccountChange","account","domainName","parts","part","addLDAPUrl","removeLDAPUrl","isSaveSettingButtonDisabled","SERVER_TYPES","OPEN_LDAP","AD","LdapSettingsController","settingsDrafts","boxSelectorOptions","onChangeServerType","serverType","search","LdapSettingsCustomController","onSearchUsersClick","onSearchGroupsClick","saveButtonDisabled","LdapSettingsOpenLDAPController","findDomainSuffix","parseDomainSuffix","serviceAccount","searchSettings","string","reverseOrder","baseFilter","onSearchClick","LdapGroupSearchController","onRemoveClick","onAddClick","lastSetting","showTable","LdapSettingsAdGroupSearchItemController","onChangeBaseDN","baseDN","addGroup","removeGroup","$index","onGroupsChange","groupsFilter","onFilterChange","parseGroupFilter","groupFilter","showUsernameFormat","LdapUserSearchController","LdapUserSearchItemController","onBaseDNChange","onGroupChange","generateUserFilter","filteredGroups","parseFilter","members","member","suffix","LdapSettingsBaseDnBuilderController","addEntry","removeEntry","onEntriesChange","moveUp","arrayMove","moveDown","dn","concat","getOUValues","regex","ouValues","parseBaseDN","$onChanges","isFirstChange","fromIndex","toIndex","checkValidIndex","LdapSettingsGroupDnBuilderController","groupName","onGroupNameChange","groupNameEntry","parseEntries","$onChange","LdapCustomGroupSearchController","LdapCustomAdminGroupController","groupstest","enableAssignAdminGroup","AdminAutoPopulate","AdminGroups","defaultAdminGroupSearchFilter","adminGroups","uploadInProgress","TEST_STATUS","LOADING","SUCCESS","FAILURE","LdapSettingsTestLogin","testStatus","testLogin","valid","LdapCustomUserSearchController","$promise","cnName","check","limitedFeatureClass","sslCertificate","SslCertificateController","SSLService","cert","originalValues","forceHTTPS","certFile","keyFile","reloadingPage","certFilePattern","keyFilePattern","isFormChanged","httpEnabled","upload","resolve","setTimeout","reload","wasHTTPsChanged","certInfo","limitedFeatureDirective","restrict","link","elem","attrs","limitedFeatureDir","featureId","limitedFeatureAttrs","attr","selectShow","hide","currentValue","currentEdition","features","init","FEATURE_IDS","$stateRegistryProvider","register","views","authLogsViewModule","activityLogsViewModule","authLogsView","authLogsDatatable","AuthLogsViewController","from","to","desc","contextFilter","typeFilter","page","limit","totalItems","today","endOf","minValidDate","subtract","startOf","onChangeDate","onChangeKeyword","onChangeSort","onChangeContextFilter","onChangeTypeFilter","loadLogs","onChangePage","onChangeLimit","filterKey","filterState","startDate","endDate","totalCount","currentPage","ActivityLogsDatatableController","PaginationService","contextFilterLabels","typeFilterLabels","changeSort","handleChangeLimit","contextType","context","activityType","isAuthSuccess","isAuthFailure","setPaginationLimit","$onInitGeneric","getPaginationLimit","activityLogsDatatable","activityLogsView","ActivityLogsViewController","UserActivityService","saveLogsAsCSV","FileUploaderController","onFileSelected","onFileSelectedAsync","uploadFile","HostBrowserController","HostBrowserService","FileSaver","goToParent","browse","confirmDeleteFile","isRoot","getRelativePath","getFilesForPath","getFilesForPathAsync","downloadFile","downloadFileAsync","renameFile","renameFileAsync","deleteFile","deleteFileAsync","onFileSelectedForUpload","onFileSelectedForUploadAsync","rootPathRegex","parentPath","buildPath","files","ls","newName","filePath","newFilePath","rename","fileName","downloadData","Blob","saveAs","confirmDeletion","confirmed","delete","parent","lastIndexOf","onFileUploaded","refreshList","NodeSelectorController","AgentService","agents","VolumeBrowserController","HttpRequestHelper","VolumeBrowserService","renameAsync","confirmDelete","download","downloadAsync","up","volumeId","parentFolder","setPortainerAgentTargetHeader","AgentViewModel","NodeRole","LocationViewModel","DisplayName","ContainerInstanceProviderViewModel","containerGroupType","resourceTypes","resourceType","Locations","locations","ContainerInstanceDetailsController","AzureService","ContainerGroupService","ResourceGroupService","SubscriptionService","loading","subscription","resourceGroup","resourceGroupId","containerGroupId","parseId","containerGroup","porImageRegistryContainerController","DockerHubService","pullRateLimits","registryId","fetchRateLimits","setValidity","isAgentEndpoint","isLocalEndpoint","checkRateLimits","remaining","console","MacvlanFormData","SelectedNetworkConfig","DatatableState","selectedItems","ParentNetworkCard","VolumesCIFSFormData","useCIFS","serverAddress","share","versions","versionsNumber","VolumesNFSFormData","useNFS","mountPoint","EventViewModel","Time","time","Details","eventAttr","Actor","Attributes","details","Action","extra","hasColon","exitCode","createEventDetails","ImageDetailsViewModel","Parent","DockerVersion","Os","Author","Cmd","Entrypoint","ContainerConfig","ExposedPorts","ImageLayerViewModel","order","Comment","Tags","PluginViewModel","Enabled","SwarmViewModel","imageGetResponse","DockerFeaturesConfigurationController","StateManager","enableHostManagementFeatures","allowVolumeBrowserForRegularUsers","disableBindMountsForRegularUsers","disablePrivilegedModeForRegularUsers","disableHostNamespaceForRegularUsers","disableStackManagementForRegularUsers","disableDeviceMappingForRegularUsers","disableContainerCapabilitiesForRegularUsers","disableSysctlSettingForRegularUsers","isAgent","isContainerEditDisabled","securitySettings","allowBindMountsForRegularUsers","allowPrivilegedModeForRegularUsers","allowHostNamespaceForRegularUsers","allowDeviceMappingForRegularUsers","allowStackManagementForRegularUsers","allowContainerCapabilitiesForRegularUsers","allowSysctlSettingForRegularUsers","updateSecuritySettings","SecuritySettings","checkAgent","getState","agentProxy","AssociatedEndpointsDatatableController","DatatableService","extendGenericController","filteredDataSet","totalFilteredDataset","pageNumber","onPageChange","paginationChanged","changePaginationLimit","onTextFilterChange","setDefaults","prepareTableFromDataset","storedOrder","getDataTableOrder","reverse","textFilter","getDataTableTextFilters","storedFilters","getDataTableFilters","filters","open","updateKey","newPageNumber","paginatedItemLimit","filterValue","setDataTableTextFilters","start","retrievePage","then","totalFilteredDataSet","finally","EdgeJobFormController","scheduleValues","displayed","cron","datetime","scheduleValue","cronMethod","cronRegex","associateEndpoint","dissociateEndpoint","onChangeModel","defaultTime","cronToDatetime","minutes","hours","month","formAction","strings","EdgeJobResultsDatatableController","collectLogs","repeater","autoRefresh","refreshRate","onSettingsRepeaterChange","onCollectLogsClick","onDatasetChange","anyCollecting","LogsStatus","EdgeStackDeploymentTypeSelectorController","deploymentOptions","disabled","tooltip","EdgeStackEndpointsDatatableController","paginationChangedAsync","statusMap","1","2","3","EdgeStackStatusController","stackStatus","aggregateStatus","ok","acknowledged","endpointId","EditEdgeStackFormController","fileContents","onChangeComposeConfig","onChangeKubeManifest","removeLineBreaks","checkEndpointTypes","isFormValid","validateEndpointsForDeployment","oldValue","EdgeGroupFormController","getDynamicEndpointsAsync","getDynamicEndpoints","$watch","Dynamic","types","tagIds","tagsPartialMatch","PartialMatch","EdgeGroupsDatatableController","allowSelection","HasEdgeStack","CreateEdgeGroupController","TagService","loaded","createGroup","createGroupAsync","endpointGroups","all","EdgeGroupsController","removeAction","removeActionAsync","EditEdgeGroupController","updateGroup","updateGroupAsync","groupId","CreateEdgeJobViewController","$q","EdgeJobService","createEdgeJob","createAsync","createEdgeJobFromFileContent","createEdgeJobFromFileUpload","EdgeJobController","showEditorTab","updateAsync","downloadLogs","downloadLogsAsync","collectLogsAsync","clearLogs","clearLogsAsync","refresh","refreshAsync","showEditor","edgeJob","updateEdgeJob","logFile","logFileName","associateEndpointsToResults","results","jobResults","endpointIds","oldFileContent","tab","activeTab","getScriptFile","EdgeJobsViewController","deleteJobsAsync","deleteJobs","edgeJobs","EdgeStacksViewController","stacks","getStacks","EditEdgeStackViewController","deployStack","deployStackAsync","getPaginatedEndpoints","getPaginatedEndpointsAsync","stackId","stackFile","stackEndpointIds","filterStackEndpoints","originalFileContent","groupIds","updateStack","lastId","StoridgeEventModel","Category","Module","Content","content","StoridgeInfoModel","kubernetesRegistryAccessView","KubernetesRegistryAccessController","KubernetesResourcePoolService","selectedResourcePools","savedResourcePools","handleRemove","removeNamespaces","nsToUpdate","updateRegistryAccess","isSystemNamespace","abstract","kubeCustomTemplatesView","kubeEditCustomTemplateView","kubeCreateCustomTemplateView","KubeCustomTemplatesViewController","CustomTemplateService","FormValidator","currentUser","isAdmin","isEditAllowed","getTemplates","selectTemplate","templateId","CreatedByUserId","customTemplates","accessControlData","validateAccessControl","confirmDeletionAsync","getUserDetails","KubeEditCustomTemplateViewController","ResourceControlService","getTemplate","submitAction","onBeforeUnload","customTemplate","customTemplateFile","updateCustomTemplate","applyResourceControl","stripSpaces","addEventListener","returnValue","removeEventListener","KubeCreateCustomTemplateViewController","Logo","onBeforeOnload","createCustomTemplateByMethod","createCustomTemplateFromFileContent","createCustomTemplateFromFileUpload","BoxSelectorController","isChecked","limited","secrets","HelmAddRepositoryController","HelmService","EndpointProvider","doesRepoExist","repos","isAddingRepo","addHelmRepository","currentEndpoint","HelmTemplatesListController","updateCategories","annotationCategories","charts","availableCategories","clearCategory","selectedCategory","HelmTemplatesController","$analytics","$anchorScroll","installHelmchart","getHelmValues","selectHelmChart","getHelmRepoURLs","getLatestCharts","getResourcePools","contentvalues","originalvalues","appName","Repo","chart","repo","Chart","resourcePool","install","eventTrack","loadingValues","showCustomValues","reposLoading","GlobalRepository","UserRepositories","getHelmRepositories","globalRepository","userHelmReposUrls","uniqueHelmRepos","helmRepos","chartsLoading","promiseList","chartPromises","latestCharts","tp","resourcePoolsLoading","nonSystemNamespaces","viewReady","KubectlShellController","TerminalWindow","LocalStorage","shell","connected","disconnect","socket","close","dispose","terminalclose","onresize","screenClear","miniRestore","css","terminalopen","configureSocketAndTerminal","onopen","terminal_container","getElementById","setOption","focus","fit","writeln","on","send","onmessage","write","onerror","target","readyState","WebSocket","CLOSED","terminalresize","onclose","connectConsole","token","getJWT","endpointID","wsProtocol","queryParams","Terminal","applyAddon","_KubernetesDeploymentCreatePayload","strategy","rollingUpdate","maxSurge","maxUnavailable","_KubernetesDaemonSetCreatePayload","updateStrategy","_KubernetesStatefulSetCreatePayload","partition","_KubernetesPersistentVolumClaimCreatePayload","accessModes","_KubernetesServiceCreatePayload","KubernetesEventConverter","KubernetesEvent","lastTimestamp","eventTime","Message","Involved","involvedObject","_KubernetesEvent","_KubernetesNamespaceCreatePayload","_KubernetesStorageClassCreatePayload","KubernetesEndpointConverter","leaderAnnotation","parsedJson","holderIdentity","subsets","subset","KubernetesApplicationRollbackHelper","targetRevision","_getDeploymentPayload","_getDaemonSetPayload","_getStatefulSetPayload","deploymentApp","_","KubernetesHistoryHelper","rawRevisions","currentRevision","revisionsList","_getDeploymentRevisions","_getDaemonSetRevisions","_getStatefulSetRevisions","appRS","filterOwnedRevisions","getCurrentRevision","filterVersionedRevisions","appCR","_KubernetesStack","_KubernetesHorizontalPodAutoScalerCreatePayload","KubernetesNodesLimits","nodesLimits","MaxCPU","MaxMemory","convertCPU","calculateMaxCPUMemory","nodesLimitsArray","overflowForReplica","instances","overflowForGlobal","overflow","excludesPods","cpuLimit","memoryLimit","KubernetesHelmApplicationController","dataLoading","releases","listReleases","release","app_version","getHelmApplication","KubernetesCreateResourcePoolController","KubernetesNodeService","KubernetesIngressService","IngressClassTypes","LBQuotaFeatureId","StorageQuotaFeatureId","onChangeIngressHostname","duplicates","ingressHosts","hosts","hostnames","hostnamesWithoutRemoved","allHosts","allIngresses","formDuplicates","getDuplicates","count","hostFV","hostIdx","addHostname","removeHostname","addAnnotation","removeAnnotation","isCreateButtonDisabled","isQuotaValid","isAlreadyExist","onChangeName","sliderMaxCpu","sliderMaxMemory","checkDefaults","createResourcePool","getIngresses","getRegistries","canUseIngress","Kubernetes","Configuration","ingressClasses","ingressClassesToFormValues","getCreatedApplicationResources","applicationFormValuesToApplication","applicationFormValuesToIngresses","getIngressUpdateSummary","persistentVolumeClaimResources","applicationFormValuesToModel","appResourceType","getApplicationResourceType","oldIngresses","newIngresses","newIng","oldIngress","newIngress","patchPayload","getIngressUpdateResourceSummary","getServiceUpdateResourceSummary","oldFormValues","newFormValues","oldApp","oldHeadlessService","oldClaims","newApp","newHeadlessService","newClaims","oldAppResourceType","newAppResourceType","createdApplicationResourceSummary","headlessServiceUpdateResourceSummary","claimSummaries","getVolumeClaimUpdateResourceSummary","serviceUpdateResourceSummary","newKind","newAutoScaler","oldKind","oldAutoScaler","hpaUpdateSummary","oldHorizontalPodAutoScaler","newHorizontalPodAutoScaler","getHorizontalPodAutoScalerUpdateResourceSummary","getUpdatedApplicationResources","newNamespace","formValuesToResourcePool","oldNamespace","AccessControlPanelData","Ownership_Users","Ownership_Teams","AssoicatedEndpointsSelectorController","available","associated","getEndpoints","getEndpointsAsync","getAssociatedEndpoints","getAssociatedEndpointsAsync","loadData","getPaginationData","setTableData","noEndpoints","onAssociate","onDissociate","tableType","BeIndicatorController","limitedToBE","BoxSelectorItemController","handleChange","formCtrl","$setValidity","option","CopyButtonController","isFading","copyValueText","CustomTemplateCommonFieldsController","platformTypes","templateTypes","CustomTemplateSelectorController","handleChangeTemplate","stackType","AccessTokensDatatableController","DatatableColumnsVisibilityController","DatatableFilterController","isEnabled","onChangeItem","datatableFilter","datatableTitlebar","datatableSearchbar","datatableSortIcon","selectedSortKey","datatableSortIconController","isCurrentSortOrder","datatablePagination","enableNoLimit","UsersDatatableController","EndpointItemController","editEndpoint","onEdit","joinTags","tagNames","idsToTagNames","isEdgeEndpoint","calcIsCheckInValid","checkInInterval","EdgeCheckinInterval","endpointInitTime","LastCheckInDate","endpointTags","isCheckInValid","EnvironmentVariablesPanelController","editorText","switchEnvMode","handleSimpleChange","EnvironmentVariablesSimpleModeItemController","onChangeValue","hasValue","EnvironmentVariablesSimpleModeController","addFromFile","getTextFromFile","reject","temporaryFileReader","FileReader","readAsText","onload","GroupFormController","getPaginatedEndpointsByGroup","allowCreateTag","pageType","associatedEndpoints","addEndpoint","reloadTablesContent","catch","removeEndpoint","endpointsByGroup","availableEndpoints","KubernetesAppGitFormController","StackService","saveGitSettingsInProgress","redeployInProgress","showConfig","isEdit","RefName","onChangeRef","confirmAsync","buttons","confirm","updateKubeGit","updateKubeStack","isSubmitButtonDisabled","ReferenceName","KubernetesRedeployAppGitFormController","WebhookHelper","hasUnsavedChanges","RepositoryAutomaticUpdates","RepositoryMechanism","RepositoryFetchInterval","toJson","savedFormValues","repositoryAutomaticUpdates","repositoryMechanism","automaticUpdatesLabel","Interval","Webhook","returnStackWebhookUrl","PorSwitchController","StackRedeployGitFormController","inProgress","onChangeEnvVar","automaticUpdates","autoSyncLabel","updateGit","removeInvalidEnvVars","updateGitStackSettings","isAutoUpdateChanged","wasEnabled","ThemeSettingsController","ThemeManager","setTheme","updateUserTheme","userTheme","themeInProgress","theme","autoTheme","initTheme","defaultTheme","availableThemes","GenericHelper","child","findDeepAll","RegistryGitlabProject","project","PathWithNamespace","path_with_namespace","RegistryEnabled","container_registry_enabled","MotdViewModel","Hash","Style","ContentLayout","RegistryRepositoryViewModel","TagsCount","RegistryRepositoryGitlabViewModel","TemplateViewModel","setTemplatesV2","AdministratorOnly","note","Categories","platform","logo","RegistryModel","command","Network","Privileged","privileged","Interactive","interactive","restart_policy","envvar","default","preset","select","allowedValue","templateEnv","readonly","templateVolumes","portAndProtocol","hostAndContainerPort","hostPort","templatePorts","WebhookViewModel","Token","EndpointID","WebhookType","OAuthProviderSelectorController","OAuthSettingsController","provider","overrideConfiguration","microsoftTenantID","onSelectProvider","onMicrosoftTenantIDChange","useDefaultProviderConfiguration","updateSSO","addTeamMembershipMapping","removeTeamMembership","tenantID","providerId","providers","HideInternalAuth","TeamMemberships","OAuthClaimMappings","ClaimValRegex","Team","isOAuthTeamMembershipFormValid","OAuthAutoMapTeamMemberships","OAuthClaimName","getEndpointsTotalCount","CreateUserAccessTokenController","onSubmit","onError","accessToken","createAccessToken","heading","CreateCustomTemplateViewController","fromStack","templateNameRegex","createCustomTemplate","createCustomTemplateAsync","createCustomTemplateFromGitRepository","newValues","applicationState","endpointMode","CustomTemplatesViewController","$rootScope","NetworkService","DOCKER_STANDALONE","DOCKER_SWARM_MODE","showAdvancedOptions","isEditorVisible","deployable","getTemplatesAsync","removeTemplates","removeTemplatesAsync","createStackAsync","selectTemplateAsync","unselectTemplate","unselectTemplateAsync","getNetworks","getNetworksAsync","confirmDeleteAsync","stackName","createAction","createSwarmStackFromFileContent","createComposeStackFromFileContent","availableNetworks","isDeployable","templateType","EditCustomTemplateViewController","getTemplateAsync","submitActionAsync","CreateRegistryController","RegistryService","RegistryGitlabService","gitlab","originViewReference","createRegistry","retrieveGitlabRegistries","createGitlabRegistries","useDefaultQuayConfiguration","selectQuayRegistry","useDefaultGitlabConfiguration","selectGitlabRegistry","selectAzureRegistry","selectProGetRegistry","selectCustomRegistry","selectDockerHub","useDefaultEcrConfiguration","selectEcr","gitlabProjects","projects","$transition$","originalTransition","WizardViewController","manageLocalEndpoint","addRemoteEndpoint","createLocalKubernetesEndpoint","local","kubernetesError","createLocalEndpoint","remote","createLocalDockerEndpoint","addedLocalEndpoint","WizardEndpointsController","updateEndpoint","addAnalytics","updateEndpoints","startWizard","selections","maxStep","section","currentStep","stage","nextStep","environment","analytics","docker","kubernetes","aci","previousStep","counter","localEndpoint","dockerApi","dockerAgent","kubernetesAgent","aciApi","endpointSelect","dockerActive","kubernetesActive","aciActive","nameClass","selectOption","WizardAciController","NameValidator","addAciEndpoint","azureApplicationId","azureTenantId","azureAuthenticationKey","validateEnvironmentName","createAzureEndpoint","clearForm","onUpdate","onAnalytics","endpointType","availableOptions","WizardDockerController","$filter","copyLinuxCommand","linuxCommand","copyWinCommand","winCommand","copyLinuxSocket","linuxSocket","copyWinSocket","winSocket","securityFormData","connectEnvironment","publicUrl","overrideUrl","socketPath","securityData","socketUrl","overrideSocket","creationType","addDockerAgentEndpoint","addDockerApiEndpoint","addDockerLocalEndpoint","tsl","tls","tlsSkipVerify","skipCertification","tlsSkipClientVerify","tlsCaFile","tlsCertFile","tlsKeyFile","publicURL","createRemoteEndpoint","environmentUrl","dockerApiurl","overrodeSocket","ConnectSocket","agentShortVersion","WizardKubernetesController","addKubernetesAgent","copyLoadBalancer","copyNodePort","RootProvider","children","react2angular","Component","propNames","Controller","$element","el","props","prop","toProps","ReactDOM","render","unmountComponentAtNode","Loading","LoadingAngular","Context","createContext","useWidgetContext","useContext","Widget","Provider","WidgetBody","clsx","requires","Tooltip","position","styles","aria-hidden","data-tip","multiline","place","arrowColor","FormControl","inputId","errors","htmlFor","BaseInput","required","rows","TextInput","Button","color","onClick","sizeClass","FormSectionTitle","TextTip","Code","CopyButton","fadeDelay","displayText","useState","setIsFading","useEffect","fadeoutTime","clearTimeout","writeText","inputEl","createElement","body","appendChild","execCommand","removeChild","CreateAccessTokenAngular","router","useRouter","setDescription","errorText","setErrorText","isLoading","setIsLoading","setAccessToken","rawAPIKey","stateService","Link","ReactExampleAngular","route","useSref","href","widgetModule","sidebarModule","gitFormModule","porAccessManagementModule","formComponentsModule","rolesDatatable","sidebarMenu","sidebarMenuItem","iconClass","pathParams","currentState","selectedAdminGroups","isLimitedFeatureSelfContained","showBeIndicatorIfNeeded","directive","UI_ROUTER_REACT_HYBRID","analyticsModule","req","u","g","getElementsByTagName","parentNode","insertBefore","autoNgTemplateLoaderTemplate2","autoNgTemplateLoaderTemplate3","containerInstances","containerInstanceCreation","dashboard","onEnter","setEndpointID","setEndpointPublicURL","PublicURL","setOfflineModeFromStatus","updateEndpointState","autoNgTemplateLoaderTemplate4","autoNgTemplateLoaderTemplate5","autoNgTemplateLoaderTemplate6","autoNgTemplateLoaderTemplate7","autoNgTemplateLoaderTemplate8","autoNgTemplateLoaderTemplate9","autoNgTemplateLoaderTemplate10","autoNgTemplateLoaderTemplate11","autoNgTemplateLoaderTemplate12","autoNgTemplateLoaderTemplate13","autoNgTemplateLoaderTemplate14","autoNgTemplateLoaderTemplate15","autoNgTemplateLoaderTemplate16","autoNgTemplateLoaderTemplate17","autoNgTemplateLoaderTemplate18","autoNgTemplateLoaderTemplate19","autoNgTemplateLoaderTemplate20","autoNgTemplateLoaderTemplate21","autoNgTemplateLoaderTemplate22","autoNgTemplateLoaderTemplate23","autoNgTemplateLoaderTemplate24","autoNgTemplateLoaderTemplate25","autoNgTemplateLoaderTemplate26","autoNgTemplateLoaderTemplate27","autoNgTemplateLoaderTemplate28","autoNgTemplateLoaderTemplate29","autoNgTemplateLoaderTemplate30","autoNgTemplateLoaderTemplate31","autoNgTemplateLoaderTemplate32","autoNgTemplateLoaderTemplate33","autoNgTemplateLoaderTemplate34","autoNgTemplateLoaderTemplate35","autoNgTemplateLoaderTemplate36","autoNgTemplateLoaderTemplate37","autoNgTemplateLoaderTemplate38","autoNgTemplateLoaderTemplate39","LegacyExtensionManager","SystemService","ping","checkEndpointStatus","updateEndpointStatus","Snapshots","Swarm","extensions","initEndpointExtensions","configCreation","containerAttachConsole","containerExecConsole","containerCreation","containerInspect","containerLogs","containerStats","imageBuild","imageImport","networkCreation","secretCreation","serviceCreation","serviceLogs","stackCreation","swarm","swarmVisualizer","task","taskLogs","volumeBrowse","volumeCreation","edgeStackModule","isTransitionRequiresAuthentication","transition","nextTransition","nextTransitionName","componentsModule","settingsModule","featureFlagModule","userActivityModule","root","authManager","loggedIn","checkAuthOnRefresh","$on","initAuthentication","initialize","featuresServiceInitialized","authentication","logout","performApiLogout","endpointKubernetesConfiguration","endpointCreation","endpointAccess","groupCreation","groupAccess","home","initEndpoint","initAdmin","settingsAuthentication","EdgeID","run","put","html","webpackContext","webpackContextResolve","code","isUploadAllowed","isUploadEnabled","AgentFactory","API_ENDPOINT_ENDPOINTS","getAgentApiVersion","BrowseFactory","transformResponse","responseType","AgentDockerhub","HostFactory","info","AgentPingFactory","interceptor","instance","Number","responseError","AgentServiceFactory","AgentVersion1","agentApiVersion","hostInfo","HostBrowserServiceFactory","Browse","Upload","newPath","CurrentFilePath","NewFilePath","onProgress","AgentPingService","AgentPing","VolumeBrowserServiceFactory","BrowseVersion1","getBrowseService","volumeID","$interval","cfpLoadingBar","$transitions","defaultTitle","originalSet","set","arguments","onBefore","resetAgentHeaders","ajaxSend","jqXhr","jqOpts","hasNoContentType","contentType","setRequestHeader","applicationId","tenantId","authenticationKey","$http","withResourceGroup","resourceGroupName","containerGroupName","providerNamespace","Azure","ProviderService","retrieveResourcesForEachSubscription","subscriptions","resourceQuery","deferred","defer","resourceQueries","promise","deleteContainerGroup","createContainerGroup","containerInstanceProvider","resourceGroups","containerGroups","aggregate","resourcesBySubcription","aggregatedResources","ContainerGroup","ResourceGroup","Subscription","deleteAction","actionCount","allResourceGroups","allProviders","newResourceGroup","updateResourceGroupsAndLocations","selectedResourceGroup","currentSubLocations","selectedSubscription","changeSubscription","addPortBinding","removePortBinding","every","containerInstancesProviders","$urlRouterProvider","$httpProvider","localStorageServiceProvider","jwtOptionsProvider","$uibTooltipProvider","$compileProvider","cfpLoadingBarProvider","setPrefix","tokenGetter","interceptors","post","patch","request","portainerAgentTargetHeader","portainerAgentManagerOperation","toastr","timeOut","closeButton","progressBar","tapToDismiss","setTriggers","mouseenter","click","outsideClick","includeSpinner","parentSelector","latencyThreshold","otherwise","capabilities","containerId","taskId","ctrl","editModel","maximumRetryCount","updateRestartPolicy","agentCount","refreshCallback","joinNetworkAction","joinNetworkActionInProgress","leaveNetworkActionInProgress","leaveNetworkAction","expandedItems","expandAll","expandItem","expanded","itemCanExpand","GlobalIPv6Address","hasExpandableItems","storedSettings","getDataTableSettings","headerset","selectedItemCount","noStoppedItemsSelected","noRunningItemsSelected","noPausedItemsSelected","showAddAction","ContainerService","executeActionOnContainerList","successMessage","errorMessage","startAction","startContainer","stopAction","stopContainer","restartAction","restartContainer","killAction","killContainer","pauseAction","pauseContainer","resumeAction","resumeContainer","isOneContainerRunning","confirmContainerDeletion","cleanVolumes","removeSelectedContainers","showHostColumn","offlineMode","notAutoFocus","endpointPublicURL","truncateContainerName","containerNameTruncateSize","showQuickActionStats","showQuickActionLogs","showQuickActionExec","showQuickActionInspect","showQuickActionAttach","columnVisibility","columns","display","actions","created","onColumnVisibilityChange","setColumnVisibilitySettings","onSelectionChanged","updateSelectionState","updateSelectionStateBasedOnItemStatus","applyFilters","onStateFilterChange","filtered","onSettingsContainerNameTruncateChange","setDataTableSettings","onSettingsQuickActionChange","availableStateFilters","updateStoredFilters","datasetFilters","existingFilter","storedColumnVisibility","getColumnVisibilitySettings","downloadAction","forceRemoveAction","exportInProgress","showUsedImages","showUnusedImages","onstateFilterChange","setDataTableFilters","showIpAddressColumn","accessToNodeDetails","parentCtrl","allowCheckbox","allowExpand","NetworkHelper","disableRemove","isSystemNetwork","Subs","serviceId","showTaskLogsButton","showQuickActionConsole","showUpdateAction","ServiceService","ServiceHelper","ImageHelper","WebhookService","scaleAction","serviceToConfig","webhooks","when","deleteWebhook","updateAction","confirmServiceForceUpdate","pullImage","ForceUpdate","forceUpdateServices","showStackColumn","expandPreviouslyExpandedItem","storedExpandedItems","storedId","setDataTableExpandedItems","expandItems","expandedItemCount","onDataRefresh","getDataTableExpandedItems","showSlotColumn","showLogsButton","showBrowseAction","showUsedVolumes","showUnusedVolumes","dangling","endpointApiVersion","swarmManagement","standaloneManagement","adminAccess","currentRouteName","showStacks","hostDetails","engineDetails","devices","disks","refreshUrl","browseUrl","hostFeaturesEnabled","engine","isBrowseEnabled","onSave","availability","removeLabel","onChangedLabels","updateLabel","NodeService","LabelHelper","managerAddress","hasChanges","addLabel","nodeLabels","updateNodeLabels","updateNodeAvailability","saveChanges","originalNode","fromKeyValueToLabelHash","updateNode","cancelChanges","isDockerHubRegistry","isAuthenticated","rateLimitExceeded","porImageRegistryController","ImageService","onRegistryChange","onImageChange","defaultRegistry","isKnownRegistry","getRegistryURL","prepareAutocomplete","registryImages","reg","imagesWithoutKnown","availableImages","displayedRegistryURL","showDefaultRegistry","localeCompare","autoComplete","getUniqueTagListFromImages","reloadRegistries","loadImages","labelClass","inputClass","displayTimestamps","logCollectionChange","sinceTimestamp","lineCount","resourceName","availableSinceDatetime","copySupported","supported","logCollection","autoScroll","wrapLines","filteredLogs","selectedLines","copySelection","clearSelection","selectLine","requiredNodeSelection","requiredConfigSelection","includeString","val","hash","hashToHexColor","strToHash","labelStyle","Dead","Ghost","Paused","imageName","ConstraintsHelper","availableNodes","matchesServiceConstraints","tasks","totalImageSize","nodeId","createdBy","fullName","versionIdx","flattenConfig","ConfigID","ConfigName","FileName","Uid","UID","Gid","GID","configConfig","ConstraintModel","patterns","nodeHostname","nodeRole","eq","neq","matchesConstraint","constraint","matchesLabel","extractValue","pop","extractCustomLabelKey","baseLabelKey","transformConstraints","constraints","transform","portPattern","parsePort","parsePortRange","portRange","stringPorts","intPorts","isValidPortRange","createPortRange","portRangeText","hostIp","colonIndex","substr","startPort","endPort","helper","splitargs","NetworkMode","NetworkingConfig","EndpointsConfig","binds","containerPath","Destination","RW","Binds","portBindings","portBinding","containerPortRange","startHostPort","endHostPort","hostAndPort","hostPortRange","bindKey","HostIp","HostPort","portBindingKeys","portBindingKeysByProtocol","portKey","portBindingKeysByHostIp","sortedPortBindingKeys","previousHostPort","previousContainerPort","portKeySplit","bindingHostPort","ControlAvailable","fromLabelHashToKeyValue","labelKV","FOREGROUND_COLORS_BY_ANSI","black","x256","colors","red","green","yellow","blue","magenta","cyan","white","brightBlack","brightRed","brightGreen","brightYellow","brightBlue","brightMagenta","brightCyan","brightWhite","BACKGROUND_COLORS_BY_ANSI","bgBlack","bgRed","bgGreen","bgYellow","bgBlue","bgMagenta","bgCyan","bgWhite","bgBrightBlack","bgBrightRed","bgBrightGreen","bgBrightYellow","bgBrightBlue","bgBrightMagenta","bgBrightCyan","bgBrightWhite","stripEscapeCodes","cssColorFromRgb","rgb","extendedColorForToken","colorMode","formatLogs","skipHeaders","stripHeaders","tokens","tokenize","formattedLogs","foregroundColor","backgroundColor","spans","tokenLines","nodeToConfig","flattenSecret","SecretID","SecretName","secretConfig","otherServicesTasks","EndpointSpec","keyValuePreferences","preferences","Spread","SpreadDescriptor","keyValueConstraints","operatorIndices","indexEquals","getOperator","humanDuration","nanos","matches","duration","unit","asMilliseconds","conversionFromNano","logOptions","keyValueLogDriverOpts","ipHostEntries","keyValue","Container","optionArray","mounts","rejection","SnapshotRaw","Info","buildImage","buildImageOverride","commitContainer","ContainersInterceptor","stop","restart","kill","pause","unpause","top","force","exec","inspect","prune","resize","w","ImagesInterceptor","history","insert","registryAuthenticationHeader","NetworksInterceptor","connect","rollback","InfoInterceptor","VersionInterceptor","since","until","dataUsage","subAction","VolumesInterceptor","Build","FileUploadService","dockerfile","configId","LogHelper","$timeout","resizeTTY","width","height","timeout","renameContainer","newContainerName","restartPolicy","maximumRetryCounts","MaximumRetryCount","updateLimits","MemoryReservation","MemorySwap","NanoCpus","createContainer","createAndStartContainer","removeVolumes","createExec","execConfig","stdout","stderr","timestamps","tail","parameters","containerTop","Exec","execId","imageId","withUsage","layers","imageLayer","pushImage","registryModel","authenticationDetails","encodedCredentials","setRegistryAuthenticationHeader","imageConfiguration","ignoreErrors","pullImageAndIgnoreErrors","detail","pullImageAndAcknowledgeErrors","tagImage","downloadImages","uploadImage","deleteImage","forceRemoval","networkConfiguration","localNetworks","swarmNetworks","swarmAttachableNetworks","filteredNetworks","networkId","Force","aliases","EndpointConfig","Aliases","rawNode","getActiveManager","Plugin","servicePlugins","systemOnly","pluginType","pluginVersion","system","plugins","aggregatedPlugins","systemPlugins","plugin","Interface","Types","volumePlugins","networkPlugins","loggingPlugins","secretId","Service","TaskService","serv","SystemEndpoint","Task","Volume","VolumeHelper","driverOptions","DriverOpts","createDriverOptions","volumeConfiguration","volumeConfigurations","createVolumeQueries","createVolume","x","ConfigsController","ConfigService","getConfigs","getConfigsAsync","CreateConfigController","ConfigContent","displayCodeEditor","labelName","labelValue","prepareLabelsConfig","prepareConfigData","configData","btoa","unescape","encodeURIComponent","prepareConfiguration","userDetails","removeConfig","ContainerHelper","ExecService","CONSOLE_COMMANDS_LABEL_PREFIX","states","disconnected","connecting","restcall","termWidth","cols","initTerm","resizeRestCall","resizefun","$apply","containerCommands","connectAttach","attachId","connectExec","isCustomCommand","customCommand","AttachStdin","AttachStdout","AttachStderr","Tty","commandStringToArray","autoconnectAttachView","initView","containerLabels","imageOS","getContainers","Commit","activityTime","displayRecreateButton","commitInProgress","recreateContainerInProgress","joinNetworkInProgress","leaveNetworkInProgress","pullImageValidity","setPullImageValidity","validity","edit","StartedAt","utc","diff","FinishedAt","portMapping","inSwarm","autoRemove","AutoRemove","admin","settingRestrictsRegularUsers","executeContainerAction","commitContainerAsync","imageConfig","containerLeaveNetwork","disconnectContainer","containerJoinNetwork","connectContainer","commit","confirmRemove","cleanAssociatedVolumes","removeContainer","recreate","confirmContainerRecreation","configFromContainer","isRunning","retrievePorRegistryModelFromRepository","pullImageIfNeeded","networksNames","createContainerData","newContainer","connectionPromises","oldResourceControl","newResourceControl","duplicateResourceControl","recreateContainer","DisplayTextView","containerInfo","stopRepeater","cancel","setUpdateRepeater","changeLogCollection","logCollectionStatus","$document","ChartService","updateNetworkChart","rx","rx_bytes","tx","tx_bytes","UpdateNetworkChart","updateMemoryChart","UpdateMemoryChart","updateIOChart","noIOData","UpdateIOChart","updateCPUChart","possIntervals","valueOf","windowsCpuUsage","calculateCPUPercentWindows","cpuPercent","cpuDelta","systemDelta","calculateCPUPercentUnix","UpdateCPUChart","networkChart","cpuChart","memoryChart","ioChart","processInfo","initCharts","networkChartCtx","CreateNetworkChart","cpuChartCtx","CreateCPUChart","memoryChartCtx","CreateMemoryChart","ioChartCtx","CreateIOChart","networkStatsUnavailable","ioStatsUnavailable","startChartUpdate","changeUpdateRepeater","VolumeService","dismissInformationPanel","shouldShowStacks","volumeCount","networkCount","serviceCount","stackCount","Boolean","jobs","versionDetails","releaseVersion","rootDirectory","DockerRootDir","storageDriver","loggingDriver","LoggingDriver","buildEngineDetails","os","arch","OperatingSystem","kernelVersion","KernelVersion","totalCPU","NCPU","totalMemory","MemTotal","agentHostInfo","PCIDevices","PhysicalDisks","BuildImageController","BuildService","BuildType","ImageNames","UploadFile","DockerFileContent","addImageName","removeImageName","buildType","imageNames","dockerfilePath","buildImageFromUpload","buildImageFromURL","dockerfileContent","buildImageFromDockerfileContent","buildImageBasedOnBuildType","validImageNames","RegistryModalService","sortType","sortReverse","toggleLayerCommand","layerId","toggleClass","toggle","pushTag","registryModal","pullTag","removeTag","removeImage","exportImage","warning","confirmImageExport","loadRegistriesForDropdown","getImages","pullRateValid","confirmRemovalAction","confirmImageForceRemoval","isAuthorizedToDownload","imageIds","PluginService","checkAuxiliaryAddress","excludedIP","gateway","prepareAuxiliaryAddresses","ipamConfig","ipFormValues","AuxiliaryAddresses","auxAddress","IPV4","Gateway","IPRange","IPV6","EnableIPv6","prepareIPAMConfiguration","DriverOptions","prepareDriverOptions","createNetwork","setPortainerAgentManagerOperation","managerOperation","Macvlan","availableNetworkDrivers","CheckDuplicate","addDriverOption","removeDriverOption","addIPV4AuxAddress","addIPV6AuxAddress","removeIPV4AuxAddress","IPV4AuxiliaryAddressesError","removeIPV6AuxAddress","IPV6AuxiliaryAddressesError","checkIPV4AuxiliaryAddress","checkIPV6AuxiliaryAddress","isValid","validIPV4","validIPV6","creationContext","selectedNetworkConfig","modifyNetworkConfigurationForMacvlanConfigFrom","selectedNodes","filterContainersInNetwork","containersInNetwork","containerInNetwork","removeNetwork","allowRemove","IPV4Configs","IPV6Configs","getIPV6Configs","groupSwarmNetworksManagerNodesFirst","nonSwarmNetworks","grouped","sorted","agent","getRole","$stateParams","transformPlugins","pluginsList","fetchJobs","buildHostDetails","nodeDetails","buildNodeDetails","DockerRegistryAccessController","registryEndpointAccesses","endpointUsers","endpointTeams","endpointGroupUsers","endpointGroup","endpointGroupTeams","userOrTeam","userRole","teamRole","SecretService","encodeSecret","prepareSecretData","secretConfiguration","removeSecret","getSecrets","ConfigHelper","SecretHelper","commandToArray","cmd","input","Global","prepareSchedulingConfig","prepareImageConfig","PublishMode","PublishedPort","preparePortsConfig","EntryPoint","WorkingDir","prepareCommandConfig","envVarsUtils","prepareEnvConfig","Target","volumeObject","VolumeOptions","DriverConfig","createMountObjectFromVolume","prepareVolumes","ExtraNetworks","prepareNetworks","hostsEntries","HostsEntries","host_ip","keyVal","prepareHostsEntries","translateHumanDurationToNanos","prepareUpdateConfig","prepareConfigConfig","overrideTarget","prepareSecretConfig","translateKeyValueToPlacementConstraints","PlacementConstraints","translateKeyValueToPlacementPreferences","PlacementPreferences","preparePlacementConfig","CpuReservation","prepareResourcesCpuConfig","MemoryLimitUnit","memoryReservation","MemoryReservationUnit","prepareResourcesMemoryConfig","prepareRestartPolicy","logOpts","opt","prepareLogDriverConfig","checkIfAllowedBindMounts","allowBindMounts","handleEnvVarChange","refreshSlider","$broadcast","addExtraNetwork","removeExtraNetwork","addHostsEntry","removeHostsEntry","addVolume","removeVolume","addConfig","addSecret","addPlacementConstraint","removePlacementConstraint","addPlacementPreference","removePlacementPreference","addContainerLabel","removeContainerLabel","addLogDriverOpt","removeLogDriverOpt","volumesAreValid","rcPromise","registryID","webhookPromise","createServiceWebhook","createNewService","availableLoggingDrivers","availableVolumes","availableSecrets","availableConfigs","maxCpus","maxMemory","initSlidersMaxValuesBasedOnNodeData","$location","TaskHelper","updateInProgress","deletionInProgress","rollbackInProgress","lastVersion","originalService","previousServiceValues","buildChanges","ServiceLabels","ServiceContainerLabels","Editable","ServiceSecrets","ServiceConfigs","translateHostnameIPToHostsEntries","ServiceMounts","ServiceConstraints","ServicePreferences","translateKeyValueToLogDriverOpts","isUpdating","transformResources","v1","v2","translateLogDriverOptsToKeyValue","translateConstraintsToKeyValue","translatePreferencesToKeyValue","translateHostsEntriesToHostnameIP","translateServiceArrays","translateNanosToHumanDuration","transformDurations","serviceNetworks","ingressNetwork","unshift","addr","webhook","WebhookExists","webhookID","webhookURL","returnWebhookUrl","associateContainerToTask","associateTasksToService","initialRegistryID","override","updateServiceArray","goToItem","addEnvironmentVariable","onChangeEnvVars","orgEnv","orgVar","serviceConfig","updateConfig","newSecret","filename","serviceSecret","updateContainerLabel","addMount","removeMount","onChangeMountType","updateMount","addNetwork","removedElement","updateNetwork","updatePlacementConstraint","updatePlacementPreference","addPublishedPort","updatePublishedPort","removePortPublishedBinding","updateLogDriverOpt","updateLogDriverName","updateHostsEntry","updateWebhook","updateWebhookRegistryId","newRegistryID","registryChanged","updateServiceWebhook","attribute","elements","originalImage","currentImage","mountsAreValid","rollbackService","callback","updateService","removeService","forceUpdateService","updateServiceAttribute","filterNetworks","serviceNetwork","getServices","extractSwarmInfo","systemStatus","SystemStatus","node_count","node_offset","extractNodeInfo","extractNodesInfo","offset","getNodes","processTotalCPUAndMemory","prepareVisualizerData","visualizerData","assignServiceInfo","assignTasksToNode","ShowInformationPanel","DisplayOnlyRunningTasks","DisplayNodeLabels","changeShowInformationPanel","storeSwarmVisualizerSettings","changeDisplayOnlyRunningTasks","changeDisplayNodeLabels","showInfoPanel","getSwarmVisualizerSettings","displayOnlyRunningTasks","displayNodeLabels","loadState","NFSData","CIFSData","availableVolumeDrivers","storidgeProfile","StoridgeProfile","prepareNFSConfiguration","versionNumber","prepareCIFSConfiguration","createVolumeConfiguration","StoridgeVolumeService","StoridgeSnapshotService","storidgeSnapshots","storidgeVolume","removeSnapshot","containerFilter","isCioDriver","volumeData","getVolumeDataFromContainer","containersUsingVolume","snapshots","getVolumes","endpointProvider","endpointRole","attached","isVolumeUsedByAService","addLabelAction","removeLabelAction","formActionLabel","edgeStackDeploymentTypeSelector","API_ENDPOINT_EDGE_GROUPS","EdgeJobResultsFactory","API_ENDPOINT_EDGE_JOBS","EdgeJobsFactory","API_ENDPOINT_EDGE_STACKS","API_ENDPOINT_EDGE_TEMPLATES","EdgeJobs","EdgeJobResults","edgeJobId","createSchedule","EdgeStacks","createEdgeStack","EdgeTemplates","fetch","profiles","profile","drives","drive","profileCreation","profileName","cluster","monitor","addAction","rescanAction","additionInProgress","StoridgeNodeService","addNodeAction","addInfo","copyAddNodeCommand","StoridgeProfileService","createSnapshot","initLabels","updateVolume","cancelUpdate","prepareLabels","prepareVolume","confirmUpdate","precision","isFinite","rebootCluster","shutdownCluster","queryEvents","getVersion","getInfo","queryNodes","getNode","addNode","removeNode","cordonNode","uncordonNode","queryProfiles","getProfile","createProfile","updateProfile","deleteProfile","queryDrives","getDrive","addDrive","removeDrive","rescanDrives","queryVolumes","getVolume","querySnapshots","getSnapshot","bytePerSecBasedAxisLabel","CreateCapacityChart","datasets","tooltips","callbacks","tooltipItem","datasetIndex","animation","responsiveAnimationDuration","responsive","hover","animationDuration","CreateIOPSChart","fill","borderColor","pointBackgroundColor","pointBorderColor","pointRadius","borderWidth","intersect","scales","yAxes","ticks","beginAtZero","CreateBandwidthChart","processedValue","bytePerSecBasedTooltipLabel","yLabel","UpdateChart","UpdatePieChart","Storidge","nodeData","snapshotsData","snapshotsArray","StoridgeClusterService","shutdownInProgress","rebootInProgress","reboot","shutdown","clusterInfo","clusterVersion","clusterNodes","StoridgeDriveService","rescan","StoridgeChartService","updateIOPSChart","updateBandwithChart","updateCapacityChart","startViewUpdate","iopsChart","bandwidthChart","capacityChart","iopsChartCtx","bandwidthChartCtx","capacityChartCtx","removeNodeAction","cordonNodeAction","cordon","uncordonNodeAction","uncordon","NoLimit","LimitIOPS","LimitBandwidth","ManualInputDirectory","RedundancyOptions","RecurringSnapshotEnabled","updatedName","updatedDirectory","deleteInProgress","snapshotId","registriesModule","customTemplateModule","KubernetesHealthService","KubernetesNamespaceService","isPod","useServerMetrics","showSystem","isItemExpanded","isExpandable","hasConfigurationSecrets","getPublishedUrl","onSettingsShowSystemChange","isExternalApplication","isDisplayed","ingressUrls","pp","loadBalancerURLs","publishedUrls","availableTypeFilters","settingsKey","buildIngressRuleURL","portHasIngressRules","ruleCanBeDisplayed","isSystemToken","isSystemConfig","isExternalConfiguration","canManageAccess","RestrictDefaultNamespace","isDefaultNamespace","namespaceStatusColor","KubernetesVolumesDatatableController","onInit","isUsed","isExternalVolume","selectAction","isCreation","KubernetesConfigurationDataController","editorUpdateAsync","onFileLoad","onFileLoadAsync","showSimpleMode","showAdvancedMode","onChangeKey","duplicateKeys","invalidKeys","getInvalidKeys","chardet","detect","Buffer","decoder","TextDecoder","isBinary","stringValue","decode","Base64","encode","addEntryFromFile","readAsArrayBuffer","parseYaml","parseData","cpuReservation","cpuUsage","memoryUsage","displayUsage","KubernetesResourceReservationController","usageValues","cpuReservationPercent","memoryReservationPercent","cpuUsagePercent","memoryUsagePercent","KubernetesYamlInspectorController","copyYAML","toggleYAMLInspectorExpansion","KubernetesEndpointService","KubernetesEndpoints","getAllAsync","apiToEndpoint","HelmFactory","helmUrl","list","output","uninstall","describe","stacksFromApplications","expect","toHaveLength","getYaml","Accept","KubernetesHorizontalPodAutoScalerService","KubernetesHorizontalPodAutoScalers","getAsync","patchAsync","deleteAsync","raw","apiToModel","horizontalPodAutoScaler","KubernetesIngresses","getOne","getAll","KubernetesMetricsService","KubernetesMetrics","capabilitiesAsync","getPodAsync","getNodeAsync","getPodsAsync","getNodesAsync","podName","getPod","getPods","podUrl","KubernetesNodes","apiToNodeDetails","errData","nodeFormValues","formValuesToNode","KubernetesPodService","KubernetesPods","logsAsync","evictionAsync","containerName","podEvictionPayload","evictionPayload","evict","eviction","KubernetesConfigFactory","API_ENDPOINT_KUBERNETES","environmentIDs","KubernetesNodesLimitsFactory","KubernetesPortainerNamespacesFactory","toggleSystem","KubernetesApplicationService","KubernetesDeploymentService","KubernetesDaemonSetService","KubernetesStatefulSetService","KubernetesServiceService","KubernetesSecretService","KubernetesPersistentVolumeClaimService","KubernetesHistoryService","patchPartialAsync","rollbackAsync","_getApplicationApiService","apiService","_generateIngressPatchPromises","oldIng","autoScalers","rootItem","converterFunc","apiDeploymentToApplication","apiDaemonSetToApplication","apiStatefulSetToapplication","apiPodToApplication","boundService","findApplicationBoundService","associateContainersAndApplication","boundScaler","findApplicationBoundScaler","scaler","convertToApplication","deployments","daemonSets","statefulSets","deploymentApplications","daemonSetApplications","statefulSetApplications","boundPods","unboundPods","nakedPodsApplications","claimPromises","oldApiService","newApiService","newClaim","oldClaim","oldAppPayload","newAppPayload","oldValues","partial","servicePayload","headlessServicePayload","getPatchPayload","KubernetesConfigMapService","KubernetesConfigMaps","getAccess","apiToPortainerAccessConfigMap","createAccess","updateAccessPayload","rawPromise","yamlPromise","defaultConfigMap","apiToConfigMap","updatePayload","KubernetesConfigurationService","secretToConfiguration","configMapToConfiguration","configMaps","secretsConfigurations","configMapsConfigurations","configurationFormValuesToConfigMap","configurationFormValuesToSecret","KubernetesControllerRevisionService","KubernetesControllerRevisions","KubernetesDaemonSets","KubernetesDeployments","KubernetesEventService","KubernetesEvents","apiToEvent","KubernetesHealth","pingAsync","KubernetesReplicaSetService","getRevisions","KubernetesConfigService","KubernetesConfig","SettingsService","publicSettings","KubernetesNamespaces","apiToNamespace","allNamespaces","KubernetesNodesLimitsService","KubernetesPersistentVolumeClaims","apiToPersistentVolumeClaim","KubernetesReplicaSets","KubernetesResourceQuotaService","KubernetesPortainerNamespaces","ingressPromises","registriesPromises","oldRegistries","newRegistries","ing","del","createPromises","delPromises","patchPromises","old","keptRegistries","removedRegistries","newRegistriesPromises","removedRegistriesPromises","namespaceName","quotaAttempt","apiToResourcePool","KubernetesResourceQuotas","apiToResourceQuota","KubernetesSecrets","apiToSecret","KubernetesServices","KubernetesStackService","KubernetesStatefulSets","headlessServiceName","oldStatefulSet","newStatefulSet","KubernetesStorageService","KubernetesStorage","apiToStorageClass","KubernetesVolumeService","pvcToVolume","pools","pvcs","KubernetesApplicationsController","getApplications","getApplicationsAsync","removeStacksAction","removeStacksActionAsync","onPublishingModeClick","selectTab","storeActiveTab","configuredApplications","getApplicationConfigurations","getNestedApplications","portMappingsFromApplications","getActiveTab","$current","KubernetesApplicationConsoleController","availableCommands","applicationName","KubernetesCreateApplicationController","ApplicationDeploymentTypes","ApplicationDataAccessPolicies","ApplicationPublishingTypes","ApplicationPlacementTypes","ApplicationTypes","ApplicationConfigurationFormValueOverridenKeyTypes","ServiceTypes","appType","updateWebEditorInProgress","useLoadBalancer","sliders","namespaceLimits","resourcePoolHasQuota","availableSizeUnits","alreadyExists","environmentVariables","configurationPaths","existingVolumes","nodePorts","ingressRoutes","loadBalancerPorts","persistedFoldersUseExistingVolumes","editChanges","updateApplicationAsync","deployApplicationAsync","onServicePublishChange","stackFileContent","imageValidityIsValid","existingApplication","unselectAutoScaler","addConfiguration","removeConfiguration","onChangeConfigurationPath","resetConfiguration","clearConfigurations","uniqOverridenKeysPath","duplicatePaths","overridenKey","keyIndex","findPath","restoreEnvironmentVariable","removeEnvironmentVariable","envVar","onChangeEnvironmentName","addPersistedFolder","newPf","resetDeploymentType","restorePersistedFolder","validatePersistedFolders","resetPersistedFolders","removePersistedFolder","useNewVolume","useExistingVolume","onChangePersistedFolderPath","onChangeExistingVolumeSelection","addPlacement","onChangePlacement","restorePlacement","removePlacement","onChangePlacementLabelValidate","onChangePlacementLabel","resetPublishedPorts","restorePublishedPort","onChangePublishedPorts","removePublishedPort","onChangePortMappingContainerPort","onChangePortMappingNodePort","onChangePortMappingIngressRoute","onChangePortMappingLoadBalancer","onChangePortProtocol","onChangePortMappingIngress","ingressHostnames","newRoutes","toDelRoutes","allRoutes","newPorts","storageClassAvailable","hasMultipleStorageClassesAvailable","showDataAccessPolicySection","supportGlobalDeployment","hasFolders","hasRWOOnly","isIsolated","isEditAndStatefulSet","supportScalableReplicaDeployment","getNonScalableStorage","storageOptions","enforceReplicaCountMinimum","resourceQuotaCapacityExceeded","nodeLimitsOverflow","effectiveInstances","nodeNumber","resourceReservationsOverflow","maxCpu","autoScalerOverflow","publishViaLoadBalancerEnabled","publishViaIngressEnabled","isEditAndNoChangesMade","changes","isAddPersistentFolderButtonShowed","isNewVolumeButtonDisabled","isEditAndExistingPersistedFolder","isExistingVolumeButtonDisabled","hasAvailableVolumes","isEditAndNotNewPublishedPort","hasNoPublishedPorts","isEditAndNotNewPlacement","isNewAndNotFirst","showPlacementPolicySection","isNonScalable","scalable","global","replica","replicated","isDeployUpdateButtonDisabled","invalid","hasNoChanges","nonScalable","isPublishingWithoutPorts","disableLoadBalancerEdit","isPublishingTypeEditDisabled","isEditLBWithPorts","isProtocolOptionDisabled","updateSliders","minCpu","minMemory","updateNamespaceLimits","refreshStacks","refreshConfigurations","refreshApplications","refreshVolumes","filteredVolumes","isUnused","isRWX","refreshIngresses","refreshNamespaceData","resetFormValues","onResourcePoolSelectionChange","deployApplication","getApplication","UseLoadBalancer","UseServerMetrics","generateNodeLabelsFromNodes","applicationToFormValues","toUpperCase","getStackFile","parseImageConfiguration","computePlacements","UnmatchedNodeSelectorLabels","AcceptsApplication","unmatchedTerms","unmatchedExpressions","exists","isIn","UnmatchedNodeAffinities","computeAffinities","UnmetTaints","matchKeyMatchValueMatchEffect","matchKeyAnyValueMatchEffect","matchKeyMatchValueAnyEffect","matchKeyAnyValueAnyEffect","anyKeyAnyValueAnyEffect","computeTolerations","KubernetesApplicationController","getApplicationAsync","getEvents","getEventsAsync","updateApplicationKindText","redeployApplicationAsync","rollbackApplicationAsync","copyLoadBalancerIP","copyApplicationName","hasPersistedFolders","hasVolumeConfiguration","hasEventWarnings","eventWarningCount","isStack","rollbackApplication","redeployApplication","updateApplication","eventsLoading","warningCount","allContainers","associateAllContainersAndApplication","expandedNote","SelectedRevision","useIngress","placementWarning","DisplayedPanel","KubernetesApplicationLogsController","getApplicationLogsAsync","updateAutoRefresh","applicationLogs","KubernetesApplicationStatsController","CPUUsage","getStats","nodeCPU","getMetrics","podRaw","KubernetesClusterController","hasResourceUsageAccess","systemEndpoints","ep","kubernetesEndpoint","ips","CPULimit","applicationsLoading","nodeNames","resourceReservation","computeResourceReservation","getResourceUsage","nodeMetrics","clusterResourceUsage","reduce","total","resourceUsage","KubernetesNodeController","updateNodeAsync","drainNodeAsync","getNodeUsageAsync","onChangeTaintKey","duplicateTaintKeys","hasDuplicateTaintKeys","onChangeTaint","addTaint","removeTaint","restoreTaint","computeTaintsWarning","onChangeLabelKey","duplicateLabelKeys","hasDuplicateLabelKeys","onChangeLabel","restoreLabel","computeLabelsWarning","computeCordonWarning","availabilities","computeDrainWarning","drainNode","isNoChangesMade","isDrainError","isDrainOperation","isContainPortainer","nodeToFormValues","taintsWarning","labelsWarning","cordonWarning","drainWarning","getNodeUsage","availableEffects","computeUsedLabels","reorderLabels","KubernetesNodeStatsController","KubernetesConfigurationsController","getConfigurations","getConfigurationsAsync","refreshCallbackAsync","configurationsLoading","setConfigurationsUsed","KubernetesCreateConfigurationController","createConfigurationAsync","filteredConfigurations","alreadyExist","uniqueCheck","isDataValid","createConfiguration","KubernetesConfigurationController","getConfigurationAsync","updateConfiguration","updateConfigurationAsync","copyConfigurationValue","plural","configurationLoading","oldDataYaml","getConfiguration","tagUsedDataKeys","configName","usedDataKeys","KubernetesConfigureController","configureAsync","limitedFeatureAutoWindow","hasValidStorageConfiguration","addIngressClass","onChangeIngressClass","restoreIngressClass","removeIngressClass","onChangeIngressClassName","hasTraefikIngress","assignFormValuesToEndpoint","transformFormValues","ingressesToDel","oldEndpointID","allResourcePools","respons","enableMetricsServer","metrics","userClick","pending","isServerRunning","removeIngressesAcrossNamespaces","storagePromises","oldStorageClasses","modifiedEndpoint","setEndpoints","configure","restrictDefaultToggledOn","displayConfigureClassPanel","availableAccessModes","sc","access","KubernetesDashboardController","KubernetesDeployController","DeployMethod","deployOptions","DeployType","BuildMethod","tabLogsDisabled","ManifestDeployTypes","BuildMethods","onChangeTemplateId","deployAsync","getNamespacesAsync","onDeployTypeChange","buildMethod","buildLabel","formatLabel","roleLabel","disableDeploy","isGitFormInvalid","isWebEditorInvalid","EditorContent","isURLFormInvalid","ManifestURL","isNamespaceInvalid","displayErrorLog","errorLog","stripAnsi","composeFormat","deployNamespace","ComposeFormat","ManifestFile","kubernetesDeploy","deploy","getNamespaces","KubernetesResourcePoolAccessController","AccessService","authorizeAccessAsync","unauthorizeAccessAsync","unauthorizeAccess","initAccessConfigMap","multiselectOutput","endpointAccesses","parseJSONData","authorizedUsersAndTeams","accessConfigMap","poolAccesses","availableUsersAndTeams","newAccesses","modifiyNamespaceAccesses","authorizeAccess","KubernetesResourcePoolController","ResourceQuotaDefaults","updateResourcePoolAsync","otherIngresses","hostsWithoutRemoved","duplicatedHostnames","Duplicate","restoreHostname","isUpdateButtonDisabled","hasResourceQuotaBeenReduced","updateResourcePool","ingressesToDelete","registriesToDelete","WasChecked","warnings","messages","displayedMessage","markUnmarkAsSystem","confirmMarkUnmarkAsSystem","ingressesLoading","hasWriteAuthorization","selectedRegistries","namespaceMetrics","namespaceResourceUsage","quotaToResourcePoolFormValues","isEditable","KubernetesResourcePoolsController","getResourcePoolsAsync","KubernetesStackLogsController","generateLogsPromise","generateAppPromise","getStackLogsAsync","Pod","Logs","Application","filteredApplications","logsPromises","Color","Line","AppName","stackLogs","dataLogs","KubernetesSummaryController","toggleSummary","generateResourceSummaryList","getArticle","resourceAction","article","expandedTemplate","storeKubernetesSummaryToggle","getConfigurationResources","getNamespaceResources","getApplicationResources","toggleValue","getKubernetesSummaryToggle","KubernetesVolumeController","getVolumeAsync","updateVolumeAsync","onChangeSize","volumeSize","volumeSizeUnit","oldVolumeSize","sizeIsValid","redeploy","oldVolume","confirmRedeploy","increaseSize","volumeSharedAccessPolicy","volumeSharedAccessPolicyTooltip","buildStorages","storages","formatBytes","computeSize","KubernetesVolumesController","getVolumesAsync","changeOrderBy","orderField","entryClick","emptyDatasetMessage","formData","hideTitle","availableTeams","availableUsers","retrieveOwnershipDetails","authorizedUsers","authorizedTeams","setOwnership","setAuthorizedUsersAndTeams","resourceId","disableOwnershipChange","ResourceControlHelper","RCTS","RCTI","displayAccessControlPanel","canEditOwnership","editOwnership","hasRC","inheritedVolume","inheritedContainer","inheritedFromStack","hasSpecialDisable","confirmUpdateOwnership","confirmAccessControlUpdate","applyResourceControlChange","retrieveUserPermissionsOnResource","isPartOfRestrictedUsers","isLeaderOfAnyRestrictedTeams","canChangeOwnershipToTeam","PorAccessManagementController","entity","oldUserAccessPolicies","oldTeamAccessPolicies","updatedUserAccesses","updatedTeamAccesses","accessPolicies","generateAccessPolicies","userAccessPolicies","teamAccessPolicies","selectedRoleId","selectedRole","selectedUserAccesses","selectedTeamAccesses","selectedAccesses","isRoleLimitedToBE","AssociatedEndpointsSelectorController","hasBackendPagination","element","spinning","CodeMirrorService","editor","setValue","editorElement","applyCodeMirrorOnElement","$evalAsync","showPlatformField","showTypeField","nameRegex","customTemplateSelector","newTemplatePath","CUSTOM_TEMPLATES_TYPES","typeLabel","onSelectClick","showSwarmStacks","onDeleteClick","createPath","editPath","PAGINATION_MAX_ITEMS","selectAll","displayTextFilter","resetSelectionState","setDataTableOrder","selectItem","originalEvent","shiftKey","firstClickedItem","firstItemIndex","lastItemIndex","itemsInRange","isBetween","showTextFilter","startRepeater","canBrowse","RegistriesDatatableController","enableGoToLink","goToRegistry","redirectToManageAccess","createEnabled","showActiveStacks","showUnactiveStacks","updated","allOrphanedStacks","onSettingsAllOrphanedStacksChange","stringsDatatable","columnHeader","authenticationMethod","onSelect","isKubernetesMode","totalFilteredEndpoints","filteredEndpoints","pollingTimeout","paginationChangedAction","keywords","statusString","lowerCaseKeyword","tagId","frontEndpointFilter","clearPollTimeout","$onDestory","getCurrentPage","pageChangeHandler","showKubeconfigButton","showKubeconfigModal","expiryMessage","confirmKubeconfigSelection","selectedEnvironmentIDs","downloadKubeconfigFile","dashboardAction","snapshotAction","showSnapshotAction","editAction","sortGroups","groupEndpoints","availableGroups","CACert","environmentVariablesSimpleModeItem","$attrs","dom","$eval","focusDelay","focusIf","availableTags","onCreateTag","kubernetesAppGitForm","kubernetesRedeployAppGitForm","porSwitchField","ngDataCy","disableSelection","retrieveRegistries","createRegistries","resetDefaults","createTemplate","advanced","stackRedeployGitForm","onPageChanged","paginationState","onPaginationLimitChanged","tagIdsToTagNames","groupIdToGroupName","showTags","showGroups","showRefreshButton","snapshotTime","triggerSnapshot","snapshotEndpoint","dismissAction","$validators","invalidIntervalFormat","modelValue","minimumInterval","motd","which","onEnterKey","goTo","products","registryDetails","useAsterisk","ceil","step","SliderController","buildOptions","translate","sliderId","showSelectionBar","enforceStep","isFormValidForMigration","duplicationInProgress","migrationInProgress","isFormValidForDuplication","yamlError","duplicateStack","onDuplicate","migrateStack","onMigrate","isMigrationButtonDisabled","currentEndpointId","isEndpointSelected","onCreate","allowCreate","TagSelectorController","selectedValue","selectedTags","noResult","selectTag","$item","filterTags","searchValue","exactTag","generateSelectedTags","tagsValue","TemplateListController","TemplateService","showContainerTemplates","filterByCategory","filterByType","duplicateTemplate","duplicateTemplateAsync","templateFile","stackfile","PREDEFINED_NETWORKS","RCViewModelToOwnershipParameters","RCFormDataToOwnershipParameters","RCPanelDataToOwnershipParameters","userIds","teamIds","retrieveAuthorizedUsers","retrieveAuthorizedTeams","isTeamLeader","getExternalStacksFromLabel","getExternalStacksFromContainers","getExternalStacksFromServices","validateYAML","containerNames","yamlObject","duplicateContainers","PortBindings","ExtraHosts","portConfiguration","exposedPorts","labelsArray","templateEnvironment","interactiveFlag","consoleConfiguration","openStdin","tty","generatedVolumesPile","getParameter","param","keyValStr","cleanParameters","pathname","API_ENDPOINT_WEBHOOKS","API_ENDPOINT_STACKS","displayPort","canBeOffline","setOfflineMode","ResourceControlCreatePayload","ResourceControlUpdatePayload","API_ENDPOINT_OAUTH","validate","API_ENDPOINT_AUTH","login","API_ENDPOINT_BACKUP","headersGetter","getS3Settings","subResource","saveS3Settings","exportS3Backup","restoreS3Backup","getBackupStatus","CustomTemplatesFactory","API_ENDPOINT_CUSTOM_TEMPLATES","deassociate","dockerhubLimits","API_ENDPOINT_REGISTRIES","baseUrl","repositories","API_ENDPOINT_ENDPOINT_GROUPS","deregister","API_ENDPOINT_MOTD","API_ENDPOINT_RESOURCE_CONTROLS","API_ENDPOINT_SETTINGS","checkLDAPConnectivity","SSLFactory","associate","swarmId","orphanedRunning","external","migrate","subaction","API_ENDPOINT_STATUS","API_ENDPOINT_SUPPORT","API_ENDPOINT_TAGS","API_ENDPOINT_TEAMS","queryMemberships","API_ENDPOINT_TEAM_MEMBERSHIPS","API_ENDPOINT_TEMPLATES","API_ENDPOINT_USERS","updatePassword","updateTheme","checkAdminUser","initAdminUser","getAccessTokens","deleteAccessToken","entityId","accessesAsync","newUserPolicies","newTeamPolicies","_mapAccessData","authorizedPolicies","inheritedPolicies","availableAccesses","authorizedAccesses","authorized","inherited","authorizedUserPolicies","authorizedTeamPolicies","inheritedUserPolicies","inheritedTeamPolicies","userAccesses","teamAccesses","userAccessData","teamAccessData","accessData","Backup","uploadBackup","CustomTemplateServiceFactory","$sanitize","CustomTemplates","snapshotEndpoints","deassociateEndpoint","uploadTLSFilesForEndpoint","notify","deleteEndpoint","groupID","endpointURL","createEndpoint","TLSSkipClientVerify","TLSCAFile","checkinInterval","EndpointGroups","LegacyExtensions","Motd","credentials","deleteRegistry","updateRegistry","configureRegistry","registryManagementConfigurationModel","regs","retrievePorRegistryModelFromRepositoryWithRegistries","getURL","match2","match3","match4","findBestMatchRegistry","lastIndex","updateResourceControl","rcID","ownershipParameters","rcType","resourceID","SubResourceIds","createResourceControl","userID","isAdministrator","Settings","SSLServiceFactory","SSL","Stack","StackHelper","SwarmService","gitConfig","kubernetesDeployAsync","migrateSwarmStack","targetEndpointId","SwarmID","migrateComposeStack","compose","includeOrphanedStacks","queries","composeStacks","IncludeOrphanedStacks","swarmStacks","externalSwarmStacks","externalComposeStacks","unionStacks","externalStacks","externalStack","includeExternalStacks","Prune","createComposeStackFromFileUpload","createComposeStack","createSwarmStackFromFileUpload","createSwarmStack","createComposeStackFromGitRepository","ComposeFile","createSwarmStackFromGitRepository","Support","createTagAsync","createTag","deleteTag","teamId","leaderIds","teamMembershipQueries","createMembership","TemplateServiceFactory","Templates","TemplateHelper","registryURL","repositoryUrl","composeFilePathInRepository","createTemplateConfiguration","containerConfiguration","getDefaultContainerConfiguration","EnvToStringArray","portArrayToPortConfiguration","getConsoleConfiguration","updateContainerConfigurationWithLabels","createContainerConfiguration","updateContainerConfigurationWithVolumes","createVolumeBindings","UserHelper","includeAdministrators","filterNonAdministratorUsers","currentPassword","newPassword","NewPassword","userTokens","tokenId","Webhooks","serviceID","asyncFunc","def","wrapper","Auth","OAuth","jwtHelper","initAsync","jwt","setUser","logoutAsync","clearSessionStorage","clean","cleanAuthData","storeLoginStateUUID","OAuthLoginAsync","loginAsync","storeJWT","tokenPayload","decodeToken","setUserTheme","OAuthLogin","isTokenExpired","defaultChartOptions","pos","tooltipCallback","scalesCallback","isStacked","datasetLabel","layout","padding","stacked","LimitChartItems","CHART_LIMIT","byteBasedTooltipLabel","byteBasedAxisLabel","percentageBasedAxisLabel","percentageBasedTooltipLabel","CreateChart","memoryValue","cacheValue","codeMirrorGenericOptions","lineNumbers","codeMirrorYAMLOptions","gutters","lint","extraKeys","Tab","spaces","getOption","replaceSelection","yamlLint","CodeMirror","fromTextArea","setSize","DatatableServiceFactory","storeDataTableSettings","storeDataTableFilters","storeDataTableOrder","storeDataTableExpandedItems","storeColumnVisibilitySettings","setDataTableSelectedItems","storeDataTableSelectedItems","getDataTableSelectedItems","$uiRouterGlobals","getEndpointID","getEndpointPublicURL","getOfflineMode","OfflineMode","cleanEndpointData","getUrlEndpointID","storeEndpointID","storeEndpointPublicURL","storeEndpoints","isOffline","storeOfflineMode","RetryCount","RetryInterval","EndpointCreationType","GroupID","CheckinInterval","AzureApplicationID","AzureTenantID","uploadLDAPTLSFiles","queue","validator","registryAuthentication","headerValue","agentTargetQueue","agentTargetLastValue","agentManagerOperation","LegacyExtensionService","initStoridgeExtension","storidgeAPIURL","registerStoridgeExtension","registerStoridgeUsingSwarmManagerIP","deregisterStoridgeExtension","endpointAPIVersion","localStorageService","getLoginStateUUID","storeEndpointState","getEndpointState","storeApplicationState","getApplicationState","storeUIState","getUIState","deleteJWT","storePaginationLimit","storeDataTableTextFilters","storeJobImage","getJobImage","storeToolbarToggle","getToolbarToggle","storeLogoutReason","getLogoutReason","cleanLogoutReason","clearAll","applyBoxCSS","box","confirmButtons","customCheckboxPrompt","bootbox","prompt","inputType","inputOptions","prepend","optionToggled","showCheck","addClass","enlargeImage","dialog","onEscape","cancelRegistryRepositoryAction","confirmDeassociate","confirmEndpointSnapshot","selectRegistry","defaultValue","NameValidatorFactory","environmentName","endpointArray","fallbackText","pickErrorMsg","paginationLimit","storedLimit","projectsAsync","_getProjectsPage","repositoriesAsync","projectId","_getRepositoriesPage","ModalServiceFactory","registries2Options","InfoHelper","StatusService","APPLICATION_CACHE_VALIDITY","manager","UI","dismissedInfoPanels","dismissedInfoHash","loadApplicationState","edition","instanceId","enableTelemetry","snapshotInterval","enableEdgeComputeFeatures","assignStateFromStatusAndSettings","setVersionInfo","versionInfo","versionStatus","dismissImportantInformation","cleanEndpoint","updateLogo","logoURL","updateSnapshotInterval","updateEnableEdgeComputeFeatures","updateEnableTelemetry","setOptOut","UIState","endpointState","appState","now","isAppStateValid","Snaphosts","determineEndpointMode","endpointExtensions","assignExtensions","newContentWrapperHeight","innerHeight","style","overflowY","wrapperCSS","documentElement","setAttribute","removeAttribute","systemTheme","matchMedia","confirmPassword","updateUserPassword","selectedTokens","Usertheme","AuthenticationController","URLHelper","showOAuthLogin","showStandardLogin","AuthenticationError","loginInProgress","OAuthProvider","checkForEndpointsAsync","checkForLatestVersionAsync","postLoginSteps","oAuthLoginAsync","internalLoginAsync","authenticateUserAsync","manageOauthCodeReturn","authEnabledFlowAsync","generateOAuthLoginURI","determineOauthProvider","LoginURI","generateState","hasValidState","savedUUID","authenticateUser","administratorExists","toggleStandardLogin","EndpointRegistriesController","EndpointAccessController","updateAccessAsync","EnvironmentType","PlatformType","deploymentTab","availableEdgeAgentCheckinOptions","deployCommands","kubeLoadBalancer","kubeNodePort","agentLinux","agentWindows","onCreateTagAsync","tagName","SecurityFormData","copyAgentCommand","setDefaultPortainerInstanceURL","resetEndpointURL","addDockerEndpoint","SocketPath","addKubernetesEndpoint","addAgentEndpoint","platformLabel","addEdgeAgentEndpoint","addAzureEndpoint","EndpointController","DEPLOYMENT_TABS","PLATFORM_TYPES","platformType","azureEndpoint","agentEndpoint","edgeEndpoint","allowSelfSignedCerts","dockerCommands","edgeId","edgeKey","copyEdgeAgentDeploymentCommand","randomEdgeID","EdgeKey","copyEdgeAgentKey","onDeassociateEndpoint","AzureCredentials","ApplicationID","TenantID","AuthenticationKey","evt","edgeKeyDetails","keyInformation","decodedKey","instanceURL","tunnelServerAddr","decodeEdgeKey","EndpointsController","mapGroupNameToEndpoint","GroupsController","deleteGroup","MotdService","connectingToEdgeEndpoint","homepageLoadTime","goToEdit","goToDashboard","wait","seconds","BackupService","backupInProgress","BackupFile","restoreAsyncFn","waitPortainerRestart","restoreAndRefresh","ConfirmPassword","process","showInitPassword","showRestorePortainer","togglePanel","createAdminUser","initAdministrator","InitEndpointController","createLocalEndpointAsync","createLocalKubernetesEndpointAsync","createAgentEndpointAsync","endpointSections","isConnectButtonDisabled","createAgentEndpoint","skipEndpointCreation","routeName","LogoutController","getWidth","innerWidth","newValue","toggleSidebar","nonBrowsableTypes","regAttrMsg","registriesMsg","deleteSelectedRegistries","SettingsAuthenticationController","prepareLDAPSettings","tlscaFile","isADServer","ldap","uploadRequired","availableUserSessionTimeoutOptions","authOptions","onChangeAuthMethod","authenticationMethodSelected","isOauthEnabled","LDAPConnectivityCheck","connectivityCheckInProgress","failedConnectivityCheck","successfulConnectivityCheck","saveSettings","isLDAPFormValid","isTLSMode","authMethod","updateSettings","s3BackupFeatureId","backupOptions","availableKubeconfigExpiryOptions","featureLimited","BACKUP_FORM_TYPES","S3","FILE","customLogo","passwordProtect","backupFormType","onBackupOptionsChange","removeFilteredContainerLabel","addFilteredContainerLabel","downloadBackup","saveApplicationSettings","SidebarController","isClusterAdmin","uiVersion","isLeader","checkPermissions","getAutoUpdatesProperty","uploadYamlValidationError","selectedTemplateId","editorYamlValidationError","addAdditionalFiles","removeAdditionalFiles","composeSyntaxMaxVersion","ComposeSyntaxMaxVersion","getContainerNames","stopStackAsync","startStackAsync","retrieveSwarmStackResources","stackFilter","assignSwarmStackResources","retrieveComposeStackResources","assignComposeStackResources","loadExternalStack","loadExternalSwarmStack","loadExternalComposeStack","migrateRequest","originalEndpointId","removeStack","associateStack","stopStack","startStack","regular","orphaned","resourcesPromise","isSwarm","StacksController","loadCreateEnabled","TagsController","checkNameValidity","removeUserFromArray","pagination_count_users","pagination_count_members","sortTypeUsers","sortReverseUsers","teamMembers","leaderCount","orderUsers","changePaginationCountUsers","sortTypeGroupMembers","sortReverseGroupMembers","orderGroupMembers","changePaginationCountGroupMembers","deleteTeam","promoteToLeader","updateMembership","MembershipId","TeamRole","demoteToMember","addAllUsers","addUser","removeAllUsers","deleteMembership","removeUser","assignUsersAndMembers","Leaders","team_name","addTeam","teamName","createTeam","deleteSelectedTeams","userLeadingTeams","createContainerFromTemplate","templateConfiguration","generatedVolumeCount","determineRequiredGeneratedVolumeCount","generatedVolumeIds","createXAutoGeneratedLocalVolumes","addExtraHost","removeExtraHost","createStackFromTemplate","createComposeStackFromTemplate","updatePasswordError","Administrator","deleteUser","updateUser","oldUsername","isSubmitEnabled","isDeleteDisabled","userCreationError","validUsername","checkUsernameValidity","toLocaleLowerCase","createUser","deleteSelectedUsers","assignTeamLeaders","endpointTitle","active","setupTests","prepareResources","CmdMode","prepareCmd","EntrypointMode","prepareEntrypoint","NetworkContainer","networkMode","MacAddress","IPAMConfig","IPv4Address","IPv4","IPv6Address","IPv6","fromContainer","dnsServers","DnsPrimary","DnsSecondary","Dns","prepareNetworkConfig","preparePortBindings","Console","prepareConsole","prepareEnvironmentVariables","Devices","pathOnHost","pathInContainer","PathOnHost","PathInContainer","CgroupPermissions","prepareDevices","LogConfig","prepareLogDriver","notAllowed","getCapName","CapAdd","CapDrop","prepareCapabilities","sysctls","Sysctls","sysctl","prepareSysctls","loadFromContainerSpec","logConfig","commandArrayToString","sortAndCombinePorts","loadFromContainerPortBindings","loadFromContainerVolumes","netContainer","runningContainers","fromContainerMultipleNetworks","firstNetwork","extraNetworks","extraHosts","loadFromContainerNetworkConfig","loadFromContainerLabels","dev","loadFromContainerDevices","loadFromContainerResources","hasCapability","loadFromContainerCapabilities","loadFromContainerSysctls","oldContainer","findCurrentContainer","alwaysPull","stopAndRenameContainer","createNewContainer","connectToExtraNetworks","removeOldContainer","onSuccess","onCreationProcessFail","restoreOldContainerName","restoreError","stopContainerIfNeeded","newContainerId","networkName","settingUnlimitedResources","onImageNameChange","PublishAllPorts","Init","addDevice","removeDevice","addSysctl","removeSysctl","resetNetworkConfig","handleResourceChange","showDeviceMapping","shouldShowDevices","showSysctls","shouldShowSysctls","areContainerCapabilitiesEnabled","checkIfContainerCapabilitiesEnabled","isAdminOrEndpointAdmin","vol1","vol2","availableRuntimes","Runtimes","allowPrivilegedMode","loggingDrivers","onDownloadLogsClick","onClearLogsClick","publishedUrl","isPrimary","beFeatureIndicator","onSwitchModeClick","explanation","porSwitch","statusIndicator","endpointList","endpointSelections","linkTitle"],"mappings":"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","file":"main.d0be16110b99647a33e0.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t0: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([689,1]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","export * from './constants';\n\n/**\n * KubernetesApplication Model (Composite)\n */\nconst _KubernetesApplication = Object.freeze({\n Id: '',\n Name: '',\n StackName: '',\n StackId: '',\n ApplicationKind: '',\n ApplicationOwner: '',\n ApplicationName: '',\n ResourcePool: '',\n Image: '',\n CreationDate: 0,\n Pods: [],\n Containers: [],\n Metadata: {},\n Limits: {},\n ServiceType: '',\n ServiceId: '',\n ServiceName: '',\n HeadlessServiceName: undefined, // only used for StatefulSet\n LoadBalancerIPAddress: undefined, // only filled when bound service is LoadBalancer and state is available\n PublishedPorts: [],\n Volumes: [],\n Env: [],\n PersistedFolders: [], // KubernetesApplicationPersistedFolder list\n ConfigurationVolumes: [], // KubernetesApplicationConfigurationVolume list\n DeploymentType: 'Unknown',\n DataAccessPolicy: 'Unknown',\n ApplicationType: 'Unknown',\n RunningPodsCount: 0,\n TotalPodsCount: 0,\n Yaml: '',\n Note: '',\n Revisions: undefined,\n CurrentRevision: undefined,\n Raw: undefined, // only filled when inspecting app details / create / edit view (never filled in multiple-apps views)\n AutoScaler: undefined, // only filled if the application has an HorizontalPodAutoScaler bound to it\n});\n\nexport class KubernetesApplication {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesApplication)));\n }\n}\n\n/**\n * HelmApplication Model (Composite)\n */\nexport class HelmApplication {\n constructor() {\n this.Id = '';\n this.Name = '';\n this.KubernetesApplications = [];\n this.ApplicationOwner = '';\n this.CreationDate = 0;\n this.ApplicationType = 'Unknown';\n this.Status = '';\n this.StackName = '-';\n this.ResourcePool = '-';\n this.Image = '-';\n this.PublishedPorts = [];\n }\n}\n\n/**\n * KubernetesApplicationPersistedFolder Model\n */\nconst _KubernetesApplicationPersistedFolder = Object.freeze({\n MountPath: '',\n PersistentVolumeClaimName: '',\n HostPath: '',\n});\n\nexport class KubernetesApplicationPersistedFolder {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesApplicationPersistedFolder)));\n }\n}\n\n/**\n * KubernetesApplicationConfigurationVolume Model\n */\nconst _KubernetesApplicationConfigurationVolume = Object.freeze({\n fileMountPath: '',\n rootMountPath: '',\n configurationKey: '',\n configurationName: '',\n});\n\nexport class KubernetesApplicationConfigurationVolume {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesApplicationConfigurationVolume)));\n }\n}\n\n/**\n * KubernetesApplicationPort Model\n */\nconst _KubernetesApplicationPort = Object.freeze({\n IngressRules: [], // KubernetesIngressRule[]\n NodePort: 0,\n TargetPort: 0,\n Port: 0,\n Protocol: '',\n});\n\nexport class KubernetesApplicationPort {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesApplicationPort)));\n }\n}\n\nexport const KubernetesDeploymentTypes = Object.freeze({\n GIT: 'git',\n CONTENT: 'content',\n APPLICATION_FORM: 'application form',\n URL: 'url',\n});\n","export default class PortainerError {\n constructor(msg, err) {\n this.msg = msg;\n this.err = err;\n }\n}\n","/**\n * JS reference of portainer.go#EndpointType iota\n */\nexport const PortainerEndpointTypes = Object.freeze({\n // DockerEnvironment represents an endpoint connected to a Docker environment\n DockerEnvironment: 1,\n // AgentOnDockerEnvironment represents an endpoint connected to a Portainer agent deployed on a Docker environment\n AgentOnDockerEnvironment: 2,\n // AzureEnvironment represents an endpoint connected to an Azure environment\n AzureEnvironment: 3,\n // EdgeAgentOnDockerEnvironment represents an endpoint connected to an Edge agent deployed on a Docker environment\n EdgeAgentOnDockerEnvironment: 4,\n // KubernetesLocalEnvironment represents an endpoint connected to a local Kubernetes environment\n KubernetesLocalEnvironment: 5,\n // AgentOnKubernetesEnvironment represents an endpoint connected to a Portainer agent deployed on a Kubernetes environment\n AgentOnKubernetesEnvironment: 6,\n // EdgeAgentOnKubernetesEnvironment represents an endpoint connected to an Edge agent deployed on a Kubernetes environment\n EdgeAgentOnKubernetesEnvironment: 7,\n});\n\n/**\n * JS reference of endpoint_create.go#EndpointCreationType iota\n */\nexport const PortainerEndpointCreationTypes = Object.freeze({\n LocalDockerEnvironment: 1,\n AgentEnvironment: 2,\n AzureEnvironment: 3,\n EdgeAgentEnvironment: 4,\n LocalKubernetesEnvironment: 5,\n});\n\nexport const PortainerEndpointConnectionTypes = Object.freeze({\n DOCKER_LOCAL: 1,\n KUBERNETES_LOCAL: 2,\n REMOTE: 3,\n AZURE: 4,\n AGENT: 5,\n EDGE: 6,\n});\n","/**\n * Generic params\n */\nexport function KubernetesCommonParams() {\n return {\n id: '',\n };\n}\n","export const K8S_RESOURCE_POOL_LB_QUOTA = 'k8s-resourcepool-Ibquota';\nexport const K8S_RESOURCE_POOL_STORAGE_QUOTA = 'k8s-resourcepool-storagequota';\nexport const RBAC_ROLES = 'rbac-roles';\nexport const REGISTRY_MANAGEMENT = 'registry-management';\nexport const K8S_SETUP_DEFAULT = 'k8s-setup-default';\nexport const S3_BACKUP_SETTING = 's3-backup-setting';\nexport const HIDE_INTERNAL_AUTHENTICATION_PROMPT = 'hide-internal-authentication-prompt';\nexport const TEAM_MEMBERSHIP = 'team-membership';\nexport const HIDE_INTERNAL_AUTH = 'hide-internal-auth';\nexport const EXTERNAL_AUTH_LDAP = 'external-auth-ldap';\nexport const ACTIVITY_AUDIT = 'activity-audit';\nexport const HIDE_AUTO_UPDATE_WINDOW = 'hide-auto-update-window';\nexport const FORCE_REDEPLOYMENT = 'force-redeployment';\n","import _ from 'lodash-es';\nimport filesizeParser from 'filesize-parser';\nimport { KubernetesResourceReservation } from 'Kubernetes/models/resource-reservation/models';\n\nclass KubernetesResourceReservationHelper {\n static computeResourceReservation(pods) {\n const containers = _.reduce(pods, (acc, pod) => _.concat(acc, pod.Containers), []);\n\n return _.reduce(\n containers,\n (acc, container) => {\n if (container.Requests) {\n if (container.Requests.memory) {\n acc.Memory += filesizeParser(container.Requests.memory, { base: 10 });\n }\n\n if (container.Requests.cpu) {\n acc.CPU += KubernetesResourceReservationHelper.parseCPU(container.Requests.cpu);\n }\n }\n\n return acc;\n },\n new KubernetesResourceReservation()\n );\n }\n\n static parseCPU(cpu) {\n let res = parseInt(cpu, 10);\n if (_.endsWith(cpu, 'm')) {\n res /= 1000;\n } else if (_.endsWith(cpu, 'n')) {\n res /= 1000000000;\n }\n return res;\n }\n\n static megaBytesValue(value) {\n return Math.floor(filesizeParser(value) / 1000 / 1000);\n }\n\n static bytesValue(mem) {\n return filesizeParser(mem) * 1000 * 1000;\n }\n}\nexport default KubernetesResourceReservationHelper;\n","export const KubernetesDeployManifestTypes = Object.freeze({\n KUBERNETES: 1,\n COMPOSE: 2,\n});\n\nexport const KubernetesDeployBuildMethods = Object.freeze({\n GIT: 1,\n WEB_EDITOR: 2,\n CUSTOM_TEMPLATE: 3,\n URL: 4,\n});\n\nexport const KubernetesDeployRequestMethods = Object.freeze({\n REPOSITORY: 'repository',\n STRING: 'string',\n URL: 'url',\n});\n\nexport const RepositoryMechanismTypes = Object.freeze({\n WEBHOOK: 'Webhook',\n INTERVAL: 'Interval',\n});\n","import _ from 'lodash-es';\nimport { KubernetesPortMapping, KubernetesPortMappingPort } from 'Kubernetes/models/port/models';\nimport { KubernetesServiceTypes } from 'Kubernetes/models/service/models';\nimport { KubernetesConfigurationTypes } from 'Kubernetes/models/configuration/models';\nimport {\n KubernetesApplicationAutoScalerFormValue,\n KubernetesApplicationConfigurationFormValue,\n KubernetesApplicationConfigurationFormValueOverridenKey,\n KubernetesApplicationConfigurationFormValueOverridenKeyTypes,\n KubernetesApplicationEnvironmentVariableFormValue,\n KubernetesApplicationPersistedFolderFormValue,\n KubernetesApplicationPlacementFormValue,\n KubernetesApplicationPublishedPortFormValue,\n} from 'Kubernetes/models/application/formValues';\nimport {\n KubernetesApplicationEnvConfigMapPayload,\n KubernetesApplicationEnvPayload,\n KubernetesApplicationEnvSecretPayload,\n KubernetesApplicationVolumeConfigMapPayload,\n KubernetesApplicationVolumeEntryPayload,\n KubernetesApplicationVolumeMountPayload,\n KubernetesApplicationVolumePersistentPayload,\n KubernetesApplicationVolumeSecretPayload,\n} from 'Kubernetes/models/application/payloads';\nimport KubernetesVolumeHelper from 'Kubernetes/helpers/volumeHelper';\nimport { KubernetesApplicationDeploymentTypes, KubernetesApplicationPlacementTypes, KubernetesApplicationTypes, HelmApplication } from 'Kubernetes/models/application/models';\nimport { KubernetesPodAffinity, KubernetesPodNodeAffinityNodeSelectorRequirementOperators } from 'Kubernetes/pod/models';\nimport {\n KubernetesNodeSelectorRequirementPayload,\n KubernetesNodeSelectorTermPayload,\n KubernetesPodNodeAffinityPayload,\n KubernetesPreferredSchedulingTermPayload,\n} from 'Kubernetes/pod/payloads/affinities';\n\nexport const PodKubernetesInstanceLabel = 'app.kubernetes.io/instance';\nexport const PodManagedByLabel = 'app.kubernetes.io/managed-by';\n\nclass KubernetesApplicationHelper {\n /* #region UTILITY FUNCTIONS */\n static isExternalApplication(application) {\n return !application.ApplicationOwner;\n }\n\n static associatePodsAndApplication(pods, selector) {\n return _.filter(pods, ['metadata.labels', selector.matchLabels]);\n }\n\n static associateContainerPersistedFoldersAndConfigurations(app, containers) {\n _.forEach(containers, (container) => {\n container.PersistedFolders = _.without(\n _.map(app.PersistedFolders, (pf) => {\n if (pf.MountPath && _.includes(_.map(container.VolumeMounts, 'mountPath'), pf.MountPath)) {\n return pf;\n }\n }),\n undefined\n );\n\n container.ConfigurationVolumes = _.without(\n _.map(app.ConfigurationVolumes, (cv) => {\n if (cv.rootMountPath && _.includes(_.map(container.VolumeMounts, 'mountPath'), cv.rootMountPath)) {\n return cv;\n }\n }),\n undefined\n );\n });\n }\n\n static associateContainersAndApplication(app) {\n if (!app.Pods || app.Pods.length === 0) {\n return [];\n }\n const containers = app.Pods[0].Containers;\n KubernetesApplicationHelper.associateContainerPersistedFoldersAndConfigurations(app, containers);\n return containers;\n }\n\n static associateAllContainersAndApplication(app) {\n const containers = _.flatMap(_.map(app.Pods, 'Containers'));\n KubernetesApplicationHelper.associateContainerPersistedFoldersAndConfigurations(app, containers);\n return containers;\n }\n\n static portMappingsFromApplications(applications) {\n const res = _.reduce(\n applications,\n (acc, app) => {\n if (app.PublishedPorts.length > 0) {\n const mapping = new KubernetesPortMapping();\n mapping.Name = app.Name;\n mapping.ResourcePool = app.ResourcePool;\n mapping.ServiceType = app.ServiceType;\n mapping.LoadBalancerIPAddress = app.LoadBalancerIPAddress;\n mapping.ApplicationOwner = app.ApplicationOwner;\n\n mapping.Ports = _.map(app.PublishedPorts, (item) => {\n const port = new KubernetesPortMappingPort();\n port.Port = mapping.ServiceType === KubernetesServiceTypes.NODE_PORT ? item.NodePort : item.Port;\n port.TargetPort = item.TargetPort;\n port.Protocol = item.Protocol;\n port.IngressRules = item.IngressRules;\n return port;\n });\n acc.push(mapping);\n }\n return acc;\n },\n []\n );\n return res;\n }\n /* #endregion */\n\n /* #region ENV VARIABLES FV <> ENV */\n static generateEnvFromEnvVariables(envVariables) {\n _.remove(envVariables, (item) => item.NeedsDeletion);\n const env = _.map(envVariables, (item) => {\n const res = new KubernetesApplicationEnvPayload();\n res.name = item.Name;\n if (item.Value === undefined) {\n delete res.value;\n } else {\n res.value = item.Value;\n }\n return res;\n });\n return env;\n }\n\n static generateEnvVariablesFromEnv(env) {\n const envVariables = _.map(env, (item) => {\n if (item.valueFrom) {\n return;\n }\n const res = new KubernetesApplicationEnvironmentVariableFormValue();\n res.Name = item.name;\n res.Value = item.value;\n res.IsNew = false;\n res.NameIndex = item.name;\n return res;\n });\n return _.without(envVariables, undefined);\n }\n /* #endregion */\n\n /* #region CONFIGURATIONS FV <> ENV & VOLUMES */\n static generateConfigurationFormValuesFromEnvAndVolumes(env, volumes, configurations) {\n const finalRes = _.flatMap(configurations, (cfg) => {\n const filterCondition = cfg.Type === KubernetesConfigurationTypes.CONFIGMAP ? 'valueFrom.configMapKeyRef.name' : 'valueFrom.secretKeyRef.name';\n\n const cfgEnv = _.filter(env, [filterCondition, cfg.Name]);\n const cfgVol = _.filter(volumes, { configurationName: cfg.Name });\n if (!cfgEnv.length && !cfgVol.length) {\n return;\n }\n const keys = _.reduce(\n _.keys(cfg.Data),\n (acc, k) => {\n const keyEnv = _.filter(cfgEnv, { name: k });\n const keyVol = _.filter(cfgVol, { configurationKey: k });\n const key = {\n Key: k,\n Count: keyEnv.length + keyVol.length,\n Sum: _.concat(keyEnv, keyVol),\n EnvCount: keyEnv.length,\n VolCount: keyVol.length,\n };\n acc.push(key);\n return acc;\n },\n []\n );\n\n const max = _.max(_.map(keys, 'Count'));\n const overrideThreshold = max - _.max(_.map(keys, 'VolCount'));\n const res = _.map(new Array(max), () => new KubernetesApplicationConfigurationFormValue());\n _.forEach(res, (item, index) => {\n item.SelectedConfiguration = cfg;\n const overriden = index >= overrideThreshold;\n if (overriden) {\n item.Overriden = true;\n item.OverridenKeys = _.map(keys, (k) => {\n const fvKey = new KubernetesApplicationConfigurationFormValueOverridenKey();\n fvKey.Key = k.Key;\n if (!k.Count) {\n // !k.Count indicates k.Key is new added to the configuration and has not been loaded to the application yet\n fvKey.Type = KubernetesApplicationConfigurationFormValueOverridenKeyTypes.NONE;\n } else if (index < k.EnvCount) {\n fvKey.Type = KubernetesApplicationConfigurationFormValueOverridenKeyTypes.ENVIRONMENT;\n } else {\n fvKey.Type = KubernetesApplicationConfigurationFormValueOverridenKeyTypes.FILESYSTEM;\n fvKey.Path = k.Sum[index].rootMountPath;\n }\n return fvKey;\n });\n }\n });\n return res;\n });\n return _.without(finalRes, undefined);\n }\n\n static generateEnvOrVolumesFromConfigurations(app, configurations) {\n let finalEnv = [];\n let finalVolumes = [];\n let finalMounts = [];\n\n _.forEach(configurations, (config) => {\n const isBasic = config.SelectedConfiguration.Type === KubernetesConfigurationTypes.CONFIGMAP;\n\n if (!config.Overriden) {\n const envKeys = _.keys(config.SelectedConfiguration.Data);\n _.forEach(envKeys, (item) => {\n const res = isBasic ? new KubernetesApplicationEnvConfigMapPayload() : new KubernetesApplicationEnvSecretPayload();\n res.name = item;\n if (isBasic) {\n res.valueFrom.configMapKeyRef.name = config.SelectedConfiguration.Name;\n res.valueFrom.configMapKeyRef.key = item;\n } else {\n res.valueFrom.secretKeyRef.name = config.SelectedConfiguration.Name;\n res.valueFrom.secretKeyRef.key = item;\n }\n finalEnv.push(res);\n });\n } else {\n const envKeys = _.filter(config.OverridenKeys, (item) => item.Type === KubernetesApplicationConfigurationFormValueOverridenKeyTypes.ENVIRONMENT);\n _.forEach(envKeys, (item) => {\n const res = isBasic ? new KubernetesApplicationEnvConfigMapPayload() : new KubernetesApplicationEnvSecretPayload();\n res.name = item.Key;\n if (isBasic) {\n res.valueFrom.configMapKeyRef.name = config.SelectedConfiguration.Name;\n res.valueFrom.configMapKeyRef.key = item.Key;\n } else {\n res.valueFrom.secretKeyRef.name = config.SelectedConfiguration.Name;\n res.valueFrom.secretKeyRef.key = item.Key;\n }\n finalEnv.push(res);\n });\n\n const volKeys = _.filter(config.OverridenKeys, (item) => item.Type === KubernetesApplicationConfigurationFormValueOverridenKeyTypes.FILESYSTEM);\n const groupedVolKeys = _.groupBy(volKeys, 'Path');\n _.forEach(groupedVolKeys, (items, path) => {\n const volumeName = KubernetesVolumeHelper.generatedApplicationConfigVolumeName(app.Name);\n const configurationName = config.SelectedConfiguration.Name;\n const itemsMap = _.map(items, (item) => {\n const entry = new KubernetesApplicationVolumeEntryPayload();\n entry.key = item.Key;\n entry.path = item.Key;\n return entry;\n });\n\n const mount = isBasic ? new KubernetesApplicationVolumeMountPayload() : new KubernetesApplicationVolumeMountPayload(true);\n const volume = isBasic ? new KubernetesApplicationVolumeConfigMapPayload() : new KubernetesApplicationVolumeSecretPayload();\n\n mount.name = volumeName;\n mount.mountPath = path;\n volume.name = volumeName;\n if (isBasic) {\n volume.configMap.name = configurationName;\n volume.configMap.items = itemsMap;\n } else {\n volume.secret.secretName = configurationName;\n volume.secret.items = itemsMap;\n }\n\n finalMounts.push(mount);\n finalVolumes.push(volume);\n });\n }\n });\n app.Env = _.concat(app.Env, finalEnv);\n app.Volumes = _.concat(app.Volumes, finalVolumes);\n app.VolumeMounts = _.concat(app.VolumeMounts, finalMounts);\n return app;\n }\n /* #endregion */\n\n /* #region PUBLISHED PORTS FV <> PUBLISHED PORTS */\n static generatePublishedPortsFormValuesFromPublishedPorts(serviceType, publishedPorts, ingress) {\n const generatePort = (port, rule) => {\n const res = new KubernetesApplicationPublishedPortFormValue();\n res.IsNew = false;\n if (rule) {\n res.IngressName = rule.IngressName;\n res.IngressRoute = rule.Path;\n res.IngressHost = rule.Host;\n res.IngressHosts = ingress && ingress.find((i) => i.Name === rule.IngressName).Hosts;\n }\n res.Protocol = port.Protocol;\n res.ContainerPort = port.TargetPort;\n if (serviceType === KubernetesServiceTypes.LOAD_BALANCER) {\n res.LoadBalancerPort = port.Port;\n res.LoadBalancerNodePort = port.NodePort;\n } else if (serviceType === KubernetesServiceTypes.NODE_PORT) {\n res.NodePort = port.NodePort;\n }\n return res;\n };\n\n const finalRes = _.flatMap(publishedPorts, (port) => {\n if (port.IngressRules.length) {\n return _.map(port.IngressRules, (rule) => generatePort(port, rule));\n }\n return generatePort(port);\n });\n return finalRes;\n }\n /* #endregion */\n\n /* #region AUTOSCALER FV <> HORIZONTAL POD AUTOSCALER */\n static generateAutoScalerFormValueFromHorizontalPodAutoScaler(autoScaler, replicasCount) {\n const res = new KubernetesApplicationAutoScalerFormValue();\n if (autoScaler) {\n res.IsUsed = true;\n res.MinReplicas = autoScaler.MinReplicas;\n res.MaxReplicas = autoScaler.MaxReplicas;\n res.TargetCPUUtilization = autoScaler.TargetCPUUtilization;\n res.ApiVersion = autoScaler.ApiVersion;\n } else {\n res.ApiVersion = 'apps/v1';\n res.MinReplicas = replicasCount;\n res.MaxReplicas = replicasCount;\n }\n return res;\n }\n\n /* #endregion */\n\n /* #region PERSISTED FOLDERS FV <> VOLUMES */\n static generatePersistedFoldersFormValuesFromPersistedFolders(persistedFolders, persistentVolumeClaims) {\n const finalRes = _.map(persistedFolders, (folder) => {\n const pvc = _.find(persistentVolumeClaims, (item) => _.startsWith(item.Name, folder.PersistentVolumeClaimName));\n const res = new KubernetesApplicationPersistedFolderFormValue(pvc.StorageClass);\n res.PersistentVolumeClaimName = folder.PersistentVolumeClaimName;\n res.Size = parseInt(pvc.Storage, 10);\n res.SizeUnit = pvc.Storage.slice(-2);\n res.ContainerPath = folder.MountPath;\n return res;\n });\n return finalRes;\n }\n\n static generateVolumesFromPersistentVolumClaims(app, volumeClaims) {\n app.VolumeMounts = [];\n app.Volumes = [];\n _.forEach(volumeClaims, (item) => {\n const volumeMount = new KubernetesApplicationVolumeMountPayload();\n const name = item.Name;\n volumeMount.name = name;\n volumeMount.mountPath = item.MountPath;\n app.VolumeMounts.push(volumeMount);\n\n const volume = new KubernetesApplicationVolumePersistentPayload();\n volume.name = name;\n volume.persistentVolumeClaim.claimName = name;\n app.Volumes.push(volume);\n });\n }\n\n static hasRWOOnly(formValues) {\n return _.find(formValues.PersistedFolders, (item) => item.StorageClass && _.isEqual(item.StorageClass.AccessModes, ['RWO']));\n }\n\n static hasRWX(claims) {\n return _.find(claims, (item) => item.StorageClass && _.includes(item.StorageClass.AccessModes, 'RWX')) !== undefined;\n }\n /* #endregion */\n\n /* #region PLACEMENTS FV <> AFFINITY */\n static generatePlacementsFormValuesFromAffinity(formValues, podAffinity, nodesLabels) {\n let placements = formValues.Placements;\n let type = formValues.PlacementType;\n const affinity = podAffinity.nodeAffinity;\n if (affinity && affinity.requiredDuringSchedulingIgnoredDuringExecution) {\n type = KubernetesApplicationPlacementTypes.MANDATORY;\n _.forEach(affinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms, (term) => {\n _.forEach(term.matchExpressions, (exp) => {\n const placement = new KubernetesApplicationPlacementFormValue();\n const label = _.find(nodesLabels, { Key: exp.key });\n placement.Label = label;\n placement.Value = exp.values[0];\n placement.IsNew = false;\n placements.push(placement);\n });\n });\n } else if (affinity && affinity.preferredDuringSchedulingIgnoredDuringExecution) {\n type = KubernetesApplicationPlacementTypes.PREFERRED;\n _.forEach(affinity.preferredDuringSchedulingIgnoredDuringExecution, (term) => {\n _.forEach(term.preference.matchExpressions, (exp) => {\n const placement = new KubernetesApplicationPlacementFormValue();\n const label = _.find(nodesLabels, { Key: exp.key });\n placement.Label = label;\n placement.Value = exp.values[0];\n placement.IsNew = false;\n placements.push(placement);\n });\n });\n }\n formValues.Placements = placements;\n formValues.PlacementType = type;\n }\n\n static generateAffinityFromPlacements(app, formValues) {\n if (formValues.DeploymentType === KubernetesApplicationDeploymentTypes.REPLICATED) {\n const placements = formValues.Placements;\n const res = new KubernetesPodNodeAffinityPayload();\n let expressions = _.map(placements, (p) => {\n if (!p.NeedsDeletion) {\n const exp = new KubernetesNodeSelectorRequirementPayload();\n exp.key = p.Label.Key;\n if (p.Value) {\n exp.operator = KubernetesPodNodeAffinityNodeSelectorRequirementOperators.IN;\n exp.values = [p.Value];\n } else {\n exp.operator = KubernetesPodNodeAffinityNodeSelectorRequirementOperators.EXISTS;\n delete exp.values;\n }\n return exp;\n }\n });\n expressions = _.without(expressions, undefined);\n if (expressions.length) {\n if (formValues.PlacementType === KubernetesApplicationPlacementTypes.MANDATORY) {\n const term = new KubernetesNodeSelectorTermPayload();\n term.matchExpressions = expressions;\n res.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms.push(term);\n delete res.preferredDuringSchedulingIgnoredDuringExecution;\n } else if (formValues.PlacementType === KubernetesApplicationPlacementTypes.PREFERRED) {\n const term = new KubernetesPreferredSchedulingTermPayload();\n term.preference = new KubernetesNodeSelectorTermPayload();\n term.preference.matchExpressions = expressions;\n res.preferredDuringSchedulingIgnoredDuringExecution.push(term);\n delete res.requiredDuringSchedulingIgnoredDuringExecution;\n }\n app.Affinity = new KubernetesPodAffinity();\n app.Affinity.nodeAffinity = res;\n }\n }\n }\n /* #endregion */\n\n /**\n * Get Helm managed applications\n * @param {KubernetesApplication[]} applications Application list\n * @returns {Object} { [releaseName]: [app1, app2, ...], [releaseName2]: [app3, app4, ...] }\n */\n static getHelmApplications(applications) {\n // filter out all the applications that are managed by helm\n // to identify the helm managed applications, we need to check if the applications pod labels include\n // `app.kubernetes.io/instance` and `app.kubernetes.io/managed-by` = `helm`\n const helmManagedApps = applications.filter(\n (app) => app.Metadata.labels && app.Metadata.labels[PodKubernetesInstanceLabel] && app.Metadata.labels[PodManagedByLabel] === 'Helm'\n );\n\n // groups the helm managed applications by helm release name\n // the release name is retrieved from the `app.kubernetes.io/instance` label on the pods within the apps\n // `namespacedHelmReleases` object structure:\n // {\n // [namespace1]: {\n // [releaseName]: [app1, app2, ...],\n // },\n // [namespace2]: {\n // [releaseName2]: [app1, app2, ...],\n // }\n // }\n const namespacedHelmReleases = {};\n helmManagedApps.forEach((app) => {\n const namespace = app.ResourcePool;\n const instanceLabel = app.Metadata.labels[PodKubernetesInstanceLabel];\n if (namespacedHelmReleases[namespace]) {\n namespacedHelmReleases[namespace][instanceLabel] = [...(namespacedHelmReleases[namespace][instanceLabel] || []), app];\n } else {\n namespacedHelmReleases[namespace] = { [instanceLabel]: [app] };\n }\n });\n\n // `helmAppsEntriesList` object structure:\n // [\n // [\"airflow-test\", Array(5)],\n // [\"traefik\", Array(1)],\n // [\"airflow-test\", Array(2)],\n // ...,\n // ]\n const helmAppsEntriesList = Object.values(namespacedHelmReleases).flatMap((r) => Object.entries(r));\n const helmAppsList = helmAppsEntriesList.map(([helmInstance, applications]) => {\n const helmApp = new HelmApplication();\n helmApp.Name = helmInstance;\n helmApp.ApplicationType = KubernetesApplicationTypes.HELM;\n helmApp.ApplicationOwner = applications[0].ApplicationOwner;\n helmApp.KubernetesApplications = applications;\n\n // the status of helm app is `Ready` based on whether the underlying RunningPodsCount of the k8s app\n // reaches the TotalPodsCount of the app\n const appsNotReady = applications.some((app) => app.RunningPodsCount < app.TotalPodsCount);\n helmApp.Status = appsNotReady ? 'Not ready' : 'Ready';\n\n // use earliest date\n helmApp.CreationDate = applications.map((app) => app.CreationDate).sort((a, b) => new Date(a) - new Date(b))[0];\n\n // use first app namespace as helm app namespace\n helmApp.ResourcePool = applications[0].ResourcePool;\n\n // required for persisting table expansion state and differenting same named helm apps across different namespaces\n helmApp.Id = helmApp.ResourcePool + '-' + helmApp.Name.toLowerCase().replaceAll(' ', '-');\n\n return helmApp;\n });\n\n return helmAppsList;\n }\n\n /**\n * Get nested applications -\n * @param {KubernetesApplication[]} applications Application list\n * @returns {Object} { helmApplications: [app1, app2, ...], nonHelmApplications: [app3, app4, ...] }\n */\n static getNestedApplications(applications) {\n const helmApplications = KubernetesApplicationHelper.getHelmApplications(applications);\n\n // filter out helm managed applications\n const helmAppNames = [...new Set(helmApplications.map((hma) => hma.Name))]; // distinct helm app names\n const nonHelmApplications = applications.filter((app) => {\n if (app.Metadata.labels) {\n return !helmAppNames.includes(app.Metadata.labels[PodKubernetesInstanceLabel]);\n }\n return true;\n });\n\n return { helmApplications, nonHelmApplications };\n }\n}\nexport default KubernetesApplicationHelper;\n","import { PorImageRegistryModel } from '@/docker/models/porImageRegistry';\nimport { KubernetesApplicationDataAccessPolicies, KubernetesApplicationDeploymentTypes, KubernetesApplicationPublishingTypes, KubernetesApplicationPlacementTypes } from './models';\n\n/**\n * KubernetesApplicationFormValues Model\n */\nexport function KubernetesApplicationFormValues() {\n this.ApplicationType = undefined; // will only exist for formValues generated from Application (app edit situation;\n this.ResourcePool = {};\n this.Name = '';\n this.StackName = '';\n this.ApplicationOwner = '';\n this.ImageModel = new PorImageRegistryModel();\n this.Note = '';\n this.MemoryLimit = 0;\n this.CpuLimit = 0;\n this.DeploymentType = KubernetesApplicationDeploymentTypes.REPLICATED;\n this.ReplicaCount = 1;\n this.AutoScaler = {};\n this.Containers = [];\n this.EnvironmentVariables = []; // KubernetesApplicationEnvironmentVariableFormValue lis;\n this.DataAccessPolicy = KubernetesApplicationDataAccessPolicies.ISOLATED;\n this.PersistedFolders = []; // KubernetesApplicationPersistedFolderFormValue lis;\n this.Configurations = []; // KubernetesApplicationConfigurationFormValue lis;\n this.PublishingType = KubernetesApplicationPublishingTypes.CLUSTER_IP;\n this.PublishedPorts = []; // KubernetesApplicationPublishedPortFormValue lis;\n this.PlacementType = KubernetesApplicationPlacementTypes.PREFERRED;\n this.Placements = []; // KubernetesApplicationPlacementFormValue lis;\n this.OriginalIngresses = undefined;\n this.IsPublishingService = false;\n}\n\nexport const KubernetesApplicationConfigurationFormValueOverridenKeyTypes = Object.freeze({\n NONE: 0,\n ENVIRONMENT: 1,\n FILESYSTEM: 2,\n});\n\n/**\n * KubernetesApplicationConfigurationFormValueOverridenKey Model\n */\nconst _KubernetesApplicationConfigurationFormValueOverridenKey = Object.freeze({\n Key: '',\n Path: '',\n Type: KubernetesApplicationConfigurationFormValueOverridenKeyTypes.ENVIRONMENT,\n});\n\nexport class KubernetesApplicationConfigurationFormValueOverridenKey {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesApplicationConfigurationFormValueOverridenKey)));\n }\n}\n\n/**\n * KubernetesApplicationConfigurationFormValue Model\n */\nconst _KubernetesApplicationConfigurationFormValue = Object.freeze({\n SelectedConfiguration: undefined,\n Overriden: false,\n OverridenKeys: [], // KubernetesApplicationConfigurationFormValueOverridenKey list\n});\n\nexport class KubernetesApplicationConfigurationFormValue {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesApplicationConfigurationFormValue)));\n }\n}\n\n/**\n * KubernetesApplicationEnvironmentVariableFormValue Model\n */\nconst _KubernetesApplicationEnvironmentVariableFormValue = Object.freeze({\n Name: '',\n Value: '',\n IsSecret: false,\n NeedsDeletion: false,\n IsNew: true,\n NameIndex: '', // keep the original name for sorting\n});\n\nexport class KubernetesApplicationEnvironmentVariableFormValue {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesApplicationEnvironmentVariableFormValue)));\n }\n}\n\n/**\n * KubernetesApplicationPersistedFolderFormValue Model\n */\nconst _KubernetesApplicationPersistedFolderFormValue = Object.freeze({\n PersistentVolumeClaimName: '', // will be empty for new volumes (create/edit app) and filled for existing ones (edit)\n NeedsDeletion: false,\n ContainerPath: '',\n Size: '',\n SizeUnit: 'GB',\n StorageClass: {},\n ExistingVolume: null,\n UseNewVolume: true,\n});\n\nexport class KubernetesApplicationPersistedFolderFormValue {\n constructor(storageClass) {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesApplicationPersistedFolderFormValue)));\n this.StorageClass = storageClass;\n }\n}\n\n/**\n * KubernetesApplicationPublishedPortFormValue Model\n */\nexport function KubernetesApplicationPublishedPortFormValue() {\n return {\n NeedsDeletion: false,\n IsNew: true,\n ContainerPort: '',\n NodePort: '',\n LoadBalancerPort: '',\n LoadBalancerNodePort: undefined, // only filled to save existing loadbalancer nodePort and drop it when moving app exposure from LB to Internal/NodePort\n Protocol: 'TCP',\n IngressName: undefined,\n IngressRoute: undefined,\n IngressHost: undefined,\n IngressHosts: [],\n };\n}\n\nexport function KubernetesApplicationPlacementFormValue() {\n return {\n Label: {},\n Value: '',\n NeedsDeletion: false,\n IsNew: true,\n };\n}\n\n/**\n * KubernetesApplicationAutoScalerFormValue Model\n */\nconst _KubernetesApplicationAutoScalerFormValue = Object.freeze({\n MinReplicas: 0,\n MaxReplicas: 0,\n TargetCPUUtilization: 50,\n ApiVersion: '',\n IsUsed: false,\n});\n\nexport class KubernetesApplicationAutoScalerFormValue {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesApplicationAutoScalerFormValue)));\n }\n}\n\nexport function KubernetesFormValidationReferences() {\n return {\n refs: {},\n hasRefs: false,\n };\n}\n","export const KubernetesPortainerConfigurationOwnerLabel = 'io.portainer.kubernetes.configuration.owner';\nexport const KubernetesPortainerConfigurationDataAnnotation = 'io.portainer.kubernetes.configuration.data';\n\n/**\n * Configuration Model (Composite)\n */\nconst _KubernetesConfiguration = Object.freeze({\n Id: 0,\n Name: '',\n Type: '',\n Namespace: '',\n CreationDate: '',\n ConfigurationOwner: '',\n Used: false,\n Applications: [],\n Data: {},\n});\n\nexport class KubernetesConfiguration {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesConfiguration)));\n }\n}\n\nexport const KubernetesConfigurationTypes = Object.freeze({\n CONFIGMAP: 1,\n SECRET: 2,\n});\n","import _ from 'lodash-es';\n\nimport { KUBERNETES_DEFAULT_NAMESPACE, KUBERNETES_DEFAULT_SYSTEM_NAMESPACES } from 'Kubernetes/models/namespace/models';\nimport { isSystem } from 'Kubernetes/store/namespace';\n\nexport default class KubernetesNamespaceHelper {\n /**\n * Check if namespace is system or not\n * @param {String} namespace Namespace (string name) to evaluate\n * @returns Boolean\n */\n static isSystemNamespace(namespace) {\n return isSystem(namespace);\n }\n\n /**\n * Check if namespace is default or not\n * @param {String} namespace Namespace (string name) to evaluate\n * @returns Boolean\n */\n static isDefaultNamespace(namespace) {\n return namespace === KUBERNETES_DEFAULT_NAMESPACE;\n }\n\n /**\n * Check if namespace is one of the default system namespaces\n * @param {String} namespace Namespace (string name) to evaluate\n * @returns Boolean\n */\n static isDefaultSystemNamespace(namespace) {\n return _.includes(KUBERNETES_DEFAULT_SYSTEM_NAMESPACES, namespace);\n }\n}\n","export const ResourceControlOwnership = Object.freeze({\n PUBLIC: 'public',\n PRIVATE: 'private',\n RESTRICTED: 'restricted',\n ADMINISTRATORS: 'administrators',\n});\n","export const RegistryTypes = Object.freeze({\n ANONYMOUS: 0, // not backend replicated, only for frontend\n QUAY: 1,\n AZURE: 2,\n CUSTOM: 3,\n GITLAB: 4,\n PROGET: 5,\n DOCKERHUB: 6,\n ECR: 7,\n});\n","// Returns the raw response without JSON parsing\nexport function rawResponse(data) {\n const response = {\n data: data,\n };\n return response;\n}\n","function isJSONArray(jsonString) {\n return Object.prototype.toString.call(jsonString) === '[object Array]';\n}\n\nfunction isJSON(jsonString) {\n try {\n var o = JSON.parse(jsonString);\n if (o && typeof o === 'object') {\n return o;\n }\n } catch (e) {\n //empty\n }\n return false;\n}\n\n// The Docker API often returns a list of JSON object.\n// This handler wrap the JSON objects in an array.\n// Used by the API in: Image push, Image create, Events query.\nexport function jsonObjectsToArrayHandler(data) {\n // catching empty data helps the function not to fail and prevents unwanted error message to user.\n if (!data) {\n return [];\n }\n var str = '[' + data.replace(/\\n/g, ' ').replace(/\\}\\s*\\{/g, '}, {') + ']';\n return angular.fromJson(str);\n}\n\n// The Docker API often returns an empty string or a valid JSON object on success (Docker 1.9 -> Docker 1.12).\n// On error, it returns either an error message as a string (Docker < 1.12) or a JSON object with the field message\n// container the error (Docker = 1.12)\n// This handler ensure a valid JSON object is returned in any case.\n// Used by the API in: container deletion, network deletion, network creation, volume creation,\n// container exec, exec resize.\nexport function genericHandler(data) {\n var response = {};\n // No data is returned when deletion is successful (Docker 1.9 -> 1.12)\n if (!data) {\n return response;\n }\n // A string is returned on failure (Docker < 1.12)\n else if (!isJSON(data)) {\n response.message = data;\n }\n // Docker 1.12 returns a valid JSON object when an error occurs\n else {\n response = angular.fromJson(data);\n }\n return response;\n}\n\n// The Docker API returns the logs as a single string.\n// This handler wraps the data in a JSON object under the \"logs\" property.\nexport function logsHandler(data) {\n return {\n logs: data,\n };\n}\n\n// Image delete API returns an array on success (Docker 1.9 -> Docker 1.12).\n// On error, it returns either an error message as a string (Docker < 1.12) or a JSON object with the field message\n// container the error (Docker = 1.12).\n// This handler returns the original array on success or a newly created array containing\n// only one JSON object with the field message filled with the error message on failure.\nexport function deleteImageHandler(data) {\n // A string is returned on failure (Docker < 1.12)\n var response = [];\n if (!isJSON(data)) {\n response.push({ message: data });\n }\n // A JSON object is returned on failure (Docker = 1.12)\n else if (!isJSONArray(data)) {\n var json = angular.fromJson(data);\n response.push(json);\n }\n // An array is returned on success (Docker 1.9 -> 1.12)\n else {\n response = angular.fromJson(data);\n }\n return response;\n}\n","import KubernetesResourceQuotaHelper from 'Kubernetes/helpers/resourceQuotaHelper';\n\nexport const KubernetesPortainerResourceQuotaPrefix = 'portainer-rq-';\nexport const KubernetesPortainerResourceQuotaCPULimit = 'limits.cpu';\nexport const KubernetesPortainerResourceQuotaMemoryLimit = 'limits.memory';\nexport const KubernetesPortainerResourceQuotaCPURequest = 'requests.cpu';\nexport const KubernetesPortainerResourceQuotaMemoryRequest = 'requests.memory';\n\nexport const KubernetesResourceQuotaDefaults = {\n CpuLimit: 0,\n MemoryLimit: 0,\n};\n\nexport function KubernetesResourceQuota(namespace) {\n return {\n Id: '',\n Namespace: namespace ? namespace : '',\n Name: namespace ? KubernetesResourceQuotaHelper.generateResourceQuotaName(namespace) : '',\n CpuLimit: KubernetesResourceQuotaDefaults.CpuLimit,\n MemoryLimit: KubernetesResourceQuotaDefaults.MemoryLimit,\n CpuLimitUsed: KubernetesResourceQuotaDefaults.CpuLimit,\n MemoryLimitUsed: KubernetesResourceQuotaDefaults.MemoryLimit,\n Yaml: '',\n ResourcePoolName: '',\n ResourcePoolOwner: '',\n };\n}\n","export const KubernetesResourceTypes = Object.freeze({\n NAMESPACE: 'Namespace',\n RESOURCEQUOTA: 'ResourceQuota',\n CONFIGMAP: 'ConfigMap',\n SECRET: 'Secret',\n DEPLOYMENT: 'Deployment',\n STATEFULSET: 'StatefulSet',\n DAEMONSET: 'Daemonset',\n PERSISTENT_VOLUME_CLAIM: 'PersistentVolumeClaim',\n SERVICE: 'Service',\n INGRESS: 'Ingress',\n HORIZONTAL_POD_AUTOSCALER: 'HorizontalPodAutoscaler',\n});\n\nexport const KubernetesResourceActions = Object.freeze({\n CREATE: 'Create',\n UPDATE: 'Update',\n DELETE: 'Delete',\n});\n","export const KubernetesServiceHeadlessPrefix = 'headless-';\nexport const KubernetesServiceHeadlessClusterIP = 'None';\nexport const KubernetesServiceTypes = Object.freeze({\n LOAD_BALANCER: 'LoadBalancer',\n NODE_PORT: 'NodePort',\n CLUSTER_IP: 'ClusterIP',\n});\n\n/**\n * KubernetesService Model\n */\nconst _KubernetesService = Object.freeze({\n Headless: false,\n Namespace: '',\n Name: '',\n StackName: '',\n Ports: [],\n Type: '',\n ClusterIP: '',\n ApplicationName: '',\n ApplicationOwner: '',\n Note: '',\n});\n\nexport class KubernetesService {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesService)));\n }\n}\n\n/**\n * KubernetesServicePort Model\n */\nconst _KubernetesServicePort = Object.freeze({\n name: '',\n port: 0,\n targetPort: 0,\n protocol: '',\n nodePort: 0,\n});\n\nexport class KubernetesServicePort {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesServicePort)));\n }\n}\n","import { ResourceControlOwnership as RCO } from 'Portainer/models/resourceControl/resourceControlOwnership';\n\nexport function AccessControlFormData() {\n this.AccessControlEnabled = true;\n this.Ownership = RCO.PRIVATE;\n this.AuthorizedUsers = [];\n this.AuthorizedTeams = [];\n}\n","const autoNgTemplateLoaderTemplate1 = require('./box-selector.html');\n\nimport angular from 'angular';\n\nimport './box-selector.css';\n\nimport controller from './box-selector.controller';\n\nangular.module('portainer.app').component('boxSelector', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n radioName: '@',\n ngModel: '=',\n options: '<',\n onChange: '<',\n },\n});\n\nexport function buildOption(id, icon, label, description, value, feature) {\n return { id, icon, label, description, value, feature };\n}\n","export * from './affinities';\n\n/**\n * KubernetesPod Model\n */\nconst _KubernetesPod = Object.freeze({\n Id: '',\n Name: '',\n Namespace: '',\n Images: [],\n Status: '',\n Restarts: 0,\n Node: '',\n CreationDate: '',\n Containers: [],\n Labels: [],\n Affinity: {}, // KubernetesPodAffinity\n Tolerations: [], // KubernetesPodToleration[]\n NodeSelector: undefined,\n});\n\nexport class KubernetesPod {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesPod)));\n }\n}\n\n/**\n * KubernetesPodToleration Model\n */\nconst _KubernetesPodToleration = Object.freeze({\n Key: '',\n Operator: '',\n Value: '',\n TolerationSeconds: 0,\n Effect: '',\n});\n\nexport class KubernetesPodToleration {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesPodToleration)));\n }\n}\n\nconst _KubernetesPodContainer = Object.freeze({\n Type: 0,\n PodName: '',\n Name: '',\n Image: '',\n ImagePullPolicy: '',\n Node: '',\n CreationDate: '',\n Status: '',\n Limits: {},\n Requests: {},\n VolumeMounts: {},\n ConfigurationVolumes: [],\n PersistedFolders: [],\n Env: [],\n});\n\nexport class KubernetesPodContainer {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesPodContainer)));\n }\n}\n\nconst _KubernetesPodEviction = Object.freeze({\n apiVersion: 'policy/v1beta1',\n kind: 'Eviction',\n metadata: {\n name: '',\n namespace: '',\n },\n});\n\nexport class KubernetesPodEviction {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesPodEviction)));\n }\n}\n\nexport const KubernetesPodContainerTypes = {\n INIT: 1,\n APP: 2,\n};\n","import _ from 'lodash-es';\n\nclass KubernetesCommonHelper {\n static assignOrDeleteIfEmpty(obj, path, value) {\n if (!value || (value instanceof Array && !value.length)) {\n _.unset(obj, path);\n } else {\n _.set(obj, path, value);\n }\n }\n\n static ownerToLabel(owner) {\n let label = _.replace(owner, /[^-A-Za-z0-9_.]/g, '.');\n label = _.truncate(label, { length: 63, omission: '' });\n label = _.replace(label, /^[-_.]*/g, '');\n label = _.replace(label, /[-_.]*$/g, '');\n return label;\n }\n\n static assignOrDeleteIfEmptyOrZero(obj, path, value) {\n if (!value || value === 0 || (value instanceof Array && !value.length)) {\n _.unset(obj, path);\n } else {\n _.set(obj, path, value);\n }\n }\n}\nexport default KubernetesCommonHelper;\n","/**\n * Generic metadata payload\n */\nconst _KubernetesCommonMetadataPayload = Object.freeze({\n uid: '',\n name: '',\n namespace: '',\n labels: {},\n annotations: {},\n});\nexport class KubernetesCommonMetadataPayload {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesCommonMetadataPayload)));\n }\n}\n","import _ from 'lodash-es';\nimport * as JsonPatch from 'fast-json-patch';\n\nimport KubernetesCommonHelper from 'Kubernetes/helpers/commonHelper';\nimport {\n KubernetesResourcePoolIngressClassAnnotationFormValue,\n KubernetesResourcePoolIngressClassFormValue,\n KubernetesResourcePoolIngressClassHostFormValue,\n} from 'Kubernetes/models/resource-pool/formValues';\nimport { KubernetesApplicationPublishingTypes } from '../models/application/models';\nimport { KubernetesIngress, KubernetesIngressRule } from './models';\nimport { KubernetesIngressCreatePayload, KubernetesIngressRuleCreatePayload, KubernetesIngressRulePathCreatePayload } from './payloads';\nimport { KubernetesIngressClassAnnotation, KubernetesIngressClassRewriteTargetAnnotations } from './constants';\n\nexport class KubernetesIngressConverter {\n static apiToModel(data) {\n const paths = _.flatMap(data.spec.rules, (rule) => {\n return !rule.http\n ? []\n : _.map(rule.http.paths, (path) => {\n const ingRule = new KubernetesIngressRule();\n ingRule.IngressName = data.metadata.name;\n ingRule.ServiceName = path.backend.service.name;\n ingRule.Host = rule.host || '';\n ingRule.IP = data.status.loadBalancer.ingress ? data.status.loadBalancer.ingress[0].ip : undefined;\n ingRule.Port = path.backend.service.port.number;\n ingRule.Path = path.path;\n return ingRule;\n });\n });\n\n const res = new KubernetesIngress();\n res.Name = data.metadata.name;\n res.Namespace = data.metadata.namespace;\n res.Annotations = data.metadata.annotations || {};\n res.IngressClassName =\n data.metadata.annotations && data.metadata.annotations[KubernetesIngressClassAnnotation]\n ? data.metadata.annotations[KubernetesIngressClassAnnotation]\n : data.spec.ingressClassName;\n res.Paths = paths;\n res.Hosts = _.uniq(_.map(data.spec.rules, 'host'));\n const idx = _.findIndex(res.Hosts, (h) => h === undefined);\n if (idx >= 0) {\n res.Hosts.splice(idx, 1, '');\n }\n return res;\n }\n\n /**\n * Converts Application Form Value (from Create Application View) to Ingresses\n * @param {KubernetesApplicationFormValues} formValues\n * @param {string} serviceName\n * @returns {KubernetesIngressRule[]}\n */\n static applicationFormValuesToIngresses(formValues, serviceName) {\n const isPublishingToIngress = formValues.PublishingType === KubernetesApplicationPublishingTypes.INGRESS;\n const ingresses = angular.copy(formValues.OriginalIngresses);\n _.forEach(formValues.PublishedPorts, (p) => {\n const ingress = _.find(ingresses, { Name: p.IngressName });\n if (ingress) {\n if (p.NeedsDeletion) {\n _.remove(ingress.Paths, (path) => path.Port === p.ContainerPort && path.ServiceName === serviceName && path.Path === p.IngressRoute);\n } else if (isPublishingToIngress && p.IsNew) {\n const rule = new KubernetesIngressRule();\n rule.IngressName = ingress.Name;\n rule.ServiceName = serviceName;\n rule.Port = p.ContainerPort;\n if (p.IngressRoute) {\n rule.Path = _.startsWith(p.IngressRoute, '/') ? p.IngressRoute : '/' + p.IngressRoute;\n }\n rule.Host = p.IngressHost;\n ingress.Paths.push(rule);\n }\n }\n });\n return ingresses;\n }\n\n /**\n *\n * @param {KubernetesResourcePoolIngressClassFormValue[]} formValues\n * @returns {KubernetesIngress} Ingress\n */\n static resourcePoolIngressClassFormValueToIngress(formValues) {\n const res = new KubernetesIngress();\n res.Name = formValues.IngressClass.Name;\n res.Namespace = formValues.Namespace;\n const pairs = _.map(formValues.Annotations, (a) => [a.Key, a.Value]);\n res.Annotations = _.fromPairs(pairs);\n if (formValues.RewriteTarget) {\n _.extend(res.Annotations, KubernetesIngressClassRewriteTargetAnnotations[formValues.IngressClass.Type]);\n }\n res.Annotations[KubernetesIngressClassAnnotation] = formValues.IngressClass.Name;\n res.Hosts = formValues.Hosts;\n res.Paths = formValues.Paths;\n return res;\n }\n\n /**\n *\n * @param {KubernetesIngressClass} ics Ingress classes (saved in Portainer DB)\n * @param {KubernetesIngress[]} ingresses Existing Kubernetes ingresses. Must be empty for RP CREATE VIEW and filled for RP EDIT VIEW\n */\n static ingressClassesToFormValues(ics, ingresses) {\n const res = _.map(ics, (ic) => {\n const fv = new KubernetesResourcePoolIngressClassFormValue(ic);\n const ingress = _.find(ingresses, { Name: ic.Name });\n if (ingress) {\n fv.Selected = true;\n fv.WasSelected = true;\n fv.Hosts = _.map(ingress.Hosts, (host) => {\n const hfv = new KubernetesResourcePoolIngressClassHostFormValue();\n hfv.Host = host;\n hfv.PreviousHost = host;\n hfv.IsNew = false;\n return hfv;\n });\n const [[rewriteKey]] = _.toPairs(KubernetesIngressClassRewriteTargetAnnotations[ic.Type]);\n const annotations = _.map(_.toPairs(ingress.Annotations), ([key, value]) => {\n if (key === rewriteKey) {\n fv.RewriteTarget = true;\n } else if (key !== KubernetesIngressClassAnnotation) {\n const annotation = new KubernetesResourcePoolIngressClassAnnotationFormValue();\n annotation.Key = key;\n annotation.Value = value;\n return annotation;\n }\n });\n fv.Annotations = _.without(annotations, undefined);\n fv.AdvancedConfig = fv.Annotations.length > 0;\n fv.Paths = ingress.Paths;\n }\n return fv;\n });\n return res;\n }\n\n static createPayload(data) {\n const res = new KubernetesIngressCreatePayload();\n res.metadata.name = data.Name;\n res.metadata.namespace = data.Namespace;\n res.metadata.annotations = data.Annotations;\n if (data.Paths && data.Paths.length) {\n _.forEach(data.Paths, (p) => {\n if (p.Host === 'undefined' || p.Host === undefined) {\n p.Host = '';\n }\n });\n const hostsWithRules = [];\n const groups = _.groupBy(data.Paths, 'Host');\n let rules = _.map(groups, (paths, host) => {\n const updatedHost = _.find(data.Hosts, (h) => {\n return h === host || h.PreviousHost === host;\n });\n host = updatedHost.Host || updatedHost;\n if (updatedHost.NeedsDeletion) {\n return;\n }\n const rule = new KubernetesIngressRuleCreatePayload();\n KubernetesCommonHelper.assignOrDeleteIfEmpty(rule, 'host', host);\n rule.http.paths = _.map(paths, (p) => {\n const path = new KubernetesIngressRulePathCreatePayload();\n path.path = p.Path;\n path.backend.service.name = p.ServiceName;\n path.backend.service.port.number = p.Port;\n return path;\n });\n hostsWithRules.push(host);\n return rule;\n });\n rules = _.without(rules, undefined);\n const keptHosts = _.without(\n _.map(data.Hosts, (h) => (h.NeedsDeletion ? undefined : h.Host || h)),\n undefined\n );\n const hostsWithoutRules = _.without(keptHosts, ...hostsWithRules);\n const emptyRules = _.map(hostsWithoutRules, (host) => {\n return { host: host };\n });\n rules = _.concat(rules, emptyRules);\n KubernetesCommonHelper.assignOrDeleteIfEmpty(res, 'spec.rules', rules);\n } else if (data.Hosts) {\n res.spec.rules = [];\n _.forEach(data.Hosts, (host) => {\n if (!host.NeedsDeletion) {\n res.spec.rules.push({ host: host.Host || host });\n }\n });\n } else {\n delete res.spec.rules;\n }\n return res;\n }\n\n static patchPayload(oldData, newData) {\n const oldPayload = KubernetesIngressConverter.createPayload(oldData);\n const newPayload = KubernetesIngressConverter.createPayload(newData);\n const payload = JsonPatch.compare(oldPayload, newPayload);\n return payload;\n }\n}\n","export const EDITIONS = {\n CE: 0,\n BE: 1,\n};\n\nexport const STATES = {\n HIDDEN: 0,\n VISIBLE: 1,\n LIMITED_BE: 2,\n};\n","import { ResourceControlOwnership as RCO } from './resourceControlOwnership';\n\nexport function ResourceControlViewModel(data) {\n this.Id = data.Id;\n this.Type = data.Type;\n this.ResourceId = data.ResourceId;\n this.UserAccesses = data.UserAccesses;\n this.TeamAccesses = data.TeamAccesses;\n this.Public = data.Public;\n this.System = data.System;\n this.Ownership = determineOwnership(this);\n}\n\nfunction determineOwnership(resourceControl) {\n if (resourceControl.Public) {\n return RCO.PUBLIC;\n } else if (resourceControl.UserAccesses.length === 1 && resourceControl.TeamAccesses.length === 0) {\n return RCO.PRIVATE;\n } else if (resourceControl.UserAccesses.length > 1 || resourceControl.TeamAccesses.length > 0) {\n return RCO.RESTRICTED;\n } else {\n return RCO.ADMINISTRATORS;\n }\n}\n","import _ from 'lodash-es';\n\nclass KubernetesFormValidationHelper {\n static getInvalidKeys(names) {\n const res = {};\n _.forEach(names, (name, index) => {\n const valid = /^[-._a-zA-Z0-9]+$/.test(name);\n if (!valid) {\n res[index] = true;\n }\n });\n return res;\n }\n\n static getDuplicates(names) {\n const groupped = _.groupBy(names);\n const res = {};\n _.forEach(names, (name, index) => {\n if (name && groupped[name].length > 1) {\n res[index] = name;\n }\n });\n return res;\n }\n}\nexport default KubernetesFormValidationHelper;\n","export function KubernetesResourcePoolFormValues(defaults) {\n this.Name = '';\n this.MemoryLimit = defaults.MemoryLimit;\n this.CpuLimit = defaults.CpuLimit;\n this.HasQuota = false;\n this.IngressClasses = []; // KubernetesResourcePoolIngressClassFormValue\n this.Registries = []; // RegistryViewModel\n this.EndpointId = 0;\n this.IsSystem = false;\n}\n\n/**\n * @param {KubernetesIngressClass} ingressClass\n */\nexport function KubernetesResourcePoolIngressClassFormValue(ingressClass) {\n return {\n Namespace: undefined, // will be filled inside ResourcePoolService.create\n IngressClass: ingressClass,\n RewriteTarget: false,\n Annotations: [], // KubernetesResourcePoolIngressClassAnnotationFormValue\n Hosts: [],\n Selected: false,\n WasSelected: false,\n AdvancedConfig: false,\n Paths: [], // will be filled to save IngressClass.Paths inside ingressClassesToFormValues() on RP EDIT\n };\n}\n\nexport function KubernetesResourcePoolIngressClassAnnotationFormValue() {\n return {\n Key: '',\n Value: '',\n };\n}\n\nexport function KubernetesResourcePoolIngressClassHostFormValue() {\n return {\n Host: '',\n PreviousHost: '',\n NeedsDeletion: false,\n IsNew: true,\n };\n}\n","/**\n * This model should be used with por-image-registry component\n * And bound to the 'model' attribute\n *\n * // viewController.js\n *\n * this.imageModel = new PorImageRegistryModel();\n *\n * // view.html\n * <por-image-registry model=\"$ctrl.imageModel\" ... />\n */\nexport function PorImageRegistryModel() {\n this.UseRegistry = true;\n this.Registry = {};\n this.Image = '';\n}\n","import _ from 'lodash-es';\nimport YAML from 'yaml';\nimport { KubernetesConfigurationTypes } from 'Kubernetes/models/configuration/models';\nimport { KubernetesConfigurationFormValuesEntry } from 'Kubernetes/models/configuration/formvalues';\n\nclass KubernetesConfigurationHelper {\n static getUsingApplications(config, applications) {\n return _.filter(applications, (app) => {\n let envFind;\n let volumeFind;\n if (config.Type === KubernetesConfigurationTypes.CONFIGMAP) {\n envFind = _.find(app.Env, { valueFrom: { configMapKeyRef: { name: config.Name } } });\n volumeFind = _.find(app.Volumes, { configMap: { name: config.Name } });\n } else {\n envFind = _.find(app.Env, { valueFrom: { secretKeyRef: { name: config.Name } } });\n volumeFind = _.find(app.Volumes, { secret: { secretName: config.Name } });\n }\n return envFind || volumeFind;\n });\n }\n\n static isSystemToken(config) {\n return _.startsWith(config.Name, 'default-token-');\n }\n\n static isBinary(encoding) {\n return encoding !== '' && !_.includes(encoding, 'ISO') && !_.includes(encoding, 'UTF');\n }\n\n static setConfigurationUsed(config) {\n config.Used = config.Applications && config.Applications.length !== 0;\n }\n\n static setConfigurationsUsed(configurations, applications) {\n _.forEach(configurations, (config) => {\n config.Applications = KubernetesConfigurationHelper.getUsingApplications(config, applications);\n KubernetesConfigurationHelper.setConfigurationUsed(config);\n });\n }\n\n static getApplicationConfigurations(applications, configurations) {\n const configurationsUsed = configurations.filter((config) => KubernetesConfigurationHelper.getUsingApplications(config, applications).length !== 0);\n // set the configurations used for each application in the list\n const configuredApps = applications.map((app) => {\n const configMappedByName = configurationsUsed.filter((config) => app.ApplicationName === config.Name && app.ResourcePool === config.Namespace);\n const configMappedByVolume = configurationsUsed\n .filter((config) => app.ConfigurationVolumes.some((cv) => cv.configurationName === config.Name))\n .filter((config) => !configMappedByName.some((c) => c.Name === config.Name)); // filter out duplicates that are mapped by name\n app.Configurations = [...configMappedByName, ...configMappedByVolume];\n return app;\n });\n return configuredApps;\n }\n\n static parseYaml(formValues) {\n YAML.defaultOptions.customTags = ['binary'];\n const data = _.map(YAML.parse(formValues.DataYaml), (value, key) => {\n const entry = new KubernetesConfigurationFormValuesEntry();\n entry.Key = key;\n entry.Value = value;\n const oldEntry = _.find(formValues.Data, { Key: entry.Key });\n entry.IsBinary = oldEntry ? oldEntry.IsBinary : false;\n return entry;\n });\n return data;\n }\n\n static parseData(formValues) {\n if (!formValues.Data.length) return '';\n\n const data = _.reduce(\n formValues.Data,\n (acc, entry) => {\n acc[entry.Key] = entry.Value;\n return acc;\n },\n {}\n );\n return YAML.stringify(data);\n }\n\n static isExternalConfiguration(configuration) {\n return !configuration.ConfigurationOwner;\n }\n}\n\nexport default KubernetesConfigurationHelper;\n","export const KubernetesPortainerConfigMapNamespace = 'portainer';\nexport const KubernetesPortainerConfigMapConfigName = 'portainer-config';\nexport const KubernetesPortainerConfigMapAccessKey = 'NamespaceAccessPolicies';\n\nexport function KubernetesPortainerAccessConfigMap() {\n return {\n Id: 0,\n Name: KubernetesPortainerConfigMapConfigName,\n Namespace: KubernetesPortainerConfigMapNamespace,\n Data: {},\n };\n}\n\n/**\n * ConfigMap Model\n */\nconst _KubernetesConfigMap = Object.freeze({\n Id: 0,\n Name: '',\n Namespace: '',\n Yaml: '',\n ConfigurationOwner: '',\n Data: [],\n});\n\nexport class KubernetesConfigMap {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesConfigMap)));\n }\n}\n","import _ from 'lodash-es';\nimport filesizeParser from 'filesize-parser';\n\nimport {\n KubernetesApplication,\n KubernetesApplicationConfigurationVolume,\n KubernetesApplicationDataAccessPolicies,\n KubernetesApplicationDeploymentTypes,\n KubernetesApplicationPersistedFolder,\n KubernetesApplicationPort,\n KubernetesApplicationPublishingTypes,\n KubernetesApplicationTypes,\n KubernetesPortainerApplicationNameLabel,\n KubernetesPortainerApplicationNote,\n KubernetesPortainerApplicationOwnerLabel,\n KubernetesPortainerApplicationStackNameLabel,\n KubernetesPortainerApplicationStackIdLabel,\n KubernetesPortainerApplicationKindLabel,\n} from 'Kubernetes/models/application/models';\nimport { KubernetesServiceTypes } from 'Kubernetes/models/service/models';\nimport KubernetesResourceReservationHelper from 'Kubernetes/helpers/resourceReservationHelper';\nimport { KubernetesApplicationFormValues } from 'Kubernetes/models/application/formValues';\nimport KubernetesApplicationHelper from 'Kubernetes/helpers/application';\n\nimport KubernetesDeploymentConverter from 'Kubernetes/converters/deployment';\nimport KubernetesDaemonSetConverter from 'Kubernetes/converters/daemonSet';\nimport KubernetesStatefulSetConverter from 'Kubernetes/converters/statefulSet';\nimport KubernetesServiceConverter from 'Kubernetes/converters/service';\nimport KubernetesPersistentVolumeClaimConverter from 'Kubernetes/converters/persistentVolumeClaim';\nimport PortainerError from 'Portainer/error';\nimport { KubernetesIngressHelper } from 'Kubernetes/ingress/helper';\nimport KubernetesCommonHelper from 'Kubernetes/helpers/commonHelper';\n\nfunction _apiPortsToPublishedPorts(pList, pRefs) {\n const ports = _.map(pList, (item) => {\n const res = new KubernetesApplicationPort();\n res.Port = item.port;\n res.TargetPort = item.targetPort;\n res.NodePort = item.nodePort;\n res.Protocol = item.protocol;\n return res;\n });\n _.forEach(ports, (port) => {\n if (isNaN(port.TargetPort)) {\n const targetPort = _.find(pRefs, { name: port.TargetPort });\n if (targetPort) {\n port.TargetPort = targetPort.containerPort;\n }\n }\n });\n return ports;\n}\n\nclass KubernetesApplicationConverter {\n static applicationCommon(res, data, pods, service, ingresses) {\n const containers = data.spec.template ? _.without(_.concat(data.spec.template.spec.containers, data.spec.template.spec.initContainers), undefined) : data.spec.containers;\n res.Id = data.metadata.uid;\n res.Name = data.metadata.name;\n res.Metadata = data.metadata;\n\n if (data.metadata.labels) {\n const { labels } = data.metadata;\n res.StackId = labels[KubernetesPortainerApplicationStackIdLabel] ? parseInt(labels[KubernetesPortainerApplicationStackIdLabel], 10) : null;\n res.StackName = labels[KubernetesPortainerApplicationStackNameLabel] || '';\n res.ApplicationKind = labels[KubernetesPortainerApplicationKindLabel] || '';\n res.ApplicationOwner = labels[KubernetesPortainerApplicationOwnerLabel] || '';\n res.ApplicationName = labels[KubernetesPortainerApplicationNameLabel] || res.Name;\n }\n\n res.Note = data.metadata.annotations ? data.metadata.annotations[KubernetesPortainerApplicationNote] || '' : '';\n res.ResourcePool = data.metadata.namespace;\n if (containers.length) {\n res.Image = containers[0].image;\n }\n if (data.spec.template && data.spec.template.spec && data.spec.template.spec.imagePullSecrets && data.spec.template.spec.imagePullSecrets.length) {\n res.RegistryId = parseInt(data.spec.template.spec.imagePullSecrets[0].name.replace('registry-', ''), 10);\n }\n res.CreationDate = data.metadata.creationTimestamp;\n res.Env = _.without(_.flatMap(_.map(containers, 'env')), undefined);\n res.Pods = data.spec.selector ? KubernetesApplicationHelper.associatePodsAndApplication(pods, data.spec.selector) : [data];\n\n const limits = {\n Cpu: 0,\n Memory: 0,\n };\n res.Limits = _.reduce(\n containers,\n (acc, item) => {\n if (item.resources.limits && item.resources.limits.cpu) {\n acc.Cpu += KubernetesResourceReservationHelper.parseCPU(item.resources.limits.cpu);\n }\n if (item.resources.limits && item.resources.limits.memory) {\n acc.Memory += filesizeParser(item.resources.limits.memory, { base: 10 });\n }\n return acc;\n },\n limits\n );\n\n const requests = {\n Cpu: 0,\n Memory: 0,\n };\n res.Requests = _.reduce(\n containers,\n (acc, item) => {\n if (item.resources.requests && item.resources.requests.cpu) {\n acc.Cpu += KubernetesResourceReservationHelper.parseCPU(item.resources.requests.cpu);\n }\n if (item.resources.requests && item.resources.requests.memory) {\n acc.Memory += filesizeParser(item.resources.requests.memory, { base: 10 });\n }\n return acc;\n },\n requests\n );\n\n if (service) {\n const serviceType = service.spec.type;\n res.ServiceType = serviceType;\n res.ServiceId = service.metadata.uid;\n res.ServiceName = service.metadata.name;\n\n if (serviceType === KubernetesServiceTypes.LOAD_BALANCER) {\n if (service.status.loadBalancer.ingress && service.status.loadBalancer.ingress.length > 0) {\n res.LoadBalancerIPAddress = service.status.loadBalancer.ingress[0].ip || service.status.loadBalancer.ingress[0].hostname;\n }\n }\n\n const portsRefs = _.concat(..._.map(containers, (container) => container.ports));\n const ports = _apiPortsToPublishedPorts(service.spec.ports, portsRefs);\n const rules = KubernetesIngressHelper.findSBoundServiceIngressesRules(ingresses, service.metadata.name);\n _.forEach(ports, (port) => (port.IngressRules = _.filter(rules, (rule) => rule.Port === port.Port)));\n res.PublishedPorts = ports;\n }\n\n if (data.spec.template) {\n res.Volumes = data.spec.template.spec.volumes ? data.spec.template.spec.volumes : [];\n } else {\n res.Volumes = data.spec.volumes;\n }\n\n // TODO: review\n // this if() fixs direct use of PVC reference inside spec.template.spec.containers[0].volumeMounts\n // instead of referencing the PVC the \"good way\" using spec.template.spec.volumes array\n // Basically it creates an \"in-memory\" reference for the PVC, as if it was saved in\n // spec.template.spec.volumes and retrieved from here.\n //\n // FIX FOR SFS ONLY ; as far as we know it's not possible to do this with DEPLOYMENTS/DAEMONSETS\n //\n // This may lead to destructing behaviours when we will allow external apps to be edited.\n // E.G. if we try to generate the formValues and patch the app, SFS reference will be created under\n // spec.template.spec.volumes and not be referenced directly inside spec.template.spec.containers[0].volumeMounts\n // As we preserve original SFS name and try to build around it, it SHOULD be fine, but we definitely need to test this\n // before allowing external apps modification\n if (data.spec.volumeClaimTemplates) {\n const vcTemplates = _.map(data.spec.volumeClaimTemplates, (vc) => {\n return {\n name: vc.metadata.name,\n persistentVolumeClaim: { claimName: vc.metadata.name },\n };\n });\n const inexistingPVC = _.filter(vcTemplates, (vc) => {\n return !_.find(res.Volumes, { persistentVolumeClaim: { claimName: vc.persistentVolumeClaim.claimName } });\n });\n res.Volumes = _.concat(res.Volumes, inexistingPVC);\n }\n\n const persistedFolders = _.filter(res.Volumes, (volume) => volume.persistentVolumeClaim || volume.hostPath);\n\n res.PersistedFolders = _.map(persistedFolders, (volume) => {\n const volumeMounts = _.uniq(_.flatMap(_.map(containers, 'volumeMounts')), 'name');\n const matchingVolumeMount = _.find(volumeMounts, { name: volume.name });\n\n if (matchingVolumeMount) {\n const persistedFolder = new KubernetesApplicationPersistedFolder();\n persistedFolder.MountPath = matchingVolumeMount.mountPath;\n\n if (volume.persistentVolumeClaim) {\n persistedFolder.PersistentVolumeClaimName = volume.persistentVolumeClaim.claimName;\n } else {\n persistedFolder.HostPath = volume.hostPath.path;\n }\n\n return persistedFolder;\n }\n });\n\n res.PersistedFolders = _.without(res.PersistedFolders, undefined);\n\n res.ConfigurationVolumes = _.reduce(\n res.Volumes,\n (acc, volume) => {\n if (volume.configMap || volume.secret) {\n const matchingVolumeMount = _.find(_.flatMap(_.map(containers, 'volumeMounts')), { name: volume.name });\n\n if (matchingVolumeMount) {\n let items = [];\n let configurationName = '';\n\n if (volume.configMap) {\n items = volume.configMap.items;\n configurationName = volume.configMap.name;\n } else {\n items = volume.secret.items;\n configurationName = volume.secret.secretName;\n }\n\n if (!items) {\n const configurationVolume = new KubernetesApplicationConfigurationVolume();\n configurationVolume.fileMountPath = matchingVolumeMount.mountPath;\n configurationVolume.rootMountPath = matchingVolumeMount.mountPath;\n configurationVolume.configurationName = configurationName;\n\n acc.push(configurationVolume);\n } else {\n _.forEach(items, (item) => {\n const configurationVolume = new KubernetesApplicationConfigurationVolume();\n configurationVolume.fileMountPath = matchingVolumeMount.mountPath + '/' + item.path;\n configurationVolume.rootMountPath = matchingVolumeMount.mountPath;\n configurationVolume.configurationKey = item.key;\n configurationVolume.configurationName = configurationName;\n\n acc.push(configurationVolume);\n });\n }\n }\n }\n\n return acc;\n },\n []\n );\n }\n\n static apiPodToApplication(data, pods, service, ingresses) {\n const res = new KubernetesApplication();\n KubernetesApplicationConverter.applicationCommon(res, data, pods, service, ingresses);\n res.ApplicationType = KubernetesApplicationTypes.POD;\n return res;\n }\n\n static apiDeploymentToApplication(data, pods, service, ingresses) {\n const res = new KubernetesApplication();\n KubernetesApplicationConverter.applicationCommon(res, data, pods, service, ingresses);\n res.ApplicationType = KubernetesApplicationTypes.DEPLOYMENT;\n res.DeploymentType = KubernetesApplicationDeploymentTypes.REPLICATED;\n res.DataAccessPolicy = KubernetesApplicationDataAccessPolicies.SHARED;\n res.RunningPodsCount = data.status.availableReplicas || data.status.replicas - data.status.unavailableReplicas || 0;\n res.TotalPodsCount = data.spec.replicas;\n return res;\n }\n\n static apiDaemonSetToApplication(data, pods, service, ingresses) {\n const res = new KubernetesApplication();\n KubernetesApplicationConverter.applicationCommon(res, data, pods, service, ingresses);\n res.ApplicationType = KubernetesApplicationTypes.DAEMONSET;\n res.DeploymentType = KubernetesApplicationDeploymentTypes.GLOBAL;\n res.DataAccessPolicy = KubernetesApplicationDataAccessPolicies.SHARED;\n res.RunningPodsCount = data.status.numberAvailable || data.status.desiredNumberScheduled - data.status.numberUnavailable || 0;\n res.TotalPodsCount = data.status.desiredNumberScheduled;\n return res;\n }\n\n static apiStatefulSetToapplication(data, pods, service, ingresses) {\n const res = new KubernetesApplication();\n KubernetesApplicationConverter.applicationCommon(res, data, pods, service, ingresses);\n res.ApplicationType = KubernetesApplicationTypes.STATEFULSET;\n res.DeploymentType = KubernetesApplicationDeploymentTypes.REPLICATED;\n res.DataAccessPolicy = KubernetesApplicationDataAccessPolicies.ISOLATED;\n res.RunningPodsCount = data.status.readyReplicas || 0;\n res.TotalPodsCount = data.spec.replicas;\n res.HeadlessServiceName = data.spec.serviceName;\n return res;\n }\n\n static applicationToFormValues(app, resourcePools, configurations, persistentVolumeClaims, nodesLabels, ingresses) {\n const res = new KubernetesApplicationFormValues();\n res.ApplicationType = app.ApplicationType;\n res.ResourcePool = _.find(resourcePools, ['Namespace.Name', app.ResourcePool]);\n res.Name = app.Name;\n res.StackName = app.StackName;\n res.ApplicationOwner = app.ApplicationOwner;\n res.ImageModel.Image = app.Image;\n res.ImageModel.Registry.Id = app.RegistryId;\n res.ReplicaCount = app.TotalPodsCount;\n res.MemoryLimit = KubernetesResourceReservationHelper.megaBytesValue(app.Limits.Memory);\n res.CpuLimit = app.Limits.Cpu;\n res.DeploymentType = app.DeploymentType;\n res.DataAccessPolicy = app.DataAccessPolicy;\n res.EnvironmentVariables = KubernetesApplicationHelper.generateEnvVariablesFromEnv(app.Env);\n res.PersistedFolders = KubernetesApplicationHelper.generatePersistedFoldersFormValuesFromPersistedFolders(app.PersistedFolders, persistentVolumeClaims); // generate from PVC and app.PersistedFolders\n res.Configurations = KubernetesApplicationHelper.generateConfigurationFormValuesFromEnvAndVolumes(app.Env, app.ConfigurationVolumes, configurations);\n res.AutoScaler = KubernetesApplicationHelper.generateAutoScalerFormValueFromHorizontalPodAutoScaler(app.AutoScaler, res.ReplicaCount);\n res.PublishedPorts = KubernetesApplicationHelper.generatePublishedPortsFormValuesFromPublishedPorts(app.ServiceType, app.PublishedPorts, ingresses);\n res.Containers = app.Containers;\n\n const isIngress = _.filter(res.PublishedPorts, (p) => p.IngressName).length;\n if (app.ServiceType === KubernetesServiceTypes.LOAD_BALANCER) {\n res.PublishingType = KubernetesApplicationPublishingTypes.LOAD_BALANCER;\n } else if (app.ServiceType === KubernetesServiceTypes.NODE_PORT) {\n res.PublishingType = KubernetesApplicationPublishingTypes.NODE_PORT;\n } else if (app.ServiceType === KubernetesServiceTypes.CLUSTER_IP && isIngress) {\n res.PublishingType = KubernetesApplicationPublishingTypes.INGRESS;\n } else {\n res.PublishingType = KubernetesApplicationPublishingTypes.CLUSTER_IP;\n }\n\n if (app.Pods && app.Pods.length) {\n KubernetesApplicationHelper.generatePlacementsFormValuesFromAffinity(res, app.Pods[0].Affinity, nodesLabels);\n }\n\n return res;\n }\n\n static applicationFormValuesToApplication(formValues) {\n formValues.ApplicationOwner = KubernetesCommonHelper.ownerToLabel(formValues.ApplicationOwner);\n\n const claims = KubernetesPersistentVolumeClaimConverter.applicationFormValuesToVolumeClaims(formValues);\n const rwx = KubernetesApplicationHelper.hasRWX(claims);\n\n const deployment =\n (formValues.DeploymentType === KubernetesApplicationDeploymentTypes.REPLICATED &&\n (claims.length === 0 || (claims.length > 0 && formValues.DataAccessPolicy === KubernetesApplicationDataAccessPolicies.SHARED))) ||\n formValues.ApplicationType === KubernetesApplicationTypes.DEPLOYMENT;\n\n const statefulSet =\n (formValues.DeploymentType === KubernetesApplicationDeploymentTypes.REPLICATED &&\n claims.length > 0 &&\n formValues.DataAccessPolicy === KubernetesApplicationDataAccessPolicies.ISOLATED) ||\n formValues.ApplicationType === KubernetesApplicationTypes.STATEFULSET;\n\n const daemonSet =\n (formValues.DeploymentType === KubernetesApplicationDeploymentTypes.GLOBAL &&\n (claims.length === 0 || (claims.length > 0 && formValues.DataAccessPolicy === KubernetesApplicationDataAccessPolicies.SHARED && rwx))) ||\n formValues.ApplicationType === KubernetesApplicationTypes.DAEMONSET;\n\n let app;\n if (deployment) {\n app = KubernetesDeploymentConverter.applicationFormValuesToDeployment(formValues, claims);\n } else if (statefulSet) {\n app = KubernetesStatefulSetConverter.applicationFormValuesToStatefulSet(formValues, claims);\n } else if (daemonSet) {\n app = KubernetesDaemonSetConverter.applicationFormValuesToDaemonSet(formValues, claims);\n } else {\n throw new PortainerError('Unable to determine which association to use to convert form');\n }\n\n let headlessService;\n if (statefulSet) {\n headlessService = KubernetesServiceConverter.applicationFormValuesToHeadlessService(formValues);\n }\n\n let service = KubernetesServiceConverter.applicationFormValuesToService(formValues);\n if (!service.Ports.length) {\n service = undefined;\n }\n\n return [app, headlessService, service, claims];\n }\n}\n\nexport default KubernetesApplicationConverter;\n","export const KubernetesPortainerNodeDrainLabel = 'io.portainer/node-status-drain';\n\n/**\n * KubernetesNode Model\n */\nconst _KubernetesNode = Object.freeze({\n Id: '',\n Name: '',\n Labels: {},\n Role: '',\n Status: '',\n CPU: 0,\n Memory: '',\n Version: '',\n IPAddress: '',\n Api: false,\n Taints: [],\n Port: 0,\n Availability: '',\n});\n\nexport class KubernetesNode {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesNode)));\n }\n}\n\n/**\n * KubernetesNodeDetails Model\n */\nconst _KubernetesNodeDetails = Object.freeze({\n CreationDate: '',\n OS: {\n Architecture: '',\n Platform: '',\n Image: '',\n },\n Conditions: [],\n Yaml: '',\n});\n\nexport class KubernetesNodeDetails {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesNode)));\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesNodeDetails)));\n }\n}\n\n/**\n * KubernetesNodeTaint Model\n */\nconst _KubernetesNodeTaint = Object.freeze({\n Key: '',\n Value: '',\n Effect: '',\n});\n\nexport class KubernetesNodeTaint {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesNodeTaint)));\n }\n}\n\nexport const KubernetesNodeAvailabilities = Object.freeze({\n ACTIVE: 'Active',\n PAUSE: 'Pause',\n DRAIN: 'Drain',\n});\n\nexport const KubernetesNodeTaintEffects = Object.freeze({\n NOSCHEDULE: 'NoSchedule',\n PREFERNOSCHEDULE: 'PreferNoSchedule',\n NOEXECUTE: 'NoExecute',\n});\n","import { KubernetesConfigurationTypes } from './models';\n\n/**\n * KubernetesConfigurationFormValues Model\n */\nconst _KubernetesConfigurationFormValues = Object.freeze({\n Id: '',\n ResourcePool: '',\n Name: '',\n ConfigurationOwner: '',\n Type: KubernetesConfigurationTypes.CONFIGMAP,\n Data: [],\n DataYaml: '',\n IsSimple: true,\n});\n\nexport class KubernetesConfigurationFormValues {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesConfigurationFormValues)));\n }\n}\n\nconst _KubernetesConfigurationFormValuesEntry = Object.freeze({\n Key: '',\n Value: '',\n IsBinary: false,\n});\n\nexport class KubernetesConfigurationFormValuesEntry {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesConfigurationFormValuesEntry)));\n }\n}\n","export const KubernetesIngressClassAnnotation = 'kubernetes.io/ingress.class';\n\n// keys must match KubernetesIngressClassTypes values to map them quickly using the ingress type\n// KubernetesIngressClassRewriteTargetAnnotations[KubernetesIngressClassTypes.NGINX] for example\nexport const KubernetesIngressClassRewriteTargetAnnotations = Object.freeze({\n nginx: { 'nginx.ingress.kubernetes.io/rewrite-target': '/' },\n traefik: { 'traefik.ingress.kubernetes.io/rewrite-target': '/' },\n});\n\nexport const KubernetesIngressClassTypes = Object.freeze({\n NGINX: 'nginx',\n TRAEFIK: 'traefik',\n});\n","import _ from 'lodash-es';\nimport { KubernetesConfigMap, KubernetesPortainerAccessConfigMap } from 'Kubernetes/models/config-map/models';\nimport { KubernetesConfigMapCreatePayload, KubernetesConfigMapUpdatePayload } from 'Kubernetes/models/config-map/payloads';\nimport { KubernetesPortainerConfigurationOwnerLabel } from 'Kubernetes/models/configuration/models';\nimport { KubernetesConfigurationFormValuesEntry } from 'Kubernetes/models/configuration/formvalues';\n\nclass KubernetesConfigMapConverter {\n static apiToPortainerAccessConfigMap(data) {\n const res = new KubernetesPortainerAccessConfigMap();\n res.Id = data.metadata.uid;\n res.Data = data.data;\n return res;\n }\n\n static createAccessPayload(data) {\n const res = new KubernetesConfigMapCreatePayload();\n _.unset(res, 'binaryData');\n res.metadata.name = data.Name;\n res.metadata.namespace = data.Namespace;\n res.data = data.Data;\n return res;\n }\n\n static updateAccessPayload(data) {\n const res = KubernetesConfigMapConverter.createAccessPayload(data);\n res.metadata.uid = data.Id;\n return res;\n }\n\n /**\n * API ConfigMap to front ConfigMap\n */\n static apiToConfigMap(data, yaml) {\n const res = new KubernetesConfigMap();\n res.Id = data.metadata.uid;\n res.Name = data.metadata.name;\n res.Namespace = data.metadata.namespace;\n res.ConfigurationOwner = data.metadata.labels ? data.metadata.labels[KubernetesPortainerConfigurationOwnerLabel] : '';\n res.CreationDate = data.metadata.creationTimestamp;\n res.Yaml = yaml ? yaml.data : '';\n\n res.Data = _.concat(\n _.map(data.data, (value, key) => {\n const entry = new KubernetesConfigurationFormValuesEntry();\n entry.Key = key;\n entry.Value = value;\n return entry;\n }),\n _.map(data.binaryData, (value, key) => {\n const entry = new KubernetesConfigurationFormValuesEntry();\n entry.Key = key;\n entry.Value = value;\n entry.IsBinary = true;\n return entry;\n })\n );\n\n return res;\n }\n\n /**\n * Generate a default ConfigMap Model\n * with ID = 0 (showing it's a default)\n * but setting his Namespace and Name\n */\n static defaultConfigMap(namespace, name) {\n const res = new KubernetesConfigMap();\n res.Name = name;\n res.Namespace = namespace;\n return res;\n }\n\n /**\n * CREATE payload\n */\n static createPayload(data) {\n const res = new KubernetesConfigMapCreatePayload();\n res.metadata.name = data.Name;\n res.metadata.namespace = data.Namespace;\n const configurationOwner = _.truncate(data.ConfigurationOwner, { length: 63, omission: '' });\n res.metadata.labels[KubernetesPortainerConfigurationOwnerLabel] = configurationOwner;\n\n _.forEach(data.Data, (entry) => {\n if (entry.IsBinary) {\n res.binaryData[entry.Key] = entry.Value;\n } else {\n res.data[entry.Key] = entry.Value;\n }\n });\n return res;\n }\n\n /**\n * UPDATE payload\n */\n static updatePayload(data) {\n const res = new KubernetesConfigMapUpdatePayload();\n res.metadata.uid = data.Id;\n res.metadata.name = data.Name;\n res.metadata.namespace = data.Namespace;\n res.metadata.labels[KubernetesPortainerConfigurationOwnerLabel] = data.ConfigurationOwner;\n _.forEach(data.Data, (entry) => {\n if (entry.IsBinary) {\n res.binaryData[entry.Key] = entry.Value;\n } else {\n res.data[entry.Key] = entry.Value;\n }\n });\n return res;\n }\n\n static configurationFormValuesToConfigMap(formValues) {\n const res = new KubernetesConfigMap();\n res.Id = formValues.Id;\n res.Name = formValues.Name;\n res.Namespace = formValues.ResourcePool.Namespace.Name;\n res.ConfigurationOwner = formValues.ConfigurationOwner;\n res.Data = formValues.Data;\n return res;\n }\n}\n\nexport default KubernetesConfigMapConverter;\n","import moment from 'moment';\nimport _ from 'lodash-es';\nimport filesize from 'filesize';\n\nimport { ResourceControlOwnership as RCO } from 'Portainer/models/resourceControl/resourceControlOwnership';\n\nexport function truncateLeftRight(text, max, left, right) {\n max = isNaN(max) ? 50 : max;\n left = isNaN(left) ? 25 : left;\n right = isNaN(right) ? 25 : right;\n\n if (text.length <= max) {\n return text;\n } else {\n return text.substring(0, left) + '[...]' + text.substring(text.length - right, text.length);\n }\n}\n\nexport function stripProtocol(url) {\n return url.replace(/.*?:\\/\\//g, '');\n}\n\nexport function humanize(bytes, round, base) {\n if (!round) {\n round = 1;\n }\n if (!base) {\n base = 10;\n }\n if (bytes || bytes === 0) {\n return filesize(bytes, { base: base, round: round });\n }\n}\n\nexport function isoDateFromTimestamp(timestamp) {\n return moment.unix(timestamp).format('YYYY-MM-DD HH:mm:ss');\n}\n\nexport function isoDate(date) {\n return moment(date).format('YYYY-MM-DD HH:mm:ss');\n}\n\nexport function getPairKey(pair, separator) {\n if (!pair.includes(separator)) {\n return pair;\n }\n\n return pair.slice(0, pair.indexOf(separator));\n}\n\nexport function getPairValue(pair, separator) {\n if (!pair.includes(separator)) {\n return '';\n }\n\n return pair.slice(pair.indexOf(separator) + 1);\n}\n\nexport function ipAddress(ip) {\n return ip.slice(0, ip.indexOf('/'));\n}\n\nexport function arrayToStr(arr, separator) {\n if (arr) {\n return _.join(arr, separator);\n }\n return '';\n}\n\nexport function labelsToStr(arr, separator) {\n if (arr) {\n return _.join(\n arr.map((item) => item.key + ':' + item.value),\n separator\n );\n }\n return '';\n}\n\nexport function endpointTypeName(type) {\n if (type === 1) {\n return 'Docker';\n } else if (type === 2 || type === 6) {\n return 'Agent';\n } else if (type === 3) {\n return 'Azure ACI';\n } else if (type === 5) {\n return 'Kubernetes';\n } else if (type === 4 || type === 7) {\n return 'Edge Agent';\n }\n return '';\n}\n\nexport function endpointTypeIcon(type) {\n if (type === 3) {\n return 'fab fa-microsoft';\n } else if (type === 4) {\n return 'fa fa-cloud';\n } else if (type === 5 || type === 6 || type === 7) {\n return 'fas fa-dharmachakra';\n }\n return 'fab fa-docker';\n}\n\nexport function ownershipIcon(ownership) {\n switch (ownership) {\n case RCO.PRIVATE:\n return 'fa fa-eye-slash';\n case RCO.ADMINISTRATORS:\n return 'fa fa-eye-slash';\n case RCO.RESTRICTED:\n return 'fa fa-users';\n default:\n return 'fa fa-eye';\n }\n}\n\nexport function truncate(text, length, end) {\n if (isNaN(length)) {\n length = 10;\n }\n\n if (end === undefined) {\n end = '...';\n }\n\n if (text.length <= length || text.length - end.length <= length) {\n return text;\n } else {\n return String(text).substring(0, length - end.length) + end;\n }\n}\n\nexport function endpointStatusBadge(status) {\n if (status === 2) {\n return 'danger';\n }\n return 'success';\n}\n","import _ from 'lodash-es';\nimport uuidv4 from 'uuid/v4';\nimport { KubernetesApplicationTypes } from 'Kubernetes/models/application/models';\n\nclass KubernetesVolumeHelper {\n // TODO: review\n // the following condition\n // && (app.ApplicationType === KubernetesApplicationTypes.STATEFULSET ? _.includes(volume.PersistentVolumeClaim.Name, app.Name) : true);\n // is made to enforce finding the good SFS when multiple SFS in the same namespace\n // are referencing an internal PVC using the same internal name\n // (PVC are not exposed to other apps so they can have the same name in differents SFS)\n static getUsingApplications(volume, applications) {\n return _.filter(applications, (app) => {\n const names = _.without(_.map(app.Volumes, 'persistentVolumeClaim.claimName'), undefined);\n const matchingNames = _.filter(names, (name) => _.startsWith(volume.PersistentVolumeClaim.Name, name));\n return (\n volume.ResourcePool.Namespace.Name === app.ResourcePool &&\n matchingNames.length &&\n (app.ApplicationType === KubernetesApplicationTypes.STATEFULSET ? _.includes(volume.PersistentVolumeClaim.Name, app.Name) : true)\n );\n });\n }\n\n static isUsed(item) {\n return item.Applications.length !== 0;\n }\n\n static generatedApplicationConfigVolumeName(name) {\n return 'config-' + name + '-' + uuidv4();\n }\n\n static isExternalVolume(volume) {\n return !volume.PersistentVolumeClaim.ApplicationOwner;\n }\n}\n\nexport default KubernetesVolumeHelper;\n","export function RoleViewModel(id, name, description, authorizations) {\n this.ID = id;\n this.Name = name;\n this.Description = description;\n this.Authorizations = authorizations;\n}\n\nexport const RoleTypes = Object.freeze({\n ENDPOINT_ADMIN: 1,\n HELPDESK: 2,\n STANDARD: 3,\n READ_ONLY: 4,\n OPERATOR: 5,\n});\n","angular\n .module('portainer')\n .constant('API_ENDPOINT_AUTH', 'api/auth')\n .constant('API_ENDPOINT_KUBERNETES', 'api/kubernetes')\n .constant('API_ENDPOINT_CUSTOM_TEMPLATES', 'api/custom_templates')\n .constant('API_ENDPOINT_EDGE_GROUPS', 'api/edge_groups')\n .constant('API_ENDPOINT_EDGE_JOBS', 'api/edge_jobs')\n .constant('API_ENDPOINT_EDGE_STACKS', 'api/edge_stacks')\n .constant('API_ENDPOINT_EDGE_TEMPLATES', 'api/edge_templates')\n .constant('API_ENDPOINT_ENDPOINTS', 'api/endpoints')\n .constant('API_ENDPOINT_ENDPOINT_GROUPS', 'api/endpoint_groups')\n .constant('API_ENDPOINT_MOTD', 'api/motd')\n .constant('API_ENDPOINT_REGISTRIES', 'api/registries')\n .constant('API_ENDPOINT_RESOURCE_CONTROLS', 'api/resource_controls')\n .constant('API_ENDPOINT_SETTINGS', 'api/settings')\n .constant('API_ENDPOINT_STACKS', 'api/stacks')\n .constant('API_ENDPOINT_STATUS', 'api/status')\n .constant('API_ENDPOINT_SUPPORT', 'api/support')\n .constant('API_ENDPOINT_USERS', 'api/users')\n .constant('API_ENDPOINT_TAGS', 'api/tags')\n .constant('API_ENDPOINT_TEAMS', 'api/teams')\n .constant('API_ENDPOINT_TEAM_MEMBERSHIPS', 'api/team_memberships')\n .constant('API_ENDPOINT_TEMPLATES', 'api/templates')\n .constant('API_ENDPOINT_WEBHOOKS', 'api/webhooks')\n .constant('API_ENDPOINT_BACKUP', 'api/backup')\n .constant('DEFAULT_TEMPLATES_URL', 'https://raw.githubusercontent.com/portainer/templates/master/templates.json')\n .constant('PAGINATION_MAX_ITEMS', 10)\n .constant('APPLICATION_CACHE_VALIDITY', 3600)\n .constant('CONSOLE_COMMANDS_LABEL_PREFIX', 'io.portainer.commands.')\n .constant('PREDEFINED_NETWORKS', ['host', 'bridge', 'none']);\n\nexport const PORTAINER_FADEOUT = 1500;\nexport const STACK_NAME_VALIDATION_REGEX = '^[-_a-z0-9]+$';\nexport const TEMPLATE_NAME_VALIDATION_REGEX = '^[-_a-z0-9]+$';\nexport const BROWSER_OS_PLATFORM = navigator.userAgent.indexOf('Windows NT') > -1 ? 'win' : 'lin';\nexport const NEW_LINE_BREAKER = BROWSER_OS_PLATFORM === 'win' ? '\\r\\n' : '\\n';\n","import * as JsonPatch from 'fast-json-patch';\nimport { KubernetesHorizontalPodAutoScaler } from './models';\nimport { KubernetesHorizontalPodAutoScalerCreatePayload } from './payload';\n\nexport class KubernetesHorizontalPodAutoScalerConverter {\n /**\n * Convert API data to KubernetesHorizontalPodAutoScaler model\n */\n static apiToModel(data, yaml) {\n const res = new KubernetesHorizontalPodAutoScaler();\n res.Id = data.metadata.uid;\n res.Namespace = data.metadata.namespace;\n res.Name = data.metadata.name;\n res.MinReplicas = data.spec.minReplicas;\n res.MaxReplicas = data.spec.maxReplicas;\n res.TargetCPUUtilization = data.spec.targetCPUUtilizationPercentage;\n\n if (data.spec.scaleTargetRef) {\n res.TargetEntity.ApiVersion = data.spec.scaleTargetRef.apiVersion;\n res.TargetEntity.Kind = data.spec.scaleTargetRef.kind;\n res.TargetEntity.Name = data.spec.scaleTargetRef.name;\n }\n res.Yaml = yaml ? yaml.data : '';\n return res;\n }\n\n static createPayload(data) {\n const payload = new KubernetesHorizontalPodAutoScalerCreatePayload();\n payload.metadata.namespace = data.Namespace;\n payload.metadata.name = data.TargetEntity.Name;\n payload.spec.minReplicas = data.MinReplicas;\n payload.spec.maxReplicas = data.MaxReplicas;\n payload.spec.targetCPUUtilizationPercentage = data.TargetCPUUtilization;\n payload.spec.scaleTargetRef.apiVersion = data.TargetEntity.ApiVersion;\n payload.spec.scaleTargetRef.kind = data.TargetEntity.Kind;\n payload.spec.scaleTargetRef.name = data.TargetEntity.Name;\n return payload;\n }\n\n static patchPayload(oldScaler, newScaler) {\n const oldPayload = KubernetesHorizontalPodAutoScalerConverter.createPayload(oldScaler);\n const newPayload = KubernetesHorizontalPodAutoScalerConverter.createPayload(newScaler);\n const payload = JsonPatch.compare(oldPayload, newPayload);\n return payload;\n }\n\n static applicationFormValuesToModel(formValues, kind) {\n const res = new KubernetesHorizontalPodAutoScaler();\n res.Name = formValues.Name;\n res.Namespace = formValues.ResourcePool.Namespace.Name;\n res.MinReplicas = formValues.AutoScaler.MinReplicas;\n res.MaxReplicas = formValues.AutoScaler.MaxReplicas;\n res.TargetCPUUtilization = formValues.AutoScaler.TargetCPUUtilization;\n res.TargetEntity.Name = formValues.Name;\n res.TargetEntity.Kind = kind;\n res.TargetEntity.ApiVersion = formValues.AutoScaler.ApiVersion;\n return res;\n }\n\n /**\n * Convertion functions to use with v2beta2 model\n */\n\n // static apiToModel(data, yaml) {\n // const res = new KubernetesHorizontalPodAutoScaler();\n // res.Id = data.metadata.uid;\n // res.Namespace = data.metadata.namespace;\n // res.Name = data.metadata.name;\n // res.MinReplicas = data.spec.minReplicas;\n // res.MaxReplicas = data.spec.maxReplicas;\n // res.TargetCPUUtilization = data.spec.targetCPUUtilization;\n\n // _.forEach(data.spec.metrics, (metric) => {\n // if (metric.type === 'Resource') {\n // if (metric.resource.name === 'cpu') {\n // res.TargetCPUUtilization = metric.resource.target.averageUtilization;\n // }\n // if (metric.resource.name === 'memory') {\n // res.TargetMemoryValue = parseFloat(metric.resource.target.averageValue) / 1000;\n // }\n // }\n // });\n\n // if (data.spec.scaleTargetRef) {\n // res.TargetEntity.ApiVersion = data.spec.scaleTargetRef.apiVersion;\n // res.TargetEntity.Kind = data.spec.scaleTargetRef.kind;\n // res.TargetEntity.Name = data.spec.scaleTargetRef.name;\n // }\n // res.Yaml = yaml ? yaml.data : '';\n // return res;\n // }\n\n // static createPayload(data) {\n // const payload = new KubernetesHorizontalPodAutoScalerCreatePayload();\n // payload.metadata.namespace = data.Namespace;\n // payload.metadata.name = data.TargetEntity.Name;\n // payload.spec.minReplicas = data.MinReplicas;\n // payload.spec.maxReplicas = data.MaxReplicas;\n\n // if (data.TargetMemoryValue) {\n // const memoryMetric = new KubernetesHorizontalPodAutoScalerMemoryMetric();\n // memoryMetric.resource.target.averageValue = data.TargetMemoryValue;\n // payload.spec.metrics.push(memoryMetric);\n // }\n\n // if (data.TargetCPUUtilization) {\n // const cpuMetric = new KubernetesHorizontalPodAutoScalerCPUMetric();\n // cpuMetric.resource.target.averageUtilization = data.TargetCPUUtilization;\n // payload.spec.metrics.push(cpuMetric);\n // }\n\n // payload.spec.scaleTargetRef.apiVersion = data.TargetEntity.ApiVersion;\n // payload.spec.scaleTargetRef.kind = data.TargetEntity.Kind;\n // payload.spec.scaleTargetRef.name = data.TargetEntity.Name;\n\n // return payload;\n // }\n\n // static applicationFormValuesToModel(formValues, kind) {\n // const res = new KubernetesHorizontalPodAutoScaler();\n // res.Name = formValues.Name;\n // res.Namespace = formValues.ResourcePool.Namespace.Name;\n // res.MinReplicas = formValues.AutoScaler.MinReplicas;\n // res.MaxReplicas = formValues.AutoScaler.MaxReplicas;\n // res.TargetCPUUtilization = formValues.AutoScaler.TargetCPUUtilization;\n // if (formValues.AutoScaler.TargetMemoryValue) {\n // res.TargetMemoryValue = formValues.AutoScaler.TargetMemoryValue + 'M';\n // }\n // res.TargetEntity.Name = formValues.Name;\n // res.TargetEntity.Kind = kind;\n // return res;\n // }\n}\n","import _ from 'lodash-es';\n\nexport const KEY_REGEX = /(.+?)/.source;\nexport const VALUE_REGEX = /(.*)?/.source;\n\nconst KEY_VALUE_REGEX = new RegExp(`^(${KEY_REGEX})\\\\s*=(${VALUE_REGEX})$`);\nconst NEWLINES_REGEX = /\\n|\\r|\\r\\n/;\n\n/**\n * @param {string} src the source of the .env file\n *\n * @returns {[{name: string, value: string}]} array of {name, value}\n */\nexport function parseDotEnvFile(src) {\n return parseArrayOfStrings(\n _.compact(src.split(NEWLINES_REGEX))\n .map((v) => v.trim())\n .filter((v) => !v.startsWith('#') && v !== '')\n );\n}\n\n/**\n * parses an array of name=value to array of {name, value}\n *\n * @param {[string]} array array of strings in format name=value\n *\n * @returns {[{name: string, value: string}]} array of {name, value}\n */\nexport function parseArrayOfStrings(array) {\n if (!array) {\n return [];\n }\n\n return _.compact(\n array.map((variableString) => {\n if (!variableString.includes('=')) {\n return { name: variableString };\n }\n\n const parsedKeyValArr = variableString.trim().match(KEY_VALUE_REGEX);\n if (parsedKeyValArr != null && parsedKeyValArr.length > 4) {\n return { name: parsedKeyValArr[1].trim(), value: parsedKeyValArr[3].trim() || '' };\n }\n })\n );\n}\n/**\n * converts an array of {name, value} to array of `name=value`, name is always defined\n *\n * @param {[{name, value}]} array array of {name, value}\n *\n * @returns {[string]} array of `name=value`\n */\nexport function convertToArrayOfStrings(array) {\n if (!array) {\n return [];\n }\n\n return array.filter((variable) => variable.name).map(({ name, value }) => (value || value === '' ? `${name}=${value}` : name));\n}\n","// create UserAccessViewModel from UserViewModel\nexport function UserAccessViewModel(data) {\n this.Id = data.Id;\n this.Name = data.Username;\n this.Type = 'user';\n this.Inherited = false;\n this.Override = false;\n this.Role = { Id: 0, Name: '-' };\n this.icon = '<i class=\"fa fa-user\" aria-hidden=\"true\"></i>';\n}\n\n// create TeamAccessViewModel from TeamViewModel\nexport function TeamAccessViewModel(data) {\n this.Id = data.Id;\n this.Name = data.Name;\n this.Type = 'team';\n this.Inherited = false;\n this.Override = false;\n this.Role = { Id: 0, Name: '-' };\n this.icon = '<i class=\"fa fa-users\" aria-hidden=\"true\"></i>';\n}\n","/**\n * KubernetesStatefulSet Model\n */\nconst _KubernetesStatefulSet = Object.freeze({\n Namespace: '',\n Name: '',\n StackName: '',\n ReplicaCount: 0,\n ImageModel: null,\n Env: [],\n CpuLimit: '',\n MemoryLimit: '',\n VolumeMounts: [],\n Volumes: [],\n Secret: undefined,\n VolumeClaims: [],\n ServiceName: '',\n ApplicationName: '',\n ApplicationOwner: '',\n Note: '',\n Affinity: undefined, // KubernetesPodAffinity\n});\n\nexport class KubernetesStatefulSet {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesStatefulSet)));\n }\n}\n","export const KubernetesPortainerResourcePoolNameLabel = 'io.portainer.kubernetes.resourcepool.name';\n\nexport const KubernetesPortainerResourcePoolOwnerLabel = 'io.portainer.kubernetes.resourcepool.owner';\n\nexport const KubernetesPortainerNamespaceSystemLabel = 'io.portainer.kubernetes.namespace.system';\n\n/**\n * KubernetesResourcePool Model\n */\nexport function KubernetesResourcePool() {\n return {\n Namespace: {}, // KubernetesNamespace\n Quota: undefined, // KubernetesResourceQuota,\n Ingresses: [], // KubernetesIngress[]\n Yaml: '',\n };\n}\n","/////////////////////////// VOLUME MOUNT ///////////////////////////////\n/**\n * KubernetesApplicationVolumeMount Model\n */\nconst _KubernetesApplicationVolumeMount = Object.freeze({\n name: '',\n mountPath: '',\n readOnly: false,\n});\n\nexport class KubernetesApplicationVolumeMountPayload {\n constructor(readOnly) {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesApplicationVolumeMount)));\n if (readOnly) {\n this.readOnly = true;\n } else {\n delete this.readOnly;\n }\n }\n}\n\n///////////////////////////////// PVC /////////////////////////////////\n/**\n * KubernetesApplicationVolumePersistentPayload Model\n */\nconst _KubernetesApplicationVolumePersistentPayload = Object.freeze({\n name: '',\n persistentVolumeClaim: {\n claimName: '',\n },\n});\n\nexport class KubernetesApplicationVolumePersistentPayload {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesApplicationVolumePersistentPayload)));\n }\n}\n\n/////////////////////////////// CONFIG AS VOLUME ////////////////////////\n/**\n * KubernetesApplicationVolumeConfigMapPayload Model\n */\nconst _KubernetesApplicationVolumeConfigMapPayload = Object.freeze({\n name: '',\n configMap: {\n name: '',\n items: [], // KubernetesApplicationVolumeEntryPayload\n },\n});\n\nexport class KubernetesApplicationVolumeConfigMapPayload {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesApplicationVolumeConfigMapPayload)));\n }\n}\n\n//////////////////// SECRET AS VOLUME /////////////////////////////////////\n/**\n * KubernetesApplicationVolumeSecretPayload Model\n */\nconst _KubernetesApplicationVolumeSecretPayload = Object.freeze({\n name: '',\n secret: {\n secretName: '',\n items: [], // KubernetesApplicationVolumeEntryPayload\n },\n});\n\nexport class KubernetesApplicationVolumeSecretPayload {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesApplicationVolumeSecretPayload)));\n }\n}\n\n/**\n * KubernetesApplicationVolumeEntryPayload Model\n */\nconst _KubernetesApplicationVolumeEntryPayload = Object.freeze({\n key: '',\n path: '',\n});\n\nexport class KubernetesApplicationVolumeEntryPayload {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesApplicationVolumeEntryPayload)));\n }\n}\n\n//////////////////////////// ENV ENTRY //////////////////////////////\n/**\n * KubernetesApplicationEnvPayload Model\n */\nconst _KubernetesApplicationEnvPayload = Object.freeze({\n name: '',\n value: '',\n});\n\nexport class KubernetesApplicationEnvPayload {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesApplicationEnvPayload)));\n }\n}\n\n///////////////////////// CONFIG AS ENV ////////////////////////////////\n/**\n * KubernetesApplicationEnvConfigMapPayload Model\n */\nconst _KubernetesApplicationEnvConfigMapPayload = Object.freeze({\n name: '',\n valueFrom: {\n configMapKeyRef: {\n name: '',\n key: '',\n },\n },\n});\n\nexport class KubernetesApplicationEnvConfigMapPayload {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesApplicationEnvConfigMapPayload)));\n }\n}\n\n//////////////////////// SECRET AS ENV //////////////////////////////////\n/**\n * KubernetesApplicationEnvSecretPayload Model\n */\nconst _KubernetesApplicationEnvSecretPayload = Object.freeze({\n name: '',\n valueFrom: {\n secretKeyRef: {\n name: '',\n key: '',\n },\n },\n});\n\nexport class KubernetesApplicationEnvSecretPayload {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesApplicationEnvSecretPayload)));\n }\n}\n","import _ from 'lodash-es';\nimport * as JsonPatch from 'fast-json-patch';\n\nimport { KubernetesPersistentVolumeClaim } from 'Kubernetes/models/volume/models';\nimport { KubernetesPersistentVolumClaimCreatePayload } from 'Kubernetes/models/volume/payloads';\nimport { KubernetesPortainerApplicationOwnerLabel, KubernetesPortainerApplicationNameLabel } from 'Kubernetes/models/application/models';\n\nclass KubernetesPersistentVolumeClaimConverter {\n static apiToPersistentVolumeClaim(data, storageClasses, yaml) {\n const res = new KubernetesPersistentVolumeClaim();\n res.Id = data.metadata.uid;\n res.Name = data.metadata.name;\n res.Namespace = data.metadata.namespace;\n res.CreationDate = data.metadata.creationTimestamp;\n res.Storage = `${data.spec.resources.requests.storage}B`;\n res.StorageClass = _.find(storageClasses, { Name: data.spec.storageClassName });\n res.Yaml = yaml ? yaml.data : '';\n res.ApplicationOwner = data.metadata.labels ? data.metadata.labels[KubernetesPortainerApplicationOwnerLabel] : '';\n res.ApplicationName = data.metadata.labels ? data.metadata.labels[KubernetesPortainerApplicationNameLabel] : '';\n return res;\n }\n\n /**\n * Generate KubernetesPersistentVolumeClaim list from KubernetesApplicationFormValues\n * @param {KubernetesApplicationFormValues} formValues\n */\n static applicationFormValuesToVolumeClaims(formValues) {\n _.remove(formValues.PersistedFolders, (item) => item.NeedsDeletion);\n const res = _.map(formValues.PersistedFolders, (item) => {\n const pvc = new KubernetesPersistentVolumeClaim();\n if (!_.isEmpty(item.ExistingVolume)) {\n const existantPVC = item.ExistingVolume.PersistentVolumeClaim;\n pvc.Name = existantPVC.Name;\n if (item.PersistentVolumeClaimName) {\n pvc.PreviousName = item.PersistentVolumeClaimName;\n }\n pvc.StorageClass = existantPVC.StorageClass;\n pvc.Storage = existantPVC.Storage.charAt(0);\n pvc.CreationDate = existantPVC.CreationDate;\n pvc.Id = existantPVC.Id;\n } else {\n if (item.PersistentVolumeClaimName) {\n pvc.Name = item.PersistentVolumeClaimName;\n pvc.PreviousName = item.PersistentVolumeClaimName;\n } else {\n pvc.Name = formValues.Name + '-' + pvc.Name;\n }\n pvc.Storage = '' + item.Size + item.SizeUnit.charAt(0);\n pvc.StorageClass = item.StorageClass;\n }\n pvc.MountPath = item.ContainerPath;\n pvc.Namespace = formValues.ResourcePool.Namespace.Name;\n pvc.ApplicationOwner = formValues.ApplicationOwner;\n pvc.ApplicationName = formValues.Name;\n return pvc;\n });\n return res;\n }\n\n static createPayload(pvc) {\n const res = new KubernetesPersistentVolumClaimCreatePayload();\n res.metadata.name = pvc.Name;\n res.metadata.namespace = pvc.Namespace;\n res.spec.resources.requests.storage = pvc.Storage;\n res.spec.storageClassName = pvc.StorageClass ? pvc.StorageClass.Name : '';\n res.metadata.labels.app = pvc.ApplicationName;\n res.metadata.labels[KubernetesPortainerApplicationOwnerLabel] = pvc.ApplicationOwner;\n res.metadata.labels[KubernetesPortainerApplicationNameLabel] = pvc.ApplicationName;\n return res;\n }\n\n static patchPayload(oldPVC, newPVC) {\n const oldPayload = KubernetesPersistentVolumeClaimConverter.createPayload(oldPVC);\n const newPayload = KubernetesPersistentVolumeClaimConverter.createPayload(newPVC);\n const payload = JsonPatch.compare(oldPayload, newPayload);\n return payload;\n }\n}\n\nexport default KubernetesPersistentVolumeClaimConverter;\n","import _ from 'lodash-es';\n\nimport * as JsonPatch from 'fast-json-patch';\nimport { KubernetesNode, KubernetesNodeDetails, KubernetesNodeTaint, KubernetesNodeAvailabilities, KubernetesPortainerNodeDrainLabel } from 'Kubernetes/node/models';\nimport KubernetesResourceReservationHelper from 'Kubernetes/helpers/resourceReservationHelper';\nimport { KubernetesNodeFormValues, KubernetesNodeTaintFormValues, KubernetesNodeLabelFormValues } from 'Kubernetes/node/formValues';\nimport { KubernetesNodeCreatePayload, KubernetesNodeTaintPayload } from 'Kubernetes/node/payload';\n\nclass KubernetesNodeConverter {\n static apiToNode(data, res) {\n if (!res) {\n res = new KubernetesNode();\n }\n res.Id = data.metadata.uid;\n const hostName = _.find(data.status.addresses, { type: 'Hostname' });\n res.Name = hostName ? hostName.address : data.metadata.Name;\n res.Labels = data.metadata.labels;\n res.Role = _.has(data.metadata.labels, 'node-role.kubernetes.io/master') ? 'Master' : 'Worker';\n\n const ready = _.find(data.status.conditions, { type: KubernetesNodeConditionTypes.READY });\n const memoryPressure = _.find(data.status.conditions, { type: KubernetesNodeConditionTypes.MEMORY_PRESSURE });\n const PIDPressure = _.find(data.status.conditions, { type: KubernetesNodeConditionTypes.PID_PRESSURE });\n const diskPressure = _.find(data.status.conditions, { type: KubernetesNodeConditionTypes.DISK_PRESSURE });\n const networkUnavailable = _.find(data.status.conditions, { type: KubernetesNodeConditionTypes.NETWORK_UNAVAILABLE });\n\n res.Conditions = {\n MemoryPressure: memoryPressure && memoryPressure.status === 'True',\n PIDPressure: PIDPressure && PIDPressure.status === 'True',\n DiskPressure: diskPressure && diskPressure.status === 'True',\n NetworkUnavailable: networkUnavailable && networkUnavailable.status === 'True',\n };\n\n res.Availability = KubernetesNodeAvailabilities.ACTIVE;\n if (data.spec.unschedulable === true) {\n res.Availability = _.has(data.metadata.labels, KubernetesPortainerNodeDrainLabel) ? KubernetesNodeAvailabilities.DRAIN : KubernetesNodeAvailabilities.PAUSE;\n }\n\n if (ready.status === 'False') {\n res.Status = 'Unhealthy';\n } else if (ready.status === 'Unknown' || res.Conditions.MemoryPressure || res.Conditions.PIDPressure || res.Conditions.DiskPressure || res.Conditions.NetworkUnavailable) {\n res.Status = 'Warning';\n } else {\n res.Status = 'Ready';\n }\n\n res.CPU = KubernetesResourceReservationHelper.parseCPU(data.status.allocatable.cpu);\n res.Memory = data.status.allocatable.memory;\n res.Version = data.status.nodeInfo.kubeletVersion;\n const internalIP = _.find(data.status.addresses, { type: 'InternalIP' });\n res.IPAddress = internalIP ? internalIP.address : '-';\n res.Taints = _.map(data.spec.taints, (taint) => {\n const res = new KubernetesNodeTaint();\n res.Key = taint.key;\n res.Value = taint.value;\n res.Effect = taint.effect;\n return res;\n });\n return res;\n }\n\n static apiToNodeDetails(data, yaml) {\n let res = new KubernetesNodeDetails();\n res = KubernetesNodeConverter.apiToNode(data, res);\n res.CreationDate = data.metadata.creationTimestamp;\n res.OS.Architecture = data.status.nodeInfo.architecture;\n res.OS.Platform = data.status.nodeInfo.operatingSystem;\n res.OS.Image = data.status.nodeInfo.osImage;\n res.Yaml = yaml ? yaml.data : '';\n return res;\n }\n\n static nodeToFormValues(node) {\n const res = new KubernetesNodeFormValues();\n\n res.Availability = node.Availability;\n\n res.Taints = _.map(node.Taints, (taint) => {\n const res = new KubernetesNodeTaintFormValues();\n res.Key = taint.Key;\n res.Value = taint.Value;\n res.Effect = taint.Effect;\n res.NeedsDeletion = false;\n res.IsNew = false;\n return res;\n });\n\n res.Labels = _.map(node.Labels, (value, key) => {\n const res = new KubernetesNodeLabelFormValues();\n res.Key = key;\n res.Value = value;\n res.NeedsDeletion = false;\n res.IsNew = false;\n return res;\n });\n\n return res;\n }\n\n static formValuesToNode(node, formValues) {\n const res = angular.copy(node);\n\n res.Availability = formValues.Availability;\n\n const filteredTaints = _.filter(formValues.Taints, (taint) => !taint.NeedsDeletion);\n res.Taints = _.map(filteredTaints, (item) => {\n const taint = new KubernetesNodeTaint();\n taint.Key = item.Key;\n taint.Value = item.Value;\n taint.Effect = item.Effect;\n return taint;\n });\n\n const filteredLabels = _.filter(formValues.Labels, (label) => !label.NeedsDeletion);\n res.Labels = _.reduce(\n filteredLabels,\n (acc, item) => {\n acc[item.Key] = item.Value ? item.Value : '';\n return acc;\n },\n {}\n );\n\n return res;\n }\n\n static createPayload(node) {\n const payload = new KubernetesNodeCreatePayload();\n payload.metadata.name = node.Name;\n\n const taints = _.map(node.Taints, (taint) => {\n const res = new KubernetesNodeTaintPayload();\n res.key = taint.Key;\n res.value = taint.Value;\n res.effect = taint.Effect;\n return res;\n });\n\n payload.spec.taints = taints.length ? taints : undefined;\n\n payload.metadata.labels = node.Labels;\n\n if (node.Availability !== KubernetesNodeAvailabilities.ACTIVE) {\n payload.spec.unschedulable = true;\n if (node.Availability === KubernetesNodeAvailabilities.DRAIN) {\n payload.metadata.labels[KubernetesPortainerNodeDrainLabel] = '';\n } else {\n delete payload.metadata.labels[KubernetesPortainerNodeDrainLabel];\n }\n }\n\n return payload;\n }\n\n static patchPayload(oldNode, newNode) {\n const oldPayload = KubernetesNodeConverter.createPayload(oldNode);\n const newPayload = KubernetesNodeConverter.createPayload(newNode);\n const payload = JsonPatch.compare(oldPayload, newPayload);\n return payload;\n }\n}\n\nexport const KubernetesNodeConditionTypes = Object.freeze({\n READY: 'Ready',\n MEMORY_PRESSURE: 'MemoryPressure',\n PID_PRESSURE: 'PIDPressure',\n DISK_PRESSURE: 'DiskPressure',\n NETWORK_UNAVAILABLE: 'NetworkUnavailable',\n});\n\nexport default KubernetesNodeConverter;\n","import _ from 'lodash-es';\n\nclass KubernetesEventHelper {\n static warningCount(events) {\n const warnings = _.filter(events, (event) => event.Type === 'Warning');\n return warnings.length;\n }\n}\n\nexport default KubernetesEventHelper;\n","/**\n * KubernetesResourceReservation Model\n */\nconst _KubernetesResourceReservation = Object.freeze({\n Memory: 0,\n CPU: 0,\n});\n\nexport class KubernetesResourceReservation {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesResourceReservation)));\n }\n}\n","import * as JsonPatch from 'fast-json-patch';\nimport filesizeParser from 'filesize-parser';\n\nimport {\n KubernetesResourceQuota,\n KubernetesPortainerResourceQuotaCPULimit,\n KubernetesPortainerResourceQuotaMemoryLimit,\n KubernetesPortainerResourceQuotaCPURequest,\n KubernetesPortainerResourceQuotaMemoryRequest,\n KubernetesResourceQuotaDefaults,\n} from 'Kubernetes/models/resource-quota/models';\nimport { KubernetesResourceQuotaCreatePayload } from 'Kubernetes/models/resource-quota/payloads';\nimport KubernetesResourceQuotaHelper from 'Kubernetes/helpers/resourceQuotaHelper';\nimport { KubernetesPortainerResourcePoolNameLabel, KubernetesPortainerResourcePoolOwnerLabel } from 'Kubernetes/models/resource-pool/models';\nimport KubernetesResourceReservationHelper from 'Kubernetes/helpers/resourceReservationHelper';\nimport KubernetesCommonHelper from 'Kubernetes/helpers/commonHelper';\nimport { KubernetesResourcePoolFormValues } from 'Kubernetes/models/resource-pool/formValues';\n\nclass KubernetesResourceQuotaConverter {\n static apiToResourceQuota(data, yaml) {\n const res = new KubernetesResourceQuota();\n res.Id = data.metadata.uid;\n res.Namespace = data.metadata.namespace;\n res.Name = data.metadata.name;\n res.CpuLimit = 0;\n res.MemoryLimit = 0;\n if (data.spec.hard && data.spec.hard[KubernetesPortainerResourceQuotaCPULimit]) {\n res.CpuLimit = KubernetesResourceReservationHelper.parseCPU(data.spec.hard[KubernetesPortainerResourceQuotaCPULimit]);\n }\n if (data.spec.hard && data.spec.hard[KubernetesPortainerResourceQuotaMemoryLimit]) {\n res.MemoryLimit = filesizeParser(data.spec.hard[KubernetesPortainerResourceQuotaMemoryLimit], { base: 10 });\n }\n\n res.MemoryLimitUsed = 0;\n if (data.status.used && data.status.used[KubernetesPortainerResourceQuotaMemoryLimit]) {\n res.MemoryLimitUsed = filesizeParser(data.status.used[KubernetesPortainerResourceQuotaMemoryLimit], { base: 10 });\n }\n\n res.CpuLimitUsed = 0;\n if (data.status.used && data.status.used[KubernetesPortainerResourceQuotaCPULimit]) {\n res.CpuLimitUsed = KubernetesResourceReservationHelper.parseCPU(data.status.used[KubernetesPortainerResourceQuotaCPULimit]);\n }\n res.Yaml = yaml ? yaml.data : '';\n res.ResourcePoolName = data.metadata.labels ? data.metadata.labels[KubernetesPortainerResourcePoolNameLabel] : '';\n res.ResourcePoolOwner = data.metadata.labels ? data.metadata.labels[KubernetesPortainerResourcePoolOwnerLabel] : '';\n return res;\n }\n\n static createPayload(quota) {\n const res = new KubernetesResourceQuotaCreatePayload();\n res.metadata.name = KubernetesResourceQuotaHelper.generateResourceQuotaName(quota.Namespace);\n res.metadata.namespace = quota.Namespace;\n KubernetesCommonHelper.assignOrDeleteIfEmptyOrZero(res, `spec.hard['${KubernetesPortainerResourceQuotaCPURequest}']`, quota.CpuLimit);\n KubernetesCommonHelper.assignOrDeleteIfEmptyOrZero(res, `spec.hard['${KubernetesPortainerResourceQuotaMemoryRequest}']`, quota.MemoryLimit);\n KubernetesCommonHelper.assignOrDeleteIfEmptyOrZero(res, `spec.hard['${KubernetesPortainerResourceQuotaCPULimit}']`, quota.CpuLimit);\n KubernetesCommonHelper.assignOrDeleteIfEmptyOrZero(res, `spec.hard['${KubernetesPortainerResourceQuotaMemoryLimit}']`, quota.MemoryLimit);\n res.metadata.labels[KubernetesPortainerResourcePoolNameLabel] = quota.ResourcePoolName;\n if (quota.ResourcePoolOwner) {\n res.metadata.labels[KubernetesPortainerResourcePoolOwnerLabel] = quota.ResourcePoolOwner;\n }\n return res;\n }\n\n static updatePayload(quota) {\n const res = KubernetesResourceQuotaConverter.createPayload(quota);\n res.metadata.uid = quota.Id;\n return res;\n }\n\n static patchPayload(oldQuota, newQuota) {\n const oldPayload = KubernetesResourceQuotaConverter.createPayload(oldQuota);\n const newPayload = KubernetesResourceQuotaConverter.createPayload(newQuota);\n const payload = JsonPatch.compare(oldPayload, newPayload);\n return payload;\n }\n\n static quotaToResourcePoolFormValues(quota) {\n const res = new KubernetesResourcePoolFormValues(KubernetesResourceQuotaDefaults);\n res.Name = quota.Namespace;\n res.CpuLimit = quota.CpuLimit;\n res.MemoryLimit = KubernetesResourceReservationHelper.megaBytesValue(quota.MemoryLimit);\n if (res.CpuLimit || res.MemoryLimit) {\n res.HasQuota = true;\n }\n res.StorageClasses = quota.StorageRequests;\n return res;\n }\n\n static resourcePoolFormValuesToResourceQuota(formValues) {\n if (formValues.HasQuota) {\n const quota = new KubernetesResourceQuota(formValues.Name);\n if (formValues.HasQuota) {\n quota.CpuLimit = formValues.CpuLimit;\n quota.MemoryLimit = KubernetesResourceReservationHelper.bytesValue(formValues.MemoryLimit);\n }\n quota.ResourcePoolName = formValues.Name;\n quota.ResourcePoolOwner = formValues.Owner;\n return quota;\n }\n }\n}\n\nexport default KubernetesResourceQuotaConverter;\n","import _ from 'lodash-es';\nimport PortainerError from 'Portainer/error';\nimport { KubernetesApplication, KubernetesApplicationTypes, KubernetesApplicationTypeStrings } from 'Kubernetes/models/application/models';\nimport { KubernetesDeployment } from 'Kubernetes/models/deployment/models';\nimport { KubernetesStatefulSet } from 'Kubernetes/models/stateful-set/models';\nimport { KubernetesDaemonSet } from 'Kubernetes/models/daemon-set/models';\n\nexport class KubernetesHorizontalPodAutoScalerHelper {\n static findApplicationBoundScaler(sList, app) {\n const kind = KubernetesHorizontalPodAutoScalerHelper.getApplicationTypeString(app);\n return _.find(sList, (item) => item.TargetEntity.Kind === kind && item.TargetEntity.Name === app.Name);\n }\n\n static getApplicationTypeString(app) {\n if ((app instanceof KubernetesApplication && app.ApplicationType === KubernetesApplicationTypes.DEPLOYMENT) || app instanceof KubernetesDeployment) {\n return KubernetesApplicationTypeStrings.DEPLOYMENT;\n } else if ((app instanceof KubernetesApplication && app.ApplicationType === KubernetesApplicationTypes.DAEMONSET) || app instanceof KubernetesDaemonSet) {\n return KubernetesApplicationTypeStrings.DAEMONSET;\n } else if ((app instanceof KubernetesApplication && app.ApplicationType === KubernetesApplicationTypes.STATEFULSET) || app instanceof KubernetesStatefulSet) {\n return KubernetesApplicationTypeStrings.STATEFULSET;\n } else if (app instanceof KubernetesApplication && app.ApplicationType === KubernetesApplicationTypes.POD) {\n return KubernetesApplicationTypeStrings.POD;\n } else {\n throw new PortainerError('Unable to determine application type');\n }\n }\n}\n","import _ from 'lodash-es';\nimport { PortainerEndpointTypes } from 'Portainer/models/endpoint/models';\n\nfunction findAssociatedGroup(endpoint, groups) {\n return _.find(groups, function (group) {\n return group.Id === endpoint.GroupId;\n });\n}\n\nexport default class EndpointHelper {\n static isLocalEndpoint(endpoint) {\n return endpoint.URL.includes('unix://') || endpoint.URL.includes('npipe://') || endpoint.Type === PortainerEndpointTypes.KubernetesLocalEnvironment;\n }\n\n static isAgentEndpoint(endpoint) {\n return [\n PortainerEndpointTypes.AgentOnDockerEnvironment,\n PortainerEndpointTypes.EdgeAgentOnDockerEnvironment,\n PortainerEndpointTypes.AgentOnKubernetesEnvironment,\n PortainerEndpointTypes.EdgeAgentOnKubernetesEnvironment,\n ].includes(endpoint.Type);\n }\n\n static isEdgeEndpoint(endpoint) {\n return [PortainerEndpointTypes.EdgeAgentOnDockerEnvironment, PortainerEndpointTypes.EdgeAgentOnKubernetesEnvironment].includes(endpoint.Type);\n }\n\n static mapGroupNameToEndpoint(endpoints, groups) {\n for (var i = 0; i < endpoints.length; i++) {\n var endpoint = endpoints[i];\n var group = findAssociatedGroup(endpoint, groups);\n if (group) {\n endpoint.GroupName = group.Name;\n }\n }\n }\n}\n","import { KubernetesPortainerResourceQuotaPrefix } from 'Kubernetes/models/resource-quota/models';\n\nclass KubernetesResourceQuotaHelper {\n static generateResourceQuotaName(name) {\n return KubernetesPortainerResourceQuotaPrefix + name;\n }\n\n static formatBytes(bytes, decimals = 0, base10 = true) {\n const res = {\n Size: 0,\n SizeUnit: 'B',\n };\n\n if (bytes === 0) {\n return res;\n }\n\n const k = base10 ? 1000 : 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return {\n Size: parseFloat((bytes / Math.pow(k, i)).toFixed(dm)),\n SizeUnit: sizes[i],\n };\n }\n}\n\nexport default KubernetesResourceQuotaHelper;\n","export function StoridgeProfileDefaultModel() {\n this.Directory = '/cio/';\n this.Capacity = 20;\n this.Redundancy = 2;\n this.Provisioning = 'thin';\n this.Type = 'ssd';\n this.MinIOPS = 100;\n this.MaxIOPS = 2000;\n this.MinBandwidth = 1;\n this.MaxBandwidth = 100;\n this.Filesystem = 'btrfs';\n this.SnapshotEnabled = false;\n this.SnapshotInterval = 1440;\n this.SnapshotMax = 1;\n this.EncryptionEnabled = false;\n this.InterfaceType = '';\n this.InterfaceDriver = '';\n this.InterfaceNetwork = '';\n this.InterfaceConf = '';\n this.Labels = [];\n}\n\nexport function StoridgeProfileListModel(data) {\n this.Name = data;\n this.Checked = false;\n}\n\nexport function StoridgeProfileModel(name, data) {\n this.Name = name;\n this.Directory = data.directory;\n this.Capacity = data.capacity;\n this.Provisioning = data.provision;\n this.Type = data.type;\n this.Redundancy = data.level;\n\n if (data.iops) {\n this.MinIOPS = data.iops.min;\n this.MaxIOPS = data.iops.max;\n }\n\n if (data.bandwidth) {\n this.MinBandwidth = data.bandwidth.min;\n this.MaxBandwidth = data.bandwidth.max;\n }\n\n if (data.filesystem) {\n this.Filesystem = data.filesystem.type;\n }\n // this.Filesystem = data.filesystem;\n\n var service = data.service;\n\n if (service.snapshot) {\n this.SnapshotEnabled = service.snapshot.enabled;\n this.SnapshotInterval = service.snapshot.interval;\n this.SnapshotMax = service.snapshot.max;\n } else {\n this.SnapshotEnabled = false;\n }\n\n if (service.encryption) {\n this.EncryptionEnabled = service.encryption.enabled;\n } else {\n this.EncryptionEnabled = false;\n }\n\n if (data.interface) {\n this.InterfaceType = data.interface.type;\n this.InterfaceDriver = data.interface.driver;\n this.InterfaceNetwork = data.interface.network;\n this.InterfaceConf = data.interface.conf;\n }\n\n if (data.label) {\n this.Labels = data.label;\n } else {\n this.Labels = [];\n }\n}\n\nexport function StoridgeCreateProfileRequest(model) {\n this.name = model.Name;\n this.capacity = model.Capacity;\n this.directory = model.Directory;\n this.provision = model.Provisioning;\n this.type = model.Type;\n this.level = model.Redundancy;\n if (model.MinIOPS && model.MaxIOPS) {\n this.iops = {\n min: model.MinIOPS,\n max: model.MaxIOPS,\n };\n }\n\n if (model.MinBandwidth && model.MaxBandwidth) {\n this.bandwidth = {\n min: model.MinBandwidth,\n max: model.MaxBandwidth,\n };\n }\n\n this.filesystem = {\n type: model.Filesystem,\n };\n\n var service = {};\n\n service.snapshot = {\n enabled: model.SnapshotEnabled,\n };\n if (model.SnapshotEnabled) {\n service.snapshot.interval = model.SnapshotInterval;\n service.snapshot.max = model.SnapshotMax;\n }\n\n service.encryption = {\n enabled: model.EncryptionEnabled,\n };\n\n this.service = service;\n\n this.interface = {\n driver: model.InterfaceDriver,\n network: model.InterfaceNetwork,\n conf: model.InterfaceConf,\n };\n\n if (model.InterfaceType) {\n this.interface.type = model.InterfaceType;\n }\n\n this.label = model.Labels;\n}\n","import _ from 'lodash-es';\n\nimport { KubernetesResourcePool } from 'Kubernetes/models/resource-pool/models';\nimport { KubernetesNamespace } from 'Kubernetes/models/namespace/models';\nimport { KubernetesIngressConverter } from 'Kubernetes/ingress/converter';\nimport KubernetesResourceQuotaConverter from './resourceQuota';\n\nclass KubernetesResourcePoolConverter {\n static apiToResourcePool(namespace) {\n const res = new KubernetesResourcePool();\n res.Namespace = namespace;\n res.Yaml = namespace.Yaml;\n return res;\n }\n\n static formValuesToResourcePool(formValues) {\n const namespace = new KubernetesNamespace();\n namespace.Name = formValues.Name;\n namespace.ResourcePoolName = formValues.Name;\n namespace.ResourcePoolOwner = formValues.Owner;\n namespace.IsSystem = formValues.IsSystem;\n\n const quota = KubernetesResourceQuotaConverter.resourcePoolFormValuesToResourceQuota(formValues);\n\n const ingMap = _.map(formValues.IngressClasses, (c) => {\n if (c.Selected) {\n c.Namespace = namespace.Name;\n return KubernetesIngressConverter.resourcePoolIngressClassFormValueToIngress(c);\n }\n });\n const ingresses = _.without(ingMap, undefined);\n const registries = _.map(formValues.Registries, (r) => {\n if (!r.RegistryAccesses[formValues.EndpointId]) {\n r.RegistryAccesses[formValues.EndpointId] = { Namespaces: [] };\n }\n if (!_.includes(r.RegistryAccesses[formValues.EndpointId].Namespaces, formValues.Name)) {\n r.RegistryAccesses[formValues.EndpointId].Namespaces = [...r.RegistryAccesses[formValues.EndpointId].Namespaces, formValues.Name];\n }\n return r;\n });\n return [namespace, quota, ingresses, registries];\n }\n}\n\nexport default KubernetesResourcePoolConverter;\n","import _ from 'lodash-es';\nimport { KubernetesSecretCreatePayload, KubernetesSecretUpdatePayload } from 'Kubernetes/models/secret/payloads';\nimport { KubernetesApplicationSecret } from 'Kubernetes/models/secret/models';\nimport { KubernetesPortainerConfigurationDataAnnotation } from 'Kubernetes/models/configuration/models';\nimport { KubernetesPortainerConfigurationOwnerLabel } from 'Kubernetes/models/configuration/models';\nimport { KubernetesConfigurationFormValuesEntry } from 'Kubernetes/models/configuration/formvalues';\n\nclass KubernetesSecretConverter {\n static createPayload(secret) {\n const res = new KubernetesSecretCreatePayload();\n res.metadata.name = secret.Name;\n res.metadata.namespace = secret.Namespace;\n const configurationOwner = _.truncate(secret.ConfigurationOwner, { length: 63, omission: '' });\n res.metadata.labels[KubernetesPortainerConfigurationOwnerLabel] = configurationOwner;\n\n let annotation = '';\n _.forEach(secret.Data, (entry) => {\n if (entry.IsBinary) {\n res.data[entry.Key] = entry.Value;\n annotation += annotation !== '' ? '|' + entry.Key : entry.Key;\n } else {\n res.stringData[entry.Key] = entry.Value;\n }\n });\n if (annotation !== '') {\n res.metadata.annotations[KubernetesPortainerConfigurationDataAnnotation] = annotation;\n }\n return res;\n }\n\n static updatePayload(secret) {\n const res = new KubernetesSecretUpdatePayload();\n res.metadata.name = secret.Name;\n res.metadata.namespace = secret.Namespace;\n res.metadata.labels[KubernetesPortainerConfigurationOwnerLabel] = secret.ConfigurationOwner;\n\n let annotation = '';\n _.forEach(secret.Data, (entry) => {\n if (entry.IsBinary) {\n res.data[entry.Key] = entry.Value;\n annotation += annotation !== '' ? '|' + entry.Key : entry.Key;\n } else {\n res.stringData[entry.Key] = entry.Value;\n }\n });\n if (annotation !== '') {\n res.metadata.annotations[KubernetesPortainerConfigurationDataAnnotation] = annotation;\n }\n return res;\n }\n\n static apiToSecret(payload, yaml) {\n const res = new KubernetesApplicationSecret();\n res.Id = payload.metadata.uid;\n res.Name = payload.metadata.name;\n res.Namespace = payload.metadata.namespace;\n res.ConfigurationOwner = payload.metadata.labels ? payload.metadata.labels[KubernetesPortainerConfigurationOwnerLabel] : '';\n res.CreationDate = payload.metadata.creationTimestamp;\n\n res.IsRegistrySecret = payload.metadata.annotations && !!payload.metadata.annotations['portainer.io/registry.id'];\n\n res.Yaml = yaml ? yaml.data : '';\n\n res.Data = _.map(payload.data, (value, key) => {\n const annotations = payload.metadata.annotations ? payload.metadata.annotations[KubernetesPortainerConfigurationDataAnnotation] : '';\n const entry = new KubernetesConfigurationFormValuesEntry();\n entry.Key = key;\n entry.IsBinary = _.includes(annotations, entry.Key);\n\n if (!entry.IsBinary) {\n entry.Value = atob(value);\n } else {\n entry.Value = value;\n }\n return entry;\n });\n\n return res;\n }\n\n static configurationFormValuesToSecret(formValues) {\n const res = new KubernetesApplicationSecret();\n res.Name = formValues.Name;\n res.Namespace = formValues.ResourcePool.Namespace.Name;\n res.ConfigurationOwner = formValues.ConfigurationOwner;\n res.Data = formValues.Data;\n return res;\n }\n}\n\nexport default KubernetesSecretConverter;\n","export const KubernetesSystem_DefaultDeploymentUniqueLabelKey = 'pod-template-hash';\nexport const KubernetesSystem_RevisionAnnotation = 'deployment.kubernetes.io/revision';\nexport const KubernetesSystem_RevisionHistoryAnnotation = 'deployment.kubernetes.io/revision-history';\nexport const KubernetesSystem_ChangeCauseAnnotation = 'kubernetes.io/change-cause';\nexport const KubernetesSystem_DesiredReplicasAnnotation = 'deployment.kubernetes.io/desired-replicas';\nexport const KubernetesSystem_MaxReplicasAnnotation = 'deployment.kubernetes.io/max-replicas';\n\n// annotationsToSkip lists the annotations that should be preserved from the deployment and not\n// copied from the replicaset when rolling a deployment back\n// var annotationsToSkip = map[string]bool{\n// corev1.LastAppliedConfigAnnotation: true,\n// deploymentutil.RevisionAnnotation: true,\n// deploymentutil.RevisionHistoryAnnotation: true,\n// deploymentutil.DesiredReplicasAnnotation: true,\n// deploymentutil.MaxReplicasAnnotation: true,\n// appsv1.DeprecatedRollbackTo: true,\n// }\n\n// LastAppliedConfigAnnotation is the annotation used to store the previous\n// configuration of a resource for use in a three way diff by UpdateApplyAnnotation.\nconst LastAppliedConfigAnnotation = 'kubectl.kubernetes.io/last-applied-configuration';\n\nconst DeprecatedRollbackTo = 'deprecated.deployment.rollback.to';\n\nexport const KubernetesSystem_AnnotationsToSkip = {\n [LastAppliedConfigAnnotation]: true,\n [KubernetesSystem_RevisionAnnotation]: true,\n [KubernetesSystem_RevisionHistoryAnnotation]: true,\n [KubernetesSystem_DesiredReplicasAnnotation]: true,\n [KubernetesSystem_MaxReplicasAnnotation]: true,\n [DeprecatedRollbackTo]: true,\n};\n","export const ResourceControlTypeString = Object.freeze({\n CONFIG: 'config',\n CONTAINER: 'container',\n NETWORK: 'network',\n SECRET: 'secret',\n SERVICE: 'service',\n STACK: 'stack',\n VOLUME: 'volume',\n CUSTOM_TEMPLATE: 'custom-template',\n CONTAINER_GROUP: 'container-group',\n});\n\n/**\n * ResourceType int defined in portainer.go as ResourceControlType\n */\nexport const ResourceControlTypeInt = Object.freeze({\n CONTAINER: 1,\n SERVICE: 2,\n VOLUME: 3,\n NETWORK: 4,\n SECRET: 5,\n STACK: 6,\n CONFIG: 7,\n CUSTOM_TEMPLATE: 8,\n CONTAINER_GROUP: 9,\n});\n","/**\n * KubernetesDeployment Model\n */\nconst _KubernetesDeployment = Object.freeze({\n Namespace: '',\n Name: '',\n StackName: '',\n ReplicaCount: 0,\n ImageModel: null,\n Env: [],\n CpuLimit: 0,\n MemoryLimit: 0,\n VolumeMounts: [],\n Volumes: [],\n Secret: undefined,\n ApplicationName: '',\n ApplicationOwner: '',\n Note: '',\n Affinity: undefined, // KubernetesPodAffinity\n});\n\nexport class KubernetesDeployment {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesDeployment)));\n }\n}\n","/**\n * KubernetesDaemonSet Model\n */\nconst _KubernetesDaemonSet = Object.freeze({\n Namespace: '',\n Name: '',\n StackName: '',\n ImageModel: null,\n Env: [],\n CpuLimit: 0,\n MemoryLimit: 0,\n VoluemMounts: [],\n Volumes: [],\n Secret: undefined,\n ApplicationName: '',\n ApplicationOwner: '',\n Note: '',\n Affinity: undefined, // KubernetesPodAffinity\n});\n\nexport class KubernetesDaemonSet {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesDaemonSet)));\n }\n}\n","export function getAgentShortVersion(agentVersion) {\n const numbers = agentVersion.split('.');\n return numbers[0] + numbers[1];\n}\n","import { RegistryTypes } from './registryTypes';\n\nexport function DockerHubViewModel() {\n this.Id = 0;\n this.Type = RegistryTypes.ANONYMOUS;\n this.Name = 'DockerHub (anonymous)';\n this.URL = 'docker.io';\n}\n","import _ from 'lodash-es';\nimport * as JsonPatch from 'fast-json-patch';\n\nimport { KubernetesServiceCreatePayload } from 'Kubernetes/models/service/payloads';\nimport {\n KubernetesApplicationPublishingTypes,\n KubernetesPortainerApplicationNameLabel,\n KubernetesPortainerApplicationOwnerLabel,\n KubernetesPortainerApplicationStackNameLabel,\n} from 'Kubernetes/models/application/models';\nimport { KubernetesService, KubernetesServiceHeadlessClusterIP, KubernetesServicePort, KubernetesServiceTypes } from 'Kubernetes/models/service/models';\nimport KubernetesServiceHelper from 'Kubernetes/helpers/serviceHelper';\n\nfunction _publishedPortToServicePort(formValues, publishedPort, type) {\n if (publishedPort.IsNew || !publishedPort.NeedsDeletion) {\n const name = formValues.Name;\n const res = new KubernetesServicePort();\n res.name = _.toLower(name + '-' + publishedPort.ContainerPort + '-' + publishedPort.Protocol);\n res.port = type === KubernetesServiceTypes.LOAD_BALANCER ? publishedPort.LoadBalancerPort : publishedPort.ContainerPort;\n res.targetPort = publishedPort.ContainerPort;\n res.protocol = publishedPort.Protocol;\n if (type === KubernetesServiceTypes.NODE_PORT && publishedPort.NodePort) {\n res.nodePort = publishedPort.NodePort;\n } else if (type === KubernetesServiceTypes.LOAD_BALANCER && publishedPort.LoadBalancerNodePort) {\n res.nodePort = publishedPort.LoadBalancerNodePort;\n } else {\n delete res.nodePort;\n }\n return res;\n }\n}\n\nclass KubernetesServiceConverter {\n /**\n * Generate KubernetesService from KubernetesApplicationFormValues\n * @param {KubernetesApplicationFormValues} formValues\n */\n static applicationFormValuesToService(formValues) {\n const res = new KubernetesService();\n res.Namespace = formValues.ResourcePool.Namespace.Name;\n res.Name = formValues.Name;\n res.StackName = formValues.StackName ? formValues.StackName : formValues.Name;\n res.ApplicationOwner = formValues.ApplicationOwner;\n res.ApplicationName = formValues.Name;\n if (formValues.PublishingType === KubernetesApplicationPublishingTypes.NODE_PORT) {\n res.Type = KubernetesServiceTypes.NODE_PORT;\n } else if (formValues.PublishingType === KubernetesApplicationPublishingTypes.LOAD_BALANCER) {\n res.Type = KubernetesServiceTypes.LOAD_BALANCER;\n }\n const ports = _.map(formValues.PublishedPorts, (item) => _publishedPortToServicePort(formValues, item, res.Type));\n res.Ports = _.uniqBy(_.without(ports, undefined), (p) => p.targetPort + p.protocol);\n return res;\n }\n\n static applicationFormValuesToHeadlessService(formValues) {\n const res = KubernetesServiceConverter.applicationFormValuesToService(formValues);\n res.Name = KubernetesServiceHelper.generateHeadlessServiceName(formValues.Name);\n res.Headless = true;\n return res;\n }\n\n /**\n * Generate CREATE payload from Service\n * @param {KubernetesService} model Service to genereate payload from\n */\n static createPayload(service) {\n const payload = new KubernetesServiceCreatePayload();\n payload.metadata.name = service.Name;\n payload.metadata.namespace = service.Namespace;\n payload.metadata.labels[KubernetesPortainerApplicationStackNameLabel] = service.StackName;\n payload.metadata.labels[KubernetesPortainerApplicationNameLabel] = service.ApplicationName;\n payload.metadata.labels[KubernetesPortainerApplicationOwnerLabel] = service.ApplicationOwner;\n payload.spec.ports = service.Ports;\n payload.spec.selector.app = service.ApplicationName;\n if (service.Headless) {\n payload.spec.clusterIP = KubernetesServiceHeadlessClusterIP;\n delete payload.spec.ports;\n } else if (service.Type) {\n payload.spec.type = service.Type;\n }\n return payload;\n }\n\n static patchPayload(oldService, newService) {\n const oldPayload = KubernetesServiceConverter.createPayload(oldService);\n const newPayload = KubernetesServiceConverter.createPayload(newService);\n const payload = JsonPatch.compare(oldPayload, newPayload);\n return payload;\n }\n}\n\nexport default KubernetesServiceConverter;\n","import * as JsonPatch from 'fast-json-patch';\nimport _ from 'lodash-es';\n\nimport KubernetesCommonHelper from 'Kubernetes/helpers/commonHelper';\nimport {\n KubernetesPortainerApplicationStackNameLabel,\n KubernetesPortainerApplicationNameLabel,\n KubernetesPortainerApplicationOwnerLabel,\n KubernetesPortainerApplicationNote,\n} from 'Kubernetes/models/application/models';\n\nimport { KubernetesPod, KubernetesPodToleration, KubernetesPodAffinity, KubernetesPodContainer, KubernetesPodContainerTypes, KubernetesPodEviction } from 'Kubernetes/pod/models';\nimport { createPayloadFactory } from './payloads/create';\n\nfunction computeStatus(statuses) {\n const containerStatuses = _.map(statuses, 'state');\n const running = _.filter(containerStatuses, (s) => s.running).length;\n const waiting = _.filter(containerStatuses, (s) => s.waiting).length;\n if (waiting) {\n return 'Waiting';\n } else if (!running) {\n return 'Terminated';\n }\n return 'Running';\n}\n\nfunction computeContainerStatus(statuses, name) {\n const status = _.find(statuses, { name: name });\n if (!status) {\n return 'Terminated';\n }\n const state = status.state;\n if (state.waiting) {\n return 'Waiting';\n }\n if (!state.running) {\n return 'Terminated';\n }\n return 'Running';\n}\n\nfunction computeAffinity(affinity) {\n const res = new KubernetesPodAffinity();\n if (affinity) {\n res.nodeAffinity = affinity.nodeAffinity || {};\n }\n return res;\n}\n\nfunction computeTolerations(tolerations) {\n return _.map(tolerations, (item) => {\n const res = new KubernetesPodToleration();\n res.Key = item.key;\n res.Operator = item.operator;\n res.Value = item.value;\n res.TolerationSeconds = item.tolerationSeconds;\n res.Effect = item.effect;\n return res;\n });\n}\n\nfunction computeContainers(data) {\n const containers = data.spec.containers;\n const initContainers = data.spec.initContainers;\n\n return _.concat(\n _.map(containers, (item) => {\n const res = new KubernetesPodContainer();\n res.Type = KubernetesPodContainerTypes.APP;\n res.PodName = data.metadata.name;\n res.PodIP = data.status.podIP;\n res.Name = item.name;\n res.Image = item.image;\n res.ImagePullPolicy = item.imagePullPolicy;\n res.Node = data.spec.nodeName;\n res.CreationDate = data.status.startTime;\n res.Status = computeContainerStatus(data.status.containerStatuses, item.name);\n res.Limits = item.resources.limits;\n res.Requests = item.resources.requests;\n res.VolumeMounts = item.volumeMounts;\n res.Env = item.env;\n return res;\n }),\n _.map(initContainers, (item) => {\n const res = new KubernetesPodContainer();\n res.Type = KubernetesPodContainerTypes.INIT;\n res.PodName = data.metadata.name;\n res.Name = item.name;\n res.Image = item.image;\n res.Node = data.spec.nodeName;\n res.CreationDate = data.status.startTime;\n res.Status = computeContainerStatus(data.status.containerStatuses, item.name);\n res.Limits = item.resources.limits;\n res.Requests = item.resources.requests;\n res.VolumeMounts = item.volumeMounts;\n res.Env = item.env;\n return res;\n })\n );\n}\n\nexport default class KubernetesPodConverter {\n static apiToModel(data) {\n const res = new KubernetesPod();\n res.Id = data.metadata.uid;\n res.Name = data.metadata.name;\n res.Namespace = data.metadata.namespace;\n res.Images = _.map(data.spec.containers, 'image');\n res.Status = computeStatus(data.status.containerStatuses);\n res.Restarts = _.sumBy(data.status.containerStatuses, 'restartCount');\n res.Node = data.spec.nodeName;\n res.CreationDate = data.status.startTime;\n res.Containers = computeContainers(data);\n res.Labels = data.metadata.labels;\n res.Affinity = computeAffinity(data.spec.affinity);\n res.NodeSelector = data.spec.nodeSelector;\n res.Tolerations = computeTolerations(data.spec.tolerations);\n return res;\n }\n\n static evictionPayload(pod) {\n const res = new KubernetesPodEviction();\n res.metadata.name = pod.Name;\n res.metadata.namespace = pod.Namespace;\n return res;\n }\n\n static patchPayload(oldPod, newPod) {\n const oldPayload = createPayload(oldPod);\n const newPayload = createPayload(newPod);\n const payload = JsonPatch.compare(oldPayload, newPayload);\n return payload;\n }\n}\n\nfunction createPayload(pod) {\n const payload = createPayloadFactory();\n payload.metadata.name = pod.Name;\n payload.metadata.namespace = pod.Namespace;\n payload.metadata.labels[KubernetesPortainerApplicationStackNameLabel] = pod.StackName;\n payload.metadata.labels[KubernetesPortainerApplicationNameLabel] = pod.ApplicationName;\n payload.metadata.labels[KubernetesPortainerApplicationOwnerLabel] = pod.ApplicationOwner;\n if (pod.Note) {\n payload.metadata.annotations[KubernetesPortainerApplicationNote] = pod.Note;\n } else {\n payload.metadata.annotations = undefined;\n }\n\n payload.spec.replicas = pod.ReplicaCount;\n payload.spec.selector.matchLabels.app = pod.Name;\n payload.spec.template.metadata.labels.app = pod.Name;\n payload.spec.template.metadata.labels[KubernetesPortainerApplicationNameLabel] = pod.ApplicationName;\n payload.spec.template.spec.containers[0].name = pod.Name;\n payload.spec.template.spec.containers[0].image = pod.Image;\n payload.spec.template.spec.affinity = pod.Affinity;\n KubernetesCommonHelper.assignOrDeleteIfEmpty(payload, 'spec.template.spec.containers[0].env', pod.Env);\n KubernetesCommonHelper.assignOrDeleteIfEmpty(payload, 'spec.template.spec.containers[0].volumeMounts', pod.VolumeMounts);\n KubernetesCommonHelper.assignOrDeleteIfEmpty(payload, 'spec.template.spec.volumes', pod.Volumes);\n if (pod.MemoryLimit) {\n payload.spec.template.spec.containers[0].resources.limits.memory = pod.MemoryLimit;\n payload.spec.template.spec.containers[0].resources.requests.memory = pod.MemoryLimit;\n }\n if (pod.CpuLimit) {\n payload.spec.template.spec.containers[0].resources.limits.cpu = pod.CpuLimit;\n payload.spec.template.spec.containers[0].resources.requests.cpu = pod.CpuLimit;\n }\n if (!pod.CpuLimit && !pod.MemoryLimit) {\n delete payload.spec.template.spec.containers[0].resources;\n }\n return payload;\n}\n","import _ from 'lodash-es';\nimport { KubernetesConfiguration, KubernetesConfigurationTypes } from 'Kubernetes/models/configuration/models';\n\nclass KubernetesConfigurationConverter {\n static secretToConfiguration(secret) {\n const res = new KubernetesConfiguration();\n res.Type = KubernetesConfigurationTypes.SECRET;\n res.Id = secret.Id;\n res.Name = secret.Name;\n res.Namespace = secret.Namespace;\n res.CreationDate = secret.CreationDate;\n res.Yaml = secret.Yaml;\n _.forEach(secret.Data, (entry) => {\n res.Data[entry.Key] = entry.Value;\n });\n res.ConfigurationOwner = secret.ConfigurationOwner;\n res.IsRegistrySecret = secret.IsRegistrySecret;\n return res;\n }\n\n static configMapToConfiguration(configMap) {\n const res = new KubernetesConfiguration();\n res.Type = KubernetesConfigurationTypes.CONFIGMAP;\n res.Id = configMap.Id;\n res.Name = configMap.Name;\n res.Namespace = configMap.Namespace;\n res.CreationDate = configMap.CreationDate;\n res.Yaml = configMap.Yaml;\n _.forEach(configMap.Data, (entry) => {\n res.Data[entry.Key] = entry.Value;\n });\n res.ConfigurationOwner = configMap.ConfigurationOwner;\n return res;\n }\n}\n\nexport default KubernetesConfigurationConverter;\n","import { ResourceControlViewModel } from 'Portainer/models/resourceControl/resourceControl';\n\nexport function StackViewModel(data) {\n this.Id = data.Id;\n this.Type = data.Type;\n this.Name = data.Name;\n this.EndpointId = data.EndpointId;\n this.SwarmId = data.SwarmId;\n this.Env = data.Env ? data.Env : [];\n this.IsComposeFormat = data.IsComposeFormat;\n if (data.ResourceControl && data.ResourceControl.Id !== 0) {\n this.ResourceControl = new ResourceControlViewModel(data.ResourceControl);\n }\n this.Status = data.Status;\n this.CreationDate = data.CreationDate;\n this.CreatedBy = data.CreatedBy;\n this.UpdateDate = data.UpdateDate;\n this.UpdatedBy = data.UpdatedBy;\n this.Regular = true;\n this.External = false;\n this.Orphaned = false;\n this.Checked = false;\n this.GitConfig = data.GitConfig;\n this.AdditionalFiles = data.AdditionalFiles;\n this.AutoUpdate = data.AutoUpdate;\n}\n\nexport function ExternalStackViewModel(name, type, creationDate) {\n this.Name = name;\n this.Type = type;\n this.CreationDate = creationDate;\n\n this.Regular = false;\n this.External = true;\n this.Orphaned = false;\n this.Checked = false;\n}\n\nexport function OrphanedStackViewModel(data) {\n this.Id = data.Id;\n this.Type = data.Type;\n this.Name = data.Name;\n this.EndpointId = data.EndpointId;\n this.SwarmId = data.SwarmId;\n this.Env = data.Env ? data.Env : [];\n if (data.ResourceControl && data.ResourceControl.Id !== 0) {\n this.ResourceControl = new ResourceControlViewModel(data.ResourceControl);\n }\n this.Status = data.Status;\n this.CreationDate = data.CreationDate;\n this.CreatedBy = data.CreatedBy;\n this.UpdateDate = data.UpdateDate;\n this.UpdatedBy = data.UpdatedBy;\n\n this.Regular = false;\n this.External = false;\n this.Orphaned = true;\n this.OrphanedRunning = false;\n this.Checked = false;\n}\n","export class KubernetesNamespace {\n constructor() {\n this.Id = '';\n this.Name = '';\n this.CreationDate = '';\n this.Status = '';\n this.Yaml = '';\n this.ResourcePoolName = '';\n this.ResourcePoolOwner = '';\n this.IsSystem = false;\n }\n}\n\nexport const KUBERNETES_DEFAULT_SYSTEM_NAMESPACES = ['kube-system', 'kube-public', 'kube-node-lease', 'portainer'];\nexport const KUBERNETES_DEFAULT_NAMESPACE = 'default';\n","/**\n * KubernetesStorageClassAccessPolicies Model\n */\nconst _KubernetesStorageClassAccessPolicies = Object.freeze([\n {\n Name: 'RWO',\n Description: 'Allow read-write from a single pod only (RWO)',\n selected: true,\n },\n {\n Name: 'RWX',\n Description: 'Allow read-write access from one or more pods concurrently (RWX)',\n selected: false,\n },\n]);\n\nexport function KubernetesStorageClassAccessPolicies() {\n return JSON.parse(JSON.stringify(_KubernetesStorageClassAccessPolicies));\n}\n\n/**\n * KubernetesStorageClass Model\n */\nconst _KubernetesStorageClass = Object.freeze({\n Name: '',\n AccessModes: [],\n Provisioner: '',\n AllowVolumeExpansion: false,\n});\n\nexport class KubernetesStorageClass {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesStorageClass)));\n }\n}\n","export function EndpointSecurityFormData() {\n this.TLS = false;\n this.TLSMode = 'tls_client_ca';\n this.TLSCACert = null;\n this.TLSCert = null;\n this.TLSKey = null;\n}\n","export function KubernetesIngress() {\n return {\n Name: '',\n Namespace: '',\n Annotations: {},\n // Host: undefined,\n Hosts: [],\n // PreviousHost: undefined, // only use for RP ingress host edit\n Paths: [],\n IngressClassName: '',\n };\n}\n\n// TODO: refactor @LP\n// rename this model to KubernetesIngressPath (and all it's references)\n// as it's conceptually not an ingress rule (element of ingress.spec.rules)\n// but a path (element of ingress.spec.rules[].paths)\nexport function KubernetesIngressRule() {\n return {\n IngressName: '',\n ServiceName: '',\n Host: '',\n IP: '',\n Port: '',\n Path: '',\n };\n}\n\nexport function KubernetesIngressClass() {\n return {\n Name: '',\n Type: undefined,\n NeedsDeletion: false,\n IsNew: true,\n };\n}\n","const _KubernetesNodeFormValues = Object.freeze({\n Taints: [],\n Labels: [],\n Availability: '',\n});\n\nexport class KubernetesNodeFormValues {\n constructor() {\n Object.assign(JSON.parse(JSON.stringify(_KubernetesNodeFormValues)));\n }\n}\n\nconst _KubernetesNodeTaintFormValues = Object.freeze({\n Key: '',\n Values: '',\n Effect: '',\n NeedsDeletion: false,\n IsNew: false,\n IsChanged: false,\n});\n\nexport class KubernetesNodeTaintFormValues {\n constructor() {\n Object.assign(JSON.parse(JSON.stringify(_KubernetesNodeTaintFormValues)));\n }\n}\n\nconst _KubernetesNodeLabelFormValues = Object.freeze({\n Key: '',\n Values: '',\n NeedsDeletion: false,\n IsNew: false,\n IsUsed: false,\n IsChanged: false,\n});\n\nexport class KubernetesNodeLabelFormValues {\n constructor() {\n Object.assign(JSON.parse(JSON.stringify(_KubernetesNodeLabelFormValues)));\n }\n}\n","import _ from 'lodash-es';\nimport { RegistryTypes } from './registryTypes';\n\nexport function RegistryViewModel(data) {\n this.Id = data.Id;\n this.Type = data.Type;\n this.Name = data.Name;\n this.URL = data.URL;\n this.BaseURL = data.BaseURL;\n this.Authentication = data.Authentication;\n this.Username = data.Username;\n this.Password = data.Password;\n this.RegistryAccesses = data.RegistryAccesses; // map[EndpointID]{UserAccessPolicies, TeamAccessPolicies, NamespaceAccessPolicies}\n this.Checked = false;\n this.Gitlab = data.Gitlab;\n this.Quay = data.Quay;\n this.Ecr = data.Ecr;\n}\n\nexport function RegistryManagementConfigurationDefaultModel(registry) {\n this.Authentication = false;\n this.Password = '';\n this.TLS = false;\n this.TLSSkipVerify = false;\n this.TLSCACertFile = null;\n this.TLSCertFile = null;\n this.TLSKeyFile = null;\n\n if (registry.Type === RegistryTypes.ECR) {\n this.Region = registry.Ecr.Region;\n this.TLSSkipVerify = true;\n }\n\n if (registry.Type === RegistryTypes.QUAY || registry.Type === RegistryTypes.AZURE || registry.Type === RegistryTypes.ECR) {\n this.Authentication = true;\n this.Username = registry.Username;\n this.TLS = true;\n }\n\n if ((registry.Type === RegistryTypes.CUSTOM || registry.Type === RegistryTypes.PROGET) && registry.Authentication) {\n this.Authentication = true;\n this.Username = registry.Username;\n }\n}\n\nexport function RegistryCreateFormValues() {\n this.Type = RegistryTypes.CUSTOM;\n this.URL = '';\n this.Name = '';\n this.Authentication = false;\n this.Username = '';\n this.Password = '';\n}\n\nexport function RegistryCreateRequest(model) {\n this.Name = model.Name;\n this.Type = model.Type;\n this.URL = _.replace(model.URL, /^https?\\:\\/\\//i, '');\n this.URL = _.replace(this.URL, /\\/$/, '');\n this.Authentication = model.Authentication;\n if (model.Authentication) {\n this.Username = model.Username;\n this.Password = model.Password;\n }\n if (model.Type === RegistryTypes.GITLAB) {\n this.Gitlab = {\n ProjectId: model.Gitlab.ProjectId,\n InstanceURL: model.Gitlab.InstanceURL,\n ProjectPath: model.Gitlab.ProjectPath,\n };\n }\n if (model.Type === RegistryTypes.ECR) {\n this.Ecr = model.Ecr;\n }\n if (model.Type === RegistryTypes.QUAY) {\n this.Quay = {\n useOrganisation: model.Quay.useOrganisation,\n organisationName: model.Quay.organisationName,\n };\n }\n if (model.Type === RegistryTypes.PROGET) {\n this.BaseURL = _.replace(model.BaseURL, /^https?\\:\\/\\//i, '');\n this.BaseURL = _.replace(this.BaseURL, /\\/$/, '');\n }\n}\n","export const authenticationActivityTypesMap = {\n AuthSuccess: 1,\n AuthFailure: 2,\n Logout: 3,\n};\n\nexport const authenticationActivityTypesLabels = {\n [authenticationActivityTypesMap.AuthSuccess]: 'Authentication success',\n [authenticationActivityTypesMap.AuthFailure]: 'Authentication failure',\n [authenticationActivityTypesMap.Logout]: 'Logout',\n};\n","import _ from 'lodash-es';\nimport { RegistryTypes } from 'Portainer/models/registryTypes';\n\nangular.module('portainer.docker').factory('ImageHelper', ImageHelperFactory);\nfunction ImageHelperFactory() {\n return {\n isValidTag,\n createImageConfigForContainer,\n getImagesNamesForDownload,\n removeDigestFromRepository,\n imageContainsURL,\n };\n\n function isValidTag(tag) {\n return tag.match(/^(?![\\.\\-])([a-zA-Z0-9\\_\\.\\-])+$/g);\n }\n\n function getImagesNamesForDownload(images) {\n var names = images.map(function (image) {\n return image.RepoTags[0] !== '<none>:<none>' ? image.RepoTags[0] : image.Id;\n });\n return {\n names: names,\n };\n }\n\n /**\n *\n * @param {PorImageRegistryModel} registry\n */\n function createImageConfigForContainer(imageModel) {\n return {\n fromImage: buildImageFullURI(imageModel),\n };\n }\n\n function imageContainsURL(image) {\n const split = _.split(image, '/');\n const url = split[0];\n if (split.length > 1) {\n return _.includes(url, '.') || _.includes(url, ':');\n }\n return false;\n }\n\n function removeDigestFromRepository(repository) {\n return repository.split('@sha')[0];\n }\n}\n/**\n * builds the complete uri for an image based on its registry\n * @param {PorImageRegistryModel} imageModel\n */\nexport function buildImageFullURI(imageModel) {\n if (!imageModel.UseRegistry) {\n return ensureTag(imageModel.Image);\n }\n\n const imageName = buildImageFullURIWithRegistry(imageModel);\n\n return ensureTag(imageName);\n\n function ensureTag(image, defaultTag = 'latest') {\n return image.includes(':') ? image : `${image}:${defaultTag}`;\n }\n}\n\nfunction buildImageFullURIWithRegistry(imageModel) {\n switch (imageModel.Registry.Type) {\n case RegistryTypes.GITLAB:\n return buildImageURIForGitLab(imageModel);\n case RegistryTypes.QUAY:\n return buildImageURIForQuay(imageModel);\n case RegistryTypes.ANONYMOUS:\n return imageModel.Image;\n default:\n return buildImageURIForOtherRegistry(imageModel);\n }\n\n function buildImageURIForGitLab(imageModel) {\n const slash = imageModel.Image.startsWith(':') ? '' : '/';\n return `${imageModel.Registry.URL}/${imageModel.Registry.Gitlab.ProjectPath}${slash}${imageModel.Image}`;\n }\n\n function buildImageURIForQuay(imageModel) {\n const name = imageModel.Registry.Quay.UseOrganisation ? imageModel.Registry.Quay.OrganisationName : imageModel.Registry.Username;\n const url = imageModel.Registry.URL ? imageModel.Registry.URL + '/' : '';\n return `${url}${name}/${imageModel.Image}`;\n }\n\n function buildImageURIForOtherRegistry(imageModel) {\n const url = imageModel.Registry.URL ? imageModel.Registry.URL + '/' : '';\n return url + imageModel.Image;\n }\n}\n","export function TeamMembershipModel(data) {\n this.Id = data.Id;\n this.UserId = data.UserID;\n this.TeamId = data.TeamID;\n this.Role = data.Role;\n}\n","export function buildLdapSettingsModel() {\n return {\n AnonymousMode: true,\n ReaderDN: '',\n URLs: [''],\n ServerType: 0,\n TLSConfig: {\n TLS: false,\n TLSSkipVerify: false,\n },\n StartTLS: false,\n SearchSettings: [\n {\n BaseDN: '',\n Filter: '',\n UserNameAttribute: '',\n },\n ],\n GroupSearchSettings: [\n {\n GroupBaseDN: '',\n GroupFilter: '',\n GroupAttribute: '',\n },\n ],\n AdminGroupSearchSettings: [\n {\n GroupBaseDN: '',\n GroupFilter: '',\n GroupAttribute: '',\n },\n ],\n AutoCreateUsers: true,\n };\n}\n\nexport function buildAdSettingsModel() {\n const settings = buildLdapSettingsModel();\n\n settings.ServerType = 2;\n settings.AnonymousMode = false;\n settings.SearchSettings[0].UserNameAttribute = 'sAMAccountName';\n settings.SearchSettings[0].Filter = '(objectClass=user)';\n settings.GroupSearchSettings[0].GroupAttribute = 'member';\n settings.GroupSearchSettings[0].GroupFilter = '(objectClass=group)';\n\n return settings;\n}\n\nexport function buildOpenLDAPSettingsModel() {\n const settings = buildLdapSettingsModel();\n\n settings.ServerType = 1;\n settings.AnonymousMode = false;\n settings.SearchSettings[0].UserNameAttribute = 'uid';\n settings.SearchSettings[0].Filter = '(objectClass=inetOrgPerson)';\n settings.GroupSearchSettings[0].GroupAttribute = 'member';\n settings.GroupSearchSettings[0].GroupFilter = '(objectClass=groupOfNames)';\n\n return settings;\n}\n","import { AccessControlFormData } from 'Portainer/components/accessControlForm/porAccessControlFormModel';\nimport { ResourceControlViewModel } from 'Portainer/models/resourceControl/resourceControl';\n\nexport function ContainerGroupDefaultModel() {\n this.Location = '';\n this.OSType = 'Linux';\n this.Name = '';\n this.Image = '';\n this.AllocatePublicIP = true;\n this.Ports = [\n {\n container: 80,\n host: 80,\n protocol: 'TCP',\n },\n ];\n this.CPU = 1;\n this.Memory = 1;\n this.AccessControlData = new AccessControlFormData();\n}\n\nexport function ContainerGroupViewModel(data) {\n const addressPorts = data.properties.ipAddress ? data.properties.ipAddress.ports : [];\n const container = data.properties.containers.length ? data.properties.containers[0] : {};\n const containerPorts = container ? container.properties.ports : [];\n\n this.Id = data.id;\n this.Name = data.name;\n this.Location = data.location;\n this.IPAddress = data.properties.ipAddress ? data.properties.ipAddress.ip : '';\n this.Ports = addressPorts.length\n ? addressPorts.map((binding, index) => {\n const port = (containerPorts[index] && containerPorts[index].port) || undefined;\n return {\n container: port,\n host: binding.port,\n protocol: binding.protocol,\n };\n })\n : [];\n this.Image = container.properties.image || '';\n this.OSType = data.properties.osType;\n this.AllocatePublicIP = data.properties.ipAddress && data.properties.ipAddress.type === 'Public';\n this.CPU = container.properties.resources.requests.cpu;\n this.Memory = container.properties.resources.requests.memoryInGB;\n\n if (data.Portainer && data.Portainer.ResourceControl) {\n this.ResourceControl = new ResourceControlViewModel(data.Portainer.ResourceControl);\n }\n}\n\nexport function CreateContainerGroupRequest(model) {\n this.location = model.Location;\n\n var containerPorts = [];\n var addressPorts = [];\n for (var i = 0; i < model.Ports.length; i++) {\n var binding = model.Ports[i];\n if (!binding.container || !binding.host) {\n continue;\n }\n\n containerPorts.push({\n port: binding.container,\n });\n\n addressPorts.push({\n port: binding.host,\n protocol: binding.protocol,\n });\n }\n\n this.properties = {\n osType: model.OSType,\n containers: [\n {\n name: model.Name,\n properties: {\n image: model.Image,\n ports: containerPorts,\n resources: {\n requests: {\n cpu: model.CPU,\n memoryInGB: model.Memory,\n },\n },\n },\n },\n ],\n ipAddress: {\n type: model.AllocatePublicIP ? 'Public' : 'Private',\n ports: addressPorts,\n },\n };\n}\n","import _ from 'lodash-es';\n\nclass DockerNetworkHelper {\n static getIPV4Configs(configs) {\n return _.filter(configs, (config) => /^([0-9]{1,3}\\.){3}[0-9]{1,3}(\\/([0-9]|[1-2][0-9]|3[0-2]))?$/.test(config.Subnet));\n }\n\n static getIPV6Configs(configs) {\n return _.without(configs, ...DockerNetworkHelper.getIPV4Configs(configs));\n }\n}\n\nexport default DockerNetworkHelper;\n","import _ from 'lodash-es';\nimport { ResourceControlViewModel } from 'Portainer/models/resourceControl/resourceControl';\n\nexport function createStatus(statusText) {\n var status = _.toLower(statusText);\n\n if (status.indexOf('paused') > -1) {\n return 'paused';\n } else if (status.indexOf('dead') > -1) {\n return 'dead';\n } else if (status.indexOf('created') > -1) {\n return 'created';\n } else if (status.indexOf('exited') > -1) {\n return 'stopped';\n } else if (status.indexOf('(healthy)') > -1) {\n return 'healthy';\n } else if (status.indexOf('(unhealthy)') > -1) {\n return 'unhealthy';\n } else if (status.indexOf('(health: starting)') > -1) {\n return 'starting';\n }\n return 'running';\n}\n\nexport function ContainerViewModel(data) {\n this.Id = data.Id;\n this.Status = createStatus(data.Status);\n this.State = data.State;\n this.Created = data.Created;\n this.Names = data.Names;\n // Unavailable in Docker < 1.10\n if (data.NetworkSettings && !_.isEmpty(data.NetworkSettings.Networks)) {\n this.IP = data.NetworkSettings.Networks[Object.keys(data.NetworkSettings.Networks)[0]].IPAddress;\n }\n this.NetworkSettings = data.NetworkSettings;\n this.Image = data.Image;\n this.ImageID = data.ImageID;\n this.Command = data.Command;\n this.Checked = false;\n this.Labels = data.Labels;\n if (this.Labels && this.Labels['com.docker.compose.project']) {\n this.StackName = this.Labels['com.docker.compose.project'];\n } else if (this.Labels && this.Labels['com.docker.stack.namespace']) {\n this.StackName = this.Labels['com.docker.stack.namespace'];\n }\n this.Mounts = data.Mounts;\n\n this.Ports = [];\n if (data.Ports) {\n for (var i = 0; i < data.Ports.length; ++i) {\n var p = data.Ports[i];\n if (p.PublicPort) {\n this.Ports.push({ host: p.IP, private: p.PrivatePort, public: p.PublicPort });\n }\n }\n }\n\n if (data.Portainer) {\n if (data.Portainer.ResourceControl) {\n this.ResourceControl = new ResourceControlViewModel(data.Portainer.ResourceControl);\n }\n if (data.Portainer.Agent && data.Portainer.Agent.NodeName) {\n this.NodeName = data.Portainer.Agent.NodeName;\n }\n }\n}\n\nexport function ContainerStatsViewModel(data) {\n this.read = data.read;\n this.preread = data.preread;\n if (data.memory_stats.privateworkingset !== undefined) {\n // Windows\n this.MemoryUsage = data.memory_stats.privateworkingset;\n this.MemoryCache = 0;\n this.NumProcs = data.num_procs;\n this.isWindows = true;\n } else {\n // Linux\n if (data.memory_stats.stats === undefined || data.memory_stats.usage === undefined) {\n this.MemoryUsage = this.MemoryCache = 0;\n } else {\n this.MemoryCache = 0;\n if (data.memory_stats.stats.cache !== undefined) {\n // cgroups v1\n this.MemoryCache = data.memory_stats.stats.cache;\n }\n this.MemoryUsage = data.memory_stats.usage - this.MemoryCache;\n }\n }\n this.PreviousCPUTotalUsage = data.precpu_stats.cpu_usage.total_usage;\n this.PreviousCPUSystemUsage = data.precpu_stats.system_cpu_usage;\n this.CurrentCPUTotalUsage = data.cpu_stats.cpu_usage.total_usage;\n this.CurrentCPUSystemUsage = data.cpu_stats.system_cpu_usage;\n this.CPUCores = 1;\n if (data.cpu_stats.cpu_usage.percpu_usage) {\n this.CPUCores = data.cpu_stats.cpu_usage.percpu_usage.length;\n } else {\n if (data.cpu_stats.online_cpus !== undefined) {\n this.CPUCores = data.cpu_stats.online_cpus;\n }\n }\n this.Networks = _.values(data.networks);\n if (data.blkio_stats !== undefined && data.blkio_stats.io_service_bytes_recursive !== null) {\n //TODO: take care of multiple block devices\n var readData = data.blkio_stats.io_service_bytes_recursive.find((d) => d.op === 'Read');\n if (readData === undefined) {\n // try the cgroups v2 version\n readData = data.blkio_stats.io_service_bytes_recursive.find((d) => d.op === 'read');\n }\n if (readData !== undefined) {\n this.BytesRead = readData.value;\n }\n var writeData = data.blkio_stats.io_service_bytes_recursive.find((d) => d.op === 'Write');\n if (writeData === undefined) {\n // try the cgroups v2 version\n writeData = data.blkio_stats.io_service_bytes_recursive.find((d) => d.op === 'write');\n }\n if (writeData !== undefined) {\n this.BytesWrite = writeData.value;\n }\n } else {\n //no IO related data is available\n this.noIOdata = true;\n }\n}\n\nexport function ContainerDetailsViewModel(data) {\n this.Model = data;\n this.Id = data.Id;\n this.State = data.State;\n this.Created = data.Created;\n this.Name = data.Name;\n this.NetworkSettings = data.NetworkSettings;\n this.Args = data.Args;\n this.Image = data.Image;\n this.Config = data.Config;\n this.HostConfig = data.HostConfig;\n this.Mounts = data.Mounts;\n if (data.Portainer && data.Portainer.ResourceControl) {\n this.ResourceControl = new ResourceControlViewModel(data.Portainer.ResourceControl);\n }\n}\n","export function ImageViewModel(data) {\n this.Id = data.Id;\n this.Tag = data.Tag;\n this.Repository = data.Repository;\n this.Created = data.Created;\n this.Checked = false;\n this.RepoTags = data.RepoTags;\n if (!this.RepoTags && data.RepoDigests) {\n this.RepoTags = [];\n for (var i = 0; i < data.RepoDigests.length; i++) {\n var digest = data.RepoDigests[i];\n var repository = digest.substring(0, digest.indexOf('@'));\n this.RepoTags.push(repository + ':<none>');\n }\n }\n\n this.VirtualSize = data.VirtualSize;\n this.ContainerCount = data.ContainerCount;\n\n if (data.Portainer && data.Portainer.Agent && data.Portainer.Agent.NodeName) {\n this.NodeName = data.Portainer.Agent.NodeName;\n }\n this.Labels = data.Labels;\n}\n\nexport function ImageBuildModel(data) {\n this.hasError = false;\n var buildLogs = [];\n\n for (var i = 0; i < data.length; i++) {\n var line = data[i];\n\n if (line.stream) {\n line = line.stream.replace(/[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, '');\n buildLogs.push(line);\n }\n\n if (line.errorDetail) {\n buildLogs.push(line.errorDetail.message);\n this.hasError = true;\n }\n }\n\n this.buildLogs = buildLogs;\n}\n","import _ from 'lodash-es';\n\nexport class KubernetesNodeHelper {\n static isSystemLabel(label) {\n return !label.IsNew && (_.startsWith(label.Key, 'beta.kubernetes.io') || _.startsWith(label.Key, 'kubernetes.io') || label.Key === 'node-role.kubernetes.io/master');\n }\n\n static reorderLabels(labels) {\n return _.sortBy(labels, (label) => {\n return !KubernetesNodeHelper.isSystemLabel(label);\n });\n }\n\n static computeUsedLabels(applications, labels) {\n const pods = _.flatten(_.map(applications, 'Pods'));\n const nodeSelectors = _.uniq(_.flatten(_.map(pods, 'NodeSelector')));\n\n return _.map(labels, (label) => {\n label.IsUsed = _.find(nodeSelectors, (ns) => ns && ns[label.Key] === label.Value) ? true : false;\n return label;\n });\n }\n\n static generateNodeLabelsFromNodes(nodes) {\n const pairs = _.flatMap(nodes, (node) => {\n return _.map(_.toPairs(node.Labels), ([k, v]) => {\n return { key: k, value: v };\n });\n });\n return _.map(_.groupBy(pairs, 'key'), (values, key) => {\n return { Key: key, Values: _.uniq(_.map(values, 'value')) };\n });\n }\n}\n","export function EndpointGroupDefaultModel() {\n this.Name = '';\n this.Description = '';\n this.TagIds = [];\n}\n\nexport function EndpointGroupModel(data) {\n this.Id = data.Id;\n this.Name = data.Name;\n this.Description = data.Description;\n this.TagIds = data.TagIds;\n this.AuthorizedUsers = data.AuthorizedUsers;\n this.AuthorizedTeams = data.AuthorizedTeams;\n this.UserAccessPolicies = data.UserAccessPolicies;\n this.TeamAccessPolicies = data.TeamAccessPolicies;\n}\n\nexport function EndpointGroupCreateRequest(model, endpoints) {\n this.Name = model.Name;\n this.Description = model.Description;\n this.TagIds = model.TagIds;\n this.AssociatedEndpoints = endpoints;\n}\n\nexport function EndpointGroupUpdateRequest(model, endpoints) {\n this.id = model.Id;\n this.Name = model.Name;\n this.Description = model.Description;\n this.TagIds = model.TagIds;\n this.AssociatedEndpoints = endpoints;\n this.UserAccessPolicies = model.UserAccessPolicies;\n this.TeamAccessPolicies = model.TeamAccessPolicies;\n}\n","export function KubernetesPodNodeAffinityPayload() {\n return {\n requiredDuringSchedulingIgnoredDuringExecution: {\n nodeSelectorTerms: [], // []KubernetesNodeSelectorTermPayload\n },\n preferredDuringSchedulingIgnoredDuringExecution: [], // []KubernetesPreferredSchedulingTermPayload\n };\n}\n\nexport function KubernetesPreferredSchedulingTermPayload() {\n return {\n weight: 1,\n preference: {}, // KubernetesNodeSelectorTermPayload\n };\n}\n\nexport function KubernetesNodeSelectorTermPayload() {\n return {\n matchExpressions: [], // []KubernetesNodeSelectorRequirementPayload\n };\n}\n\nexport function KubernetesNodeSelectorRequirementPayload() {\n return {\n key: '', // string\n operator: '', // KubernetesPodNodeAffinityNodeSelectorRequirementOperators\n values: [], // []string\n };\n}\n","// singleton pattern as:\n// * we don't want to use AngularJS DI to fetch the single instance\n// * we need to use the Store in static functions / non-instanciated classes\nconst storeNamespaces = {};\n\n/**\n * Check if a namespace of the store is system or not\n * @param {String} name Namespace name\n * @returns Boolean\n */\nexport function isSystem(name) {\n return storeNamespaces[name] && storeNamespaces[name].IsSystem;\n}\n\n/**\n * Called from KubernetesNamespaceService.get()\n * @param {KubernetesNamespace[]} namespaces list of namespaces to update in Store\n */\nexport function updateNamespaces(namespaces) {\n namespaces.forEach((ns) => (storeNamespaces[ns.Name] = ns));\n}\n","import * as JsonPatch from 'fast-json-patch';\nimport { KubernetesDeployment } from 'Kubernetes/models/deployment/models';\nimport { KubernetesDeploymentCreatePayload } from 'Kubernetes/models/deployment/payloads';\nimport {\n KubernetesPortainerApplicationStackNameLabel,\n KubernetesPortainerApplicationNameLabel,\n KubernetesPortainerApplicationOwnerLabel,\n KubernetesPortainerApplicationNote,\n} from 'Kubernetes/models/application/models';\n\nimport KubernetesApplicationHelper from 'Kubernetes/helpers/application';\nimport KubernetesResourceReservationHelper from 'Kubernetes/helpers/resourceReservationHelper';\nimport KubernetesCommonHelper from 'Kubernetes/helpers/commonHelper';\nimport { buildImageFullURI } from 'Docker/helpers/imageHelper';\n\nclass KubernetesDeploymentConverter {\n /**\n * Generate KubernetesDeployment from KubernetesApplicationFormValues\n * @param {KubernetesApplicationFormValues} formValues\n */\n static applicationFormValuesToDeployment(formValues, volumeClaims) {\n const res = new KubernetesDeployment();\n res.Namespace = formValues.ResourcePool.Namespace.Name;\n res.Name = formValues.Name;\n res.StackName = formValues.StackName ? formValues.StackName : formValues.Name;\n res.ApplicationOwner = formValues.ApplicationOwner;\n res.ApplicationName = formValues.Name;\n res.ReplicaCount = formValues.ReplicaCount;\n res.ImageModel = formValues.ImageModel;\n res.CpuLimit = formValues.CpuLimit;\n res.MemoryLimit = KubernetesResourceReservationHelper.bytesValue(formValues.MemoryLimit);\n res.Env = KubernetesApplicationHelper.generateEnvFromEnvVariables(formValues.EnvironmentVariables);\n res.Containers = formValues.Containers;\n KubernetesApplicationHelper.generateVolumesFromPersistentVolumClaims(res, volumeClaims);\n KubernetesApplicationHelper.generateEnvOrVolumesFromConfigurations(res, formValues.Configurations);\n KubernetesApplicationHelper.generateAffinityFromPlacements(res, formValues);\n return res;\n }\n\n /**\n * Generate CREATE payload from Deployment\n * @param {KubernetesDeploymentPayload} model Deployment to genereate payload from\n */\n static createPayload(deployment) {\n const payload = new KubernetesDeploymentCreatePayload();\n payload.metadata.name = deployment.Name;\n payload.metadata.namespace = deployment.Namespace;\n payload.metadata.labels[KubernetesPortainerApplicationStackNameLabel] = deployment.StackName;\n payload.metadata.labels[KubernetesPortainerApplicationNameLabel] = deployment.ApplicationName;\n payload.metadata.labels[KubernetesPortainerApplicationOwnerLabel] = deployment.ApplicationOwner;\n payload.metadata.annotations[KubernetesPortainerApplicationNote] = deployment.Note;\n payload.spec.replicas = deployment.ReplicaCount;\n payload.spec.selector.matchLabels.app = deployment.Name;\n payload.spec.template.metadata.labels.app = deployment.Name;\n payload.spec.template.metadata.labels[KubernetesPortainerApplicationNameLabel] = deployment.ApplicationName;\n payload.spec.template.spec.containers[0].name = deployment.Name;\n\n if (deployment.ImageModel) {\n payload.spec.template.spec.containers[0].image = buildImageFullURI(deployment.ImageModel);\n\n if (deployment.ImageModel.Registry && deployment.ImageModel.Registry.Authentication) {\n payload.spec.template.spec.imagePullSecrets = [{ name: `registry-${deployment.ImageModel.Registry.Id}` }];\n }\n }\n\n payload.spec.template.spec.affinity = deployment.Affinity;\n KubernetesCommonHelper.assignOrDeleteIfEmpty(payload, 'spec.template.spec.containers[0].env', deployment.Env);\n KubernetesCommonHelper.assignOrDeleteIfEmpty(payload, 'spec.template.spec.containers[0].volumeMounts', deployment.VolumeMounts);\n KubernetesCommonHelper.assignOrDeleteIfEmpty(payload, 'spec.template.spec.volumes', deployment.Volumes);\n if (deployment.MemoryLimit) {\n payload.spec.template.spec.containers[0].resources.limits.memory = deployment.MemoryLimit;\n payload.spec.template.spec.containers[0].resources.requests.memory = deployment.MemoryLimit;\n }\n if (deployment.CpuLimit) {\n payload.spec.template.spec.containers[0].resources.limits.cpu = deployment.CpuLimit;\n payload.spec.template.spec.containers[0].resources.requests.cpu = deployment.CpuLimit;\n }\n if (!deployment.CpuLimit && !deployment.MemoryLimit) {\n delete payload.spec.template.spec.containers[0].resources;\n }\n return payload;\n }\n\n static patchPayload(oldDeployment, newDeployment) {\n const oldPayload = KubernetesDeploymentConverter.createPayload(oldDeployment);\n const newPayload = KubernetesDeploymentConverter.createPayload(newDeployment);\n const payload = JsonPatch.compare(oldPayload, newPayload);\n return payload;\n }\n}\n\nexport default KubernetesDeploymentConverter;\n","import * as JsonPatch from 'fast-json-patch';\nimport { KubernetesDaemonSet } from 'Kubernetes/models/daemon-set/models';\nimport { KubernetesDaemonSetCreatePayload } from 'Kubernetes/models/daemon-set/payloads';\nimport {\n KubernetesPortainerApplicationStackNameLabel,\n KubernetesPortainerApplicationNameLabel,\n KubernetesPortainerApplicationNote,\n KubernetesPortainerApplicationOwnerLabel,\n} from 'Kubernetes/models/application/models';\nimport KubernetesApplicationHelper from 'Kubernetes/helpers/application';\nimport KubernetesResourceReservationHelper from 'Kubernetes/helpers/resourceReservationHelper';\nimport KubernetesCommonHelper from 'Kubernetes/helpers/commonHelper';\nimport { buildImageFullURI } from 'Docker/helpers/imageHelper';\n\nclass KubernetesDaemonSetConverter {\n /**\n * Generate KubernetesDaemonSet from KubernetesApplicationFormValues\n * @param {KubernetesApplicationFormValues} formValues\n */\n static applicationFormValuesToDaemonSet(formValues, volumeClaims) {\n const res = new KubernetesDaemonSet();\n res.Namespace = formValues.ResourcePool.Namespace.Name;\n res.Name = formValues.Name;\n res.StackName = formValues.StackName ? formValues.StackName : formValues.Name;\n res.ApplicationOwner = formValues.ApplicationOwner;\n res.ApplicationName = formValues.Name;\n res.ImageModel = formValues.ImageModel;\n res.CpuLimit = formValues.CpuLimit;\n res.MemoryLimit = KubernetesResourceReservationHelper.bytesValue(formValues.MemoryLimit);\n res.Env = KubernetesApplicationHelper.generateEnvFromEnvVariables(formValues.EnvironmentVariables);\n KubernetesApplicationHelper.generateVolumesFromPersistentVolumClaims(res, volumeClaims);\n KubernetesApplicationHelper.generateEnvOrVolumesFromConfigurations(res, formValues.Configurations);\n KubernetesApplicationHelper.generateAffinityFromPlacements(res, formValues);\n return res;\n }\n\n /**\n * Generate CREATE payload from DaemonSet\n * @param {KubernetesDaemonSetPayload} model DaemonSet to generate payload from\n */\n static createPayload(daemonSet) {\n const payload = new KubernetesDaemonSetCreatePayload();\n payload.metadata.name = daemonSet.Name;\n payload.metadata.namespace = daemonSet.Namespace;\n payload.metadata.labels[KubernetesPortainerApplicationStackNameLabel] = daemonSet.StackName;\n payload.metadata.labels[KubernetesPortainerApplicationNameLabel] = daemonSet.ApplicationName;\n payload.metadata.labels[KubernetesPortainerApplicationOwnerLabel] = daemonSet.ApplicationOwner;\n payload.metadata.annotations[KubernetesPortainerApplicationNote] = daemonSet.Note;\n payload.spec.replicas = daemonSet.ReplicaCount;\n payload.spec.selector.matchLabels.app = daemonSet.Name;\n payload.spec.template.metadata.labels.app = daemonSet.Name;\n payload.spec.template.metadata.labels[KubernetesPortainerApplicationNameLabel] = daemonSet.ApplicationName;\n payload.spec.template.spec.containers[0].name = daemonSet.Name;\n payload.spec.template.spec.containers[0].image = buildImageFullURI(daemonSet.ImageModel);\n if (daemonSet.ImageModel.Registry && daemonSet.ImageModel.Registry.Authentication) {\n payload.spec.template.spec.imagePullSecrets = [{ name: `registry-${daemonSet.ImageModel.Registry.Id}` }];\n }\n payload.spec.template.spec.affinity = daemonSet.Affinity;\n KubernetesCommonHelper.assignOrDeleteIfEmpty(payload, 'spec.template.spec.containers[0].env', daemonSet.Env);\n KubernetesCommonHelper.assignOrDeleteIfEmpty(payload, 'spec.template.spec.containers[0].volumeMounts', daemonSet.VolumeMounts);\n KubernetesCommonHelper.assignOrDeleteIfEmpty(payload, 'spec.template.spec.volumes', daemonSet.Volumes);\n if (daemonSet.MemoryLimit) {\n payload.spec.template.spec.containers[0].resources.limits.memory = daemonSet.MemoryLimit;\n payload.spec.template.spec.containers[0].resources.requests.memory = daemonSet.MemoryLimit;\n }\n if (daemonSet.CpuLimit) {\n payload.spec.template.spec.containers[0].resources.limits.cpu = daemonSet.CpuLimit;\n payload.spec.template.spec.containers[0].resources.requests.cpu = daemonSet.CpuLimit;\n }\n if (!daemonSet.CpuLimit && !daemonSet.MemoryLimit) {\n delete payload.spec.template.spec.containers[0].resources;\n }\n return payload;\n }\n\n static patchPayload(oldDaemonSet, newDaemonSet) {\n const oldPayload = KubernetesDaemonSetConverter.createPayload(oldDaemonSet);\n const newPayload = KubernetesDaemonSetConverter.createPayload(newDaemonSet);\n const payload = JsonPatch.compare(oldPayload, newPayload);\n return payload;\n }\n}\n\nexport default KubernetesDaemonSetConverter;\n","import _ from 'lodash-es';\nimport * as JsonPatch from 'fast-json-patch';\n\nimport { KubernetesStatefulSet } from 'Kubernetes/models/stateful-set/models';\nimport { KubernetesStatefulSetCreatePayload } from 'Kubernetes/models/stateful-set/payloads';\nimport {\n KubernetesPortainerApplicationStackNameLabel,\n KubernetesPortainerApplicationNameLabel,\n KubernetesPortainerApplicationOwnerLabel,\n KubernetesPortainerApplicationNote,\n} from 'Kubernetes/models/application/models';\nimport KubernetesApplicationHelper from 'Kubernetes/helpers/application';\nimport KubernetesResourceReservationHelper from 'Kubernetes/helpers/resourceReservationHelper';\nimport KubernetesCommonHelper from 'Kubernetes/helpers/commonHelper';\nimport { buildImageFullURI } from 'Docker/helpers/imageHelper';\nimport KubernetesPersistentVolumeClaimConverter from './persistentVolumeClaim';\n\nclass KubernetesStatefulSetConverter {\n /**\n * Generate KubernetesStatefulSet from KubernetesApplicationFormValues\n * @param {KubernetesApplicationFormValues} formValues\n */\n static applicationFormValuesToStatefulSet(formValues, volumeClaims) {\n const res = new KubernetesStatefulSet();\n res.Namespace = formValues.ResourcePool.Namespace.Name;\n res.Name = formValues.Name;\n res.StackName = formValues.StackName ? formValues.StackName : formValues.Name;\n res.ApplicationOwner = formValues.ApplicationOwner;\n res.ApplicationName = formValues.Name;\n res.ReplicaCount = formValues.ReplicaCount;\n res.ImageModel = formValues.ImageModel;\n res.CpuLimit = formValues.CpuLimit;\n res.MemoryLimit = KubernetesResourceReservationHelper.bytesValue(formValues.MemoryLimit);\n res.Env = KubernetesApplicationHelper.generateEnvFromEnvVariables(formValues.EnvironmentVariables);\n KubernetesApplicationHelper.generateVolumesFromPersistentVolumClaims(res, volumeClaims);\n KubernetesApplicationHelper.generateEnvOrVolumesFromConfigurations(res, formValues.Configurations);\n KubernetesApplicationHelper.generateAffinityFromPlacements(res, formValues);\n return res;\n }\n\n /**\n * Generate CREATE payload from StatefulSet\n * @param {KubernetesStatefulSetPayload} model StatefulSet to genereate payload from\n */\n static createPayload(statefulSet) {\n const payload = new KubernetesStatefulSetCreatePayload();\n payload.metadata.name = statefulSet.Name;\n payload.metadata.namespace = statefulSet.Namespace;\n payload.metadata.labels[KubernetesPortainerApplicationStackNameLabel] = statefulSet.StackName;\n payload.metadata.labels[KubernetesPortainerApplicationNameLabel] = statefulSet.ApplicationName;\n payload.metadata.labels[KubernetesPortainerApplicationOwnerLabel] = statefulSet.ApplicationOwner;\n payload.metadata.annotations[KubernetesPortainerApplicationNote] = statefulSet.Note;\n payload.spec.replicas = statefulSet.ReplicaCount;\n payload.spec.serviceName = statefulSet.ServiceName;\n payload.spec.selector.matchLabels.app = statefulSet.Name;\n payload.spec.volumeClaimTemplates = _.map(statefulSet.VolumeClaims, (item) => KubernetesPersistentVolumeClaimConverter.createPayload(item));\n payload.spec.template.metadata.labels.app = statefulSet.Name;\n payload.spec.template.metadata.labels[KubernetesPortainerApplicationNameLabel] = statefulSet.ApplicationName;\n payload.spec.template.spec.containers[0].name = statefulSet.Name;\n if (statefulSet.ImageModel.Image) {\n payload.spec.template.spec.containers[0].image = buildImageFullURI(statefulSet.ImageModel);\n if (statefulSet.ImageModel.Registry && statefulSet.ImageModel.Registry.Authentication) {\n payload.spec.template.spec.imagePullSecrets = [{ name: `registry-${statefulSet.ImageModel.Registry.Id}` }];\n }\n }\n payload.spec.template.spec.affinity = statefulSet.Affinity;\n KubernetesCommonHelper.assignOrDeleteIfEmpty(payload, 'spec.template.spec.containers[0].env', statefulSet.Env);\n KubernetesCommonHelper.assignOrDeleteIfEmpty(payload, 'spec.template.spec.containers[0].volumeMounts', statefulSet.VolumeMounts);\n KubernetesCommonHelper.assignOrDeleteIfEmpty(payload, 'spec.template.spec.volumes', statefulSet.Volumes);\n if (statefulSet.MemoryLimit) {\n payload.spec.template.spec.containers[0].resources.limits.memory = statefulSet.MemoryLimit;\n payload.spec.template.spec.containers[0].resources.requests.memory = statefulSet.MemoryLimit;\n }\n if (statefulSet.CpuLimit) {\n payload.spec.template.spec.containers[0].resources.limits.cpu = statefulSet.CpuLimit;\n payload.spec.template.spec.containers[0].resources.requests.cpu = statefulSet.CpuLimit;\n }\n if (!statefulSet.CpuLimit && !statefulSet.MemoryLimit) {\n delete payload.spec.template.spec.containers[0].resources;\n }\n return payload;\n }\n\n static patchPayload(oldSFS, newSFS) {\n const oldPayload = KubernetesStatefulSetConverter.createPayload(oldSFS);\n const newPayload = KubernetesStatefulSetConverter.createPayload(newSFS);\n const payload = JsonPatch.compare(oldPayload, newPayload);\n return payload;\n }\n}\n\nexport default KubernetesStatefulSetConverter;\n","import uuidv4 from 'uuid/v4';\n/**\n * KubernetesPersistentVolumeClaim Model\n */\nconst _KubernetesPersistentVolumeClaim = Object.freeze({\n Id: '',\n Name: '',\n PreviousName: '',\n Namespace: '',\n Storage: 0,\n StorageClass: {}, // KubernetesStorageClass\n CreationDate: '',\n ApplicationOwner: '',\n ApplicationName: '',\n MountPath: '', // used for Application creation from ApplicationFormValues | not used from API conversion\n Yaml: '',\n});\n\nexport class KubernetesPersistentVolumeClaim {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesPersistentVolumeClaim)));\n this.Name = uuidv4();\n }\n}\n\n/**\n * KubernetesVolume Model (Composite)\n */\nconst _KubernetesVolume = Object.freeze({\n ResourcePool: {}, // KubernetesResourcePool\n PersistentVolumeClaim: {}, // KubernetesPersistentVolumeClaim\n Applications: [], // KubernetesApplication\n});\n\nexport class KubernetesVolume {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesVolume)));\n }\n}\n","import _ from 'lodash-es';\nimport { KubernetesServiceHeadlessPrefix } from 'Kubernetes/models/service/models';\n\nclass KubernetesServiceHelper {\n static generateHeadlessServiceName(name) {\n return KubernetesServiceHeadlessPrefix + name;\n }\n\n static findApplicationBoundService(services, rawApp) {\n if (!rawApp.spec.template) {\n return undefined;\n }\n return _.find(services, (item) => item.spec.selector && _.isMatch(rawApp.spec.template.metadata.labels, item.spec.selector));\n }\n}\nexport default KubernetesServiceHelper;\n","/**\n * clears the sessionStorage\n */\nexport function clear() {\n sessionStorage.clear();\n}\n\n/**\n * stores `value` as string in `sessionStorage[key]`\n *\n * @param {string} key the key to store value at\n * @param {any} value the value to store - will be stringified using JSON.stringify\n *\n */\nexport function save(key, value) {\n sessionStorage.setItem(key, JSON.stringify(value));\n}\n\n/**\n * get parses the value stored in sessionStorage[key], if it's not available returns undefined\n *\n * @param {string} key\n */\nexport function get(key) {\n try {\n const value = sessionStorage.getItem(key);\n return JSON.parse(value);\n } catch (e) {\n return;\n }\n}\n","export default function AccessViewerPolicyModel(policy, endpoint, roles, group, team) {\n this.EndpointId = endpoint.Id;\n this.EndpointName = endpoint.Name;\n this.RoleId = policy.RoleId;\n this.RoleName = roles[policy.RoleId].Name;\n this.RolePriority = roles[policy.RoleId].Priority;\n if (group) {\n this.GroupId = group.Id;\n this.GroupName = group.Name;\n }\n if (team) {\n this.TeamId = team.Id;\n this.TeamName = team.Name;\n }\n this.AccessLocation = group ? 'environment group' : 'environment';\n}\n","export const authenticationMethodTypesMap = {\n INTERNAL: 1,\n LDAP: 2,\n OAUTH: 3,\n};\n\nexport const authenticationMethodTypesLabels = {\n [authenticationMethodTypesMap.INTERNAL]: 'Internal',\n [authenticationMethodTypesMap.LDAP]: 'LDAP',\n [authenticationMethodTypesMap.OAUTH]: 'OAuth',\n};\n","var capDesc = {\n SETPCAP: 'Modify process capabilities.',\n MKNOD: 'Create special files using mknod(2).',\n AUDIT_WRITE: 'Write records to kernel auditing log.',\n CHOWN: 'Make arbitrary changes to file UIDs and GIDs (see chown(2)).',\n NET_RAW: 'Use RAW and PACKET sockets.',\n DAC_OVERRIDE: 'Bypass file read, write, and execute permission checks.',\n FOWNER: 'Bypass permission checks on operations that normally require the file system UID of the process to match the UID of the file.',\n FSETID: 'Don’t clear set-user-ID and set-group-ID permission bits when a file is modified.',\n KILL: 'Bypass permission checks for sending signals.',\n SETGID: 'Make arbitrary manipulations of process GIDs and supplementary GID list.',\n SETUID: 'Make arbitrary manipulations of process UIDs.',\n NET_BIND_SERVICE: 'Bind a socket to internet domain privileged ports (port numbers less than 1024).',\n SYS_CHROOT: 'Use chroot(2), change root directory.',\n SETFCAP: 'Set file capabilities.',\n SYS_MODULE: 'Load and unload kernel modules.',\n SYS_RAWIO: 'Perform I/O port operations (iopl(2) and ioperm(2)).',\n SYS_PACCT: 'Use acct(2), switch process accounting on or off.',\n SYS_ADMIN: 'Perform a range of system administration operations.',\n SYS_NICE: 'Raise process nice value (nice(2), setpriority(2)) and change the nice value for arbitrary processes.',\n SYS_RESOURCE: 'Override resource Limits.',\n SYS_TIME: 'Set system clock (settimeofday(2), stime(2), adjtimex(2)); set real-time (hardware) clock.',\n SYS_TTY_CONFIG: 'Use vhangup(2); employ various privileged ioctl(2) operations on virtual terminals.',\n AUDIT_CONTROL: 'Enable and disable kernel auditing; change auditing filter rules; retrieve auditing status and filtering rules.',\n MAC_ADMIN: 'Allow MAC configuration or state changes. Implemented for the Smack LSM.',\n MAC_OVERRIDE: 'Override Mandatory Access Control (MAC). Implemented for the Smack Linux Security Module (LSM).',\n NET_ADMIN: 'Perform various network-related operations.',\n SYSLOG: 'Perform privileged syslog(2) operations.',\n DAC_READ_SEARCH: 'Bypass file read permission checks and directory read and execute permission checks.',\n LINUX_IMMUTABLE: 'Set the FS_APPEND_FL and FS_IMMUTABLE_FL i-node flags.',\n NET_BROADCAST: 'Make socket broadcasts, and listen to multicasts.',\n IPC_LOCK: 'Lock memory (mlock(2), mlockall(2), mmap(2), shmctl(2)).',\n IPC_OWNER: 'Bypass permission checks for operations on System V IPC objects.',\n SYS_PTRACE: 'Trace arbitrary processes using ptrace(2).',\n SYS_BOOT: 'Use reboot(2) and kexec_load(2), reboot and load a new kernel for later execution.',\n LEASE: 'Establish leases on arbitrary files (see fcntl(2)).',\n WAKE_ALARM: 'Trigger something that will wake up the system.',\n BLOCK_SUSPEND: 'Employ features that can block system suspend.',\n};\n\nexport function ContainerCapabilities() {\n // all capabilities can be found at https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities\n return [\n new ContainerCapability('SETPCAP', true),\n new ContainerCapability('MKNOD', true),\n new ContainerCapability('AUDIT_WRITE', true),\n new ContainerCapability('CHOWN', true),\n new ContainerCapability('NET_RAW', true),\n new ContainerCapability('DAC_OVERRIDE', true),\n new ContainerCapability('FOWNER', true),\n new ContainerCapability('FSETID', true),\n new ContainerCapability('KILL', true),\n new ContainerCapability('SETGID', true),\n new ContainerCapability('SETUID', true),\n new ContainerCapability('NET_BIND_SERVICE', true),\n new ContainerCapability('SYS_CHROOT', true),\n new ContainerCapability('SETFCAP', true),\n new ContainerCapability('SYS_MODULE', false),\n new ContainerCapability('SYS_RAWIO', false),\n new ContainerCapability('SYS_PACCT', false),\n new ContainerCapability('SYS_ADMIN', false),\n new ContainerCapability('SYS_NICE', false),\n new ContainerCapability('SYS_RESOURCE', false),\n new ContainerCapability('SYS_TIME', false),\n new ContainerCapability('SYS_TTY_CONFIG', false),\n new ContainerCapability('AUDIT_CONTROL', false),\n new ContainerCapability('MAC_ADMIN', false),\n new ContainerCapability('MAC_OVERRIDE', false),\n new ContainerCapability('NET_ADMIN', false),\n new ContainerCapability('SYSLOG', false),\n new ContainerCapability('DAC_READ_SEARCH', false),\n new ContainerCapability('LINUX_IMMUTABLE', false),\n new ContainerCapability('NET_BROADCAST', false),\n new ContainerCapability('IPC_LOCK', false),\n new ContainerCapability('IPC_OWNER', false),\n new ContainerCapability('SYS_PTRACE', false),\n new ContainerCapability('SYS_BOOT', false),\n new ContainerCapability('LEASE', false),\n new ContainerCapability('WAKE_ALARM', false),\n new ContainerCapability('BLOCK_SUSPEND', false),\n ].sort(function (a, b) {\n return a.capability < b.capability ? -1 : 1;\n });\n}\n\nexport function ContainerCapability(cap, allowed) {\n this.capability = cap;\n this.allowed = allowed;\n this.description = capDesc[cap];\n}\n","/**\n * Transcient type from view data to payload\n * @param {bool} adminOnly is ResourceControl restricted to admin only\n * @param {bool} publicOnly is ResourceControl exposed to public\n * @param {[]int} users Authorized UserIDs array\n * @param {[]int} teams Authorized TeamIDs array\n * @param {[]int} subResources subResourceIDs array\n */\nexport function ResourceControlOwnershipParameters(adminOnly = false, publicOnly = false, users = [], teams = [], subResources = []) {\n this.AdministratorsOnly = adminOnly;\n this.Public = publicOnly;\n this.Users = users;\n this.Teams = teams;\n this.SubResourceIDs = subResources;\n}\n","// The get action of the Browse service returns a file.\n// ngResource will transform it as an array of chars.\n// This functions simply creates a response object and assign\n// the data to a field.\nexport function browseGetResponse(data) {\n const response = {};\n response.file = data;\n return response;\n}\n","import _ from 'lodash-es';\nimport { KubernetesStack } from 'Kubernetes/models/stack/models';\n\nclass KubernetesStackHelper {\n static stacksFromApplications(applications) {\n const res = _.reduce(\n applications,\n (acc, app) => {\n if (app.StackName) {\n let stack = _.find(acc, { Name: app.StackName, ResourcePool: app.ResourcePool });\n if (!stack) {\n stack = new KubernetesStack();\n stack.Name = app.StackName;\n stack.ResourcePool = app.ResourcePool;\n acc.push(stack);\n }\n stack.Applications.push(app);\n }\n return acc;\n },\n []\n );\n return res;\n }\n}\nexport default KubernetesStackHelper;\n","import _ from 'lodash-es';\n\n/**\n *\n * @param {any[]} promises\n */\nexport default async function $allSettled(promises) {\n const res = {\n fulfilled: [],\n rejected: [],\n };\n const data = await Promise.allSettled(promises);\n res.fulfilled = _.reduce(\n data,\n (acc, item) => {\n if (item.status === 'fulfilled') {\n acc.push(item.value);\n }\n return acc;\n },\n []\n );\n res.rejected = _.reduce(\n data,\n (acc, item) => {\n if (item.status === 'rejected') {\n acc.push(item.reason);\n }\n return acc;\n },\n []\n );\n return res;\n}\n","import _ from 'lodash';\n\nexport default class PortainerEndpointTagHelper {\n static idsToTagNames(tags, ids) {\n const filteredTags = _.filter(tags, (tag) => _.includes(ids, tag.Id));\n const tagNames = _.map(filteredTags, 'Name');\n return tagNames;\n }\n}\n","import { ResourceControlViewModel } from 'Portainer/models/resourceControl/resourceControl';\n\nexport function VolumeViewModel(data) {\n this.Id = data.Name;\n this.CreatedAt = data.CreatedAt;\n this.Driver = data.Driver;\n this.Options = data.Options;\n this.Labels = data.Labels;\n if (this.Labels && this.Labels['com.docker.compose.project']) {\n this.StackName = this.Labels['com.docker.compose.project'];\n } else if (this.Labels && this.Labels['com.docker.stack.namespace']) {\n this.StackName = this.Labels['com.docker.stack.namespace'];\n }\n this.Mountpoint = data.Mountpoint;\n\n this.ResourceId = data.ResourceID;\n\n if (data.Portainer) {\n if (data.Portainer.ResourceControl) {\n this.ResourceControl = new ResourceControlViewModel(data.Portainer.ResourceControl);\n }\n if (data.Portainer.Agent && data.Portainer.Agent.NodeName) {\n this.NodeName = data.Portainer.Agent.NodeName;\n }\n }\n}\n","export function ScheduleCreateRequest(model) {\n this.Name = model.Name;\n this.Recurring = model.Recurring;\n this.CronExpression = model.CronExpression;\n this.Endpoints = model.Endpoints;\n this.FileContent = model.FileContent;\n this.File = model.File;\n}\n\nexport function ScheduleUpdateRequest(model) {\n this.id = model.Id;\n this.Name = model.Name;\n this.Recurring = model.Recurring;\n this.CronExpression = model.CronExpression;\n this.Endpoints = model.Endpoints;\n this.FileContent = model.FileContent;\n}\n","import { KubernetesCommonMetadataPayload } from 'Kubernetes/models/common/payloads';\n\n/**\n * Payload for CREATE\n */\nconst _KubernetesConfigMapCreatePayload = Object.freeze({\n metadata: new KubernetesCommonMetadataPayload(),\n data: {},\n binaryData: {},\n});\nexport class KubernetesConfigMapCreatePayload {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesConfigMapCreatePayload)));\n }\n}\n\n/**\n * Payload for UPDATE\n */\nconst _KubernetesConfigMapUpdatePayload = Object.freeze({\n metadata: new KubernetesCommonMetadataPayload(),\n data: {},\n binaryData: {},\n});\nexport class KubernetesConfigMapUpdatePayload {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesConfigMapUpdatePayload)));\n }\n}\n","import _ from 'lodash-es';\nimport { KubernetesNamespace } from 'Kubernetes/models/namespace/models';\nimport { KubernetesNamespaceCreatePayload } from 'Kubernetes/models/namespace/payloads';\nimport {\n KubernetesPortainerResourcePoolNameLabel,\n KubernetesPortainerResourcePoolOwnerLabel,\n KubernetesPortainerNamespaceSystemLabel,\n} from 'Kubernetes/models/resource-pool/models';\nimport KubernetesNamespaceHelper from 'Kubernetes/helpers/namespaceHelper';\n\nexport default class KubernetesNamespaceConverter {\n static apiToNamespace(data, yaml) {\n const res = new KubernetesNamespace();\n res.Id = data.metadata.uid;\n res.Name = data.metadata.name;\n res.CreationDate = data.metadata.creationTimestamp;\n res.Status = data.status.phase;\n res.Yaml = yaml ? yaml.data : '';\n res.ResourcePoolName = data.metadata.labels ? data.metadata.labels[KubernetesPortainerResourcePoolNameLabel] : '';\n res.ResourcePoolOwner = data.metadata.labels ? data.metadata.labels[KubernetesPortainerResourcePoolOwnerLabel] : '';\n\n res.IsSystem = KubernetesNamespaceHelper.isDefaultSystemNamespace(data.metadata.name);\n if (data.metadata.labels) {\n const systemLabel = data.metadata.labels[KubernetesPortainerNamespaceSystemLabel];\n if (!_.isEmpty(systemLabel)) {\n res.IsSystem = systemLabel === 'true';\n }\n }\n return res;\n }\n\n static createPayload(namespace) {\n const res = new KubernetesNamespaceCreatePayload();\n res.metadata.name = namespace.Name;\n res.metadata.labels[KubernetesPortainerResourcePoolNameLabel] = namespace.ResourcePoolName;\n\n if (namespace.ResourcePoolOwner) {\n const resourcePoolOwner = _.truncate(namespace.ResourcePoolOwner, { length: 63, omission: '' });\n res.metadata.labels[KubernetesPortainerResourcePoolOwnerLabel] = resourcePoolOwner;\n }\n return res;\n }\n}\n","import { KubernetesCommonMetadataPayload } from 'Kubernetes/models/common/payloads';\n\nexport function KubernetesIngressCreatePayload() {\n return {\n metadata: new KubernetesCommonMetadataPayload(),\n spec: {\n rules: [],\n },\n };\n}\n\nexport function KubernetesIngressRuleCreatePayload() {\n return {\n host: '',\n http: {\n paths: [],\n },\n };\n}\n\nexport function KubernetesIngressRulePathCreatePayload() {\n return {\n path: '',\n pathType: 'ImplementationSpecific',\n backend: {\n service: {\n name: '',\n port: {\n number: 0,\n },\n },\n },\n };\n}\n","export const KubernetesEndpointAnnotationLeader = 'control-plane.alpha.kubernetes.io/leader';\n\n/**\n * KubernetesEndpoint Model\n */\nconst _KubernetesEndpoint = Object.freeze({\n Id: '',\n Name: '',\n Namespace: '',\n HolderIdentity: '',\n Subsets: [],\n});\n\nexport class KubernetesEndpoint {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesEndpoint)));\n }\n}\n\nconst _KubernetesEndpointSubset = Object.freeze({\n Ips: [],\n Port: 0,\n});\n\nexport class KubernetesEndpointSubset {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesEndpointSubset)));\n }\n}\n","import _ from 'lodash-es';\n\nimport { KubernetesPortainerConfigMapAccessKey } from 'Kubernetes/models/config-map/models';\nimport { UserAccessViewModel, TeamAccessViewModel } from 'Portainer/models/access';\n\nclass KubernetesConfigMapHelper {\n static parseJSONData(configMap) {\n _.forIn(configMap.Data, (value, key) => {\n try {\n configMap.Data[key] = JSON.parse(value);\n } catch (err) {\n configMap.Data[key] = value;\n }\n });\n return configMap;\n }\n\n static modifiyNamespaceAccesses(configMap, namespace, accesses) {\n configMap.Data[KubernetesPortainerConfigMapAccessKey][namespace] = {\n UserAccessPolicies: {},\n TeamAccessPolicies: {},\n };\n _.forEach(accesses, (item) => {\n if (item instanceof UserAccessViewModel) {\n configMap.Data[KubernetesPortainerConfigMapAccessKey][namespace].UserAccessPolicies[item.Id] = { RoleId: 0 };\n } else if (item instanceof TeamAccessViewModel) {\n configMap.Data[KubernetesPortainerConfigMapAccessKey][namespace].TeamAccessPolicies[item.Id] = { RoleId: 0 };\n }\n });\n _.forIn(configMap.Data, (value, key) => {\n configMap.Data[key] = JSON.stringify(value);\n });\n return configMap;\n }\n}\nexport default KubernetesConfigMapHelper;\n","import _ from 'lodash-es';\nimport angular from 'angular';\nimport { KubernetesSystem_DefaultDeploymentUniqueLabelKey, KubernetesSystem_RevisionAnnotation } from 'Kubernetes/models/history/models';\n\nclass KubernetesDeploymentHistoryHelper {\n static _isControlledBy(deployment) {\n return (item) => _.find(item.metadata.ownerReferences, { uid: deployment.metadata.uid }) !== undefined;\n }\n\n static filterOwnedRevisions(rsList, deployment) {\n // filter RS that has the same selector as the Deployment\n // NOTE : this should be done in HTTP request based on deployment.spec.selector\n // instead of getting all RS and filtering them here\n const sameLabelsRS = _.filter(rsList, ['spec.selector', deployment.spec.selector]);\n // Only include the RS whose ControllerRef matches the Deployment.\n const controlledRS = _.filter(sameLabelsRS, KubernetesDeploymentHistoryHelper._isControlledBy(deployment));\n // sorts the list of ReplicaSet by creation timestamp, using the names as a tie breaker (old to new)\n const sortedList = _.sortBy(controlledRS, ['metadata.creationTimestamp', 'metadata.name']);\n return sortedList;\n }\n\n // getCurrentRS returns the new RS the given deployment targets (the one with the same pod template).\n static getCurrentRevision(rsListOriginal, deployment) {\n const rsList = angular.copy(rsListOriginal);\n\n // In rare cases, such as after cluster upgrades, Deployment may end up with\n // having more than one new ReplicaSets that have the same template as its template,\n // see https://github.com/kubernetes/kubernetes/issues/40415\n // We deterministically choose the oldest new ReplicaSet (first match)\n const current = _.find(rsList, (item) => {\n // returns true if two given template.spec are equal, ignoring the diff in value of Labels[pod-template-hash]\n // We ignore pod-template-hash because:\n // 1. The hash result would be different upon podTemplateSpec API changes\n // (e.g. the addition of a new field will cause the hash code to change)\n // 2. The deployment template won't have hash labels\n delete item.spec.template.metadata.labels[KubernetesSystem_DefaultDeploymentUniqueLabelKey];\n return _.isEqual(deployment.spec.template, item.spec.template);\n });\n current.revision = current.metadata.annotations[KubernetesSystem_RevisionAnnotation];\n return current;\n }\n\n // filters the RSList to drop all RS that have never been a version of the Deployment\n // also add the revision as a field inside the RS\n // Note: this should not impact rollback process as we only patch\n // metadata.annotations and spec.template\n static filterVersionedRevisions(rsList) {\n const filteredRS = _.filter(rsList, (item) => item.metadata.annotations[KubernetesSystem_RevisionAnnotation] !== undefined);\n return _.map(filteredRS, (item) => {\n item.revision = item.metadata.annotations[KubernetesSystem_RevisionAnnotation];\n return item;\n });\n }\n}\n\nexport default KubernetesDeploymentHistoryHelper;\n","import _ from 'lodash-es';\nimport * as JsonPatch from 'fast-json-patch';\nimport { KubernetesResourceActions } from 'Kubernetes/models/resource-types/models';\n\nfunction findCreateResources(newResources, oldResources) {\n return _.differenceBy(newResources, oldResources, 'Name');\n}\n\nfunction findDeleteResources(newResources, oldResources) {\n return _.differenceBy(oldResources, newResources, 'Name');\n}\n\nfunction findUpdateResources(newResources, oldResources) {\n const updateResources = _.intersectionWith(newResources, oldResources, (newResource, oldResource) => {\n // find out resources with same name but content changed\n if (newResource.Name != oldResource.Name) {\n return false;\n }\n return !isEqual(newResource, oldResource);\n });\n\n return updateResources;\n}\n\nfunction isEqual(newResource, oldResource) {\n let patches = JsonPatch.compare(newResource, oldResource);\n patches = _.filter(patches, (change) => {\n return !_.includes(change.path, '$$hashKey') && !_.includes(change.path, 'Duplicate');\n });\n\n return !patches.length;\n}\n\nfunction doGetResourcesSummary(newResources, oldResources, kind, action, actionFilter) {\n const filteredResources = actionFilter(newResources, oldResources);\n const summary = filteredResources.map((resource) => ({ name: resource.Name, action, kind }));\n\n return summary;\n}\n\nexport function getResourcesSummary(newResources, oldResources, kind) {\n if (!Array.isArray(newResources)) {\n newResources = newResources ? [newResources] : [];\n oldResources = oldResources ? [oldResources] : [];\n }\n\n const summary = [\n ...doGetResourcesSummary(newResources, oldResources, kind, KubernetesResourceActions.CREATE, findCreateResources),\n ...doGetResourcesSummary(newResources, oldResources, kind, KubernetesResourceActions.UPDATE, findUpdateResources),\n ...doGetResourcesSummary(newResources, oldResources, kind, KubernetesResourceActions.DELETE, findDeleteResources),\n ];\n\n return summary;\n}\n","export function UserViewModel(data) {\n this.Id = data.Id;\n this.Username = data.Username;\n this.Role = data.Role;\n this.UserTheme = data.UserTheme;\n if (data.Role === 1) {\n this.RoleName = 'administrator';\n } else {\n this.RoleName = 'user';\n }\n this.AuthenticationMethod = data.AuthenticationMethod;\n this.Checked = false;\n}\n\nexport function UserTokenModel(data) {\n this.id = data.id;\n this.userId = data.userId;\n this.description = data.description;\n this.prefix = data.prefix;\n this.dateCreated = data.dateCreated;\n this.lastUsed = data.lastUsed;\n}\n","module.exports = __webpack_public_path__ + \"e8d61d0972528623bc610d87590bc20d.svg\";","export function ResourceGroupViewModel(data, subscriptionId) {\n this.Id = data.id;\n this.SubscriptionId = subscriptionId;\n this.Name = data.name;\n this.Location = data.location;\n}\n","export function SubscriptionViewModel(data) {\n this.Id = data.subscriptionId;\n this.Name = data.displayName;\n}\n","import { ResourceControlViewModel } from 'Portainer/models/resourceControl/resourceControl';\n\nfunction b64DecodeUnicode(str) {\n try {\n return decodeURIComponent(\n atob(str)\n .split('')\n .map(function (c) {\n return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\n })\n .join('')\n );\n } catch (err) {\n return atob(str);\n }\n}\n\nexport function ConfigViewModel(data) {\n this.Id = data.ID;\n this.CreatedAt = data.CreatedAt;\n this.UpdatedAt = data.UpdatedAt;\n this.Version = data.Version.Index;\n this.Name = data.Spec.Name;\n this.Labels = data.Spec.Labels;\n this.Data = b64DecodeUnicode(data.Spec.Data);\n\n if (data.Portainer && data.Portainer.ResourceControl) {\n this.ResourceControl = new ResourceControlViewModel(data.Portainer.ResourceControl);\n }\n}\n","import { ResourceControlViewModel } from 'Portainer/models/resourceControl/resourceControl';\n\nexport function NetworkViewModel(data) {\n this.Id = data.Id;\n this.Name = data.Name;\n this.Scope = data.Scope;\n this.Driver = data.Driver;\n this.Attachable = data.Attachable;\n this.Internal = data.Internal;\n this.IPAM = data.IPAM;\n this.Containers = data.Containers;\n this.Options = data.Options;\n this.Ingress = data.Ingress;\n\n this.Labels = data.Labels;\n if (this.Labels && this.Labels['com.docker.compose.project']) {\n this.StackName = this.Labels['com.docker.compose.project'];\n } else if (this.Labels && this.Labels['com.docker.stack.namespace']) {\n this.StackName = this.Labels['com.docker.stack.namespace'];\n }\n\n if (data.Portainer) {\n if (data.Portainer.ResourceControl) {\n this.ResourceControl = new ResourceControlViewModel(data.Portainer.ResourceControl);\n }\n if (data.Portainer.Agent && data.Portainer.Agent.NodeName) {\n this.NodeName = data.Portainer.Agent.NodeName;\n }\n }\n\n this.ConfigFrom = data.ConfigFrom;\n this.ConfigOnly = data.ConfigOnly;\n}\n","export function NodeViewModel(data) {\n this.Model = data;\n this.Id = data.ID;\n this.Version = data.Version.Index;\n this.Name = data.Spec.Name;\n this.Role = data.Spec.Role;\n this.CreatedAt = data.CreatedAt;\n this.UpdatedAt = data.UpdatedAt;\n this.Availability = data.Spec.Availability;\n\n var labels = data.Spec.Labels;\n if (labels) {\n this.Labels = Object.keys(labels).map(function (key) {\n return { key: key, value: labels[key], originalKey: key, originalValue: labels[key], added: true };\n });\n } else {\n this.Labels = [];\n }\n\n var engineLabels = data.Description.Engine.Labels;\n if (engineLabels) {\n this.EngineLabels = Object.keys(engineLabels).map(function (key) {\n return { key: key, value: engineLabels[key] };\n });\n } else {\n this.EngineLabels = [];\n }\n\n this.Hostname = data.Description.Hostname;\n this.PlatformArchitecture = data.Description.Platform.Architecture;\n this.PlatformOS = data.Description.Platform.OS;\n this.CPUs = data.Description.Resources.NanoCPUs;\n this.Memory = data.Description.Resources.MemoryBytes;\n this.EngineVersion = data.Description.Engine.EngineVersion;\n this.Plugins = data.Description.Engine.Plugins;\n this.Status = data.Status.State;\n\n if (data.Status.Addr) {\n this.Addr = data.Status.Addr;\n }\n\n if (data.ManagerStatus) {\n this.Leader = data.ManagerStatus.Leader;\n this.Reachability = data.ManagerStatus.Reachability;\n this.ManagerAddr = data.ManagerStatus.Addr;\n }\n}\n","import { ResourceControlViewModel } from 'Portainer/models/resourceControl/resourceControl';\n\nexport function SecretViewModel(data) {\n this.Id = data.ID;\n this.CreatedAt = data.CreatedAt;\n this.UpdatedAt = data.UpdatedAt;\n this.Version = data.Version.Index;\n this.Name = data.Spec.Name;\n this.Labels = data.Spec.Labels;\n\n if (data.Portainer) {\n if (data.Portainer.ResourceControl) {\n this.ResourceControl = new ResourceControlViewModel(data.Portainer.ResourceControl);\n }\n }\n}\n","import { ResourceControlViewModel } from 'Portainer/models/resourceControl/resourceControl';\n\nexport function ServiceViewModel(data, runningTasks, allTasks) {\n this.Model = data;\n this.Id = data.ID;\n this.Tasks = [];\n this.Name = data.Spec.Name;\n this.CreatedAt = data.CreatedAt;\n this.UpdatedAt = data.UpdatedAt;\n this.Image = data.Spec.TaskTemplate.ContainerSpec.Image;\n this.Version = data.Version.Index;\n if (data.Spec.Mode.Replicated) {\n this.Mode = 'replicated';\n this.Replicas = data.Spec.Mode.Replicated.Replicas;\n } else {\n this.Mode = 'global';\n if (allTasks) {\n this.Replicas = allTasks.length;\n }\n }\n if (runningTasks) {\n this.Running = runningTasks.length;\n }\n if (data.Spec.TaskTemplate.Resources) {\n if (data.Spec.TaskTemplate.Resources.Limits) {\n this.LimitNanoCPUs = data.Spec.TaskTemplate.Resources.Limits.NanoCPUs;\n this.LimitMemoryBytes = data.Spec.TaskTemplate.Resources.Limits.MemoryBytes;\n }\n if (data.Spec.TaskTemplate.Resources.Reservations) {\n this.ReservationNanoCPUs = data.Spec.TaskTemplate.Resources.Reservations.NanoCPUs;\n this.ReservationMemoryBytes = data.Spec.TaskTemplate.Resources.Reservations.MemoryBytes;\n }\n }\n\n if (data.Spec.TaskTemplate.RestartPolicy) {\n this.RestartCondition = data.Spec.TaskTemplate.RestartPolicy.Condition || 'any';\n this.RestartDelay = data.Spec.TaskTemplate.RestartPolicy.Delay || 5000000000;\n this.RestartMaxAttempts = data.Spec.TaskTemplate.RestartPolicy.MaxAttempts || 0;\n this.RestartWindow = data.Spec.TaskTemplate.RestartPolicy.Window || 0;\n } else {\n this.RestartCondition = 'any';\n this.RestartDelay = 5000000000;\n this.RestartMaxAttempts = 0;\n this.RestartWindow = 0;\n }\n\n if (data.Spec.TaskTemplate.LogDriver) {\n this.LogDriverName = data.Spec.TaskTemplate.LogDriver.Name || '';\n this.LogDriverOpts = data.Spec.TaskTemplate.LogDriver.Options || [];\n } else {\n this.LogDriverName = '';\n this.LogDriverOpts = [];\n }\n\n this.Constraints = data.Spec.TaskTemplate.Placement ? data.Spec.TaskTemplate.Placement.Constraints || [] : [];\n this.Preferences = data.Spec.TaskTemplate.Placement ? data.Spec.TaskTemplate.Placement.Preferences || [] : [];\n this.Platforms = data.Spec.TaskTemplate.Placement ? data.Spec.TaskTemplate.Placement.Platforms || [] : [];\n this.Labels = data.Spec.Labels;\n if (this.Labels && this.Labels['com.docker.stack.namespace']) {\n this.StackName = this.Labels['com.docker.stack.namespace'];\n }\n\n var containerSpec = data.Spec.TaskTemplate.ContainerSpec;\n if (containerSpec) {\n this.ContainerLabels = containerSpec.Labels;\n this.Command = containerSpec.Command;\n this.Arguments = containerSpec.Args;\n this.Hostname = containerSpec.Hostname;\n this.Env = containerSpec.Env;\n this.Dir = containerSpec.Dir;\n this.User = containerSpec.User;\n this.Groups = containerSpec.Groups;\n this.TTY = containerSpec.TTY;\n this.OpenStdin = containerSpec.OpenStdin;\n this.ReadOnly = containerSpec.ReadOnly;\n this.Mounts = containerSpec.Mounts || [];\n this.StopSignal = containerSpec.StopSignal;\n this.StopGracePeriod = containerSpec.StopGracePeriod;\n this.HealthCheck = containerSpec.HealthCheck || {};\n this.Hosts = containerSpec.Hosts;\n this.DNSConfig = containerSpec.DNSConfig;\n this.Secrets = containerSpec.Secrets;\n this.Configs = containerSpec.Configs;\n }\n if (data.Endpoint) {\n this.Ports = data.Endpoint.Ports;\n }\n\n this.LogDriver = data.Spec.TaskTemplate.LogDriver;\n this.Runtime = data.Spec.TaskTemplate.Runtime;\n\n this.VirtualIPs = data.Endpoint ? data.Endpoint.VirtualIPs : [];\n\n if (data.Spec.UpdateConfig) {\n this.UpdateParallelism = typeof data.Spec.UpdateConfig.Parallelism !== undefined ? data.Spec.UpdateConfig.Parallelism || 0 : 1;\n this.UpdateDelay = data.Spec.UpdateConfig.Delay || 0;\n this.UpdateFailureAction = data.Spec.UpdateConfig.FailureAction || 'pause';\n this.UpdateOrder = data.Spec.UpdateConfig.Order || 'stop-first';\n } else {\n this.UpdateParallelism = 1;\n this.UpdateDelay = 0;\n this.UpdateFailureAction = 'pause';\n this.UpdateOrder = 'stop-first';\n }\n\n this.RollbackConfig = data.Spec.RollbackConfig;\n\n this.Checked = false;\n this.Scale = false;\n this.EditName = false;\n\n if (data.Portainer) {\n if (data.Portainer.ResourceControl) {\n this.ResourceControl = new ResourceControlViewModel(data.Portainer.ResourceControl);\n }\n }\n}\n","export function TaskViewModel(data) {\n this.Id = data.ID;\n this.Created = data.CreatedAt;\n this.Updated = data.UpdatedAt;\n this.Slot = data.Slot;\n this.Spec = data.Spec;\n this.Status = data.Status;\n this.DesiredState = data.DesiredState;\n this.ServiceId = data.ServiceID;\n this.NodeId = data.NodeID;\n if (data.Status && data.Status.ContainerStatus && data.Status.ContainerStatus.ContainerID) {\n this.ContainerId = data.Status.ContainerStatus.ContainerID;\n }\n}\n","export function StoridgeDriveModel(data) {\n this.Id = data.driveid;\n this.Node = data.node;\n this.Use = data.use;\n this.Status = data.drivestatus.toLowerCase();\n this.Size = data.size;\n this.Type = data.type;\n this.Device = data.device;\n}\n","export function StoridgeNodeModel(name, data) {\n this.Name = name;\n this.IP = data.ip;\n this.Role = data.role;\n this.Status = data.status;\n}\n\nexport function StoridgeNodeDetailedModel(name, properties) {\n this.Name = name;\n this.Condition = properties.condition;\n this.Domain = properties.domain;\n this.DomainID = properties.domainID;\n this.FreeBandwidth = properties.freeBandwidth;\n this.FreeCapacity = properties.freeCapacity;\n this.FreeIOPS = properties.freeIOPS;\n this.Hdds = properties.hdds;\n this.MetadataVersion = properties.metadataVersion;\n this.Nodes = properties.nodes;\n this.ProvisionedBandwidth = properties.provisionedBandwidth;\n this.ProvisionedCapacity = properties.provisionedCapacity;\n this.ProvisionedIOPS = properties.provisionedIOPS;\n this.Ssds = properties.ssds;\n this.Status = properties.status;\n this.TotalBandwidth = properties.totalBandwidth;\n this.TotalCapacity = properties.totalCapacity;\n this.TotalIOPS = properties.totalIOPS;\n this.UsedBandwidth = properties.usedBandwidth;\n this.UsedCapacity = properties.usedCapacity;\n this.UsedIOPS = properties.usedIOPS;\n this.Vdisks = properties.vdisks;\n}\n","export function StoridgeSnapshotModel(data) {\n this.Id = data.identifier;\n this.Date = data.date;\n this.Description = data.description;\n this.SourceID = data.sourceid;\n this.Type = data.type;\n this.Directory = data.directory;\n this.Source = data.source;\n}\n","export function StoridgeVolumeModel(data) {\n this.Allocated = data.allocated;\n this.Capacity = data.capacity;\n this.Directory = data.directory;\n this.IOPSMax = data.maximumIOPS;\n this.IOPSMin = data.minimumIOPS;\n this.BandwidthMin = data.minimumBandwidth;\n this.BandwidthMax = data.maximumBandwidth;\n this.LocalDriveOnly = data.localDriveOnly;\n this.Name = data.name;\n this.Node = data.node;\n this.NodeID = data.nodeid;\n this.Provisioning = data.provisioning;\n this.Redundancy = data.redundancy;\n this.Uuid = data.uuid;\n this.Vdisk = data.vdisk;\n this.Labels = data.labels;\n\n this.IP = data.ipaddr;\n this.DriveType = data.driveType;\n this.Encryption = data.encryption;\n this.SnapshotEnabled = data.snapshot;\n this.SnapshotInterval = data.snapInterval;\n this.SnapshotMax = data.maximumSnapshots;\n this.Filesystem = data.filesystem;\n}\n\nexport function StoridgeVolumeUpdateModel(data) {\n this.name = data.Name;\n this.opts = {\n node: data.Node,\n nodeid: data.NodeID,\n capacity: data.Capacity,\n iopsmin: data.IOPSMin,\n iopsmax: data.IOPSMax,\n bandwidthmin: data.BandwidthMin,\n bandwidthmax: data.BandwidthMax,\n };\n this.labels = data.Labels;\n}\n","/**\n * PortMappingPort Model\n */\nconst _KubernetesPortMappingPort = Object.freeze({\n Port: 0,\n TargetPort: 0,\n Protocol: '',\n IngressRules: [], // KubernetesIngressRule[]\n});\n\nexport class KubernetesPortMappingPort {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesPortMappingPort)));\n }\n}\n\n/**\n * PortMapping Model\n */\nconst _KubernetesPortMapping = Object.freeze({\n Expanded: false,\n Highlighted: false,\n ResourcePool: '',\n ServiceType: '',\n ApplicationOwner: '',\n LoadBalancerIPAddress: '',\n Ports: [],\n});\n\nexport class KubernetesPortMapping {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesPortMapping)));\n }\n}\n","import { KubernetesCommonMetadataPayload } from 'Kubernetes/models/common/payloads';\n\n/**\n * KubernetesSecretCreatePayload Model\n */\nconst _KubernetesSecretCreatePayload = Object.freeze({\n metadata: new KubernetesCommonMetadataPayload(),\n type: 'Opaque',\n data: {},\n stringData: {},\n});\n\nexport class KubernetesSecretCreatePayload {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesSecretCreatePayload)));\n }\n}\n\n/**\n * KubernetesSecretUpdatePayload Model\n */\nconst _KubernetesSecretUpdatePayload = Object.freeze({\n metadata: new KubernetesCommonMetadataPayload(),\n type: 'Opaque',\n data: {},\n stringData: {},\n});\n\nexport class KubernetesSecretUpdatePayload {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesSecretUpdatePayload)));\n }\n}\n","/**\n * KubernetesApplicationSecret Model\n */\nconst _KubernetesApplicationSecret = Object.freeze({\n Id: 0,\n Name: '',\n Namespace: '',\n CreationDate: '',\n ConfigurationOwner: '',\n Yaml: '',\n Data: [],\n});\n\nexport class KubernetesApplicationSecret {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesApplicationSecret)));\n }\n}\n","import * as JsonPatch from 'fast-json-patch';\n\nimport { KubernetesStorageClass } from 'Kubernetes/models/storage-class/models';\nimport { KubernetesStorageClassCreatePayload } from 'Kubernetes/models/storage-class/payload';\n\nclass KubernetesStorageClassConverter {\n /**\n * API StorageClass to front StorageClass\n */\n static apiToStorageClass(data) {\n const res = new KubernetesStorageClass();\n res.Name = data.metadata.name;\n res.Provisioner = data.provisioner;\n res.AllowVolumeExpansion = data.allowVolumeExpansion;\n return res;\n }\n\n static createPayload(storageClass) {\n const res = new KubernetesStorageClassCreatePayload();\n res.metadata.name = storageClass.Name;\n res.provisioner = storageClass.Provisioner;\n res.allowVolumeExpansion = storageClass.AllowVolumeExpansion;\n return res;\n }\n\n static patchPayload(oldStorageClass, newStorageClass) {\n const oldPayload = KubernetesStorageClassConverter.createPayload(oldStorageClass);\n const newPayload = KubernetesStorageClassConverter.createPayload(newStorageClass);\n const payload = JsonPatch.compare(oldPayload, newPayload);\n return payload;\n }\n}\n\nexport default KubernetesStorageClassConverter;\n","import { KubernetesVolume } from 'Kubernetes/models/volume/models';\n\nclass KubernetesVolumeConverter {\n static pvcToVolume(claim, pool) {\n const res = new KubernetesVolume();\n res.PersistentVolumeClaim = claim;\n res.ResourcePool = pool;\n return res;\n }\n}\n\nexport default KubernetesVolumeConverter;\n","import _ from 'lodash-es';\n\nclass KubernetesDaemonSetHistoryHelper {\n static _isControlledBy(daemonSet) {\n return (item) => _.find(item.metadata.ownerReferences, { uid: daemonSet.metadata.uid }) !== undefined;\n }\n\n static filterOwnedRevisions(crList, daemonSet) {\n // filter ControllerRevisions that has the same selector as the DaemonSet\n // NOTE : this should be done in HTTP request based on daemonSet.spec.selector.matchLabels\n // instead of getting all CR and filtering them here\n const sameLabelsCR = _.filter(crList, ['metadata.labels', daemonSet.spec.selector.matchLabels]);\n // Only include the RS whose ControllerRef matches the DaemonSet.\n const controlledCR = _.filter(sameLabelsCR, KubernetesDaemonSetHistoryHelper._isControlledBy(daemonSet));\n // sorts the list of ControllerRevisions by revision, using the creationTimestamp as a tie breaker (old to new)\n const sortedList = _.sortBy(controlledCR, ['revision', 'metadata.creationTimestamp']);\n return sortedList;\n }\n\n // getCurrentRS returns the newest CR the given daemonSet targets (latest version)\n static getCurrentRevision(crList) {\n const current = _.last(crList);\n return current;\n }\n}\n\nexport default KubernetesDaemonSetHistoryHelper;\n","import _ from 'lodash-es';\n\nclass KubernetesStatefulSetHistoryHelper {\n static _isControlledBy(statefulSet) {\n return (item) => _.find(item.metadata.ownerReferences, { uid: statefulSet.metadata.uid }) !== undefined;\n }\n\n static filterOwnedRevisions(crList, statefulSet) {\n // filter ControllerRevisions that has the same selector as the StatefulSet\n // NOTE : this should be done in HTTP request based on statefulSet.spec.selector.matchLabels\n // instead of getting all CR and filtering them here\n const sameLabelsCR = _.filter(crList, ['metadata.labels', statefulSet.spec.selector.matchLabels]);\n // Only include the RS whose ControllerRef matches the StatefulSet.\n const controlledCR = _.filter(sameLabelsCR, KubernetesStatefulSetHistoryHelper._isControlledBy(statefulSet));\n // sorts the list of ControllerRevisions by revision, using the creationTimestamp as a tie breaker (old to new)\n const sortedList = _.sortBy(controlledCR, ['revision', 'metadata.creationTimestamp']);\n return sortedList;\n }\n\n // getCurrentRS returns the newest CR the given statefulSet targets (latest version)\n static getCurrentRevision(crList) {\n const current = _.last(crList);\n return current;\n }\n}\n\nexport default KubernetesStatefulSetHistoryHelper;\n","/**\n * KubernetesHorizontalPodAutoScaler Model\n */\nconst _KubernetesHorizontalPodAutoScaler = Object.freeze({\n Id: '',\n Namespace: '',\n Name: '',\n MinReplicas: 1,\n MaxReplicas: 1,\n TargetCPUUtilization: 0,\n TargetEntity: {\n ApiVersion: '',\n Kind: '',\n Name: '',\n },\n Yaml: '',\n});\n\nexport class KubernetesHorizontalPodAutoScaler {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesHorizontalPodAutoScaler)));\n }\n}\n","/**\n * KubernetesNode Create Payload Model\n * Note: The current payload is here just to create patch payload.\n */\nconst _KubernetesNodeCreatePayload = Object.freeze({\n metadata: {\n name: '',\n labels: {},\n },\n spec: {\n taints: undefined,\n },\n});\n\nexport class KubernetesNodeCreatePayload {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesNodeCreatePayload)));\n }\n}\n\nconst _KubernetesNodeTaintPayload = Object.freeze({\n key: '',\n value: '',\n effect: '',\n});\n\nexport class KubernetesNodeTaintPayload {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesNodeTaintPayload)));\n }\n}\n","import { PortainerEndpointConnectionTypes } from 'Portainer/models/endpoint/models';\n\nexport class PortainerEndpointInitFormValues {\n constructor() {\n this.ConnectionType = PortainerEndpointConnectionTypes.KUBERNETES_LOCAL;\n this.Name = '';\n this.URL = '';\n this.TLS = false;\n this.TLSSkipVerify = false;\n this.TLSSKipClientVerify = false;\n this.TLSCACert = null;\n this.TLSCert = null;\n this.TLSKey = null;\n this.AzureApplicationId = '';\n this.AzureTenantId = '';\n this.AzureAuthenticationKey = '';\n }\n}\n\nclass PortainerEndpointInitFormValueEndpointSection {\n constructor(value, title, classes, description) {\n this.Id = value;\n this.Value = value;\n this.Title = title;\n this.Classes = classes;\n this.Description = description;\n }\n}\n\nexport const PortainerEndpointInitFormValueEndpointSections = Object.freeze([\n new PortainerEndpointInitFormValueEndpointSection(PortainerEndpointConnectionTypes.DOCKER_LOCAL, 'Docker', 'fab fa-docker', 'Manage the local Docker environment'),\n new PortainerEndpointInitFormValueEndpointSection(\n PortainerEndpointConnectionTypes.KUBERNETES_LOCAL,\n 'Kubernetes',\n 'fas fa-dharmachakra',\n 'Manage the local Kubernetes environment'\n ),\n new PortainerEndpointInitFormValueEndpointSection(PortainerEndpointConnectionTypes.AGENT, 'Agent', 'fa fa-bolt', 'Connect to a Portainer agent'),\n]);\n","export function SettingsViewModel(data) {\n this.LogoURL = data.LogoURL;\n this.BlackListedLabels = data.BlackListedLabels;\n this.AuthenticationMethod = data.AuthenticationMethod;\n this.LDAPSettings = data.LDAPSettings;\n this.OAuthSettings = new OAuthSettingsViewModel(data.OAuthSettings);\n this.SnapshotInterval = data.SnapshotInterval;\n this.TemplatesURL = data.TemplatesURL;\n this.EdgeAgentCheckinInterval = data.EdgeAgentCheckinInterval;\n this.EnableEdgeComputeFeatures = data.EnableEdgeComputeFeatures;\n this.FeatureFlagSettings = data.FeatureFlagSettings;\n this.UserSessionTimeout = data.UserSessionTimeout;\n this.EnableTelemetry = data.EnableTelemetry;\n this.KubeconfigExpiry = data.KubeconfigExpiry;\n this.HelmRepositoryURL = data.HelmRepositoryURL;\n}\n\nexport function PublicSettingsViewModel(settings) {\n this.AuthenticationMethod = settings.AuthenticationMethod;\n this.EnableEdgeComputeFeatures = settings.EnableEdgeComputeFeatures;\n this.FeatureFlagSettings = settings.FeatureFlagSettings;\n this.LogoURL = settings.LogoURL;\n this.OAuthLoginURI = settings.OAuthLoginURI;\n this.EnableTelemetry = settings.EnableTelemetry;\n this.OAuthLogoutURI = settings.OAuthLogoutURI;\n this.KubeconfigExpiry = settings.KubeconfigExpiry;\n}\n\nexport function LDAPSettingsViewModel(data) {\n this.ReaderDN = data.ReaderDN;\n this.Password = data.Password;\n this.URL = data.URL;\n this.SearchSettings = data.SearchSettings;\n this.GroupSearchSettings = data.GroupSearchSettings;\n this.AutoCreateUsers = data.AutoCreateUsers;\n}\n\nexport function LDAPSearchSettings(BaseDN, UsernameAttribute, Filter) {\n this.BaseDN = BaseDN;\n this.UsernameAttribute = UsernameAttribute;\n this.Filter = Filter;\n}\n\nexport function LDAPGroupSearchSettings(GroupBaseDN, GroupAttribute, GroupFilter) {\n this.GroupBaseDN = GroupBaseDN;\n this.GroupAttribute = GroupAttribute;\n this.GroupFilter = GroupFilter;\n}\n\nexport function OAuthSettingsViewModel(data) {\n this.ClientID = data.ClientID;\n this.ClientSecret = data.ClientSecret;\n this.AccessTokenURI = data.AccessTokenURI;\n this.AuthorizationURI = data.AuthorizationURI;\n this.ResourceURI = data.ResourceURI;\n this.RedirectURI = data.RedirectURI;\n this.UserIdentifier = data.UserIdentifier;\n this.Scopes = data.Scopes;\n this.OAuthAutoCreateUsers = data.OAuthAutoCreateUsers;\n this.DefaultTeamID = data.DefaultTeamID;\n this.SSO = data.SSO;\n this.LogoutURI = data.LogoutURI;\n}\n","export function StatusViewModel(data) {\n this.Authentication = data.Authentication;\n this.Snapshot = data.Snapshot;\n this.Version = data.Version;\n this.Edition = data.Edition;\n this.InstanceID = data.InstanceID;\n}\n\nexport function StatusVersionViewModel(data) {\n this.UpdateAvailable = data.UpdateAvailable;\n this.LatestVersion = data.LatestVersion;\n}\n","import _ from 'lodash-es';\n\nexport function TagViewModel(data) {\n this.Id = data.ID;\n this.Name = _.escape(data.Name);\n}\n","import _ from 'lodash-es';\n\nexport function TeamViewModel(data) {\n this.Id = data.Id;\n this.Name = _.escape(data.Name);\n this.Checked = false;\n}\n","export default {\n microsoft: {\n authUrl: 'https://login.microsoftonline.com/TENANT_ID/oauth2/authorize',\n accessTokenUrl: 'https://login.microsoftonline.com/TENANT_ID/oauth2/token',\n resourceUrl: 'https://graph.windows.net/TENANT_ID/me?api-version=2013-11-08',\n logoutUrl: `https://login.microsoftonline.com/common/oauth2/v2.0/logout?post_logout_redirect_uri=${window.location.origin}/#!/auth`,\n userIdentifier: 'userPrincipalName',\n scopes: 'id,email,name',\n },\n google: {\n authUrl: 'https://accounts.google.com/o/oauth2/auth',\n accessTokenUrl: 'https://accounts.google.com/o/oauth2/token',\n resourceUrl: 'https://www.googleapis.com/oauth2/v1/userinfo?alt=json',\n logoutUrl: `https://www.google.com/accounts/Logout?continue=https://appengine.google.com/_ah/logout?continue=${window.location.origin}/#!/auth`,\n userIdentifier: 'email',\n scopes: 'profile email',\n },\n github: {\n authUrl: 'https://github.com/login/oauth/authorize',\n accessTokenUrl: 'https://github.com/login/oauth/access_token',\n resourceUrl: 'https://api.github.com/user',\n logoutUrl: `https://github.com/logout`,\n userIdentifier: 'login',\n scopes: 'id email name',\n },\n custom: { authUrl: '', accessTokenUrl: '', resourceUrl: '', logoutUrl: '', userIdentifier: '', scopes: '' },\n};\n\nexport function getProviderByUrl(providerAuthURL = '') {\n if (providerAuthURL.includes('login.microsoftonline.com')) {\n return 'microsoft';\n }\n\n if (providerAuthURL.includes('accounts.google.com')) {\n return 'google';\n }\n\n if (providerAuthURL.includes('github.com')) {\n return 'github';\n }\n\n return 'custom';\n}\n","export default function gitlabResponseGetLink(data, headers) {\n let response = {};\n try {\n response.data = angular.fromJson(data);\n response.next = headers('X-Next-Page');\n } catch (error) {\n response = data;\n }\n return response;\n}\n","export const KubernetesApplicationDeploymentTypes = Object.freeze({\n REPLICATED: 1,\n GLOBAL: 2,\n});\n\nexport const KubernetesApplicationDataAccessPolicies = Object.freeze({\n SHARED: 1,\n ISOLATED: 2,\n});\n\nexport const KubernetesApplicationTypes = Object.freeze({\n DEPLOYMENT: 1,\n DAEMONSET: 2,\n STATEFULSET: 3,\n POD: 4,\n HELM: 5,\n});\n\nexport const KubernetesApplicationTypeStrings = Object.freeze({\n HELM: 'Helm',\n DEPLOYMENT: 'Deployment',\n DAEMONSET: 'DaemonSet',\n STATEFULSET: 'StatefulSet',\n POD: 'Pod',\n});\n\nexport const KubernetesApplicationPublishingTypes = Object.freeze({\n CLUSTER_IP: 1,\n NODE_PORT: 2,\n LOAD_BALANCER: 3,\n INGRESS: 4,\n});\n\nexport const KubernetesApplicationPlacementTypes = Object.freeze({\n PREFERRED: 1,\n MANDATORY: 2,\n});\n\nexport const KubernetesApplicationQuotaDefaults = {\n CpuLimit: 0.1,\n MemoryLimit: 64, // MB\n};\n\nexport const KubernetesPortainerApplicationStackNameLabel = 'io.portainer.kubernetes.application.stack';\n\nexport const KubernetesPortainerApplicationStackIdLabel = 'io.portainer.kubernetes.application.stackid';\n\nexport const KubernetesPortainerApplicationKindLabel = 'io.portainer.kubernetes.application.kind';\n\nexport const KubernetesPortainerApplicationNameLabel = 'io.portainer.kubernetes.application.name';\n\nexport const KubernetesPortainerApplicationOwnerLabel = 'io.portainer.kubernetes.application.owner';\n\nexport const KubernetesPortainerApplicationNote = 'io.portainer.kubernetes.application.note';\n","export const KubernetesPodNodeAffinityNodeSelectorRequirementOperators = Object.freeze({\n IN: 'In',\n NOT_IN: 'NotIn',\n EXISTS: 'Exists',\n DOES_NOT_EXIST: 'DoesNotExist',\n GREATER_THAN: 'Gt',\n LOWER_THAN: 'Lt',\n});\n\n/**\n * KubernetesPodAffinity Model\n */\n// this model will contain non transformed data (raw payload data)\n// either during creation flow (model > api)\n// than during reading flow (api > model)\nexport function KubernetesPodAffinity() {\n return {\n nodeAffinity: {}, // KubernetesPodNodeAffinityPayload\n // podAffinity: {},\n // podAntiAffinity: {},\n };\n}\n","import angular from 'angular';\nimport _ from 'lodash-es';\n\nconst basePath = 'http://portainer-ce.app';\n\nconst dimensions = {\n PortainerVersion: 1,\n PortainerInstanceID: 2,\n PortainerUserRole: 3,\n PortainerEndpointUserRole: 4,\n};\n\nconst categories = ['docker', 'kubernetes', 'aci', 'portainer', 'edge'];\n\n// forked from https://github.com/angulartics/angulartics-piwik/blob/master/src/angulartics-piwik.js\n\n/**\n * @ngdoc overview\n * @name angulartics.piwik\n * Enables analytics support for Piwik/Matomo (http://piwik.org/docs/tracking-api/)\n */\nexport default angular.module('angulartics.matomo', ['angulartics']).config(config).name;\n\n/* @ngInject */\nfunction config($analyticsProvider, $windowProvider) {\n const $window = $windowProvider.$get();\n\n $analyticsProvider.settings.pageTracking.trackRelativePath = true;\n\n $analyticsProvider.api.setPortainerStatus = setPortainerStatus;\n\n $analyticsProvider.api.setUserRole = setUserRole;\n $analyticsProvider.api.clearUserRole = clearUserRole;\n\n $analyticsProvider.api.setUserEndpointRole = setUserEndpointRole;\n $analyticsProvider.api.clearUserEndpointRole = clearUserEndpointRole;\n\n // scope: visit or page. Defaults to 'page'\n $analyticsProvider.api.setCustomVariable = function (varIndex, varName, value, scope = 'page') {\n push(['setCustomVariable', varIndex, varName, value, scope]);\n };\n\n // scope: visit or page. Defaults to 'page'\n $analyticsProvider.api.deleteCustomVariable = function (varIndex, scope = 'page') {\n $window._paq.push(['deleteCustomVariable', varIndex, scope]);\n };\n\n // trackSiteSearch(keyword, category, [searchCount])\n $analyticsProvider.api.trackSiteSearch = function (keyword, category, searchCount) {\n // keyword is required\n if (keyword) {\n const params = ['trackSiteSearch', keyword, category || false];\n\n // searchCount is optional\n if (angular.isDefined(searchCount)) {\n params.push(searchCount);\n }\n\n push(params);\n }\n };\n\n // logs a conversion for goal 1. revenue is optional\n // trackGoal(goalID, [revenue]);\n $analyticsProvider.api.trackGoal = function (goalID, revenue) {\n push(['trackGoal', goalID, revenue || 0]);\n };\n\n // track outlink or download\n // linkType is 'link' or 'download', 'link' by default\n // trackLink(url, [linkType]);\n $analyticsProvider.api.trackLink = function (url, linkType) {\n const type = linkType || 'link';\n push(['trackLink', url, type]);\n };\n\n // Set default angulartics page and event tracking\n\n $analyticsProvider.registerSetUsername(function (username) {\n push(['setUserId', username]);\n });\n\n // locationObj is the angular $location object\n $analyticsProvider.registerPageTrack(function (path) {\n push(['setDocumentTitle', $window.document.title]);\n push(['setReferrerUrl', '']);\n push(['setCustomUrl', basePath + path]);\n push(['trackPageView']);\n });\n\n /**\n * @name eventTrack\n * Track a basic event in Piwik, or send an ecommerce event.\n *\n * @param {string} action A string corresponding to the type of event that needs to be tracked.\n * @param {object} properties The properties that need to be logged with the event.\n */\n $analyticsProvider.registerEventTrack(function trackEvent(action, properties = {}) {\n /**\n * @description Logs an event with an event category (Videos, Music, Games...), an event\n * action (Play, Pause, Duration, Add Playlist, Downloaded, Clicked...), and an optional\n * event name and optional numeric value.\n *\n * @link https://piwik.org/docs/event-tracking/\n * @link https://developer.piwik.org/api-reference/tracking-javascript#using-the-tracker-object\n *\n * @property {string} category\n * @property {string} action\n * @property {object} metadata\n * @property value (optional)\n * @property dimensions (optional)\n */\n\n let { category, metadata, value, dimensions } = properties;\n\n // PAQ requires that eventValue be an integer, see: http://piwik.org/docs/event-tracking\n if (value) {\n const parsed = parseInt(properties.value, 10);\n properties.value = isNaN(parsed) ? 0 : parsed;\n }\n\n if (!category) {\n throw new Error('missing category');\n }\n category = category.toLowerCase();\n\n if (!categories.includes(category)) {\n throw new Error('unsupported category');\n }\n\n action = action.toLowerCase();\n\n let metadataString = '';\n if (metadata) {\n const kebabCasedMetadata = Object.fromEntries(Object.entries(metadata).map(([key, value]) => [_.kebabCase(key), value]));\n metadataString = JSON.stringify(kebabCasedMetadata).toLowerCase();\n }\n\n push([\n 'trackEvent',\n category,\n action,\n metadataString, // Changed in favour of Piwik documentation. Added fallback so it's backwards compatible.\n value,\n dimensions || {},\n ]);\n });\n\n /**\n * @name exceptionTrack\n * Sugar on top of the eventTrack method for easily handling errors\n *\n * @param {object} error An Error object to track: error.toString() used for event 'action', error.stack used for event 'label'.\n * @param {object} cause The cause of the error given from $exceptionHandler, not used.\n */\n $analyticsProvider.registerExceptionTrack(function (error) {\n push(['trackEvent', 'Exceptions', error.toString(), error.stack, 0]);\n });\n\n function push(args) {\n if ($window._paq) {\n $window._paq.push(args);\n }\n }\n\n function setPortainerStatus(instanceID, version) {\n setCustomDimension(dimensions.PortainerInstanceID, instanceID);\n setCustomDimension(dimensions.PortainerVersion, version);\n }\n\n function setUserRole(role) {\n setCustomDimension(dimensions.PortainerUserRole, role);\n }\n\n function clearUserRole() {\n deleteCustomDimension(dimensions.PortainerUserRole);\n }\n\n function setUserEndpointRole(role) {\n setCustomDimension(dimensions.PortainerEndpointUserRole, role);\n }\n\n function clearUserEndpointRole() {\n deleteCustomDimension(dimensions.PortainerEndpointUserRole);\n }\n\n function setCustomDimension(dimensionId, value) {\n push(['setCustomDimension', dimensionId, value]);\n }\n\n function deleteCustomDimension(dimensionId) {\n push(['deleteCustomDimension', dimensionId]);\n }\n}\n","import angular from 'angular';\n\nimport createModule from './createEdgeStackView';\n\nexport default angular.module('portainer.edge.stacks', [createModule]).name;\n","import angular from 'angular';\n\nimport { createEdgeStackView } from './create-edge-stack-view';\nimport { edgeStacksDockerComposeForm } from './docker-compose-form';\nimport { kubeManifestForm } from './kube-manifest-form';\nimport { kubeDeployDescription } from './kube-deploy-description';\n\nexport default angular\n .module('portainer.edge.stacks.create', [])\n .component('createEdgeStackView', createEdgeStackView)\n .component('edgeStacksDockerComposeForm', edgeStacksDockerComposeForm)\n .component('edgeStacksKubeManifestForm', kubeManifestForm)\n .component('kubeDeployDescription', kubeDeployDescription).name;\n","const autoNgTemplateLoaderTemplate1 = require('./create-edge-stack-view.html');\n\nimport controller from './create-edge-stack-view.controller';\n\nexport const createEdgeStackView = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n};\n","export default class CreateEdgeStackViewController {\n /* @ngInject */\n constructor($state, $window, ModalService, EdgeStackService, EdgeGroupService, EdgeTemplateService, Notifications, FormHelper, $async) {\n Object.assign(this, { $state, $window, ModalService, EdgeStackService, EdgeGroupService, EdgeTemplateService, Notifications, FormHelper, $async });\n\n this.formValues = {\n Name: '',\n StackFileContent: '',\n StackFile: null,\n RepositoryURL: '',\n RepositoryReferenceName: '',\n RepositoryAuthentication: false,\n RepositoryUsername: '',\n RepositoryPassword: '',\n Env: [],\n ComposeFilePathInRepository: '',\n Groups: [],\n DeploymentType: 0,\n };\n\n this.state = {\n Method: 'editor',\n formValidationError: '',\n actionInProgress: false,\n StackType: null,\n isEditorDirty: false,\n hasKubeEndpoint: false,\n endpointTypes: [],\n };\n\n this.edgeGroups = null;\n\n this.createStack = this.createStack.bind(this);\n this.validateForm = this.validateForm.bind(this);\n this.createStackByMethod = this.createStackByMethod.bind(this);\n this.createStackFromFileContent = this.createStackFromFileContent.bind(this);\n this.createStackFromFileUpload = this.createStackFromFileUpload.bind(this);\n this.createStackFromGitRepository = this.createStackFromGitRepository.bind(this);\n this.onChangeGroups = this.onChangeGroups.bind(this);\n this.hasDockerEndpoint = this.hasDockerEndpoint.bind(this);\n this.onChangeDeploymentType = this.onChangeDeploymentType.bind(this);\n }\n\n buildAnalyticsProperties() {\n const format = 'compose';\n const metadata = { type: methodLabel(this.state.Method), format };\n\n if (metadata.type === 'template') {\n metadata.templateName = this.selectedTemplate.title;\n }\n\n return { metadata };\n\n function methodLabel(method) {\n switch (method) {\n case 'editor':\n return 'web-editor';\n case 'repository':\n return 'git';\n case 'upload':\n return 'file-upload';\n case 'template':\n return 'template';\n }\n }\n }\n\n uiCanExit() {\n if (this.state.Method === 'editor' && this.formValues.StackFileContent && this.state.isEditorDirty) {\n return this.ModalService.confirmWebEditorDiscard();\n }\n }\n\n async $onInit() {\n try {\n this.edgeGroups = await this.EdgeGroupService.groups();\n this.noGroups = this.edgeGroups.length === 0;\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve Edge groups');\n }\n\n this.$window.onbeforeunload = () => {\n if (this.state.Method === 'editor' && this.formValues.StackFileContent && this.state.isEditorDirty) {\n return '';\n }\n };\n }\n\n $onDestroy() {\n this.state.isEditorDirty = false;\n }\n\n createStack() {\n return this.$async(async () => {\n const name = this.formValues.Name;\n let method = this.state.Method;\n\n if (method === 'template') {\n method = 'editor';\n }\n\n if (!this.validateForm(method)) {\n return;\n }\n\n this.state.actionInProgress = true;\n try {\n await this.createStackByMethod(name, method);\n\n this.Notifications.success('Stack successfully deployed');\n this.state.isEditorDirty = false;\n this.$state.go('edge.stacks');\n } catch (err) {\n this.Notifications.error('Deployment error', err, 'Unable to deploy stack');\n } finally {\n this.state.actionInProgress = false;\n }\n });\n }\n\n onChangeGroups(groups) {\n this.formValues.Groups = groups;\n\n this.checkIfEndpointTypes(groups);\n }\n\n checkIfEndpointTypes(groups) {\n const edgeGroups = groups.map((id) => this.edgeGroups.find((e) => e.Id === id));\n this.state.endpointTypes = edgeGroups.flatMap((group) => group.EndpointTypes);\n\n if (this.hasDockerEndpoint() && this.formValues.DeploymentType == 1) {\n this.onChangeDeploymentType(0);\n }\n }\n\n hasKubeEndpoint() {\n return this.state.endpointTypes.includes(7);\n }\n\n hasDockerEndpoint() {\n return this.state.endpointTypes.includes(4);\n }\n\n validateForm(method) {\n this.state.formValidationError = '';\n\n if (method === 'editor' && this.formValues.StackFileContent === '') {\n this.state.formValidationError = 'Stack file content must not be empty';\n return;\n }\n\n return true;\n }\n\n createStackByMethod(name, method) {\n switch (method) {\n case 'editor':\n return this.createStackFromFileContent(name);\n case 'upload':\n return this.createStackFromFileUpload(name);\n case 'repository':\n return this.createStackFromGitRepository(name);\n }\n }\n\n createStackFromFileContent(name) {\n const { StackFileContent, Groups, DeploymentType } = this.formValues;\n\n return this.EdgeStackService.createStackFromFileContent({\n name,\n StackFileContent,\n EdgeGroups: Groups,\n DeploymentType,\n });\n }\n\n createStackFromFileUpload(name) {\n const { StackFile, Groups, DeploymentType } = this.formValues;\n return this.EdgeStackService.createStackFromFileUpload(\n {\n Name: name,\n EdgeGroups: Groups,\n DeploymentType,\n },\n StackFile\n );\n }\n\n createStackFromGitRepository(name) {\n const { Groups, DeploymentType } = this.formValues;\n const repositoryOptions = {\n RepositoryURL: this.formValues.RepositoryURL,\n RepositoryReferenceName: this.formValues.RepositoryReferenceName,\n FilePathInRepository: this.formValues.ComposeFilePathInRepository,\n RepositoryAuthentication: this.formValues.RepositoryAuthentication,\n RepositoryUsername: this.formValues.RepositoryUsername,\n RepositoryPassword: this.formValues.RepositoryPassword,\n };\n return this.EdgeStackService.createStackFromGitRepository(\n {\n name,\n EdgeGroups: Groups,\n DeploymentType,\n },\n repositoryOptions\n );\n }\n\n onChangeDeploymentType(deploymentType) {\n this.formValues.DeploymentType = deploymentType;\n this.state.Method = 'editor';\n this.formValues.StackFileContent = '';\n }\n\n formIsInvalid() {\n return this.form.$invalid || !this.formValues.Groups.length || (['template', 'editor'].includes(this.state.Method) && !this.formValues.StackFileContent);\n }\n}\n","const autoNgTemplateLoaderTemplate1 = require('./docker-compose-form.html');\n\nimport controller from './docker-compose-form.controller.js';\n\nexport const edgeStacksDockerComposeForm = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n\n bindings: {\n formValues: '=',\n state: '=',\n },\n};\n","class DockerComposeFormController {\n /* @ngInject */\n constructor($async, EdgeTemplateService, Notifications) {\n Object.assign(this, { $async, EdgeTemplateService, Notifications });\n\n this.methodOptions = [\n { id: 'method_editor', icon: 'fa fa-edit', label: 'Web editor', description: 'Use our Web editor', value: 'editor' },\n { id: 'method_upload', icon: 'fa fa-upload', label: 'Upload', description: 'Upload from your computer', value: 'upload' },\n { id: 'method_repository', icon: 'fab fa-github', label: 'Repository', description: 'Use a git repository', value: 'repository' },\n { id: 'method_template', icon: 'fa fa-rocket', label: 'Template', description: 'Use an Edge stack template', value: 'template' },\n ];\n\n this.selectedTemplate = null;\n\n this.onChangeFileContent = this.onChangeFileContent.bind(this);\n this.onChangeFile = this.onChangeFile.bind(this);\n this.onChangeTemplate = this.onChangeTemplate.bind(this);\n this.onChangeMethod = this.onChangeMethod.bind(this);\n this.onChangeFormValues = this.onChangeFormValues.bind(this);\n }\n\n onChangeFormValues(values) {\n this.formValues = values;\n }\n\n onChangeMethod() {\n this.formValues.StackFileContent = '';\n this.selectedTemplate = null;\n }\n\n onChangeTemplate(template) {\n return this.$async(async () => {\n this.formValues.StackFileContent = '';\n try {\n const fileContent = await this.EdgeTemplateService.edgeTemplate(template);\n this.formValues.StackFileContent = fileContent;\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve Template');\n }\n });\n }\n\n onChangeFileContent(value) {\n this.formValues.StackFileContent = value;\n this.state.isEditorDirty = true;\n }\n\n onChangeFile(value) {\n this.formValues.StackFile = value;\n }\n\n async $onInit() {\n return this.$async(async () => {\n try {\n const templates = await this.EdgeTemplateService.edgeTemplates();\n this.templates = templates.map((template) => ({ ...template, label: `${template.title} - ${template.description}` }));\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve Templates');\n }\n });\n }\n}\n\nexport default DockerComposeFormController;\n","const autoNgTemplateLoaderTemplate1 = require('./kube-manifest-form.html');\n\nimport controller from './kube-manifest-form.controller.js';\n\nexport const kubeManifestForm = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n\n bindings: {\n formValues: '=',\n state: '=',\n },\n};\n","class KubeManifestFormController {\n /* @ngInject */\n constructor() {\n this.methodOptions = [\n { id: 'method_editor', icon: 'fa fa-edit', label: 'Web editor', description: 'Use our Web editor', value: 'editor' },\n { id: 'method_upload', icon: 'fa fa-upload', label: 'Upload', description: 'Upload from your computer', value: 'upload' },\n { id: 'method_repository', icon: 'fab fa-github', label: 'Repository', description: 'Use a git repository', value: 'repository' },\n ];\n\n this.onChangeFileContent = this.onChangeFileContent.bind(this);\n this.onChangeFormValues = this.onChangeFormValues.bind(this);\n this.onChangeFile = this.onChangeFile.bind(this);\n }\n\n onChangeFormValues(values) {\n this.formValues = values;\n }\n\n onChangeFileContent(value) {\n this.state.isEditorDirty = true;\n this.formValues.StackFileContent = value;\n }\n\n onChangeFile(value) {\n this.formValues.StackFile = value;\n }\n}\n\nexport default KubeManifestFormController;\n","const autoNgTemplateLoaderTemplate1 = require('./kube-deploy-description.html');\n\nexport const kubeDeployDescription = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n};\n","const autoNgTemplateLoaderTemplate1 = require('./roles.html');\n\nimport controller from './roles.controller';\n\nexport const rolesView = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n};\n","import _ from 'lodash-es';\n\nexport default class RolesController {\n /* @ngInject */\n constructor(Notifications, RoleService) {\n this.Notifications = Notifications;\n this.RoleService = RoleService;\n }\n\n async $onInit() {\n this.roles = [];\n\n try {\n this.roles = await this.RoleService.roles();\n this.roles = _.orderBy(this.roles, 'Priority', 'asc');\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve roles');\n }\n }\n}\n","const autoNgTemplateLoaderTemplate1 = require('./access-viewer.html');\n\nimport controller from './access-viewer.controller';\n\nexport const accessViewer = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n};\n","import _ from 'lodash-es';\n\nimport AccessViewerPolicyModel from '../../models/access';\n\nexport default class AccessViewerController {\n /* @ngInject */\n constructor(featureService, Notifications, RoleService, UserService, EndpointService, GroupService, TeamService, TeamMembershipService) {\n this.featureService = featureService;\n this.Notifications = Notifications;\n this.RoleService = RoleService;\n this.UserService = UserService;\n this.EndpointService = EndpointService;\n this.GroupService = GroupService;\n this.TeamService = TeamService;\n this.TeamMembershipService = TeamMembershipService;\n\n this.limitedFeature = 'rbac-roles';\n this.users = [];\n }\n\n onUserSelect() {\n this.userRoles = [];\n const userRoles = {};\n const user = this.selectedUser;\n const userMemberships = _.filter(this.teamMemberships, { UserId: user.Id });\n\n for (const [, endpoint] of _.entries(this.endpoints)) {\n let role = this.getRoleFromUserEndpointPolicy(user, endpoint);\n if (role) {\n userRoles[endpoint.Id] = role;\n continue;\n }\n\n role = this.getRoleFromUserEndpointGroupPolicy(user, endpoint);\n if (role) {\n userRoles[endpoint.Id] = role;\n continue;\n }\n\n role = this.getRoleFromTeamEndpointPolicies(userMemberships, endpoint);\n if (role) {\n userRoles[endpoint.Id] = role;\n continue;\n }\n\n role = this.getRoleFromTeamEndpointGroupPolicies(userMemberships, endpoint);\n if (role) {\n userRoles[endpoint.Id] = role;\n }\n }\n\n this.userRoles = _.values(userRoles);\n }\n\n findLowestRole(policies) {\n return _.first(_.orderBy(policies, 'RolePriority', 'desc'));\n }\n\n getRoleFromUserEndpointPolicy(user, endpoint) {\n const policyRoles = [];\n const policy = (endpoint.UserAccessPolicies || {})[user.Id];\n if (policy) {\n const accessPolicy = new AccessViewerPolicyModel(policy, endpoint, this.roles, null, null);\n policyRoles.push(accessPolicy);\n }\n return this.findLowestRole(policyRoles);\n }\n\n getRoleFromUserEndpointGroupPolicy(user, endpoint) {\n const policyRoles = [];\n const policy = this.groupUserAccessPolicies[endpoint.GroupId][user.Id];\n if (policy) {\n const accessPolicy = new AccessViewerPolicyModel(policy, endpoint, this.roles, this.groups[endpoint.GroupId], null);\n policyRoles.push(accessPolicy);\n }\n return this.findLowestRole(policyRoles);\n }\n\n getRoleFromTeamEndpointPolicies(memberships, endpoint) {\n const policyRoles = [];\n for (const membership of memberships) {\n const policy = (endpoint.TeamAccessPolicies || {})[membership.TeamId];\n if (policy) {\n const accessPolicy = new AccessViewerPolicyModel(policy, endpoint, this.roles, null, this.teams[membership.TeamId]);\n policyRoles.push(accessPolicy);\n }\n }\n return this.findLowestRole(policyRoles);\n }\n\n getRoleFromTeamEndpointGroupPolicies(memberships, endpoint) {\n const policyRoles = [];\n for (const membership of memberships) {\n const policy = this.groupTeamAccessPolicies[endpoint.GroupId][membership.TeamId];\n if (policy) {\n const accessPolicy = new AccessViewerPolicyModel(policy, endpoint, this.roles, this.groups[endpoint.GroupId], this.teams[membership.TeamId]);\n policyRoles.push(accessPolicy);\n }\n }\n return this.findLowestRole(policyRoles);\n }\n\n async $onInit() {\n try {\n const limitedToBE = this.featureService.isLimitedToBE(this.limitedFeature);\n\n if (limitedToBE) {\n return;\n }\n\n this.users = await this.UserService.users();\n this.endpoints = _.keyBy((await this.EndpointService.endpoints()).value, 'Id');\n const groups = await this.GroupService.groups();\n this.groupUserAccessPolicies = {};\n this.groupTeamAccessPolicies = {};\n _.forEach(groups, (group) => {\n this.groupUserAccessPolicies[group.Id] = group.UserAccessPolicies;\n this.groupTeamAccessPolicies[group.Id] = group.TeamAccessPolicies;\n });\n this.groups = _.keyBy(groups, 'Id');\n this.roles = _.keyBy(await this.RoleService.roles(), 'Id');\n this.teams = _.keyBy(await this.TeamService.teams(), 'Id');\n this.teamMemberships = await this.TeamMembershipService.memberships();\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve accesses');\n }\n }\n}\n","const autoNgTemplateLoaderTemplate1 = require('./access-viewer-datatable.html');\n\nexport const accessViewerDatatable = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'GenericDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n tableKey: '@',\n orderBy: '@',\n dataset: '<',\n },\n};\n","import angular from 'angular';\nimport { RoleTypes } from '../../models/role';\n\nexport default class RolesDatatableController {\n /* @ngInject */\n constructor($controller, $scope) {\n this.limitedFeature = 'rbac-roles';\n\n angular.extend(this, $controller('GenericDatatableController', { $scope }));\n }\n\n isDefaultItem(item) {\n return item.ID === RoleTypes.STANDARD;\n }\n}\n","import { RoleViewModel, RoleTypes } from '../models/role';\n\nexport function RoleService() {\n const rolesData = [\n new RoleViewModel(RoleTypes.ENDPOINT_ADMIN, 'Environment administrator', 'Full control of all resources in an environment', []),\n new RoleViewModel(RoleTypes.OPERATOR, 'Operator', 'Operational Control of all existing resources in an environment', []),\n new RoleViewModel(RoleTypes.HELPDESK, 'Helpdesk', 'Read-only access of all resources in an environment', []),\n new RoleViewModel(RoleTypes.READ_ONLY, 'Read-only user', 'Read-only access of assigned resources in an environment', []),\n new RoleViewModel(RoleTypes.STANDARD, 'Standard user', 'Full control of assigned resources in an environment', []),\n ];\n\n return {\n roles,\n };\n\n function roles() {\n return rolesData;\n }\n}\n","/* @ngInject */\nexport function RolesFactory($resource, API_ENDPOINT_ROLES) {\n return $resource(\n API_ENDPOINT_ROLES + '/:id',\n {},\n {\n create: { method: 'POST', ignoreLoadingBar: true },\n query: { method: 'GET', isArray: true },\n get: { method: 'GET', params: { id: '@id' } },\n update: { method: 'PUT', params: { id: '@id' } },\n remove: { method: 'DELETE', params: { id: '@id' } },\n }\n );\n}\n","class SidebarMenuController {\n /* @ngInject */\n constructor($state) {\n this.$state = $state;\n\n this.state = {\n forceOpen: false,\n };\n }\n\n isOpen() {\n if (!this.isSidebarOpen) {\n return false;\n }\n\n if (this.state.forceOpen) {\n return true;\n }\n\n return this.isOpenByPathState();\n }\n\n isOpenByPathState() {\n const currentName = this.$state.current.name;\n return currentName.startsWith(this.path) || this.childrenPaths.includes(currentName);\n }\n\n onClickArrow(event) {\n event.stopPropagation();\n event.preventDefault();\n\n // prevent toggling when menu is open by state\n if (this.isOpenByPathState()) {\n return;\n }\n\n this.state.forceOpen = !this.state.forceOpen;\n }\n\n $onInit() {\n this.childrenPaths = this.childrenPaths || [];\n }\n}\n\nexport default SidebarMenuController;\n","const autoNgTemplateLoaderTemplate1 = require('./sidebar-section.html');\n\nexport const sidebarSection = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n transclude: true,\n bindings: {\n title: '@',\n },\n};\n","import angular from 'angular';\n\nimport { gitForm } from './git-form';\nimport { gitFormAuthFieldset } from './git-form-auth-fieldset';\nimport { gitFormAdditionalFilesPanel } from './git-form-additional-files-panel';\nimport { gitFormAdditionalFileItem } from './/git-form-additional-files-panel/git-form-additional-file-item';\nimport { gitFormAutoUpdateFieldset } from './git-form-auto-update-fieldset';\nimport { gitFormComposePathField } from './git-form-compose-path-field';\nimport { gitFormRefField } from './git-form-ref-field';\nimport { gitFormUrlField } from './git-form-url-field';\nimport { gitFormInfoPanel } from './git-form-info-panel';\n\nexport default angular\n .module('portainer.app.components.forms.git', [])\n .component('gitFormComposePathField', gitFormComposePathField)\n .component('gitFormRefField', gitFormRefField)\n .component('gitForm', gitForm)\n .component('gitFormUrlField', gitFormUrlField)\n .component('gitFormInfoPanel', gitFormInfoPanel)\n .component('gitFormAdditionalFilesPanel', gitFormAdditionalFilesPanel)\n .component('gitFormAdditionalFileItem', gitFormAdditionalFileItem)\n .component('gitFormAutoUpdateFieldset', gitFormAutoUpdateFieldset)\n .component('gitFormAuthFieldset', gitFormAuthFieldset).name;\n","const autoNgTemplateLoaderTemplate1 = require('./git-form.html');\n\nimport controller from './git-form.controller.js';\n\nexport const gitForm = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n deployMethod: '@',\n model: '<',\n onChange: '<',\n additionalFile: '<',\n autoUpdate: '<',\n showAuthExplanation: '<',\n },\n};\n","export default class GitFormController {\n /* @ngInject */\n constructor() {\n this.onChangeField = this.onChangeField.bind(this);\n this.onChangeURL = this.onChangeField('RepositoryURL');\n this.onChangeRefName = this.onChangeField('RepositoryReferenceName');\n this.onChangeComposePath = this.onChangeField('ComposeFilePathInRepository');\n }\n\n onChangeField(field) {\n return (value) => {\n this.onChange({\n ...this.model,\n [field]: value,\n });\n };\n }\n\n $onInit() {\n this.deployMethod = this.deployMethod || 'compose';\n }\n}\n","class GitFormComposeAuthFieldsetController {\n /* @ngInject */\n constructor() {\n this.authValues = {\n username: '',\n password: '',\n };\n\n this.onChangeField = this.onChangeField.bind(this);\n this.onChangeAuth = this.onChangeAuth.bind(this);\n this.onChangeUsername = this.onChangeField('RepositoryUsername');\n this.onChangePassword = this.onChangeField('RepositoryPassword');\n }\n\n onChangeField(field) {\n return (value) => {\n this.onChange({\n ...this.model,\n [field]: value,\n });\n };\n }\n\n onChangeAuth(auth) {\n if (!auth) {\n this.authValues.username = this.model.RepositoryUsername;\n this.authValues.password = this.model.RepositoryPassword;\n }\n\n this.onChange({\n ...this.model,\n RepositoryAuthentication: auth,\n RepositoryUsername: auth ? this.authValues.username : '',\n RepositoryPassword: auth ? this.authValues.password : '',\n });\n }\n\n $onInit() {\n if (this.model.RepositoryAuthentication) {\n this.authValues.username = this.model.RepositoryUsername;\n this.authValues.password = this.model.RepositoryPassword;\n }\n }\n}\n\nexport default GitFormComposeAuthFieldsetController;\n","const autoNgTemplateLoaderTemplate1 = require('./git-form-additional-files-panel.html');\n\nimport controller from './git-form-additional-files-panel.controller.js';\n\nexport const gitFormAdditionalFilesPanel = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n model: '<',\n onChange: '<',\n },\n};\n","class GitFormAutoUpdateFieldsetController {\n /* @ngInject */\n constructor() {\n this.add = this.add.bind(this);\n this.onChangeVariable = this.onChangeVariable.bind(this);\n }\n\n add() {\n this.model.AdditionalFiles.push('');\n }\n\n onChangeVariable(index, variable) {\n if (!variable) {\n this.model.AdditionalFiles.splice(index, 1);\n } else {\n this.model.AdditionalFiles[index] = variable.value;\n }\n\n this.onChange({\n ...this.model,\n AdditionalFiles: this.model.AdditionalFiles,\n });\n }\n}\n\nexport default GitFormAutoUpdateFieldsetController;\n","const autoNgTemplateLoaderTemplate1 = require('./git-form-additional-file-item.html');\n\nimport controller from './git-form-additional-file-item.controller.js';\n\nexport const gitFormAdditionalFileItem = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n\n bindings: {\n variable: '<',\n index: '<',\n\n onChange: '<',\n onRemove: '<',\n },\n};\n","class GitFormAdditionalFileItemController {\n onChangePath(value) {\n const fieldIsInvalid = typeof value === 'undefined';\n if (fieldIsInvalid) {\n return;\n }\n this.onChange(this.index, { value });\n }\n\n removeValue() {\n this.onChange(this.index);\n }\n\n $onInit() {\n this.formName = `variableForm${this.index}`;\n }\n}\n\nexport default GitFormAdditionalFileItemController;\n","const autoNgTemplateLoaderTemplate1 = require('./git-form-auto-update-fieldset.html');\n\nimport controller from './git-form-auto-update-fieldset.controller.js';\n\nexport const gitFormAutoUpdateFieldset = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n model: '<',\n onChange: '<',\n },\n};\n","import { FORCE_REDEPLOYMENT } from '@/portainer/feature-flags/feature-ids';\n\nclass GitFormAutoUpdateFieldsetController {\n /* @ngInject */\n constructor(clipboard) {\n this.onChangeAutoUpdate = this.onChangeField('RepositoryAutomaticUpdates');\n this.onChangeMechanism = this.onChangeField('RepositoryMechanism');\n this.onChangeInterval = this.onChangeField('RepositoryFetchInterval');\n this.clipboard = clipboard;\n\n this.limitedFeature = FORCE_REDEPLOYMENT;\n }\n\n copyWebhook() {\n this.clipboard.copyText(this.model.RepositoryWebhookURL);\n $('#copyNotification').show();\n $('#copyNotification').fadeOut(2000);\n }\n\n onChangeField(field) {\n return (value) => {\n this.onChange({\n ...this.model,\n [field]: value,\n });\n };\n }\n}\n\nexport default GitFormAutoUpdateFieldsetController;\n","const autoNgTemplateLoaderTemplate1 = require('./git-form-compose-path-field.html');\n\nexport const gitFormComposePathField = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n deployMethod: '@',\n value: '<',\n onChange: '<',\n },\n};\n","const autoNgTemplateLoaderTemplate1 = require('./git-form-ref-field.html');\n\nexport const gitFormRefField = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n value: '<',\n onChange: '<',\n },\n};\n","const autoNgTemplateLoaderTemplate1 = require('./git-form-url-field.html');\n\nexport const gitFormUrlField = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n value: '<',\n onChange: '<',\n },\n};\n","const autoNgTemplateLoaderTemplate1 = require('./git-form-info-panel.html');\n\nexport const gitFormInfoPanel = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n url: '<',\n configFilePath: '<',\n additionalFiles: '<',\n className: '@',\n type: '@',\n },\n};\n","import angular from 'angular';\n\nimport { porAccessManagement } from './por-access-management';\nimport { porAccessManagementUsersSelector } from './por-access-management-users-selector';\n\nexport default angular\n .module('portainer.app.component.access-management', [])\n .component('porAccessManagement', porAccessManagement)\n .component('porAccessManagementUsersSelector', porAccessManagementUsersSelector).name;\n","const autoNgTemplateLoaderTemplate1 = require('./porAccessManagement.html');\n\nexport const porAccessManagement = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'porAccessManagementController',\n controllerAs: 'ctrl',\n bindings: {\n accessControlledEntity: '<',\n inheritFrom: '<',\n entityType: '@',\n updateAccess: '<',\n actionInProgress: '<',\n filterUsers: '<',\n limitedFeature: '<',\n },\n};\n","const autoNgTemplateLoaderTemplate1 = require('./por-access-management-users-selector.html');\n\nexport const porAccessManagementUsersSelector = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n options: '<',\n value: '=',\n },\n};\n","import angular from 'angular';\n\nimport { webEditorForm } from './web-editor-form';\nimport { fileUploadForm } from './file-upload-form';\n\nexport default angular.module('portainer.app.components.form', []).component('webEditorForm', webEditorForm).component('fileUploadForm', fileUploadForm).name;\n","const autoNgTemplateLoaderTemplate1 = require('./web-editor-form.html');\n\nimport controller from './web-editor-form.controller.js';\n\nexport const webEditorForm = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n\n bindings: {\n identifier: '@',\n placeholder: '@',\n yml: '<',\n value: '<',\n onChange: '<',\n },\n\n transclude: {\n description: '?editorDescription',\n },\n};\n","class WebEditorFormController {\n /* @ngInject */\n constructor() {\n this.editorUpdate = this.editorUpdate.bind(this);\n }\n\n editorUpdate(cm) {\n this.onChange(cm.getValue());\n }\n}\n\nexport default WebEditorFormController;\n","const autoNgTemplateLoaderTemplate1 = require('./file-upload-form.html');\n\nexport const fileUploadForm = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n\n bindings: {\n file: '<',\n ngRequired: '<',\n onChange: '<',\n },\n\n transclude: {\n description: '?fileUploadDescription',\n },\n};\n","import angular from 'angular';\n\nimport authenticationModule from './authentication';\nimport generalModule from './general';\n\nexport default angular.module('portainer.settings', [authenticationModule, generalModule]).name;\n","import angular from 'angular';\nimport ldapModule from './ldap';\nimport { autoUserProvisionToggle } from './auto-user-provision-toggle';\nimport { saveAuthSettingsButton } from './save-auth-settings-button';\nimport { internalAuth } from './internal-auth';\n\nexport default angular\n .module('portainer.settings.authentication', [ldapModule])\n .component('internalAuth', internalAuth)\n .component('saveAuthSettingsButton', saveAuthSettingsButton)\n .component('autoUserProvisionToggle', autoUserProvisionToggle).name;\n","import angular from 'angular';\n\nimport { adSettings } from './ad-settings';\nimport { ldapSettings } from './ldap-settings';\nimport { ldapSettingsCustom } from './ldap-settings-custom';\nimport { ldapSettingsOpenLdap } from './ldap-settings-openldap';\n\nimport { ldapConnectivityCheck } from './ldap-connectivity-check';\nimport { ldapGroupsDatatable } from './ldap-groups-datatable';\nimport { ldapGroupSearch } from './ldap-group-search';\nimport { ldapGroupSearchItem } from './ldap-group-search-item';\nimport { ldapUserSearch } from './ldap-user-search';\nimport { ldapUserSearchItem } from './ldap-user-search-item';\nimport { ldapSettingsDnBuilder } from './ldap-settings-dn-builder';\nimport { ldapSettingsGroupDnBuilder } from './ldap-settings-group-dn-builder';\nimport { ldapCustomGroupSearch } from './ldap-custom-group-search';\nimport { ldapCustomAdminGroup } from './ldap-custom-admin-group';\nimport { ldapSettingsSecurity } from './ldap-settings-security';\nimport { ldapSettingsTestLogin } from './ldap-settings-test-login';\nimport { ldapCustomUserSearch } from './ldap-custom-user-search';\nimport { ldapUsersDatatable } from './ldap-users-datatable';\nimport { LDAPService } from './ldap.service';\nimport { LDAP } from './ldap.rest';\n\nexport default angular\n .module('portainer.settings.authentication.ldap', [])\n .service('LDAPService', LDAPService)\n .service('LDAP', LDAP)\n .component('ldapConnectivityCheck', ldapConnectivityCheck)\n .component('ldapGroupsDatatable', ldapGroupsDatatable)\n .component('ldapSettings', ldapSettings)\n .component('adSettings', adSettings)\n .component('ldapGroupSearch', ldapGroupSearch)\n .component('ldapGroupSearchItem', ldapGroupSearchItem)\n .component('ldapUserSearch', ldapUserSearch)\n .component('ldapUserSearchItem', ldapUserSearchItem)\n .component('ldapSettingsCustom', ldapSettingsCustom)\n .component('ldapSettingsDnBuilder', ldapSettingsDnBuilder)\n .component('ldapSettingsGroupDnBuilder', ldapSettingsGroupDnBuilder)\n .component('ldapCustomGroupSearch', ldapCustomGroupSearch)\n .component('ldapCustomAdminGroup', ldapCustomAdminGroup)\n .component('ldapSettingsOpenLdap', ldapSettingsOpenLdap)\n .component('ldapSettingsSecurity', ldapSettingsSecurity)\n .component('ldapSettingsTestLogin', ldapSettingsTestLogin)\n .component('ldapCustomUserSearch', ldapCustomUserSearch)\n .component('ldapUsersDatatable', ldapUsersDatatable).name;\n","const autoNgTemplateLoaderTemplate1 = require('./ad-settings.html');\n\nimport controller from './ad-settings.controller';\n\nexport const adSettings = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n settings: '=',\n tlscaCert: '=',\n state: '=',\n connectivityCheck: '<',\n onSaveSettings: '<',\n saveButtonState: '<',\n isLdapFormValid: '&?',\n },\n};\n","import _ from 'lodash-es';\nimport { HIDE_INTERNAL_AUTH } from '@/portainer/feature-flags/feature-ids';\n\nexport default class AdSettingsController {\n /* @ngInject */\n constructor(LDAPService, featureService) {\n this.LDAPService = LDAPService;\n this.featureService = featureService;\n\n this.domainSuffix = '';\n this.limitedFeatureId = HIDE_INTERNAL_AUTH;\n this.onTlscaCertChange = this.onTlscaCertChange.bind(this);\n this.searchUsers = this.searchUsers.bind(this);\n this.searchGroups = this.searchGroups.bind(this);\n this.parseDomainName = this.parseDomainName.bind(this);\n this.onAccountChange = this.onAccountChange.bind(this);\n }\n\n parseDomainName(account) {\n this.domainName = '';\n\n if (!account || !account.includes('@')) {\n return;\n }\n\n const [, domainName] = account.split('@');\n if (!domainName) {\n return;\n }\n\n const parts = _.compact(domainName.split('.'));\n this.domainSuffix = parts.map((part) => `dc=${part}`).join(',');\n }\n\n onAccountChange(account) {\n this.parseDomainName(account);\n }\n\n searchUsers() {\n return this.LDAPService.users(this.settings);\n }\n\n searchGroups() {\n return this.LDAPService.groups(this.settings);\n }\n\n onTlscaCertChange(file) {\n this.tlscaCert = file;\n }\n\n addLDAPUrl() {\n this.settings.URLs.push('');\n }\n\n removeLDAPUrl(index) {\n this.settings.URLs.splice(index, 1);\n }\n\n isSaveSettingButtonDisabled() {\n return this.featureService.isLimitedToBE(this.limitedFeatureId) || !this.isLdapFormValid();\n }\n\n $onInit() {\n this.tlscaCert = this.settings.TLSCACert;\n this.parseDomainName(this.settings.ReaderDN);\n }\n}\n","const autoNgTemplateLoaderTemplate1 = require('./ldap-settings.html');\n\nimport controller from './ldap-settings.controller';\n\nexport const ldapSettings = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n settings: '=',\n state: '<',\n connectivityCheck: '<',\n onSaveSettings: '<',\n saveButtonState: '<',\n isLdapFormValid: '<',\n },\n};\n","const SERVER_TYPES = {\n CUSTOM: 0,\n OPEN_LDAP: 1,\n AD: 2,\n};\n\nimport { buildLdapSettingsModel, buildOpenLDAPSettingsModel } from '@/portainer/settings/authentication/ldap/ldap-settings.model';\nimport { EXTERNAL_AUTH_LDAP } from '@/portainer/feature-flags/feature-ids';\n\nconst DEFAULT_GROUP_FILTER = '(objectClass=groupOfNames)';\nconst DEFAULT_USER_FILTER = '(objectClass=inetOrgPerson)';\n\nexport default class LdapSettingsController {\n /* @ngInject */\n constructor(LDAPService) {\n Object.assign(this, { LDAPService, SERVER_TYPES });\n\n this.tlscaCert = null;\n this.settingsDrafts = {};\n\n this.boxSelectorOptions = [\n { id: 'ldap_custom', value: SERVER_TYPES.CUSTOM, label: 'Custom', icon: 'fa fa-server' },\n { id: 'ldap_openldap', value: SERVER_TYPES.OPEN_LDAP, label: 'OpenLDAP', icon: 'fa fa-server', feature: EXTERNAL_AUTH_LDAP },\n ];\n\n this.onTlscaCertChange = this.onTlscaCertChange.bind(this);\n this.searchUsers = this.searchUsers.bind(this);\n this.searchGroups = this.searchGroups.bind(this);\n this.onChangeServerType = this.onChangeServerType.bind(this);\n }\n\n onTlscaCertChange(file) {\n this.tlscaCert = file;\n }\n\n $onInit() {\n this.tlscaCert = this.settings.TLSCACert;\n }\n\n onChangeServerType(serverType) {\n this.settingsDrafts[this.settings.ServerType] = this.settings;\n\n if (this.settingsDrafts[serverType]) {\n this.settings = this.settingsDrafts[serverType];\n return;\n }\n\n switch (serverType) {\n case SERVER_TYPES.OPEN_LDAP:\n this.settings = buildOpenLDAPSettingsModel();\n break;\n case SERVER_TYPES.CUSTOM:\n this.settings = buildLdapSettingsModel();\n break;\n }\n }\n\n searchUsers() {\n const settings = {\n ...this.settings,\n SearchSettings: this.settings.SearchSettings.map((search) => ({ ...search, Filter: search.Filter || DEFAULT_USER_FILTER })),\n };\n return this.LDAPService.users(settings);\n }\n\n searchGroups() {\n const settings = {\n ...this.settings,\n GroupSearchSettings: this.settings.GroupSearchSettings.map((search) => ({ ...search, GroupFilter: search.GroupFilter || DEFAULT_GROUP_FILTER })),\n };\n return this.LDAPService.groups(settings);\n }\n}\n","import { EXTERNAL_AUTH_LDAP } from '@/portainer/feature-flags/feature-ids';\nexport default class LdapSettingsCustomController {\n constructor() {\n this.limitedFeatureId = EXTERNAL_AUTH_LDAP;\n }\n\n addLDAPUrl() {\n this.settings.URLs.push('');\n }\n\n removeLDAPUrl(index) {\n this.settings.URLs.splice(index, 1);\n }\n}\n","const autoNgTemplateLoaderTemplate1 = require('./ldap-settings-openldap.html');\n\nimport controller from './ldap-settings-openldap.controller';\n\nexport const ldapSettingsOpenLdap = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n settings: '=',\n tlscaCert: '=',\n state: '=',\n connectivityCheck: '<',\n onTlscaCertChange: '<',\n onSearchUsersClick: '<',\n onSearchGroupsClick: '<',\n onSaveSettings: '<',\n saveButtonState: '<',\n saveButtonDisabled: '<',\n },\n};\n","import { EXTERNAL_AUTH_LDAP } from '@/portainer/feature-flags/feature-ids';\n\nexport default class LdapSettingsOpenLDAPController {\n /* @ngInject */\n constructor() {\n this.domainSuffix = '';\n this.limitedFeatureId = EXTERNAL_AUTH_LDAP;\n\n this.findDomainSuffix = this.findDomainSuffix.bind(this);\n this.parseDomainSuffix = this.parseDomainSuffix.bind(this);\n this.onAccountChange = this.onAccountChange.bind(this);\n }\n\n findDomainSuffix() {\n const serviceAccount = this.settings.ReaderDN;\n let domainSuffix = this.parseDomainSuffix(serviceAccount);\n if (!domainSuffix && this.settings.SearchSettings.length > 0) {\n const searchSettings = this.settings.SearchSettings[0];\n domainSuffix = this.parseDomainSuffix(searchSettings.BaseDN);\n }\n\n this.domainSuffix = domainSuffix;\n }\n\n parseDomainSuffix(string = '') {\n const index = string.toLowerCase().indexOf('dc=');\n return index !== -1 ? string.substring(index) : '';\n }\n\n onAccountChange(serviceAccount) {\n this.domainSuffix = this.parseDomainSuffix(serviceAccount);\n }\n\n addLDAPUrl() {\n this.settings.URLs.push('');\n }\n\n removeLDAPUrl(index) {\n this.settings.URLs.splice(index, 1);\n }\n\n $onInit() {\n this.findDomainSuffix();\n }\n}\n","const autoNgTemplateLoaderTemplate1 = require('./ldap-connectivity-check.html');\n\nexport const ldapConnectivityCheck = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n settings: '<',\n state: '<',\n connectivityCheck: '<',\n limitedFeatureId: '<',\n },\n};\n","const autoNgTemplateLoaderTemplate1 = require('./ldap-groups-datatable.html');\n\nexport const ldapGroupsDatatable = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'GenericDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n },\n};\n","const autoNgTemplateLoaderTemplate1 = require('./ldap-group-search.html');\n\nimport controller from './ldap-group-search.controller';\n\nexport const ldapGroupSearch = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n settings: '=',\n domainSuffix: '@',\n baseFilter: '@',\n\n onSearchClick: '<',\n limitedFeatureId: '<',\n },\n};\n","import _ from 'lodash-es';\n\nexport default class LdapGroupSearchController {\n /* @ngInject */\n constructor($async, Notifications) {\n Object.assign(this, { $async, Notifications });\n\n this.groups = null;\n\n this.onRemoveClick = this.onRemoveClick.bind(this);\n this.onAddClick = this.onAddClick.bind(this);\n this.search = this.search.bind(this);\n }\n\n onAddClick() {\n const lastSetting = _.last(this.settings);\n this.settings.push({ GroupBaseDN: this.domainSuffix, GroupAttribute: lastSetting.GroupAttribute, GroupFilter: this.baseFilter });\n }\n\n onRemoveClick(index) {\n this.settings.splice(index, 1);\n }\n\n search() {\n return this.$async(async () => {\n try {\n this.groups = null;\n this.showTable = true;\n this.groups = await this.onSearchClick();\n } catch (error) {\n this.showTable = false;\n this.Notifications.error('Failure', error, 'Failed to search users');\n }\n });\n }\n}\n","const autoNgTemplateLoaderTemplate1 = require('./ldap-group-search-item.html');\n\nimport controller from './ldap-group-search-item.controller';\n\nexport const ldapGroupSearchItem = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n config: '=',\n index: '<',\n domainSuffix: '@',\n baseFilter: '@',\n\n onRemoveClick: '<',\n limitedFeatureId: '<',\n },\n};\n","export default class LdapSettingsAdGroupSearchItemController {\n /* @ngInject */\n constructor(Notifications) {\n Object.assign(this, { Notifications });\n\n this.groups = [];\n\n this.onChangeBaseDN = this.onChangeBaseDN.bind(this);\n }\n\n onChangeBaseDN(baseDN) {\n this.config.GroupBaseDN = baseDN;\n }\n\n addGroup() {\n this.groups.push({ type: 'ou', value: '' });\n }\n\n removeGroup($index) {\n this.groups.splice($index, 1);\n this.onGroupsChange();\n }\n\n onGroupsChange() {\n const groupsFilter = this.groups.map(({ type, value }) => `(${type}=${value})`).join('');\n this.onFilterChange(groupsFilter ? `(&${this.baseFilter}(|${groupsFilter}))` : `${this.baseFilter}`);\n }\n\n onFilterChange(filter) {\n this.config.GroupFilter = filter;\n }\n\n parseGroupFilter() {\n const match = this.config.GroupFilter.match(/^\\(&\\(objectClass=(\\w+)\\)\\(\\|((\\(\\w+=.+\\))+)\\)\\)$/);\n if (!match) {\n return;\n }\n\n const [, , groupFilter = ''] = match;\n\n this.groups = groupFilter\n .slice(1, -1)\n .split(')(')\n .map((str) => str.split('='))\n .map(([type, value]) => ({ type, value }));\n }\n\n $onInit() {\n this.parseGroupFilter();\n }\n}\n","const autoNgTemplateLoaderTemplate1 = require('./ldap-user-search.html');\n\nimport controller from './ldap-user-search.controller';\n\nexport const ldapUserSearch = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n settings: '=',\n domainSuffix: '@',\n showUsernameFormat: '<',\n baseFilter: '@',\n limitedFeatureId: '<',\n\n onSearchClick: '<',\n },\n};\n","import _ from 'lodash';\n\nexport default class LdapUserSearchController {\n /* @ngInject */\n constructor($async, Notifications) {\n Object.assign(this, { $async, Notifications });\n\n this.users = null;\n this.showTable = false;\n\n this.onRemoveClick = this.onRemoveClick.bind(this);\n this.onAddClick = this.onAddClick.bind(this);\n this.search = this.search.bind(this);\n }\n\n onAddClick() {\n const lastSetting = _.last(this.settings);\n this.settings.push({ BaseDN: this.domainSuffix, UserNameAttribute: lastSetting.UserNameAttribute, Filter: this.baseFilter });\n }\n\n onRemoveClick(index) {\n this.settings.splice(index, 1);\n }\n\n search() {\n return this.$async(async () => {\n try {\n this.users = null;\n this.showTable = true;\n const users = await this.onSearchClick();\n this.users = _.compact(users);\n } catch (error) {\n this.Notifications.error('Failure', error, 'Failed to search users');\n this.showTable = false;\n }\n });\n }\n}\n","const autoNgTemplateLoaderTemplate1 = require('./ldap-user-search-item.html');\n\nimport controller from './ldap-user-search-item.controller';\n\nexport const ldapUserSearchItem = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n config: '=',\n index: '<',\n showUsernameFormat: '<',\n domainSuffix: '@',\n baseFilter: '@',\n onRemoveClick: '<',\n limitedFeatureId: '<',\n },\n};\n","export default class LdapUserSearchItemController {\n /* @ngInject */\n constructor() {\n this.groups = [];\n\n this.onBaseDNChange = this.onBaseDNChange.bind(this);\n this.onGroupChange = this.onGroupChange.bind(this);\n this.onGroupsChange = this.onGroupsChange.bind(this);\n this.removeGroup = this.removeGroup.bind(this);\n }\n\n onBaseDNChange(baseDN) {\n this.config.BaseDN = baseDN;\n }\n\n onGroupChange(index, group) {\n this.groups[index] = group;\n this.onGroupsChange(this.groups);\n }\n\n onGroupsChange(groups) {\n this.config.Filter = this.generateUserFilter(groups);\n }\n\n removeGroup(index) {\n this.groups.splice(index, 1);\n this.onGroupsChange(this.groups);\n }\n\n addGroup() {\n this.groups.push(this.domainSuffix ? `cn=,${this.domainSuffix}` : 'cn=');\n }\n\n generateUserFilter(groups) {\n const filteredGroups = groups.filter((group) => group !== this.domainSuffix);\n\n if (!filteredGroups.length) {\n return this.baseFilter;\n }\n\n const groupsFilter = filteredGroups.map((group) => `(memberOf=${group})`);\n\n return `(&${this.baseFilter}${groupsFilter.length > 1 ? `(|${groupsFilter.join('')})` : groupsFilter[0]})`;\n }\n\n parseFilter() {\n const filter = this.config.Filter;\n if (filter === this.baseFilter) {\n return;\n }\n\n if (!filter.includes('|')) {\n const index = filter.indexOf('memberOf=');\n if (index > -1) {\n this.groups = [filter.slice(index + 9, -2)];\n }\n return;\n }\n\n const members = filter.slice(filter.indexOf('|') + 2, -3);\n this.groups = members.split(')(').map((member) => member.replace('memberOf=', ''));\n }\n\n $onInit() {\n this.parseFilter();\n }\n}\n","const autoNgTemplateLoaderTemplate1 = require('./ldap-settings-dn-builder.html');\n\nimport controller from './ldap-settings-dn-builder.controller';\n\nexport const ldapSettingsDnBuilder = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n // ngModel: string (dc=,cn=,)\n ngModel: '<',\n // onChange(string) => void\n onChange: '<',\n // suffix: string (dc=,dc=,)\n suffix: '@',\n label: '@',\n limitedFeatureId: '<',\n },\n};\n","export default class LdapSettingsBaseDnBuilderController {\n /* @ngInject */\n constructor() {\n this.entries = [];\n }\n\n addEntry() {\n this.entries.push({ type: 'ou', value: '' });\n }\n\n removeEntry($index) {\n this.entries.splice($index, 1);\n this.onEntriesChange();\n }\n\n moveUp($index) {\n if ($index <= 0) {\n return;\n }\n arrayMove(this.entries, $index, $index - 1);\n this.onEntriesChange();\n }\n\n moveDown($index) {\n if ($index >= this.entries.length - 1) {\n return;\n }\n arrayMove(this.entries, $index, $index + 1);\n this.onEntriesChange();\n }\n\n onEntriesChange() {\n const dn = this.entries\n .filter(({ value }) => value)\n .map(({ type, value }) => `${type}=${value}`)\n .concat(this.suffix)\n .filter((value) => value)\n .join(',');\n\n this.onChange(dn);\n }\n\n getOUValues(dn, domainSuffix = '') {\n const regex = /(\\w+)=(\\w*),?/;\n let ouValues = [];\n let left = dn;\n let match = left.match(regex);\n while (match && left !== domainSuffix) {\n const [, type, value] = match;\n ouValues.push({ type, value });\n left = left.replace(regex, '');\n match = left.match(/(\\w+)=(\\w+),?/);\n }\n return ouValues;\n }\n\n parseBaseDN() {\n this.entries = this.getOUValues(this.ngModel, this.suffix);\n }\n\n $onChanges({ suffix, ngModel }) {\n if ((!suffix && !ngModel) || (suffix && suffix.isFirstChange())) {\n return;\n }\n this.onEntriesChange();\n }\n\n $onInit() {\n this.parseBaseDN();\n }\n}\n\nfunction arrayMove(array, fromIndex, toIndex) {\n if (!checkValidIndex(array, fromIndex) || !checkValidIndex(array, toIndex)) {\n throw new Error('index is out of bounds');\n }\n const [item] = array.splice(fromIndex, 1);\n\n array.splice(toIndex, 0, item);\n\n function checkValidIndex(array, index) {\n return index >= 0 && index <= array.length;\n }\n}\n","const autoNgTemplateLoaderTemplate1 = require('./ldap-settings-group-dn-builder.html');\n\nimport controller from './ldap-settings-group-dn-builder.controller';\n\nexport const ldapSettingsGroupDnBuilder = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n // ngModel: string (dc=,cn=,)\n ngModel: '<',\n // onChange(string) => void\n onChange: '<',\n // suffix: string (dc=,dc=,)\n suffix: '@',\n // index: int >= 0\n index: '<',\n onRemoveClick: '<',\n limitedFeatureId: '<',\n },\n};\n","export default class LdapSettingsGroupDnBuilderController {\n /* @ngInject */\n constructor() {\n this.groupName = '';\n this.entries = '';\n\n this.onEntriesChange = this.onEntriesChange.bind(this);\n this.onGroupNameChange = this.onGroupNameChange.bind(this);\n this.onGroupChange = this.onGroupChange.bind(this);\n this.removeGroup = this.removeGroup.bind(this);\n }\n\n onEntriesChange(entries) {\n this.onGroupChange(this.groupName, entries);\n }\n\n onGroupNameChange() {\n this.onGroupChange(this.groupName, this.entries);\n }\n\n onGroupChange(groupName, entries) {\n if (!groupName) {\n return;\n }\n const groupNameEntry = `cn=${groupName}`;\n this.onChange(this.index, entries || this.suffix ? `${groupNameEntry},${entries || this.suffix}` : groupNameEntry);\n }\n\n removeGroup() {\n this.onRemoveClick(this.index);\n }\n\n parseEntries(value, suffix) {\n if (value === suffix) {\n this.groupName = '';\n this.entries = suffix;\n return;\n }\n\n const [groupName, entries] = this.ngModel.split(/,(.+)/);\n this.groupName = groupName.replace('cn=', '');\n this.entries = entries || '';\n }\n\n $onChange({ ngModel, suffix }) {\n if ((!suffix || suffix.isFirstChange()) && !ngModel) {\n return;\n }\n this.parseEntries(ngModel.value, suffix.value);\n }\n\n $onInit() {\n this.parseEntries(this.ngModel, this.suffix);\n }\n}\n","const autoNgTemplateLoaderTemplate1 = require('./ldap-custom-group-search.html');\n\nimport controller from './ldap-custom-group-search.controller';\n\nexport const ldapCustomGroupSearch = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n settings: '=',\n onSearchClick: '<',\n limitedFeatureId: '<',\n },\n};\n","export default class LdapCustomGroupSearchController {\n /* @ngInject */\n constructor($async, Notifications) {\n Object.assign(this, { $async, Notifications });\n\n this.groups = null;\n this.showTable = false;\n\n this.onRemoveClick = this.onRemoveClick.bind(this);\n this.onAddClick = this.onAddClick.bind(this);\n this.search = this.search.bind(this);\n }\n\n onAddClick() {\n this.settings.push({ GroupBaseDN: '', GroupAttribute: '', GroupFilter: '' });\n }\n\n onRemoveClick(index) {\n this.settings.splice(index, 1);\n }\n\n search() {\n return this.$async(async () => {\n try {\n this.groups = null;\n this.showTable = true;\n this.groups = await this.onSearchClick();\n } catch (error) {\n this.showTable = false;\n this.Notifications.error('Failure', error, 'Failed to search users');\n }\n });\n }\n}\n","export default class LdapCustomAdminGroupController {\n /* @ngInject */\n constructor($async, Notifications, LDAPService) {\n Object.assign(this, { $async, Notifications, LDAPService });\n\n this.groups = null;\n this.groupstest = null;\n this.enableAssignAdminGroup = false;\n\n this.onRemoveClick = this.onRemoveClick.bind(this);\n this.onAddClick = this.onAddClick.bind(this);\n this.search = this.search.bind(this);\n }\n\n onAddClick() {\n this.settings.AdminGroupSearchSettings.push({ GroupBaseDN: '', GroupAttribute: '', GroupFilter: '' });\n }\n\n onRemoveClick(index) {\n this.settings.AdminGroupSearchSettings.splice(index, 1);\n }\n\n search() {\n return this.$async(async () => {\n try {\n this.groups = null;\n this.groups = await this.onSearchClick();\n this.enableAssignAdminGroup = this.groups && this.groups.length > 0;\n } catch (error) {\n this.Notifications.error('Failure', error, 'Failed to search groups');\n }\n });\n }\n\n async $onInit() {\n if (this.settings.AdminAutoPopulate && this.settings.AdminGroups && this.settings.AdminGroups.length > 0) {\n const settings = {\n ...this.settings,\n AdminGroupSearchSettings: this.settings.AdminGroupSearchSettings.map((search) => ({ ...search, GroupFilter: search.GroupFilter || this.defaultAdminGroupSearchFilter })),\n };\n\n this.groups = await this.LDAPService.adminGroups(settings);\n }\n\n if (this.groups && this.groups.length > 0) {\n this.enableAssignAdminGroup = true;\n }\n }\n}\n","const autoNgTemplateLoaderTemplate1 = require('./ldap-settings-security.html');\n\nexport const ldapSettingsSecurity = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n settings: '=',\n tlscaCert: '<',\n onTlscaCertChange: '<',\n uploadInProgress: '<',\n title: '@',\n limitedFeatureId: '<',\n },\n};\n","const TEST_STATUS = {\n LOADING: 'LOADING',\n SUCCESS: 'SUCCESS',\n FAILURE: 'FAILURE',\n};\n\nexport default class LdapSettingsTestLogin {\n /* @ngInject */\n constructor($async, LDAPService, Notifications) {\n Object.assign(this, { $async, LDAPService, Notifications });\n\n this.TEST_STATUS = TEST_STATUS;\n\n this.state = {\n testStatus: '',\n };\n }\n\n async testLogin(username, password) {\n return this.$async(async () => {\n this.state.testStatus = TEST_STATUS.LOADING;\n try {\n const response = await this.LDAPService.testLogin(this.settings, username, password);\n this.state.testStatus = response.valid ? TEST_STATUS.SUCCESS : TEST_STATUS.FAILURE;\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to test login');\n this.state.testStatus = TEST_STATUS.FAILURE;\n }\n });\n }\n}\n","const autoNgTemplateLoaderTemplate1 = require('./ldap-custom-user-search.html');\n\nimport controller from './ldap-custom-user-search.controller';\n\nexport const ldapCustomUserSearch = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n settings: '=',\n onSearchClick: '<',\n limitedFeatureId: '<',\n },\n};\n","export default class LdapCustomUserSearchController {\n /* @ngInject */\n constructor($async, Notifications) {\n Object.assign(this, { $async, Notifications });\n\n this.users = null;\n\n this.onRemoveClick = this.onRemoveClick.bind(this);\n this.onAddClick = this.onAddClick.bind(this);\n this.search = this.search.bind(this);\n }\n\n onAddClick() {\n this.settings.push({ BaseDN: '', UserNameAttribute: '', Filter: '' });\n }\n\n onRemoveClick(index) {\n this.settings.splice(index, 1);\n }\n\n search() {\n return this.$async(async () => {\n try {\n this.users = null;\n this.showTable = true;\n this.users = await this.onSearchClick();\n } catch (error) {\n this.showTable = false;\n this.Notifications.error('Failure', error, 'Failed to search users');\n }\n });\n }\n}\n","const autoNgTemplateLoaderTemplate1 = require('./ldap-users-datatable.html');\n\nexport const ldapUsersDatatable = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'GenericDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n },\n};\n","/* @ngInject */\nexport function LDAPService(LDAP) {\n return { users, groups, check, testLogin };\n\n function users(ldapSettings) {\n return LDAP.users({ ldapSettings }).$promise;\n }\n\n async function groups(ldapSettings) {\n const userGroups = await LDAP.groups({ ldapSettings }).$promise;\n return userGroups.map(({ Name, Groups }) => {\n let name = Name;\n if (Name.includes(',') && Name.includes('=')) {\n const [cnName] = Name.split(',');\n const split = cnName.split('=');\n name = split[1];\n }\n return { Groups, Name: name };\n });\n }\n\n function check(ldapSettings) {\n return LDAP.check({ ldapSettings }).$promise;\n }\n\n function testLogin(ldapSettings, username, password) {\n return LDAP.testLogin({ ldapSettings, username, password }).$promise;\n }\n}\n","const API_ENDPOINT_LDAP = 'api/ldap';\n\n/* @ngInject */\nexport function LDAP($resource) {\n return $resource(\n `${API_ENDPOINT_LDAP}/:action`,\n {},\n {\n check: { method: 'POST', params: { action: 'check' } },\n users: { method: 'POST', isArray: true, params: { action: 'users' } },\n groups: { method: 'POST', isArray: true, params: { action: 'groups' } },\n testLogin: { method: 'POST', params: { action: 'test' } },\n }\n );\n}\n","const autoNgTemplateLoaderTemplate1 = require('./auto-user-provision-toggle.html');\n\nexport const autoUserProvisionToggle = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n transclude: {\n description: 'fieldDescription',\n },\n bindings: {\n ngModel: '=',\n },\n};\n","const autoNgTemplateLoaderTemplate1 = require('./save-auth-settings-button.html');\n\nexport const saveAuthSettingsButton = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n onSaveSettings: '<',\n saveButtonDisabled: '<',\n saveButtonState: '<',\n limitedFeatureId: '<',\n limitedFeatureClass: '<',\n className: '<',\n },\n};\n","const autoNgTemplateLoaderTemplate1 = require('./internal-auth.html');\n\nexport const internalAuth = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n onSaveSettings: '<',\n saveButtonState: '<',\n },\n};\n","import angular from 'angular';\n\nimport { sslCertificate } from './ssl-certificate';\n\nexport default angular.module('portainer.settings.general', []).component('sslCertificateSettings', sslCertificate).name;\n","const autoNgTemplateLoaderTemplate1 = require('./ssl-certificate.html');\n\nimport controller from './ssl-certificate.controller.js';\n\nexport const sslCertificate = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n};\n","class SslCertificateController {\n /* @ngInject */\n constructor($async, $state, SSLService, Notifications) {\n Object.assign(this, { $async, $state, SSLService, Notifications });\n\n this.cert = null;\n this.originalValues = {\n forceHTTPS: false,\n certFile: null,\n keyFile: null,\n };\n\n this.formValues = {\n certFile: null,\n keyFile: null,\n forceHTTPS: false,\n };\n\n this.state = {\n actionInProgress: false,\n reloadingPage: false,\n };\n\n const pemPattern = '.pem';\n this.certFilePattern = `${pemPattern},.crt,.cer,.cert`;\n this.keyFilePattern = `${pemPattern},.key`;\n\n this.save = this.save.bind(this);\n }\n\n isFormChanged() {\n return Object.entries(this.originalValues).some(([key, value]) => value != this.formValues[key]);\n }\n\n async save() {\n return this.$async(async () => {\n this.state.actionInProgress = true;\n try {\n const cert = this.formValues.certFile ? await this.formValues.certFile.text() : null;\n const key = this.formValues.keyFile ? await this.formValues.keyFile.text() : null;\n const httpEnabled = !this.formValues.forceHTTPS;\n await this.SSLService.upload(httpEnabled, cert, key);\n\n await new Promise((resolve) => setTimeout(resolve, 2000));\n location.reload();\n this.state.reloadingPage = true;\n } catch (err) {\n this.Notifications.error('Failure', err, 'Failed applying changes');\n }\n this.state.actionInProgress = false;\n });\n }\n\n wasHTTPsChanged() {\n return this.originalValues.forceHTTPS !== this.formValues.forceHTTPS;\n }\n\n async $onInit() {\n return this.$async(async () => {\n try {\n const certInfo = await this.SSLService.get();\n\n this.formValues.forceHTTPS = !certInfo.httpEnabled;\n this.originalValues.forceHTTPS = this.formValues.forceHTTPS;\n } catch (err) {\n this.Notifications.error('Failure', err, 'Failed loading certificate info');\n }\n });\n }\n}\n\nexport default SslCertificateController;\n","import _ from 'lodash-es';\n\nimport { STATES } from '@/portainer/feature-flags/enums';\n\nconst BASENAME = 'limitedFeature';\n\n/* @ngInject */\nexport function limitedFeatureDirective(featureService) {\n return {\n restrict: 'A',\n link,\n };\n\n function link(scope, elem, attrs) {\n const { limitedFeatureDir: featureId } = attrs;\n\n if (!featureId) {\n return;\n }\n\n const limitedFeatureAttrs = Object.keys(attrs)\n .filter((attr) => attr.startsWith(BASENAME) && attr !== `${BASENAME}Dir`)\n .map((attr) => [_.kebabCase(attr.replace(BASENAME, '')), attrs[attr]]);\n\n const state = featureService.selectShow(featureId);\n\n if (state === STATES.HIDDEN) {\n elem.hide();\n return;\n }\n\n if (state === STATES.VISIBLE) {\n return;\n }\n\n limitedFeatureAttrs.forEach(([attr, value = attr]) => {\n const currentValue = elem.attr(attr) || '';\n elem.attr(attr, `${currentValue} ${value}`.trim());\n });\n }\n}\n","import { EDITIONS, STATES } from './enums';\n\nimport * as FEATURE_IDS from './feature-ids';\n\nexport function featureService() {\n const state = {\n currentEdition: undefined,\n features: {},\n };\n\n return {\n selectShow,\n init,\n isLimitedToBE,\n };\n\n async function init() {\n // will be loaded on runtime\n const currentEdition = EDITIONS.CE;\n const features = {\n [FEATURE_IDS.K8S_RESOURCE_POOL_LB_QUOTA]: EDITIONS.BE,\n [FEATURE_IDS.K8S_RESOURCE_POOL_STORAGE_QUOTA]: EDITIONS.BE,\n [FEATURE_IDS.ACTIVITY_AUDIT]: EDITIONS.BE,\n [FEATURE_IDS.EXTERNAL_AUTH_LDAP]: EDITIONS.BE,\n [FEATURE_IDS.HIDE_INTERNAL_AUTH]: EDITIONS.BE,\n [FEATURE_IDS.HIDE_INTERNAL_AUTHENTICATION_PROMPT]: EDITIONS.BE,\n [FEATURE_IDS.K8S_SETUP_DEFAULT]: EDITIONS.BE,\n [FEATURE_IDS.RBAC_ROLES]: EDITIONS.BE,\n [FEATURE_IDS.REGISTRY_MANAGEMENT]: EDITIONS.BE,\n [FEATURE_IDS.S3_BACKUP_SETTING]: EDITIONS.BE,\n [FEATURE_IDS.TEAM_MEMBERSHIP]: EDITIONS.BE,\n [FEATURE_IDS.HIDE_AUTO_UPDATE_WINDOW]: EDITIONS.BE,\n [FEATURE_IDS.FORCE_REDEPLOYMENT]: EDITIONS.BE,\n };\n\n state.currentEdition = currentEdition;\n state.features = features;\n }\n\n function selectShow(featureId) {\n if (!state.features[featureId]) {\n return STATES.HIDDEN;\n }\n\n if (state.features[featureId] <= state.currentEdition) {\n return STATES.VISIBLE;\n }\n\n if (state.features[featureId] === EDITIONS.BE) {\n return STATES.LIMITED_BE;\n }\n\n return STATES.HIDDEN;\n }\n\n function isLimitedToBE(featureId) {\n return selectShow(featureId) === STATES.LIMITED_BE;\n }\n}\n","import angular from 'angular';\n\nimport authLogsViewModule from './auth-logs-view';\nimport activityLogsViewModule from './activity-logs-view';\n\nexport default angular.module('portainer.app.user-activity', [authLogsViewModule, activityLogsViewModule]).config(config).name;\n\n/* @ngInject */\nfunction config($stateRegistryProvider) {\n $stateRegistryProvider.register({\n name: 'portainer.authLogs',\n url: '/auth-logs',\n views: {\n 'content@': {\n component: 'authLogsView',\n },\n },\n });\n\n $stateRegistryProvider.register({\n name: 'portainer.activityLogs',\n url: '/activity-logs',\n views: {\n 'content@': {\n component: 'activityLogsView',\n },\n },\n });\n}\n","import angular from 'angular';\n\nimport { authLogsView } from './auth-logs-view';\nimport { authLogsDatatable } from './auth-logs-datatable';\n\nexport default angular.module('portainer.app.user-activity.auth-logs-view', []).component('authLogsView', authLogsView).component('authLogsDatatable', authLogsDatatable).name;\n","const autoNgTemplateLoaderTemplate1 = require('./auth-logs-view.html');\n\nimport controller from './auth-logs-view.controller.js';\n\nexport const authLogsView = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n};\n","import moment from 'moment';\nimport { ACTIVITY_AUDIT } from '@/portainer/feature-flags/feature-ids';\n\nexport default class AuthLogsViewController {\n /* @ngInject */\n constructor($async, Notifications) {\n this.$async = $async;\n this.Notifications = Notifications;\n\n this.limitedFeature = ACTIVITY_AUDIT;\n this.state = {\n keyword: 'f',\n date: {\n from: 0,\n to: 0,\n },\n sort: {\n key: 'Timestamp',\n desc: true,\n },\n contextFilter: [1, 2, 3],\n typeFilter: [1, 2, 3],\n page: 1,\n limit: 10,\n totalItems: 0,\n logs: null,\n };\n\n this.today = moment().endOf('day');\n this.minValidDate = moment().subtract(7, 'd').startOf('day');\n\n this.onChangeDate = this.onChangeDate.bind(this);\n this.onChangeKeyword = this.onChangeKeyword.bind(this);\n this.onChangeSort = this.onChangeSort.bind(this);\n this.onChangeContextFilter = this.onChangeContextFilter.bind(this);\n this.onChangeTypeFilter = this.onChangeTypeFilter.bind(this);\n this.loadLogs = this.loadLogs.bind(this);\n this.onChangePage = this.onChangePage.bind(this);\n this.onChangeLimit = this.onChangeLimit.bind(this);\n }\n\n onChangePage(page) {\n this.state.page = page;\n this.loadLogs();\n }\n\n onChangeLimit(limit) {\n this.state.page = 1;\n this.state.limit = limit;\n this.loadLogs();\n }\n\n onChangeSort(sort) {\n this.state.page = 1;\n this.state.sort = sort;\n this.loadLogs();\n }\n\n onChangeContextFilter(filterKey, filterState) {\n this.state.contextFilter = filterState;\n this.loadLogs();\n }\n\n onChangeTypeFilter(filterKey, filterState) {\n this.state.typeFilter = filterState;\n this.loadLogs();\n }\n\n onChangeKeyword(keyword) {\n this.state.page = 1;\n this.state.keyword = keyword;\n this.loadLogs();\n }\n\n onChangeDate({ startDate, endDate }) {\n this.state.page = 1;\n this.state.date = { to: endDate, from: startDate };\n this.loadLogs();\n }\n\n async loadLogs() {\n return this.$async(async () => {\n this.state.logs = null;\n try {\n const { logs, totalCount } = { logs: [{}, {}, {}, {}, {}], totalCount: 5 };\n this.state.logs = decorateLogs(logs);\n this.state.totalItems = totalCount;\n } catch (err) {\n this.Notifications.error('Failure', err, 'Failed loading auth activity logs');\n }\n });\n }\n\n $onInit() {\n return this.$async(async () => {\n this.loadLogs();\n });\n }\n}\n\nfunction decorateLogs(logs) {\n return logs;\n}\n","const autoNgTemplateLoaderTemplate1 = require('./auth-logs-datatable.html');\n\nimport controller from './auth-logs-datatable.controller';\n\nexport const authLogsDatatable = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n logs: '<',\n keyword: '<',\n sort: '<',\n limit: '<',\n totalItems: '<',\n currentPage: '<',\n contextFilter: '<',\n typeFilter: '<',\n feature: '@',\n\n onChangeContextFilter: '<',\n onChangeTypeFilter: '<',\n onChangeKeyword: '<',\n onChangeSort: '<',\n\n onChangeLimit: '<',\n onChangePage: '<',\n },\n};\n","import { authenticationMethodTypesMap, authenticationMethodTypesLabels } from '@/portainer/settings/authentication/auth-method-constants';\nimport { authenticationActivityTypesMap, authenticationActivityTypesLabels } from '@/portainer/settings/authentication/auth-type-constants';\n\nclass ActivityLogsDatatableController {\n /* @ngInject */\n constructor($controller, $scope, PaginationService) {\n this.PaginationService = PaginationService;\n\n this.tableKey = 'authLogs';\n\n this.contextFilterLabels = Object.values(authenticationMethodTypesMap).map((value) => ({ value, label: authenticationMethodTypesLabels[value] }));\n this.typeFilterLabels = Object.values(authenticationActivityTypesMap).map((value) => ({ value, label: authenticationActivityTypesLabels[value] }));\n\n const $onInit = this.$onInit;\n angular.extend(this, $controller('GenericDatatableController', { $scope }));\n this.$onInit = $onInit.bind(this);\n\n this.changeSort = this.changeSort.bind(this);\n this.handleChangeLimit = this.handleChangeLimit.bind(this);\n }\n\n changeSort(key) {\n let desc = false;\n if (key === this.sort.key) {\n desc = !this.sort.desc;\n }\n\n this.onChangeSort({ key, desc });\n }\n\n contextType(context) {\n if (!(context in authenticationMethodTypesLabels)) {\n return '';\n }\n return authenticationMethodTypesLabels[context];\n }\n\n activityType(type) {\n if (!(type in authenticationActivityTypesLabels)) {\n return '';\n }\n return authenticationActivityTypesLabels[type];\n }\n\n isAuthSuccess(type) {\n return type === authenticationActivityTypesMap.AuthSuccess;\n }\n\n isAuthFailure(type) {\n return type === authenticationActivityTypesMap.AuthFailure;\n }\n\n handleChangeLimit(limit) {\n this.PaginationService.setPaginationLimit(this.tableKey, limit);\n this.onChangeLimit(limit);\n }\n\n $onInit() {\n this.$onInitGeneric();\n\n const limit = this.PaginationService.getPaginationLimit(this.tableKey);\n if (limit) {\n this.handleChangeLimit(+limit);\n }\n }\n}\n\nexport default ActivityLogsDatatableController;\n","import angular from 'angular';\n\nimport { activityLogsView } from './activity-logs-view';\nimport { activityLogsDatatable } from './activity-logs-datatable';\n\nexport default angular\n .module('portainer.app.user-activity.activity-logs-view', [])\n .component('activityLogsDatatable', activityLogsDatatable)\n .component('activityLogsView', activityLogsView).name;\n","const autoNgTemplateLoaderTemplate1 = require('./activity-logs-view.html');\n\nimport controller from './activity-logs-view.controller.js';\n\nexport const activityLogsView = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n};\n","import moment from 'moment';\nimport { ACTIVITY_AUDIT } from '@/portainer/feature-flags/feature-ids';\nexport default class ActivityLogsViewController {\n /* @ngInject */\n constructor($async, Notifications) {\n this.$async = $async;\n this.Notifications = Notifications;\n this.limitedFeature = ACTIVITY_AUDIT;\n this.state = {\n keyword: '',\n date: {\n from: 0,\n to: 0,\n },\n sort: {\n key: 'Timestamp',\n desc: true,\n },\n page: 1,\n limit: 10,\n totalItems: 0,\n logs: null,\n };\n\n this.today = moment().endOf('day');\n this.minValidDate = moment().subtract(7, 'd').startOf('day');\n\n this.onChangeDate = this.onChangeDate.bind(this);\n this.onChangeKeyword = this.onChangeKeyword.bind(this);\n this.onChangeSort = this.onChangeSort.bind(this);\n this.loadLogs = this.loadLogs.bind(this);\n this.onChangePage = this.onChangePage.bind(this);\n this.onChangeLimit = this.onChangeLimit.bind(this);\n }\n\n onChangePage(page) {\n this.state.page = page;\n this.loadLogs();\n }\n\n onChangeLimit(limit) {\n this.state.page = 1;\n this.state.limit = limit;\n this.loadLogs();\n }\n\n onChangeSort(sort) {\n this.state.page = 1;\n this.state.sort = sort;\n this.loadLogs();\n }\n\n onChangeKeyword(keyword) {\n this.state.page = 1;\n this.state.keyword = keyword;\n this.loadLogs();\n }\n\n onChangeDate({ startDate, endDate }) {\n this.state.page = 1;\n this.state.date = { to: endDate, from: startDate };\n this.loadLogs();\n }\n\n async export() {\n return this.$async(async () => {\n try {\n await this.UserActivityService.saveLogsAsCSV(this.state.sort, this.state.keyword, this.state.date, this.state.contextFilter);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Failed loading user activity logs csv');\n }\n });\n }\n\n async loadLogs() {\n return this.$async(async () => {\n this.state.logs = null;\n try {\n const { logs, totalCount } = { logs: [{}, {}, {}, {}, {}], totalCount: 5 };\n this.state.logs = logs;\n this.state.totalItems = totalCount;\n } catch (err) {\n this.Notifications.error('Failure', err, 'Failed loading user activity logs');\n }\n });\n }\n\n $onInit() {\n return this.$async(async () => {\n this.loadLogs();\n });\n }\n}\n","export default class ActivityLogsDatatableController {\n /* @ngInject */\n constructor($controller, $scope, PaginationService) {\n this.PaginationService = PaginationService;\n\n this.tableKey = 'authLogs';\n\n const $onInit = this.$onInit;\n angular.extend(this, $controller('GenericDatatableController', { $scope }));\n\n this.changeSort = this.changeSort.bind(this);\n this.handleChangeLimit = this.handleChangeLimit.bind(this);\n this.$onInit = $onInit.bind(this);\n }\n\n changeSort(key) {\n let desc = false;\n if (key === this.sort.key) {\n desc = !this.sort.desc;\n }\n\n this.onChangeSort({ key, desc });\n }\n\n handleChangeLimit(limit) {\n this.PaginationService.setPaginationLimit(this.tableKey, limit);\n this.onChangeLimit(limit);\n }\n\n $onInit() {\n this.$onInitGeneric();\n\n const limit = this.PaginationService.getPaginationLimit(this.tableKey);\n if (limit) {\n this.onChangeLimit(+limit);\n }\n }\n}\n","export class FileUploaderController {\n /* @ngInject */\n constructor($async) {\n Object.assign(this, { $async });\n\n this.state = {\n uploadInProgress: false,\n };\n\n this.onFileSelected = this.onFileSelected.bind(this);\n this.onFileSelectedAsync = this.onFileSelectedAsync.bind(this);\n }\n\n onFileSelected(file) {\n return this.$async(this.onFileSelectedAsync, file);\n }\n\n async onFileSelectedAsync(file) {\n if (!file) {\n return;\n }\n\n this.state.uploadInProgress = true;\n try {\n await this.uploadFile(file);\n } finally {\n this.state.uploadInProgress = false;\n }\n }\n}\n","import _ from 'lodash-es';\n\nconst ROOT_PATH = '/host';\n\nexport class HostBrowserController {\n /* @ngInject */\n constructor($async, HostBrowserService, Notifications, FileSaver, ModalService) {\n Object.assign(this, { $async, HostBrowserService, Notifications, FileSaver, ModalService });\n\n this.state = {\n path: ROOT_PATH,\n };\n\n this.goToParent = this.goToParent.bind(this);\n this.browse = this.browse.bind(this);\n this.confirmDeleteFile = this.confirmDeleteFile.bind(this);\n this.isRoot = this.isRoot.bind(this);\n this.getRelativePath = this.getRelativePath.bind(this);\n this.getFilesForPath = this.getFilesForPath.bind(this);\n this.getFilesForPathAsync = this.getFilesForPathAsync.bind(this);\n this.downloadFile = this.downloadFile.bind(this);\n this.downloadFileAsync = this.downloadFileAsync.bind(this);\n this.renameFile = this.renameFile.bind(this);\n this.renameFileAsync = this.renameFileAsync.bind(this);\n this.deleteFile = this.deleteFile.bind(this);\n this.deleteFileAsync = this.deleteFileAsync.bind(this);\n this.onFileSelectedForUpload = this.onFileSelectedForUpload.bind(this);\n this.onFileSelectedForUploadAsync = this.onFileSelectedForUploadAsync.bind(this);\n }\n\n getRelativePath(path) {\n path = path || this.state.path;\n const rootPathRegex = new RegExp(`^${ROOT_PATH}/?`);\n const relativePath = path.replace(rootPathRegex, '/');\n return relativePath;\n }\n\n goToParent() {\n this.getFilesForPath(this.parentPath(this.state.path));\n }\n\n isRoot() {\n return this.state.path === ROOT_PATH;\n }\n\n browse(folder) {\n this.getFilesForPath(this.buildPath(this.state.path, folder));\n }\n\n getFilesForPath(path) {\n return this.$async(this.getFilesForPathAsync, path);\n }\n async getFilesForPathAsync(path) {\n try {\n const files = await this.HostBrowserService.ls(path);\n this.state.path = path;\n this.files = files;\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to browse');\n }\n }\n\n renameFile(name, newName) {\n return this.$async(this.renameFileAsync, name, newName);\n }\n async renameFileAsync(name, newName) {\n const filePath = this.buildPath(this.state.path, name);\n const newFilePath = this.buildPath(this.state.path, newName);\n try {\n await this.HostBrowserService.rename(filePath, newFilePath);\n this.Notifications.success('File successfully renamed', this.getRelativePath(newFilePath));\n const files = await this.HostBrowserService.ls(this.state.path);\n this.files = files;\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to rename file');\n }\n }\n\n downloadFile(fileName) {\n return this.$async(this.downloadFileAsync, fileName);\n }\n async downloadFileAsync(fileName) {\n const filePath = this.buildPath(this.state.path, fileName);\n try {\n const { file } = await this.HostBrowserService.get(filePath);\n const downloadData = new Blob([file], {\n type: 'text/plain;charset=utf-8',\n });\n this.FileSaver.saveAs(downloadData, fileName);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to download file');\n }\n }\n\n confirmDeleteFile(name) {\n const filePath = this.buildPath(this.state.path, name);\n\n this.ModalService.confirmDeletion(`Are you sure that you want to delete ${this.getRelativePath(filePath)} ?`, (confirmed) => {\n if (!confirmed) {\n return;\n }\n return this.deleteFile(filePath);\n });\n }\n\n deleteFile(path) {\n this.$async(this.deleteFileAsync, path);\n }\n async deleteFileAsync(path) {\n try {\n await this.HostBrowserService.delete(path);\n this.Notifications.success('File successfully deleted', this.getRelativePath(path));\n const files = await this.HostBrowserService.ls(this.state.path);\n this.files = files;\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to delete file');\n }\n }\n\n $onInit() {\n this.getFilesForPath(ROOT_PATH);\n }\n\n parentPath(path) {\n if (path === ROOT_PATH) {\n return ROOT_PATH;\n }\n\n const split = _.split(path, '/');\n return _.join(_.slice(split, 0, split.length - 1), '/');\n }\n\n buildPath(parent, file) {\n if (parent.lastIndexOf('/') === parent.length - 1) {\n return parent + file;\n }\n return parent + '/' + file;\n }\n\n onFileSelectedForUpload(file) {\n return this.$async(this.onFileSelectedForUploadAsync, file);\n }\n async onFileSelectedForUploadAsync(file) {\n try {\n await this.HostBrowserService.upload(this.state.path, file);\n this.onFileUploaded();\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to upload file');\n }\n }\n\n onFileUploaded() {\n this.refreshList();\n }\n\n refreshList() {\n this.getFilesForPath(this.state.path);\n }\n}\n","export class NodeSelectorController {\n /* @ngInject */\n constructor(AgentService, Notifications) {\n Object.assign(this, { AgentService, Notifications });\n }\n\n async $onInit() {\n try {\n const agents = await this.AgentService.agents();\n this.agents = agents;\n if (!this.model) {\n this.model = agents[0].NodeName;\n }\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to load agents');\n }\n }\n}\n","import _ from 'lodash-es';\n\nexport class VolumeBrowserController {\n /* @ngInject */\n constructor($async, HttpRequestHelper, VolumeBrowserService, FileSaver, Blob, ModalService, Notifications) {\n Object.assign(this, { $async, HttpRequestHelper, VolumeBrowserService, FileSaver, Blob, ModalService, Notifications });\n this.state = {\n path: '/',\n };\n\n this.rename = this.rename.bind(this);\n this.renameAsync = this.renameAsync.bind(this);\n this.confirmDelete = this.confirmDelete.bind(this);\n this.download = this.download.bind(this);\n this.downloadAsync = this.downloadAsync.bind(this);\n this.up = this.up.bind(this);\n this.browse = this.browse.bind(this);\n this.deleteFile = this.deleteFile.bind(this);\n this.deleteFileAsync = this.deleteFileAsync.bind(this);\n this.getFilesForPath = this.getFilesForPath.bind(this);\n this.getFilesForPathAsync = this.getFilesForPathAsync.bind(this);\n this.onFileSelectedForUpload = this.onFileSelectedForUpload.bind(this);\n this.onFileSelectedForUploadAsync = this.onFileSelectedForUploadAsync.bind(this);\n this.parentPath = this.parentPath.bind(this);\n this.buildPath = this.buildPath.bind(this);\n this.$onInit = this.$onInit.bind(this);\n this.onFileUploaded = this.onFileUploaded.bind(this);\n this.refreshList = this.refreshList.bind(this);\n }\n\n rename(file, newName) {\n return this.$async(this.renameAsync, file, newName);\n }\n async renameAsync(file, newName) {\n const filePath = this.state.path === '/' ? file : `${this.state.path}/${file}`;\n const newFilePath = this.state.path === '/' ? newName : `${this.state.path}/${newName}`;\n\n try {\n await this.VolumeBrowserService.rename(this.volumeId, filePath, newFilePath);\n this.Notifications.success('File successfully renamed', newFilePath);\n this.files = await this.VolumeBrowserService.ls(this.volumeId, this.state.path);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to rename file');\n }\n }\n\n confirmDelete(file) {\n const filePath = this.state.path === '/' ? file : `${this.state.path}/${file}`;\n\n this.ModalService.confirmDeletion(`Are you sure that you want to delete ${filePath} ?`, (confirmed) => {\n if (!confirmed) {\n return;\n }\n this.deleteFile(filePath);\n });\n }\n\n download(file) {\n return this.$async(this.downloadAsync, file);\n }\n async downloadAsync(file) {\n const filePath = this.state.path === '/' ? file : `${this.state.path}/${file}`;\n\n try {\n const data = await this.VolumeBrowserService.get(this.volumeId, filePath);\n const downloadData = new Blob([data.file]);\n this.FileSaver.saveAs(downloadData, file);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to download file');\n }\n }\n\n up() {\n const parentFolder = this.parentPath(this.state.path);\n this.getFilesForPath(parentFolder);\n }\n\n browse(folder) {\n const path = this.buildPath(this.state.path, folder);\n this.getFilesForPath(path);\n }\n\n deleteFile(file) {\n return this.$async(this.deleteFileAsync, file);\n }\n async deleteFileAsync(file) {\n try {\n await this.VolumeBrowserService.delete(this.volumeId, file);\n this.Notifications.success('File successfully deleted', file);\n this.files = await this.VolumeBrowserService.ls(this.volumeId, this.state.path);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to delete file');\n }\n }\n\n getFilesForPath(path) {\n return this.$async(this.getFilesForPathAsync, path);\n }\n async getFilesForPathAsync(path) {\n try {\n const files = await this.VolumeBrowserService.ls(this.volumeId, path);\n this.state.path = path;\n this.files = files;\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to browse volume');\n }\n }\n\n onFileSelectedForUpload(file) {\n return this.$async(this.onFileSelectedForUploadAsync, file);\n }\n async onFileSelectedForUploadAsync(file) {\n try {\n await this.VolumeBrowserService.upload(this.state.path, file, this.volumeId);\n this.onFileUploaded();\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to upload file');\n }\n }\n\n parentPath(path) {\n if (path.lastIndexOf('/') === 0) {\n return '/';\n }\n\n const split = _.split(path, '/');\n return _.join(_.slice(split, 0, split.length - 1), '/');\n }\n\n buildPath(parent, file) {\n if (parent === '/') {\n return parent + file;\n }\n return `${parent}/${file}`;\n }\n\n onFileUploaded() {\n this.refreshList();\n }\n\n refreshList() {\n this.getFilesForPath(this.state.path);\n }\n\n async $onInit() {\n this.HttpRequestHelper.setPortainerAgentTargetHeader(this.nodeName);\n try {\n this.files = await this.VolumeBrowserService.ls(this.volumeId, this.state.path);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to browse volume');\n }\n }\n}\n","export class AgentViewModel {\n constructor(data) {\n this.IPAddress = data.IPAddress;\n this.NodeName = data.NodeName;\n this.NodeRole = data.NodeRole;\n }\n}\n","export function LocationViewModel(data) {\n this.Id = data.id;\n this.SubscriptionId = data.subscriptionId;\n this.DisplayName = data.displayName;\n this.Name = data.name;\n}\n","import _ from 'lodash-es';\n\nexport function ContainerInstanceProviderViewModel(data) {\n this.Id = data.id;\n this.Namespace = data.namespace;\n\n var containerGroupType = _.find(data.resourceTypes, { resourceType: 'containerGroups' });\n this.Locations = containerGroupType.locations;\n}\n","class ContainerInstanceDetailsController {\n /* @ngInject */\n constructor($state, AzureService, ContainerGroupService, Notifications, ResourceGroupService, SubscriptionService) {\n Object.assign(this, { $state, AzureService, ContainerGroupService, Notifications, ResourceGroupService, SubscriptionService });\n\n this.state = {\n loading: false,\n };\n\n this.container = null;\n this.subscription = null;\n this.resourceGroup = null;\n }\n\n async $onInit() {\n this.state.loading = true;\n const { id } = this.$state.params;\n const { subscriptionId, resourceGroupId, containerGroupId } = parseId(id);\n try {\n this.subscription = await this.SubscriptionService.subscription(subscriptionId);\n this.container = await this.ContainerGroupService.containerGroup(subscriptionId, resourceGroupId, containerGroupId);\n this.resourceGroup = await this.ResourceGroupService.resourceGroup(subscriptionId, resourceGroupId);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve container instance details');\n }\n this.state.loading = false;\n }\n}\n\nfunction parseId(id) {\n const [, subscriptionId, resourceGroupId, , containerGroupId] = id.match(/^\\/subscriptions\\/(.+)\\/resourceGroups\\/(.+)\\/providers\\/(.+)\\/containerGroups\\/(.+)$/);\n\n return { subscriptionId, resourceGroupId, containerGroupId };\n}\n\nexport default ContainerInstanceDetailsController;\n","import EndpointHelper from '@/portainer/helpers/endpointHelper';\n\nexport default class porImageRegistryContainerController {\n /* @ngInject */\n constructor(DockerHubService, Notifications) {\n this.DockerHubService = DockerHubService;\n this.Notifications = Notifications;\n\n this.pullRateLimits = null;\n }\n\n $onChanges({ registryId }) {\n if (registryId) {\n this.fetchRateLimits();\n }\n }\n\n $onInit() {\n this.setValidity =\n this.setValidity ||\n (() => {\n /* noop */\n });\n }\n\n async fetchRateLimits() {\n this.pullRateLimits = null;\n if (!EndpointHelper.isAgentEndpoint(this.endpoint) && !EndpointHelper.isLocalEndpoint(this.endpoint)) {\n this.setValidity(true);\n return;\n }\n\n try {\n this.pullRateLimits = await this.DockerHubService.checkRateLimits(this.endpoint, this.registryId || 0);\n this.setValidity(!this.pullRateLimits.limit || (this.pullRateLimits.limit && this.pullRateLimits.remaining >= 0));\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error('Failed loading DockerHub pull rate limits', e);\n this.setValidity(true);\n }\n }\n}\n","export function MacvlanFormData() {\n this.Scope = 'local';\n this.SelectedNetworkConfig = null;\n this.DatatableState = {\n selectedItems: [],\n };\n this.ParentNetworkCard = '';\n}\n","export function VolumesCIFSFormData() {\n this.useCIFS = false;\n this.serverAddress = '';\n this.share = '';\n this.version = 'CIFS v2.0 (Used by Windows Vista / Server 2008)';\n this.versions = [\n 'CIFS v1.0 (Used by Windows XP / Server 2003 and earlier)',\n 'CIFS v2.0 (Used by Windows Vista / Server 2008)',\n 'CIFS v2.1 (Used by Windows 7 / Server 2008 R2)',\n 'CIFS 3.0 (Used by Windows 8 / Server 2012 and newer)',\n ];\n this.versionsNumber = ['1.0', '2.0', '2.1', '3.0'];\n this.username = '';\n this.password = '';\n}\n","export function VolumesNFSFormData() {\n this.useNFS = false;\n this.serverAddress = '';\n this.mountPoint = '';\n this.version = 'NFS4';\n this.options = 'rw,noatime,rsize=8192,wsize=8192,tcp,timeo=14';\n this.versions = ['NFS4', 'NFS'];\n}\n","function createEventDetails(event) {\n var eventAttr = event.Actor.Attributes;\n var details = '';\n\n var action = event.Action;\n var extra = '';\n var hasColon = action.indexOf(':');\n if (hasColon != -1) {\n extra = action.substring(hasColon);\n action = action.substring(0, hasColon);\n }\n\n switch (event.Type) {\n case 'container':\n switch (action) {\n case 'stop':\n details = 'Container ' + eventAttr.name + ' stopped';\n break;\n case 'destroy':\n details = 'Container ' + eventAttr.name + ' deleted';\n break;\n case 'create':\n details = 'Container ' + eventAttr.name + ' created';\n break;\n case 'start':\n details = 'Container ' + eventAttr.name + ' started';\n break;\n case 'kill':\n details = 'Container ' + eventAttr.name + ' killed';\n break;\n case 'die':\n details = 'Container ' + eventAttr.name + ' exited with status code ' + eventAttr.exitCode;\n break;\n case 'commit':\n details = 'Container ' + eventAttr.name + ' committed';\n break;\n case 'restart':\n details = 'Container ' + eventAttr.name + ' restarted';\n break;\n case 'pause':\n details = 'Container ' + eventAttr.name + ' paused';\n break;\n case 'unpause':\n details = 'Container ' + eventAttr.name + ' unpaused';\n break;\n case 'attach':\n details = 'Container ' + eventAttr.name + ' attached';\n break;\n case 'detach':\n details = 'Container ' + eventAttr.name + ' detached';\n break;\n case 'copy':\n details = 'Container ' + eventAttr.name + ' copied';\n break;\n case 'export':\n details = 'Container ' + eventAttr.name + ' exported';\n break;\n case 'health_status':\n details = 'Container ' + eventAttr.name + ' executed health status';\n break;\n case 'oom':\n details = 'Container ' + eventAttr.name + ' goes in out of memory';\n break;\n case 'rename':\n details = 'Container ' + eventAttr.name + ' renamed';\n break;\n case 'resize':\n details = 'Container ' + eventAttr.name + ' resized';\n break;\n case 'top':\n details = 'Showed running processes for container ' + eventAttr.name;\n break;\n case 'update':\n details = 'Container ' + eventAttr.name + ' updated';\n break;\n case 'exec_create':\n details = 'Exec instance created';\n break;\n case 'exec_start':\n details = 'Exec instance started';\n break;\n case 'exec_die':\n details = 'Exec instance exited';\n break;\n default:\n details = 'Unsupported event';\n }\n break;\n case 'image':\n switch (action) {\n case 'delete':\n details = 'Image deleted';\n break;\n case 'import':\n details = 'Image ' + event.Actor.ID + ' imported';\n break;\n case 'load':\n details = 'Image ' + event.Actor.ID + ' loaded';\n break;\n case 'tag':\n details = 'New tag created for ' + eventAttr.name;\n break;\n case 'untag':\n details = 'Image untagged';\n break;\n case 'save':\n details = 'Image ' + event.Actor.ID + ' saved';\n break;\n case 'pull':\n details = 'Image ' + event.Actor.ID + ' pulled';\n break;\n case 'push':\n details = 'Image ' + event.Actor.ID + ' pushed';\n break;\n default:\n details = 'Unsupported event';\n }\n break;\n case 'network':\n switch (action) {\n case 'create':\n details = 'Network ' + eventAttr.name + ' created';\n break;\n case 'destroy':\n details = 'Network ' + eventAttr.name + ' deleted';\n break;\n case 'remove':\n details = 'Network ' + eventAttr.name + ' removed';\n break;\n case 'connect':\n details = 'Container connected to ' + eventAttr.name + ' network';\n break;\n case 'disconnect':\n details = 'Container disconnected from ' + eventAttr.name + ' network';\n break;\n default:\n details = 'Unsupported event';\n }\n break;\n case 'volume':\n switch (action) {\n case 'create':\n details = 'Volume ' + event.Actor.ID + ' created';\n break;\n case 'destroy':\n details = 'Volume ' + event.Actor.ID + ' deleted';\n break;\n case 'mount':\n details = 'Volume ' + event.Actor.ID + ' mounted';\n break;\n case 'unmount':\n details = 'Volume ' + event.Actor.ID + ' unmounted';\n break;\n default:\n details = 'Unsupported event';\n }\n break;\n default:\n details = 'Unsupported event';\n }\n return details + extra;\n}\n\nexport function EventViewModel(data) {\n // Type, Action, Actor unavailable in Docker < 1.10\n this.Time = data.time;\n if (data.Type) {\n this.Type = data.Type;\n this.Details = createEventDetails(data);\n } else {\n this.Type = data.status;\n this.Details = data.from;\n }\n}\n","export function ImageDetailsViewModel(data) {\n this.Id = data.Id;\n this.Tag = data.Tag;\n this.Parent = data.Parent;\n this.Repository = data.Repository;\n this.Created = data.Created;\n this.Checked = false;\n this.RepoTags = data.RepoTags;\n this.VirtualSize = data.VirtualSize;\n this.DockerVersion = data.DockerVersion;\n this.Os = data.Os;\n this.Architecture = data.Architecture;\n this.Author = data.Author;\n this.Command = data.Config.Cmd;\n this.Entrypoint = data.ContainerConfig.Entrypoint ? data.ContainerConfig.Entrypoint : '';\n this.ExposedPorts = data.ContainerConfig.ExposedPorts ? Object.keys(data.ContainerConfig.ExposedPorts) : [];\n this.Volumes = data.ContainerConfig.Volumes ? Object.keys(data.ContainerConfig.Volumes) : [];\n this.Env = data.ContainerConfig.Env ? data.ContainerConfig.Env : [];\n this.Labels = data.ContainerConfig.Labels;\n}\n","export function ImageLayerViewModel(order, data) {\n this.Order = order;\n this.Id = data.Id;\n this.Created = data.Created;\n this.CreatedBy = data.CreatedBy;\n this.Size = data.Size;\n this.Comment = data.Comment;\n this.Tags = data.Tags;\n}\n","// This model is based on https://github.com/moby/moby/blob/0ac25dfc751fa4304ab45afd5cd8705c2235d101/api/types/plugin.go#L8-L31\n// instead of the official documentation.\n// See: https://github.com/moby/moby/issues/34241\nexport function PluginViewModel(data) {\n this.Id = data.Id;\n this.Name = data.Name;\n this.Enabled = data.Enabled;\n this.Config = data.Config;\n}\n","export function SwarmViewModel(data) {\n this.Id = data.ID;\n}\n","// The get action of the Image service returns a file.\n// ngResource will transform it as an array of chars.\n// This functions simply creates a response object and assign\n// the data to a field.\nexport function imageGetResponse(data) {\n var response = {};\n response.file = data;\n return response;\n}\n","import { HIDE_AUTO_UPDATE_WINDOW } from 'Portainer/feature-flags/feature-ids';\n\nexport default class DockerFeaturesConfigurationController {\n /* @ngInject */\n constructor($async, EndpointService, Notifications, StateManager) {\n this.$async = $async;\n this.EndpointService = EndpointService;\n this.Notifications = Notifications;\n this.StateManager = StateManager;\n\n this.limitedFeature = HIDE_AUTO_UPDATE_WINDOW;\n\n this.formValues = {\n enableHostManagementFeatures: false,\n allowVolumeBrowserForRegularUsers: false,\n disableBindMountsForRegularUsers: false,\n disablePrivilegedModeForRegularUsers: false,\n disableHostNamespaceForRegularUsers: false,\n disableStackManagementForRegularUsers: false,\n disableDeviceMappingForRegularUsers: false,\n disableContainerCapabilitiesForRegularUsers: false,\n disableSysctlSettingForRegularUsers: false,\n };\n\n this.isAgent = false;\n\n this.state = {\n actionInProgress: false,\n };\n\n this.save = this.save.bind(this);\n }\n\n isContainerEditDisabled() {\n const {\n disableBindMountsForRegularUsers,\n disableHostNamespaceForRegularUsers,\n disablePrivilegedModeForRegularUsers,\n disableDeviceMappingForRegularUsers,\n disableContainerCapabilitiesForRegularUsers,\n disableSysctlSettingForRegularUsers,\n } = this.formValues;\n return (\n disableBindMountsForRegularUsers ||\n disableHostNamespaceForRegularUsers ||\n disablePrivilegedModeForRegularUsers ||\n disableDeviceMappingForRegularUsers ||\n disableContainerCapabilitiesForRegularUsers ||\n disableSysctlSettingForRegularUsers\n );\n }\n\n async save() {\n return this.$async(async () => {\n try {\n this.state.actionInProgress = true;\n const securitySettings = {\n enableHostManagementFeatures: this.formValues.enableHostManagementFeatures,\n allowBindMountsForRegularUsers: !this.formValues.disableBindMountsForRegularUsers,\n allowPrivilegedModeForRegularUsers: !this.formValues.disablePrivilegedModeForRegularUsers,\n allowVolumeBrowserForRegularUsers: this.formValues.allowVolumeBrowserForRegularUsers,\n allowHostNamespaceForRegularUsers: !this.formValues.disableHostNamespaceForRegularUsers,\n allowDeviceMappingForRegularUsers: !this.formValues.disableDeviceMappingForRegularUsers,\n allowStackManagementForRegularUsers: !this.formValues.disableStackManagementForRegularUsers,\n allowContainerCapabilitiesForRegularUsers: !this.formValues.disableContainerCapabilitiesForRegularUsers,\n allowSysctlSettingForRegularUsers: !this.formValues.disableSysctlSettingForRegularUsers,\n };\n\n await this.EndpointService.updateSecuritySettings(this.endpoint.Id, securitySettings);\n\n this.endpoint.SecuritySettings = securitySettings;\n this.Notifications.success('Saved settings successfully');\n } catch (e) {\n this.Notifications.error('Failure', e, 'Failed saving settings');\n }\n this.state.actionInProgress = false;\n });\n }\n\n checkAgent() {\n const applicationState = this.StateManager.getState();\n return applicationState.endpoint.mode.agentProxy;\n }\n\n $onInit() {\n const securitySettings = this.endpoint.SecuritySettings;\n\n const isAgent = this.checkAgent();\n this.isAgent = isAgent;\n\n this.formValues = {\n enableHostManagementFeatures: isAgent && securitySettings.enableHostManagementFeatures,\n allowVolumeBrowserForRegularUsers: isAgent && securitySettings.allowVolumeBrowserForRegularUsers,\n disableBindMountsForRegularUsers: !securitySettings.allowBindMountsForRegularUsers,\n disablePrivilegedModeForRegularUsers: !securitySettings.allowPrivilegedModeForRegularUsers,\n disableHostNamespaceForRegularUsers: !securitySettings.allowHostNamespaceForRegularUsers,\n disableDeviceMappingForRegularUsers: !securitySettings.allowDeviceMappingForRegularUsers,\n disableStackManagementForRegularUsers: !securitySettings.allowStackManagementForRegularUsers,\n disableContainerCapabilitiesForRegularUsers: !securitySettings.allowContainerCapabilitiesForRegularUsers,\n disableSysctlSettingForRegularUsers: !securitySettings.allowSysctlSettingForRegularUsers,\n };\n }\n}\n","import angular from 'angular';\n\nexport class AssociatedEndpointsDatatableController {\n /* @ngInject */\n constructor($scope, $controller, DatatableService, PaginationService) {\n this.extendGenericController($controller, $scope);\n this.DatatableService = DatatableService;\n this.PaginationService = PaginationService;\n\n this.state = Object.assign(this.state, {\n orderBy: this.orderBy,\n loading: true,\n filteredDataSet: [],\n totalFilteredDataset: 0,\n pageNumber: 1,\n });\n\n this.onPageChange = this.onPageChange.bind(this);\n this.paginationChanged = this.paginationChanged.bind(this);\n }\n\n extendGenericController($controller, $scope) {\n // extending the controller overrides the current controller functions\n const $onInit = this.$onInit.bind(this);\n const changePaginationLimit = this.changePaginationLimit.bind(this);\n const onTextFilterChange = this.onTextFilterChange.bind(this);\n angular.extend(this, $controller('GenericDatatableController', { $scope }));\n this.$onInit = $onInit;\n this.changePaginationLimit = changePaginationLimit;\n this.onTextFilterChange = onTextFilterChange;\n }\n\n $onInit() {\n this.setDefaults();\n this.prepareTableFromDataset();\n\n var storedOrder = this.DatatableService.getDataTableOrder(this.tableKey);\n if (storedOrder !== null) {\n this.state.reverseOrder = storedOrder.reverse;\n this.state.orderBy = storedOrder.orderBy;\n }\n\n var textFilter = this.DatatableService.getDataTableTextFilters(this.tableKey);\n if (textFilter !== null) {\n this.state.textFilter = textFilter;\n this.onTextFilterChange();\n }\n\n var storedFilters = this.DatatableService.getDataTableFilters(this.tableKey);\n if (storedFilters !== null) {\n this.filters = storedFilters;\n }\n if (this.filters && this.filters.state) {\n this.filters.state.open = false;\n }\n\n this.paginationChanged();\n }\n\n $onChanges({ updateKey }) {\n if (updateKey.currentValue && !updateKey.isFirstChange()) {\n this.paginationChanged();\n }\n }\n\n onPageChange(newPageNumber) {\n this.state.pageNumber = newPageNumber;\n this.paginationChanged();\n }\n\n /**\n * Overridden\n */\n changePaginationLimit() {\n this.PaginationService.setPaginationLimit(this.tableKey, this.state.paginatedItemLimit);\n this.paginationChanged();\n }\n\n /**\n * Overridden\n */\n onTextFilterChange() {\n var filterValue = this.state.textFilter;\n this.DatatableService.setDataTableTextFilters(this.tableKey, filterValue);\n this.paginationChanged();\n }\n\n paginationChanged() {\n this.state.loading = true;\n this.state.filteredDataSet = [];\n const start = (this.state.pageNumber - 1) * this.state.paginatedItemLimit + 1;\n this.retrievePage(start, this.state.paginatedItemLimit, this.state.textFilter)\n .then((data) => {\n this.state.filteredDataSet = data.endpoints;\n this.state.totalFilteredDataSet = data.totalCount;\n })\n .finally(() => {\n this.state.loading = false;\n });\n }\n}\n","import _ from 'lodash-es';\nimport moment from 'moment';\n\nexport class EdgeJobFormController {\n /* @ngInject */\n constructor() {\n this.state = {\n formValidationError: '',\n };\n\n this.scheduleValues = [\n {\n displayed: 'Every hour',\n cron: '0 * * * *',\n },\n {\n displayed: 'Every 2 hours',\n cron: '0 */2 * * *',\n },\n {\n displayed: 'Every day',\n cron: '0 0 * * *',\n },\n ];\n\n this.formValues = {\n datetime: moment(),\n scheduleValue: this.scheduleValues[0],\n cronMethod: 'basic',\n method: 'editor',\n };\n\n // see https://regexr.com/573i2\n this.cronRegex = /(@(annually|yearly|monthly|weekly|daily|hourly|reboot))|(@every (\\d+(ns|us|µs|ms|s|m|h))+)|((((\\d+,)+\\d+|(\\d+(\\/|-)\\d+)|\\d+|\\*) ){4,6}((\\d+,)+\\d+|(\\d+(\\/|-)\\d+)|\\d+|\\*))/;\n\n this.action = this.action.bind(this);\n this.editorUpdate = this.editorUpdate.bind(this);\n this.associateEndpoint = this.associateEndpoint.bind(this);\n this.dissociateEndpoint = this.dissociateEndpoint.bind(this);\n }\n\n onChangeModel(model) {\n const defaultTime = moment().add('hours', 1);\n this.formValues = {\n datetime: model.CronExpression ? cronToDatetime(model.CronExpression, defaultTime) : defaultTime,\n scheduleValue: this.formValues.scheduleValue,\n cronMethod: model.Recurring ? 'advanced' : 'basic',\n method: this.formValues.method,\n };\n }\n\n action() {\n this.state.formValidationError = '';\n\n if (this.formValues.method === 'editor' && this.model.FileContent === '') {\n this.state.formValidationError = 'Script file content must not be empty';\n return;\n }\n\n if (this.formValues.cronMethod === 'basic') {\n if (!this.model.Recurring) {\n this.model.CronExpression = datetimeToCron(this.formValues.datetime);\n } else {\n this.model.CronExpression = this.formValues.scheduleValue.cron;\n }\n } else {\n this.model.Recurring = true;\n }\n\n this.formAction(this.formValues.method);\n }\n\n editorUpdate(cm) {\n this.model.FileContent = cm.getValue();\n this.isEditorDirty = true;\n }\n\n associateEndpoint(endpoint) {\n if (!_.includes(this.model.Endpoints, endpoint.Id)) {\n this.model.Endpoints = [...this.model.Endpoints, endpoint.Id];\n }\n }\n\n dissociateEndpoint(endpoint) {\n this.model.Endpoints = _.filter(this.model.Endpoints, (id) => id !== endpoint.Id);\n }\n\n $onInit() {\n this.onChangeModel(this.model);\n }\n}\n\nfunction cronToDatetime(cron, defaultTime = moment()) {\n var strings = cron.split(' ');\n if (strings.length > 4) {\n strings = strings.slice(0, 4);\n } else {\n return defaultTime;\n }\n return moment(cron, 'm H D M');\n}\n\nfunction datetimeToCron(datetime) {\n var date = moment(datetime);\n return [date.minutes(), date.hours(), date.date(), date.month() + 1, '*'].join(' ');\n}\n","import angular from 'angular';\nimport _ from 'lodash-es';\n\nexport class EdgeJobResultsDatatableController {\n /* @ngInject */\n constructor($controller, $scope, $state) {\n this.$state = $state;\n angular.extend(this, $controller('GenericDatatableController', { $scope }));\n }\n\n collectLogs(...args) {\n this.settings.repeater.autoRefresh = true;\n this.settings.repeater.refreshRate = '5';\n this.onSettingsRepeaterChange();\n this.onCollectLogsClick(...args);\n }\n\n $onChanges({ dataset }) {\n if (dataset && dataset.currentValue) {\n this.onDatasetChange(dataset.currentValue);\n }\n }\n\n onDatasetChange(dataset) {\n const anyCollecting = _.some(dataset, (item) => item.LogsStatus === 2);\n this.settings.repeater.autoRefresh = anyCollecting;\n this.settings.repeater.refreshRate = '5';\n this.onSettingsRepeaterChange();\n }\n}\n","export default class EdgeStackDeploymentTypeSelectorController {\n /* @ngInject */\n constructor() {\n this.deploymentOptions = [\n { id: 'deployment_compose', icon: 'fab fa-docker', label: 'Compose', description: 'docker-compose format', value: 0 },\n {\n id: 'deployment_kube',\n icon: 'fa fa-cubes',\n label: 'Kubernetes',\n description: 'Kubernetes manifest format',\n value: 1,\n disabled: () => {\n return this.hasDockerEndpoint();\n },\n tooltip: () => {\n return this.hasDockerEndpoint() ? 'Cannot use this option with Edge Docker endpoints' : '';\n },\n },\n ];\n }\n}\n","import angular from 'angular';\n\nexport class EdgeStackEndpointsDatatableController {\n /* @ngInject */\n constructor($async, $scope, $controller, DatatableService, PaginationService, Notifications) {\n this.extendGenericController($controller, $scope);\n this.DatatableService = DatatableService;\n this.PaginationService = PaginationService;\n this.Notifications = Notifications;\n this.$async = $async;\n\n this.state = Object.assign(this.state, {\n orderBy: this.orderBy,\n loading: true,\n filteredDataSet: [],\n totalFilteredDataset: 0,\n pageNumber: 1,\n });\n\n this.onPageChange = this.onPageChange.bind(this);\n this.paginationChanged = this.paginationChanged.bind(this);\n this.paginationChangedAsync = this.paginationChangedAsync.bind(this);\n\n this.statusMap = {\n 1: 'OK',\n 2: 'Error',\n 3: 'Acknowledged',\n };\n }\n\n extendGenericController($controller, $scope) {\n // extending the controller overrides the current controller functions\n const $onInit = this.$onInit.bind(this);\n const changePaginationLimit = this.changePaginationLimit.bind(this);\n const onTextFilterChange = this.onTextFilterChange.bind(this);\n angular.extend(this, $controller('GenericDatatableController', { $scope }));\n this.$onInit = $onInit;\n this.changePaginationLimit = changePaginationLimit;\n this.onTextFilterChange = onTextFilterChange;\n }\n\n $onInit() {\n this.setDefaults();\n this.prepareTableFromDataset();\n\n var storedOrder = this.DatatableService.getDataTableOrder(this.tableKey);\n if (storedOrder !== null) {\n this.state.reverseOrder = storedOrder.reverse;\n this.state.orderBy = storedOrder.orderBy;\n }\n\n var textFilter = this.DatatableService.getDataTableTextFilters(this.tableKey);\n if (textFilter !== null) {\n this.state.textFilter = textFilter;\n this.onTextFilterChange();\n }\n\n var storedFilters = this.DatatableService.getDataTableFilters(this.tableKey);\n if (storedFilters !== null) {\n this.filters = storedFilters;\n }\n if (this.filters && this.filters.state) {\n this.filters.state.open = false;\n }\n\n this.paginationChanged();\n }\n\n onPageChange(newPageNumber) {\n this.state.pageNumber = newPageNumber;\n this.paginationChanged();\n }\n\n /**\n * Overridden\n */\n changePaginationLimit() {\n this.PaginationService.setPaginationLimit(this.tableKey, this.state.paginatedItemLimit);\n this.paginationChanged();\n }\n\n /**\n * Overridden\n */\n onTextFilterChange() {\n var filterValue = this.state.textFilter;\n this.DatatableService.setDataTableTextFilters(this.tableKey, filterValue);\n this.paginationChanged();\n }\n\n paginationChanged() {\n this.$async(this.paginationChangedAsync);\n }\n\n async paginationChangedAsync() {\n this.state.loading = true;\n this.state.filteredDataSet = [];\n const start = (this.state.pageNumber - 1) * this.state.paginatedItemLimit + 1;\n try {\n const { endpoints, totalCount } = await this.retrievePage(start, this.state.paginatedItemLimit, this.state.textFilter);\n this.state.filteredDataSet = endpoints;\n this.state.totalFilteredDataSet = totalCount;\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve environments');\n } finally {\n this.state.loading = false;\n }\n }\n}\n","const statusMap = {\n 1: 'ok',\n 2: 'error',\n 3: 'acknowledged',\n};\n\nexport class EdgeStackStatusController {\n $onChanges({ stackStatus }) {\n if (!stackStatus || !stackStatus.currentValue) {\n return;\n }\n const aggregateStatus = { ok: 0, error: 0, acknowledged: 0 };\n for (let endpointId in stackStatus.currentValue) {\n const endpoint = stackStatus.currentValue[endpointId];\n const endpointStatusKey = statusMap[endpoint.Type];\n aggregateStatus[endpointStatusKey]++;\n }\n this.status = aggregateStatus;\n }\n}\n","import { PortainerEndpointTypes } from '@/portainer/models/endpoint/models';\n\nexport class EditEdgeStackFormController {\n /* @ngInject */\n constructor() {\n this.state = {\n endpointTypes: [],\n };\n\n this.fileContents = {\n 0: '',\n 1: '',\n };\n\n this.onChangeGroups = this.onChangeGroups.bind(this);\n this.onChangeFileContent = this.onChangeFileContent.bind(this);\n this.onChangeComposeConfig = this.onChangeComposeConfig.bind(this);\n this.onChangeKubeManifest = this.onChangeKubeManifest.bind(this);\n this.hasDockerEndpoint = this.hasDockerEndpoint.bind(this);\n this.hasKubeEndpoint = this.hasKubeEndpoint.bind(this);\n this.onChangeDeploymentType = this.onChangeDeploymentType.bind(this);\n this.removeLineBreaks = this.removeLineBreaks.bind(this);\n this.onChangeFileContent = this.onChangeFileContent.bind(this);\n }\n\n hasKubeEndpoint() {\n return this.state.endpointTypes.includes(PortainerEndpointTypes.EdgeAgentOnKubernetesEnvironment);\n }\n\n hasDockerEndpoint() {\n return this.state.endpointTypes.includes(PortainerEndpointTypes.EdgeAgentOnDockerEnvironment);\n }\n\n onChangeGroups(groups) {\n this.model.EdgeGroups = groups;\n\n this.checkEndpointTypes(groups);\n }\n\n isFormValid() {\n return this.model.EdgeGroups.length && this.model.StackFileContent && this.validateEndpointsForDeployment();\n }\n\n checkEndpointTypes(groups) {\n const edgeGroups = groups.map((id) => this.edgeGroups.find((e) => e.Id === id));\n this.state.endpointTypes = edgeGroups.flatMap((group) => group.EndpointTypes);\n }\n\n removeLineBreaks(value) {\n return value.replace(/(\\r\\n|\\n|\\r)/gm, '');\n }\n\n onChangeFileContent(type, value) {\n const oldValue = this.fileContents[type];\n if (this.removeLineBreaks(oldValue) !== this.removeLineBreaks(value)) {\n this.model.StackFileContent = value;\n this.fileContents[type] = value;\n this.isEditorDirty = true;\n }\n }\n\n onChangeKubeManifest(value) {\n this.onChangeFileContent(1, value);\n }\n\n onChangeComposeConfig(value) {\n this.onChangeFileContent(0, value);\n }\n\n onChangeDeploymentType(deploymentType) {\n this.model.DeploymentType = deploymentType;\n\n this.model.StackFileContent = this.fileContents[deploymentType];\n }\n\n validateEndpointsForDeployment() {\n return this.model.DeploymentType == 0 || !this.hasDockerEndpoint();\n }\n\n $onInit() {\n this.checkEndpointTypes(this.model.EdgeGroups);\n }\n}\n","import _ from 'lodash-es';\n\nexport class EdgeGroupFormController {\n /* @ngInject */\n constructor(EndpointService, $async, $scope) {\n this.EndpointService = EndpointService;\n this.$async = $async;\n\n this.endpoints = {\n state: {\n limit: '10',\n filter: '',\n pageNumber: 1,\n totalCount: 0,\n },\n value: null,\n };\n\n this.associateEndpoint = this.associateEndpoint.bind(this);\n this.dissociateEndpoint = this.dissociateEndpoint.bind(this);\n this.getDynamicEndpointsAsync = this.getDynamicEndpointsAsync.bind(this);\n this.getDynamicEndpoints = this.getDynamicEndpoints.bind(this);\n\n $scope.$watch(\n () => this.model,\n () => {\n if (this.model.Dynamic) {\n this.getDynamicEndpoints();\n }\n },\n true\n );\n }\n\n associateEndpoint(endpoint) {\n if (!_.includes(this.model.Endpoints, endpoint.Id)) {\n this.model.Endpoints = [...this.model.Endpoints, endpoint.Id];\n }\n }\n\n dissociateEndpoint(endpoint) {\n this.model.Endpoints = _.filter(this.model.Endpoints, (id) => id !== endpoint.Id);\n }\n\n getDynamicEndpoints() {\n return this.$async(this.getDynamicEndpointsAsync);\n }\n\n async getDynamicEndpointsAsync() {\n const { pageNumber, limit, search } = this.endpoints.state;\n const start = (pageNumber - 1) * limit + 1;\n const query = { search, types: [4, 7], tagIds: this.model.TagIds, tagsPartialMatch: this.model.PartialMatch };\n\n const response = await this.EndpointService.endpoints(start, limit, query);\n\n const totalCount = parseInt(response.totalCount, 10);\n this.endpoints.value = response.value;\n this.endpoints.state.totalCount = totalCount;\n }\n}\n","import angular from 'angular';\n\nexport class EdgeGroupsDatatableController {\n /* @ngInject */\n constructor($scope, $controller) {\n const allowSelection = this.allowSelection;\n angular.extend(this, $controller('GenericDatatableController', { $scope: $scope }));\n this.allowSelection = allowSelection.bind(this);\n }\n\n /**\n * Override this method to allow/deny selection\n */\n allowSelection(item) {\n return !item.HasEdgeStack;\n }\n}\n","export class CreateEdgeGroupController {\n /* @ngInject */\n constructor(EdgeGroupService, GroupService, TagService, Notifications, $state, $async) {\n this.EdgeGroupService = EdgeGroupService;\n this.GroupService = GroupService;\n this.TagService = TagService;\n this.Notifications = Notifications;\n this.$state = $state;\n this.$async = $async;\n\n this.state = {\n actionInProgress: false,\n loaded: false,\n };\n\n this.model = {\n Name: '',\n Endpoints: [],\n Dynamic: false,\n TagIds: [],\n PartialMatch: false,\n };\n\n this.createGroup = this.createGroup.bind(this);\n this.createGroupAsync = this.createGroupAsync.bind(this);\n }\n\n async $onInit() {\n const [tags, endpointGroups] = await Promise.all([this.TagService.tags(), this.GroupService.groups()]);\n this.tags = tags;\n this.endpointGroups = endpointGroups;\n this.state.loaded = true;\n }\n\n createGroup() {\n return this.$async(this.createGroupAsync);\n }\n\n async createGroupAsync() {\n this.state.actionInProgress = true;\n try {\n await this.EdgeGroupService.create(this.model);\n this.Notifications.success('Edge group successfully created');\n this.$state.go('edge.groups');\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to create edge group');\n } finally {\n this.state.actionInProgress = false;\n }\n }\n}\n","import _ from 'lodash-es';\n\nexport class EdgeGroupsController {\n /* @ngInject */\n constructor($async, $state, EdgeGroupService, Notifications) {\n this.$async = $async;\n this.$state = $state;\n this.EdgeGroupService = EdgeGroupService;\n this.Notifications = Notifications;\n\n this.removeAction = this.removeAction.bind(this);\n this.removeActionAsync = this.removeActionAsync.bind(this);\n }\n\n async $onInit() {\n try {\n this.items = await this.EdgeGroupService.groups();\n } catch (err) {\n this.items = [];\n this.Notifications.error('Failure', err, 'Unable to retrieve Edge groups');\n }\n }\n\n removeAction(selectedItems) {\n return this.$async(this.removeActionAsync, selectedItems);\n }\n\n async removeActionAsync(selectedItems) {\n for (let item of selectedItems) {\n try {\n await this.EdgeGroupService.remove(item.Id);\n\n this.Notifications.success('Edge Group successfully removed', item.Name);\n _.remove(this.items, item);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to remove Edge Group');\n }\n }\n\n this.$state.reload();\n }\n}\n","export class EditEdgeGroupController {\n /* @ngInject */\n constructor(EdgeGroupService, GroupService, TagService, Notifications, $state, $async) {\n this.EdgeGroupService = EdgeGroupService;\n this.GroupService = GroupService;\n this.TagService = TagService;\n this.Notifications = Notifications;\n this.$state = $state;\n this.$async = $async;\n\n this.state = {\n actionInProgress: false,\n loaded: false,\n };\n\n this.updateGroup = this.updateGroup.bind(this);\n this.updateGroupAsync = this.updateGroupAsync.bind(this);\n }\n\n async $onInit() {\n const [tags, endpointGroups, group] = await Promise.all([this.TagService.tags(), this.GroupService.groups(), this.EdgeGroupService.group(this.$state.params.groupId)]);\n\n if (!group) {\n this.Notifications.error('Failed to find edge group', {});\n this.$state.go('edge.groups');\n }\n this.tags = tags;\n this.endpointGroups = endpointGroups;\n this.model = group;\n this.state.loaded = true;\n }\n\n updateGroup() {\n return this.$async(this.updateGroupAsync);\n }\n\n async updateGroupAsync() {\n this.state.actionInProgress = true;\n try {\n await this.EdgeGroupService.update(this.model);\n this.Notifications.success('Edge group successfully updated');\n this.$state.go('edge.groups');\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to update edge group');\n } finally {\n this.state.actionInProgress = false;\n }\n }\n}\n","export class CreateEdgeJobViewController {\n /* @ngInject */\n constructor($async, $q, $state, $window, ModalService, EdgeJobService, GroupService, Notifications, TagService) {\n this.state = {\n actionInProgress: false,\n isEditorDirty: false,\n };\n\n this.model = {\n Name: '',\n Recurring: false,\n CronExpression: '',\n Endpoints: [],\n FileContent: '',\n File: null,\n };\n\n this.$async = $async;\n this.$q = $q;\n this.$state = $state;\n this.$window = $window;\n this.ModalService = ModalService;\n this.Notifications = Notifications;\n this.GroupService = GroupService;\n this.EdgeJobService = EdgeJobService;\n this.TagService = TagService;\n\n this.create = this.create.bind(this);\n this.createEdgeJob = this.createEdgeJob.bind(this);\n this.createAsync = this.createAsync.bind(this);\n }\n\n create(method) {\n return this.$async(this.createAsync, method);\n }\n\n async createAsync(method) {\n this.state.actionInProgress = true;\n\n try {\n await this.createEdgeJob(method, this.model);\n this.Notifications.success('Edge job successfully created');\n this.state.isEditorDirty = false;\n this.$state.go('edge.jobs', {}, { reload: true });\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to create Edge job');\n }\n\n this.state.actionInProgress = false;\n }\n\n createEdgeJob(method, model) {\n if (method === 'editor') {\n return this.EdgeJobService.createEdgeJobFromFileContent(model);\n }\n return this.EdgeJobService.createEdgeJobFromFileUpload(model);\n }\n\n async uiCanExit() {\n if (this.model.FileContent && this.state.isEditorDirty) {\n return this.ModalService.confirmWebEditorDiscard();\n }\n }\n\n async $onInit() {\n try {\n const [groups, tags] = await Promise.all([this.GroupService.groups(), this.TagService.tags()]);\n this.groups = groups;\n this.tags = tags;\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve page data');\n }\n\n this.$window.onbeforeunload = () => {\n if (this.model.FileContent && this.state.isEditorDirty) {\n return '';\n }\n };\n }\n\n $onDestroy() {\n this.state.isEditorDirty = false;\n }\n}\n","import _ from 'lodash-es';\n\nexport class EdgeJobController {\n /* @ngInject */\n constructor($async, $q, $state, $window, ModalService, EdgeJobService, EndpointService, FileSaver, GroupService, HostBrowserService, Notifications, TagService) {\n this.state = {\n actionInProgress: false,\n showEditorTab: false,\n isEditorDirty: false,\n };\n\n this.$async = $async;\n this.$q = $q;\n this.$state = $state;\n this.$window = $window;\n this.ModalService = ModalService;\n this.EdgeJobService = EdgeJobService;\n this.EndpointService = EndpointService;\n this.FileSaver = FileSaver;\n this.GroupService = GroupService;\n this.HostBrowserService = HostBrowserService;\n this.Notifications = Notifications;\n this.TagService = TagService;\n\n this.update = this.update.bind(this);\n this.updateAsync = this.updateAsync.bind(this);\n this.downloadLogs = this.downloadLogs.bind(this);\n this.downloadLogsAsync = this.downloadLogsAsync.bind(this);\n this.collectLogs = this.collectLogs.bind(this);\n this.collectLogsAsync = this.collectLogsAsync.bind(this);\n this.clearLogs = this.clearLogs.bind(this);\n this.clearLogsAsync = this.clearLogsAsync.bind(this);\n this.refresh = this.refresh.bind(this);\n this.refreshAsync = this.refreshAsync.bind(this);\n this.showEditor = this.showEditor.bind(this);\n }\n\n update() {\n return this.$async(this.updateAsync);\n }\n\n async updateAsync() {\n const model = this.edgeJob;\n this.state.actionInProgress = true;\n\n try {\n await this.EdgeJobService.updateEdgeJob(model);\n this.Notifications.success('Edge job successfully updated');\n this.state.isEditorDirty = false;\n this.$state.go('edge.jobs', {}, { reload: true });\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to update Edge job');\n }\n\n this.state.actionInProgress = false;\n }\n\n downloadLogs(endpointId) {\n return this.$async(this.downloadLogsAsync, endpointId);\n }\n async downloadLogsAsync(endpointId) {\n try {\n const data = await this.EdgeJobService.logFile(this.edgeJob.Id, endpointId);\n const downloadData = new Blob([data.FileContent], {\n type: 'text/plain;charset=utf-8',\n });\n const logFileName = `job_${this.edgeJob.Id}_task_${endpointId}.log`;\n this.FileSaver.saveAs(downloadData, logFileName);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to download file');\n }\n }\n\n associateEndpointsToResults(results, endpoints) {\n return _.map(results, (result) => {\n const endpoint = _.find(endpoints, (endpoint) => endpoint.Id === result.EndpointId);\n result.Endpoint = endpoint;\n return result;\n });\n }\n\n collectLogs(endpointId) {\n return this.$async(this.collectLogsAsync, endpointId);\n }\n\n async collectLogsAsync(endpointId) {\n try {\n await this.EdgeJobService.collectLogs(this.edgeJob.Id, endpointId);\n const result = _.find(this.results, (result) => result.EndpointId === endpointId);\n result.LogsStatus = 2;\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to collect logs');\n }\n }\n\n clearLogs(endpointId) {\n return this.$async(this.clearLogsAsync, endpointId);\n }\n async clearLogsAsync(endpointId) {\n try {\n await this.EdgeJobService.clearLogs(this.edgeJob.Id, endpointId);\n const result = _.find(this.results, (result) => result.EndpointId === endpointId);\n result.LogsStatus = 1;\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to clear logs');\n }\n }\n\n refresh() {\n return this.$async(this.refreshAsync);\n }\n async refreshAsync() {\n const { id } = this.$state.params;\n const results = await this.EdgeJobService.jobResults(id);\n if (results.length > 0) {\n const endpointIds = _.map(results, (result) => result.EndpointId);\n const endpoints = await this.EndpointService.endpoints(undefined, undefined, { endpointIds });\n this.results = this.associateEndpointsToResults(results, endpoints.value);\n } else {\n this.results = results;\n }\n }\n\n showEditor() {\n this.state.showEditorTab = true;\n }\n\n async uiCanExit() {\n if (this.edgeJob.FileContent !== this.oldFileContent && this.state.isEditorDirty) {\n return this.ModalService.confirmWebEditorDiscard();\n }\n }\n\n async $onInit() {\n const { id, tab } = this.$state.params;\n this.state.activeTab = tab;\n if (!tab || tab === 0) {\n this.state.showEditorTab = true;\n }\n\n try {\n const [edgeJob, file, results, groups, tags] = await Promise.all([\n this.EdgeJobService.edgeJob(id),\n this.EdgeJobService.getScriptFile(id),\n this.EdgeJobService.jobResults(id),\n this.GroupService.groups(),\n this.TagService.tags(),\n ]);\n\n edgeJob.FileContent = file.FileContent;\n this.oldFileContent = edgeJob.FileContent;\n this.edgeJob = edgeJob;\n this.groups = groups;\n this.tags = tags;\n\n if (results.length > 0) {\n const endpointIds = _.map(results, (result) => result.EndpointId);\n const endpoints = await this.EndpointService.endpoints(undefined, undefined, { endpointIds });\n this.results = this.associateEndpointsToResults(results, endpoints.value);\n } else {\n this.results = results;\n }\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve environment list');\n }\n\n this.$window.onbeforeunload = () => {\n if (this.edgeJob.FileContent !== this.oldFileContent && this.state.isEditorDirty) {\n return '';\n }\n };\n }\n\n $onDestroy() {\n this.state.isEditorDirty = false;\n }\n}\n","import _ from 'lodash-es';\n\nexport class EdgeJobsViewController {\n /* @ngInject */\n constructor($async, $state, EdgeJobService, ModalService, Notifications) {\n this.$async = $async;\n this.$state = $state;\n this.EdgeJobService = EdgeJobService;\n this.ModalService = ModalService;\n this.Notifications = Notifications;\n\n this.removeAction = this.removeAction.bind(this);\n this.deleteJobsAsync = this.deleteJobsAsync.bind(this);\n this.deleteJobs = this.deleteJobs.bind(this);\n }\n\n removeAction(selectedItems) {\n this.ModalService.confirmDeletion('Do you want to remove the selected edge job(s) ?', (confirmed) => {\n if (!confirmed) {\n return;\n }\n this.deleteJobs(selectedItems);\n });\n }\n\n deleteJobs(edgeJobs) {\n return this.$async(this.deleteJobsAsync, edgeJobs);\n }\n\n async deleteJobsAsync(edgeJobs) {\n for (let edgeJob of edgeJobs) {\n try {\n await this.EdgeJobService.remove(edgeJob.Id);\n this.Notifications.success('Stack successfully removed', edgeJob.Name);\n _.remove(this.edgeJobs, edgeJob);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to remove Edge job ' + edgeJob.Name);\n }\n }\n\n this.$state.reload();\n }\n\n async $onInit() {\n try {\n const edgeJobs = await this.EdgeJobService.edgeJobs();\n this.edgeJobs = edgeJobs;\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve Edge jobs');\n this.edgeJobs = [];\n }\n }\n}\n","import _ from 'lodash-es';\n\nexport class EdgeStacksViewController {\n /* @ngInject */\n constructor($state, Notifications, EdgeStackService, $scope, $async) {\n this.$state = $state;\n this.Notifications = Notifications;\n this.EdgeStackService = EdgeStackService;\n this.$scope = $scope;\n this.$async = $async;\n\n this.stacks = undefined;\n\n this.getStacks = this.getStacks.bind(this);\n this.removeAction = this.removeAction.bind(this);\n this.removeActionAsync = this.removeActionAsync.bind(this);\n }\n\n $onInit() {\n this.getStacks();\n }\n\n removeAction(stacks) {\n return this.$async(this.removeActionAsync, stacks);\n }\n\n async removeActionAsync(stacks) {\n for (let stack of stacks) {\n try {\n await this.EdgeStackService.remove(stack.Id);\n this.Notifications.success('Stack successfully removed', stack.Name);\n _.remove(this.stacks, stack);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to remove stack ' + stack.Name);\n }\n }\n\n this.$state.reload();\n }\n\n async getStacks() {\n try {\n this.stacks = await this.EdgeStackService.stacks();\n } catch (err) {\n this.stacks = [];\n this.Notifications.error('Failure', err, 'Unable to retrieve stacks');\n }\n }\n}\n","import _ from 'lodash-es';\n\nexport class EditEdgeStackViewController {\n /* @ngInject */\n constructor($async, $state, $window, ModalService, EdgeGroupService, EdgeStackService, EndpointService, Notifications) {\n this.$async = $async;\n this.$state = $state;\n this.$window = $window;\n this.ModalService = ModalService;\n this.EdgeGroupService = EdgeGroupService;\n this.EdgeStackService = EdgeStackService;\n this.EndpointService = EndpointService;\n this.Notifications = Notifications;\n\n this.stack = null;\n this.edgeGroups = null;\n\n this.state = {\n actionInProgress: false,\n activeTab: 0,\n isEditorDirty: false,\n };\n\n this.deployStack = this.deployStack.bind(this);\n this.deployStackAsync = this.deployStackAsync.bind(this);\n this.getPaginatedEndpoints = this.getPaginatedEndpoints.bind(this);\n this.getPaginatedEndpointsAsync = this.getPaginatedEndpointsAsync.bind(this);\n }\n\n async $onInit() {\n const { stackId, tab } = this.$state.params;\n this.state.activeTab = tab;\n try {\n const [edgeGroups, model, file] = await Promise.all([this.EdgeGroupService.groups(), this.EdgeStackService.stack(stackId), this.EdgeStackService.stackFile(stackId)]);\n this.edgeGroups = edgeGroups;\n this.stack = model;\n this.stackEndpointIds = this.filterStackEndpoints(model.EdgeGroups, edgeGroups);\n this.originalFileContent = file;\n this.formValues = {\n StackFileContent: file,\n EdgeGroups: this.stack.EdgeGroups,\n DeploymentType: this.stack.DeploymentType,\n };\n this.oldFileContent = this.formValues.StackFileContent;\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve stack data');\n }\n\n this.$window.onbeforeunload = () => {\n if (this.formValues.StackFileContent !== this.oldFileContent && this.state.isEditorDirty) {\n return '';\n }\n };\n }\n\n $onDestroy() {\n this.state.isEditorDirty = false;\n }\n\n async uiCanExit() {\n if (this.formValues.StackFileContent.replace(/(\\r\\n|\\n|\\r)/gm, '') !== this.oldFileContent.replace(/(\\r\\n|\\n|\\r)/gm, '') && this.state.isEditorDirty) {\n return this.ModalService.confirmWebEditorDiscard();\n }\n }\n\n filterStackEndpoints(groupIds, groups) {\n return _.flatten(\n _.map(groupIds, (Id) => {\n const group = _.find(groups, { Id });\n return group.Endpoints;\n })\n );\n }\n\n deployStack() {\n return this.$async(this.deployStackAsync);\n }\n\n async deployStackAsync() {\n this.state.actionInProgress = true;\n try {\n if (this.originalFileContent != this.formValues.StackFileContent) {\n this.formValues.Version = this.stack.Version + 1;\n }\n await this.EdgeStackService.updateStack(this.stack.Id, this.formValues);\n this.Notifications.success('Stack successfully deployed');\n this.state.isEditorDirty = false;\n this.$state.go('edge.stacks');\n } catch (err) {\n this.Notifications.error('Deployment error', err, 'Unable to deploy stack');\n } finally {\n this.state.actionInProgress = false;\n }\n }\n\n getPaginatedEndpoints(...args) {\n return this.$async(this.getPaginatedEndpointsAsync, ...args);\n }\n\n async getPaginatedEndpointsAsync(lastId, limit, search) {\n try {\n const query = { search, types: [4, 7], endpointIds: this.stackEndpointIds };\n const { value, totalCount } = await this.EndpointService.endpoints(lastId, limit, query);\n const endpoints = _.map(value, (endpoint) => {\n const status = this.stack.Status[endpoint.Id];\n endpoint.Status = status;\n return endpoint;\n });\n return { endpoints, totalCount };\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve environment information');\n }\n }\n}\n","export function StoridgeEventModel(data) {\n this.Time = data.time;\n this.Category = data.category;\n this.Module = data.module;\n this.Content = data.content;\n}\n","export function StoridgeInfoModel(data) {\n this.Domain = data.domain;\n this.Nodes = data.nodes;\n this.Condition = data.condition;\n this.ProvisionedBandwidth = data.provisionedBandwidth;\n this.UsedBandwidth = data.usedBandwidth;\n this.FreeBandwidth = data.freeBandwidth;\n this.TotalBandwidth = data.totalBandwidth;\n this.ProvisionedIOPS = data.provisionedIOPS;\n this.UsedIOPS = data.usedIOPS;\n this.FreeIOPS = data.freeIOPS;\n this.TotalIOPS = data.totalIOPS;\n this.ProvisionedCapacity = data.provisionedCapacity;\n this.UsedCapacity = data.usedCapacity;\n this.FreeCapacity = data.freeCapacity;\n this.TotalCapacity = data.totalCapacity;\n}\n","import angular from 'angular';\n\nimport { kubernetesRegistryAccessView } from './kube-registry-access-view';\n\nexport default angular.module('portainer.kubernetes.registries', []).component('kubernetesRegistryAccessView', kubernetesRegistryAccessView).name;\n","const autoNgTemplateLoaderTemplate1 = require('./kube-registry-access-view.html');\n\nimport controller from './kube-registry-access-view.controller';\n\nexport const kubernetesRegistryAccessView = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n endpoint: '<',\n },\n};\n","import KubernetesNamespaceHelper from 'Kubernetes/helpers/namespaceHelper';\n\nexport default class KubernetesRegistryAccessController {\n /* @ngInject */\n constructor($async, $state, ModalService, EndpointService, Notifications, KubernetesResourcePoolService) {\n this.$async = $async;\n this.$state = $state;\n this.ModalService = ModalService;\n this.Notifications = Notifications;\n this.KubernetesResourcePoolService = KubernetesResourcePoolService;\n this.EndpointService = EndpointService;\n\n this.state = {\n actionInProgress: false,\n };\n\n this.selectedResourcePools = [];\n this.resourcePools = [];\n this.savedResourcePools = [];\n\n this.handleRemove = this.handleRemove.bind(this);\n }\n\n async submit() {\n return this.updateNamespaces([...this.savedResourcePools.map(({ value }) => value), ...this.selectedResourcePools.map((pool) => pool.name)]);\n }\n\n handleRemove(namespaces) {\n const removeNamespaces = namespaces.map(({ value }) => value);\n const nsToUpdate = this.savedResourcePools.map(({ value }) => value).filter((value) => !removeNamespaces.includes(value));\n\n const displayedMessage =\n 'This registry might be used by one or more applications inside this environment. Removing the registry access could lead to a service interruption for these applications.<br/><br/>Do you wish to continue?';\n this.ModalService.confirmDeletion(displayedMessage, (confirmed) => {\n if (confirmed) {\n return this.updateNamespaces(nsToUpdate);\n }\n });\n }\n\n updateNamespaces(namespaces) {\n return this.$async(async () => {\n try {\n await this.EndpointService.updateRegistryAccess(this.endpoint.Id, this.registry.Id, {\n namespaces,\n });\n this.$state.reload(this.$state.current);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Failed saving registry access');\n }\n });\n }\n\n $onInit() {\n return this.$async(async () => {\n try {\n this.state = {\n registryId: this.$state.params.id,\n };\n this.registry = await this.EndpointService.registry(this.endpoint.Id, this.state.registryId);\n if (this.registry.RegistryAccesses && this.registry.RegistryAccesses[this.endpoint.Id]) {\n this.savedResourcePools = this.registry.RegistryAccesses[this.endpoint.Id].Namespaces.map((value) => ({ value }));\n }\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve registry details');\n }\n\n try {\n const resourcePools = await this.KubernetesResourcePoolService.get();\n\n this.resourcePools = resourcePools\n .filter((pool) => !KubernetesNamespaceHelper.isSystemNamespace(pool.Namespace.Name) && !this.savedResourcePools.find(({ value }) => value === pool.Namespace.Name))\n .map((pool) => ({ name: pool.Namespace.Name, id: pool.Namespace.Id }));\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve namespaces');\n }\n });\n }\n}\n","import angular from 'angular';\n\nimport { kubeCustomTemplatesView } from './kube-custom-templates-view';\nimport { kubeEditCustomTemplateView } from './kube-edit-custom-template-view';\nimport { kubeCreateCustomTemplateView } from './kube-create-custom-template-view';\n\nexport default angular\n .module('portainer.kubernetes.custom-templates', [])\n .config(config)\n .component('kubeCustomTemplatesView', kubeCustomTemplatesView)\n .component('kubeEditCustomTemplateView', kubeEditCustomTemplateView)\n .component('kubeCreateCustomTemplateView', kubeCreateCustomTemplateView).name;\n\nfunction config($stateRegistryProvider) {\n const templates = {\n name: 'kubernetes.templates',\n url: '/templates',\n abstract: true,\n };\n\n const customTemplates = {\n name: 'kubernetes.templates.custom',\n url: '/custom',\n\n views: {\n 'content@': {\n component: 'kubeCustomTemplatesView',\n },\n },\n };\n\n const customTemplatesNew = {\n name: 'kubernetes.templates.custom.new',\n url: '/new?fileContent',\n\n views: {\n 'content@': {\n component: 'kubeCreateCustomTemplateView',\n },\n },\n params: {\n fileContent: '',\n },\n };\n\n const customTemplatesEdit = {\n name: 'kubernetes.templates.custom.edit',\n url: '/:id',\n\n views: {\n 'content@': {\n component: 'kubeEditCustomTemplateView',\n },\n },\n };\n\n $stateRegistryProvider.register(templates);\n $stateRegistryProvider.register(customTemplates);\n $stateRegistryProvider.register(customTemplatesNew);\n $stateRegistryProvider.register(customTemplatesEdit);\n}\n","const autoNgTemplateLoaderTemplate1 = require('./kube-custom-templates-view.html');\n\nimport controller from './kube-custom-templates-view.controller.js';\n\nexport const kubeCustomTemplatesView = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n};\n","import _ from 'lodash-es';\n\nexport default class KubeCustomTemplatesViewController {\n /* @ngInject */\n constructor($async, $state, Authentication, CustomTemplateService, FormValidator, ModalService, Notifications) {\n Object.assign(this, { $async, $state, Authentication, CustomTemplateService, FormValidator, ModalService, Notifications });\n\n this.state = {\n selectedTemplate: null,\n formValidationError: '',\n actionInProgress: false,\n };\n\n this.currentUser = {\n isAdmin: false,\n id: null,\n };\n\n this.isEditAllowed = this.isEditAllowed.bind(this);\n this.getTemplates = this.getTemplates.bind(this);\n this.validateForm = this.validateForm.bind(this);\n this.confirmDelete = this.confirmDelete.bind(this);\n this.selectTemplate = this.selectTemplate.bind(this);\n }\n\n selectTemplate(template) {\n this.$state.go('kubernetes.deploy', { templateId: template.Id });\n }\n\n isEditAllowed(template) {\n // todo - check if current user is admin/endpointadmin/owner\n return this.currentUser.isAdmin || this.currentUser.id === template.CreatedByUserId;\n }\n\n getTemplates() {\n return this.$async(async () => {\n try {\n this.templates = await this.CustomTemplateService.customTemplates(3);\n } catch (err) {\n this.Notifications.error('Failed loading templates', err, 'Unable to load custom templates');\n }\n });\n }\n\n validateForm(accessControlData, isAdmin) {\n this.state.formValidationError = '';\n const error = this.FormValidator.validateAccessControl(accessControlData, isAdmin);\n\n if (error) {\n this.state.formValidationError = error;\n return false;\n }\n return true;\n }\n\n confirmDelete(templateId) {\n return this.$async(async () => {\n const confirmed = await this.ModalService.confirmDeletionAsync('Are you sure that you want to delete this template?');\n if (!confirmed) {\n return;\n }\n\n try {\n await this.CustomTemplateService.remove(templateId);\n _.remove(this.templates, { Id: templateId });\n } catch (err) {\n this.Notifications.error('Failure', err, 'Failed to delete template');\n }\n });\n }\n\n $onInit() {\n this.getTemplates();\n\n this.currentUser.isAdmin = this.Authentication.isAdmin();\n const user = this.Authentication.getUserDetails();\n this.currentUser.id = user.ID;\n }\n}\n","const autoNgTemplateLoaderTemplate1 = require('./kube-edit-custom-template-view.html');\n\nimport controller from './kube-edit-custom-template-view.controller.js';\n\nexport const kubeEditCustomTemplateView = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n};\n","import { AccessControlFormData } from '@/portainer/components/accessControlForm/porAccessControlFormModel';\nimport { ResourceControlViewModel } from '@/portainer/models/resourceControl/resourceControl';\n\nclass KubeEditCustomTemplateViewController {\n /* @ngInject */\n constructor($async, $state, ModalService, Authentication, CustomTemplateService, FormValidator, Notifications, ResourceControlService) {\n Object.assign(this, { $async, $state, ModalService, Authentication, CustomTemplateService, FormValidator, Notifications, ResourceControlService });\n\n this.formValues = null;\n this.state = {\n formValidationError: '',\n isEditorDirty: false,\n };\n this.templates = [];\n\n this.getTemplate = this.getTemplate.bind(this);\n this.submitAction = this.submitAction.bind(this);\n this.onChangeFileContent = this.onChangeFileContent.bind(this);\n this.onBeforeUnload = this.onBeforeUnload.bind(this);\n }\n\n getTemplate() {\n return this.$async(async () => {\n try {\n const { id } = this.$state.params;\n\n const [template, file] = await Promise.all([this.CustomTemplateService.customTemplate(id), this.CustomTemplateService.customTemplateFile(id)]);\n template.FileContent = file;\n this.formValues = template;\n this.oldFileContent = this.formValues.FileContent;\n\n this.formValues.ResourceControl = new ResourceControlViewModel(template.ResourceControl);\n this.formValues.AccessControlData = new AccessControlFormData();\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve custom template data');\n }\n });\n }\n\n validateForm() {\n this.state.formValidationError = '';\n\n if (!this.formValues.FileContent) {\n this.state.formValidationError = 'Template file content must not be empty';\n return false;\n }\n\n const title = this.formValues.Title;\n const id = this.$state.params.id;\n\n const isNotUnique = this.templates.some((template) => template.Title === title && template.Id != id);\n if (isNotUnique) {\n this.state.formValidationError = `A template with the name ${title} already exists`;\n return false;\n }\n\n const isAdmin = this.Authentication.isAdmin();\n const accessControlData = this.formValues.AccessControlData;\n const error = this.FormValidator.validateAccessControl(accessControlData, isAdmin);\n\n if (error) {\n this.state.formValidationError = error;\n return false;\n }\n\n return true;\n }\n\n submitAction() {\n return this.$async(async () => {\n if (!this.validateForm()) {\n return;\n }\n\n this.actionInProgress = true;\n try {\n await this.CustomTemplateService.updateCustomTemplate(this.formValues.Id, this.formValues);\n\n const userDetails = this.Authentication.getUserDetails();\n const userId = userDetails.ID;\n await this.ResourceControlService.applyResourceControl(userId, this.formValues.AccessControlData, this.formValues.ResourceControl);\n\n this.Notifications.success('Custom template successfully updated');\n this.state.isEditorDirty = false;\n this.$state.go('kubernetes.templates.custom');\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to update custom template');\n } finally {\n this.actionInProgress = false;\n }\n });\n }\n\n onChangeFileContent(value) {\n if (stripSpaces(this.formValues.FileContent) !== stripSpaces(value)) {\n this.formValues.FileContent = value;\n this.state.isEditorDirty = true;\n }\n }\n\n async $onInit() {\n this.$async(async () => {\n this.getTemplate();\n\n try {\n this.templates = await this.CustomTemplateService.customTemplates();\n } catch (err) {\n this.Notifications.error('Failure loading', err, 'Failed loading custom templates');\n }\n\n window.addEventListener('beforeunload', this.onBeforeUnload);\n });\n }\n\n isEditorDirty() {\n return this.formValues.FileContent !== this.oldFileContent && this.state.isEditorDirty;\n }\n\n uiCanExit() {\n if (this.isEditorDirty()) {\n return this.ModalService.confirmWebEditorDiscard();\n }\n }\n\n onBeforeUnload(event) {\n if (this.formValues.FileContent !== this.oldFileContent && this.state.isEditorDirty) {\n event.preventDefault();\n event.returnValue = '';\n\n return '';\n }\n }\n\n $onDestroy() {\n window.removeEventListener('beforeunload', this.onBeforeUnload);\n }\n}\n\nexport default KubeEditCustomTemplateViewController;\n\nfunction stripSpaces(str = '') {\n return str.replace(/(\\r\\n|\\n|\\r)/gm, '');\n}\n","const autoNgTemplateLoaderTemplate1 = require('./kube-create-custom-template-view.html');\n\nimport controller from './kube-create-custom-template-view.controller.js';\n\nexport const kubeCreateCustomTemplateView = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n};\n","import { buildOption } from '@/portainer/components/box-selector';\nimport { AccessControlFormData } from '@/portainer/components/accessControlForm/porAccessControlFormModel';\n\nclass KubeCreateCustomTemplateViewController {\n /* @ngInject */\n constructor($async, $state, Authentication, CustomTemplateService, FormValidator, ModalService, Notifications, ResourceControlService) {\n Object.assign(this, { $async, $state, Authentication, CustomTemplateService, FormValidator, ModalService, Notifications, ResourceControlService });\n\n this.methodOptions = [\n buildOption('method_editor', 'fa fa-edit', 'Web editor', 'Use our Web editor', 'editor'),\n buildOption('method_upload', 'fa fa-upload', 'Upload', 'Upload from your computer', 'upload'),\n ];\n\n this.templates = null;\n\n this.state = {\n method: 'editor',\n actionInProgress: false,\n formValidationError: '',\n isEditorDirty: false,\n };\n\n this.formValues = {\n FileContent: '',\n File: null,\n Title: '',\n Description: '',\n Note: '',\n Logo: '',\n AccessControlData: new AccessControlFormData(),\n };\n\n this.onChangeFile = this.onChangeFile.bind(this);\n this.onChangeFileContent = this.onChangeFileContent.bind(this);\n this.onChangeMethod = this.onChangeMethod.bind(this);\n this.onBeforeOnload = this.onBeforeOnload.bind(this);\n }\n\n onChangeMethod(method) {\n this.state.method = method;\n }\n\n onChangeFileContent(content) {\n this.formValues.FileContent = content;\n this.state.isEditorDirty = true;\n }\n\n onChangeFile(file) {\n this.formValues.File = file;\n }\n\n async createCustomTemplate() {\n return this.$async(async () => {\n const { method } = this.state;\n\n if (!this.validateForm(method)) {\n return;\n }\n\n this.state.actionInProgress = true;\n try {\n const customTemplate = await this.createCustomTemplateByMethod(method, this.formValues);\n\n const accessControlData = this.formValues.AccessControlData;\n const userDetails = this.Authentication.getUserDetails();\n const userId = userDetails.ID;\n await this.ResourceControlService.applyResourceControl(userId, accessControlData, customTemplate.ResourceControl);\n\n this.Notifications.success('Custom template successfully created');\n this.state.isEditorDirty = false;\n this.$state.go('kubernetes.templates.custom');\n } catch (err) {\n this.Notifications.error('Failure', err, 'Failed creating custom template');\n } finally {\n this.state.actionInProgress = false;\n }\n });\n }\n\n createCustomTemplateByMethod(method, template) {\n template.Type = 3;\n\n switch (method) {\n case 'editor':\n return this.createCustomTemplateFromFileContent(template);\n case 'upload':\n return this.createCustomTemplateFromFileUpload(template);\n }\n }\n\n createCustomTemplateFromFileContent(template) {\n return this.CustomTemplateService.createCustomTemplateFromFileContent(template);\n }\n\n createCustomTemplateFromFileUpload(template) {\n return this.CustomTemplateService.createCustomTemplateFromFileUpload(template);\n }\n\n validateForm(method) {\n this.state.formValidationError = '';\n\n if (method === 'editor' && this.formValues.FileContent === '') {\n this.state.formValidationError = 'Template file content must not be empty';\n return false;\n }\n\n const title = this.formValues.Title;\n const isNotUnique = this.templates.some((template) => template.Title === title);\n if (isNotUnique) {\n this.state.formValidationError = 'A template with the same name already exists';\n return false;\n }\n\n const isAdmin = this.Authentication.isAdmin();\n const accessControlData = this.formValues.AccessControlData;\n const error = this.FormValidator.validateAccessControl(accessControlData, isAdmin);\n\n if (error) {\n this.state.formValidationError = error;\n return false;\n }\n\n return true;\n }\n\n async $onInit() {\n return this.$async(async () => {\n const { fileContent, type } = this.$state.params;\n\n this.formValues.FileContent = fileContent;\n if (type) {\n this.formValues.Type = +type;\n }\n\n try {\n this.templates = await this.CustomTemplateService.customTemplates(3);\n } catch (err) {\n this.Notifications.error('Failure loading', err, 'Failed loading custom templates');\n }\n\n this.state.loading = false;\n\n window.addEventListener('beforeunload', this.onBeforeOnload);\n });\n }\n\n $onDestroy() {\n window.removeEventListener('beforeunload', this.onBeforeOnload);\n }\n\n isEditorDirty() {\n return this.state.method === 'editor' && this.formValues.FileContent && this.state.isEditorDirty;\n }\n\n onBeforeOnload(event) {\n if (this.isEditorDirty()) {\n event.preventDefault();\n event.returnValue = '';\n }\n }\n\n uiCanExit() {\n if (this.isEditorDirty()) {\n return this.ModalService.confirmWebEditorDiscard();\n }\n }\n}\n\nexport default KubeCreateCustomTemplateViewController;\n","export default class BoxSelectorController {\n constructor() {\n this.isChecked = this.isChecked.bind(this);\n this.change = this.change.bind(this);\n }\n\n change(value, limited) {\n this.ngModel = value;\n if (this.onChange) {\n this.onChange(value, limited);\n }\n }\n\n isChecked(value) {\n return this.ngModel === value;\n }\n}\n","import { KubernetesConfigurationTypes } from 'Kubernetes/models/configuration/models';\n\nexport default class {\n $onInit() {\n const secrets = (this.configurations || [])\n .filter((config) => config.Data && config.Type === KubernetesConfigurationTypes.SECRET)\n .flatMap((config) => Object.entries(config.Data))\n .map(([key, value]) => ({ key, value }));\n\n this.state = { secrets };\n }\n}\n","export default class HelmAddRepositoryController {\n /* @ngInject */\n constructor($state, $async, HelmService, Notifications, EndpointProvider) {\n this.$state = $state;\n this.$async = $async;\n this.HelmService = HelmService;\n this.Notifications = Notifications;\n this.EndpointProvider = EndpointProvider;\n }\n\n doesRepoExist() {\n if (!this.state.repository) {\n return false;\n }\n // lowercase, strip trailing slash and compare\n return this.repos.includes(this.state.repository.toLowerCase().replace(/\\/$/, ''));\n }\n\n async addRepository() {\n this.state.isAddingRepo = true;\n try {\n await this.HelmService.addHelmRepository(this.EndpointProvider.currentEndpoint().Id, { url: this.state.repository });\n this.Notifications.success('Helm repository added successfully');\n this.$state.reload(this.$state.current);\n } catch (err) {\n this.Notifications.error('Installation error', err);\n } finally {\n this.state.isAddingRepo = false;\n }\n }\n\n $onInit() {\n return this.$async(async () => {\n this.state = {\n isAddingRepo: false,\n repository: '',\n };\n });\n }\n}\n","export default class HelmTemplatesListController {\n /* @ngInject */\n constructor($async, DatatableService, HelmService, Notifications) {\n this.$async = $async;\n this.DatatableService = DatatableService;\n this.HelmService = HelmService;\n this.Notifications = Notifications;\n\n this.updateCategories = this.updateCategories.bind(this);\n }\n\n async updateCategories() {\n try {\n const annotationCategories = this.charts\n .map((t) => t.annotations) // get annotations\n .filter((a) => a) // filter out undefined/nulls\n .map((c) => c.category); // get annotation category\n const availableCategories = [...new Set(annotationCategories)].sort(); // unique and sort\n this.state.categories = availableCategories;\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve helm charts categories');\n }\n }\n\n onTextFilterChange() {\n this.DatatableService.setDataTableTextFilters(this.tableKey, this.state.textFilter);\n }\n\n clearCategory() {\n this.state.selectedCategory = '';\n }\n\n $onChanges() {\n if (this.charts.length > 0) {\n this.updateCategories();\n }\n }\n\n $onInit() {\n return this.$async(async () => {\n this.state = {\n textFilter: '',\n selectedCategory: '',\n categories: [],\n };\n\n const textFilter = this.DatatableService.getDataTableTextFilters(this.tableKey);\n if (textFilter !== null) {\n this.state.textFilter = textFilter;\n }\n });\n }\n}\n","import _ from 'lodash-es';\nimport KubernetesNamespaceHelper from 'Kubernetes/helpers/namespaceHelper';\n\nexport default class HelmTemplatesController {\n /* @ngInject */\n constructor($analytics, $async, $state, $window, $anchorScroll, Authentication, HelmService, KubernetesResourcePoolService, Notifications, ModalService) {\n this.$analytics = $analytics;\n this.$async = $async;\n this.$window = $window;\n this.$state = $state;\n this.$anchorScroll = $anchorScroll;\n this.Authentication = Authentication;\n this.HelmService = HelmService;\n this.KubernetesResourcePoolService = KubernetesResourcePoolService;\n this.Notifications = Notifications;\n this.ModalService = ModalService;\n\n this.editorUpdate = this.editorUpdate.bind(this);\n this.uiCanExit = this.uiCanExit.bind(this);\n this.installHelmchart = this.installHelmchart.bind(this);\n this.getHelmValues = this.getHelmValues.bind(this);\n this.selectHelmChart = this.selectHelmChart.bind(this);\n this.getHelmRepoURLs = this.getHelmRepoURLs.bind(this);\n this.getLatestCharts = this.getLatestCharts.bind(this);\n this.getResourcePools = this.getResourcePools.bind(this);\n\n $window.onbeforeunload = () => {\n if (this.state.isEditorDirty) {\n return '';\n }\n };\n }\n\n editorUpdate(content) {\n const contentvalues = content.getValue();\n if (this.state.originalvalues === contentvalues) {\n this.state.isEditorDirty = false;\n } else {\n this.state.values = contentvalues;\n this.state.isEditorDirty = true;\n }\n }\n\n async uiCanExit() {\n if (this.state.isEditorDirty) {\n return this.ModalService.confirmWebEditorDiscard();\n }\n }\n\n async installHelmchart() {\n this.state.actionInProgress = true;\n try {\n const payload = {\n Name: this.state.appName,\n Repo: this.state.chart.repo,\n Chart: this.state.chart.name,\n Values: this.state.values,\n Namespace: this.state.resourcePool.Namespace.Name,\n };\n await this.HelmService.install(this.endpoint.Id, payload);\n this.Notifications.success('Helm Chart successfully installed');\n this.$analytics.eventTrack('kubernetes-helm-install', { category: 'kubernetes', metadata: { 'chart-name': this.state.chart.name } });\n this.state.isEditorDirty = false;\n this.$state.go('kubernetes.applications');\n } catch (err) {\n this.Notifications.error('Installation error', err);\n } finally {\n this.state.actionInProgress = false;\n }\n }\n\n async getHelmValues() {\n this.state.loadingValues = true;\n try {\n const { values } = await this.HelmService.values(this.state.chart.repo, this.state.chart.name);\n this.state.values = values;\n this.state.originalvalues = values;\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve helm chart values.');\n } finally {\n this.state.loadingValues = false;\n }\n }\n\n async selectHelmChart(chart) {\n this.$anchorScroll('view-top');\n this.state.showCustomValues = false;\n this.state.chart = chart;\n await this.getHelmValues();\n }\n\n /**\n * @description This function is used to get the helm repo urls for the endpoint and user\n * @returns {Promise<string[]>} list of helm repo urls\n */\n async getHelmRepoURLs() {\n this.state.reposLoading = true;\n try {\n // fetch globally set helm repo and user helm repos (parallel)\n const { GlobalRepository, UserRepositories } = await this.HelmService.getHelmRepositories(this.endpoint.Id);\n this.state.globalRepository = GlobalRepository;\n const userHelmReposUrls = UserRepositories.map((repo) => repo.URL);\n const uniqueHelmRepos = [...new Set([GlobalRepository, ...userHelmReposUrls])].map((url) => url.toLowerCase()).filter((url) => url); // remove duplicates and blank, to lowercase\n this.state.repos = uniqueHelmRepos;\n return uniqueHelmRepos;\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve helm repo urls.');\n } finally {\n this.state.reposLoading = false;\n }\n }\n\n /**\n * @description This function is used to fetch the respective index.yaml files for the provided helm repo urls\n * @param {string[]} helmRepos list of helm repositories\n * @param {bool} append append charts returned from repo to existing list of helm charts\n */\n async getLatestCharts(helmRepos) {\n this.state.chartsLoading = true;\n try {\n const promiseList = helmRepos.map((repo) => this.HelmService.search(repo));\n // fetch helm charts from all the provided helm repositories (parallel)\n // Promise.allSettled is used to account for promise failure(s) - in cases the user has provided invalid helm repo\n const chartPromises = await Promise.allSettled(promiseList);\n const latestCharts = chartPromises\n .filter((tp) => tp.status === 'fulfilled') // remove failed promises\n .map((tp) => ({ entries: tp.value.entries, repo: helmRepos[chartPromises.indexOf(tp)] })) // extract chart entries with respective repo data\n .flatMap(\n ({ entries, repo }) => Object.values(entries).map((charts) => ({ ...charts[0], repo })) // flatten chart entries to single array with respective repo\n );\n\n this.state.charts = latestCharts;\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve helm repo charts.');\n } finally {\n this.state.chartsLoading = false;\n }\n }\n\n async getResourcePools() {\n this.state.resourcePoolsLoading = true;\n try {\n const resourcePools = await this.KubernetesResourcePoolService.get();\n\n const nonSystemNamespaces = resourcePools.filter((resourcePool) => !KubernetesNamespaceHelper.isSystemNamespace(resourcePool.Namespace.Name));\n this.state.resourcePools = _.sortBy(nonSystemNamespaces, ({ Namespace }) => (Namespace.Name === 'default' ? 0 : 1));\n this.state.resourcePool = this.state.resourcePools[0];\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve initial helm data.');\n } finally {\n this.state.resourcePoolsLoading = false;\n }\n }\n\n $onInit() {\n return this.$async(async () => {\n this.state = {\n appName: '',\n chart: null,\n showCustomValues: false,\n actionInProgress: false,\n resourcePools: [],\n resourcePool: '',\n values: null,\n originalvalues: null,\n repos: [],\n charts: [],\n loadingValues: false,\n isEditorDirty: false,\n chartsLoading: false,\n resourcePoolsLoading: false,\n viewReady: false,\n isAdmin: this.Authentication.isAdmin(),\n globalRepository: undefined,\n };\n\n const helmRepos = await this.getHelmRepoURLs();\n await Promise.all([this.getLatestCharts(helmRepos), this.getResourcePools()]);\n\n this.state.viewReady = true;\n });\n }\n\n $onDestroy() {\n this.state.isEditorDirty = false;\n }\n}\n","import { Terminal } from 'xterm';\nimport * as fit from 'xterm/lib/addons/fit/fit';\n\nexport default class KubectlShellController {\n /* @ngInject */\n constructor(TerminalWindow, $window, $async, EndpointProvider, LocalStorage, Notifications) {\n this.$async = $async;\n this.$window = $window;\n this.TerminalWindow = TerminalWindow;\n this.EndpointProvider = EndpointProvider;\n this.LocalStorage = LocalStorage;\n this.Notifications = Notifications;\n\n $window.onbeforeunload = () => {\n if (this.state.shell.connected) {\n return '';\n }\n };\n }\n\n disconnect() {\n if (this.state.shell.connected) {\n this.state.shell.connected = false;\n this.state.icon = 'fas fa-window-minimize';\n this.state.shell.socket.close();\n this.state.shell.term.dispose();\n this.TerminalWindow.terminalclose();\n this.$window.onresize = null;\n }\n }\n\n screenClear() {\n this.state.shell.term.clear();\n }\n\n miniRestore() {\n if (this.state.css === 'mini') {\n this.state.css = 'normal';\n this.state.icon = 'fas fa-window-minimize';\n this.TerminalWindow.terminalopen();\n } else {\n this.state.css = 'mini';\n this.state.icon = 'fas fa-window-restore';\n this.TerminalWindow.terminalclose();\n }\n }\n\n configureSocketAndTerminal(socket, term) {\n socket.onopen = () => {\n const terminal_container = document.getElementById('terminal-container');\n term.open(terminal_container);\n term.setOption('cursorBlink', true);\n term.focus();\n term.fit();\n term.writeln('#Run kubectl commands inside here');\n term.writeln('#e.g. kubectl get all');\n term.writeln('');\n };\n\n term.on('data', (data) => {\n socket.send(data);\n });\n\n socket.onmessage = (msg) => {\n term.write(msg.data);\n };\n\n socket.onerror = (err) => {\n this.disconnect();\n if (err.target.readyState !== WebSocket.CLOSED) {\n this.Notifications.error('Failure', err, 'Websocket connection error');\n }\n };\n\n this.$window.onresize = () => {\n this.TerminalWindow.terminalresize();\n };\n\n socket.onclose = this.disconnect.bind(this);\n\n this.state.shell.connected = true;\n }\n\n connectConsole() {\n this.TerminalWindow.terminalopen();\n this.state.css = 'normal';\n\n const params = {\n token: this.LocalStorage.getJWT(),\n endpointId: this.EndpointProvider.endpointID(),\n };\n\n const wsProtocol = this.$window.location.protocol === 'https:' ? 'wss://' : 'ws://';\n const path = '/api/websocket/kubernetes-shell';\n const queryParams = Object.entries(params)\n .map(([k, v]) => `${k}=${v}`)\n .join('&');\n const url = `${wsProtocol}${window.location.host}${path}?${queryParams}`;\n\n Terminal.applyAddon(fit);\n this.state.shell.socket = new WebSocket(url);\n this.state.shell.term = new Terminal();\n\n this.configureSocketAndTerminal(this.state.shell.socket, this.state.shell.term);\n }\n\n $onInit() {\n return this.$async(async () => {\n this.state = {\n css: 'normal',\n icon: 'fa-window-minimize',\n shell: {\n connected: false,\n socket: null,\n term: null,\n },\n };\n });\n }\n\n $onDestroy() {\n if (this.state.shell.connected) {\n this.disconnect();\n this.$window.onresize = null;\n }\n }\n}\n","import { KubernetesCommonMetadataPayload } from 'Kubernetes/models/common/payloads';\n\n/**\n * KubernetesDeploymentCreatePayload Model\n */\nconst _KubernetesDeploymentCreatePayload = Object.freeze({\n metadata: new KubernetesCommonMetadataPayload(),\n spec: {\n replicas: 0,\n selector: {\n matchLabels: {\n app: '',\n },\n },\n strategy: {\n type: 'RollingUpdate',\n rollingUpdate: {\n maxSurge: 0,\n maxUnavailable: '100%',\n },\n },\n template: {\n metadata: {\n labels: {\n app: '',\n },\n },\n spec: {\n affinity: {},\n containers: [\n {\n name: '',\n image: '',\n env: [],\n resources: {\n limits: {},\n requests: {},\n },\n volumeMounts: [],\n },\n ],\n volumes: [],\n },\n },\n },\n});\n\nexport class KubernetesDeploymentCreatePayload {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesDeploymentCreatePayload)));\n }\n}\n","import { KubernetesCommonMetadataPayload } from 'Kubernetes/models/common/payloads';\n\n/**\n * KubernetesDaemonSetCreatePayload Model\n */\nconst _KubernetesDaemonSetCreatePayload = Object.freeze({\n metadata: new KubernetesCommonMetadataPayload(),\n spec: {\n replicas: 0,\n selector: {\n matchLabels: {\n app: '',\n },\n },\n updateStrategy: {\n type: 'RollingUpdate',\n rollingUpdate: {\n maxUnavailable: 1,\n },\n },\n template: {\n metadata: {\n labels: {\n app: '',\n },\n },\n spec: {\n containers: [\n {\n name: '',\n image: '',\n env: [],\n resources: {\n limits: {},\n requests: {},\n },\n volumeMounts: [],\n },\n ],\n volumes: [],\n },\n },\n },\n});\n\nexport class KubernetesDaemonSetCreatePayload {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesDaemonSetCreatePayload)));\n }\n}\n","import { KubernetesCommonMetadataPayload } from 'Kubernetes/models/common/payloads';\n\n/**\n * KubernetesStatefulSetCreatePayload Model\n */\nconst _KubernetesStatefulSetCreatePayload = Object.freeze({\n metadata: new KubernetesCommonMetadataPayload(),\n spec: {\n replicas: 0,\n serviceName: '',\n selector: {\n matchLabels: {\n app: '',\n },\n },\n volumeClaimTemplates: [],\n updateStrategy: {\n type: 'RollingUpdate',\n rollingUpdate: {\n partition: 0,\n },\n },\n template: {\n metadata: {\n labels: {\n app: '',\n },\n },\n spec: {\n containers: [\n {\n name: '',\n image: '',\n env: [],\n resources: {\n limits: {},\n requests: {},\n },\n volumeMounts: [],\n },\n ],\n volumes: [],\n },\n },\n },\n});\n\nexport class KubernetesStatefulSetCreatePayload {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesStatefulSetCreatePayload)));\n }\n}\n","import { KubernetesCommonMetadataPayload } from 'Kubernetes/models/common/payloads';\n\n/**\n * KubernetesPersistentVolumClaimCreatePayload Model\n */\nconst _KubernetesPersistentVolumClaimCreatePayload = Object.freeze({\n metadata: new KubernetesCommonMetadataPayload(),\n spec: {\n accessModes: ['ReadWriteOnce'],\n resources: {\n requests: {\n storage: '',\n },\n },\n storageClassName: '',\n },\n});\n\nexport class KubernetesPersistentVolumClaimCreatePayload {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesPersistentVolumClaimCreatePayload)));\n }\n}\n","import { KubernetesCommonMetadataPayload } from 'Kubernetes/models/common/payloads';\n\n/**\n * KubernetesServiceCreatePayload Model\n */\nconst _KubernetesServiceCreatePayload = Object.freeze({\n metadata: new KubernetesCommonMetadataPayload(),\n spec: {\n ports: [],\n selector: {\n app: '',\n },\n type: '',\n clusterIP: '',\n },\n});\n\nexport class KubernetesServiceCreatePayload {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesServiceCreatePayload)));\n }\n}\n","import _ from 'lodash-es';\n\nexport class KubernetesIngressHelper {\n static findSBoundServiceIngressesRules(ingresses, serviceName) {\n const rules = _.flatMap(ingresses, 'Paths');\n return _.filter(rules, { ServiceName: serviceName });\n }\n}\n","import { KubernetesEvent } from 'Kubernetes/models/event/models';\n\nclass KubernetesEventConverter {\n static apiToEvent(data) {\n const res = new KubernetesEvent();\n res.Id = data.metadata.uid;\n res.Date = data.lastTimestamp || data.eventTime;\n res.Type = data.type;\n res.Message = data.message;\n res.Involved = data.involvedObject;\n return res;\n }\n}\n\nexport default KubernetesEventConverter;\n","/**\n * KubernetesEvent Model\n */\nconst _KubernetesEvent = Object.freeze({\n Id: '',\n Date: 0,\n Type: '',\n Message: '',\n Involved: {},\n});\n\nexport class KubernetesEvent {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesEvent)));\n }\n}\n","import { KubernetesCommonMetadataPayload } from '../common/payloads';\n\n/**\n * KubernetesNamespaceCreatePayload Model\n */\nconst _KubernetesNamespaceCreatePayload = Object.freeze({\n metadata: new KubernetesCommonMetadataPayload(),\n});\n\nexport class KubernetesNamespaceCreatePayload {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesNamespaceCreatePayload)));\n }\n}\n","import { KubernetesCommonMetadataPayload } from 'Kubernetes/models/common/payloads';\nimport {\n KubernetesPortainerResourceQuotaCPURequest,\n KubernetesPortainerResourceQuotaMemoryRequest,\n KubernetesPortainerResourceQuotaCPULimit,\n KubernetesPortainerResourceQuotaMemoryLimit,\n} from './models';\n\nexport function KubernetesResourceQuotaCreatePayload() {\n return {\n metadata: new KubernetesCommonMetadataPayload(),\n spec: {\n hard: {\n [KubernetesPortainerResourceQuotaCPURequest]: 0,\n [KubernetesPortainerResourceQuotaMemoryRequest]: 0,\n [KubernetesPortainerResourceQuotaCPULimit]: 0,\n [KubernetesPortainerResourceQuotaMemoryLimit]: 0,\n },\n },\n };\n}\n","import { KubernetesCommonMetadataPayload } from 'Kubernetes/models/common/payloads';\n\n/**\n * KubernetesStorageClassCreatePayload Model\n */\nconst _KubernetesStorageClassCreatePayload = Object.freeze({\n metadata: new KubernetesCommonMetadataPayload(),\n provisioner: '',\n allowVolumeExpansion: false,\n});\n\nexport class KubernetesStorageClassCreatePayload {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesStorageClassCreatePayload)));\n }\n}\n","import _ from 'lodash-es';\nimport { KubernetesEndpoint, KubernetesEndpointAnnotationLeader, KubernetesEndpointSubset } from 'Kubernetes/endpoint/models';\n\nclass KubernetesEndpointConverter {\n static apiToEndpoint(data) {\n const res = new KubernetesEndpoint();\n res.Id = data.metadata.uid;\n res.Name = data.metadata.name;\n res.Namespace = data.metadata.namespace;\n const leaderAnnotation = data.metadata.annotations ? data.metadata.annotations[KubernetesEndpointAnnotationLeader] : '';\n if (leaderAnnotation) {\n const parsedJson = JSON.parse(leaderAnnotation);\n const split = _.split(parsedJson.holderIdentity, '_');\n res.HolderIdentity = split[0];\n }\n\n if (data.subsets) {\n res.Subsets = _.map(data.subsets, (item) => {\n const subset = new KubernetesEndpointSubset();\n subset.Ips = _.map(item.addresses, 'ip');\n const port = _.find(item.ports, { name: 'https' });\n subset.Port = port ? port.port : undefined;\n return subset;\n });\n }\n return res;\n }\n}\n\nexport default KubernetesEndpointConverter;\n","import angular from 'angular';\nimport _ from 'lodash-es';\nimport PortainerError from 'Portainer/error';\n\nimport { KubernetesApplicationTypes } from 'Kubernetes/models/application/models';\nimport { KubernetesSystem_DefaultDeploymentUniqueLabelKey, KubernetesSystem_AnnotationsToSkip } from 'Kubernetes/models/history/models';\n\nclass KubernetesApplicationRollbackHelper {\n static getPatchPayload(application, targetRevision) {\n let result;\n\n switch (application.ApplicationType) {\n case KubernetesApplicationTypes.DEPLOYMENT:\n result = KubernetesApplicationRollbackHelper._getDeploymentPayload(application, targetRevision);\n break;\n case KubernetesApplicationTypes.DAEMONSET:\n result = KubernetesApplicationRollbackHelper._getDaemonSetPayload(application, targetRevision);\n break;\n case KubernetesApplicationTypes.STATEFULSET:\n result = KubernetesApplicationRollbackHelper._getStatefulSetPayload(application, targetRevision);\n break;\n default:\n throw new PortainerError('Unable to determine which association to use to convert patch');\n }\n return result;\n }\n\n static _getDeploymentPayload(deploymentApp, targetRevision) {\n const target = angular.copy(targetRevision);\n const deployment = deploymentApp.Raw;\n\n // remove hash label before patching back into the deployment\n delete target.spec.template.metadata.labels[KubernetesSystem_DefaultDeploymentUniqueLabelKey];\n\n // compute deployment annotations\n const annotations = {};\n _.forEach(KubernetesSystem_AnnotationsToSkip, (_, k) => {\n const v = deployment.metadata.annotations[k];\n if (v) {\n annotations[k] = v;\n }\n });\n _.forEach(target.metadata.annotations, (v, k) => {\n if (!KubernetesSystem_AnnotationsToSkip[k]) {\n annotations[k] = v;\n }\n });\n // Create a patch of the Deployment that replaces spec.template\n const patch = [\n {\n op: 'replace',\n path: '/spec/template',\n value: target.spec.template,\n },\n {\n op: 'replace',\n path: '/metadata/annotations',\n value: annotations,\n },\n ];\n\n return patch;\n }\n\n static _getDaemonSetPayload(daemonSet, targetRevision) {\n void daemonSet;\n return targetRevision.data;\n }\n\n static _getStatefulSetPayload(statefulSet, targetRevision) {\n void statefulSet;\n return targetRevision.data;\n }\n}\n\nexport default KubernetesApplicationRollbackHelper;\n","import _ from 'lodash-es';\nimport PortainerError from 'Portainer/error';\n\nimport KubernetesDeploymentHistoryHelper from 'Kubernetes/helpers/history/deployment';\nimport KubernetesDaemonSetHistoryHelper from 'Kubernetes/helpers/history/daemonset';\nimport KubernetesStatefulSetHistoryHelper from 'Kubernetes/helpers/history/statefulset';\nimport { KubernetesApplicationTypes } from 'Kubernetes/models/application/models';\n\nclass KubernetesHistoryHelper {\n static getRevisions(rawRevisions, application) {\n let currentRevision, revisionsList;\n\n switch (application.ApplicationType) {\n case KubernetesApplicationTypes.DEPLOYMENT:\n [currentRevision, revisionsList] = KubernetesHistoryHelper._getDeploymentRevisions(rawRevisions, application.Raw);\n break;\n case KubernetesApplicationTypes.DAEMONSET:\n [currentRevision, revisionsList] = KubernetesHistoryHelper._getDaemonSetRevisions(rawRevisions, application.Raw);\n break;\n case KubernetesApplicationTypes.STATEFULSET:\n [currentRevision, revisionsList] = KubernetesHistoryHelper._getStatefulSetRevisions(rawRevisions, application.Raw);\n break;\n default:\n throw new PortainerError('Unable to determine which association to use to get revisions');\n }\n revisionsList = _.sortBy(revisionsList, 'revision');\n return [currentRevision, revisionsList];\n }\n\n static _getDeploymentRevisions(rsList, deployment) {\n const appRS = KubernetesDeploymentHistoryHelper.filterOwnedRevisions(rsList, deployment);\n const currentRS = KubernetesDeploymentHistoryHelper.getCurrentRevision(appRS, deployment);\n const versionedRS = KubernetesDeploymentHistoryHelper.filterVersionedRevisions(appRS);\n return [currentRS, versionedRS];\n }\n\n static _getDaemonSetRevisions(crList, daemonSet) {\n const appCR = KubernetesDaemonSetHistoryHelper.filterOwnedRevisions(crList, daemonSet);\n const currentCR = KubernetesDaemonSetHistoryHelper.getCurrentRevision(appCR, daemonSet);\n return [currentCR, appCR];\n }\n\n static _getStatefulSetRevisions(crList, statefulSet) {\n const appCR = KubernetesStatefulSetHistoryHelper.filterOwnedRevisions(crList, statefulSet);\n const currentCR = KubernetesStatefulSetHistoryHelper.getCurrentRevision(appCR, statefulSet);\n return [currentCR, appCR];\n }\n}\n\nexport default KubernetesHistoryHelper;\n","/**\n * Stack Model\n */\nconst _KubernetesStack = Object.freeze({\n Name: '',\n ResourcePool: '',\n Applications: [],\n});\n\nexport class KubernetesStack {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesStack)));\n }\n}\n","/**\n * KubernetesHorizontalPodAutoScaler Create Payload Model\n */\nconst _KubernetesHorizontalPodAutoScalerCreatePayload = Object.freeze({\n metadata: {\n namespace: '',\n name: '',\n },\n spec: {\n maxReplicas: 0,\n minReplicas: 0,\n targetCPUUtilizationPercentage: 0,\n scaleTargetRef: {\n kind: '',\n name: '',\n },\n },\n});\n\nexport class KubernetesHorizontalPodAutoScalerCreatePayload {\n constructor() {\n Object.assign(this, JSON.parse(JSON.stringify(_KubernetesHorizontalPodAutoScalerCreatePayload)));\n }\n}\n\n/**\n * KubernetesHorizontalPodAutoScaler Create Payload Model for v2beta2\n * Include support of memory usage\n */\n\n// const _KubernetesHorizontalPodAutoScalerCreatePayload = Object.freeze({\n// metadata: {\n// namespace: '',\n// name: ''\n// },\n// spec: {\n// maxReplicas: 0,\n// minReplicas: 0,\n// targetCPUUtilizationPercentage: 0,\n// scaleTargetRef: {\n// kind: '',\n// name: ''\n// },\n// metrics: []\n// }\n// });\n\n// export class KubernetesHorizontalPodAutoScalerCreatePayload {\n// constructor() {\n// Object.assign(this, JSON.parse(JSON.stringify(_KubernetesHorizontalPodAutoScalerCreatePayload)));\n// }\n// }\n\n// const _KubernetesHorizontalPodAutoScalerCPUMetric = Object.freeze({\n// type: 'Resource',\n// resource: {\n// name: 'cpu',\n// target: {\n// type: 'Utilization',\n// averageUtilization: 0\n// }\n// }\n// });\n\n// export class KubernetesHorizontalPodAutoScalerCPUMetric {\n// constructor() {\n// Object.assign(this, JSON.parse(JSON.stringify(_KubernetesHorizontalPodAutoScalerCPUMetric)));\n// }\n// }\n\n// const _KubernetesHorizontalPodAutoScalerMemoryMetric = Object.freeze({\n// type: 'Resource',\n// resource: {\n// name: 'memory',\n// target: {\n// type: 'AverageValue',\n// averageValue: ''\n// }\n// }\n// });\n\n// export class KubernetesHorizontalPodAutoScalerMemoryMetric {\n// constructor() {\n// Object.assign(this, JSON.parse(JSON.stringify(_KubernetesHorizontalPodAutoScalerMemoryMetric)));\n// }\n// }\n","import _ from 'lodash-es';\n\n/**\n * NodesLimits Model\n */\nexport class KubernetesNodesLimits {\n constructor(nodesLimits) {\n this.MaxCPU = 0;\n this.MaxMemory = 0;\n this.nodesLimits = this.convertCPU(nodesLimits);\n\n this.calculateMaxCPUMemory();\n }\n\n convertCPU(nodesLimits) {\n _.forEach(nodesLimits, (value) => {\n if (value.CPU) {\n value.CPU /= 1000.0;\n }\n });\n return nodesLimits;\n }\n\n calculateMaxCPUMemory() {\n const nodesLimitsArray = Object.values(this.nodesLimits);\n this.MaxCPU = _.maxBy(nodesLimitsArray, 'CPU').CPU;\n this.MaxMemory = _.maxBy(nodesLimitsArray, 'Memory').Memory;\n }\n\n // check if there is enough cpu and memory to allocate containers in replica mode\n overflowForReplica(cpu, memory, instances) {\n _.forEach(this.nodesLimits, (value) => {\n instances -= Math.min(Math.floor(value.CPU / cpu), Math.floor(value.Memory / memory));\n });\n\n return instances > 0;\n }\n\n // check if there is enough cpu and memory to allocate containers in global mode\n overflowForGlobal(cpu, memory) {\n let overflow = false;\n\n _.forEach(this.nodesLimits, (value) => {\n if (cpu > value.CPU || memory > value.Memory) {\n overflow = true;\n }\n });\n\n return overflow;\n }\n\n excludesPods(pods, cpuLimit, memoryLimit) {\n const nodesLimits = this.nodesLimits;\n\n _.forEach(pods, (value) => {\n const node = value.Node;\n if (node && nodesLimits[node]) {\n nodesLimits[node].CPU += cpuLimit;\n nodesLimits[node].Memory += memoryLimit;\n }\n });\n\n this.calculateMaxCPUMemory();\n }\n}\n","import { KubernetesCommonMetadataPayload } from 'Kubernetes/models/common/payloads';\n\nexport function createPayloadFactory() {\n return {\n metadata: new KubernetesCommonMetadataPayload(),\n spec: {\n replicas: 0,\n selector: {\n matchLabels: {\n app: '',\n },\n },\n strategy: {\n type: 'RollingUpdate',\n rollingUpdate: {\n maxSurge: 0,\n maxUnavailable: '100%',\n },\n },\n template: {\n metadata: {\n labels: {\n app: '',\n },\n },\n spec: {\n affinity: {},\n containers: [\n {\n name: '',\n image: '',\n env: [],\n resources: {\n limits: {},\n requests: {},\n },\n volumeMounts: [],\n },\n ],\n volumes: [],\n },\n },\n },\n };\n}\n","import PortainerError from 'Portainer/error';\n\nexport default class KubernetesHelmApplicationController {\n /* @ngInject */\n constructor($async, $state, Authentication, Notifications, HelmService) {\n this.$async = $async;\n this.$state = $state;\n this.Authentication = Authentication;\n this.Notifications = Notifications;\n this.HelmService = HelmService;\n }\n\n /**\n * APPLICATION\n */\n async getHelmApplication() {\n try {\n this.state.dataLoading = true;\n const releases = await this.HelmService.listReleases(this.endpoint.Id, { selector: `name=${this.state.params.name}`, namespace: this.state.params.namespace });\n if (releases.length > 0) {\n this.state.release = releases[0];\n } else {\n throw new PortainerError(`Release ${this.state.params.name} not found`);\n }\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve helm application details');\n } finally {\n this.state.dataLoading = false;\n }\n }\n\n $onInit() {\n return this.$async(async () => {\n this.state = {\n dataLoading: true,\n viewReady: false,\n params: {\n name: this.$state.params.name,\n namespace: this.$state.params.namespace,\n },\n release: {\n name: undefined,\n chart: undefined,\n app_version: undefined,\n },\n };\n\n await this.getHelmApplication();\n this.state.viewReady = true;\n });\n }\n}\n","import _ from 'lodash-es';\nimport filesizeParser from 'filesize-parser';\nimport { KubernetesResourceQuotaDefaults } from 'Kubernetes/models/resource-quota/models';\nimport KubernetesResourceReservationHelper from 'Kubernetes/helpers/resourceReservationHelper';\nimport {\n KubernetesResourcePoolFormValues,\n KubernetesResourcePoolIngressClassAnnotationFormValue,\n KubernetesResourcePoolIngressClassHostFormValue,\n} from 'Kubernetes/models/resource-pool/formValues';\nimport { KubernetesIngressConverter } from 'Kubernetes/ingress/converter';\nimport KubernetesFormValidationHelper from 'Kubernetes/helpers/formValidationHelper';\nimport { KubernetesFormValidationReferences } from 'Kubernetes/models/application/formValues';\nimport { KubernetesIngressClassTypes } from 'Kubernetes/ingress/constants';\n\nimport { K8S_RESOURCE_POOL_LB_QUOTA, K8S_RESOURCE_POOL_STORAGE_QUOTA } from '@/portainer/feature-flags/feature-ids';\n\nclass KubernetesCreateResourcePoolController {\n /* #region CONSTRUCTOR */\n /* @ngInject */\n constructor($async, $state, Notifications, KubernetesNodeService, KubernetesResourcePoolService, KubernetesIngressService, Authentication, EndpointService) {\n Object.assign(this, {\n $async,\n $state,\n Notifications,\n KubernetesNodeService,\n KubernetesResourcePoolService,\n KubernetesIngressService,\n Authentication,\n EndpointService,\n });\n\n this.IngressClassTypes = KubernetesIngressClassTypes;\n this.LBQuotaFeatureId = K8S_RESOURCE_POOL_LB_QUOTA;\n this.StorageQuotaFeatureId = K8S_RESOURCE_POOL_STORAGE_QUOTA;\n }\n /* #endregion */\n\n onChangeIngressHostname() {\n const state = this.state.duplicates.ingressHosts;\n const hosts = _.flatMap(this.formValues.IngressClasses, 'Hosts');\n const hostnames = _.compact(hosts.map((h) => h.Host));\n const hostnamesWithoutRemoved = _.filter(hostnames, (h) => !h.NeedsDeletion);\n const allHosts = _.flatMap(this.allIngresses, 'Hosts');\n const formDuplicates = KubernetesFormValidationHelper.getDuplicates(hostnamesWithoutRemoved);\n _.forEach(hostnames, (host, idx) => {\n if (host !== undefined && _.includes(allHosts, host)) {\n formDuplicates[idx] = host;\n }\n });\n const duplicates = {};\n let count = 0;\n _.forEach(this.formValues.IngressClasses, (ic) => {\n duplicates[ic.IngressClass.Name] = {};\n _.forEach(ic.Hosts, (hostFV, hostIdx) => {\n if (hostFV.Host === formDuplicates[count]) {\n duplicates[ic.IngressClass.Name][hostIdx] = hostFV.Host;\n }\n count++;\n });\n });\n state.refs = duplicates;\n state.hasRefs = false;\n _.forIn(duplicates, (value) => {\n if (Object.keys(value).length > 0) {\n state.hasRefs = true;\n }\n });\n }\n\n addHostname(ingressClass) {\n ingressClass.Hosts.push(new KubernetesResourcePoolIngressClassHostFormValue());\n }\n\n removeHostname(ingressClass, index) {\n ingressClass.Hosts.splice(index, 1);\n this.onChangeIngressHostname();\n }\n\n /* #region ANNOTATIONS MANAGEMENT */\n addAnnotation(ingressClass) {\n ingressClass.Annotations.push(new KubernetesResourcePoolIngressClassAnnotationFormValue());\n }\n\n removeAnnotation(ingressClass, index) {\n ingressClass.Annotations.splice(index, 1);\n }\n /* #endregion */\n\n isCreateButtonDisabled() {\n return this.state.actionInProgress || (this.formValues.HasQuota && !this.isQuotaValid()) || this.state.isAlreadyExist || this.state.duplicates.ingressHosts.hasRefs;\n }\n\n onChangeName() {\n this.state.isAlreadyExist = _.find(this.resourcePools, (resourcePool) => resourcePool.Namespace.Name === this.formValues.Name) !== undefined;\n }\n\n isQuotaValid() {\n if (\n this.state.sliderMaxCpu < this.formValues.CpuLimit ||\n this.state.sliderMaxMemory < this.formValues.MemoryLimit ||\n (this.formValues.CpuLimit === 0 && this.formValues.MemoryLimit === 0)\n ) {\n return false;\n }\n return true;\n }\n\n checkDefaults() {\n if (this.formValues.CpuLimit < this.defaults.CpuLimit) {\n this.formValues.CpuLimit = this.defaults.CpuLimit;\n }\n if (this.formValues.MemoryLimit < KubernetesResourceReservationHelper.megaBytesValue(this.defaults.MemoryLimit)) {\n this.formValues.MemoryLimit = KubernetesResourceReservationHelper.megaBytesValue(this.defaults.MemoryLimit);\n }\n }\n\n /* #region CREATE NAMESPACE */\n createResourcePool() {\n return this.$async(async () => {\n this.state.actionInProgress = true;\n try {\n this.checkDefaults();\n this.formValues.Owner = this.Authentication.getUserDetails().username;\n await this.KubernetesResourcePoolService.create(this.formValues);\n this.Notifications.success('Namespace successfully created', this.formValues.Name);\n this.$state.go('kubernetes.resourcePools');\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to create namespace');\n } finally {\n this.state.actionInProgress = false;\n }\n });\n }\n /* #endregion */\n\n /* #region GET INGRESSES */\n getIngresses() {\n return this.$async(async () => {\n try {\n this.allIngresses = await this.KubernetesIngressService.get();\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve ingresses.');\n }\n });\n }\n /* #endregion */\n\n /* #region GET NAMESPACES */\n getResourcePools() {\n return this.$async(async () => {\n try {\n this.resourcePools = await this.KubernetesResourcePoolService.get();\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve namespaces');\n }\n });\n }\n /* #endregion */\n\n /* #region GET REGISTRIES */\n getRegistries() {\n return this.$async(async () => {\n try {\n this.registries = await this.EndpointService.registries(this.endpoint.Id);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve registries');\n }\n });\n }\n /* #endregion */\n\n /* #region ON INIT */\n $onInit() {\n return this.$async(async () => {\n try {\n const endpoint = this.endpoint;\n this.defaults = KubernetesResourceQuotaDefaults;\n this.formValues = new KubernetesResourcePoolFormValues(this.defaults);\n this.formValues.EndpointId = this.endpoint.Id;\n this.formValues.HasQuota = true;\n\n this.state = {\n actionInProgress: false,\n sliderMaxMemory: 0,\n sliderMaxCpu: 0,\n viewReady: false,\n isAlreadyExist: false,\n canUseIngress: endpoint.Kubernetes.Configuration.IngressClasses.length,\n duplicates: {\n ingressHosts: new KubernetesFormValidationReferences(),\n },\n isAdmin: this.Authentication.isAdmin(),\n };\n\n const nodes = await this.KubernetesNodeService.get();\n\n _.forEach(nodes, (item) => {\n this.state.sliderMaxMemory += filesizeParser(item.Memory);\n this.state.sliderMaxCpu += item.CPU;\n });\n this.state.sliderMaxMemory = KubernetesResourceReservationHelper.megaBytesValue(this.state.sliderMaxMemory);\n await this.getResourcePools();\n if (this.state.canUseIngress) {\n await this.getIngresses();\n const ingressClasses = endpoint.Kubernetes.Configuration.IngressClasses;\n this.formValues.IngressClasses = KubernetesIngressConverter.ingressClassesToFormValues(ingressClasses);\n }\n _.forEach(this.formValues.IngressClasses, (ic) => {\n if (ic.Hosts.length === 0) {\n ic.Hosts.push(new KubernetesResourcePoolIngressClassHostFormValue());\n }\n });\n\n await this.getRegistries();\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to load view data');\n } finally {\n this.state.viewReady = true;\n }\n });\n }\n /* #endregion */\n}\n\nexport default KubernetesCreateResourcePoolController;\n","import _ from 'lodash-es';\nimport { KubernetesResourceTypes, KubernetesResourceActions } from 'Kubernetes/models/resource-types/models';\nimport { KubernetesApplicationFormValues } from 'Kubernetes/models/application/formValues';\nimport { KubernetesDeployment } from 'Kubernetes/models/deployment/models';\nimport { KubernetesStatefulSet } from 'Kubernetes/models/stateful-set/models';\nimport { KubernetesDaemonSet } from 'Kubernetes/models/daemon-set/models';\nimport { KubernetesServiceTypes } from 'Kubernetes/models/service/models';\nimport {\n KubernetesApplication,\n KubernetesApplicationDeploymentTypes,\n KubernetesApplicationPublishingTypes,\n KubernetesApplicationTypes,\n} from 'Kubernetes/models/application/models';\nimport { KubernetesHorizontalPodAutoScalerHelper } from 'Kubernetes/horizontal-pod-auto-scaler/helper';\nimport { KubernetesHorizontalPodAutoScalerConverter } from 'Kubernetes/horizontal-pod-auto-scaler/converter';\nimport KubernetesApplicationConverter from 'Kubernetes/converters/application';\nimport KubernetesServiceConverter from 'Kubernetes/converters/service';\nimport { KubernetesIngressConverter } from 'Kubernetes/ingress/converter';\nimport KubernetesPersistentVolumeClaimConverter from 'Kubernetes/converters/persistentVolumeClaim';\n\nconst { CREATE, UPDATE, DELETE } = KubernetesResourceActions;\n\n/**\n * Get summary of Kubernetes resources to be created, updated or deleted\n * @param {KubernetesApplicationFormValues} formValues\n */\nexport default function (formValues, oldFormValues = {}) {\n if (oldFormValues instanceof KubernetesApplicationFormValues) {\n const resourceSummary = getUpdatedApplicationResources(oldFormValues, formValues);\n return resourceSummary;\n }\n const resourceSummary = getCreatedApplicationResources(formValues);\n return resourceSummary;\n}\n\n/**\n * Get summary of Kubernetes resources to be created\n * @param {KubernetesApplicationFormValues} formValues\n */\nfunction getCreatedApplicationResources(formValues) {\n const resources = [];\n\n let [app, headlessService, service, claims] = KubernetesApplicationConverter.applicationFormValuesToApplication(formValues);\n\n if (service) {\n // Service\n resources.push({ action: CREATE, kind: KubernetesResourceTypes.SERVICE, name: service.Name, type: service.Type || KubernetesServiceTypes.CLUSTER_IP });\n if (formValues.PublishingType === KubernetesApplicationPublishingTypes.INGRESS) {\n // Ingress\n const ingresses = KubernetesIngressConverter.applicationFormValuesToIngresses(formValues, service.Name);\n resources.push(...getIngressUpdateSummary(formValues.OriginalIngresses, ingresses));\n }\n }\n\n if (app instanceof KubernetesStatefulSet) {\n // Service\n resources.push({ action: CREATE, kind: KubernetesResourceTypes.SERVICE, name: headlessService.Name, type: headlessService.Type || KubernetesServiceTypes.CLUSTER_IP });\n } else {\n // Persistent volume claims\n const persistentVolumeClaimResources = claims\n .filter((pvc) => !pvc.PreviousName && !pvc.Id)\n .map((pvc) => ({ action: CREATE, kind: KubernetesResourceTypes.PERSISTENT_VOLUME_CLAIM, name: pvc.Name }));\n resources.push(...persistentVolumeClaimResources);\n }\n\n // Horizontal pod autoscalers\n if (formValues.AutoScaler.IsUsed && formValues.DeploymentType !== KubernetesApplicationDeploymentTypes.GLOBAL) {\n const kind = KubernetesHorizontalPodAutoScalerHelper.getApplicationTypeString(app);\n const autoScaler = KubernetesHorizontalPodAutoScalerConverter.applicationFormValuesToModel(formValues, kind);\n resources.push({ action: CREATE, kind: KubernetesResourceTypes.HORIZONTAL_POD_AUTOSCALER, name: autoScaler.Name });\n }\n\n // Deployment\n const appResourceType = getApplicationResourceType(app);\n if (appResourceType !== null) {\n resources.push({ action: CREATE, kind: appResourceType, name: app.Name });\n }\n\n return resources;\n}\n\n/**\n * Get summary of Kubernetes resources to be created, updated and/or deleted\n * @param {KubernetesApplicationFormValues} oldFormValues\n * @param {KubernetesApplicationFormValues} newFormValues\n */\nfunction getUpdatedApplicationResources(oldFormValues, newFormValues) {\n const resources = [];\n\n const [oldApp, oldHeadlessService, oldService, oldClaims] = KubernetesApplicationConverter.applicationFormValuesToApplication(oldFormValues);\n const [newApp, newHeadlessService, newService, newClaims] = KubernetesApplicationConverter.applicationFormValuesToApplication(newFormValues);\n\n const oldAppResourceType = getApplicationResourceType(oldApp);\n const newAppResourceType = getApplicationResourceType(newApp);\n\n if (oldAppResourceType !== newAppResourceType) {\n // Deployment\n resources.push({ action: DELETE, kind: oldAppResourceType, name: oldApp.Name });\n if (oldService) {\n // Service\n resources.push({ action: DELETE, kind: KubernetesResourceTypes.SERVICE, name: oldService.Name, type: oldService.Type || KubernetesServiceTypes.CLUSTER_IP });\n }\n // re-creation of resources\n const createdApplicationResourceSummary = getCreatedApplicationResources(newFormValues);\n resources.push(...createdApplicationResourceSummary);\n return resources;\n }\n\n if (newApp instanceof KubernetesStatefulSet) {\n const headlessServiceUpdateResourceSummary = getServiceUpdateResourceSummary(oldHeadlessService, newHeadlessService);\n if (headlessServiceUpdateResourceSummary) {\n resources.push(headlessServiceUpdateResourceSummary);\n }\n } else {\n // Persistent volume claims\n const claimSummaries = newClaims\n .map((pvc) => {\n if (!pvc.PreviousName && !pvc.Id) {\n return { action: CREATE, kind: KubernetesResourceTypes.PERSISTENT_VOLUME_CLAIM, name: pvc.Name };\n } else if (!pvc.Id) {\n const oldClaim = _.find(oldClaims, { Name: pvc.PreviousName });\n return getVolumeClaimUpdateResourceSummary(oldClaim, pvc);\n }\n })\n .filter((pvc) => pvc); // remove nulls\n resources.push(...claimSummaries);\n }\n\n // Deployment\n resources.push({ action: UPDATE, kind: oldAppResourceType, name: oldApp.Name });\n\n if (oldService && newService) {\n // Service\n const serviceUpdateResourceSummary = getServiceUpdateResourceSummary(oldService, newService);\n if (serviceUpdateResourceSummary) {\n resources.push(serviceUpdateResourceSummary);\n }\n\n if (newFormValues.PublishingType === KubernetesApplicationPublishingTypes.INGRESS || oldFormValues.PublishingType === KubernetesApplicationPublishingTypes.INGRESS) {\n // Ingress\n const oldIngresses = KubernetesIngressConverter.applicationFormValuesToIngresses(oldFormValues, oldService.Name);\n const newIngresses = KubernetesIngressConverter.applicationFormValuesToIngresses(newFormValues, newService.Name);\n resources.push(...getIngressUpdateSummary(oldIngresses, newIngresses));\n }\n } else if (!oldService && newService) {\n // Service\n resources.push({ action: CREATE, kind: KubernetesResourceTypes.SERVICE, name: newService.Name, type: newService.Type || KubernetesServiceTypes.CLUSTER_IP });\n if (newFormValues.PublishingType === KubernetesApplicationPublishingTypes.INGRESS) {\n // Ingress\n const ingresses = KubernetesIngressConverter.applicationFormValuesToIngresses(newFormValues, newService.Name);\n resources.push(...getIngressUpdateSummary(newFormValues.OriginalIngresses, ingresses));\n }\n } else if (oldService && !newService) {\n // Service\n resources.push({ action: DELETE, kind: KubernetesResourceTypes.SERVICE, name: oldService.Name, type: oldService.Type || KubernetesServiceTypes.CLUSTER_IP });\n if (oldFormValues.PublishingType === KubernetesApplicationPublishingTypes.INGRESS) {\n // Ingress\n const ingresses = KubernetesIngressConverter.applicationFormValuesToIngresses(newFormValues, oldService.Name);\n resources.push(...getIngressUpdateSummary(oldFormValues.OriginalIngresses, ingresses));\n }\n }\n\n const newKind = KubernetesHorizontalPodAutoScalerHelper.getApplicationTypeString(newApp);\n const newAutoScaler = KubernetesHorizontalPodAutoScalerConverter.applicationFormValuesToModel(newFormValues, newKind);\n if (!oldFormValues.AutoScaler.IsUsed) {\n if (newFormValues.AutoScaler.IsUsed) {\n // Horizontal pod autoscalers\n resources.push({ action: CREATE, kind: KubernetesResourceTypes.HORIZONTAL_POD_AUTOSCALER, name: newAutoScaler.Name });\n }\n } else {\n // Horizontal pod autoscalers\n const oldKind = KubernetesHorizontalPodAutoScalerHelper.getApplicationTypeString(oldApp);\n const oldAutoScaler = KubernetesHorizontalPodAutoScalerConverter.applicationFormValuesToModel(oldFormValues, oldKind);\n if (newFormValues.AutoScaler.IsUsed) {\n const hpaUpdateSummary = getHorizontalPodAutoScalerUpdateResourceSummary(oldAutoScaler, newAutoScaler);\n if (hpaUpdateSummary) {\n resources.push(hpaUpdateSummary);\n }\n } else {\n resources.push({ action: DELETE, kind: KubernetesResourceTypes.HORIZONTAL_POD_AUTOSCALER, name: oldAutoScaler.Name });\n }\n }\n\n return resources;\n}\n\nfunction getApplicationResourceType(app) {\n if (app instanceof KubernetesDeployment || (app instanceof KubernetesApplication && app.ApplicationType === KubernetesApplicationTypes.DEPLOYMENT)) {\n return KubernetesResourceTypes.DEPLOYMENT;\n } else if (app instanceof KubernetesDaemonSet || (app instanceof KubernetesApplication && app.ApplicationType === KubernetesApplicationTypes.DAEMONSET)) {\n return KubernetesResourceTypes.DAEMONSET;\n } else if (app instanceof KubernetesStatefulSet || (app instanceof KubernetesApplication && app.ApplicationType === KubernetesApplicationTypes.STATEFULSET)) {\n return KubernetesResourceTypes.STATEFULSET;\n }\n return null;\n}\n\nfunction getIngressUpdateSummary(oldIngresses, newIngresses) {\n const ingressesSummaries = newIngresses\n .map((newIng) => {\n const oldIng = _.find(oldIngresses, { Name: newIng.Name });\n return getIngressUpdateResourceSummary(oldIng, newIng);\n })\n .filter((s) => s); // remove nulls\n return ingressesSummaries;\n}\n\n// getIngressUpdateResourceSummary replicates KubernetesIngressService.patch\nfunction getIngressUpdateResourceSummary(oldIngress, newIngress) {\n const payload = KubernetesIngressConverter.patchPayload(oldIngress, newIngress);\n if (payload.length) {\n return { action: UPDATE, kind: KubernetesResourceTypes.INGRESS, name: oldIngress.Name };\n }\n return null;\n}\n\n// getVolumeClaimUpdateResourceSummary replicates KubernetesPersistentVolumeClaimService.patch\nfunction getVolumeClaimUpdateResourceSummary(oldPVC, newPVC) {\n const payload = KubernetesPersistentVolumeClaimConverter.patchPayload(oldPVC, newPVC);\n if (payload.length) {\n return { action: UPDATE, kind: KubernetesResourceTypes.PERSISTENT_VOLUME_CLAIM, name: oldPVC.Name };\n }\n return null;\n}\n\n// getServiceUpdateResourceSummary replicates KubernetesServiceService.patch\nfunction getServiceUpdateResourceSummary(oldService, newService) {\n const payload = KubernetesServiceConverter.patchPayload(oldService, newService);\n if (payload.length) {\n return { action: UPDATE, kind: KubernetesResourceTypes.SERVICE, name: oldService.Name, type: oldService.Type || KubernetesServiceTypes.CLUSTER_IP };\n }\n return null;\n}\n\n// getHorizontalPodAutoScalerUpdateResourceSummary replicates KubernetesHorizontalPodAutoScalerService.patch\nfunction getHorizontalPodAutoScalerUpdateResourceSummary(oldHorizontalPodAutoScaler, newHorizontalPodAutoScaler) {\n const payload = KubernetesHorizontalPodAutoScalerConverter.patchPayload(oldHorizontalPodAutoScaler, newHorizontalPodAutoScaler);\n if (payload.length) {\n return { action: UPDATE, kind: KubernetesResourceTypes.HORIZONTAL_POD_AUTOSCALER, name: oldHorizontalPodAutoScaler.Name };\n }\n return null;\n}\n","import { KubernetesResourceTypes, KubernetesResourceActions } from 'Kubernetes/models/resource-types/models';\nimport { KubernetesConfigurationTypes } from 'Kubernetes/models/configuration/models';\n\nconst { CREATE, UPDATE } = KubernetesResourceActions;\n\nexport default function (formValues) {\n const action = formValues.Id ? UPDATE : CREATE;\n if (formValues.Type === KubernetesConfigurationTypes.CONFIGMAP) {\n return [{ action, kind: KubernetesResourceTypes.CONFIGMAP, name: formValues.Name }];\n } else if (formValues.Type === KubernetesConfigurationTypes.SECRET) {\n return [{ action, kind: KubernetesResourceTypes.SECRET, name: formValues.Name }];\n }\n}\n","import KubernetesResourcePoolConverter from 'Kubernetes/converters/resourcePool';\nimport { KubernetesResourcePoolFormValues } from 'Kubernetes/models/resource-pool/formValues';\nimport { KubernetesResourceQuotaDefaults } from 'Kubernetes/models/resource-quota/models';\nimport { KubernetesResourceTypes } from 'Kubernetes/models/resource-types/models';\nimport { getResourcesSummary } from 'Kubernetes/views/summary/resources/helpers';\n\nexport default function (newFormValues, oldFormValues) {\n const [newNamespace, newQuota, newIngresses] = KubernetesResourcePoolConverter.formValuesToResourcePool(newFormValues);\n\n if (!(oldFormValues instanceof KubernetesResourcePoolFormValues)) {\n oldFormValues = new KubernetesResourcePoolFormValues(KubernetesResourceQuotaDefaults);\n }\n\n const [oldNamespace, oldQuota, oldIngresses] = KubernetesResourcePoolConverter.formValuesToResourcePool(oldFormValues);\n\n const resources = [\n ...getResourcesSummary(newNamespace, oldNamespace, KubernetesResourceTypes.NAMESPACE),\n ...getResourcesSummary(newQuota, oldQuota, KubernetesResourceTypes.RESOURCEQUOTA),\n ...getResourcesSummary(newIngresses, oldIngresses, KubernetesResourceTypes.INGRESS),\n ];\n\n return resources;\n}\n","import { ResourceControlOwnership } from 'Portainer/models/resourceControl/resourceControlOwnership';\n\nexport function AccessControlPanelData() {\n this.Ownership = ResourceControlOwnership.ADMINISTRATORS;\n this.Ownership_Users = [];\n this.Ownership_Teams = [];\n}\n","import angular from 'angular';\nimport _ from 'lodash-es';\n\nclass AssoicatedEndpointsSelectorController {\n /* @ngInject */\n constructor($async, EndpointService) {\n this.$async = $async;\n this.EndpointService = EndpointService;\n\n this.state = {\n available: {\n limit: '10',\n filter: '',\n pageNumber: 1,\n totalCount: 0,\n },\n associated: {\n limit: '10',\n filter: '',\n pageNumber: 1,\n totalCount: 0,\n },\n };\n\n this.endpoints = {\n associated: [],\n available: null,\n };\n\n this.getEndpoints = this.getEndpoints.bind(this);\n this.getEndpointsAsync = this.getEndpointsAsync.bind(this);\n this.getAssociatedEndpoints = this.getAssociatedEndpoints.bind(this);\n this.getAssociatedEndpointsAsync = this.getAssociatedEndpointsAsync.bind(this);\n this.associateEndpoint = this.associateEndpoint.bind(this);\n this.dissociateEndpoint = this.dissociateEndpoint.bind(this);\n }\n\n $onInit() {\n this.loadData();\n }\n\n $onChanges({ endpointIds }) {\n if (endpointIds && endpointIds.currentValue) {\n this.loadData();\n }\n }\n\n loadData() {\n this.getAssociatedEndpoints();\n this.getEndpoints();\n }\n\n getEndpoints() {\n return this.$async(this.getEndpointsAsync);\n }\n\n async getEndpointsAsync() {\n const { start, search, limit } = this.getPaginationData('available');\n const query = { search, types: [4, 7] };\n\n const response = await this.EndpointService.endpoints(start, limit, query);\n\n const endpoints = _.filter(response.value, (endpoint) => !_.includes(this.endpointIds, endpoint.Id));\n this.setTableData('available', endpoints, response.totalCount);\n this.noEndpoints = this.state.available.totalCount === 0;\n }\n\n getAssociatedEndpoints() {\n return this.$async(this.getAssociatedEndpointsAsync);\n }\n\n async getAssociatedEndpointsAsync() {\n let response = { value: [], totalCount: 0 };\n if (this.endpointIds.length > 0) {\n const { start, search, limit } = this.getPaginationData('associated');\n const query = { search, types: [4, 7], endpointIds: this.endpointIds };\n\n response = await this.EndpointService.endpoints(start, limit, query);\n }\n\n this.setTableData('associated', response.value, response.totalCount);\n }\n\n associateEndpoint(endpoint) {\n this.onAssociate(endpoint);\n }\n\n dissociateEndpoint(endpoint) {\n this.onDissociate(endpoint);\n }\n\n getPaginationData(tableType) {\n const { pageNumber, limit, search } = this.state[tableType];\n const start = (pageNumber - 1) * limit + 1;\n\n return { start, search, limit };\n }\n\n setTableData(tableType, endpoints, totalCount) {\n this.endpoints[tableType] = endpoints;\n this.state[tableType].totalCount = parseInt(totalCount, 10);\n }\n}\n\nangular.module('portainer.app').controller('AssoicatedEndpointsSelectorController', AssoicatedEndpointsSelectorController);\nexport default AssoicatedEndpointsSelectorController;\n","const BE_URL = 'https://www.portainer.io/business-upsell?from=';\n\nexport default class BeIndicatorController {\n /* @ngInject */\n constructor(featureService) {\n Object.assign(this, { featureService });\n\n this.limitedToBE = false;\n }\n\n $onInit() {\n if (this.feature) {\n this.url = `${BE_URL}${this.feature}`;\n\n this.limitedToBE = this.featureService.isLimitedToBE(this.feature);\n }\n }\n}\n","export default class BoxSelectorItemController {\n /* @ngInject */\n constructor(featureService) {\n Object.assign(this, { featureService });\n\n this.limitedToBE = false;\n }\n\n handleChange(value) {\n this.formCtrl.$setValidity(this.radioName, !this.limitedToBE, this.formCtrl);\n this.onChange(value);\n }\n\n $onInit() {\n if (this.option.feature) {\n this.limitedToBE = this.featureService.isLimitedToBE(this.option.feature);\n }\n }\n\n $onDestroy() {\n this.formCtrl.$setValidity(this.radioName, true, this.formCtrl);\n }\n}\n","export default class CopyButtonController {\n /* @ngInject */\n constructor(clipboard) {\n this.clipboard = clipboard;\n this.state = { isFading: false };\n }\n\n copyValueText() {\n this.clipboard.copyText(this.value);\n this.state.isFading = true;\n setTimeout(() => (this.state.isFading = false), 1000);\n }\n}\n","class CustomTemplateCommonFieldsController {\n /* @ngInject */\n constructor() {\n this.platformTypes = [\n { label: 'Linux', value: 1 },\n { label: 'Windows', value: 2 },\n ];\n\n this.templateTypes = [\n { label: 'Swarm', value: 1 },\n { label: 'Standalone', value: 2 },\n ];\n }\n}\n\nexport default CustomTemplateCommonFieldsController;\n","class CustomTemplateSelectorController {\n /* @ngInject */\n constructor($async, CustomTemplateService, Notifications) {\n Object.assign(this, { $async, CustomTemplateService, Notifications });\n\n this.selectedTemplate = null;\n this.templates = null;\n }\n\n async handleChangeTemplate(templateId) {\n this.selectedTemplate = this.templates.find((t) => t.Id === templateId);\n this.onChange(templateId, this.selectedTemplate);\n }\n\n $onChanges({ value }) {\n if (value && value.currentValue && this.templates) {\n this.handleChangeTemplate(value.currentValue);\n }\n }\n\n $onInit() {\n return this.$async(async () => {\n try {\n const templates = await this.CustomTemplateService.customTemplates(this.stackType);\n this.templates = templates.map((template) => ({ ...template, label: `${template.Title} - ${template.Description}` }));\n if (this.value) {\n this.handleChangeTemplate(this.value);\n }\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve Custom Templates');\n }\n });\n }\n}\n\nexport default CustomTemplateSelectorController;\n","export default class AccessTokensDatatableController {\n /* @ngInject*/\n constructor($scope, $controller, DatatableService) {\n angular.extend(this, $controller('GenericDatatableController', { $scope: $scope }));\n\n this.$onInit = function () {\n this.setDefaults();\n this.prepareTableFromDataset();\n\n const storedOrder = DatatableService.getDataTableOrder(this.tableKey);\n if (storedOrder !== null) {\n this.state.reverseOrder = storedOrder.reverse;\n this.state.orderBy = storedOrder.orderBy;\n }\n\n const textFilter = DatatableService.getDataTableTextFilters(this.tableKey);\n if (textFilter !== null) {\n this.state.textFilter = textFilter;\n this.onTextFilterChange();\n }\n\n const storedFilters = DatatableService.getDataTableFilters(this.tableKey);\n if (storedFilters !== null) {\n this.filters = storedFilters;\n }\n if (this.filters && this.filters.state) {\n this.filters.state.open = false;\n }\n\n this.onSettingsRepeaterChange();\n };\n }\n}\n","export default class DatatableColumnsVisibilityController {\n constructor() {\n this.state = {\n isOpen: false,\n };\n }\n}\n","export default class DatatableFilterController {\n isEnabled() {\n return 0 < this.state.length && this.state.length < this.labels.length;\n }\n\n onChangeItem(filterValue) {\n if (this.isChecked(filterValue)) {\n return this.onChange(\n this.filterKey,\n this.state.filter((v) => v !== filterValue)\n );\n }\n return this.onChange(this.filterKey, [...this.state, filterValue]);\n }\n\n isChecked(filterValue) {\n return this.state.includes(filterValue);\n }\n}\n","const autoNgTemplateLoaderTemplate1 = require('./datatable-filter.html');\n\nimport controller from './datatable-filter.controller';\n\nexport const datatableFilter = {\n bindings: {\n labels: '<', // [{label, value}]\n state: '<', // [filterValue]\n filterKey: '@',\n onChange: '<',\n },\n controller,\n templateUrl: autoNgTemplateLoaderTemplate1,\n transclude: true,\n};\n","const autoNgTemplateLoaderTemplate1 = require('./datatable-titlebar.html');\n\nexport const datatableTitlebar = {\n bindings: {\n icon: '@',\n title: '@',\n feature: '@',\n },\n templateUrl: autoNgTemplateLoaderTemplate1,\n};\n","const autoNgTemplateLoaderTemplate1 = require('./datatable-searchbar.html');\n\nexport const datatableSearchbar = {\n bindings: {\n onChange: '<',\n ngModel: '<',\n },\n templateUrl: autoNgTemplateLoaderTemplate1,\n};\n","const autoNgTemplateLoaderTemplate1 = require('./datatable-sort-icon.html');\n\nimport controller from './datatable-sort-icon.controller';\n\nexport const datatableSortIcon = {\n bindings: {\n key: '@',\n selectedSortKey: '@',\n reverseOrder: '<',\n },\n controller,\n templateUrl: autoNgTemplateLoaderTemplate1,\n};\n","export default class datatableSortIconController {\n isCurrentSortOrder() {\n return this.selectedSortKey === this.key;\n }\n}\n","const autoNgTemplateLoaderTemplate1 = require('./pagination.html');\n\nexport const datatablePagination = {\n bindings: {\n onChangeLimit: '<',\n limit: '<',\n enableNoLimit: '<',\n onChangePage: '<',\n },\n templateUrl: autoNgTemplateLoaderTemplate1,\n};\n","export default class UsersDatatableController {\n /* @ngInject*/\n constructor($controller, $scope) {\n const allowSelection = this.allowSelection;\n angular.extend(this, $controller('GenericDatatableController', { $scope }));\n this.allowSelection = allowSelection.bind(this);\n }\n\n /**\n * Override this method to allow/deny selection\n */\n allowSelection(item) {\n return item.Id !== 1;\n }\n}\n","import angular from 'angular';\nimport _ from 'lodash-es';\nimport PortainerEndpointTagHelper from 'Portainer/helpers/tagHelper';\n\nclass EndpointItemController {\n /* @ngInject */\n constructor() {\n this.editEndpoint = this.editEndpoint.bind(this);\n }\n\n editEndpoint(event) {\n event.stopPropagation();\n this.onEdit(this.model.Id);\n }\n\n joinTags() {\n if (!this.tags) {\n return 'Loading tags...';\n }\n\n if (!this.model.TagIds || !this.model.TagIds.length) {\n return '';\n }\n\n const tagNames = PortainerEndpointTagHelper.idsToTagNames(this.tags, this.model.TagIds);\n return _.join(tagNames, ',');\n }\n\n isEdgeEndpoint() {\n return this.model.Type === 4 || this.model.Type === 7;\n }\n\n calcIsCheckInValid() {\n if (!this.isEdgeEndpoint()) {\n return false;\n }\n const checkInInterval = this.model.EdgeCheckinInterval;\n\n // give checkIn some wiggle room\n return this.endpointInitTime - this.model.LastCheckInDate <= checkInInterval * 2 + 20;\n }\n\n $onInit() {\n this.endpointTags = this.joinTags();\n this.isCheckInValid = this.calcIsCheckInValid();\n }\n\n $onChanges({ tags, model }) {\n if ((!tags && !model) || (!tags.currentValue && !model.currentValue)) {\n return;\n }\n this.endpointTags = this.joinTags();\n\n if (model) {\n this.isCheckInValid = this.calcIsCheckInValid();\n }\n }\n}\n\nangular.module('portainer.app').controller('EndpointItemController', EndpointItemController);\nexport default EndpointItemController;\n","import { parseDotEnvFile, convertToArrayOfStrings } from '@/portainer/helpers/env-vars';\n\nexport default class EnvironmentVariablesPanelController {\n /* @ngInject */\n constructor() {\n this.mode = 'simple';\n this.editorText = '';\n\n this.switchEnvMode = this.switchEnvMode.bind(this);\n this.editorUpdate = this.editorUpdate.bind(this);\n this.handleSimpleChange = this.handleSimpleChange.bind(this);\n }\n\n switchEnvMode() {\n if (this.mode === 'simple') {\n const editorText = convertToArrayOfStrings(this.ngModel).join('\\n');\n\n this.editorText = editorText;\n\n this.mode = 'advanced';\n } else {\n this.mode = 'simple';\n }\n }\n\n handleSimpleChange(value) {\n this.onChange(value);\n }\n\n editorUpdate(cm) {\n this.editorText = cm.getValue();\n this.onChange(parseDotEnvFile(this.editorText));\n }\n}\n","class EnvironmentVariablesSimpleModeItemController {\n onChangeName(name) {\n const fieldIsInvalid = typeof name === 'undefined';\n if (fieldIsInvalid) {\n return;\n }\n\n this.onChange(this.index, { ...this.variable, name });\n }\n\n onChangeValue(value) {\n const fieldIsInvalid = typeof value === 'undefined';\n if (fieldIsInvalid) {\n return;\n }\n\n this.onChange(this.index, { ...this.variable, value });\n }\n\n hasValue() {\n return typeof this.variable.value !== 'undefined';\n }\n\n removeValue() {\n this.onChange(this.index, { name: this.variable.name });\n }\n\n $onInit() {\n this.formName = `variableForm${this.index}`;\n }\n}\n\nexport default EnvironmentVariablesSimpleModeItemController;\n","import { parseDotEnvFile } from '@/portainer/helpers/env-vars';\n\nexport default class EnvironmentVariablesSimpleModeController {\n /* @ngInject */\n constructor($async) {\n this.$async = $async;\n\n this.onChangeVariable = this.onChangeVariable.bind(this);\n this.remove = this.remove.bind(this);\n }\n\n add() {\n this.onChange([...this.ngModel, { name: '', value: '' }]);\n }\n\n remove(index) {\n this.onChange(this.ngModel.filter((_, i) => i !== index));\n }\n\n addFromFile(file) {\n return this.$async(async () => {\n if (!file) {\n return;\n }\n const text = await this.getTextFromFile(file);\n const parsed = parseDotEnvFile(text);\n this.onChange(this.ngModel.concat(parsed));\n });\n }\n\n getTextFromFile(file) {\n return new Promise((resolve, reject) => {\n const temporaryFileReader = new FileReader();\n temporaryFileReader.readAsText(file);\n temporaryFileReader.onload = (event) => resolve(event.target.result);\n temporaryFileReader.onerror = (error) => reject(error);\n });\n }\n\n onChangeVariable(index, variable) {\n this.onChange(this.ngModel.map((v, i) => (i !== index ? v : variable)));\n }\n}\n","import _ from 'lodash-es';\nimport angular from 'angular';\n\nclass GroupFormController {\n /* @ngInject */\n constructor($q, EndpointService, GroupService, Notifications, Authentication) {\n this.$q = $q;\n this.EndpointService = EndpointService;\n this.GroupService = GroupService;\n this.Notifications = Notifications;\n this.Authentication = Authentication;\n\n this.associateEndpoint = this.associateEndpoint.bind(this);\n this.dissociateEndpoint = this.dissociateEndpoint.bind(this);\n this.getPaginatedEndpointsByGroup = this.getPaginatedEndpointsByGroup.bind(this);\n }\n\n $onInit() {\n this.state = {\n available: {\n limit: '10',\n filter: '',\n pageNumber: 1,\n totalCount: 0,\n },\n associated: {\n limit: '10',\n filter: '',\n pageNumber: 1,\n totalCount: 0,\n },\n allowCreateTag: this.Authentication.isAdmin(),\n };\n }\n associateEndpoint(endpoint) {\n if (this.pageType === 'create' && !_.includes(this.associatedEndpoints, endpoint)) {\n this.associatedEndpoints.push(endpoint);\n } else if (this.pageType === 'edit') {\n this.GroupService.addEndpoint(this.model.Id, endpoint)\n .then(() => {\n this.Notifications.success('Success', 'Environment successfully added to group');\n this.reloadTablesContent();\n })\n .catch((err) => this.Notifications.error('Error', err, 'Unable to add environment to group'));\n }\n }\n\n dissociateEndpoint(endpoint) {\n if (this.pageType === 'create') {\n _.remove(this.associatedEndpoints, (item) => item.Id === endpoint.Id);\n } else if (this.pageType === 'edit') {\n this.GroupService.removeEndpoint(this.model.Id, endpoint.Id)\n .then(() => {\n this.Notifications.success('Success', 'Environment successfully removed from group');\n this.reloadTablesContent();\n })\n .catch((err) => this.Notifications.error('Error', err, 'Unable to remove environment from group'));\n }\n }\n\n reloadTablesContent() {\n this.getPaginatedEndpointsByGroup(this.pageType, 'available');\n this.getPaginatedEndpointsByGroup(this.pageType, 'associated');\n this.GroupService.group(this.model.Id).then((data) => {\n this.model = data;\n });\n }\n\n getPaginatedEndpointsByGroup(pageType, tableType) {\n if (tableType === 'available') {\n const context = this.state.available;\n const start = (context.pageNumber - 1) * context.limit + 1;\n this.EndpointService.endpointsByGroup(start, context.limit, context.filter, 1).then((data) => {\n this.availableEndpoints = data.value;\n this.state.available.totalCount = data.totalCount;\n });\n } else if (tableType === 'associated' && pageType === 'edit') {\n const groupId = this.model.Id ? this.model.Id : 1;\n const context = this.state.associated;\n const start = (context.pageNumber - 1) * context.limit + 1;\n this.EndpointService.endpointsByGroup(start, context.limit, context.filter, groupId).then((data) => {\n this.associatedEndpoints = data.value;\n this.state.associated.totalCount = data.totalCount;\n });\n }\n // ignore (associated + create) group as there is no backend pagination for this table\n }\n}\n\nangular.module('portainer.app').controller('GroupFormController', GroupFormController);\nexport default GroupFormController;\n","class KubernetesAppGitFormController {\n /* @ngInject */\n constructor($async, $state, StackService, ModalService, Notifications) {\n this.$async = $async;\n this.$state = $state;\n this.StackService = StackService;\n this.ModalService = ModalService;\n this.Notifications = Notifications;\n\n this.state = {\n saveGitSettingsInProgress: false,\n redeployInProgress: false,\n showConfig: true,\n isEdit: false,\n };\n\n this.formValues = {\n RefName: '',\n RepositoryAuthentication: false,\n RepositoryUsername: '',\n RepositoryPassword: '',\n };\n\n this.onChange = this.onChange.bind(this);\n this.onChangeRef = this.onChangeRef.bind(this);\n }\n\n onChangeRef(value) {\n this.onChange({ RefName: value });\n }\n\n onChange(values) {\n this.formValues = {\n ...this.formValues,\n ...values,\n };\n }\n\n async pullAndRedeployApplication() {\n return this.$async(async () => {\n try {\n const confirmed = await this.ModalService.confirmAsync({\n title: 'Are you sure?',\n message: 'Any changes to this application will be overriden by the definition in git and may cause a service interruption. Do you wish to continue?',\n buttons: {\n confirm: {\n label: 'Update',\n className: 'btn-warning',\n },\n },\n });\n if (!confirmed) {\n return;\n }\n this.state.redeployInProgress = true;\n await this.StackService.updateKubeGit(this.stack.Id, this.stack.EndpointId, this.namespace, this.formValues);\n this.Notifications.success('Pulled and redeployed stack successfully');\n await this.$state.reload(this.$state.current);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Failed redeploying application');\n } finally {\n this.state.redeployInProgress = false;\n }\n });\n }\n\n async saveGitSettings() {\n return this.$async(async () => {\n try {\n this.state.saveGitSettingsInProgress = true;\n await this.StackService.updateKubeStack({ EndpointId: this.stack.EndpointId, Id: this.stack.Id }, null, this.formValues);\n this.Notifications.success('Save stack settings successfully');\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to save application settings');\n } finally {\n this.state.saveGitSettingsInProgress = false;\n }\n });\n }\n\n isSubmitButtonDisabled() {\n return this.state.saveGitSettingsInProgress || this.state.redeployInProgress;\n }\n\n $onInit() {\n this.formValues.RefName = this.stack.GitConfig.ReferenceName;\n if (this.stack.GitConfig && this.stack.GitConfig.Authentication) {\n this.formValues.RepositoryUsername = this.stack.GitConfig.Authentication.Username;\n this.formValues.RepositoryAuthentication = true;\n this.state.isEdit = true;\n }\n }\n}\n\nexport default KubernetesAppGitFormController;\n","import uuidv4 from 'uuid/v4';\nimport { RepositoryMechanismTypes } from 'Kubernetes/models/deploy';\nclass KubernetesRedeployAppGitFormController {\n /* @ngInject */\n constructor($async, $state, StackService, ModalService, Notifications, WebhookHelper) {\n this.$async = $async;\n this.$state = $state;\n this.StackService = StackService;\n this.ModalService = ModalService;\n this.Notifications = Notifications;\n this.WebhookHelper = WebhookHelper;\n\n this.state = {\n saveGitSettingsInProgress: false,\n redeployInProgress: false,\n showConfig: false,\n isEdit: false,\n hasUnsavedChanges: false,\n };\n\n this.formValues = {\n RefName: '',\n RepositoryAuthentication: false,\n RepositoryUsername: '',\n RepositoryPassword: '',\n // auto update\n AutoUpdate: {\n RepositoryAutomaticUpdates: false,\n RepositoryMechanism: RepositoryMechanismTypes.INTERVAL,\n RepositoryFetchInterval: '5m',\n RepositoryWebhookURL: '',\n },\n };\n\n this.onChange = this.onChange.bind(this);\n this.onChangeRef = this.onChangeRef.bind(this);\n this.onChangeAutoUpdate = this.onChangeAutoUpdate.bind(this);\n }\n\n onChangeRef(value) {\n this.onChange({ RefName: value });\n }\n\n onChange(values) {\n this.formValues = {\n ...this.formValues,\n ...values,\n };\n this.state.hasUnsavedChanges = angular.toJson(this.savedFormValues) !== angular.toJson(this.formValues);\n }\n\n onChangeAutoUpdate(values) {\n this.onChange({\n AutoUpdate: {\n ...this.formValues.AutoUpdate,\n ...values,\n },\n });\n }\n\n buildAnalyticsProperties() {\n const metadata = {\n 'automatic-updates': automaticUpdatesLabel(this.formValues.AutoUpdate.RepositoryAutomaticUpdates, this.formValues.AutoUpdate.RepositoryMechanism),\n };\n\n return { metadata };\n\n function automaticUpdatesLabel(repositoryAutomaticUpdates, repositoryMechanism) {\n switch (repositoryAutomaticUpdates && repositoryMechanism) {\n case RepositoryMechanismTypes.INTERVAL:\n return 'polling';\n case RepositoryMechanismTypes.WEBHOOK:\n return 'webhook';\n default:\n return 'off';\n }\n }\n }\n\n async pullAndRedeployApplication() {\n return this.$async(async () => {\n try {\n const confirmed = await this.ModalService.confirmAsync({\n title: 'Are you sure?',\n message: 'Any changes to this application will be overriden by the definition in git and may cause a service interruption. Do you wish to continue?',\n buttons: {\n confirm: {\n label: 'Update',\n className: 'btn-warning',\n },\n },\n });\n if (!confirmed) {\n return;\n }\n this.state.redeployInProgress = true;\n await this.StackService.updateKubeGit(this.stack.Id, this.stack.EndpointId, this.namespace, this.formValues);\n this.Notifications.success('Pulled and redeployed stack successfully');\n await this.$state.reload();\n } catch (err) {\n this.Notifications.error('Failure', err, 'Failed redeploying application');\n } finally {\n this.state.redeployInProgress = false;\n }\n });\n }\n\n async saveGitSettings() {\n return this.$async(async () => {\n try {\n this.state.saveGitSettingsInProgress = true;\n await this.StackService.updateKubeStack({ EndpointId: this.stack.EndpointId, Id: this.stack.Id }, null, this.formValues);\n this.savedFormValues = angular.copy(this.formValues);\n this.state.hasUnsavedChanges = false;\n this.Notifications.success('Save stack settings successfully');\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to save application settings');\n } finally {\n this.state.saveGitSettingsInProgress = false;\n }\n });\n }\n\n isSubmitButtonDisabled() {\n return this.state.saveGitSettingsInProgress || this.state.redeployInProgress;\n }\n\n $onInit() {\n this.formValues.RefName = this.stack.GitConfig.ReferenceName;\n // Init auto update\n if (this.stack.AutoUpdate && (this.stack.AutoUpdate.Interval || this.stack.AutoUpdate.Webhook)) {\n this.formValues.AutoUpdate.RepositoryAutomaticUpdates = true;\n\n if (this.stack.AutoUpdate.Interval) {\n this.formValues.AutoUpdate.RepositoryMechanism = RepositoryMechanismTypes.INTERVAL;\n this.formValues.AutoUpdate.RepositoryFetchInterval = this.stack.AutoUpdate.Interval;\n } else if (this.stack.AutoUpdate.Webhook) {\n this.formValues.AutoUpdate.RepositoryMechanism = RepositoryMechanismTypes.WEBHOOK;\n this.formValues.AutoUpdate.RepositoryWebhookURL = this.WebhookHelper.returnStackWebhookUrl(this.stack.AutoUpdate.Webhook);\n }\n }\n\n if (!this.formValues.AutoUpdate.RepositoryWebhookURL) {\n this.formValues.AutoUpdate.RepositoryWebhookURL = this.WebhookHelper.returnStackWebhookUrl(uuidv4());\n }\n\n if (this.stack.GitConfig && this.stack.GitConfig.Authentication) {\n this.formValues.RepositoryUsername = this.stack.GitConfig.Authentication.Username;\n this.formValues.RepositoryAuthentication = true;\n this.state.isEdit = true;\n }\n\n this.savedFormValues = angular.copy(this.formValues);\n }\n}\n\nexport default KubernetesRedeployAppGitFormController;\n","export default class PorSwitchController {\n /* @ngInject */\n constructor(featureService) {\n Object.assign(this, { featureService });\n\n this.limitedToBE = false;\n }\n\n $onInit() {\n if (this.feature) {\n this.limitedToBE = this.featureService.isLimitedToBE(this.feature);\n }\n }\n}\n","import uuidv4 from 'uuid/v4';\nimport { RepositoryMechanismTypes } from 'Kubernetes/models/deploy';\nclass StackRedeployGitFormController {\n /* @ngInject */\n constructor($async, $state, StackService, ModalService, Notifications, WebhookHelper, FormHelper) {\n this.$async = $async;\n this.$state = $state;\n this.StackService = StackService;\n this.ModalService = ModalService;\n this.Notifications = Notifications;\n this.WebhookHelper = WebhookHelper;\n this.FormHelper = FormHelper;\n\n this.state = {\n inProgress: false,\n redeployInProgress: false,\n showConfig: false,\n isEdit: false,\n hasUnsavedChanges: false,\n };\n\n this.formValues = {\n RefName: '',\n RepositoryAuthentication: false,\n RepositoryUsername: '',\n RepositoryPassword: '',\n Env: [],\n // auto update\n AutoUpdate: {\n RepositoryAutomaticUpdates: false,\n RepositoryMechanism: RepositoryMechanismTypes.INTERVAL,\n RepositoryFetchInterval: '5m',\n RepositoryWebhookURL: '',\n },\n };\n\n this.onChange = this.onChange.bind(this);\n this.onChangeRef = this.onChangeRef.bind(this);\n this.onChangeAutoUpdate = this.onChangeAutoUpdate.bind(this);\n this.onChangeEnvVar = this.onChangeEnvVar.bind(this);\n }\n\n buildAnalyticsProperties() {\n const metadata = {};\n\n if (this.formValues.RepositoryAutomaticUpdates) {\n metadata.automaticUpdates = autoSyncLabel(this.formValues.RepositoryMechanism);\n }\n return { metadata };\n\n function autoSyncLabel(type) {\n switch (type) {\n case RepositoryMechanismTypes.INTERVAL:\n return 'polling';\n case RepositoryMechanismTypes.WEBHOOK:\n return 'webhook';\n }\n return 'off';\n }\n }\n\n onChange(values) {\n this.formValues = {\n ...this.formValues,\n ...values,\n };\n\n this.state.hasUnsavedChanges = angular.toJson(this.savedFormValues) !== angular.toJson(this.formValues);\n }\n\n onChangeRef(value) {\n this.onChange({ RefName: value });\n }\n\n onChangeAutoUpdate(values) {\n this.onChange({\n AutoUpdate: {\n ...this.formValues.AutoUpdate,\n ...values,\n },\n });\n }\n\n onChangeEnvVar(value) {\n this.onChange({ Env: value });\n }\n\n async submit() {\n return this.$async(async () => {\n try {\n const confirmed = await this.ModalService.confirmAsync({\n title: 'Are you sure?',\n message: 'Any changes to this stack or application made locally in Portainer will be overridden, which may cause service interruption.',\n buttons: {\n confirm: {\n label: 'Update',\n className: 'btn-warning',\n },\n },\n });\n if (!confirmed) {\n return;\n }\n\n this.state.redeployInProgress = true;\n\n await this.StackService.updateGit(this.stack.Id, this.stack.EndpointId, this.FormHelper.removeInvalidEnvVars(this.formValues.Env), false, this.formValues);\n this.Notifications.success('Pulled and redeployed stack successfully');\n await this.$state.reload();\n } catch (err) {\n this.Notifications.error('Failure', err, 'Failed redeploying stack');\n } finally {\n this.state.redeployInProgress = false;\n }\n });\n }\n\n async saveGitSettings() {\n return this.$async(async () => {\n try {\n this.state.inProgress = true;\n const stack = await this.StackService.updateGitStackSettings(\n this.stack.Id,\n this.stack.EndpointId,\n this.FormHelper.removeInvalidEnvVars(this.formValues.Env),\n this.formValues\n );\n this.savedFormValues = angular.copy(this.formValues);\n this.state.hasUnsavedChanges = false;\n this.Notifications.success('Save stack settings successfully');\n\n this.stack = stack;\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to save stack settings');\n } finally {\n this.state.inProgress = false;\n }\n });\n }\n\n isSubmitButtonDisabled() {\n return this.state.inProgress || this.state.redeployInProgress;\n }\n\n isAutoUpdateChanged() {\n const wasEnabled = !!(this.stack.AutoUpdate && (this.stack.AutoUpdate.Interval || this.stack.AutoUpdate.Webhook));\n const isEnabled = this.formValues.AutoUpdate.RepositoryAutomaticUpdates;\n return isEnabled !== wasEnabled;\n }\n\n $onInit() {\n this.formValues.RefName = this.model.ReferenceName;\n this.formValues.Env = this.stack.Env;\n // Init auto update\n if (this.stack.AutoUpdate && (this.stack.AutoUpdate.Interval || this.stack.AutoUpdate.Webhook)) {\n this.formValues.AutoUpdate.RepositoryAutomaticUpdates = true;\n\n if (this.stack.AutoUpdate.Interval) {\n this.formValues.AutoUpdate.RepositoryMechanism = RepositoryMechanismTypes.INTERVAL;\n this.formValues.AutoUpdate.RepositoryFetchInterval = this.stack.AutoUpdate.Interval;\n } else if (this.stack.AutoUpdate.Webhook) {\n this.formValues.AutoUpdate.RepositoryMechanism = RepositoryMechanismTypes.WEBHOOK;\n this.formValues.AutoUpdate.RepositoryWebhookURL = this.WebhookHelper.returnStackWebhookUrl(this.stack.AutoUpdate.Webhook);\n }\n }\n\n if (!this.formValues.AutoUpdate.RepositoryWebhookURL) {\n this.formValues.AutoUpdate.RepositoryWebhookURL = this.WebhookHelper.returnStackWebhookUrl(uuidv4());\n }\n\n if (this.stack.GitConfig && this.stack.GitConfig.Authentication) {\n this.formValues.RepositoryUsername = this.stack.GitConfig.Authentication.Username;\n this.formValues.RepositoryAuthentication = true;\n this.state.isEdit = true;\n }\n\n this.savedFormValues = angular.copy(this.formValues);\n }\n}\n\nexport default StackRedeployGitFormController;\n","import { buildOption } from '@/portainer/components/box-selector';\n\nexport default class ThemeSettingsController {\n /* @ngInject */\n constructor($async, Authentication, ThemeManager, StateManager, UserService, Notifications) {\n this.$async = $async;\n this.Authentication = Authentication;\n this.ThemeManager = ThemeManager;\n this.StateManager = StateManager;\n this.UserService = UserService;\n this.Notifications = Notifications;\n\n this.setTheme = this.setTheme.bind(this);\n }\n\n /** Theme Settings Panel */\n async updateTheme() {\n try {\n await this.UserService.updateUserTheme(this.state.userId, this.state.userTheme);\n this.state.themeInProgress = false;\n this.Notifications.success('Success', 'User theme successfully updated');\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to update user theme');\n }\n }\n\n setTheme(theme) {\n if (theme === 'auto' || !theme) {\n this.ThemeManager.autoTheme();\n } else {\n this.ThemeManager.setTheme(theme);\n }\n this.state.themeInProgress = true;\n }\n\n $onInit() {\n return this.$async(async () => {\n this.state = {\n userId: null,\n userTheme: '',\n initTheme: '',\n defaultTheme: 'auto',\n themeInProgress: false,\n };\n\n this.state.availableThemes = [\n buildOption('light', 'fas fa-sun', 'Light Theme', 'Default color mode', 'light'),\n buildOption('dark', 'fas fa-moon', 'Dark Theme', 'Dark color mode', 'dark'),\n buildOption('highcontrast', 'fas fa-adjust', 'High Contrast', 'High contrast color mode', 'highcontrast'),\n buildOption('auto', 'fas fa-sync-alt', 'Auto', 'Sync with system theme', 'auto'),\n ];\n\n try {\n this.state.userId = await this.Authentication.getUserDetails().ID;\n const data = await this.UserService.user(this.state.userId);\n this.state.userTheme = data.UserTheme || this.state.defaultTheme;\n this.state.initTheme = this.state.userTheme;\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to get user details');\n }\n });\n }\n\n $onDestroy() {\n if (this.state.themeInProgress) {\n this.ThemeManager.setTheme(this.state.initTheme);\n }\n }\n}\n","import _ from 'lodash-es';\n\nclass GenericHelper {\n static findDeepAll(obj, target, res = []) {\n if (typeof obj === 'object') {\n _.forEach(obj, (child, key) => {\n if (key === target) res.push(child);\n if (typeof child === 'object') GenericHelper.findDeepAll(child, target, res);\n });\n }\n return res;\n }\n}\n\nexport default GenericHelper;\n","export function RegistryGitlabProject(project) {\n this.Id = project.id;\n this.Description = project.description;\n this.Name = project.name;\n this.Namespace = project.namespace ? project.namespace.name : '';\n this.PathWithNamespace = project.path_with_namespace;\n this.RegistryEnabled = project.container_registry_enabled;\n}\n","export function MotdViewModel(data) {\n this.Title = data.Title;\n this.Message = data.Message;\n this.Hash = data.Hash;\n this.Style = data.Style;\n this.ContentLayout = data.ContentLayout;\n}\n","import _ from 'lodash-es';\n\nexport function RegistryRepositoryViewModel(item) {\n if (item.name && item.tags) {\n this.Name = item.name;\n this.TagsCount = _.without(item.tags, null).length;\n } else {\n this.Name = item;\n this.TagsCount = 0;\n }\n}\n\nexport function RegistryRepositoryGitlabViewModel(data) {\n this.Name = data.path;\n this.TagsCount = data.tags.length;\n}\n","import _ from 'lodash-es';\nimport { PorImageRegistryModel } from 'Docker/models/porImageRegistry';\n\nexport class TemplateViewModel {\n constructor(data, version) {\n switch (version) {\n case '2':\n this.setTemplatesV2(data);\n break;\n default:\n throw new Error('Unsupported template version');\n }\n }\n\n setTemplatesV2(data) {\n this.Id = data.Id;\n this.Title = data.title;\n this.Type = data.type;\n this.Description = data.description;\n this.AdministratorOnly = data.AdministratorOnly;\n this.Name = data.name;\n this.Note = data.note;\n this.Categories = data.categories ? data.categories : [];\n this.Platform = data.platform ? data.platform : '';\n this.Logo = data.logo;\n this.Repository = data.repository;\n this.Hostname = data.hostname;\n this.RegistryModel = new PorImageRegistryModel();\n this.RegistryModel.Image = data.image;\n this.RegistryModel.Registry.URL = data.registry || '';\n this.Command = data.command ? data.command : '';\n this.Network = data.network ? data.network : '';\n this.Privileged = data.privileged ? data.privileged : false;\n this.Interactive = data.interactive ? data.interactive : false;\n this.RestartPolicy = data.restart_policy ? data.restart_policy : 'always';\n this.Labels = data.labels ? data.labels : [];\n this.Hosts = data.hosts ? data.hosts : [];\n this.Env = templateEnv(data);\n this.Volumes = templateVolumes(data);\n this.Ports = templatePorts(data);\n }\n}\n\nfunction templatePorts(data) {\n var ports = [];\n\n if (data.ports) {\n ports = data.ports.map(function (p) {\n var portAndProtocol = _.split(p, '/');\n var hostAndContainerPort = _.split(portAndProtocol[0], ':');\n\n return {\n hostPort: hostAndContainerPort.length > 1 ? hostAndContainerPort[0] : undefined,\n containerPort: hostAndContainerPort.length > 1 ? hostAndContainerPort[1] : hostAndContainerPort[0],\n protocol: portAndProtocol[1],\n };\n });\n }\n\n return ports;\n}\n\nfunction templateVolumes(data) {\n var volumes = [];\n\n if (data.volumes) {\n volumes = data.volumes.map(function (v) {\n return {\n container: v.container,\n readonly: v.readonly || false,\n type: v.bind ? 'bind' : 'auto',\n bind: v.bind ? v.bind : null,\n };\n });\n }\n\n return volumes;\n}\n\nfunction templateEnv(data) {\n var env = [];\n\n if (data.env) {\n env = data.env.map(function (envvar) {\n envvar.type = 2;\n envvar.value = envvar.default ? envvar.default : '';\n\n if (envvar.preset) {\n envvar.type = 1;\n }\n\n if (envvar.select) {\n envvar.type = 3;\n for (var i = 0; i < envvar.select.length; i++) {\n var allowedValue = envvar.select[i];\n if (allowedValue.default) {\n envvar.value = allowedValue.value;\n break;\n }\n }\n }\n return envvar;\n });\n }\n\n return env;\n}\n","export function WebhookViewModel(data) {\n this.Id = data.Id;\n this.Token = data.Token;\n this.ResourceId = data.ResourceID;\n this.EndpointId = data.EndpointID;\n this.WebhookType = data.WebhookType;\n}\n","import { HIDE_INTERNAL_AUTH } from '@/portainer/feature-flags/feature-ids';\n\nimport { buildOption } from '@/portainer/components/box-selector';\n\nexport default class OAuthProviderSelectorController {\n constructor() {\n this.options = [\n buildOption('microsoft', 'fab fa-microsoft', 'Microsoft', 'Microsoft OAuth provider', 'microsoft', HIDE_INTERNAL_AUTH),\n buildOption('google', 'fab fa-google', 'Google', 'Google OAuth provider', 'google', HIDE_INTERNAL_AUTH),\n buildOption('github', 'fab fa-github', 'Github', 'Github OAuth provider', 'github', HIDE_INTERNAL_AUTH),\n buildOption('custom', 'fa fa-user-check', 'Custom', 'Custom OAuth provider', 'custom'),\n ];\n }\n}\n","import { HIDE_INTERNAL_AUTH } from '@/portainer/feature-flags/feature-ids';\n\nimport providers, { getProviderByUrl } from './providers';\n\nexport default class OAuthSettingsController {\n /* @ngInject */\n constructor(featureService) {\n this.featureService = featureService;\n\n this.limitedFeature = HIDE_INTERNAL_AUTH;\n this.limitedFeatureClass = 'limited-be';\n\n this.state = {\n provider: 'custom',\n overrideConfiguration: false,\n microsoftTenantID: '',\n };\n\n this.$onInit = this.$onInit.bind(this);\n this.onSelectProvider = this.onSelectProvider.bind(this);\n this.onMicrosoftTenantIDChange = this.onMicrosoftTenantIDChange.bind(this);\n this.useDefaultProviderConfiguration = this.useDefaultProviderConfiguration.bind(this);\n this.updateSSO = this.updateSSO.bind(this);\n this.addTeamMembershipMapping = this.addTeamMembershipMapping.bind(this);\n this.removeTeamMembership = this.removeTeamMembership.bind(this);\n }\n\n onMicrosoftTenantIDChange() {\n const tenantID = this.state.microsoftTenantID;\n\n this.settings.AuthorizationURI = `https://login.microsoftonline.com/${tenantID}/oauth2/authorize`;\n this.settings.AccessTokenURI = `https://login.microsoftonline.com/${tenantID}/oauth2/token`;\n this.settings.ResourceURI = `https://graph.windows.net/${tenantID}/me?api-version=2013-11-08`;\n }\n\n useDefaultProviderConfiguration(providerId) {\n const provider = providers[providerId];\n\n this.state.overrideConfiguration = false;\n\n if (!this.isLimitedToBE || providerId === 'custom') {\n this.settings.AuthorizationURI = provider.authUrl;\n this.settings.AccessTokenURI = provider.accessTokenUrl;\n this.settings.ResourceURI = provider.resourceUrl;\n this.settings.LogoutURI = provider.logoutUrl;\n this.settings.UserIdentifier = provider.userIdentifier;\n this.settings.Scopes = provider.scopes;\n\n if (providerId === 'microsoft' && this.state.microsoftTenantID !== '') {\n this.onMicrosoftTenantIDChange();\n }\n } else {\n this.settings.ClientID = '';\n this.settings.ClientSecret = '';\n }\n }\n\n onSelectProvider(provider) {\n this.state.provider = provider;\n\n this.useDefaultProviderConfiguration(provider);\n }\n\n updateSSO() {\n this.settings.HideInternalAuth = this.featureService.isLimitedToBE(this.limitedFeature) ? false : this.settings.SSO;\n }\n\n addTeamMembershipMapping() {\n this.settings.TeamMemberships.OAuthClaimMappings.push({ ClaimValRegex: '', Team: this.settings.DefaultTeamID });\n }\n\n removeTeamMembership(index) {\n this.settings.TeamMemberships.OAuthClaimMappings.splice(index, 1);\n }\n\n isOAuthTeamMembershipFormValid() {\n if (this.settings.OAuthAutoMapTeamMemberships && this.settings.TeamMemberships) {\n if (!this.settings.TeamMemberships.OAuthClaimName) {\n return false;\n }\n\n const hasInvalidMapping = this.settings.TeamMemberships.OAuthClaimMappings.some((m) => !(m.ClaimValRegex && m.Team));\n if (hasInvalidMapping) {\n return false;\n }\n }\n return true;\n }\n\n $onInit() {\n this.isLimitedToBE = this.featureService.isLimitedToBE(this.limitedFeature);\n\n if (this.isLimitedToBE) {\n return;\n }\n\n if (this.settings.RedirectURI === '') {\n this.settings.RedirectURI = window.location.origin;\n }\n\n if (this.settings.AuthorizationURI) {\n const authUrl = this.settings.AuthorizationURI;\n\n this.state.provider = getProviderByUrl(authUrl);\n if (this.state.provider === 'microsoft') {\n const tenantID = authUrl.match(/login.microsoftonline.com\\/(.*?)\\//)[1];\n this.state.microsoftTenantID = tenantID;\n this.onMicrosoftTenantIDChange();\n }\n }\n\n if (this.settings.DefaultTeamID === 0) {\n this.settings.DefaultTeamID = null;\n }\n\n if (this.settings.TeamMemberships == null) {\n this.settings.TeamMemberships = {};\n }\n\n if (this.settings.TeamMemberships.OAuthClaimMappings === null) {\n this.settings.TeamMemberships.OAuthClaimMappings = [];\n }\n }\n}\n","export default function getEndpointsTotalCount(data, headers) {\n const response = {};\n response.value = angular.fromJson(data);\n response.totalCount = headers('X-Total-Count');\n return response;\n}\n","export default class CreateUserAccessTokenController {\n /* @ngInject */\n constructor($async, $analytics, Authentication, UserService, Notifications) {\n this.$async = $async;\n this.$analytics = $analytics;\n this.Authentication = Authentication;\n this.UserService = UserService;\n this.Notifications = Notifications;\n\n this.onSubmit = this.onSubmit.bind(this);\n this.onError = this.onError.bind(this);\n }\n\n async onSubmit(description) {\n const accessToken = await this.UserService.createAccessToken(this.state.userId, description);\n // Dispatch analytics event upon success accessToken generation\n this.$analytics.eventTrack('portainer-account-access-token-create', { category: 'portainer' });\n return accessToken;\n }\n\n onError(heading, error, message) {\n this.Notifications.error(heading, error, message);\n }\n\n $onInit() {\n return this.$async(async () => {\n const userId = this.Authentication.getUserDetails().ID;\n this.state = {\n userId,\n };\n });\n }\n}\n","import _ from 'lodash';\nimport { AccessControlFormData } from 'Portainer/components/accessControlForm/porAccessControlFormModel';\nimport { TEMPLATE_NAME_VALIDATION_REGEX } from '@/constants';\n\nclass CreateCustomTemplateViewController {\n /* @ngInject */\n constructor($async, $state, $window, Authentication, ModalService, CustomTemplateService, FormValidator, Notifications, ResourceControlService, StackService, StateManager) {\n Object.assign(this, {\n $async,\n $state,\n $window,\n Authentication,\n ModalService,\n CustomTemplateService,\n FormValidator,\n Notifications,\n ResourceControlService,\n StackService,\n StateManager,\n });\n\n this.formValues = {\n Title: '',\n FileContent: '',\n File: null,\n RepositoryURL: '',\n RepositoryReferenceName: '',\n RepositoryAuthentication: false,\n RepositoryUsername: '',\n RepositoryPassword: '',\n ComposeFilePathInRepository: 'docker-compose.yml',\n Description: '',\n Note: '',\n Logo: '',\n Platform: 1,\n Type: 1,\n AccessControlData: new AccessControlFormData(),\n };\n\n this.state = {\n Method: 'editor',\n formValidationError: '',\n actionInProgress: false,\n fromStack: false,\n loading: true,\n isEditorDirty: false,\n templateNameRegex: TEMPLATE_NAME_VALIDATION_REGEX,\n };\n\n this.templates = [];\n\n this.createCustomTemplate = this.createCustomTemplate.bind(this);\n this.createCustomTemplateAsync = this.createCustomTemplateAsync.bind(this);\n this.validateForm = this.validateForm.bind(this);\n this.createCustomTemplateByMethod = this.createCustomTemplateByMethod.bind(this);\n this.createCustomTemplateFromFileContent = this.createCustomTemplateFromFileContent.bind(this);\n this.createCustomTemplateFromFileUpload = this.createCustomTemplateFromFileUpload.bind(this);\n this.createCustomTemplateFromGitRepository = this.createCustomTemplateFromGitRepository.bind(this);\n this.editorUpdate = this.editorUpdate.bind(this);\n this.onChangeMethod = this.onChangeMethod.bind(this);\n this.onChangeFormValues = this.onChangeFormValues.bind(this);\n }\n\n createCustomTemplate() {\n return this.$async(this.createCustomTemplateAsync);\n }\n\n onChangeMethod() {\n this.formValues.FileContent = '';\n this.selectedTemplate = null;\n }\n\n async createCustomTemplateAsync() {\n let method = this.state.Method;\n\n if (method === 'template') {\n method = 'editor';\n }\n\n if (!this.validateForm(method)) {\n return;\n }\n\n this.state.actionInProgress = true;\n try {\n const customTemplate = await this.createCustomTemplateByMethod(method);\n\n const accessControlData = this.formValues.AccessControlData;\n const userDetails = this.Authentication.getUserDetails();\n const userId = userDetails.ID;\n await this.ResourceControlService.applyResourceControl(userId, accessControlData, customTemplate.ResourceControl);\n\n this.Notifications.success('Custom template successfully created');\n this.state.isEditorDirty = false;\n this.$state.go('docker.templates.custom');\n } catch (err) {\n this.Notifications.error('Failure', err, 'A template with the same name already exists');\n } finally {\n this.state.actionInProgress = false;\n }\n }\n\n validateForm(method) {\n this.state.formValidationError = '';\n\n if (method === 'editor' && this.formValues.FileContent === '') {\n this.state.formValidationError = 'Template file content must not be empty';\n return false;\n }\n\n const title = this.formValues.Title;\n const isNotUnique = _.some(this.templates, (template) => template.Title === title);\n if (isNotUnique) {\n this.state.formValidationError = 'A template with the same name already exists';\n return false;\n }\n\n const isAdmin = this.Authentication.isAdmin();\n const accessControlData = this.formValues.AccessControlData;\n const error = this.FormValidator.validateAccessControl(accessControlData, isAdmin);\n\n if (error) {\n this.state.formValidationError = error;\n return false;\n }\n\n return true;\n }\n\n createCustomTemplateByMethod(method) {\n switch (method) {\n case 'editor':\n return this.createCustomTemplateFromFileContent();\n case 'upload':\n return this.createCustomTemplateFromFileUpload();\n case 'repository':\n return this.createCustomTemplateFromGitRepository();\n }\n }\n\n createCustomTemplateFromFileContent() {\n return this.CustomTemplateService.createCustomTemplateFromFileContent(this.formValues);\n }\n\n createCustomTemplateFromFileUpload() {\n return this.CustomTemplateService.createCustomTemplateFromFileUpload(this.formValues);\n }\n\n createCustomTemplateFromGitRepository() {\n return this.CustomTemplateService.createCustomTemplateFromGitRepository(this.formValues);\n }\n\n editorUpdate(cm) {\n this.formValues.FileContent = cm.getValue();\n this.state.isEditorDirty = true;\n }\n\n onChangeFormValues(newValues) {\n this.formValues = newValues;\n }\n\n async $onInit() {\n const applicationState = this.StateManager.getState();\n\n this.state.endpointMode = applicationState.endpoint.mode;\n let stackType = 0;\n if (this.state.endpointMode.provider === 'DOCKER_STANDALONE') {\n stackType = 2;\n } else if (this.state.endpointMode.provider === 'DOCKER_SWARM_MODE') {\n stackType = 1;\n }\n this.formValues.Type = stackType;\n\n const { fileContent, type } = this.$state.params;\n\n this.formValues.FileContent = fileContent;\n if (type) {\n this.formValues.Type = +type;\n }\n\n try {\n this.templates = await this.CustomTemplateService.customTemplates([1, 2]);\n } catch (err) {\n this.Notifications.error('Failure loading', err, 'Failed loading custom templates');\n }\n\n this.state.loading = false;\n\n this.$window.onbeforeunload = () => {\n if (this.state.Method === 'editor' && this.formValues.FileContent && this.state.isEditorDirty) {\n return '';\n }\n };\n }\n\n $onDestroy() {\n this.state.isEditorDirty = false;\n }\n\n async uiCanExit() {\n if (this.state.Method === 'editor' && this.formValues.FileContent && this.state.isEditorDirty) {\n return this.ModalService.confirmWebEditorDiscard();\n }\n }\n}\n\nexport default CreateCustomTemplateViewController;\n","import _ from 'lodash-es';\nimport { AccessControlFormData } from 'Portainer/components/accessControlForm/porAccessControlFormModel';\nimport { TEMPLATE_NAME_VALIDATION_REGEX } from '@/constants';\n\nclass CustomTemplatesViewController {\n /* @ngInject */\n constructor(\n $anchorScroll,\n $async,\n $rootScope,\n $state,\n Authentication,\n CustomTemplateService,\n EndpointProvider,\n FormValidator,\n ModalService,\n NetworkService,\n Notifications,\n ResourceControlService,\n StackService,\n StateManager\n ) {\n this.$anchorScroll = $anchorScroll;\n this.$async = $async;\n this.$rootScope = $rootScope;\n this.$state = $state;\n this.Authentication = Authentication;\n this.CustomTemplateService = CustomTemplateService;\n this.EndpointProvider = EndpointProvider;\n this.FormValidator = FormValidator;\n this.ModalService = ModalService;\n this.NetworkService = NetworkService;\n this.Notifications = Notifications;\n this.ResourceControlService = ResourceControlService;\n this.StateManager = StateManager;\n this.StackService = StackService;\n\n this.DOCKER_STANDALONE = 'DOCKER_STANDALONE';\n this.DOCKER_SWARM_MODE = 'DOCKER_SWARM_MODE';\n\n this.state = {\n selectedTemplate: null,\n showAdvancedOptions: false,\n formValidationError: '',\n actionInProgress: false,\n isEditorVisible: false,\n deployable: false,\n templateNameRegex: TEMPLATE_NAME_VALIDATION_REGEX,\n };\n\n this.currentUser = {\n isAdmin: false,\n id: null,\n };\n\n this.formValues = {\n network: '',\n name: '',\n fileContent: '',\n AccessControlData: new AccessControlFormData(),\n };\n\n this.getTemplates = this.getTemplates.bind(this);\n this.getTemplatesAsync = this.getTemplatesAsync.bind(this);\n this.removeTemplates = this.removeTemplates.bind(this);\n this.removeTemplatesAsync = this.removeTemplatesAsync.bind(this);\n this.validateForm = this.validateForm.bind(this);\n this.createStack = this.createStack.bind(this);\n this.createStackAsync = this.createStackAsync.bind(this);\n this.selectTemplate = this.selectTemplate.bind(this);\n this.selectTemplateAsync = this.selectTemplateAsync.bind(this);\n this.unselectTemplate = this.unselectTemplate.bind(this);\n this.unselectTemplateAsync = this.unselectTemplateAsync.bind(this);\n this.getNetworks = this.getNetworks.bind(this);\n this.getNetworksAsync = this.getNetworksAsync.bind(this);\n this.confirmDelete = this.confirmDelete.bind(this);\n this.confirmDeleteAsync = this.confirmDeleteAsync.bind(this);\n this.editorUpdate = this.editorUpdate.bind(this);\n this.isEditAllowed = this.isEditAllowed.bind(this);\n }\n\n isEditAllowed(template) {\n return this.currentUser.isAdmin || this.currentUser.id === template.CreatedByUserId;\n }\n\n getTemplates() {\n return this.$async(this.getTemplatesAsync);\n }\n async getTemplatesAsync() {\n try {\n this.templates = await this.CustomTemplateService.customTemplates([1, 2]);\n } catch (err) {\n this.Notifications.error('Failed loading templates', err, 'Unable to load custom templates');\n }\n }\n\n removeTemplates(templates) {\n return this.$async(this.removeTemplatesAsync, templates);\n }\n async removeTemplatesAsync(templates) {\n for (let template of templates) {\n try {\n await this.CustomTemplateService.remove(template.id);\n this.Notifications.success('Removed template successfully');\n _.remove(this.templates, template);\n } catch (err) {\n this.Notifications.error('Failed removing template', err, 'Unable to remove custom template');\n }\n }\n }\n\n validateForm(accessControlData, isAdmin) {\n this.state.formValidationError = '';\n const error = this.FormValidator.validateAccessControl(accessControlData, isAdmin);\n\n if (error) {\n this.state.formValidationError = error;\n return false;\n }\n return true;\n }\n\n createStack() {\n return this.$async(this.createStackAsync);\n }\n async createStackAsync() {\n const userId = this.currentUser.id;\n const accessControlData = this.formValues.AccessControlData;\n\n if (!this.validateForm(accessControlData, this.currentUser.isAdmin)) {\n return;\n }\n const stackName = this.formValues.name;\n\n const endpointId = this.EndpointProvider.endpointID();\n\n this.state.actionInProgress = true;\n\n try {\n const file = this.formValues.fileContent;\n const createAction = this.state.selectedTemplate.Type === 1 ? this.StackService.createSwarmStackFromFileContent : this.StackService.createComposeStackFromFileContent;\n const { ResourceControl: resourceControl } = await createAction(stackName, file, [], endpointId);\n await this.ResourceControlService.applyResourceControl(userId, accessControlData, resourceControl);\n this.Notifications.success('Stack successfully deployed');\n this.$state.go('docker.stacks');\n } catch (err) {\n this.Notifications.error('Deployment error', err, 'Failed to deploy stack');\n } finally {\n this.state.actionInProgress = false;\n }\n }\n\n unselectTemplate(template) {\n // wrapping unselect with async to make a digest cycle run between unselect to select\n return this.$async(this.unselectTemplateAsync, template);\n }\n async unselectTemplateAsync(template) {\n template.Selected = false;\n this.state.selectedTemplate = null;\n\n this.formValues = {\n network: '',\n name: '',\n fileContent: '',\n AccessControlData: new AccessControlFormData(),\n };\n }\n\n selectTemplate(template) {\n return this.$async(this.selectTemplateAsync, template);\n }\n async selectTemplateAsync(template) {\n if (this.state.selectedTemplate) {\n await this.unselectTemplate(this.state.selectedTemplate);\n }\n\n template.Selected = true;\n\n this.formValues.network = _.find(this.availableNetworks, function (o) {\n return o.Name === 'bridge';\n });\n\n this.formValues.name = template.Title ? template.Title : '';\n this.state.selectedTemplate = template;\n this.$anchorScroll('view-top');\n const applicationState = this.StateManager.getState();\n this.state.deployable = this.isDeployable(applicationState.endpoint, template.Type);\n const file = await this.CustomTemplateService.customTemplateFile(template.Id);\n this.formValues.fileContent = file;\n }\n\n getNetworks(provider, apiVersion) {\n return this.$async(this.getNetworksAsync, provider, apiVersion);\n }\n async getNetworksAsync(provider, apiVersion) {\n try {\n const networks = await this.NetworkService.networks(\n provider === 'DOCKER_STANDALONE' || provider === 'DOCKER_SWARM_MODE',\n false,\n provider === 'DOCKER_SWARM_MODE' && apiVersion >= 1.25\n );\n this.availableNetworks = networks;\n } catch (err) {\n this.Notifications.error('Failure', err, 'Failed to load networks.');\n }\n }\n\n confirmDelete(templateId) {\n return this.$async(this.confirmDeleteAsync, templateId);\n }\n async confirmDeleteAsync(templateId) {\n const confirmed = await this.ModalService.confirmDeletionAsync('Are you sure that you want to delete this template?');\n if (!confirmed) {\n return;\n }\n\n try {\n await this.CustomTemplateService.remove(templateId);\n _.remove(this.templates, { Id: templateId });\n } catch (err) {\n this.Notifications.error('Failure', err, 'Failed to delete template');\n }\n }\n\n editorUpdate(cm) {\n this.formValues.fileContent = cm.getValue();\n }\n\n isDeployable(endpoint, templateType) {\n let deployable = false;\n switch (templateType) {\n case 1:\n deployable = endpoint.mode.provider === this.DOCKER_SWARM_MODE;\n break;\n case 2:\n deployable = endpoint.mode.provider === this.DOCKER_STANDALONE;\n break;\n }\n\n return deployable;\n }\n\n $onInit() {\n const applicationState = this.StateManager.getState();\n\n const {\n endpoint: { mode: endpointMode },\n apiVersion,\n } = applicationState;\n\n this.getTemplates();\n this.getNetworks(endpointMode.provider, apiVersion);\n\n this.currentUser.isAdmin = this.Authentication.isAdmin();\n const user = this.Authentication.getUserDetails();\n this.currentUser.id = user.ID;\n }\n}\n\nexport default CustomTemplatesViewController;\n","import _ from 'lodash';\n\nimport { AccessControlFormData } from 'Portainer/components/accessControlForm/porAccessControlFormModel';\nimport { ResourceControlViewModel } from 'Portainer/models/resourceControl/resourceControl';\n\nclass EditCustomTemplateViewController {\n /* @ngInject */\n constructor($async, $state, $window, ModalService, Authentication, CustomTemplateService, FormValidator, Notifications, ResourceControlService) {\n Object.assign(this, { $async, $state, $window, ModalService, Authentication, CustomTemplateService, FormValidator, Notifications, ResourceControlService });\n\n this.formValues = null;\n this.state = {\n formValidationError: '',\n isEditorDirty: false,\n };\n this.templates = [];\n\n this.getTemplate = this.getTemplate.bind(this);\n this.getTemplateAsync = this.getTemplateAsync.bind(this);\n this.submitAction = this.submitAction.bind(this);\n this.submitActionAsync = this.submitActionAsync.bind(this);\n this.editorUpdate = this.editorUpdate.bind(this);\n }\n\n getTemplate() {\n return this.$async(this.getTemplateAsync);\n }\n async getTemplateAsync() {\n try {\n const [template, file] = await Promise.all([\n this.CustomTemplateService.customTemplate(this.$state.params.id),\n this.CustomTemplateService.customTemplateFile(this.$state.params.id),\n ]);\n template.FileContent = file;\n this.formValues = template;\n this.oldFileContent = this.formValues.FileContent;\n this.formValues.ResourceControl = new ResourceControlViewModel(template.ResourceControl);\n this.formValues.AccessControlData = new AccessControlFormData();\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve custom template data');\n }\n }\n\n validateForm() {\n this.state.formValidationError = '';\n\n if (!this.formValues.FileContent) {\n this.state.formValidationError = 'Template file content must not be empty';\n return false;\n }\n\n const title = this.formValues.Title;\n const id = this.$state.params.id;\n const isNotUnique = _.some(this.templates, (template) => template.Title === title && template.Id != id);\n if (isNotUnique) {\n this.state.formValidationError = `A template with the name ${title} already exists`;\n return false;\n }\n\n const isAdmin = this.Authentication.isAdmin();\n const accessControlData = this.formValues.AccessControlData;\n const error = this.FormValidator.validateAccessControl(accessControlData, isAdmin);\n\n if (error) {\n this.state.formValidationError = error;\n return false;\n }\n\n return true;\n }\n\n submitAction() {\n return this.$async(this.submitActionAsync);\n }\n async submitActionAsync() {\n if (!this.validateForm()) {\n return;\n }\n\n this.actionInProgress = true;\n try {\n await this.CustomTemplateService.updateCustomTemplate(this.formValues.Id, this.formValues);\n\n const userDetails = this.Authentication.getUserDetails();\n const userId = userDetails.ID;\n await this.ResourceControlService.applyResourceControl(userId, this.formValues.AccessControlData, this.formValues.ResourceControl);\n\n this.Notifications.success('Custom template successfully updated');\n this.state.isEditorDirty = false;\n this.$state.go('docker.templates.custom');\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to update custom template');\n } finally {\n this.actionInProgress = false;\n }\n }\n\n editorUpdate(cm) {\n if (this.formValues.FileContent.replace(/(\\r\\n|\\n|\\r)/gm, '') !== cm.getValue().replace(/(\\r\\n|\\n|\\r)/gm, '')) {\n this.formValues.FileContent = cm.getValue();\n this.state.isEditorDirty = true;\n }\n }\n\n async uiCanExit() {\n if (this.formValues.FileContent !== this.oldFileContent && this.state.isEditorDirty) {\n return this.ModalService.confirmWebEditorDiscard();\n }\n }\n\n async $onInit() {\n this.getTemplate();\n\n try {\n this.templates = await this.CustomTemplateService.customTemplates([1, 2]);\n } catch (err) {\n this.Notifications.error('Failure loading', err, 'Failed loading custom templates');\n }\n\n this.$window.onbeforeunload = () => {\n if (this.formValues.FileContent !== this.oldFileContent && this.state.isEditorDirty) {\n return '';\n }\n };\n }\n\n $onDestroy() {\n this.state.isEditorDirty = false;\n }\n}\n\nexport default EditCustomTemplateViewController;\n","import { RegistryTypes } from 'Portainer/models/registryTypes';\nimport { RegistryCreateFormValues } from 'Portainer/models/registry';\n\nclass CreateRegistryController {\n /* @ngInject */\n constructor($async, $state, EndpointProvider, Notifications, RegistryService, RegistryGitlabService) {\n Object.assign(this, { $async, $state, EndpointProvider, Notifications, RegistryService, RegistryGitlabService });\n\n this.RegistryTypes = RegistryTypes;\n this.state = {\n actionInProgress: false,\n overrideConfiguration: false,\n gitlab: {\n get selectedItemCount() {\n return this.selectedItems.length || 0;\n },\n selectedItems: [],\n },\n originViewReference: 'portainer.registries',\n };\n\n this.createRegistry = this.createRegistry.bind(this);\n this.retrieveGitlabRegistries = this.retrieveGitlabRegistries.bind(this);\n this.createGitlabRegistries = this.createGitlabRegistries.bind(this);\n }\n\n useDefaultQuayConfiguration() {\n this.model.Quay.useOrganisation = false;\n this.model.Quay.organisationName = '';\n }\n\n selectQuayRegistry() {\n this.model.Name = 'Quay';\n this.model.URL = 'quay.io';\n this.model.Authentication = true;\n this.model.Quay = {};\n this.useDefaultQuayConfiguration();\n }\n\n useDefaultGitlabConfiguration() {\n this.model.URL = 'https://registry.gitlab.com';\n this.model.Gitlab.InstanceURL = 'https://gitlab.com';\n }\n\n selectGitlabRegistry() {\n this.model.Name = '';\n this.model.Authentication = true;\n this.model.Gitlab = {};\n this.useDefaultGitlabConfiguration();\n }\n\n selectAzureRegistry() {\n this.model.Name = '';\n this.model.URL = '';\n this.model.Authentication = true;\n }\n\n selectProGetRegistry() {\n this.model.Name = '';\n this.model.URL = '';\n this.model.BaseURL = '';\n this.model.Authentication = true;\n }\n\n selectCustomRegistry() {\n this.model.Name = '';\n this.model.URL = '';\n this.model.Authentication = false;\n }\n\n selectDockerHub() {\n this.model.Name = '';\n this.model.URL = 'docker.io';\n this.model.Authentication = true;\n }\n\n useDefaultEcrConfiguration() {\n this.model.Ecr.Region = '';\n }\n\n selectEcr() {\n this.model.Name = '';\n this.model.URL = '';\n this.model.Authentication = false;\n this.model.Ecr = {};\n this.useDefaultEcrConfiguration();\n }\n\n retrieveGitlabRegistries() {\n return this.$async(async () => {\n this.state.actionInProgress = true;\n try {\n this.gitlabProjects = await this.RegistryGitlabService.projects(this.model.Gitlab.InstanceURL, this.model.Token);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve projects');\n } finally {\n this.state.actionInProgress = false;\n }\n });\n }\n\n createGitlabRegistries() {\n return this.$async(async () => {\n try {\n this.state.actionInProgress = true;\n await this.RegistryService.createGitlabRegistries(this.model, this.state.gitlab.selectedItems);\n this.Notifications.success('Registries successfully created');\n this.$state.go(this.state.originViewReference, { endpointId: this.EndpointProvider.endpointID() });\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to create registries');\n this.state.actionInProgress = false;\n }\n });\n }\n\n createRegistry() {\n return this.$async(async () => {\n try {\n this.state.actionInProgress = true;\n await this.RegistryService.createRegistry(this.model);\n this.Notifications.success('Registry successfully created');\n this.$state.go(this.state.originViewReference, { endpointId: this.EndpointProvider.endpointID() });\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to create registry');\n this.state.actionInProgress = false;\n }\n });\n }\n\n $onInit() {\n this.model = new RegistryCreateFormValues();\n\n const origin = this.$transition$.originalTransition().from();\n if (origin.name && /^[a-z]+\\.registries$/.test(origin.name)) {\n this.state.originViewReference = origin;\n }\n }\n}\n\nexport default CreateRegistryController;\n","import { PortainerEndpointCreationTypes } from 'Portainer/models/endpoint/models';\n\nexport default class WizardViewController {\n /* @ngInject */\n constructor($async, $state, EndpointService, $analytics) {\n this.$async = $async;\n this.$state = $state;\n this.EndpointService = EndpointService;\n this.$analytics = $analytics;\n }\n\n /**\n * WIZARD APPLICATION\n */\n manageLocalEndpoint() {\n this.$state.go('portainer.home');\n }\n\n addRemoteEndpoint() {\n this.$state.go('portainer.wizard.endpoints');\n }\n\n async createLocalKubernetesEndpoint() {\n this.state.endpoint.loading = true;\n try {\n await this.EndpointService.createLocalKubernetesEndpoint();\n this.state.endpoint.loading = false;\n this.state.endpoint.added = true;\n this.state.endpoint.connected = 'kubernetes';\n this.state.local.icon = 'fas fa-dharmachakra';\n } catch (err) {\n this.state.endpoint.kubernetesError = true;\n }\n }\n\n async createLocalDockerEndpoint() {\n try {\n await this.EndpointService.createLocalEndpoint();\n this.state.endpoint.loading = false;\n this.state.endpoint.added = true;\n this.state.endpoint.connected = 'docker';\n this.state.local.icon = 'fab fa-docker';\n } finally {\n this.state.endpoint.loading = false;\n }\n }\n\n $onInit() {\n return this.$async(async () => {\n this.state = {\n local: {\n icon: '',\n },\n remote: {\n icon: 'fa fa-plug',\n },\n endpoint: {\n kubernetesError: false,\n connected: '',\n loading: false,\n added: false,\n },\n };\n\n const endpoints = await this.EndpointService.endpoints();\n if (endpoints.totalCount === '0') {\n await this.createLocalKubernetesEndpoint();\n if (this.state.endpoint.kubernetesError) {\n await this.createLocalDockerEndpoint();\n }\n } else {\n const addedLocalEndpoint = endpoints.value[0];\n if (addedLocalEndpoint.Type === PortainerEndpointCreationTypes.LocalDockerEnvironment) {\n this.state.endpoint.added = true;\n this.state.endpoint.connected = 'docker';\n this.state.local.icon = 'fab fa-docker';\n }\n\n if (addedLocalEndpoint.Type === PortainerEndpointCreationTypes.LocalKubernetesEnvironment) {\n this.state.endpoint.added = true;\n this.state.endpoint.connected = 'kubernetes';\n this.state.local.icon = 'fas fa-dharmachakra';\n }\n }\n });\n }\n}\n","export default class WizardEndpointsController {\n /* @ngInject */\n constructor($async, $scope, $state, EndpointService, $analytics) {\n this.$async = $async;\n this.$scope = $scope;\n this.$state = $state;\n this.EndpointService = EndpointService;\n this.$analytics = $analytics;\n\n this.updateEndpoint = this.updateEndpoint.bind(this);\n this.addAnalytics = this.addAnalytics.bind(this);\n }\n /**\n * WIZARD ENDPOINT SECTION\n */\n\n async updateEndpoint() {\n const updateEndpoints = await this.EndpointService.endpoints();\n this.endpoints = updateEndpoints.value;\n }\n\n startWizard() {\n const options = this.state.options;\n this.state.selections = options.filter((item) => item.selected === true);\n this.state.maxStep = this.state.selections.length;\n\n if (this.state.selections.length !== 0) {\n this.state.section = this.state.selections[this.state.currentStep].endpoint;\n this.state.selections[this.state.currentStep].stage = 'active';\n }\n\n if (this.state.currentStep === this.state.maxStep - 1) {\n this.state.nextStep = 'Finish';\n }\n\n this.$analytics.eventTrack('endpoint-wizard-endpoint-select', {\n category: 'portainer',\n metadata: {\n environment: this.state.analytics.docker + this.state.analytics.kubernetes + this.state.analytics.aci,\n },\n });\n this.state.currentStep++;\n }\n\n previousStep() {\n this.state.section = this.state.selections[this.state.currentStep - 2].endpoint;\n this.state.selections[this.state.currentStep - 2].stage = 'active';\n this.state.selections[this.state.currentStep - 1].stage = '';\n this.state.nextStep = 'Next Step';\n this.state.currentStep--;\n }\n\n async nextStep() {\n if (this.state.currentStep >= this.state.maxStep - 1) {\n this.state.nextStep = 'Finish';\n }\n if (this.state.currentStep === this.state.maxStep) {\n // the Local Endpoint Counter from endpoints array due to including Local Endpoint been added Automatic before Wizard start\n const endpointsAdded = await this.EndpointService.endpoints();\n const endpointsArray = endpointsAdded.value;\n const filter = endpointsArray.filter((item) => item.Type === 1 || item.Type === 5);\n // NOTICE: This is the temporary fix for excluded docker api endpoint been counted as local endpoint\n this.state.counter.localEndpoint = filter.length - this.state.counter.dockerApi;\n\n this.$analytics.eventTrack('endpoint-wizard-environment-add-finish', {\n category: 'portainer',\n metadata: {\n 'docker-agent': this.state.counter.dockerAgent,\n 'docker-api': this.state.counter.dockerApi,\n 'kubernetes-agent': this.state.counter.kubernetesAgent,\n 'aci-api': this.state.counter.aciApi,\n 'local-endpoint': this.state.counter.localEndpoint,\n },\n });\n this.$state.go('portainer.home');\n } else {\n this.state.section = this.state.selections[this.state.currentStep].endpoint;\n this.state.selections[this.state.currentStep].stage = 'active';\n this.state.selections[this.state.currentStep - 1].stage = 'completed';\n this.state.currentStep++;\n }\n }\n\n addAnalytics(endpoint) {\n switch (endpoint) {\n case 'docker-agent':\n this.state.counter.dockerAgent++;\n break;\n case 'docker-api':\n this.state.counter.dockerApi++;\n break;\n case 'kubernetes-agent':\n this.state.counter.kubernetesAgent++;\n break;\n case 'aci-api':\n this.state.counter.aciApi++;\n break;\n }\n }\n\n endpointSelect(endpoint) {\n switch (endpoint) {\n case 'docker':\n if (this.state.options[0].selected) {\n this.state.options[0].selected = false;\n this.state.dockerActive = '';\n this.state.analytics.docker = '';\n } else {\n this.state.options[0].selected = true;\n this.state.dockerActive = 'wizard-active';\n this.state.analytics.docker = 'Docker/';\n }\n break;\n case 'kubernetes':\n if (this.state.options[1].selected) {\n this.state.options[1].selected = false;\n this.state.kubernetesActive = '';\n this.state.analytics.kubernetes = '';\n } else {\n this.state.options[1].selected = true;\n this.state.kubernetesActive = 'wizard-active';\n this.state.analytics.kubernetes = 'Kubernetes/';\n }\n break;\n case 'aci':\n if (this.state.options[2].selected) {\n this.state.options[2].selected = false;\n this.state.aciActive = '';\n this.state.analytics.aci = '';\n } else {\n this.state.options[2].selected = true;\n this.state.aciActive = 'wizard-active';\n this.state.analytics.aci = 'ACI';\n }\n break;\n }\n const options = this.state.options;\n this.state.selections = options.filter((item) => item.selected === true);\n }\n\n $onInit() {\n return this.$async(async () => {\n (this.state = {\n currentStep: 0,\n section: '',\n dockerActive: '',\n kubernetesActive: '',\n aciActive: '',\n maxStep: '',\n previousStep: 'Previous',\n nextStep: 'Next Step',\n selections: [],\n analytics: {\n docker: '',\n kubernetes: '',\n aci: '',\n },\n counter: {\n dockerAgent: 0,\n dockerApi: 0,\n kubernetesAgent: 0,\n aciApi: 0,\n localEndpoint: 0,\n },\n options: [\n {\n endpoint: 'docker',\n selected: false,\n stage: '',\n nameClass: 'docker',\n icon: 'fab fa-docker',\n },\n {\n endpoint: 'kubernetes',\n selected: false,\n stage: '',\n nameClass: 'kubernetes',\n icon: 'fas fa-dharmachakra',\n },\n {\n endpoint: 'aci',\n selected: false,\n stage: '',\n nameClass: 'aci',\n icon: 'fab fa-microsoft',\n },\n ],\n selectOption: '',\n }),\n (this.endpoints = []);\n\n const endpoints = await this.EndpointService.endpoints();\n this.endpoints = endpoints.value;\n });\n }\n}\n","import { buildOption } from '@/portainer/components/box-selector';\n\nexport default class WizardAciController {\n /* @ngInject */\n constructor($async, EndpointService, Notifications, NameValidator) {\n this.$async = $async;\n this.EndpointService = EndpointService;\n this.Notifications = Notifications;\n this.NameValidator = NameValidator;\n }\n\n addAciEndpoint() {\n return this.$async(async () => {\n const { name, azureApplicationId, azureTenantId, azureAuthenticationKey } = this.formValues;\n const groupId = 1;\n const tagIds = [];\n\n try {\n this.state.actionInProgress = true;\n // Check name is duplicated or not\n let nameUsed = await this.NameValidator.validateEnvironmentName(name);\n if (nameUsed) {\n this.Notifications.error('Failure', null, 'This name is been used, please try another one');\n return;\n }\n await this.EndpointService.createAzureEndpoint(name, azureApplicationId, azureTenantId, azureAuthenticationKey, groupId, tagIds);\n this.Notifications.success('Environment connected', name);\n this.clearForm();\n this.onUpdate();\n this.onAnalytics('aci-api');\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to connect your environment');\n } finally {\n this.state.actionInProgress = false;\n }\n });\n }\n\n clearForm() {\n this.formValues = {\n name: '',\n azureApplicationId: '',\n azureTenantId: '',\n azureAuthenticationKey: '',\n };\n }\n\n $onInit() {\n return this.$async(async () => {\n this.state = {\n actionInProgress: false,\n endpointType: 'api',\n availableOptions: [buildOption('API', 'fa fa-bolt', 'API', '', 'api')],\n };\n this.formValues = {\n name: '',\n azureApplicationId: '',\n azureTenantId: '',\n azureAuthenticationKey: '',\n };\n });\n }\n}\n","import { PortainerEndpointCreationTypes } from 'Portainer/models/endpoint/models';\nimport { EndpointSecurityFormData } from 'Portainer/components/endpointSecurity/porEndpointSecurityModel';\nimport { getAgentShortVersion } from 'Portainer/views/endpoints/helpers';\nimport { buildOption } from '@/portainer/components/box-selector';\n\nexport default class WizardDockerController {\n /* @ngInject */\n constructor($async, EndpointService, StateManager, Notifications, clipboard, $filter, NameValidator) {\n this.$async = $async;\n this.EndpointService = EndpointService;\n this.StateManager = StateManager;\n this.Notifications = Notifications;\n this.clipboard = clipboard;\n this.$filter = $filter;\n this.NameValidator = NameValidator;\n }\n\n copyLinuxCommand() {\n this.clipboard.copyText(this.command.linuxCommand);\n $('#linuxCommandNotification').show().fadeOut(2500);\n }\n\n copyWinCommand() {\n this.clipboard.copyText(this.command.winCommand);\n $('#winCommandNotification').show().fadeOut(2500);\n }\n\n copyLinuxSocket() {\n this.clipboard.copyText(this.command.linuxSocket);\n $('#linuxSocketNotification').show().fadeOut(2500);\n }\n\n copyWinSocket() {\n this.clipboard.copyText(this.command.winSocket);\n $('#winSocketNotification').show().fadeOut(2500);\n }\n\n onChangeFile(file) {\n this.formValues.securityFormData = file;\n }\n\n // connect docker environment\n connectEnvironment(type) {\n return this.$async(async () => {\n const name = this.formValues.name;\n const url = this.$filter('stripprotocol')(this.formValues.url);\n const publicUrl = url.split(':')[0];\n const overrideUrl = this.formValues.socketPath;\n const groupId = this.formValues.groupId;\n const tagIds = this.formValues.tagIds;\n const securityData = this.formValues.securityFormData;\n const socketUrl = this.formValues.overrideSocket ? overrideUrl : url;\n\n var creationType = null;\n\n if (type === 'agent') {\n creationType = PortainerEndpointCreationTypes.AgentEnvironment;\n }\n\n if (type === 'api') {\n creationType = PortainerEndpointCreationTypes.LocalDockerEnvironment;\n }\n\n // Check name is duplicated or not\n const nameUsed = await this.NameValidator.validateEnvironmentName(name);\n if (nameUsed) {\n this.Notifications.error('Failure', null, 'This name is been used, please try another one');\n return;\n }\n switch (type) {\n case 'agent':\n await this.addDockerAgentEndpoint(name, creationType, url, publicUrl, groupId, tagIds);\n break;\n case 'api':\n await this.addDockerApiEndpoint(name, creationType, url, publicUrl, groupId, tagIds, securityData);\n break;\n case 'socket':\n await this.addDockerLocalEndpoint(name, socketUrl, publicUrl, groupId, tagIds);\n break;\n }\n });\n }\n\n // Docker Agent Endpoint\n async addDockerAgentEndpoint(name, creationType, url, publicUrl, groupId, tagIds) {\n const tsl = true;\n const tlsSkipVerify = true;\n const tlsSkipClientVerify = true;\n const tlsCaFile = null;\n const tlsCertFile = null;\n const tlsKeyFile = null;\n\n await this.addRemoteEndpoint(name, creationType, url, publicUrl, groupId, tagIds, tsl, tlsSkipVerify, tlsSkipClientVerify, tlsCaFile, tlsCertFile, tlsKeyFile);\n }\n\n // Docker Api Endpoint\n async addDockerApiEndpoint(name, creationType, url, publicUrl, groupId, tagIds, securityData) {\n const tsl = this.formValues.tls;\n const tlsSkipVerify = this.formValues.skipCertification;\n const tlsSkipClientVerify = this.formValues.skipCertification;\n const tlsCaFile = tlsSkipVerify ? null : securityData.TLSCACert;\n const tlsCertFile = tlsSkipClientVerify ? null : securityData.TLSCert;\n const tlsKeyFile = tlsSkipClientVerify ? null : securityData.TLSKey;\n\n await this.addRemoteEndpoint(name, creationType, url, publicUrl, groupId, tagIds, tsl, tlsSkipVerify, tlsSkipClientVerify, tlsCaFile, tlsCertFile, tlsKeyFile);\n }\n\n async addDockerLocalEndpoint(name, url, publicUrl, groupId, tagIds) {\n this.state.actionInProgress = true;\n try {\n await this.EndpointService.createLocalEndpoint(name, url, publicUrl, groupId, tagIds);\n this.Notifications.success('Environment connected', name);\n this.clearForm();\n this.onUpdate();\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to connect your environment');\n } finally {\n this.state.actionInProgress = false;\n }\n }\n\n async addRemoteEndpoint(name, creationType, url, publicURL, groupId, tagIds, TLS, tlsSkipVerify, tlsSkipClientVerify, tlsCaFile, tlsCertFile, tlsKeyFile) {\n this.state.actionInProgress = true;\n try {\n await this.EndpointService.createRemoteEndpoint(\n name,\n creationType,\n url,\n publicURL,\n groupId,\n tagIds,\n TLS,\n tlsSkipVerify,\n tlsSkipClientVerify,\n tlsCaFile,\n tlsCertFile,\n tlsKeyFile\n );\n this.Notifications.success('Environment connected', name);\n this.clearForm();\n this.onUpdate();\n\n if (creationType === PortainerEndpointCreationTypes.AgentEnvironment) {\n this.onAnalytics('docker-agent');\n }\n\n if (creationType === PortainerEndpointCreationTypes.LocalDockerEnvironment) {\n this.onAnalytics('docker-api');\n }\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to connect your environment');\n } finally {\n this.state.actionInProgress = false;\n }\n }\n\n clearForm() {\n this.formValues = {\n name: '',\n url: '',\n publicURL: '',\n groupId: 1,\n tagIds: [],\n environmentUrl: '',\n dockerApiurl: '',\n socketPath: '',\n overrodeSocket: false,\n skipCertification: false,\n tls: false,\n securityFormData: new EndpointSecurityFormData(),\n };\n }\n\n $onInit() {\n return this.$async(async () => {\n this.state = {\n endpointType: 'agent',\n ConnectSocket: false,\n actionInProgress: false,\n endpoints: [],\n availableOptions: [\n buildOption('Agent', 'fa fa-bolt', 'Agent', '', 'agent'),\n buildOption('API', 'fa fa-cloud', 'API', '', 'api'),\n buildOption('Socket', 'fab fa-docker', 'Socket', '', 'socket'),\n ],\n };\n\n this.formValues = {\n name: '',\n url: '',\n publicURL: '',\n groupId: 1,\n tagIds: [],\n environmentUrl: '',\n dockerApiurl: '',\n socketPath: '',\n overrideSocket: false,\n skipCertification: false,\n tls: false,\n securityFormData: new EndpointSecurityFormData(),\n };\n\n const agentVersion = this.StateManager.getState().application.version;\n const agentShortVersion = getAgentShortVersion(agentVersion);\n\n this.command = {\n linuxCommand: `curl -L https://downloads.portainer.io/agent-stack-ce${agentShortVersion}.yml -o agent-stack.yml && docker stack deploy --compose-file=agent-stack.yml portainer-agent `,\n winCommand: `curl -L https://downloads.portainer.io/agent-stack-ce${agentShortVersion}-windows.yml -o agent-stack-windows.yml && docker stack deploy --compose-file=agent-stack-windows.yml portainer-agent `,\n linuxSocket: `-v \"/var/run/docker.sock:/var/run/docker.sock\" `,\n winSocket: `-v \\.\\pipe\\docker_engine:\\.\\pipe\\docker_engine `,\n };\n });\n }\n}\n","import { PortainerEndpointCreationTypes } from 'Portainer/models/endpoint/models';\n//import { getAgentShortVersion } from 'Portainer/views/endpoints/helpers';\nimport { buildOption } from '@/portainer/components/box-selector';\nimport { getAgentShortVersion } from 'Portainer/views/endpoints/helpers';\n\nexport default class WizardKubernetesController {\n /* @ngInject */\n constructor($async, EndpointService, StateManager, Notifications, $filter, clipboard, NameValidator) {\n this.$async = $async;\n this.EndpointService = EndpointService;\n this.StateManager = StateManager;\n this.Notifications = Notifications;\n this.$filter = $filter;\n this.clipboard = clipboard;\n this.NameValidator = NameValidator;\n }\n\n addKubernetesAgent() {\n return this.$async(async () => {\n const name = this.state.formValues.name;\n const groupId = 1;\n const tagIds = [];\n const url = this.$filter('stripprotocol')(this.state.formValues.url);\n const publicUrl = url.split(':')[0];\n const creationType = PortainerEndpointCreationTypes.AgentEnvironment;\n const tls = true;\n const tlsSkipVerify = true;\n const tlsSkipClientVerify = true;\n const tlsCaFile = null;\n const tlsCertFile = null;\n const tlsKeyFile = null;\n\n // Check name is duplicated or not\n let nameUsed = await this.NameValidator.validateEnvironmentName(name);\n if (nameUsed) {\n this.Notifications.error('Failure', null, 'This name is been used, please try another one');\n return;\n }\n await this.addRemoteEndpoint(name, creationType, url, publicUrl, groupId, tagIds, tls, tlsSkipVerify, tlsSkipClientVerify, tlsCaFile, tlsCertFile, tlsKeyFile);\n });\n }\n\n async addRemoteEndpoint(name, creationType, url, publicURL, groupId, tagIds, tls, tlsSkipVerify, tlsSkipClientVerify, tlsCaFile, tlsCertFile, tlsKeyFile) {\n this.state.actionInProgress = true;\n try {\n await this.EndpointService.createRemoteEndpoint(\n name,\n creationType,\n url,\n publicURL,\n groupId,\n tagIds,\n tls,\n tlsSkipVerify,\n tlsSkipClientVerify,\n tlsCaFile,\n tlsCertFile,\n tlsKeyFile\n );\n this.Notifications.success('Environment connected', name);\n this.clearForm();\n this.onUpdate();\n this.onAnalytics('kubernetes-agent');\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to conect your environment');\n } finally {\n this.state.actionInProgress = false;\n }\n }\n\n copyLoadBalancer() {\n this.clipboard.copyText(this.command.loadBalancer);\n $('#loadBalancerNotification').show().fadeOut(2500);\n }\n\n copyNodePort() {\n this.clipboard.copyText(this.command.nodePort);\n $('#nodePortNotification').show().fadeOut(2500);\n }\n\n clearForm() {\n this.state.formValues = {\n name: '',\n url: '',\n };\n }\n\n $onInit() {\n return this.$async(async () => {\n this.state = {\n endpointType: 'agent',\n actionInProgress: false,\n formValues: {\n name: '',\n url: '',\n },\n availableOptions: [buildOption('Agent', 'fa fa-bolt', 'Agent', '', 'agent')],\n };\n\n const agentVersion = this.StateManager.getState().application.version;\n const agentShortVersion = getAgentShortVersion(agentVersion);\n\n this.command = {\n loadBalancer: `curl -L https://downloads.portainer.io/portainer-agent-ce${agentShortVersion}-k8s-lb.yaml -o portainer-agent-k8s.yaml; kubectl apply -f portainer-agent-k8s.yaml `,\n nodePort: `curl -L https://downloads.portainer.io/portainer-agent-ce${agentShortVersion}-k8s-nodeport.yaml -o portainer-agent-k8s.yaml; kubectl apply -f portainer-agent-k8s.yaml `,\n };\n });\n }\n}\n","import { UIRouterContextComponent } from '@uirouter/react-hybrid';\nimport { PropsWithChildren, StrictMode } from 'react';\n\nexport function RootProvider({ children }: PropsWithChildren<unknown>) {\n return (\n <StrictMode>\n <UIRouterContextComponent>{children}</UIRouterContextComponent>\n </StrictMode>\n );\n}\n","import ReactDOM from 'react-dom';\nimport { IComponentOptions, IController } from 'angular';\n\nimport { RootProvider } from './RootProvider';\n\nfunction toProps(\n propNames: string[],\n controller: IController,\n $q: ng.IQService\n) {\n return Object.fromEntries(\n propNames.map((key) => {\n const prop = controller[key];\n if (typeof prop !== 'function') {\n return [key, prop];\n }\n\n return [\n key,\n (...args: unknown[]) =>\n $q((resolve) => resolve(controller[key](...args))),\n ];\n })\n );\n}\n\nexport function react2angular<T>(\n Component: React.ComponentType<T>,\n propNames: string[]\n): IComponentOptions {\n const bindings = Object.fromEntries(propNames.map((key) => [key, '<']));\n\n return {\n bindings,\n controller: Controller,\n };\n\n /* @ngInject */\n function Controller(\n this: IController,\n $element: HTMLElement[],\n $q: ng.IQService\n ) {\n const el = $element[0];\n this.$onChanges = () => {\n const props = toProps(propNames, this, $q);\n ReactDOM.render(\n <RootProvider>\n {/* eslint-disable-next-line react/jsx-props-no-spreading */}\n <Component {...(props as T)} />\n </RootProvider>,\n el\n );\n };\n this.$onDestroy = () => ReactDOM.unmountComponentAtNode(el);\n }\n}\n\nexport const r2a = react2angular;\n","import { react2angular } from '@/react-tools/react2angular';\n\nexport function Loading() {\n return (\n <div className=\"loading\">\n <div className=\"double-bounce1\" />\n <div className=\"double-bounce2\" />\n </div>\n );\n}\n\nexport const LoadingAngular = react2angular(Loading, []);\n","import { createContext, PropsWithChildren, useContext } from 'react';\n\nconst Context = createContext<null | boolean>(null);\n\nexport function useWidgetContext() {\n const context = useContext(Context);\n\n if (context == null) {\n throw new Error('Should be inside a Widget component');\n }\n}\n\nexport const rdWidget = {\n transclude: true,\n template: `<div class=\"widget\" ng-transclude></div>`,\n};\n\nexport function Widget({ children }: PropsWithChildren<unknown>) {\n return (\n <Context.Provider value>\n <div className=\"widget\">{children}</div>\n </Context.Provider>\n );\n}\n","import clsx from 'clsx';\nimport { PropsWithChildren } from 'react';\n\nimport { useWidgetContext } from './Widget';\nimport { Loading } from './Loading';\n\nexport const rdWidgetBody = {\n requires: '^rdWidget',\n bindings: {\n loading: '@?',\n classes: '@?',\n },\n transclude: true,\n template: `\n <div class=\"widget-body\" ng-class=\"$ctrl.classes\">\n <rd-loading ng-show=\"$ctrl.loading\"></rd-loading>\n <div ng-hide=\"$ctrl.loading\" class=\"widget-content\" ng-transclude></div>\n </div>\n `,\n};\n\ninterface Props {\n loading?: boolean;\n className?: string;\n}\n\nexport function WidgetBody({\n loading,\n className,\n children,\n}: PropsWithChildren<Props>) {\n useWidgetContext();\n\n return (\n <div className={clsx(className, 'widget-body')}>\n {loading ? <Loading /> : <div className=\"widget-content\">{children}</div>}\n </div>\n );\n}\n","import angular from 'angular';\n\nimport { LoadingAngular } from './Loading';\nimport { rdWidget, Widget } from './Widget';\nimport { rdWidgetBody, WidgetBody } from './WidgetBody';\nimport { rdWidgetCustomHeader } from './WidgetCustomHeader';\nimport { rdWidgetFooter, WidgetFooter } from './WidgetFooter';\nimport { rdWidgetTitle, WidgetTitle } from './WidgetTitle';\nimport { rdWidgetTaskbar, WidgetTaskbar } from './WidgetTaskbar';\n\nexport { Widget, WidgetBody, WidgetFooter, WidgetTitle, WidgetTaskbar };\n\nexport default angular\n .module('portainer.shared.components.widget', [])\n .component('rdLoading', LoadingAngular)\n .component('rdWidget', rdWidget)\n .component('rdWidgetBody', rdWidgetBody)\n .component('rdWidgetCustomHeader', rdWidgetCustomHeader)\n .component('rdWidgetFooter', rdWidgetFooter)\n .component('rdWidgetHeader', rdWidgetTitle)\n .component('rdWidgetTaskbar', rdWidgetTaskbar).name;\n","export const rdWidgetCustomHeader = {\n requires: '^rdWidget',\n bindings: {\n titleText: '=',\n icon: '=',\n },\n transclude: true,\n template: `\n <div class=\"widget-header\">\n <div class=\"row\">\n <span class=\"pull-left\">\n <img class=\"custom-header-ico space-right\" ng-src=\"{{$ctrl.icon}}\" ng-if=\"$ctrl.icon\" alt=\"header-icon\"></img>\n <i class=\"fa fa-rocket\" aria-hidden=\"true\" ng-if=\"!$ctrl.icon\"></i>\n <span class=\"text-muted\"> {{$ctrl.titleText}} </span>\n </span>\n <span class=\"pull-right col-xs-6 col-sm-4\" ng-transclude></span>\n </div>\n </div>\n `,\n};\n\n// a react component wasn't created because WidgetTitle were adjusted to support a custom image\n","import { PropsWithChildren } from 'react';\n\nimport { useWidgetContext } from './Widget';\n\nexport const rdWidgetFooter = {\n requires: '^rdWidget',\n transclude: true,\n template: `\n <div class=\"widget-footer\" ng-transclude></div>\n `,\n};\n\nexport function WidgetFooter({ children }: PropsWithChildren<unknown>) {\n useWidgetContext();\n\n return <div className=\"widget-footer\">{children}</div>;\n}\n","import clsx from 'clsx';\nimport { PropsWithChildren, ReactNode } from 'react';\n\nimport { useWidgetContext } from './Widget';\n\nexport const rdWidgetTitle = {\n requires: '^rdWidget',\n bindings: {\n titleText: '@',\n icon: '@',\n classes: '@?',\n },\n transclude: {\n title: '?headerTitle',\n },\n template: `\n <div class=\"widget-header\">\n <div class=\"row\">\n <span ng-class=\"$ctrl.classes\" class=\"pull-left\">\n <i class=\"fa\" ng-class=\"$ctrl.icon\"></i>\n <span ng-transclude=\"title\">{{ $ctrl.titleText }}</span>\n </span>\n <span ng-class=\"$ctrl.classes\" class=\"pull-right\" ng-transclude></span>\n </div>\n </div>\n`,\n};\n\ninterface Props {\n title: ReactNode;\n icon: ReactNode;\n className?: string;\n}\n\nexport function WidgetTitle({\n title,\n icon,\n className,\n children,\n}: PropsWithChildren<Props>) {\n useWidgetContext();\n\n return (\n <div className=\"widget-header\">\n <div className=\"row\">\n <span className={clsx('pull-left', className)}>\n {typeof icon === 'string' ? <i className={clsx('fa', icon)} /> : icon}\n {title}\n </span>\n <span className={clsx('pull-right', className)}>{children}</span>\n </div>\n </div>\n );\n}\n","import { PropsWithChildren } from 'react';\n\nimport { useWidgetContext } from './Widget';\n\nexport const rdWidgetTaskbar = {\n requires: '^rdWidget',\n bindings: {\n classes: '@?',\n },\n transclude: true,\n template: `\n <div class=\"widget-header\">\n <div class=\"row\">\n <div ng-class=\"$ctrl.classes\" ng-transclude></div>\n </div>\n </div>\n `,\n};\n\ninterface Props {\n className?: string;\n}\n\nexport function WidgetTaskbar({\n children,\n className,\n}: PropsWithChildren<Props>) {\n useWidgetContext();\n\n return (\n <div className=\"widget-header\">\n <div className=\"row\">\n <div className={className}>{children}</div>\n </div>\n </div>\n );\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"tooltipWrapper\":\"app-portainer-components-Tip-Tooltip-Tooltip-module__tooltip-wrapper\",\"tooltip\":\"app-portainer-components-Tip-Tooltip-Tooltip-module__tooltip\",\"icon\":\"app-portainer-components-Tip-Tooltip-Tooltip-module__icon\"};","import ReactTooltip from 'react-tooltip';\nimport clsx from 'clsx';\n\nimport styles from './Tooltip.module.css';\n\ntype Place = 'top' | 'right' | 'bottom' | 'left';\n\nexport interface Props {\n position?: Place;\n message: string;\n}\n\nexport function Tooltip({ message, position = 'bottom' }: Props) {\n return (\n <span className=\"interactive\">\n <i\n className={clsx('fa fa-question-circle blue-icon', styles.icon)}\n aria-hidden=\"true\"\n data-tip={message}\n />\n <ReactTooltip\n multiline\n type=\"info\"\n place={position}\n effect=\"solid\"\n className={styles.tooltip}\n arrowColor=\"transparent\"\n />\n </span>\n );\n}\n","import { IComponentOptions } from 'angular';\nimport './Tooltip.css';\n\nexport const TooltipAngular: IComponentOptions = {\n bindings: {\n message: '@',\n position: '@',\n },\n template: `<span\n class=\"interactive\"\n tooltip-append-to-body=\"true\"\n tooltip-placement=\"{{$ctrl.position}}\"\n tooltip-class=\"portainer-tooltip\"\n uib-tooltip=\"{{$ctrl.message}}\"\n >\n <i\n class=\"fa fa-question-circle blue-icon tooltip-icon\"\n aria-hidden=\"true\"\n ></i>\n </span>`,\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"container\":\"app-portainer-components-form-components-FormControl-FormControl-module__container\",\"spaceRight\":\"app-portainer-components-form-components-FormControl-FormControl-module__space-right\"};","import { PropsWithChildren, ReactNode } from 'react';\nimport clsx from 'clsx';\n\nimport { Tooltip } from '@/portainer/components/Tip/Tooltip';\n\nimport styles from './FormControl.module.css';\n\nexport interface Props {\n inputId: string;\n label: string | ReactNode;\n tooltip?: string;\n children: ReactNode;\n errors?: string | ReactNode;\n}\n\nexport function FormControl({\n inputId,\n label,\n tooltip = '',\n children,\n errors,\n}: PropsWithChildren<Props>) {\n return (\n <div>\n <div className={clsx('form-group', styles.container)}>\n <label\n htmlFor={inputId}\n className=\"col-sm-3 col-lg-2 control-label text-left\"\n >\n {label}\n {tooltip && <Tooltip message={tooltip} />}\n </label>\n\n <div className=\"col-sm-9 col-lg-10\">{children}</div>\n </div>\n\n {errors && (\n <div className=\"form-group col-md-12\">\n <div className=\"small text-warning\">\n <i\n className=\"fa fa-exclamation-triangle space-right\"\n aria-hidden=\"true\"\n />\n {errors}\n </div>\n </div>\n )}\n </div>\n );\n}\n","import clsx from 'clsx';\nimport { HTMLInputTypeAttribute } from 'react';\n\nimport { InputProps } from './types';\n\ninterface Props extends InputProps {\n type?: HTMLInputTypeAttribute;\n onChange(value: string): void;\n value: number | string;\n component?: 'input' | 'textarea';\n rows?: number;\n readonly?: boolean;\n}\n\nexport function BaseInput({\n component = 'input',\n value,\n disabled,\n id,\n readonly,\n required,\n type,\n className,\n rows,\n onChange,\n}: Props) {\n const Component = component;\n return (\n <Component\n value={value}\n disabled={disabled}\n id={id}\n readOnly={readonly}\n required={required}\n type={type}\n className={clsx('form-control', className)}\n onChange={(e) => onChange(e.target.value)}\n rows={rows}\n />\n );\n}\n","import { HTMLInputTypeAttribute } from 'react';\n\nimport { BaseInput } from './BaseInput';\nimport { ChangeProps, InputProps } from './types';\n\ninterface TextInputProps extends InputProps, ChangeProps<string> {\n type?: HTMLInputTypeAttribute;\n readonly?: boolean;\n}\n\nexport function TextInput({\n id,\n type = 'text',\n value,\n className,\n onChange,\n disabled,\n readonly,\n required,\n placeholder,\n}: TextInputProps) {\n return (\n <BaseInput\n id={id}\n type={type}\n className={className}\n value={value}\n onChange={onChange}\n disabled={disabled}\n readonly={readonly}\n required={required}\n placeholder={placeholder}\n />\n );\n}\n","import { PropsWithChildren } from 'react';\nimport clsx from 'clsx';\n\ntype Type = 'submit' | 'reset' | 'button';\ntype Color = 'default' | 'primary' | 'success' | 'warning' | 'danger' | 'link';\ntype Size = 'xsmall' | 'small' | 'medium' | 'large';\nexport interface Props {\n type?: Type;\n color?: Color;\n size?: Size;\n disabled?: boolean;\n title?: string;\n className?: string;\n onClick: () => void;\n}\n\nexport function Button({\n type = 'button',\n color = 'primary',\n size = 'small',\n disabled = false,\n className,\n onClick,\n title,\n children,\n}: PropsWithChildren<Props>) {\n return (\n <button\n /* eslint-disable-next-line react/button-has-type */\n type={type}\n disabled={disabled}\n className={clsx('btn', `btn-${color}`, sizeClass(size), className)}\n onClick={onClick}\n title={title}\n >\n {children}\n </button>\n );\n}\n\nfunction sizeClass(size?: Size) {\n switch (size) {\n case 'large':\n return 'btn-lg';\n case 'medium':\n return 'btn-md';\n case 'xsmall':\n return 'btn-xs';\n default:\n return 'btn-sm';\n }\n}\n","import { PropsWithChildren } from 'react';\n\nexport function FormSectionTitle({ children }: PropsWithChildren<unknown>) {\n return <div className=\"col-sm-12 form-section-title\">{children}</div>;\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"textMargin\":\"app-portainer-components-Tip-TextTip-TextTip-module__text-margin\"};","import { PropsWithChildren } from 'react';\nimport clsx from 'clsx';\n\nimport styles from './TextTip.module.css';\n\nexport function TextTip({ children }: PropsWithChildren<unknown>) {\n return (\n <p className=\"text-muted small\">\n <i\n aria-hidden=\"true\"\n className={clsx(\n 'fa fa-exclamation-circle',\n 'orange-icon',\n styles.textMargin\n )}\n />\n {children}\n </p>\n );\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"code\":\"app-portainer-components-Code-Code-module__code\"};","import { PropsWithChildren } from 'react';\n\nimport styles from './Code.module.css';\n\nexport function Code({ children }: PropsWithChildren<unknown>) {\n return <code className={styles.code}>{children}</code>;\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"fadeout\":\"app-portainer-components-Button-CopyButton-CopyButton-module__fadeout\",\"fadeOut\":\"app-portainer-components-Button-CopyButton-CopyButton-module__fadeOut\",\"container\":\"app-portainer-components-Button-CopyButton-CopyButton-module__container\",\"displayText\":\"app-portainer-components-Button-CopyButton-CopyButton-module__display-text\"};","import { PropsWithChildren, useState, useEffect } from 'react';\nimport clsx from 'clsx';\n\nimport { Button } from '../Button';\n\nimport styles from './CopyButton.module.css';\n\nexport interface Props {\n copyText: string;\n fadeDelay?: number;\n displayText?: string;\n className?: string;\n}\n\nexport function CopyButton({\n copyText,\n fadeDelay = 1000,\n displayText = 'copied',\n className,\n children,\n}: PropsWithChildren<Props>) {\n const [isFading, setIsFading] = useState(false);\n\n useEffect(() => {\n const fadeoutTime = setTimeout(() => setIsFading(false), fadeDelay);\n // clear timeout when component unmounts\n return () => {\n clearTimeout(fadeoutTime);\n };\n }, [isFading, fadeDelay]);\n\n function onClick() {\n // https://developer.mozilla.org/en-US/docs/Web/API/Clipboard\n // https://caniuse.com/?search=clipboard\n if (navigator.clipboard) {\n navigator.clipboard.writeText(copyText);\n } else {\n // https://stackoverflow.com/a/57192718\n const inputEl = document.createElement('input');\n inputEl.value = copyText;\n inputEl.type = 'text';\n document.body.appendChild(inputEl);\n inputEl.select();\n document.execCommand('copy');\n inputEl.type = 'hidden';\n document.body.removeChild(inputEl);\n }\n setIsFading(true);\n }\n\n return (\n <div className={styles.container}>\n <Button\n className={className}\n size=\"small\"\n onClick={onClick}\n title=\"Copy Value\"\n type=\"button\"\n >\n <i className=\"fa fa-copy space-right\" aria-hidden=\"true\" /> {children}\n </Button>\n\n <span className={clsx(isFading && styles.fadeout, styles.displayText)}>\n <i className=\"fa fa-check\" aria-hidden=\"true\" /> {displayText}\n </span>\n </div>\n );\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"addButton\":\"app-portainer-views-account-CreateAccessToken-CreateAccessToken-module__add-button\",\"copyButton\":\"app-portainer-views-account-CreateAccessToken-CreateAccessToken-module__copy-button\"};","import { react2angular } from '@/react-tools/react2angular';\n\nimport { CreateAccessToken } from './CreateAccessToken';\n\nconst CreateAccessTokenAngular = react2angular(CreateAccessToken, ['userId', 'onSubmit', 'onSuccess', 'onError']);\nexport { CreateAccessToken, CreateAccessTokenAngular };\n","import { PropsWithChildren, useEffect, useState } from 'react';\nimport { useRouter } from '@uirouter/react';\n\nimport { Widget, WidgetBody } from '@/portainer/components/widget';\nimport { FormControl } from '@/portainer/components/form-components/FormControl';\nimport { TextInput } from '@/portainer/components/form-components/Input';\nimport { Button } from '@/portainer/components/Button';\nimport { FormSectionTitle } from '@/portainer/components/form-components/FormSectionTitle';\nimport { TextTip } from '@/portainer/components/Tip/TextTip';\nimport { Code } from '@/portainer/components/Code';\nimport { CopyButton } from '@/portainer/components/Button/CopyButton';\n\nimport styles from './CreateAccessToken.module.css';\n\ninterface AccessTokenResponse {\n rawAPIKey: string;\n}\n\nexport interface Props {\n // userId for whom the access token is generated for\n userId: number;\n\n // onSubmit dispatches a successful matomo analytics event\n onSubmit: (description: string) => Promise<AccessTokenResponse>;\n\n // onError is called when an error occurs; this is a callback to Notifications.error\n onError: (heading: string, err: unknown, message: string) => void;\n}\n\nexport function CreateAccessToken({\n onSubmit,\n onError,\n}: PropsWithChildren<Props>) {\n const router = useRouter();\n const [description, setDescription] = useState('');\n const [errorText, setErrorText] = useState('');\n const [isLoading, setIsLoading] = useState(false);\n const [accessToken, setAccessToken] = useState('');\n\n useEffect(() => {\n if (description.length === 0) {\n setErrorText('this field is required');\n } else setErrorText('');\n }, [description]);\n\n async function generateAccessToken() {\n if (isLoading) {\n return;\n }\n\n setIsLoading(true);\n try {\n const response = await onSubmit(description);\n setAccessToken(response.rawAPIKey);\n } catch (err) {\n onError('Failure', err, 'Failed to generate access token');\n } finally {\n setIsLoading(false);\n }\n }\n\n return (\n <Widget>\n <WidgetBody>\n <div>\n <FormControl inputId=\"input\" label=\"Description\" errors={errorText}>\n <TextInput\n id=\"input\"\n onChange={(value) => setDescription(value)}\n type=\"text\"\n value={description}\n />\n </FormControl>\n <Button\n disabled={!!errorText || !!accessToken}\n onClick={generateAccessToken}\n className={styles.addButton}\n >\n Add access token\n </Button>\n </div>\n {accessToken && (\n <>\n <FormSectionTitle>New access token</FormSectionTitle>\n <TextTip>\n Please copy the new access token. You won't be able to view\n the token again.\n </TextTip>\n <Code>{accessToken}</Code>\n <CopyButton\n copyText={accessToken}\n className={styles.copyButton}\n displayText=\"\"\n >\n Copy access token\n </CopyButton>\n <hr />\n <Button\n type=\"button\"\n onClick={() => router.stateService.go('portainer.account')}\n >\n Done\n </Button>\n </>\n )}\n </WidgetBody>\n </Widget>\n );\n}\n","import { ReactNode } from 'react';\nimport { UISref, UISrefProps } from '@uirouter/react';\n\nexport function Link({\n children,\n ...props\n}: { children: ReactNode } & UISrefProps) {\n return (\n // eslint-disable-next-line react/jsx-props-no-spreading\n <UISref {...props}>\n {/* eslint-disable-next-line jsx-a11y/anchor-is-valid */}\n <a>{children}</a>\n </UISref>\n );\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"redBg\":\"app-portainer-components-ReactExample-module__red-bg\"};","import { useSref } from '@uirouter/react';\n\nimport { react2angular } from '@/react-tools/react2angular';\n\nimport { Link } from './Link';\nimport styles from './ReactExample.module.css';\n\nexport interface ReactExampleProps {\n /**\n * Example text to displayed in the component.\n */\n text: string;\n}\n\nexport function ReactExample({ text }: ReactExampleProps) {\n const route = 'portainer.registries';\n const { onClick, href } = useSref(route);\n\n return (\n <div className={styles.redBg}>\n {text}\n <div>\n <a href={href} onClick={onClick}>\n Registries useSref\n </a>\n </div>\n <div>\n <Link to={route}>Registries Link</Link>\n </div>\n </div>\n );\n}\n\nexport const ReactExampleAngular = react2angular(ReactExample, ['text']);\n","import angular from 'angular';\n\nimport { CreateAccessTokenAngular } from '../views/account/CreateAccessToken';\n\nimport sidebarModule from './sidebar';\nimport gitFormModule from './forms/git-form';\nimport porAccessManagementModule from './accessManagement';\nimport formComponentsModule from './form-components';\nimport widgetModule from './widget';\n\nimport { ReactExampleAngular } from './ReactExample';\nimport { TooltipAngular } from './Tip/Tooltip';\n\nexport default angular\n .module('portainer.app.components', [widgetModule, sidebarModule, gitFormModule, porAccessManagementModule, formComponentsModule])\n .component('portainerTooltip', TooltipAngular)\n .component('reactExample', ReactExampleAngular)\n .component('createAccessToken', CreateAccessTokenAngular).name;\n","const autoNgTemplateLoaderTemplate1 = require('./roles-datatable.html');\n\nimport controller from './roles-datatable.controller';\nimport './roles-datatable.css';\n\nexport const rolesDatatable = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n },\n};\n","import angular from 'angular';\nimport './sidebar.css';\n\nimport { sidebarMenu } from './sidebar-menu';\nimport { sidebarSection } from './sidebar-section';\nimport { sidebarMenuItem } from './sidebar-menu-item';\n\nexport default angular\n .module('portainer.app.components.sidebar', [])\n .component('sidebarMenu', sidebarMenu)\n .component('sidebarMenuItem', sidebarMenuItem)\n .component('sidebarSection', sidebarSection).name;\n","const autoNgTemplateLoaderTemplate1 = require('./sidebar-menu.html');\n\nimport './sidebar-menu.css';\n\nimport controller from './sidebar-menu.controller.js';\n\nexport const sidebarMenu = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n iconClass: '@',\n path: '@', // string\n pathParams: '<', //object, corresponds to https://ui-router.github.io/ng1/docs/latest/modules/directives.html#uistatedirective\n childrenPaths: '<', // []string (globs)\n label: '@', // string\n isSidebarOpen: '<',\n currentState: '@',\n },\n transclude: true,\n};\n","const autoNgTemplateLoaderTemplate1 = require('./sidebar-menu-item.html');\n\nimport './sidebar-menu-item.css';\n\nexport const sidebarMenuItem = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n path: '@',\n pathParams: '<',\n iconClass: '@',\n className: '@',\n },\n transclude: true,\n};\n","const autoNgTemplateLoaderTemplate1 = require('./git-form-auth-fieldset.html');\n\nimport controller from './git-form-auth-fieldset.controller.js';\nimport './git-form-auth-fieldset.css';\n\nexport const gitFormAuthFieldset = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n model: '<',\n onChange: '<',\n showAuthExplanation: '<',\n isEdit: '<',\n },\n};\n","const autoNgTemplateLoaderTemplate1 = require('./ldap-settings-custom.html');\n\nimport './ldap-settings-custom.css';\nimport controller from './ldap-settings-custom.controller';\n\nexport const ldapSettingsCustom = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n settings: '=',\n tlscaCert: '=',\n state: '=',\n onTlscaCertChange: '<',\n connectivityCheck: '<',\n onSearchUsersClick: '<',\n onSearchGroupsClick: '<',\n onSaveSettings: '<',\n saveButtonState: '<',\n saveButtonDisabled: '<',\n },\n};\n","const autoNgTemplateLoaderTemplate1 = require('./ldap-custom-admin-group.html');\n\nimport './ldap-custom-admin-group.css';\nimport controller from './ldap-custom-admin-group.controller';\n\nexport const ldapCustomAdminGroup = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n settings: '=',\n selectedAdminGroups: '=',\n defaultAdminGroupSearchFilter: '<',\n onSearchClick: '<',\n limitedFeatureId: '<',\n isLimitedFeatureSelfContained: '<',\n },\n};\n","const autoNgTemplateLoaderTemplate1 = require('./ldap-settings-test-login.html');\n\nimport './ldap-settings-test-login.css';\nimport controller from './ldap-settings-test-login.controller';\n\nexport const ldapSettingsTestLogin = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n settings: '=',\n limitedFeatureId: '<',\n showBeIndicatorIfNeeded: '<',\n isLimitedFeatureSelfContained: '<',\n },\n};\n","import angular from 'angular';\n\nimport { limitedFeatureDirective } from './limited-feature.directive';\nimport { featureService } from './feature-flags.service';\nimport './feature-flags.css';\n\nexport default angular.module('portainer.feature-flags', []).directive('limitedFeatureDir', limitedFeatureDirective).factory('featureService', featureService).name;\n","const autoNgTemplateLoaderTemplate1 = require('./activity-logs-datatable.html');\n\nimport './activity-logs-datatable.css';\n\nimport controller from './activity-logs-datatable.controller.js';\n\nexport const activityLogsDatatable = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n logs: '<',\n keyword: '<',\n sort: '<',\n limit: '<',\n totalItems: '<',\n currentPage: '<',\n feature: '@',\n\n onChangeContextFilter: '<',\n onChangeKeyword: '<',\n onChangeSort: '<',\n\n onChangeLimit: '<',\n onChangePage: '<',\n },\n};\n","import './assets/css';\nimport '@babel/polyfill';\n\nimport angular from 'angular';\nimport { UI_ROUTER_REACT_HYBRID } from '@uirouter/react-hybrid';\n\nimport './matomo-setup';\nimport analyticsModule from './angulartics.matomo';\n\nimport './agent';\nimport './azure/_module';\nimport './docker/__module';\nimport './edge/__module';\nimport './portainer/__module';\n\nangular.module('portainer', [\n 'ui.bootstrap',\n 'ui.router',\n UI_ROUTER_REACT_HYBRID,\n 'ui.select',\n 'isteven-multi-select',\n 'ngSanitize',\n 'ngFileUpload',\n 'ngMessages',\n 'ngResource',\n 'angularUtils.directives.dirPagination',\n 'LocalStorageModule',\n 'angular-jwt',\n 'angular-json-tree',\n 'angular-loading-bar',\n 'angular-clipboard',\n 'ngFileSaver',\n 'luegg.directives',\n 'portainer.app',\n 'portainer.agent',\n 'portainer.azure',\n 'portainer.docker',\n 'portainer.kubernetes',\n 'portainer.edge',\n 'portainer.integrations',\n 'rzModule',\n 'moment-picker',\n 'angulartics',\n analyticsModule,\n]);\n\nif (require) {\n var req = require.context('./', true, /^(.*\\.(js$))[^.]*$/im);\n req\n .keys()\n .filter((path) => !path.includes('.test'))\n .forEach(function (key) {\n req(key);\n });\n}\n","const _paq = (window._paq = window._paq || []);\n/* tracker methods like \"setCustomDimension\" should be called before \"trackPageView\" */\n_paq.push(['enableLinkTracking']);\n\nvar u = 'https://portainer-ce.matomo.cloud/';\n_paq.push(['setTrackerUrl', u + 'matomo.php']);\n_paq.push(['setSiteId', '1']);\nvar d = document,\n g = d.createElement('script'),\n s = d.getElementsByTagName('script')[0];\ng.type = 'text/javascript';\ng.async = true;\ng.src = '//cdn.matomo.cloud/portainer-ce.matomo.cloud/matomo.js';\ns.parentNode.insertBefore(g, s);\n","import angular from 'angular';\n\nangular.module('portainer.agent', []);\n","const autoNgTemplateLoaderTemplate1 = require('./views/containerinstances/containerinstances.html');\nconst autoNgTemplateLoaderTemplate2 = require('./views/containerinstances/create/createcontainerinstance.html');\nconst autoNgTemplateLoaderTemplate3 = require('./views/dashboard/dashboard.html');\n\nangular.module('portainer.azure', ['portainer.app']).config([\n '$stateRegistryProvider',\n function ($stateRegistryProvider) {\n 'use strict';\n\n var azure = {\n name: 'azure',\n url: '/azure',\n parent: 'endpoint',\n abstract: true,\n onEnter: /* @ngInject */ function onEnter($async, $state, endpoint, EndpointProvider, Notifications, StateManager) {\n return $async(async () => {\n if (endpoint.Type !== 3) {\n $state.go('portainer.home');\n return;\n }\n try {\n EndpointProvider.setEndpointID(endpoint.Id);\n EndpointProvider.setEndpointPublicURL(endpoint.PublicURL);\n EndpointProvider.setOfflineModeFromStatus(endpoint.Status);\n await StateManager.updateEndpointState(endpoint, []);\n } catch (e) {\n Notifications.error('Failed loading environment', e);\n $state.go('portainer.home', {}, { reload: true });\n }\n });\n },\n };\n\n var containerInstances = {\n name: 'azure.containerinstances',\n url: '/containerinstances',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'AzureContainerInstancesController',\n },\n },\n };\n\n var containerInstance = {\n name: 'azure.containerinstances.container',\n url: '/:id',\n views: {\n 'content@': {\n component: 'containerInstanceDetails',\n },\n },\n };\n\n var containerInstanceCreation = {\n name: 'azure.containerinstances.new',\n url: '/new/',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate2,\n controller: 'AzureCreateContainerInstanceController',\n },\n },\n };\n\n var dashboard = {\n name: 'azure.dashboard',\n url: '/dashboard',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate3,\n controller: 'AzureDashboardController',\n },\n },\n };\n\n $stateRegistryProvider.register(azure);\n $stateRegistryProvider.register(containerInstances);\n $stateRegistryProvider.register(containerInstance);\n $stateRegistryProvider.register(containerInstanceCreation);\n $stateRegistryProvider.register(dashboard);\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./views/configs/configs.html');\nconst autoNgTemplateLoaderTemplate2 = require('./views/configs/edit/config.html');\nconst autoNgTemplateLoaderTemplate3 = require('./views/configs/create/createconfig.html');\nconst autoNgTemplateLoaderTemplate4 = require('./views/containers/containers.html');\nconst autoNgTemplateLoaderTemplate5 = require('./views/containers/edit/container.html');\nconst autoNgTemplateLoaderTemplate6 = require('./views/containers/console/attach.html');\nconst autoNgTemplateLoaderTemplate7 = require('./views/containers/console/exec.html');\nconst autoNgTemplateLoaderTemplate8 = require('./views/containers/create/createcontainer.html');\nconst autoNgTemplateLoaderTemplate9 = require('./views/containers/inspect/containerinspect.html');\nconst autoNgTemplateLoaderTemplate10 = require('./views/containers/logs/containerlogs.html');\nconst autoNgTemplateLoaderTemplate11 = require('./views/containers/stats/containerstats.html');\nconst autoNgTemplateLoaderTemplate12 = require('./views/dashboard/dashboard.html');\nconst autoNgTemplateLoaderTemplate13 = require('./views/events/events.html');\nconst autoNgTemplateLoaderTemplate14 = require('./views/images/images.html');\nconst autoNgTemplateLoaderTemplate15 = require('./views/images/edit/image.html');\nconst autoNgTemplateLoaderTemplate16 = require('./views/images/build/buildimage.html');\nconst autoNgTemplateLoaderTemplate17 = require('./views/images/import/importimage.html');\nconst autoNgTemplateLoaderTemplate18 = require('./views/networks/networks.html');\nconst autoNgTemplateLoaderTemplate19 = require('./views/networks/edit/network.html');\nconst autoNgTemplateLoaderTemplate20 = require('./views/networks/create/createnetwork.html');\nconst autoNgTemplateLoaderTemplate21 = require('./views/secrets/secrets.html');\nconst autoNgTemplateLoaderTemplate22 = require('./views/secrets/edit/secret.html');\nconst autoNgTemplateLoaderTemplate23 = require('./views/secrets/create/createsecret.html');\nconst autoNgTemplateLoaderTemplate24 = require('./views/services/services.html');\nconst autoNgTemplateLoaderTemplate25 = require('./views/services/edit/service.html');\nconst autoNgTemplateLoaderTemplate26 = require('./views/services/create/createservice.html');\nconst autoNgTemplateLoaderTemplate27 = require('./views/services/logs/servicelogs.html');\nconst autoNgTemplateLoaderTemplate28 = require('Portainer/views/stacks/stacks.html');\nconst autoNgTemplateLoaderTemplate29 = require('Portainer/views/stacks/edit/stack.html');\nconst autoNgTemplateLoaderTemplate30 = require('Portainer/views/stacks/create/createstack.html');\nconst autoNgTemplateLoaderTemplate31 = require('./views/swarm/swarm.html');\nconst autoNgTemplateLoaderTemplate32 = require('./views/swarm/visualizer/swarmvisualizer.html');\nconst autoNgTemplateLoaderTemplate33 = require('./views/tasks/edit/task.html');\nconst autoNgTemplateLoaderTemplate34 = require('./views/tasks/logs/tasklogs.html');\nconst autoNgTemplateLoaderTemplate35 = require('Portainer/views/templates/templates.html');\nconst autoNgTemplateLoaderTemplate36 = require('./views/volumes/volumes.html');\nconst autoNgTemplateLoaderTemplate37 = require('./views/volumes/edit/volume.html');\nconst autoNgTemplateLoaderTemplate38 = require('./views/volumes/browse/browsevolume.html');\nconst autoNgTemplateLoaderTemplate39 = require('./views/volumes/create/createvolume.html');\n\nangular.module('portainer.docker', ['portainer.app']).config([\n '$stateRegistryProvider',\n function ($stateRegistryProvider) {\n 'use strict';\n\n var docker = {\n name: 'docker',\n parent: 'endpoint',\n url: '/docker',\n abstract: true,\n onEnter: /* @ngInject */ function onEnter(endpoint, $async, $state, EndpointService, EndpointProvider, LegacyExtensionManager, Notifications, StateManager, SystemService) {\n return $async(async () => {\n if (![1, 2, 4].includes(endpoint.Type)) {\n $state.go('portainer.home');\n return;\n }\n try {\n const status = await checkEndpointStatus(endpoint);\n\n if (endpoint.Type !== 4) {\n await updateEndpointStatus(endpoint, status);\n }\n endpoint.Status = status;\n\n if (status === 2) {\n if (!endpoint.Snapshots[0]) {\n throw new Error('Environment is unreachable and there is no snapshot available for offline browsing.');\n }\n if (endpoint.Snapshots[0].Swarm) {\n throw new Error('Environment is unreachable. Connect to another swarm manager.');\n }\n }\n\n EndpointProvider.setEndpointID(endpoint.Id);\n EndpointProvider.setEndpointPublicURL(endpoint.PublicURL);\n EndpointProvider.setOfflineModeFromStatus(endpoint.Status);\n\n const extensions = await LegacyExtensionManager.initEndpointExtensions(endpoint);\n await StateManager.updateEndpointState(endpoint, extensions);\n } catch (e) {\n Notifications.error('Failed loading environment', e);\n $state.go('portainer.home', {}, { reload: true });\n }\n\n async function checkEndpointStatus(endpoint) {\n try {\n await SystemService.ping(endpoint.Id);\n return 1;\n } catch (e) {\n return 2;\n }\n }\n\n async function updateEndpointStatus(endpoint, status) {\n if (endpoint.Status === status) {\n return;\n }\n await EndpointService.updateEndpoint(endpoint.Id, { Status: status });\n }\n });\n },\n };\n\n var configs = {\n name: 'docker.configs',\n url: '/configs',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'ConfigsController',\n controllerAs: 'ctrl',\n },\n },\n };\n\n var config = {\n name: 'docker.configs.config',\n url: '/:id',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate2,\n controller: 'ConfigController',\n },\n },\n };\n\n var configCreation = {\n name: 'docker.configs.new',\n url: '/new?id',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate3,\n controller: 'CreateConfigController',\n controllerAs: 'ctrl',\n },\n },\n };\n\n var containers = {\n name: 'docker.containers',\n url: '/containers',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate4,\n controller: 'ContainersController',\n },\n },\n };\n\n var container = {\n name: 'docker.containers.container',\n url: '/:id?nodeName',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate5,\n controller: 'ContainerController',\n },\n },\n };\n\n var containerAttachConsole = {\n name: 'docker.containers.container.attach',\n url: '/attach',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate6,\n controller: 'ContainerConsoleController',\n },\n },\n };\n\n var containerExecConsole = {\n name: 'docker.containers.container.exec',\n url: '/exec',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate7,\n controller: 'ContainerConsoleController',\n },\n },\n };\n\n var containerCreation = {\n name: 'docker.containers.new',\n url: '/new?nodeName&from',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate8,\n controller: 'CreateContainerController',\n },\n },\n };\n\n var containerInspect = {\n name: 'docker.containers.container.inspect',\n url: '/inspect',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate9,\n controller: 'ContainerInspectController',\n },\n },\n };\n\n var containerLogs = {\n name: 'docker.containers.container.logs',\n url: '/logs',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate10,\n controller: 'ContainerLogsController',\n },\n },\n };\n\n var containerStats = {\n name: 'docker.containers.container.stats',\n url: '/stats',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate11,\n controller: 'ContainerStatsController',\n },\n },\n };\n\n const customTemplates = {\n name: 'docker.templates.custom',\n url: '/custom',\n\n views: {\n 'content@': {\n component: 'customTemplatesView',\n },\n },\n };\n\n const customTemplatesNew = {\n name: 'docker.templates.custom.new',\n url: '/new?fileContent&type',\n\n views: {\n 'content@': {\n component: 'createCustomTemplateView',\n },\n },\n params: {\n fileContent: '',\n type: '',\n },\n };\n\n const customTemplatesEdit = {\n name: 'docker.templates.custom.edit',\n url: '/:id',\n\n views: {\n 'content@': {\n component: 'editCustomTemplateView',\n },\n },\n };\n\n var dashboard = {\n name: 'docker.dashboard',\n url: '/dashboard',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate12,\n controller: 'DashboardController',\n },\n },\n };\n\n var host = {\n name: 'docker.host',\n url: '/host',\n views: {\n 'content@': {\n component: 'hostView',\n },\n },\n };\n\n var hostBrowser = {\n name: 'docker.host.browser',\n url: '/browser',\n views: {\n 'content@': {\n component: 'hostBrowserView',\n },\n },\n };\n\n var events = {\n name: 'docker.events',\n url: '/events',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate13,\n controller: 'EventsController',\n },\n },\n };\n\n var images = {\n name: 'docker.images',\n url: '/images',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate14,\n controller: 'ImagesController',\n },\n },\n };\n\n var image = {\n name: 'docker.images.image',\n url: '/:id?nodeName',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate15,\n controller: 'ImageController',\n },\n },\n };\n\n var imageBuild = {\n name: 'docker.images.build',\n url: '/build',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate16,\n controller: 'BuildImageController',\n },\n },\n };\n\n var imageImport = {\n name: 'docker.images.import',\n url: '/import',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate17,\n controller: 'ImportImageController',\n },\n },\n };\n\n var networks = {\n name: 'docker.networks',\n url: '/networks',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate18,\n controller: 'NetworksController',\n },\n },\n };\n\n var network = {\n name: 'docker.networks.network',\n url: '/:id?nodeName',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate19,\n controller: 'NetworkController',\n },\n },\n };\n\n var networkCreation = {\n name: 'docker.networks.new',\n url: '/new',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate20,\n controller: 'CreateNetworkController',\n },\n },\n };\n\n var nodes = {\n name: 'docker.nodes',\n url: '/nodes',\n abstract: true,\n };\n\n var node = {\n name: 'docker.nodes.node',\n url: '/:id',\n views: {\n 'content@': {\n component: 'nodeDetailsView',\n },\n },\n };\n\n var nodeBrowser = {\n name: 'docker.nodes.node.browse',\n url: '/browse',\n views: {\n 'content@': {\n component: 'nodeBrowserView',\n },\n },\n };\n\n var secrets = {\n name: 'docker.secrets',\n url: '/secrets',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate21,\n controller: 'SecretsController',\n },\n },\n };\n\n var secret = {\n name: 'docker.secrets.secret',\n url: '/:id',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate22,\n controller: 'SecretController',\n },\n },\n };\n\n var secretCreation = {\n name: 'docker.secrets.new',\n url: '/new',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate23,\n controller: 'CreateSecretController',\n },\n },\n };\n\n var services = {\n name: 'docker.services',\n url: '/services',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate24,\n controller: 'ServicesController',\n },\n },\n };\n\n var service = {\n name: 'docker.services.service',\n url: '/:id',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate25,\n controller: 'ServiceController',\n },\n },\n };\n\n var serviceCreation = {\n name: 'docker.services.new',\n url: '/new',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate26,\n controller: 'CreateServiceController',\n },\n },\n };\n\n var serviceLogs = {\n name: 'docker.services.service.logs',\n url: '/logs',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate27,\n controller: 'ServiceLogsController',\n },\n },\n };\n\n var stacks = {\n name: 'docker.stacks',\n url: '/stacks',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate28,\n controller: 'StacksController',\n },\n },\n };\n\n var stack = {\n name: 'docker.stacks.stack',\n url: '/:name?id&type®ular&external&orphaned&orphanedRunning',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate29,\n controller: 'StackController',\n },\n },\n };\n\n var stackCreation = {\n name: 'docker.stacks.newstack',\n url: '/newstack',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate30,\n controller: 'CreateStackController',\n },\n },\n };\n\n var swarm = {\n name: 'docker.swarm',\n url: '/swarm',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate31,\n controller: 'SwarmController',\n },\n },\n };\n\n var swarmVisualizer = {\n name: 'docker.swarm.visualizer',\n url: '/visualizer',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate32,\n controller: 'SwarmVisualizerController',\n },\n },\n };\n\n var tasks = {\n name: 'docker.tasks',\n url: '/tasks',\n abstract: true,\n };\n\n var task = {\n name: 'docker.tasks.task',\n url: '/:id',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate33,\n controller: 'TaskController',\n },\n },\n };\n\n var taskLogs = {\n name: 'docker.tasks.task.logs',\n url: '/logs',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate34,\n controller: 'TaskLogsController',\n },\n },\n };\n\n var templates = {\n name: 'docker.templates',\n url: '/templates',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate35,\n controller: 'TemplatesController',\n },\n },\n };\n\n var volumes = {\n name: 'docker.volumes',\n url: '/volumes',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate36,\n controller: 'VolumesController',\n },\n },\n };\n\n var volume = {\n name: 'docker.volumes.volume',\n url: '/:id?nodeName',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate37,\n controller: 'VolumeController',\n },\n },\n };\n\n var volumeBrowse = {\n name: 'docker.volumes.volume.browse',\n url: '/browse',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate38,\n controller: 'BrowseVolumeController',\n },\n },\n };\n\n var volumeCreation = {\n name: 'docker.volumes.new',\n url: '/new',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate39,\n controller: 'CreateVolumeController',\n },\n },\n };\n\n const dockerFeaturesConfiguration = {\n name: 'docker.featuresConfiguration',\n url: '/feat-config',\n views: {\n 'content@': {\n component: 'dockerFeaturesConfigurationView',\n },\n },\n };\n\n const registries = {\n name: 'docker.registries',\n url: '/registries',\n views: {\n 'content@': {\n component: 'endpointRegistriesView',\n },\n },\n };\n\n const registryAccess = {\n name: 'docker.registries.access',\n url: '/:id/access',\n views: {\n 'content@': {\n component: 'dockerRegistryAccessView',\n },\n },\n };\n\n $stateRegistryProvider.register(configs);\n $stateRegistryProvider.register(config);\n $stateRegistryProvider.register(configCreation);\n $stateRegistryProvider.register(containers);\n $stateRegistryProvider.register(container);\n $stateRegistryProvider.register(containerExecConsole);\n $stateRegistryProvider.register(containerAttachConsole);\n $stateRegistryProvider.register(containerCreation);\n $stateRegistryProvider.register(containerInspect);\n $stateRegistryProvider.register(containerLogs);\n $stateRegistryProvider.register(containerStats);\n $stateRegistryProvider.register(customTemplates);\n $stateRegistryProvider.register(customTemplatesNew);\n $stateRegistryProvider.register(customTemplatesEdit);\n $stateRegistryProvider.register(docker);\n $stateRegistryProvider.register(dashboard);\n $stateRegistryProvider.register(host);\n $stateRegistryProvider.register(hostBrowser);\n $stateRegistryProvider.register(events);\n $stateRegistryProvider.register(images);\n $stateRegistryProvider.register(image);\n $stateRegistryProvider.register(imageBuild);\n $stateRegistryProvider.register(imageImport);\n $stateRegistryProvider.register(networks);\n $stateRegistryProvider.register(network);\n $stateRegistryProvider.register(networkCreation);\n $stateRegistryProvider.register(nodes);\n $stateRegistryProvider.register(node);\n $stateRegistryProvider.register(nodeBrowser);\n $stateRegistryProvider.register(secrets);\n $stateRegistryProvider.register(secret);\n $stateRegistryProvider.register(secretCreation);\n $stateRegistryProvider.register(services);\n $stateRegistryProvider.register(service);\n $stateRegistryProvider.register(serviceCreation);\n $stateRegistryProvider.register(serviceLogs);\n $stateRegistryProvider.register(stacks);\n $stateRegistryProvider.register(stack);\n $stateRegistryProvider.register(stackCreation);\n $stateRegistryProvider.register(swarm);\n $stateRegistryProvider.register(swarmVisualizer);\n $stateRegistryProvider.register(tasks);\n $stateRegistryProvider.register(task);\n $stateRegistryProvider.register(taskLogs);\n $stateRegistryProvider.register(templates);\n $stateRegistryProvider.register(volumes);\n $stateRegistryProvider.register(volume);\n $stateRegistryProvider.register(volumeBrowse);\n $stateRegistryProvider.register(volumeCreation);\n $stateRegistryProvider.register(dockerFeaturesConfiguration);\n $stateRegistryProvider.register(registries);\n $stateRegistryProvider.register(registryAccess);\n },\n]);\n","import angular from 'angular';\n\nimport edgeStackModule from './views/edge-stacks';\n\nangular.module('portainer.edge', [edgeStackModule]).config(function config($stateRegistryProvider) {\n const edge = {\n name: 'edge',\n url: '/edge',\n parent: 'root',\n abstract: true,\n };\n\n const groups = {\n name: 'edge.groups',\n url: '/groups',\n views: {\n 'content@': {\n component: 'edgeGroupsView',\n },\n },\n };\n\n const groupsNew = {\n name: 'edge.groups.new',\n url: '/new',\n views: {\n 'content@': {\n component: 'createEdgeGroupView',\n },\n },\n };\n\n const groupsEdit = {\n name: 'edge.groups.edit',\n url: '/:groupId',\n views: {\n 'content@': {\n component: 'editEdgeGroupView',\n },\n },\n };\n\n const stacks = {\n name: 'edge.stacks',\n url: '/stacks',\n views: {\n 'content@': {\n component: 'edgeStacksView',\n },\n },\n };\n\n const stacksNew = {\n name: 'edge.stacks.new',\n url: '/new',\n views: {\n 'content@': {\n component: 'createEdgeStackView',\n },\n },\n };\n\n const stacksEdit = {\n name: 'edge.stacks.edit',\n url: '/:stackId',\n views: {\n 'content@': {\n component: 'editEdgeStackView',\n },\n },\n params: {\n tab: 0,\n },\n };\n\n const edgeJobs = {\n name: 'edge.jobs',\n url: '/jobs',\n views: {\n 'content@': {\n component: 'edgeJobsView',\n },\n },\n };\n\n const edgeJob = {\n name: 'edge.jobs.job',\n url: '/:id',\n views: {\n 'content@': {\n component: 'edgeJobView',\n },\n },\n params: {\n tab: 0,\n },\n };\n\n const edgeJobCreation = {\n name: 'edge.jobs.new',\n url: '/new',\n views: {\n 'content@': {\n component: 'createEdgeJobView',\n },\n },\n };\n\n $stateRegistryProvider.register(edge);\n\n $stateRegistryProvider.register(groups);\n $stateRegistryProvider.register(groupsNew);\n $stateRegistryProvider.register(groupsEdit);\n\n $stateRegistryProvider.register(stacks);\n $stateRegistryProvider.register(stacksNew);\n $stateRegistryProvider.register(stacksEdit);\n\n $stateRegistryProvider.register(edgeJobs);\n $stateRegistryProvider.register(edgeJob);\n $stateRegistryProvider.register(edgeJobCreation);\n});\n","const autoNgTemplateLoaderTemplate1 = require('./views/sidebar/sidebar.html');\nconst autoNgTemplateLoaderTemplate2 = require('./views/account/account.html');\nconst autoNgTemplateLoaderTemplate3 = require('./views/auth/auth.html');\nconst autoNgTemplateLoaderTemplate4 = require('./views/logout/logout.html');\nconst autoNgTemplateLoaderTemplate5 = require('./views/endpoints/endpoints.html');\nconst autoNgTemplateLoaderTemplate6 = require('./views/endpoints/edit/endpoint.html');\nconst autoNgTemplateLoaderTemplate7 = require('../kubernetes/views/configure/configure.html');\nconst autoNgTemplateLoaderTemplate8 = require('./views/endpoints/create/createendpoint.html');\nconst autoNgTemplateLoaderTemplate9 = require('./views/endpoints/access/endpointAccess.html');\nconst autoNgTemplateLoaderTemplate10 = require('./views/groups/groups.html');\nconst autoNgTemplateLoaderTemplate11 = require('./views/groups/edit/group.html');\nconst autoNgTemplateLoaderTemplate12 = require('./views/groups/create/creategroup.html');\nconst autoNgTemplateLoaderTemplate13 = require('./views/groups/access/groupAccess.html');\nconst autoNgTemplateLoaderTemplate14 = require('./views/home/home.html');\nconst autoNgTemplateLoaderTemplate15 = require('./views/init/endpoint/initEndpoint.html');\nconst autoNgTemplateLoaderTemplate16 = require('./views/init/admin/initAdmin.html');\nconst autoNgTemplateLoaderTemplate17 = require('./views/registries/registries.html');\nconst autoNgTemplateLoaderTemplate18 = require('./views/registries/edit/registry.html');\nconst autoNgTemplateLoaderTemplate19 = require('./views/settings/settings.html');\nconst autoNgTemplateLoaderTemplate20 = require('./views/settings/authentication/settingsAuthentication.html');\nconst autoNgTemplateLoaderTemplate21 = require('./views/tags/tags.html');\nconst autoNgTemplateLoaderTemplate22 = require('./views/users/users.html');\nconst autoNgTemplateLoaderTemplate23 = require('./views/users/edit/user.html');\nconst autoNgTemplateLoaderTemplate24 = require('./views/teams/teams.html');\nconst autoNgTemplateLoaderTemplate25 = require('./views/teams/edit/team.html');\n\nimport _ from 'lodash-es';\n\nimport './rbac';\nimport componentsModule from './components';\nimport settingsModule from './settings';\nimport featureFlagModule from './feature-flags';\nimport userActivityModule from './user-activity';\n\nasync function initAuthentication(authManager, Authentication, $rootScope, $state) {\n authManager.checkAuthOnRefresh();\n // The unauthenticated event is broadcasted by the jwtInterceptor when\n // hitting a 401. We're using this instead of the usual combination of\n // authManager.redirectWhenUnauthenticated() + unauthenticatedRedirector\n // to have more controls on which URL should trigger the unauthenticated state.\n $rootScope.$on('unauthenticated', function (event, data) {\n if (!_.includes(data.config.url, '/v2/') && !_.includes(data.config.url, '/api/v4/') && isTransitionRequiresAuthentication($state.transition)) {\n $state.go('portainer.logout', { error: 'Your session has expired' });\n }\n });\n\n return await Authentication.init();\n}\n\nangular\n .module('portainer.app', ['portainer.oauth', 'portainer.rbac', componentsModule, settingsModule, featureFlagModule, userActivityModule, 'portainer.shared.datatable'])\n .config([\n '$stateRegistryProvider',\n function ($stateRegistryProvider) {\n 'use strict';\n\n var root = {\n name: 'root',\n abstract: true,\n onEnter: /* @ngInject */ function onEnter($async, StateManager, Authentication, Notifications, authManager, $rootScope, $state) {\n return $async(async () => {\n const appState = StateManager.getState();\n if (!appState.loading) {\n return;\n }\n try {\n const loggedIn = await initAuthentication(authManager, Authentication, $rootScope, $state);\n await StateManager.initialize();\n if (!loggedIn && isTransitionRequiresAuthentication($state.transition)) {\n $state.go('portainer.logout');\n return Promise.reject('Unauthenticated');\n }\n } catch (err) {\n Notifications.error('Failure', err, 'Unable to retrieve application settings');\n throw err;\n }\n });\n },\n views: {\n 'sidebar@': {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'SidebarController',\n },\n },\n resolve: {\n featuresServiceInitialized: /* @ngInject */ function featuresServiceInitialized($async, featureService, Notifications) {\n return $async(async () => {\n try {\n await featureService.init();\n } catch (e) {\n Notifications.error('Failed initializing features service', e);\n throw e;\n }\n });\n },\n },\n };\n\n var endpointRoot = {\n name: 'endpoint',\n url: '/:endpointId',\n parent: 'root',\n abstract: true,\n resolve: {\n endpoint: /* @ngInject */ function endpoint($async, $state, $transition$, EndpointService, Notifications) {\n return $async(async () => {\n try {\n const endpointId = +$transition$.params().endpointId;\n\n const endpoint = await EndpointService.endpoint(endpointId);\n if ((endpoint.Type === 4 || endpoint.Type === 7) && !endpoint.EdgeID) {\n $state.go('portainer.endpoints.endpoint', { id: endpoint.Id });\n return;\n }\n\n return endpoint;\n } catch (e) {\n Notifications.error('Failed loading environment', e);\n $state.go('portainer.home', {}, { reload: true });\n return;\n }\n });\n },\n },\n };\n\n var portainer = {\n name: 'portainer',\n parent: 'root',\n abstract: true,\n };\n\n var account = {\n name: 'portainer.account',\n url: '/account',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate2,\n controller: 'AccountController',\n },\n },\n };\n\n const tokenCreation = {\n name: 'portainer.account.new-access-token',\n url: '/tokens/new',\n views: {\n 'content@': {\n component: 'createUserAccessToken',\n },\n },\n };\n\n var authentication = {\n name: 'portainer.auth',\n url: '/auth',\n params: {\n reload: false,\n },\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate3,\n controller: 'AuthenticationController',\n controllerAs: 'ctrl',\n },\n 'sidebar@': {},\n },\n };\n const logout = {\n name: 'portainer.logout',\n url: '/logout',\n params: {\n error: '',\n performApiLogout: false,\n },\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate4,\n controller: 'LogoutController',\n controllerAs: 'ctrl',\n },\n 'sidebar@': {},\n },\n };\n\n var endpoints = {\n name: 'portainer.endpoints',\n url: '/endpoints',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate5,\n controller: 'EndpointsController',\n },\n },\n };\n\n var endpoint = {\n name: 'portainer.endpoints.endpoint',\n url: '/:id',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate6,\n controller: 'EndpointController',\n },\n },\n };\n\n var k8sendpoint = {\n name: 'portainer.k8sendpoint',\n url: '/:id',\n };\n\n const endpointKubernetesConfiguration = {\n name: 'portainer.k8sendpoint.kubernetesConfig',\n url: '/configure',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate7,\n controller: 'KubernetesConfigureController',\n controllerAs: 'ctrl',\n },\n },\n };\n\n var endpointCreation = {\n name: 'portainer.endpoints.new',\n url: '/new',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate8,\n controller: 'CreateEndpointController',\n },\n },\n };\n\n var endpointAccess = {\n name: 'portainer.endpoints.endpoint.access',\n url: '/access',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate9,\n controller: 'EndpointAccessController',\n controllerAs: 'ctrl',\n },\n },\n };\n\n var groups = {\n name: 'portainer.groups',\n url: '/groups',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate10,\n controller: 'GroupsController',\n },\n },\n };\n\n var group = {\n name: 'portainer.groups.group',\n url: '/:id',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate11,\n controller: 'GroupController',\n },\n },\n };\n\n var groupCreation = {\n name: 'portainer.groups.new',\n url: '/new',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate12,\n controller: 'CreateGroupController',\n },\n },\n };\n\n var groupAccess = {\n name: 'portainer.groups.group.access',\n url: '/access',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate13,\n controller: 'GroupAccessController',\n },\n },\n };\n\n var home = {\n name: 'portainer.home',\n url: '/home',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate14,\n controller: 'HomeController',\n },\n },\n };\n\n var init = {\n name: 'portainer.init',\n abstract: true,\n url: '/init',\n views: {\n 'sidebar@': {},\n },\n };\n\n const wizard = {\n name: 'portainer.wizard',\n url: '/wizard',\n views: {\n 'content@': {\n component: 'wizardView',\n },\n },\n };\n\n const wizardEndpoints = {\n name: 'portainer.wizard.endpoints',\n url: '/endpoints',\n views: {\n 'content@': {\n component: 'wizardEndpoints',\n },\n },\n };\n\n var initEndpoint = {\n name: 'portainer.init.endpoint',\n url: '/endpoint',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate15,\n controller: 'InitEndpointController',\n controllerAs: 'ctrl',\n },\n },\n };\n\n var initAdmin = {\n name: 'portainer.init.admin',\n url: '/admin',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate16,\n controller: 'InitAdminController',\n },\n },\n };\n\n var registries = {\n name: 'portainer.registries',\n url: '/registries',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate17,\n controller: 'RegistriesController',\n },\n },\n };\n\n var registry = {\n name: 'portainer.registries.registry',\n url: '/:id',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate18,\n controller: 'RegistryController',\n },\n },\n };\n\n const registryCreation = {\n name: 'portainer.registries.new',\n url: '/new',\n views: {\n 'content@': {\n component: 'createRegistry',\n },\n },\n };\n\n var settings = {\n name: 'portainer.settings',\n url: '/settings',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate19,\n controller: 'SettingsController',\n },\n },\n };\n\n var settingsAuthentication = {\n name: 'portainer.settings.authentication',\n url: '/auth',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate20,\n controller: 'SettingsAuthenticationController',\n },\n },\n };\n\n var tags = {\n name: 'portainer.tags',\n url: '/tags',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate21,\n controller: 'TagsController',\n },\n },\n };\n\n var users = {\n name: 'portainer.users',\n url: '/users',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate22,\n controller: 'UsersController',\n },\n },\n };\n\n var user = {\n name: 'portainer.users.user',\n url: '/:id',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate23,\n controller: 'UserController',\n },\n },\n };\n\n var teams = {\n name: 'portainer.teams',\n url: '/teams',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate24,\n controller: 'TeamsController',\n },\n },\n };\n\n var team = {\n name: 'portainer.teams.team',\n url: '/:id',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate25,\n controller: 'TeamController',\n },\n },\n };\n\n $stateRegistryProvider.register(root);\n $stateRegistryProvider.register(endpointRoot);\n $stateRegistryProvider.register(portainer);\n $stateRegistryProvider.register(account);\n $stateRegistryProvider.register(tokenCreation);\n $stateRegistryProvider.register(authentication);\n $stateRegistryProvider.register(logout);\n $stateRegistryProvider.register(endpoints);\n $stateRegistryProvider.register(endpoint);\n $stateRegistryProvider.register(k8sendpoint);\n $stateRegistryProvider.register(endpointAccess);\n $stateRegistryProvider.register(endpointCreation);\n $stateRegistryProvider.register(endpointKubernetesConfiguration);\n $stateRegistryProvider.register(groups);\n $stateRegistryProvider.register(group);\n $stateRegistryProvider.register(groupAccess);\n $stateRegistryProvider.register(groupCreation);\n $stateRegistryProvider.register(home);\n $stateRegistryProvider.register(init);\n $stateRegistryProvider.register(wizard);\n $stateRegistryProvider.register(wizardEndpoints);\n $stateRegistryProvider.register(initEndpoint);\n $stateRegistryProvider.register(initAdmin);\n $stateRegistryProvider.register(registries);\n $stateRegistryProvider.register(registry);\n $stateRegistryProvider.register(registryCreation);\n $stateRegistryProvider.register(settings);\n $stateRegistryProvider.register(settingsAuthentication);\n $stateRegistryProvider.register(tags);\n $stateRegistryProvider.register(users);\n $stateRegistryProvider.register(user);\n $stateRegistryProvider.register(teams);\n $stateRegistryProvider.register(team);\n },\n ]);\n\nfunction isTransitionRequiresAuthentication(transition) {\n const UNAUTHENTICATED_ROUTES = ['portainer.logout', 'portainer.auth'];\n if (!transition) {\n return true;\n }\n const nextTransition = transition && transition.to();\n const nextTransitionName = nextTransition ? nextTransition.name : '';\n return !UNAUTHENTICATED_ROUTES.some((route) => nextTransitionName.startsWith(route));\n}\n","import { rolesView } from './views/roles';\nimport { accessViewer } from './components/access-viewer';\nimport { accessViewerDatatable } from './components/access-viewer/access-viewer-datatable';\nimport { rolesDatatable } from './components/roles-datatable';\n\nimport { RoleService } from './services/role.service';\nimport { RolesFactory } from './services/role.rest';\n\nangular\n .module('portainer.rbac', ['ngResource'])\n .constant('API_ENDPOINT_ROLES', 'api/roles')\n .component('accessViewer', accessViewer)\n .component('accessViewerDatatable', accessViewerDatatable)\n .component('rolesDatatable', rolesDatatable)\n .component('rolesView', rolesView)\n .factory('RoleService', RoleService)\n .factory('Roles', RolesFactory)\n .config(config);\n\n/* @ngInject */\nfunction config($stateRegistryProvider) {\n const roles = {\n name: 'portainer.roles',\n url: '/roles',\n views: {\n 'content@': {\n component: 'rolesView',\n },\n },\n };\n\n $stateRegistryProvider.register(roles);\n}\n","var path = 'app/azure/views/containerinstances/containerinstances.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Container list\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"Refresh\\\" ui-sref=\\\"azure.containerinstances\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content>Container instances</rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <containergroups-datatable\\n title-text=\\\"Containers\\\"\\n title-icon=\\\"fa-cubes\\\"\\n dataset=\\\"containerGroups\\\"\\n table-key=\\\"containergroups\\\"\\n order-by=\\\"Name\\\"\\n remove-action=\\\"deleteAction\\\"\\n ></containergroups-datatable>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/azure/views/containerinstances/create/createcontainerinstance.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Create container instance\\\"></rd-header-title>\\n <rd-header-content> <a ui-sref=\\\"azure.containerinstances\\\">Container instances</a> > Add container </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\" autocomplete=\\\"off\\\" name=\\\"aciForm\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Azure settings\\n </div>\\n <!-- subscription-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"azure_subscription\\\" class=\\\"col-sm-1 control-label text-left\\\">Subscription</label>\\n <div class=\\\"col-sm-11\\\">\\n <select\\n class=\\\"form-control\\\"\\n name=\\\"azure_subscription\\\"\\n ng-model=\\\"state.selectedSubscription\\\"\\n ng-options=\\\"subscription.Name for subscription in subscriptions\\\"\\n ng-change=\\\"changeSubscription()\\\"\\n ></select>\\n </div>\\n </div>\\n <!-- !subscription-input -->\\n <!-- resourcegroup-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"azure_resourcegroup\\\" class=\\\"col-sm-1 control-label text-left\\\">Resource group</label>\\n <div class=\\\"col-sm-11\\\">\\n <select\\n class=\\\"form-control\\\"\\n name=\\\"azure_resourcegroup\\\"\\n ng-model=\\\"state.selectedResourceGroup\\\"\\n ng-options=\\\"resourceGroup.Name for resourceGroup in resourceGroups\\\"\\n ></select>\\n </div>\\n </div>\\n <!-- !resourcegroup-input -->\\n <!-- location-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"azure_location\\\" class=\\\"col-sm-1 control-label text-left\\\">Location</label>\\n <div class=\\\"col-sm-11\\\">\\n <select class=\\\"form-control\\\" name=\\\"azure_location\\\" ng-model=\\\"model.Location\\\" ng-options=\\\"location for location in locations\\\"></select>\\n </div>\\n </div>\\n <!-- !location-input -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Container configuration\\n </div>\\n <!-- name-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"container_name\\\" class=\\\"col-sm-1 control-label text-left\\\">Name</label>\\n <div class=\\\"col-sm-11\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"model.Name\\\" name=\\\"container_name\\\" placeholder=\\\"e.g. myContainer\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"aciForm.container_name.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"aciForm.container_name.$error\\\">\\n <p ng-message=\\\"required\\\"> <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Name is required. </p>\\n </div>\\n </div>\\n </div>\\n <!-- !name-input -->\\n <!-- image-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"image_name\\\" class=\\\"col-sm-1 control-label text-left\\\">Image</label>\\n <div class=\\\"col-sm-11\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"model.Image\\\" name=\\\"image_name\\\" placeholder=\\\"e.g. nginx:alpine\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"aciForm.image_name.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"aciForm.image_name.$error\\\">\\n <p ng-message=\\\"required\\\"> <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Image is required. </p>\\n </div>\\n </div>\\n </div>\\n <!-- !image-input -->\\n <!-- os-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"container_os\\\" class=\\\"col-sm-1 control-label text-left\\\">OS</label>\\n <div class=\\\"col-sm-11\\\">\\n <select class=\\\"form-control\\\" ng-model=\\\"model.OSType\\\" name=\\\"container_os\\\">\\n <option value=\\\"Linux\\\">Linux</option>\\n <option value=\\\"Windows\\\">Windows</option>\\n </select>\\n </div>\\n </div>\\n <!-- !os-input -->\\n <!-- port-mapping -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label class=\\\"control-label text-left\\\">Port mapping</label>\\n <span class=\\\"label label-default interactive\\\" style=\\\"margin-left: 10px;\\\" ng-click=\\\"addPortBinding()\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> map additional port\\n </span>\\n </div>\\n <!-- port-mapping-input-list -->\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\">\\n <div ng-repeat=\\\"binding in model.Ports\\\" style=\\\"margin-top: 2px;\\\">\\n <!-- host-port -->\\n <div class=\\\"input-group col-sm-4 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">host</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"binding.host\\\" placeholder=\\\"e.g. 80\\\" />\\n </div>\\n <!-- !host-port -->\\n <span style=\\\"margin: 0 10px 0 10px;\\\">\\n <i class=\\\"fa fa-long-arrow-alt-right\\\" aria-hidden=\\\"true\\\"></i>\\n </span>\\n <!-- container-port -->\\n <div class=\\\"input-group col-sm-4 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">container</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"binding.container\\\" placeholder=\\\"e.g. 80\\\" />\\n </div>\\n <!-- !container-port -->\\n <!-- protocol-actions -->\\n <div class=\\\"input-group col-sm-3 input-group-sm\\\">\\n <div class=\\\"btn-group btn-group-sm\\\">\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"binding.protocol\\\" uib-btn-radio=\\\"'TCP'\\\">TCP</label>\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"binding.protocol\\\" uib-btn-radio=\\\"'UDP'\\\">UDP</label>\\n </div>\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removePortBinding($index)\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n <!-- !protocol-actions -->\\n </div>\\n </div>\\n <!-- !port-mapping-input-list -->\\n </div>\\n <!-- !port-mapping -->\\n <!-- public-ip -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12 small text-muted\\\">This will automatically deploy a container with a public IP address</div>\\n </div>\\n <!-- public-ip -->\\n\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Container resources\\n </div>\\n <!-- cpu-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"container_cpu\\\" class=\\\"col-sm-1 control-label text-left\\\">CPU</label>\\n <div class=\\\"col-sm-11\\\">\\n <input type=\\\"number\\\" class=\\\"form-control\\\" ng-model=\\\"model.CPU\\\" name=\\\"container_cpu\\\" placeholder=\\\"1\\\" />\\n </div>\\n </div>\\n <!-- !cpu-input -->\\n <!-- memory-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"container_memory\\\" class=\\\"col-sm-1 control-label text-left\\\">Memory</label>\\n <div class=\\\"col-sm-11\\\">\\n <input type=\\\"number\\\" class=\\\"form-control\\\" ng-model=\\\"model.Memory\\\" name=\\\"container_memory\\\" placeholder=\\\"1\\\" />\\n </div>\\n </div>\\n <!-- !memory-input -->\\n <!-- access-control -->\\n <por-access-control-form form-data=\\\"model.AccessControlData\\\"></por-access-control-form>\\n <!-- !access-control -->\\n <!-- actions -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-primary btn-sm\\\" ng-disabled=\\\"state.actionInProgress\\\" ng-click=\\\"create()\\\" button-spinner=\\\"state.actionInProgress\\\">\\n <span ng-hide=\\\"state.actionInProgress\\\">Deploy the container</span>\\n <span ng-show=\\\"state.actionInProgress\\\">Deployment in progress...</span>\\n </button>\\n <span class=\\\"text-danger\\\" ng-if=\\\"state.formValidationError\\\" style=\\\"margin-left: 5px;\\\">{{ state.formValidationError }}</span>\\n </div>\\n </div>\\n <!-- !actions -->\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/azure/views/dashboard/dashboard.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Home\\\"></rd-header-title>\\n <rd-header-content>Dashboard</rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\" ng-if=\\\"subscriptions\\\">\\n <div class=\\\"col-sm-12 col-md-6\\\">\\n <a ui-sref=\\\"azure.subscriptions\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <div class=\\\"widget-icon blue pull-left\\\">\\n <i class=\\\"fa fa-th-list\\\"></i>\\n </div>\\n <div class=\\\"title\\\">{{ subscriptions.length }}</div>\\n <div class=\\\"comment\\\">Subscriptions</div>\\n </rd-widget-body>\\n </rd-widget>\\n </a>\\n </div>\\n <div class=\\\"col-sm-12 col-md-6\\\" ng-if=\\\"resourceGroups\\\">\\n <a ui-sref=\\\"azure.resourceGroups\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <div class=\\\"widget-icon blue pull-left\\\">\\n <i class=\\\"fa fa-th-list\\\"></i>\\n </div>\\n <div class=\\\"title\\\">{{ resourceGroups.length }}</div>\\n <div class=\\\"comment\\\">Resource groups</div>\\n </rd-widget-body>\\n </rd-widget>\\n </a>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/configs/configs.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Configs list\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"Refresh\\\" ui-sref=\\\"docker.configs\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content>Configs</rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <configs-datatable\\n title-text=\\\"Configs\\\"\\n title-icon=\\\"fa-file-code\\\"\\n dataset=\\\"ctrl.configs\\\"\\n table-key=\\\"configs\\\"\\n order-by=\\\"Name\\\"\\n remove-action=\\\"ctrl.removeAction\\\"\\n refresh-callback=\\\"ctrl.getConfigs\\\"\\n ></configs-datatable>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/configs/edit/config.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Config details\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"Refresh\\\" ui-sref=\\\"docker.configs.config({id: config.Id})\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content>\\n <a ui-sref=\\\"docker.configs\\\">Configs</a> > <a ui-sref=\\\"docker.configs.config({id: config.Id})\\\">{{ config.Name }}</a>\\n </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-file-code\\\" title-text=\\\"Config details\\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr>\\n <td>Name</td>\\n <td>{{ config.Name }}</td>\\n </tr>\\n <tr>\\n <td>ID</td>\\n <td>\\n {{ config.Id }}\\n <button authorization=\\\"DockerConfigDelete\\\" class=\\\"btn btn-xs btn-danger\\\" ng-click=\\\"removeConfig(config.Id)\\\"\\n ><i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Delete this config</button\\n >\\n <button authorization=\\\"DockerConfigCreate\\\" class=\\\"btn btn-xs btn-primary\\\" ui-sref=\\\"docker.configs.new({id: config.Id})\\\"\\n ><i class=\\\"fa fa-copy space-right\\\" aria-hidden=\\\"true\\\"></i>Clone config</button\\n >\\n </td>\\n </tr>\\n <tr>\\n <td>Created</td>\\n <td>{{ config.CreatedAt | getisodate }}</td>\\n </tr>\\n <tr>\\n <td>Last updated</td>\\n <td>{{ config.UpdatedAt | getisodate }}</td>\\n </tr>\\n <tr ng-if=\\\"!(config.Labels | emptyobject)\\\">\\n <td>Labels</td>\\n <td>\\n <table class=\\\"table table-bordered table-condensed\\\">\\n <tr ng-repeat=\\\"(k, v) in config.Labels\\\">\\n <td>{{ k }}</td>\\n <td>{{ v }}</td>\\n </tr>\\n </table>\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\\n<!-- access-control-panel -->\\n<por-access-control-panel ng-if=\\\"config\\\" resource-id=\\\"config.Id\\\" resource-control=\\\"config.ResourceControl\\\" resource-type=\\\"'config'\\\"> </por-access-control-panel>\\n<!-- !access-control-panel -->\\n\\n<div class=\\\"row\\\" ng-if=\\\"config\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-file-code\\\" title-text=\\\"Config content\\\"></rd-widget-header>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\">\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <code-editor identifier=\\\"config-editor\\\" yml=\\\"false\\\" read-only=\\\"true\\\" value=\\\"config.Data\\\"></code-editor>\\n </div>\\n </div>\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/configs/create/createconfig.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Create config\\\"></rd-header-title>\\n <rd-header-content> <a ui-sref=\\\"docker.configs\\\">Configs</a> > Add config </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\">\\n <!-- name-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"config_name\\\" class=\\\"col-sm-1 control-label text-left\\\">Name</label>\\n <div class=\\\"col-sm-11\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"ctrl.formValues.Name\\\" id=\\\"config_name\\\" placeholder=\\\"e.g. myConfig\\\" />\\n </div>\\n </div>\\n <!-- !name-input -->\\n <!-- config-data -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\" ng-if=\\\"ctrl.formValues.displayCodeEditor\\\">\\n <code-editor\\n identifier=\\\"config-creation-editor\\\"\\n placeholder=\\\"Define or paste the content of your config here\\\"\\n yml=\\\"false\\\"\\n on-change=\\\"(ctrl.editorUpdate)\\\"\\n value=\\\"ctrl.formValues.Data\\\"\\n ></code-editor>\\n </div>\\n </div>\\n <!-- !config-data -->\\n <!-- labels -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 5px;\\\">\\n <label class=\\\"control-label text-left\\\">Labels</label>\\n <span class=\\\"label label-default interactive\\\" style=\\\"margin-left: 10px;\\\" ng-click=\\\"ctrl.addLabel()\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add label\\n </span>\\n </div>\\n <!-- labels-input-list -->\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\">\\n <div ng-repeat=\\\"label in ctrl.formValues.Labels\\\" style=\\\"margin-top: 2px;\\\">\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">name</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"label.name\\\" placeholder=\\\"e.g. com.example.foo\\\" />\\n </div>\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">value</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"label.value\\\" placeholder=\\\"e.g. bar\\\" />\\n </div>\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"ctrl.removeLabel($index)\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n <!-- !labels-input-list -->\\n </div>\\n <!-- !labels-->\\n <!-- access-control -->\\n <por-access-control-form form-data=\\\"ctrl.formValues.AccessControlData\\\"></por-access-control-form>\\n <!-- !access-control -->\\n <!-- actions -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-primary btn-sm\\\" ng-disabled=\\\"!ctrl.formValues.Name\\\" ng-click=\\\"ctrl.create()\\\">Create config</button>\\n <span class=\\\"text-danger\\\" ng-if=\\\"ctrl.state.formValidationError\\\" style=\\\"margin-left: 5px;\\\">{{ ctrl.state.formValidationError }}</span>\\n </div>\\n </div>\\n <!-- !actions -->\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/containers/containers.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Container list\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"Refresh\\\" ui-sref=\\\"docker.containers\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content>Containers</rd-header-content>\\n</rd-header>\\n<information-panel-offline ng-if=\\\"offlineMode\\\"></information-panel-offline>\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\" ng-if=\\\"containers\\\">\\n <containers-datatable\\n title-text=\\\"Containers\\\"\\n title-icon=\\\"fa-cubes\\\"\\n dataset=\\\"containers\\\"\\n table-key=\\\"containers\\\"\\n order-by=\\\"Status\\\"\\n show-host-column=\\\"applicationState.endpoint.mode.agentProxy && applicationState.endpoint.mode.provider === 'DOCKER_SWARM_MODE'\\\"\\n show-add-action=\\\"true\\\"\\n offline-mode=\\\"offlineMode\\\"\\n refresh-callback=\\\"getContainers\\\"\\n ></containers-datatable>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/containers/edit/container.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Container details\\\"> </rd-header-title>\\n <rd-header-content>\\n <a ui-sref=\\\"docker.containers\\\">Containers</a> > <a ui-sref=\\\"docker.containers.container({id: container.Id})\\\">{{ container.Name | trimcontainername }}</a>\\n </rd-header-content>\\n</rd-header>\\n\\n<div\\n class=\\\"row\\\"\\n authorization=\\\"DockerContainerStart, DockerContainerStop, DockerContainerKill, DockerContainerRestart, DockerContainerPause, DockerContainerUnpause, DockerContainerDelete, DockerContainerCreate\\\"\\n>\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-cogs\\\" title-text=\\\"Actions\\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"padding\\\">\\n <div class=\\\"btn-group\\\" role=\\\"group\\\" aria-label=\\\"...\\\">\\n <button authorization=\\\"DockerContainerStart\\\" class=\\\"btn btn-success btn-sm\\\" ng-click=\\\"start()\\\" ng-disabled=\\\"container.State.Running\\\"\\n ><i class=\\\"fa fa-play space-right\\\" aria-hidden=\\\"true\\\"></i>Start</button\\n >\\n <button authorization=\\\"DockerContainerStop\\\" class=\\\"btn btn-danger btn-sm\\\" ng-click=\\\"stop()\\\" ng-disabled=\\\"!container.State.Running\\\"\\n ><i class=\\\"fa fa-stop space-right\\\" aria-hidden=\\\"true\\\"></i>Stop</button\\n >\\n <button authorization=\\\"DockerContainerKill\\\" class=\\\"btn btn-danger btn-sm\\\" ng-click=\\\"kill()\\\" ng-disabled=\\\"!container.State.Running\\\"\\n ><i class=\\\"fa fa-bomb space-right\\\" aria-hidden=\\\"true\\\"></i>Kill</button\\n >\\n <button authorization=\\\"DockerContainerRestart\\\" class=\\\"btn btn-primary btn-sm\\\" ng-click=\\\"restart()\\\" ng-disabled=\\\"!container.State.Running\\\"\\n ><i class=\\\"fa fa-sync space-right\\\" aria-hidden=\\\"true\\\"></i>Restart</button\\n >\\n <button authorization=\\\"DockerContainerPause\\\" class=\\\"btn btn-primary btn-sm\\\" ng-click=\\\"pause()\\\" ng-disabled=\\\"!container.State.Running || container.State.Paused\\\"\\n ><i class=\\\"fa fa-pause space-right\\\" aria-hidden=\\\"true\\\"></i>Pause</button\\n >\\n <button authorization=\\\"DockerContainerUnpause\\\" class=\\\"btn btn-primary btn-sm\\\" ng-click=\\\"unpause()\\\" ng-disabled=\\\"!container.State.Paused\\\"\\n ><i class=\\\"fa fa-play space-right\\\" aria-hidden=\\\"true\\\"></i>Resume</button\\n >\\n <button authorization=\\\"DockerContainerDelete\\\" class=\\\"btn btn-danger btn-sm\\\" ng-click=\\\"confirmRemove()\\\"\\n ><i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Remove</button\\n >\\n </div>\\n <div class=\\\"btn-group\\\" role=\\\"group\\\" aria-label=\\\"...\\\" ng-if=\\\"displayRecreateButton\\\" authorization=\\\"DockerContainerCreate\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-danger btn-sm\\\"\\n ng-disabled=\\\"state.recreateContainerInProgress\\\"\\n ng-click=\\\"recreate()\\\"\\n button-spinner=\\\"state.recreateContainerInProgress\\\"\\n >\\n <span ng-hide=\\\"state.recreateContainerInProgress\\\"><i class=\\\"fa fa-sync space-right\\\" aria-hidden=\\\"true\\\"></i>Recreate</span>\\n <span ng-show=\\\"state.recreateContainerInProgress\\\">Recreation in progress...</span>\\n </button>\\n <a class=\\\"btn btn-primary btn-sm\\\" type=\\\"button\\\" ui-sref=\\\"docker.containers.new({ from: container.Id, nodeName: nodeName })\\\"\\n ><i class=\\\"fa fa-copy space-right\\\" aria-hidden=\\\"true\\\"></i>Duplicate/Edit</a\\n >\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-server\\\" title-text=\\\"Container status\\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr>\\n <td>ID</td>\\n <td>{{ container.Id }}</td>\\n </tr>\\n <tr>\\n <td>Name</td>\\n <td ng-if=\\\"!container.edit\\\">\\n {{ container.Name | trimcontainername }}\\n <a authorization=\\\"DockerContainerRename\\\" href=\\\"\\\" data-toggle=\\\"tooltip\\\" title=\\\"Edit container name\\\" ng-click=\\\"container.edit = true;\\\"><i class=\\\"fa fa-edit\\\"></i></a>\\n </td>\\n <td ng-if=\\\"container.edit\\\">\\n <form ng-submit=\\\"renameContainer()\\\">\\n <input type=\\\"text\\\" class=\\\"containerNameInput\\\" ng-model=\\\"container.newContainerName\\\" />\\n <a href=\\\"\\\" ng-click=\\\"container.edit = false;\\\"><i class=\\\"fa fa-times\\\"></i></a>\\n <a href=\\\"\\\" ng-click=\\\"renameContainer()\\\"><i class=\\\"fa fa-check-square\\\"></i></a>\\n </form>\\n </td>\\n </tr>\\n <tr ng-if=\\\"container.NetworkSettings.IPAddress\\\">\\n <td>IP address</td>\\n <td>{{ container.NetworkSettings.IPAddress }}</td>\\n </tr>\\n <tr>\\n <td>Status</td>\\n <td>\\n <i class=\\\"fa fa-heartbeat space-right green-icon\\\" ng-if=\\\"container.State.Running\\\"></i>\\n <i class=\\\"fa fa-heartbeat space-right red-icon\\\" ng-if=\\\"!container.State.Running && container.State.Status !== 'created'\\\"></i>\\n {{ container.State | getstatetext }} for {{ activityTime\\n }}<span ng-if=\\\"!container.State.Running && container.State.Status !== 'created'\\\"> with exit code {{ container.State.ExitCode }}</span>\\n </td>\\n </tr>\\n <tr>\\n <td>Created</td>\\n <td>{{ container.Created | getisodate }}</td>\\n </tr>\\n <tr ng-if=\\\"container.State.Running\\\">\\n <td>Start time</td>\\n <td>{{ container.State.StartedAt | getisodate }}</td>\\n </tr>\\n <tr ng-if=\\\"!container.State.Running && container.State.Status !== 'created'\\\">\\n <td>Finished</td>\\n <td>{{ container.State.FinishedAt | getisodate }}</td>\\n </tr>\\n <tr authorization=\\\"DockerContainerLogs, DockerContainerInspect, DockerContainerStats, DockerExecStart\\\">\\n <td colspan=\\\"2\\\">\\n <div class=\\\"btn-group\\\" role=\\\"group\\\" aria-label=\\\"...\\\">\\n <a authorization=\\\"DockerContainerLogs\\\" class=\\\"btn\\\" type=\\\"button\\\" ui-sref=\\\"docker.containers.container.logs({ id: container.Id })\\\"\\n ><i class=\\\"fa fa-file-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Logs</a\\n >\\n <a authorization=\\\"DockerContainerInspect\\\" class=\\\"btn\\\" type=\\\"button\\\" ui-sref=\\\"docker.containers.container.inspect({ id: container.Id })\\\"\\n ><i class=\\\"fa fa-info-circle space-right\\\" aria-hidden=\\\"true\\\"></i>Inspect</a\\n >\\n <a authorization=\\\"DockerContainerStats\\\" class=\\\"btn\\\" type=\\\"button\\\" ui-sref=\\\"docker.containers.container.stats({ id: container.Id })\\\"\\n ><i class=\\\"fa fa-chart-area space-right\\\" aria-hidden=\\\"true\\\"></i>Stats</a\\n >\\n <a authorization=\\\"DockerExecStart\\\" class=\\\"btn\\\" type=\\\"button\\\" ui-sref=\\\"docker.containers.container.exec({ id: container.Id })\\\"\\n ><i class=\\\"fa fa-terminal space-right\\\" aria-hidden=\\\"true\\\"></i>Console</a\\n >\\n <a authorization=\\\"DockerContainerAttach\\\" class=\\\"btn\\\" type=\\\"button\\\" ui-sref=\\\"docker.containers.container.attach({ id: container.Id })\\\"\\n ><i class=\\\"fa fa-plug space-right\\\" aria-hidden=\\\"true\\\"></i>Attach</a\\n >\\n </div>\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\\n<!-- access-control-panel -->\\n<por-access-control-panel ng-if=\\\"container\\\" resource-id=\\\"container.Id\\\" resource-control=\\\"container.ResourceControl\\\" resource-type=\\\"'container'\\\"> </por-access-control-panel>\\n<!-- !access-control-panel -->\\n\\n<div ng-if=\\\"container.State.Health\\\" class=\\\"row\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-server\\\" title-text=\\\"Container health\\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr>\\n <td>Status</td>\\n <td>\\n <i\\n ng-class=\\\"\\n { healthy: 'fa fa-heartbeat space-right green-icon', unhealthy: 'fa fa-heartbeat space-right red-icon', starting: 'fa fa-heartbeat space-right orange-icon' }[\\n container.State.Health.Status\\n ]\\n \\\"\\n ></i>\\n {{ container.State.Health.Status }}\\n </td>\\n </tr>\\n <tr>\\n <td>Failure count</td>\\n <td>{{ container.State.Health.FailingStreak }}</td>\\n </tr>\\n <tr>\\n <td>Last output</td>\\n <td>{{ container.State.Health.Log[container.State.Health.Log.length - 1].Output }}</td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\\n<div class=\\\"row\\\" authorization=\\\"DockerImageCreate\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-clone\\\" title-text=\\\"Create image\\\"></rd-widget-header>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\">\\n <!-- tag-description -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <span class=\\\"small text-muted\\\">\\n You can create an image from this container, this allows you to backup important data or save helpful configurations. You'll be able to spin up another container\\n based on this image afterward.\\n </span>\\n </div>\\n </div>\\n <!-- !tag-description -->\\n <!-- image-and-registry -->\\n <por-image-registry\\n model=\\\"config.RegistryModel\\\"\\n auto-complete=\\\"true\\\"\\n label-class=\\\"col-sm-1\\\"\\n input-class=\\\"col-sm-11\\\"\\n endpoint=\\\"endpoint\\\"\\n is-admin=\\\"isAdmin\\\"\\n set-validity=\\\"setPullImageValidity\\\"\\n check-rate-limits=\\\"true\\\"\\n ></por-image-registry>\\n <!-- !image-and-registry -->\\n <!-- tag-note -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <span class=\\\"small text-muted\\\">Note: if you don't specify the tag in the image name, <span class=\\\"label label-default\\\">latest</span> will be used.</span>\\n </div>\\n </div>\\n <!-- !tag-note -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"!state.pullImageValidity || !config.RegistryModel.Image || config.commitInProgress\\\"\\n ng-click=\\\"commit()\\\"\\n >\\n Create\\n </button>\\n </div>\\n </div>\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n<div class=\\\"row\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-server\\\" title-text=\\\"Container details\\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table container-details-table\\\">\\n <tbody>\\n <tr>\\n <td>Image</td>\\n <td\\n ><a ui-sref=\\\"docker.images.image({ id: container.Image, nodeName: nodeName })\\\">{{ container.Config.Image }}@{{ container.Image }}</a></td\\n >\\n </tr>\\n <tr ng-if=\\\"portBindings.length > 0\\\">\\n <td>Port configuration</td>\\n <td>\\n <div ng-repeat=\\\"portMapping in portBindings\\\"> {{ portMapping.host }} <i class=\\\"fa fa-long-arrow-alt-right\\\"></i> {{ portMapping.container }} </div>\\n </td>\\n </tr>\\n <tr>\\n <td>CMD</td>\\n <td\\n ><code>{{ container.Config.Cmd | command }}</code></td\\n >\\n </tr>\\n <tr>\\n <td>ENTRYPOINT</td>\\n <td\\n ><code>{{ container.Config.Entrypoint ? (container.Config.Entrypoint | command) : 'null' }}</code></td\\n >\\n </tr>\\n <tr>\\n <td>ENV</td>\\n <td>\\n <table class=\\\"table table-bordered table-condensed\\\">\\n <tr ng-repeat=\\\"var in container.Config.Env track by $index\\\">\\n <td>{{ var|key: '=' }}</td>\\n <td>{{ var|value: '=' }}</td>\\n </tr>\\n </table>\\n </td>\\n </tr>\\n <tr ng-if=\\\"!(container.Config.Labels | emptyobject)\\\">\\n <td>Labels</td>\\n <td>\\n <table class=\\\"table table-bordered table-condensed\\\">\\n <tr ng-repeat=\\\"(k, v) in container.Config.Labels\\\">\\n <td>{{ k }}</td>\\n <td>{{ v }}</td>\\n </tr>\\n </table>\\n </td>\\n </tr>\\n <tr>\\n <td>Restart policies</td>\\n <td>\\n <container-restart-policy\\n ng-if=\\\"container\\\"\\n name=\\\"container.HostConfig.RestartPolicy.Name\\\"\\n maximum-retry-count=\\\"container.HostConfig.RestartPolicy.MaximumRetryCount\\\"\\n update-restart-policy=\\\"updateRestartPolicy(name, maximumRetryCount)\\\"\\n >\\n </container-restart-policy>\\n </td>\\n </tr>\\n <tr ng-if=\\\"!(container.HostConfig.Sysctls | emptyobject)\\\">\\n <td>Sysctls</td>\\n <td>\\n <table class=\\\"table table-bordered table-condensed\\\">\\n <tr ng-repeat=\\\"(k, v) in container.HostConfig.Sysctls\\\">\\n <td>{{ k }}</td>\\n <td>{{ v }}</td>\\n </tr>\\n </table>\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\\n<div class=\\\"row\\\" ng-if=\\\"container.Mounts.length > 0\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-hdd\\\" title-text=\\\"Volumes\\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <thead>\\n <tr>\\n <th>Host/volume</th>\\n <th>Path in container</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr ng-repeat=\\\"vol in container.Mounts\\\">\\n <td ng-if=\\\"vol.Type === 'bind'\\\">{{ vol.Source }}</td>\\n <td ng-if=\\\"vol.Type === 'volume'\\\"\\n ><a ui-sref=\\\"docker.volumes.volume({ id: vol.Name, nodeName: nodeName })\\\">{{ vol.Name }}</a></td\\n >\\n <td>{{ vol.Destination }}</td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <container-networks-datatable\\n ng-if=\\\"container.NetworkSettings.Networks\\\"\\n title-text=\\\"Connected networks\\\"\\n title-icon=\\\"fa-sitemap\\\"\\n dataset=\\\"container.NetworkSettings.Networks\\\"\\n table-key=\\\"container-networks\\\"\\n container=\\\"container\\\"\\n available-networks=\\\"availableNetworks\\\"\\n join-network-action=\\\"containerJoinNetwork\\\"\\n join-network-action-in-progress=\\\"state.joinNetworkInProgress\\\"\\n leave-network-action=\\\"containerLeaveNetwork\\\"\\n leave-network-action-in-progress=\\\"state.leaveNetworkInProgress\\\"\\n node-name=\\\"nodeName\\\"\\n ></container-networks-datatable>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/containers/console/attach.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Container console\\\"></rd-header-title>\\n <rd-header-content>\\n <a ui-sref=\\\"docker.containers\\\">Containers</a> > <a ui-sref=\\\"docker.containers.container({id: container.Id})\\\">{{ container.Name | trimcontainername }}</a> > Console\\n </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\" ng-init=\\\"autoconnectAttachView()\\\" ng-show=\\\"loaded\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-terminal\\\" title-text=\\\"Attach\\\"></rd-widget-header>\\n <rd-widget-body>\\n <div class=\\\"small text-warning\\\" ng-if=\\\"!container.Config.OpenStdin\\\">\\n <p>\\n <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i>\\n The interactive-flag is not set. You might not be able to use the console properly.\\n </p>\\n </div>\\n\\n <div class=\\\"small text-warning\\\" ng-if=\\\"!container.Config.Tty\\\">\\n <p>\\n <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i>\\n The TTY-flag is not set. You might not be able to use the console properly.\\n </p>\\n </div>\\n\\n <div class=\\\"small text-danger\\\" ng-hide=\\\"container.State.Running\\\">\\n <p>\\n <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i>\\n The container is not running.\\n </p>\\n </div>\\n\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary\\\"\\n ng-disabled=\\\"state === states.connecting || !container.State.Running\\\"\\n ng-click=\\\"state == states.disconnected ? connectAttach() : disconnect()\\\"\\n >\\n <span ng-show=\\\"state === states.disconnected\\\">Attach to Container</span>\\n <span ng-show=\\\"state === states.connected\\\">Detach</span>\\n <span ng-show=\\\"state === states.connecting\\\">Attaching...</span>\\n </button>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <div id=\\\"terminal-container\\\" class=\\\"terminal-container\\\"></div>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/containers/console/exec.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Container console\\\"></rd-header-title>\\n <rd-header-content>\\n <a ui-sref=\\\"docker.containers\\\">Containers</a> > <a ui-sref=\\\"docker.containers.container({id: container.Id})\\\">{{ container.Name | trimcontainername }}</a> > Console\\n </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\" ng-init=\\\"initView()\\\" ng-show=\\\"loaded\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-terminal\\\" title-text=\\\"Execute\\\"></rd-widget-header>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\">\\n <div ng-if=\\\"state === states.disconnected\\\">\\n <!-- command-list -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"command\\\" class=\\\"col-lg-1 text-left col-sm-2 control-label\\\">Command</label>\\n <div class=\\\"col-lg-11 col-sm-10\\\">\\n <div class=\\\"input-group\\\" ng-if=\\\"!formValues.isCustomCommand\\\">\\n <span class=\\\"input-group-addon\\\">\\n <i class=\\\"fab fa-linux\\\" aria-hidden=\\\"true\\\" ng-if=\\\"imageOS == 'linux'\\\"></i>\\n <i class=\\\"fab fa-windows\\\" aria-hidden=\\\"true\\\" ng-if=\\\"imageOS == 'windows'\\\"></i>\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"formValues.command\\\" id=\\\"command\\\">\\n <option value=\\\"ash\\\" ng-if=\\\"imageOS == 'linux'\\\">/bin/ash</option>\\n <option value=\\\"bash\\\" ng-if=\\\"imageOS == 'linux'\\\">/bin/bash</option>\\n <option value=\\\"sh\\\" ng-if=\\\"imageOS == 'linux'\\\">/bin/sh</option>\\n <option value=\\\"powershell\\\" ng-if=\\\"imageOS == 'windows'\\\">powershell</option>\\n <option value=\\\"cmd.exe\\\" ng-if=\\\"imageOS == 'windows'\\\">cmd.exe</option>\\n <option ng-repeat=\\\"command in containerCommands\\\" value=\\\"{{ command.command }}\\\">{{ command.title }}: {{ command.command }}</option>\\n </select>\\n </div>\\n <input class=\\\"form-control\\\" ng-if=\\\"formValues.isCustomCommand\\\" type=\\\"text\\\" name=\\\"custom-command\\\" ng-model=\\\"formValues.customCommand\\\" placeholder=\\\"e.g. ps aux\\\" />\\n </div>\\n </div>\\n <!-- !command-list -->\\n <div class=\\\"form-group col-lg-12\\\">\\n <label for=\\\"command\\\" class=\\\"text-left control-label\\\">Use custom command</label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\"> <input type=\\\"checkbox\\\" ng-model=\\\"formValues.isCustomCommand\\\" /><i></i> </label>\\n </div>\\n <div class=\\\"form-group\\\">\\n <label for=\\\"username\\\" class=\\\"col-lg-1 text-left col-sm-2 control-label\\\">\\n User\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"Format is one of: user, user:group, uid or uid:gid\\\"></portainer-tooltip>\\n </label>\\n <div class=\\\"col-lg-11 col-sm-10\\\">\\n <input class=\\\"form-control\\\" type=\\\"text\\\" name=\\\"username\\\" ng-model=\\\"formValues.user\\\" placeholder=\\\"root\\\" />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-primary\\\" ng-disabled=\\\"!container.State.Running\\\" ng-click=\\\"connectExec()\\\">\\n <span>Connect</span>\\n </button>\\n <span class=\\\"small text-danger\\\" ng-hide=\\\"container.State.Running\\\">\\n <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i>\\n The container is not running.\\n </span>\\n </div>\\n </div>\\n </div>\\n <div ng-if=\\\"state !== states.disconnected\\\">\\n <label\\n >Exec into container as <code>{{ ::formValues.user || 'default user' }}</code> using command\\n <code>{{ formValues.isCustomCommand ? formValues.customCommand : formValues.command }}</code></label\\n >\\n <button type=\\\"button\\\" class=\\\"btn btn-primary\\\" ng-click=\\\"disconnect()\\\">\\n <span ng-show=\\\"state === states.connected\\\">Disconnect</span>\\n <span ng-show=\\\"state === states.connecting\\\">Connecting...</span>\\n </button>\\n </div>\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <div id=\\\"terminal-container\\\" class=\\\"terminal-container\\\"></div>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/containers/create/createcontainer.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Create container\\\"></rd-header-title>\\n <rd-header-content> <a ui-sref=\\\"docker.containers\\\">Containers</a> > Add container </rd-header-content>\\n</rd-header>\\n\\n<information-panel title-text=\\\"Caution\\\" ng-if=\\\"state.mode == 'duplicate'\\\">\\n <span class=\\\"small\\\">\\n <p class=\\\"text-muted\\\">\\n <i class=\\\"fa fa-exclamation-circle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n The new container may fail to start if the image is changed, and settings from the previous container aren't compatible. Common causes include entrypoint, cmd or\\n <a href=\\\"http://portainer.readthedocs.io/en/stable/agent.html\\\" target=\\\"_blank\\\">other settings</a> set by an image.\\n </p>\\n </span>\\n</information-panel>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\" autocomplete=\\\"off\\\">\\n <!-- name-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"container_name\\\" class=\\\"col-sm-1 control-label text-left\\\">Name</label>\\n <div class=\\\"col-sm-11\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"config.name\\\" id=\\\"container_name\\\" placeholder=\\\"e.g. myContainer\\\" />\\n </div>\\n </div>\\n <!-- !name-input -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Image configuration\\n </div>\\n <div ng-if=\\\"!formValues.RegistryModel.Registry && fromContainer\\\">\\n <i class=\\\"fa fa-exclamation-triangle orange-icon\\\" aria-hidden=\\\"true\\\"></i>\\n <span class=\\\"small text-danger\\\" style=\\\"margin-left: 5px;\\\">\\n The Docker registry for the <code>{{ config.Image }}</code> image is not registered inside Portainer, you will not be able to create a container. Please register that\\n registry first.\\n </span>\\n </div>\\n <div ng-if=\\\"formValues.RegistryModel.Registry || !fromContainer\\\">\\n <!-- image-and-registry -->\\n <por-image-registry\\n model=\\\"formValues.RegistryModel\\\"\\n ng-if=\\\"formValues.RegistryModel.Registry\\\"\\n auto-complete=\\\"true\\\"\\n label-class=\\\"col-sm-1\\\"\\n input-class=\\\"col-sm-11\\\"\\n on-image-change=\\\"onImageNameChange()\\\"\\n endpoint=\\\"endpoint\\\"\\n is-admin=\\\"isAdmin\\\"\\n check-rate-limits=\\\"formValues.alwaysPull\\\"\\n set-validity=\\\"setPullImageValidity\\\"\\n >\\n <!-- always-pull -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label for=\\\"ownership\\\" class=\\\"control-label text-left\\\">\\n Always pull the image\\n <portainer-tooltip\\n position=\\\"bottom\\\"\\n message=\\\"When enabled, Portainer will automatically try to pull the specified image before creating the container.\\\"\\n ></portainer-tooltip>\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\">\\n <input type=\\\"checkbox\\\" ng-model=\\\"formValues.alwaysPull\\\" ng-disabled=\\\"!state.pullImageValidity\\\" /><i></i>\\n </label>\\n </div>\\n </div>\\n <!-- !always-pull -->\\n </por-image-registry>\\n <!-- !image-and-registry -->\\n </div>\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Network ports configuration\\n </div>\\n <!-- publish-exposed-ports -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label class=\\\"control-label text-left\\\">\\n Publish all exposed network ports to random host ports\\n <portainer-tooltip\\n position=\\\"bottom\\\"\\n message=\\\"When enabled, Portainer will let Docker automatically map a random port on the host to each one defined in the image Dockerfile.\\\"\\n ></portainer-tooltip>\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\"> <input type=\\\"checkbox\\\" ng-model=\\\"config.HostConfig.PublishAllPorts\\\" /><i></i> </label>\\n </div>\\n </div>\\n <!-- !publish-exposed-ports -->\\n <!-- port-mapping -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label class=\\\"control-label text-left\\\">\\n Manual network port publishing\\n <portainer-tooltip\\n position=\\\"bottom\\\"\\n message=\\\"When a range of ports on the host and a single port on the container is specified, Docker will randomly choose a single available port in the defined range and forward that to the container port.\\\"\\n ></portainer-tooltip>\\n </label>\\n <span class=\\\"label label-default interactive\\\" style=\\\"margin-left: 10px;\\\" ng-click=\\\"addPortBinding()\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> publish a new network port\\n </span>\\n </div>\\n <!-- port-mapping-input-list -->\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\">\\n <div ng-repeat=\\\"portBinding in config.HostConfig.PortBindings\\\" style=\\\"margin-top: 2px;\\\">\\n <!-- host-port -->\\n <div class=\\\"input-group col-sm-4 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">host</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"portBinding.hostPort\\\" placeholder=\\\"e.g. 80, 80-88, ip:80 or ip:80-88 (optional)\\\" />\\n </div>\\n <!-- !host-port -->\\n <span style=\\\"margin: 0 10px 0 10px;\\\">\\n <i class=\\\"fa fa-long-arrow-alt-right\\\" aria-hidden=\\\"true\\\"></i>\\n </span>\\n <!-- container-port -->\\n <div class=\\\"input-group col-sm-4 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">container</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"portBinding.containerPort\\\" placeholder=\\\"e.g. 80 or 80-88\\\" />\\n </div>\\n <!-- !container-port -->\\n <!-- protocol-actions -->\\n <div class=\\\"input-group col-sm-3 input-group-sm\\\">\\n <div class=\\\"btn-group btn-group-sm\\\">\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"portBinding.protocol\\\" uib-btn-radio=\\\"'tcp'\\\">TCP</label>\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"portBinding.protocol\\\" uib-btn-radio=\\\"'udp'\\\">UDP</label>\\n </div>\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removePortBinding($index)\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n <!-- !protocol-actions -->\\n </div>\\n </div>\\n <!-- !port-mapping-input-list -->\\n </div>\\n <!-- !port-mapping -->\\n <div ng-if=\\\"applicationState.endpoint.mode.agentProxy && applicationState.endpoint.mode.provider === 'DOCKER_SWARM_MODE'\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Deployment\\n </div>\\n <!-- node-selection -->\\n <node-selector model=\\\"formValues.NodeName\\\"> </node-selector>\\n <!-- !node-selection -->\\n </div>\\n <!-- access-control -->\\n <por-access-control-form form-data=\\\"formValues.AccessControlData\\\" resource-control=\\\"fromContainer.ResourceControl\\\" ng-if=\\\"fromContainer\\\"></por-access-control-form>\\n <!-- !access-control -->\\n <!-- actions -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <!-- autoremove -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label for=\\\"ownership\\\" class=\\\"control-label text-left\\\">\\n Auto remove\\n <portainer-tooltip\\n position=\\\"bottom\\\"\\n message=\\\"When enabled, Portainer will automatically remove the container when it exits. This is useful when you want to use the container only once.\\\"\\n ></portainer-tooltip>\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\"> <input type=\\\"checkbox\\\" ng-model=\\\"config.HostConfig.AutoRemove\\\" /><i></i> </label>\\n </div>\\n </div>\\n <!-- !autoremove -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"state.actionInProgress || !formValues.RegistryModel.Image || (!formValues.RegistryModel.Registry && fromContainer)\\\"\\n ng-click=\\\"create()\\\"\\n button-spinner=\\\"state.actionInProgress\\\"\\n >\\n <span ng-hide=\\\"state.actionInProgress\\\">Deploy the container</span>\\n <span ng-show=\\\"state.actionInProgress\\\">Deployment in progress...</span>\\n </button>\\n <span class=\\\"text-danger\\\" ng-if=\\\"state.formValidationError\\\" style=\\\"margin-left: 5px;\\\">{{ state.formValidationError }}</span>\\n </div>\\n </div>\\n <!-- !actions -->\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-cog\\\" title-text=\\\"Advanced container settings\\\"></rd-widget-header>\\n <rd-widget-body>\\n <ul class=\\\"nav nav-pills nav-justified\\\">\\n <li class=\\\"active interactive\\\"><a data-target=\\\"#command\\\" data-toggle=\\\"tab\\\">Command & logging</a></li>\\n <li class=\\\"interactive\\\"><a data-target=\\\"#volumes\\\" data-toggle=\\\"tab\\\">Volumes</a></li>\\n <li class=\\\"interactive\\\"><a data-target=\\\"#network\\\" data-toggle=\\\"tab\\\">Network</a></li>\\n <li class=\\\"interactive\\\"><a data-target=\\\"#env\\\" data-toggle=\\\"tab\\\">Env</a></li>\\n <li class=\\\"interactive\\\"><a data-target=\\\"#labels\\\" data-toggle=\\\"tab\\\">Labels</a></li>\\n <li class=\\\"interactive\\\"><a data-target=\\\"#restart-policy\\\" data-toggle=\\\"tab\\\">Restart policy</a></li>\\n <li class=\\\"interactive\\\"><a data-target=\\\"#runtime-resources\\\" ng-click=\\\"refreshSlider()\\\" data-toggle=\\\"tab\\\">Runtime & Resources</a></li>\\n <li ng-if=\\\"areContainerCapabilitiesEnabled\\\" class=\\\"interactive\\\"><a data-target=\\\"#container-capabilities\\\" data-toggle=\\\"tab\\\">Capabilities</a></li>\\n </ul>\\n <!-- tab-content -->\\n <div class=\\\"tab-content\\\">\\n <!-- tab-command -->\\n <div class=\\\"tab-pane active\\\" id=\\\"command\\\">\\n <form class=\\\"form-horizontal\\\" style=\\\"margin-top: 15px;\\\">\\n <!-- command-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"container_command\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Command</label>\\n <div class=\\\"col-sm-9\\\">\\n <div class=\\\"input-group\\\">\\n <div class=\\\"input-group-btn\\\">\\n <button class=\\\"btn btn-primary\\\" ng-model=\\\"formValues.CmdMode\\\" uib-btn-radio=\\\"'default'\\\" style=\\\"margin-left: 0px;\\\"> Default</button>\\n <button class=\\\"btn btn-primary\\\" ng-model=\\\"formValues.CmdMode\\\" uib-btn-radio=\\\"'override'\\\">Override</button>\\n </div>\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"config.Cmd\\\"\\n ng-disabled=\\\"formValues.CmdMode === 'default'\\\"\\n id=\\\"container_command\\\"\\n placeholder=\\\"e.g. '-logtostderr' '--housekeeping_interval=5s' or /usr/bin/nginx -t -c /mynginx.conf\\\"\\n />\\n </div>\\n </div>\\n </div>\\n <!-- !command-input -->\\n <!-- entrypoint-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"container_entrypoint\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">\\n Entrypoint\\n <portainer-tooltip\\n position=\\\"bottom\\\"\\n message=\\\"When container entrypoint is entered as part of the Command field, set Entrypoint to Override mode and leave blank, else it will revert to default.\\\"\\n ></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-9\\\">\\n <div class=\\\"input-group\\\">\\n <div class=\\\"input-group-btn\\\">\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"formValues.EntrypointMode\\\" uib-btn-radio=\\\"'default'\\\" style=\\\"margin-left: 0px;\\\"> Default</label>\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"formValues.EntrypointMode\\\" uib-btn-radio=\\\"'override'\\\">Override</label>\\n </div>\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"config.Entrypoint\\\"\\n ng-disabled=\\\"formValues.EntrypointMode === 'default'\\\"\\n id=\\\"container_entrypoint\\\"\\n placeholder=\\\"e.g. /bin/sh -c\\\"\\n />\\n </div>\\n </div>\\n </div>\\n <!-- !entrypoint-input -->\\n <!-- workdir-user-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"container_workingdir\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Working Dir</label>\\n <div class=\\\"col-sm-4\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"config.WorkingDir\\\" id=\\\"container_workingdir\\\" placeholder=\\\"e.g. /myapp\\\" />\\n </div>\\n <label for=\\\"container_user\\\" class=\\\"col-sm-1 control-label text-left\\\">User</label>\\n <div class=\\\"col-sm-4\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"config.User\\\" id=\\\"container_user\\\" placeholder=\\\"e.g. nginx\\\" />\\n </div>\\n </div>\\n <!-- !workdir-user-input -->\\n <!-- console -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"container_console\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Console</label>\\n <div class=\\\"col-sm-10 col-lg-11\\\">\\n <div class=\\\"col-sm-4\\\">\\n <label class=\\\"radio-inline\\\">\\n <input type=\\\"radio\\\" name=\\\"container_console\\\" ng-model=\\\"formValues.Console\\\" value=\\\"both\\\" />\\n Interactive & TTY <span class=\\\"small text-muted\\\">(-i -t)</span>\\n </label>\\n </div>\\n <div class=\\\"col-sm-4\\\">\\n <label class=\\\"radio-inline\\\">\\n <input type=\\\"radio\\\" name=\\\"container_console\\\" ng-model=\\\"formValues.Console\\\" value=\\\"interactive\\\" />\\n Interactive <span class=\\\"small text-muted\\\">(-i)</span>\\n </label>\\n </div>\\n </div>\\n <div class=\\\"col-sm-offset-2 col-sm-10 col-lg-offset-1 col-lg-11\\\">\\n <div class=\\\"col-sm-4\\\">\\n <label class=\\\"radio-inline\\\">\\n <input type=\\\"radio\\\" name=\\\"container_console\\\" ng-model=\\\"formValues.Console\\\" value=\\\"tty\\\" />\\n TTY <span class=\\\"small text-muted\\\">(-t)</span>\\n </label>\\n </div>\\n <div class=\\\"col-sm-4\\\">\\n <label class=\\\"radio-inline\\\">\\n <input type=\\\"radio\\\" name=\\\"container_console\\\" ng-model=\\\"formValues.Console\\\" value=\\\"none\\\" />\\n None\\n </label>\\n </div>\\n </div>\\n </div>\\n <!-- !console -->\\n\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Logging\\n </div>\\n <!-- logging-driver -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"log-driver\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Driver</label>\\n <div class=\\\"col-sm-4\\\">\\n <select class=\\\"form-control\\\" ng-model=\\\"formValues.LogDriverName\\\" id=\\\"log-driver\\\">\\n <option selected value=\\\"\\\">Default logging driver</option>\\n <option ng-repeat=\\\"driver in availableLoggingDrivers\\\" ng-value=\\\"driver\\\">{{ driver }}</option>\\n <option value=\\\"none\\\">none</option>\\n </select>\\n </div>\\n <div class=\\\"col-sm-5\\\">\\n <p class=\\\"small text-muted\\\">\\n Logging driver that will override the default docker daemon driver. Select Default logging driver if you don't want to override it. Supported logging drivers\\n can be found <a href=\\\"https://docs.docker.com/engine/admin/logging/overview/#supported-logging-drivers\\\" target=\\\"_blank\\\">in the Docker documentation</a>.\\n </p>\\n </div>\\n </div>\\n <!-- !logging-driver -->\\n <!-- logging-opts -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 5px;\\\">\\n <label class=\\\"control-label text-left\\\">\\n Options\\n <portainer-tooltip\\n position=\\\"top\\\"\\n message=\\\"Add button is disabled unless a driver other than none or default is selected. Options are specific to the selected driver, refer to the driver documentation.\\\"\\n ></portainer-tooltip>\\n </label>\\n <span\\n class=\\\"label label-default interactive\\\"\\n style=\\\"margin-left: 10px;\\\"\\n ng-click=\\\"!formValues.LogDriverName || formValues.LogDriverName === 'none' || addLogDriverOpt(formValues.LogDriverName)\\\"\\n >\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add logging driver option\\n </span>\\n </div>\\n <!-- logging-opts-input-list -->\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\">\\n <div ng-repeat=\\\"opt in formValues.LogDriverOpts\\\" style=\\\"margin-top: 2px;\\\">\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">option</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"opt.name\\\" placeholder=\\\"e.g. FOO\\\" />\\n </div>\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">value</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"opt.value\\\" placeholder=\\\"e.g. bar\\\" />\\n </div>\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removeLogDriverOpt($index)\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n <!-- logging-opts-input-list -->\\n </div>\\n <!-- !logging-opts -->\\n </form>\\n </div>\\n <!-- !tab-command -->\\n <!-- tab-volume -->\\n <div class=\\\"tab-pane\\\" id=\\\"volumes\\\">\\n <form class=\\\"form-horizontal\\\" style=\\\"margin-top: 15px;\\\">\\n <!-- volumes -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 5px;\\\">\\n <label class=\\\"control-label text-left\\\">Volume mapping</label>\\n <span class=\\\"label label-default interactive\\\" style=\\\"margin-left: 10px;\\\" ng-click=\\\"addVolume()\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> map additional volume\\n </span>\\n </div>\\n <!-- volumes-input-list -->\\n <div class=\\\"form-inline\\\" style=\\\"margin-top: 10px;\\\">\\n <div ng-repeat=\\\"volume in formValues.Volumes\\\">\\n <!-- volume-line1 -->\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\">\\n <!-- container-path -->\\n <div class=\\\"input-group input-group-sm col-sm-6\\\">\\n <span class=\\\"input-group-addon\\\">container</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"volume.containerPath\\\" placeholder=\\\"e.g. /path/in/container\\\" />\\n </div>\\n <!-- !container-path -->\\n <!-- volume-type -->\\n <div class=\\\"input-group col-sm-5\\\" style=\\\"margin-left: 5px;\\\">\\n <div class=\\\"btn-group btn-group-sm\\\" ng-if=\\\"allowBindMounts\\\">\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"volume.type\\\" uib-btn-radio=\\\"'volume'\\\" ng-click=\\\"volume.name = ''\\\">Volume</label>\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"volume.type\\\" uib-btn-radio=\\\"'bind'\\\" ng-click=\\\"volume.name = ''\\\">Bind</label>\\n </div>\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removeVolume($index)\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n <!-- !volume-type -->\\n </div>\\n <!-- !volume-line1 -->\\n <!-- volume-line2 -->\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 5px;\\\">\\n <i class=\\\"fa fa-long-arrow-alt-right\\\" aria-hidden=\\\"true\\\"></i>\\n <!-- volume -->\\n <div class=\\\"input-group input-group-sm col-sm-6\\\" ng-if=\\\"volume.type === 'volume'\\\">\\n <span class=\\\"input-group-addon\\\">volume</span>\\n <select class=\\\"form-control\\\" ng-model=\\\"volume.name\\\">\\n <option selected disabled hidden value=\\\"\\\">Select a volume</option>\\n <option ng-repeat=\\\"vol in availableVolumes\\\" ng-value=\\\"vol.Name\\\">{{ vol.Name | truncate: 30 }} - {{ vol.Driver | truncate: 30 }}</option>\\n </select>\\n </div>\\n <!-- !volume -->\\n <!-- bind -->\\n <div class=\\\"input-group input-group-sm col-sm-6\\\" ng-if=\\\"volume.type === 'bind'\\\">\\n <span class=\\\"input-group-addon\\\">host</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"volume.name\\\" placeholder=\\\"e.g. /path/on/host\\\" />\\n </div>\\n <!-- !bind -->\\n <!-- read-only -->\\n <div class=\\\"input-group input-group-sm col-sm-5\\\" style=\\\"margin-left: 5px;\\\">\\n <div class=\\\"btn-group btn-group-sm\\\">\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"volume.readOnly\\\" uib-btn-radio=\\\"false\\\">Writable</label>\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"volume.readOnly\\\" uib-btn-radio=\\\"true\\\">Read-only</label>\\n </div>\\n </div>\\n <!-- !read-only -->\\n </div>\\n <!-- !volume-line2 -->\\n </div>\\n </div>\\n <!-- !volumes-input-list -->\\n </div>\\n </form>\\n <!-- !volumes -->\\n </div>\\n <!-- !tab-volume -->\\n <!-- tab-network -->\\n <div class=\\\"tab-pane\\\" id=\\\"network\\\">\\n <form class=\\\"form-horizontal\\\" style=\\\"margin-top: 15px;\\\">\\n <div class=\\\"form-group\\\" ng-if=\\\"globalNetworkCount === 0 && applicationState.endpoint.mode.provider !== 'DOCKER_SWARM_MODE'\\\">\\n <div class=\\\"col-sm-12\\\">\\n <span class=\\\"small text-muted\\\">You don't have any shared networks. Head over to the <a ui-sref=\\\"docker.networks\\\">networks view</a> to create one.</span>\\n </div>\\n </div>\\n <!-- network-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"container_network\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Network</label>\\n <div class=\\\"col-sm-9\\\">\\n <select\\n class=\\\"form-control\\\"\\n ng-options=\\\"net.Name as net.Name for net in availableNetworks\\\"\\n ng-model=\\\"config.HostConfig.NetworkMode\\\"\\n id=\\\"container_network\\\"\\n ng-change=\\\"resetNetworkConfig()\\\"\\n >\\n <option selected disabled hidden value=\\\"\\\">Select a network</option>\\n </select>\\n </div>\\n </div>\\n <!-- !network-input -->\\n <!-- container-name-input -->\\n <div class=\\\"form-group\\\" ng-if=\\\"config.HostConfig.NetworkMode == 'container'\\\">\\n <label for=\\\"container_network_container\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Container</label>\\n <div class=\\\"col-sm-9\\\">\\n <select ng-options=\\\"container|containername for container in runningContainers\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.NetworkContainer\\\">\\n <option selected disabled hidden value=\\\"\\\">Select a container</option>\\n </select>\\n </div>\\n </div>\\n <!-- !container-name-input -->\\n <!-- hostname-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"container_hostname\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Hostname</label>\\n <div class=\\\"col-sm-9\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"config.Hostname\\\" id=\\\"container_hostname\\\" placeholder=\\\"e.g. web01\\\" />\\n </div>\\n </div>\\n <!-- !hostname-input -->\\n <!-- domainname-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"container_domainname\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Domain Name</label>\\n <div class=\\\"col-sm-9\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"config.Domainname\\\" id=\\\"container_domainname\\\" placeholder=\\\"e.g. example.com\\\" />\\n </div>\\n </div>\\n <!-- !domainname -->\\n <!-- mac-address-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"container_macaddress\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Mac Address</label>\\n <div class=\\\"col-sm-9\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.MacAddress\\\" id=\\\"container_macaddress\\\" placeholder=\\\"e.g. 12-34-56-78-9a-bc\\\" />\\n </div>\\n </div>\\n <!-- !mac-address-input -->\\n <!-- ipv4-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"container_ipv4\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">IPv4 Address</label>\\n <div class=\\\"col-sm-9\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.IPv4\\\" id=\\\"container_ipv4\\\" placeholder=\\\"e.g. 172.20.0.7\\\" />\\n </div>\\n </div>\\n <!-- !ipv4-input -->\\n <!-- ipv6-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"container_ipv6\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">IPv6 Address</label>\\n <div class=\\\"col-sm-9\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.IPv6\\\" id=\\\"container_ipv6\\\" placeholder=\\\"e.g. a:b:c:d::1234\\\" />\\n </div>\\n </div>\\n <!-- !ipv6-input -->\\n <!-- dns-primary-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"container_dns_primary\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Primary DNS Server</label>\\n <div class=\\\"col-sm-9\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.DnsPrimary\\\" id=\\\"container_dns_primary\\\" placeholder=\\\"e.g. 1.1.1.1, 2606:4700:4700::1111\\\" />\\n </div>\\n </div>\\n <!-- !dns-primary-input -->\\n <!-- dns-secondary-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"container_dns_secondary\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Secondary DNS Server</label>\\n <div class=\\\"col-sm-9\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.DnsSecondary\\\" id=\\\"container_dns_secondary\\\" placeholder=\\\"e.g. 1.0.0.1, 2606:4700:4700::1001\\\" />\\n </div>\\n </div>\\n <!-- !dns-secondary-input -->\\n <!-- extra-hosts-variables -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 5px;\\\">\\n <label class=\\\"control-label text-left\\\">Hosts file entries</label>\\n <span class=\\\"label label-default interactive\\\" style=\\\"margin-left: 10px;\\\" ng-click=\\\"addExtraHost()\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add additional entry\\n </span>\\n </div>\\n <!-- extra-hosts-input-list -->\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\">\\n <div ng-repeat=\\\"variable in formValues.ExtraHosts\\\" style=\\\"margin-top: 2px;\\\">\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">value</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"variable.value\\\" placeholder=\\\"e.g. host:IP\\\" />\\n </div>\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removeExtraHost($index)\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n <!-- !extra-hosts-input-list -->\\n </div>\\n <!-- !extra-hosts-variables -->\\n </form>\\n </div>\\n <!-- !tab-network -->\\n <!-- tab-labels -->\\n <div class=\\\"tab-pane\\\" id=\\\"labels\\\">\\n <form class=\\\"form-horizontal\\\" style=\\\"margin-top: 15px;\\\">\\n <!-- labels -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 5px;\\\">\\n <label class=\\\"control-label text-left\\\">Labels</label>\\n <span class=\\\"label label-default interactive\\\" style=\\\"margin-left: 10px;\\\" ng-click=\\\"addLabel()\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add label\\n </span>\\n </div>\\n <!-- labels-input-list -->\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\">\\n <div ng-repeat=\\\"label in formValues.Labels\\\" style=\\\"margin-top: 2px;\\\">\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">name</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"label.name\\\" placeholder=\\\"e.g. com.example.foo\\\" />\\n </div>\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">value</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"label.value\\\" placeholder=\\\"e.g. bar\\\" />\\n </div>\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removeLabel($index)\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n <!-- !labels-input-list -->\\n </div>\\n <!-- !labels-->\\n </form>\\n </div>\\n <!-- !tab-labels -->\\n <!-- tab-env -->\\n <div class=\\\"tab-pane\\\" id=\\\"env\\\">\\n <environment-variables-panel\\n ng-model=\\\"formValues.Env\\\"\\n explanation=\\\"These values will be applied to the container when deployed\\\"\\n on-change=\\\"(handleEnvVarChange)\\\"\\n ></environment-variables-panel>\\n </div>\\n <!-- !tab-env -->\\n <!-- tab-restart-policy -->\\n <div class=\\\"tab-pane\\\" id=\\\"restart-policy\\\">\\n <form class=\\\"form-horizontal\\\" style=\\\"margin-top: 15px;\\\">\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label class=\\\"control-label text-left\\\">\\n Restart policy\\n </label>\\n <div class=\\\"btn-group btn-group-sm\\\" style=\\\"margin-left: 20px;\\\">\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"config.HostConfig.RestartPolicy.Name\\\" uib-btn-radio=\\\"'no'\\\">\\n Never\\n </label>\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"config.HostConfig.RestartPolicy.Name\\\" uib-btn-radio=\\\"'always'\\\">\\n Always\\n </label>\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"config.HostConfig.RestartPolicy.Name\\\" uib-btn-radio=\\\"'on-failure'\\\">\\n On failure\\n </label>\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"config.HostConfig.RestartPolicy.Name\\\" uib-btn-radio=\\\"'unless-stopped'\\\">\\n Unless stopped\\n </label>\\n </div>\\n </div>\\n </div>\\n </form>\\n </div>\\n <!-- !tab-restart-policy -->\\n <!-- tab-runtime-resources -->\\n <div class=\\\"tab-pane\\\" id=\\\"runtime-resources\\\">\\n <form class=\\\"form-horizontal\\\" style=\\\"margin-top: 15px;\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Runtime\\n </div>\\n <!-- privileged-mode -->\\n <div class=\\\"form-group\\\" ng-if=\\\"isAdmin || allowPrivilegedMode\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label for=\\\"privileged_mode\\\" class=\\\"control-label text-left\\\">\\n Privileged mode\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\"> <input type=\\\"checkbox\\\" name=\\\"privileged_mode\\\" ng-model=\\\"config.HostConfig.Privileged\\\" /><i></i> </label>\\n </div>\\n </div>\\n <!-- !privileged-mode -->\\n <!-- init -->\\n <div class=\\\"form-group\\\" ng-if=\\\"applicationState.endpoint.apiVersion >= 1.37\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label for=\\\"init\\\" class=\\\"control-label text-left\\\">\\n Init\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\"> <input type=\\\"checkbox\\\" name=\\\"init\\\" ng-model=\\\"config.HostConfig.Init\\\" /><i></i> </label>\\n </div>\\n </div>\\n <!-- !init -->\\n <!-- runtimes -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"container_runtime\\\" class=\\\"col-sm-1 control-label text-left\\\">Runtime</label>\\n <div class=\\\"col-sm-11\\\">\\n <select class=\\\"form-control\\\" ng-model=\\\"config.HostConfig.Runtime\\\" id=\\\"container_runtime\\\" ng-options=\\\"runtime for runtime in availableRuntimes\\\">\\n <option selected value=\\\"\\\">Default</option>\\n </select>\\n </div>\\n </div>\\n <!-- !runtimes -->\\n </form>\\n <form class=\\\"form-horizontal\\\" style=\\\"margin-top: 15px;\\\">\\n <!-- devices -->\\n <div ng-if=\\\"showDeviceMapping\\\" class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 5px;\\\">\\n <label class=\\\"control-label text-left\\\">Devices</label>\\n <span class=\\\"label label-default interactive\\\" style=\\\"margin-left: 10px;\\\" ng-click=\\\"addDevice()\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add device\\n </span>\\n </div>\\n <!-- devices-input-list -->\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\">\\n <div ng-repeat=\\\"device in config.HostConfig.Devices\\\" style=\\\"margin-top: 2px;\\\">\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">host</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"device.pathOnHost\\\" placeholder=\\\"e.g. /dev/tty0\\\" />\\n </div>\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">container</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"device.pathInContainer\\\" placeholder=\\\"e.g. /dev/tty0\\\" />\\n </div>\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removeDevice($index)\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n <!-- !devices-input-list -->\\n </div>\\n <!-- !devices-->\\n <!-- sysctls -->\\n <div ng-if=\\\"showSysctls\\\" class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 5px;\\\">\\n <label class=\\\"control-label text-left\\\">Sysctls</label>\\n <span class=\\\"label label-default interactive\\\" style=\\\"margin-left: 10px;\\\" ng-click=\\\"addSysctl()\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add sysctl\\n </span>\\n </div>\\n <!-- sysctls-input-list -->\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\">\\n <div ng-repeat=\\\"sysctl in formValues.Sysctls\\\" style=\\\"margin-top: 2px;\\\">\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">name</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"sysctl.name\\\" placeholder=\\\"e.g. FOO\\\" />\\n </div>\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">value</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"sysctl.value\\\" placeholder=\\\"e.g. bar\\\" />\\n </div>\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removeSysctl($index)\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n <!-- !sysctls-input-list -->\\n </div>\\n <!-- !sysctls -->\\n <div ng-class=\\\"{ 'edit-resources': state.mode == 'duplicate' }\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Resources\\n </div>\\n <!-- memory-reservation-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"memory-reservation\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left mt-20\\\">\\n Memory reservation\\n </label>\\n <div class=\\\"col-sm-3\\\">\\n <slider\\n on-change=\\\"(handleResourceChange)\\\"\\n model=\\\"formValues.MemoryReservation\\\"\\n floor=\\\"0\\\"\\n ceil=\\\"state.sliderMaxMemory\\\"\\n step=\\\"256\\\"\\n ng-if=\\\"state.sliderMaxMemory\\\"\\n ></slider>\\n </div>\\n <div class=\\\"col-sm-2\\\">\\n <input type=\\\"number\\\" min=\\\"0\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.MemoryReservation\\\" id=\\\"memory-reservation\\\" />\\n </div>\\n <div class=\\\"col-sm-4\\\">\\n <p class=\\\"small text-muted mt-7\\\">\\n Memory soft limit (<b>MB</b>)\\n </p>\\n </div>\\n </div>\\n <!-- !memory-reservation-input -->\\n <!-- memory-limit-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"memory-limit\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left mt-20\\\">\\n Memory limit\\n </label>\\n <div class=\\\"col-sm-3\\\">\\n <slider\\n on-change=\\\"(handleResourceChange)\\\"\\n model=\\\"formValues.MemoryLimit\\\"\\n floor=\\\"0\\\"\\n ceil=\\\"state.sliderMaxMemory\\\"\\n step=\\\"256\\\"\\n ng-if=\\\"state.sliderMaxMemory\\\"\\n ></slider>\\n </div>\\n <div class=\\\"col-sm-2\\\">\\n <input type=\\\"number\\\" min=\\\"0\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.MemoryLimit\\\" id=\\\"memory-limit\\\" />\\n </div>\\n <div class=\\\"col-sm-4\\\">\\n <p class=\\\"small text-muted mt-7\\\">\\n Memory limit (<b>MB</b>)\\n </p>\\n </div>\\n </div>\\n <!-- !memory-limit-input -->\\n <!-- cpu-limit-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"cpu-limit\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left mt-20\\\">\\n CPU limit\\n </label>\\n <div class=\\\"col-sm-5\\\">\\n <slider\\n on-change=\\\"(handleResourceChange)\\\"\\n model=\\\"formValues.CpuLimit\\\"\\n floor=\\\"0\\\"\\n ceil=\\\"state.sliderMaxCpu\\\"\\n step=\\\"0.25\\\"\\n precision=\\\"2\\\"\\n ng-if=\\\"state.sliderMaxCpu\\\"\\n ></slider>\\n </div>\\n <div class=\\\"col-sm-4 mt-20\\\">\\n <p class=\\\"small text-muted\\\">\\n Maximum CPU usage\\n </p>\\n </div>\\n </div>\\n <!-- !cpu-limit-input -->\\n\\n <!-- update-limit-btn -->\\n <div class=\\\"form-group\\\" ng-if=\\\"state.mode == 'duplicate'\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"state.actionInProgress || !formValues.RegistryModel.Image || (!formValues.RegistryModel.Registry && fromContainer)\\\"\\n ng-click=\\\"update()\\\"\\n button-spinner=\\\"state.actionInProgress\\\"\\n >\\n <span ng-hide=\\\"state.actionInProgress\\\">Update Limits</span>\\n <span ng-show=\\\"state.actionInProgress\\\">Update in progress...</span>\\n </button>\\n </div>\\n <div class=\\\"col-sm-12\\\" ng-if=\\\"state.settingUnlimitedResources\\\">\\n <p class=\\\"text-muted mr-4\\\">\\n <i class=\\\"fa fa-exclamation-circle text-warning mt-10\\\" aria-hidden=\\\"true\\\"></i> Updating any resource value to ‘unlimited' will redeploy this container.\\n </p>\\n </div>\\n </div>\\n <!-- !update-limit-btn -->\\n </div>\\n </form>\\n </div>\\n <!-- !tab-runtime-resources -->\\n <!-- tab-container-capabilities -->\\n <div class=\\\"tab-pane\\\" id=\\\"container-capabilities\\\">\\n <container-capabilities capabilities=\\\"formValues.capabilities\\\"></container-capabilities>\\n </div>\\n <!-- !tab-container-capabilities -->\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/containers/inspect/containerinspect.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Container inspect\\\"> </rd-header-title>\\n <rd-header-content>\\n <a ui-sref=\\\"docker.containers\\\">Containers</a> > <a ui-sref=\\\"docker.containers.container({id: containerInfo.Id})\\\">{{ containerInfo.Name | trimcontainername }}</a> >\\n Inspect\\n </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-circle\\\" title-text=\\\"Inspect\\\">\\n <span class=\\\"btn-group btn-group-sm\\\">\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"state.DisplayTextView\\\" uib-btn-radio=\\\"false\\\"><i class=\\\"fa fa-code space-right\\\" aria-hidden=\\\"true\\\"></i>Tree</label>\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"state.DisplayTextView\\\" uib-btn-radio=\\\"true\\\"><i class=\\\"fa fa-file-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Text</label>\\n </span>\\n </rd-widget-header>\\n <rd-widget-body>\\n <pre ng-show=\\\"state.DisplayTextView\\\">{{ containerInfo | json: 4 }}</pre>\\n <json-tree ng-hide=\\\"state.DisplayTextView\\\" object=\\\"containerInfo\\\" root-name=\\\"containerInfo.Id\\\" start-expanded=\\\"true\\\"></json-tree>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/containers/logs/containerlogs.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Container logs\\\"></rd-header-title>\\n <rd-header-content>\\n <a ui-sref=\\\"docker.containers\\\">Containers</a> > <a ui-sref=\\\"docker.containers.container({id: container.Id})\\\">{{ container.Name | trimcontainername }}</a> > Logs\\n </rd-header-content>\\n</rd-header>\\n\\n<log-viewer\\n data=\\\"logs\\\"\\n ng-if=\\\"logs\\\"\\n log-collection-change=\\\"changeLogCollection\\\"\\n display-timestamps=\\\"state.displayTimestamps\\\"\\n line-count=\\\"state.lineCount\\\"\\n since-timestamp=\\\"state.sinceTimestamp\\\"\\n resource-name=\\\"container.Name\\\"\\n></log-viewer>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/containers/stats/containerstats.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Container statistics\\\"></rd-header-title>\\n <rd-header-content>\\n <a ui-sref=\\\"docker.containers\\\">Containers</a> > <a ui-sref=\\\"docker.containers.container({id: container.Id})\\\">{{ container.Name | trimcontainername }}</a> > Stats\\n </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-md-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-info-circle\\\" title-text=\\\"About statistics\\\"> </rd-widget-header>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\">\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <span class=\\\"small text-muted\\\">\\n This view displays real-time statistics about the container <b>{{ container.Name | trimcontainername }}</b> as well as a list of the running processes inside this\\n container.\\n </span>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\">\\n <label for=\\\"refreshRate\\\" class=\\\"col-sm-3 col-md-2 col-lg-2 margin-sm-top control-label text-left\\\">\\n Refresh rate\\n </label>\\n <div class=\\\"col-sm-3 col-md-2\\\">\\n <select id=\\\"refreshRate\\\" ng-model=\\\"state.refreshRate\\\" ng-change=\\\"changeUpdateRepeater()\\\" class=\\\"form-control\\\">\\n <option value=\\\"1\\\">1s</option>\\n <option value=\\\"3\\\">3s</option>\\n <option value=\\\"5\\\">5s</option>\\n <option value=\\\"10\\\">10s</option>\\n <option value=\\\"30\\\">30s</option>\\n <option value=\\\"60\\\">60s</option>\\n </select>\\n </div>\\n <span>\\n <i id=\\\"refreshRateChange\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-top: 7px; display: none;\\\"></i>\\n </span>\\n </div>\\n <div class=\\\"form-group\\\" ng-if=\\\"state.networkStatsUnavailable\\\">\\n <div class=\\\"col-sm-12\\\">\\n <span class=\\\"small text-muted\\\"> <i class=\\\"fa fa-exclamation-triangle orange-icon\\\" aria-hidden=\\\"true\\\"></i> Network stats are unavailable for this container. </span>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-if=\\\"state.ioStatsUnavailable\\\">\\n <div class=\\\"col-sm-12\\\">\\n <span class=\\\"small text-muted\\\"> <i class=\\\"fa fa-exclamation-triangle orange-icon\\\" aria-hidden=\\\"true\\\"></i> I/O stats are unavailable for this container. </span>\\n </div>\\n </div>\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-lg-6 col-md-6 col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-chart-area\\\" title-text=\\\"Memory usage\\\"></rd-widget-header>\\n <rd-widget-body>\\n <div class=\\\"chart-container\\\" style=\\\"position: relative;\\\">\\n <canvas id=\\\"memoryChart\\\" width=\\\"770\\\" height=\\\"300\\\"></canvas>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n\\n <div class=\\\"col-lg-6 col-md-6 col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-chart-area\\\" title-text=\\\"CPU usage\\\"></rd-widget-header>\\n <rd-widget-body>\\n <div class=\\\"chart-container\\\" style=\\\"position: relative;\\\">\\n <canvas id=\\\"cpuChart\\\" width=\\\"770\\\" height=\\\"300\\\"></canvas>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n\\n <div class=\\\"col-lg-6 col-md-6 col-sm-12\\\" ng-if=\\\"!state.networkStatsUnavailable\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-chart-area\\\" title-text=\\\"Network usage (aggregate)\\\"></rd-widget-header>\\n <rd-widget-body>\\n <div class=\\\"chart-container\\\" style=\\\"position: relative;\\\">\\n <canvas id=\\\"networkChart\\\" width=\\\"770\\\" height=\\\"300\\\"></canvas>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n\\n <div class=\\\"col-lg-6 col-md-6 col-sm-12\\\" ng-if=\\\"!state.ioStatsUnavailable\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-chart-area\\\" title-text=\\\"I/O usage (aggregate)\\\"></rd-widget-header>\\n <rd-widget-body>\\n <div class=\\\"chart-container\\\" style=\\\"position: relative;\\\">\\n <canvas id=\\\"ioChart\\\" width=\\\"770\\\" height=\\\"300\\\"></canvas>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <container-processes-datatable\\n title-text=\\\"Processes\\\"\\n title-icon=\\\"fa-tasks\\\"\\n dataset=\\\"processInfo.Processes\\\"\\n headerset=\\\"processInfo.Titles\\\"\\n table-key=\\\"container-processes\\\"\\n ></container-processes-datatable>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/dashboard/dashboard.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Dashboard\\\"></rd-header-title>\\n <rd-header-content>Environment summary</rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\" ng-if=\\\"applicationState.endpoint.mode.agentProxy && applicationState.endpoint.mode.provider === 'DOCKER_SWARM_MODE'\\\">\\n <div class=\\\"col-sm-12\\\">\\n <dashboard-cluster-agent-info></dashboard-cluster-agent-info>\\n </div>\\n</div>\\n<information-panel-offline ng-if=\\\"offlineMode\\\"></information-panel-offline>\\n<information-panel\\n ng-if=\\\"\\n !applicationState.UI.dismissedInfoPanels['docker-dashboard-info-01'] &&\\n !applicationState.endpoint.mode.agentProxy &&\\n applicationState.endpoint.mode.provider === 'DOCKER_SWARM_MODE'\\n \\\"\\n title-text=\\\"Information\\\"\\n dismiss-action=\\\"dismissInformationPanel('docker-dashboard-info-01')\\\"\\n>\\n <span class=\\\"small\\\">\\n <p class=\\\"text-muted\\\" ng-if=\\\"applicationState.endpoint.mode.role === 'MANAGER'\\\">\\n <i class=\\\"fa fa-exclamation-circle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Portainer is connected to a node that is part of a Swarm cluster. Some resources located on other nodes in the cluster might not be available for management, have a look at\\n <a href=\\\"http://portainer.readthedocs.io/en/stable/agent.html\\\" target=\\\"_blank\\\">our agent setup</a> for more details.\\n </p>\\n <p class=\\\"text-muted\\\" ng-if=\\\"applicationState.endpoint.mode.role === 'WORKER'\\\">\\n <i class=\\\"fa fa-exclamation-circle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Portainer is connected to a worker node. Swarm management features will not be available.\\n </p>\\n </span>\\n</information-panel>\\n\\n<div class=\\\"row\\\" ng-if=\\\"(!applicationState.endpoint.mode.agentProxy || applicationState.endpoint.mode.provider !== 'DOCKER_SWARM_MODE') && info && endpoint\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-tachometer-alt\\\" title-text=\\\"Environment info\\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr>\\n <td>Environment</td>\\n <td>\\n {{ endpoint.Name }}\\n <span class=\\\"small text-muted space-left\\\">\\n <i class=\\\"fa fa-microchip\\\"></i> {{ endpoint.Snapshots[0].TotalCPU }} <i class=\\\"fa fa-memory space-left\\\"></i> {{ endpoint.Snapshots[0].TotalMemory | humansize }}\\n </span>\\n <span class=\\\"small text-muted\\\">\\n - {{ info.Swarm && info.Swarm.NodeID !== '' ? 'Swarm' : 'Standalone' }} {{ info.ServerVersion }}\\n <span ng-if=\\\"endpoint.Type === 2\\\">+ <i class=\\\"fa fa-bolt\\\" aria-hidden=\\\"true\\\"></i> Agent</span></span\\n >\\n </td>\\n </tr>\\n <tr>\\n <td>URL</td>\\n <td>{{ endpoint.URL | stripprotocol }}</td>\\n </tr>\\n <tr>\\n <td>Tags</td>\\n <td>{{ endpointTags }}</td>\\n </tr>\\n <tr ng-if=\\\"applicationState.endpoint.mode.provider === 'DOCKER_SWARM_MODE' && applicationState.endpoint.mode.role === 'MANAGER'\\\">\\n <td colspan=\\\"2\\\">\\n <div class=\\\"btn-group\\\" role=\\\"group\\\" aria-label=\\\"...\\\">\\n <a ui-sref=\\\"docker.swarm.visualizer\\\"><i class=\\\"fa fa-object-group space-right\\\" aria-hidden=\\\"true\\\"></i>Go to cluster visualizer</a>\\n </div>\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-xs-12 col-md-6\\\" ng-if=\\\"showStacks\\\">\\n <a ui-sref=\\\"docker.stacks\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <div class=\\\"widget-icon blue pull-left\\\">\\n <i class=\\\"fa fa-th-list\\\"></i>\\n </div>\\n <div class=\\\"title\\\">{{ stackCount }}</div>\\n <div class=\\\"comment\\\">{{ stackCount === 1 ? 'Stack' : 'Stacks' }}</div>\\n </rd-widget-body>\\n </rd-widget>\\n </a>\\n </div>\\n <div class=\\\"col-xs-12 col-md-6\\\" ng-if=\\\"applicationState.endpoint.mode.provider === 'DOCKER_SWARM_MODE' && applicationState.endpoint.mode.role === 'MANAGER'\\\">\\n <a ui-sref=\\\"docker.services\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <div class=\\\"widget-icon blue pull-left\\\">\\n <i class=\\\"fa fa-list-alt\\\"></i>\\n </div>\\n <div class=\\\"title\\\">{{ serviceCount }}</div>\\n <div class=\\\"comment\\\">{{ serviceCount === 1 ? 'Service' : 'Services' }}</div>\\n </rd-widget-body>\\n </rd-widget>\\n </a>\\n </div>\\n <div class=\\\"col-xs-12 col-md-6\\\" ng-if=\\\"containers\\\">\\n <a ui-sref=\\\"docker.containers\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <div class=\\\"widget-icon blue pull-left\\\">\\n <i class=\\\"fa fa-cubes\\\"></i>\\n </div>\\n <div class=\\\"pull-right\\\" style=\\\"padding-left: 5px;\\\">\\n <div><i class=\\\"fa fa-power-off space-right green-icon\\\"></i>{{ containers | runningcontainers }} running</div>\\n <div><i class=\\\"fa fa-power-off space-right red-icon\\\"></i>{{ containers | stoppedcontainers }} stopped</div>\\n </div>\\n <div class=\\\"pull-right\\\" style=\\\"padding-right: 5px;\\\">\\n <div><i class=\\\"fa fa-heartbeat space-right green-icon\\\"></i>{{ containers | healthycontainers }} healthy</div>\\n <div><i class=\\\"fa fa-heartbeat space-right orange-icon\\\"></i>{{ containers | unhealthycontainers }} unhealthy</div>\\n </div>\\n <div class=\\\"title\\\">{{ containers.length }}</div>\\n <div class=\\\"comment\\\">{{ containers.length === 1 ? 'Container' : 'Containers' }}</div>\\n </rd-widget-body>\\n </rd-widget>\\n </a>\\n </div>\\n <div class=\\\"col-xs-12 col-md-6\\\" ng-if=\\\"images\\\">\\n <a ui-sref=\\\"docker.images\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <div class=\\\"widget-icon blue pull-left\\\">\\n <i class=\\\"fa fa-clone\\\"></i>\\n </div>\\n <div class=\\\"pull-right\\\">\\n <div><i class=\\\"fa fa-chart-pie space-right\\\"></i>{{ images | imagestotalsize | humansize }}</div>\\n </div>\\n <div class=\\\"title\\\">{{ images.length }}</div>\\n <div class=\\\"comment\\\">{{ images.length === 1 ? 'Image' : 'Images' }}</div>\\n </rd-widget-body>\\n </rd-widget>\\n </a>\\n </div>\\n <div class=\\\"col-xs-12 col-md-6\\\">\\n <a ui-sref=\\\"docker.volumes\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <div class=\\\"widget-icon blue pull-left\\\">\\n <i class=\\\"fa fa-hdd\\\"></i>\\n </div>\\n <div class=\\\"title\\\">{{ volumeCount }}</div>\\n <div class=\\\"comment\\\">{{ volumeCount === 1 ? 'Volume' : 'Volumes' }}</div>\\n </rd-widget-body>\\n </rd-widget>\\n </a>\\n </div>\\n <div class=\\\"col-xs-12 col-md-6\\\">\\n <a ui-sref=\\\"docker.networks\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <div class=\\\"widget-icon blue pull-left\\\">\\n <i class=\\\"fa fa-sitemap\\\"></i>\\n </div>\\n <div class=\\\"title\\\">{{ networkCount }}</div>\\n <div class=\\\"comment\\\">{{ networkCount === 1 ? 'Network' : 'Networks' }}</div>\\n </rd-widget-body>\\n </rd-widget>\\n </a>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/events/events.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Event list\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"Refresh\\\" ui-sref=\\\"docker.events\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content>Events</rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <events-datatable title-text=\\\"Events\\\" title-icon=\\\"fa-history\\\" dataset=\\\"events\\\" table-key=\\\"events\\\" order-by=\\\"Time\\\" reverse-order=\\\"true\\\"></events-datatable>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/images/images.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Image list\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"Refresh\\\" ui-sref=\\\"docker.images\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content>Images</rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\" ng-if=\\\"!offlineMode\\\" authorization=\\\"DockerImageCreate\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-download\\\" title-text=\\\"Pull image \\\"> </rd-widget-header>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\">\\n <!-- image-and-registry -->\\n <por-image-registry\\n model=\\\"formValues.RegistryModel\\\"\\n auto-complete=\\\"true\\\"\\n label-class=\\\"col-sm-1\\\"\\n input-class=\\\"col-sm-11\\\"\\n endpoint=\\\"endpoint\\\"\\n is-admin=\\\"isAdmin\\\"\\n set-validity=\\\"setPullImageValidity\\\"\\n check-rate-limits=\\\"true\\\"\\n >\\n <div ng-if=\\\"applicationState.endpoint.mode.agentProxy && applicationState.endpoint.mode.provider === 'DOCKER_SWARM_MODE'\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Deployment\\n </div>\\n <!-- node-selection -->\\n <node-selector model=\\\"formValues.NodeName\\\"> </node-selector>\\n <!-- !node-selection -->\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"state.actionInProgress || !formValues.RegistryModel.Image || !state.pullRateValid\\\"\\n ng-click=\\\"pullImage()\\\"\\n button-spinner=\\\"state.actionInProgress\\\"\\n >\\n <span ng-hide=\\\"state.actionInProgress\\\">Pull the image</span>\\n <span ng-show=\\\"state.actionInProgress\\\">Download in progress...</span>\\n </button>\\n </div>\\n </div>\\n </por-image-registry>\\n <!-- !image-and-registry -->\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n<information-panel-offline ng-if=\\\"offlineMode\\\"></information-panel-offline>\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <images-datatable\\n title-text=\\\"Images\\\"\\n title-icon=\\\"fa-clone\\\"\\n dataset=\\\"images\\\"\\n table-key=\\\"images\\\"\\n order-by=\\\"RepoTags\\\"\\n show-host-column=\\\"applicationState.endpoint.mode.agentProxy && applicationState.endpoint.mode.provider === 'DOCKER_SWARM_MODE'\\\"\\n download-action=\\\"downloadAction\\\"\\n remove-action=\\\"removeAction\\\"\\n force-remove-action=\\\"confirmRemovalAction\\\"\\n export-in-progress=\\\"state.exportInProgress\\\"\\n offline-mode=\\\"offlineMode\\\"\\n refresh-callback=\\\"getImages\\\"\\n ></images-datatable>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/images/edit/image.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Image details\\\"></rd-header-title>\\n <rd-header-content>\\n <a ui-sref=\\\"docker.images\\\">Images</a> > <a ui-sref=\\\"docker.images.image({id: image.Id})\\\">{{ image.Id }}</a>\\n </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\" ng-if=\\\"image.RepoTags.length > 0\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa fa-tags\\\" title-text=\\\"Image tags\\\"></rd-widget-header>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\">\\n <div class=\\\"form-group\\\">\\n <div class=\\\"row\\\">\\n <div class=\\\"pull-left\\\" ng-repeat=\\\"tag in image.RepoTags\\\" style=\\\"display: table;\\\">\\n <div class=\\\"input-group col-md-1\\\" style=\\\"padding: 0 15px;\\\">\\n <span class=\\\"input-group-addon\\\">{{ tag }}</span>\\n <span class=\\\"input-group-btn\\\" authorization=\\\"DockerImagePush, DockerImageCreate, DockerImageDelete\\\">\\n <a data-toggle=\\\"tooltip\\\" class=\\\"btn btn-primary interactive\\\" title=\\\"Push to registry\\\" ng-click=\\\"pushTag(tag)\\\" authorization=\\\"DockerImagePush\\\">\\n <span class=\\\"fa fa-upload white-icon\\\" aria-hidden=\\\"true\\\"></span>\\n </a>\\n <a data-toggle=\\\"tooltip\\\" class=\\\"btn btn-primary interactive\\\" title=\\\"Pull from registry\\\" ng-click=\\\"pullTag(tag)\\\" authorization=\\\"DockerImageCreate\\\">\\n <span class=\\\"fa fa-download white-icon\\\" aria-hidden=\\\"true\\\"></span>\\n </a>\\n <a data-toggle=\\\"tooltip\\\" class=\\\"btn btn-primary interactive\\\" title=\\\"Remove tag\\\" ng-click=\\\"removeTag(tag)\\\" authorization=\\\"DockerImageDelete\\\">\\n <span class=\\\"fa fa-trash-alt white-icon\\\" aria-hidden=\\\"true\\\"></span>\\n </a>\\n </span>\\n </div>\\n </div>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <span class=\\\"small text-muted\\\">\\n Note: you can click on the upload icon <span class=\\\"fa fa-upload\\\" aria-hidden=\\\"true\\\"></span> to push an image or on the download icon\\n <span class=\\\"fa fa-download\\\" aria-hidden=\\\"true\\\"></span> to pull an image or on the trash icon <span class=\\\"fa fa-trash-alt\\\" aria-hidden=\\\"true\\\"></span> to delete a\\n tag.\\n </span>\\n </div>\\n <div class=\\\"col-sm-12\\\">\\n <span id=\\\"downloadResourceHint\\\" class=\\\"createResource\\\" style=\\\"display: none; margin-left: 0;\\\">\\n Download in progress...\\n <i class=\\\"fa fa-circle-notch fa-spin\\\" aria-hidden=\\\"true\\\" style=\\\"margin-left: 2px;\\\"></i>\\n </span>\\n <span id=\\\"uploadResourceHint\\\" class=\\\"createResource\\\" style=\\\"display: none; margin-left: 0;\\\">\\n Upload in progress...\\n <i class=\\\"fa fa-circle-notch fa-spin\\\" aria-hidden=\\\"true\\\" style=\\\"margin-left: 2px;\\\"></i>\\n </span>\\n </div>\\n </div>\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\\n<div class=\\\"row\\\" authorization=\\\"DockerImageCreate\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-tag\\\" title-text=\\\"Tag the image\\\"></rd-widget-header>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\">\\n <!-- image-and-registry -->\\n <por-image-registry\\n model=\\\"formValues.RegistryModel\\\"\\n label-class=\\\"col-sm-1\\\"\\n input-class=\\\"col-sm-11\\\"\\n endpoint=\\\"endpoint\\\"\\n is-admin=\\\"isAdmin\\\"\\n set-validity=\\\"setPullImageValidity\\\"\\n check-rate-limits=\\\"true\\\"\\n ></por-image-registry>\\n <!-- !image-and-registry -->\\n <!-- tag-note -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <span class=\\\"small text-muted\\\">Note: if you don't specify the tag in the image name, <span class=\\\"label label-default\\\">latest</span> will be used.</span>\\n </div>\\n </div>\\n <!-- !tag-note -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-primary btn-sm\\\" ng-disabled=\\\"!formValues.RegistryModel.Image\\\" ng-click=\\\"tagImage()\\\">Tag</button>\\n </div>\\n </div>\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-clone\\\" title-text=\\\"Image details\\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr>\\n <td>ID</td>\\n <td>\\n {{ image.Id }}\\n <button authorization=\\\"DockerImageDelete\\\" class=\\\"btn btn-xs btn-danger\\\" ng-click=\\\"removeImage(image.Id)\\\"\\n ><i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Delete this image</button\\n >\\n <button\\n authorization=\\\"DockerImageGet\\\"\\n class=\\\"btn btn-xs btn-primary\\\"\\n ng-click=\\\"exportImage(image)\\\"\\n button-spinner=\\\"$ctrl.exportInProgress\\\"\\n ng-disabled=\\\"state.exportInProgress\\\"\\n >\\n <i class=\\\"fa fa-download space-right\\\" aria-hidden=\\\"true\\\"></i>\\n <span ng-hide=\\\"state.exportInProgress\\\">Export this image</span>\\n <span ng-show=\\\"state.exportInProgress\\\">Export in progress...</span>\\n </button>\\n </td>\\n </tr>\\n <tr ng-if=\\\"image.Parent\\\">\\n <td>Parent</td>\\n <td\\n ><a ui-sref=\\\"docker.images.image({id: image.Parent})\\\">{{ image.Parent }}</a></td\\n >\\n </tr>\\n <tr>\\n <td>Size</td>\\n <td>{{ image.VirtualSize | humansize }}</td>\\n </tr>\\n <tr>\\n <td>Created</td>\\n <td>{{ image.Created | getisodate }}</td>\\n </tr>\\n <tr>\\n <td>Build</td>\\n <td>Docker {{ image.DockerVersion }} on {{ image.Os }}, {{ image.Architecture }}</td>\\n </tr>\\n <tr ng-if=\\\"!(image.Labels | emptyobject)\\\">\\n <td>Labels</td>\\n <td>\\n <table class=\\\"table table-bordered table-condensed\\\">\\n <tr ng-repeat=\\\"(k, v) in image.Labels\\\">\\n <td>{{ k }}</td>\\n <td>{{ v }}</td>\\n </tr>\\n </table>\\n </td>\\n </tr>\\n <tr ng-if=\\\"image.Author\\\">\\n <td>Author</td>\\n <td>{{ image.Author }}</td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-clone\\\" title-text=\\\"Dockerfile details\\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr>\\n <td>CMD</td>\\n <td\\n ><code>{{ image.Command | command }}</code></td\\n >\\n </tr>\\n <tr ng-if=\\\"image.Entrypoint\\\">\\n <td>ENTRYPOINT</td>\\n <td\\n ><code>{{ image.Entrypoint | command }}</code></td\\n >\\n </tr>\\n <tr ng-if=\\\"image.ExposedPorts.length > 0\\\">\\n <td>EXPOSE</td>\\n <td>\\n <span class=\\\"label label-default space-right\\\" ng-repeat=\\\"port in image.ExposedPorts\\\">\\n {{ port }}\\n </span>\\n </td>\\n </tr>\\n <tr ng-if=\\\"image.Volumes.length > 0\\\">\\n <td>VOLUME</td>\\n <td>\\n <span class=\\\"label label-default space-right\\\" ng-repeat=\\\"volume in image.Volumes\\\">\\n {{ volume }}\\n </span>\\n </td>\\n </tr>\\n <tr ng-if=\\\"image.Env.length > 0\\\">\\n <td>ENV</td>\\n <td>\\n <table class=\\\"table table-bordered table-condensed\\\">\\n <tr ng-repeat=\\\"var in image.Env\\\">\\n <td>{{ var|key: '=' }}</td>\\n <td>{{ var|value: '=' }}</td>\\n </tr>\\n </table>\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n<div class=\\\"row\\\" ng-if=\\\"history.length > 0\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-clone\\\" title-text=\\\"Image layers\\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table id=\\\"image-layers\\\" class=\\\"table\\\">\\n <thead>\\n <th style=\\\"white-space: nowrap;\\\">\\n <a ng-click=\\\"order('Order')\\\">\\n Order\\n <span ng-show=\\\"sortType == 'Order' && !sortReverse\\\" class=\\\"glyphicon glyphicon-chevron-down\\\"></span>\\n <span ng-show=\\\"sortType == 'Order' && sortReverse\\\" class=\\\"glyphicon glyphicon-chevron-up\\\"></span>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"order('Size')\\\">\\n Size\\n <span ng-show=\\\"sortType == 'Size' && !sortReverse\\\" class=\\\"glyphicon glyphicon-chevron-down\\\"></span>\\n <span ng-show=\\\"sortType == 'Size' && sortReverse\\\" class=\\\"glyphicon glyphicon-chevron-up\\\"></span>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"order('CreatedBy')\\\">\\n Layer\\n <span ng-show=\\\"sortType == 'CreatedBy' && !sortReverse\\\" class=\\\"glyphicon glyphicon-chevron-down\\\"></span>\\n <span ng-show=\\\"sortType == 'CreatedBy' && sortReverse\\\" class=\\\"glyphicon glyphicon-chevron-up\\\"></span>\\n </a>\\n </th>\\n </thead>\\n <tbody>\\n <tr ng-repeat=\\\"layer in history | orderBy:sortType:sortReverse\\\">\\n <td style=\\\"white-space: nowrap;\\\">\\n {{ layer.Order }}\\n </td>\\n <td style=\\\"white-space: nowrap;\\\">\\n {{ layer.Size | humansize }}\\n </td>\\n <td class=\\\"expand\\\">\\n <div ng-if=\\\"layer.CreatedBy.length > 130\\\">\\n <span id=\\\"layer-command-{{ $index }}-full\\\" style=\\\"display: none;\\\">\\n {{ layer.CreatedBy | imagelayercommand }}\\n </span>\\n <span id=\\\"layer-command-{{ $index }}-short\\\">\\n {{ layer.CreatedBy | imagelayercommand | truncate: 130 }}\\n <span ng-if=\\\"layer.CreatedBy.length > 130\\\" style=\\\"margin-left: 5px;\\\">\\n <a id=\\\"layer-command-expander{{ $index }}\\\" class=\\\"btn\\\" ng-click=\\\"toggleLayerCommand($index)\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </span>\\n </span>\\n </div>\\n <div ng-if=\\\"layer.CreatedBy.length <= 130\\\">\\n <span id=\\\"layer-command-{{ $index }}-full\\\">\\n {{ layer.CreatedBy | imagelayercommand }}\\n </span>\\n </div>\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/images/build/buildimage.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Build image\\\"></rd-header-title>\\n <rd-header-content> <a ui-sref=\\\"docker.images\\\">Images</a> > Build image </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <uib-tabset active=\\\"state.activeTab\\\">\\n <uib-tab index=\\\"0\\\">\\n <uib-tab-heading> <i class=\\\"fa fa-wrench space-right\\\" aria-hidden=\\\"true\\\"></i> Builder </uib-tab-heading>\\n <form class=\\\"form-horizontal\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Naming\\n </div>\\n <!-- names -->\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n You can specify multiple names to your image.\\n </span>\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label class=\\\"control-label text-left\\\">Names</label>\\n <span class=\\\"label label-default interactive\\\" style=\\\"margin-left: 10px;\\\" ng-click=\\\"addImageName()\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add additional name\\n </span>\\n </div>\\n </div>\\n <!-- !names -->\\n <div class=\\\"form-group\\\" ng-if=\\\"formValues.ImageNames.length === 0\\\">\\n <span class=\\\"col-sm-12 text-danger small\\\">\\n <i class=\\\"fa fa-exclamation-triangle space-right\\\" aria-hidden=\\\"true\\\"></i>You must specify at least one name for the image.\\n </span>\\n </div>\\n <!-- name-input-list -->\\n <div ng-if=\\\"formValues.ImageNames.length > 0\\\">\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n A name must be specified in one of the following formats: <code>name:tag</code>, <code>repository/name:tag</code> or\\n <code>registryfqdn:port/repository/name:tag</code> format. If you omit the tag the default <b>latest</b> value is assumed.\\n </span>\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\">\\n <div ng-repeat=\\\"item in formValues.ImageNames track by $index\\\" style=\\\"margin-top: 2px;\\\">\\n <!-- name-input -->\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">name</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"item.Name\\\" placeholder=\\\"e.g. my-image:my-tag\\\" auto-focus />\\n <span class=\\\"input-group-addon\\\"\\n ><i ng-class=\\\"{ true: 'fa fa-check green-icon', false: 'fa fa-times red-icon' }[item.Name !== '']\\\" aria-hidden=\\\"true\\\"></i\\n ></span>\\n </div>\\n <!-- !name-input -->\\n <!-- actions -->\\n <div class=\\\"input-group col-sm-2 input-group-sm\\\">\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removeImageName($index)\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n <!-- !actions -->\\n </div>\\n </div>\\n </div>\\n </div>\\n </div>\\n <!-- !name-input-list -->\\n <!-- build-method -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Build method\\n </div>\\n <div class=\\\"form-group\\\"></div>\\n <div class=\\\"form-group\\\" style=\\\"margin-bottom: 0;\\\">\\n <div class=\\\"boxselector_wrapper\\\">\\n <div>\\n <input type=\\\"radio\\\" id=\\\"method_editor\\\" ng-model=\\\"state.BuildType\\\" value=\\\"editor\\\" ng-click=\\\"toggleEditor()\\\" />\\n <label for=\\\"method_editor\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-edit\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Web editor\\n </div>\\n <p>Use our Web editor</p>\\n </label>\\n </div>\\n <div>\\n <input type=\\\"radio\\\" id=\\\"method_upload\\\" ng-model=\\\"state.BuildType\\\" value=\\\"upload\\\" ng-click=\\\"saveEditorContent()\\\" />\\n <label for=\\\"method_upload\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-upload\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Upload\\n </div>\\n <p>Upload a tarball or a Dockerfile from your computer</p>\\n </label>\\n </div>\\n <div>\\n <input type=\\\"radio\\\" id=\\\"method_url\\\" ng-model=\\\"state.BuildType\\\" value=\\\"url\\\" ng-click=\\\"saveEditorContent()\\\" />\\n <label for=\\\"method_url\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-globe\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n URL\\n </div>\\n <p>Specify a URL to a file</p>\\n </label>\\n </div>\\n </div>\\n </div>\\n <!-- !build-method -->\\n <!-- web-editor -->\\n <div ng-show=\\\"state.BuildType === 'editor'\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Web editor\\n </div>\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n You can get more information about Dockerfile format in the\\n <a href=\\\"https://docs.docker.com/engine/reference/builder/\\\" target=\\\"_blank\\\">official documentation</a>.\\n </span>\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <code-editor\\n identifier=\\\"image-build-editor\\\"\\n placeholder=\\\"Define or paste the content of your Dockerfile here\\\"\\n yml=\\\"false\\\"\\n on-change=\\\"(editorUpdate)\\\"\\n ></code-editor>\\n </div>\\n </div>\\n </div>\\n <!-- !web-editor -->\\n <!-- upload -->\\n <div ng-show=\\\"state.BuildType === 'upload'\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Upload\\n </div>\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n You can upload a Dockerfile or a tar archive containing a Dockerfile from your computer. When using a tarball, the root folder will be used as the build\\n context.\\n </span>\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button class=\\\"btn btn-sm btn-primary\\\" ngf-select ngf-min-size=\\\"10\\\" ng-model=\\\"formValues.UploadFile\\\">Select file</button>\\n <span style=\\\"margin-left: 5px;\\\">\\n {{ formValues.UploadFile.name }}\\n <i class=\\\"fa fa-times red-icon\\\" ng-if=\\\"!formValues.UploadFile\\\" aria-hidden=\\\"true\\\"></i>\\n </span>\\n </div>\\n </div>\\n <div ng-if=\\\"formValues.UploadFile.type === 'application/gzip' || formValues.UploadFile.type === 'application/x-tar'\\\">\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n Indicate the path to the Dockerfile within the tarball.\\n </span>\\n </div>\\n <div class=\\\"form-group\\\">\\n <label for=\\\"image_path\\\" class=\\\"col-sm-2 control-label text-left\\\">Dockerfile path</label>\\n <div class=\\\"col-sm-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.Path\\\" id=\\\"image_path\\\" placeholder=\\\"Dockerfile\\\" />\\n </div>\\n </div>\\n </div>\\n </div>\\n <!-- !upload -->\\n <!-- url -->\\n <div ng-show=\\\"state.BuildType === 'url'\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n URL\\n </div>\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n Specify the URL to a Dockerfile, a tarball or a public Git repository (suffixed by <b>.git</b>). When using a tarball or a Git repository URL, the root folder\\n will be used as the build context.\\n </span>\\n </div>\\n <div class=\\\"form-group\\\">\\n <label for=\\\"image_url\\\" class=\\\"col-sm-2 control-label text-left\\\">URL</label>\\n <div class=\\\"col-sm-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.URL\\\" id=\\\"image_url\\\" placeholder=\\\"https://myhost.mydomain/myimage.tar.gz\\\" />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n Indicate the path to the Dockerfile within the tarball/repository (ignored when using a Dockerfile).\\n </span>\\n </div>\\n <div class=\\\"form-group\\\">\\n <label for=\\\"image_path\\\" class=\\\"col-sm-2 control-label text-left\\\">Dockerfile path</label>\\n <div class=\\\"col-sm-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.Path\\\" id=\\\"image_path\\\" placeholder=\\\"Dockerfile\\\" />\\n </div>\\n </div>\\n </div>\\n <!-- !url -->\\n <div ng-if=\\\"applicationState.endpoint.mode.agentProxy && applicationState.endpoint.mode.provider === 'DOCKER_SWARM_MODE'\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Deployment\\n </div>\\n <!-- node-selection -->\\n <node-selector model=\\\"formValues.NodeName\\\"> </node-selector>\\n <!-- !node-selection -->\\n </div>\\n <!-- actions -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"state.actionInProgress\\n || (state.BuildType === 'upload' && (!formValues.UploadFile || !formValues.Path))\\n || (state.BuildType === 'url' && (!formValues.URL || !formValues.Path))\\n || (formValues.ImageNames.length === 0 || !validImageNames())\\\"\\n ng-click=\\\"buildImage()\\\"\\n button-spinner=\\\"state.actionInProgress\\\"\\n >\\n <span ng-hide=\\\"state.actionInProgress\\\">Build the image</span>\\n <span ng-show=\\\"state.actionInProgress\\\">Image building in progress...</span>\\n </button>\\n <span class=\\\"text-danger\\\" ng-if=\\\"state.formValidationError\\\" style=\\\"margin-left: 5px;\\\">{{ state.formValidationError }}</span>\\n </div>\\n </div>\\n <!-- !actions -->\\n </form>\\n </uib-tab>\\n <uib-tab index=\\\"1\\\" disable=\\\"!buildLogs\\\">\\n <uib-tab-heading> <i class=\\\"fa fa-file-alt space-right\\\" aria-hidden=\\\"true\\\"></i> Output </uib-tab-heading>\\n <pre class=\\\"log_viewer\\\">\\n <div ng-repeat=\\\"line in buildLogs track by $index\\\" class=\\\"line\\\"><p class=\\\"inner_line\\\" ng-click=\\\"active=!active\\\" ng-class=\\\"{'line_selected': active}\\\">{{ line }}</p></div>\\n <div ng-if=\\\"!buildLogs.length\\\" class=\\\"line\\\"><p class=\\\"inner_line\\\">No build output available.</p></div>\\n </pre>\\n </uib-tab>\\n </uib-tabset>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/images/import/importimage.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Import image\\\"></rd-header-title>\\n <rd-header-content> <a ui-sref=\\\"docker.images\\\">Images</a> > Import image </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\">\\n <!-- upload -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Upload\\n </div>\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n You can upload a tar archive containing your images.\\n </span>\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ngf-select ngf-min-size=\\\"10\\\" ng-model=\\\"formValues.UploadFile\\\">Select file</button>\\n <span style=\\\"margin-left: 5px;\\\">\\n {{ formValues.UploadFile.name }}\\n <i class=\\\"fa fa-times red-icon\\\" ng-if=\\\"!formValues.UploadFile\\\" aria-hidden=\\\"true\\\"></i>\\n </span>\\n </div>\\n </div>\\n <!-- !upload -->\\n <div ng-if=\\\"applicationState.endpoint.mode.agentProxy && applicationState.endpoint.mode.provider === 'DOCKER_SWARM_MODE'\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Deployment\\n </div>\\n <!-- node-selection -->\\n <node-selector model=\\\"formValues.NodeName\\\"> </node-selector>\\n <!-- !node-selection -->\\n </div>\\n <div class=\\\"row\\\" authorization=\\\"DockerImageCreate\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-tag\\\" title-text=\\\"Tag the image\\\"></rd-widget-header>\\n <rd-widget-body>\\n <!-- image-and-registry -->\\n <por-image-registry\\n model=\\\"formValues.RegistryModel\\\"\\n label-class=\\\"col-sm-1\\\"\\n input-class=\\\"col-sm-11\\\"\\n endpoint=\\\"endpoint\\\"\\n is-admin=\\\"isAdmin\\\"\\n set-validity=\\\"setPullImageValidity\\\"\\n check-rate-limits=\\\"true\\\"\\n ></por-image-registry>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n </div>\\n <!-- actions -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"state.actionInProgress || !formValues.UploadFile\\\"\\n ng-click=\\\"uploadImage()\\\"\\n button-spinner=\\\"state.actionInProgress\\\"\\n >\\n <span ng-hide=\\\"state.actionInProgress\\\">Upload</span>\\n <span ng-show=\\\"state.actionInProgress\\\">Images uploading in progress...</span>\\n </button>\\n <span class=\\\"text-danger\\\" ng-if=\\\"state.formValidationError\\\" style=\\\"margin-left: 5px;\\\">{{ state.formValidationError }}</span>\\n </div>\\n </div>\\n <!-- !actions -->\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/networks/networks.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Network list\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"Refresh\\\" ui-sref=\\\"docker.networks\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content>Networks</rd-header-content>\\n</rd-header>\\n<information-panel-offline ng-if=\\\"offlineMode\\\"></information-panel-offline>\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <networks-datatable\\n title-text=\\\"Networks\\\"\\n title-icon=\\\"fa-sitemap\\\"\\n dataset=\\\"networks\\\"\\n table-key=\\\"networks\\\"\\n order-by=\\\"Name\\\"\\n remove-action=\\\"removeAction\\\"\\n show-host-column=\\\"applicationState.endpoint.mode.agentProxy && applicationState.endpoint.mode.provider === 'DOCKER_SWARM_MODE'\\\"\\n offline-mode=\\\"offlineMode\\\"\\n refresh-callback=\\\"getNetworks\\\"\\n ></networks-datatable>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/networks/edit/network.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Network details\\\"></rd-header-title>\\n <rd-header-content>\\n <a ui-sref=\\\"docker.networks\\\">Networks</a> > <a ui-sref=\\\"docker.networks.network({id: network.Id})\\\">{{ network.Name }}</a>\\n </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-sitemap\\\" title-text=\\\"Network details\\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr>\\n <td>Name</td>\\n <td>{{ network.Name }}</td>\\n </tr>\\n <tr>\\n <td>ID</td>\\n <td>\\n {{ network.Id }}\\n <button authorization=\\\"DockerNetworkDelete\\\" ng-if=\\\"allowRemove()\\\" class=\\\"btn btn-xs btn-danger\\\" ng-click=\\\"removeNetwork(network.Id)\\\"\\n ><i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Delete this network</button\\n >\\n </td>\\n </tr>\\n <tr>\\n <td>Driver</td>\\n <td>{{ network.Driver }}</td>\\n </tr>\\n <tr>\\n <td>Scope</td>\\n <td>{{ network.Scope }}</td>\\n </tr>\\n <tr>\\n <td>Attachable</td>\\n <td>{{ network.Attachable }}</td>\\n </tr>\\n <tr>\\n <td>Internal</td>\\n <td>{{ network.Internal }}</td>\\n </tr>\\n <tr ng-if=\\\"network.IPAM.IPV4Configs.length > 0\\\" ng-repeat-start=\\\"config in network.IPAM.IPV4Configs\\\">\\n <td>IPV4 Subnet - {{ config.Subnet }}</td>\\n <td>IPV4 Gateway - {{ config.Gateway }}</td>\\n </tr>\\n <tr ng-if=\\\"network.IPAM.IPV4Configs.length > 0\\\" ng-repeat-end>\\n <td>IPV4 IP range - {{ config.IPRange }}</td>\\n <td\\n >IPV4 Excluded Ips<span ng-repeat=\\\"auxAddress in config.AuxiliaryAddresses\\\"> - {{ auxAddress }}</span></td\\n >\\n </tr>\\n <tr ng-if=\\\"network.IPAM.IPV6Configs.length > 0\\\" ng-repeat-start=\\\"config in network.IPAM.IPV6Configs\\\">\\n <td>IPV6 Subnet - {{ config.Subnet }}</td>\\n <td>IPV6 Gateway - {{ config.Gateway }}</td>\\n </tr>\\n <tr ng-if=\\\"network.IPAM.IPV6Configs.length > 0\\\" ng-repeat-end>\\n <td>IPV6 IP range - {{ config.IPRange }}</td>\\n <td\\n >IPV6 Excluded Ips<span ng-repeat=\\\"auxAddress in config.AuxiliaryAddresses\\\"> - {{ auxAddress }}</span></td\\n >\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\\n<!-- access-control-panel -->\\n<por-access-control-panel\\n ng-if=\\\"network\\\"\\n resource-id=\\\"network.Id\\\"\\n resource-control=\\\"network.ResourceControl\\\"\\n resource-type=\\\"'network'\\\"\\n disable-ownership-change=\\\"isSystemNetwork()\\\"\\n>\\n</por-access-control-panel>\\n<!-- !access-control-panel -->\\n\\n<div class=\\\"row\\\" ng-if=\\\"!(network.Options | emptyobject)\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-cogs\\\" title-text=\\\"Network options\\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr ng-repeat=\\\"(key, value) in network.Options\\\">\\n <td>{{ key }}</td>\\n <td>{{ value }}</td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\\n<div class=\\\"row\\\" ng-if=\\\"containersInNetwork.length > 0\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-server\\\" title-text=\\\"Containers in network\\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <thead>\\n <th>Container Name</th>\\n <th>IPv4 Address</th>\\n <th>IPv6 Address</th>\\n <th>MacAddress</th>\\n <th authorization=\\\"DockerNetworkDisconnect\\\">Actions</th>\\n </thead>\\n <tbody>\\n <tr ng-repeat=\\\"container in containersInNetwork\\\">\\n <td\\n ><a ui-sref=\\\"docker.containers.container({ id: container.Id, nodeName: nodeName })\\\">{{ container.Name }}</a></td\\n >\\n <td>{{ container.IPv4Address || '-' }}</td>\\n <td>{{ container.IPv6Address || '-' }}</td>\\n <td>{{ container.MacAddress || '-' }}</td>\\n <td authorization=\\\"DockerNetworkDisconnect\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-xs btn-danger\\\" ng-click=\\\"containerLeaveNetwork(network, container)\\\"\\n ><i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Leave Network</button\\n >\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/networks/create/createnetwork.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Create network\\\"></rd-header-title>\\n <rd-header-content> <a ui-sref=\\\"docker.networks\\\">Networks</a> > Add network </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\" name=\\\"networkCreationForm\\\">\\n <!-- name-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"network_name\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Name</label>\\n <div class=\\\"col-sm-10 col-lg-11\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"config.Name\\\" id=\\\"network_name\\\" placeholder=\\\"e.g. myNetwork\\\" />\\n </div>\\n </div>\\n <!-- !name-input -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Driver configuration\\n </div>\\n <!-- driver-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"network_driver\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Driver</label>\\n <div class=\\\"col-sm-10 col-lg-11\\\">\\n <select class=\\\"form-control\\\" ng-options=\\\"driver for driver in availableNetworkDrivers\\\" ng-model=\\\"config.Driver\\\" ng-if=\\\"availableNetworkDrivers.length > 0\\\">\\n <option disabled hidden value=\\\"\\\">Select a driver</option>\\n </select>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"config.Driver\\\" id=\\\"network_driver\\\" placeholder=\\\"e.g. driverName\\\" ng-if=\\\"availableNetworkDrivers.length === 0\\\" />\\n </div>\\n </div>\\n <!-- !driver-input -->\\n <!-- driver-options -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 5px;\\\">\\n <label class=\\\"control-label text-left\\\">\\n Driver options\\n <portainer-tooltip\\n position=\\\"bottom\\\"\\n message=\\\"Driver options are specific to the selected driver. Please refer to the selected driver documentation.\\\"\\n ></portainer-tooltip>\\n </label>\\n <span class=\\\"label label-default interactive\\\" style=\\\"margin-left: 10px;\\\" ng-click=\\\"addDriverOption()\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add driver option\\n </span>\\n </div>\\n <!-- driver-options-input-list -->\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\">\\n <div ng-repeat=\\\"option in formValues.DriverOptions\\\" style=\\\"margin-top: 2px;\\\">\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">name</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"option.name\\\" placeholder=\\\"e.g. com.docker.network.bridge.enable_icc\\\" />\\n </div>\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">value</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"option.value\\\" placeholder=\\\"e.g. true\\\" />\\n </div>\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removeDriverOption($index)\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n <!-- !driver-options-input-list -->\\n </div>\\n <!-- !driver-options -->\\n <!-- macvlan-management -->\\n <network-macvlan-form ng-show=\\\"config.Driver === 'macvlan'\\\" data=\\\"formValues.Macvlan\\\" application-state=\\\"applicationState\\\"></network-macvlan-form>\\n <!-- !macvlan-management -->\\n <div ng-hide=\\\"config.Driver === 'macvlan' && formValues.Macvlan.Scope === 'swarm'\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n IPV4 Network configuration\\n </div>\\n <!-- subnet-gateway-inputs -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"ipv4_network_subnet\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Subnet</label>\\n <div class=\\\"col-sm-4 col-lg-5\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.IPV4.Subnet\\\" id=\\\"ipv4_network_subnet\\\" placeholder=\\\"e.g. 172.20.0.0/16\\\" />\\n </div>\\n <label for=\\\"ipv4_network_gateway\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Gateway</label>\\n <div class=\\\"col-sm-4 col-lg-5\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.IPV4.Gateway\\\" id=\\\"ipv4_network_gateway\\\" placeholder=\\\"e.g. 172.20.10.11\\\" />\\n </div>\\n </div>\\n <!-- !subnet-gateway-inputs -->\\n <!-- iprange-auxaddr-inputs -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"ipv4_network_iprange\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">IP range</label>\\n <div class=\\\"col-sm-4 col-lg-5\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.IPV4.IPRange\\\" id=\\\"ipv4_network_iprange\\\" placeholder=\\\"e.g. 172.20.10.128/25\\\" />\\n </div>\\n </div>\\n <div ng-repeat=\\\"auxAddress in formValues.IPV4.AuxiliaryAddresses track by $index\\\" class=\\\"form-group\\\">\\n <label for=\\\"ipv4_network_auxaddr_{{ $index }}\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Exclude IP</label>\\n <div class=\\\"col-sm-4 col-lg-5\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"formValues.IPV4.AuxiliaryAddresses[$index]\\\"\\n ng-change=\\\"checkIPV4AuxiliaryAddress($index)\\\"\\n id=\\\"ipv4_network_auxaddr_{{ $index }}\\\"\\n placeholder=\\\"e.g. my-router=172.20.10.129\\\"\\n />\\n </div>\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removeIPV4AuxAddress($index)\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n <div class=\\\"col-sm-12 small text-warning\\\" ng-show=\\\"state.IPV4AuxiliaryAddressesError[$index]\\\">\\n <p><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Exclude ip cannot be the same as gateway.</p>\\n </div>\\n </div>\\n <!-- !iprange-auxaddr-inputs -->\\n <div class=\\\"form-group\\\">\\n <span class=\\\"label label-default interactive\\\" style=\\\"margin-left: 10px;\\\" ng-click=\\\"addIPV4AuxAddress()\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add excluded IP\\n </span>\\n </div>\\n </div>\\n <div ng-show=\\\"config.Driver === 'bridge' || (config.Driver === 'macvlan' && formValues.Macvlan.Scope !== 'swarm')\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n IPV6 Network configuration\\n </div>\\n <!-- subnet-gateway-inputs -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"ipv6_network_subnet\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Subnet</label>\\n <div class=\\\"col-sm-4 col-lg-5\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.IPV6.Subnet\\\" id=\\\"ipv6_network_subnet\\\" placeholder=\\\"e.g. 2001:db8::/48\\\" />\\n </div>\\n <label for=\\\"ipv6_network_gateway\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Gateway</label>\\n <div class=\\\"col-sm-4 col-lg-5\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.IPV6.Gateway\\\" id=\\\"ipv6_network_gateway\\\" placeholder=\\\"e.g. 2001:db8::1\\\" />\\n </div>\\n </div>\\n <!-- !subnet-gateway-inputs -->\\n <!-- iprange-auxaddr-inputs -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"ipv6_network_iprange\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">IP range</label>\\n <div class=\\\"col-sm-4 col-lg-5\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.IPV6.IPRange\\\" id=\\\"ipv6_network_iprange\\\" placeholder=\\\"e.g. 2001:db8::/64\\\" />\\n </div>\\n </div>\\n <div ng-repeat=\\\"auxAddress in formValues.IPV6.AuxiliaryAddresses track by $index\\\" class=\\\"form-group\\\">\\n <label for=\\\"ipv6_network_auxaddr_{{ $index }}\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Exclude IP</label>\\n <div class=\\\"col-sm-4 col-lg-5\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"formValues.IPV6.AuxiliaryAddresses[$index]\\\"\\n ng-change=\\\"checkIPV6AuxiliaryAddress($index)\\\"\\n id=\\\"ipv6_network_auxaddr_{{ $index }}\\\"\\n placeholder=\\\"e.g. my-router=2001:db8::1\\\"\\n />\\n </div>\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removeIPV6AuxAddress($index)\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n <div class=\\\"col-sm-12 small text-warning\\\" ng-show=\\\"state.IPV6AuxiliaryAddressesError[$index]\\\">\\n <p><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Exclude ip cannot be the same as gateway.</p>\\n </div>\\n </div>\\n <!-- !iprange-auxaddr-inputs -->\\n <div class=\\\"form-group\\\">\\n <span class=\\\"label label-default interactive\\\" style=\\\"margin-left: 10px;\\\" ng-click=\\\"addIPV6AuxAddress()\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add excluded IP\\n </span>\\n </div>\\n </div>\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Advanced configuration\\n </div>\\n <!-- labels -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 5px;\\\">\\n <label class=\\\"control-label text-left\\\">Labels</label>\\n <span class=\\\"label label-default interactive\\\" style=\\\"margin-left: 10px;\\\" ng-click=\\\"addLabel()\\\"> <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add label </span>\\n </div>\\n <!-- labels-input-list -->\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\">\\n <div ng-repeat=\\\"label in formValues.Labels\\\" style=\\\"margin-top: 2px;\\\">\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">name</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"label.key\\\" placeholder=\\\"e.g. com.example.foo\\\" />\\n </div>\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">value</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"label.value\\\" placeholder=\\\"e.g. bar\\\" />\\n </div>\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removeLabel($index)\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n <!-- !labels-input-list -->\\n </div>\\n <!-- !labels-->\\n <!-- internal -->\\n <div class=\\\"form-group\\\" ng-hide=\\\"config.Driver === 'macvlan' && formValues.Macvlan.Scope === 'local'\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label for=\\\"ownership\\\" class=\\\"control-label text-left\\\">\\n Isolated network\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"An isolated network has no inbound or outbound communications.\\\"></portainer-tooltip>\\n </label>\\n <label name=\\\"ownership\\\" class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\">\\n <input type=\\\"checkbox\\\" ng-model=\\\"config.Internal\\\" />\\n <i></i>\\n </label>\\n </div>\\n </div>\\n <!-- !internal -->\\n <!-- attachable -->\\n <div class=\\\"form-group\\\" ng-hide=\\\"config.Driver === 'macvlan' && formValues.Macvlan.Scope === 'local'\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label for=\\\"attachable\\\" class=\\\"control-label text-left\\\">\\n Enable manual container attachment\\n </label>\\n <label name=\\\"attachable\\\" class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\">\\n <input type=\\\"checkbox\\\" ng-model=\\\"config.Attachable\\\" />\\n <i></i>\\n </label>\\n </div>\\n </div>\\n <!-- !attachable -->\\n <div\\n ng-if=\\\"\\n applicationState.endpoint.mode.agentProxy &&\\n applicationState.endpoint.mode.provider === 'DOCKER_SWARM_MODE' &&\\n config.Driver !== 'overlay' &&\\n config.Driver !== 'macvlan'\\n \\\"\\n >\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Deployment\\n </div>\\n <!-- node-selection -->\\n <node-selector model=\\\"formValues.NodeName\\\"> </node-selector>\\n <!-- !node-selection -->\\n </div>\\n <!-- access-control -->\\n <por-access-control-form form-data=\\\"formValues.AccessControlData\\\"></por-access-control-form>\\n <!-- !access-control -->\\n <!-- actions -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"state.actionInProgress || !config.Name || (config.Driver === 'macvlan' && networkCreationForm.$invalid) || !isValid()\\\"\\n ng-click=\\\"create()\\\"\\n button-spinner=\\\"state.actionInProgress\\\"\\n >\\n <span ng-hide=\\\"state.actionInProgress\\\">Create the network</span>\\n <span ng-show=\\\"state.actionInProgress\\\">Creating network...</span>\\n </button>\\n <i id=\\\"createResourceSpinner\\\" class=\\\"fa fa-cog fa-spin\\\" style=\\\"margin-left: 5px; display: none;\\\"></i>\\n <span class=\\\"text-danger\\\" ng-if=\\\"state.formValidationError\\\" style=\\\"margin-left: 5px;\\\">{{ state.formValidationError }}</span>\\n </div>\\n </div>\\n <!-- !actions -->\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/secrets/secrets.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Secrets list\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"Refresh\\\" ui-sref=\\\"docker.secrets\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content>Secrets</rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <secrets-datatable\\n title-text=\\\"Secrets\\\"\\n title-icon=\\\"fa-user-secret\\\"\\n dataset=\\\"secrets\\\"\\n table-key=\\\"secrets\\\"\\n order-by=\\\"Name\\\"\\n remove-action=\\\"removeAction\\\"\\n refresh-callback=\\\"getSecrets\\\"\\n ></secrets-datatable>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/secrets/edit/secret.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Secret details\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"Refresh\\\" ui-sref=\\\"docker.secrets.secret({id: secret.Id})\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content>\\n <a ui-sref=\\\"docker.secrets\\\">Secrets</a> > <a ui-sref=\\\"docker.secrets.secret({id: secret.Id})\\\">{{ secret.Name }}</a>\\n </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-user-secret\\\" title-text=\\\"Secret details\\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr>\\n <td>Name</td>\\n <td>{{ secret.Name }}</td>\\n </tr>\\n <tr>\\n <td>ID</td>\\n <td>\\n {{ secret.Id }}\\n <button authorization=\\\"DockerSecretDelete\\\" class=\\\"btn btn-xs btn-danger\\\" ng-click=\\\"removeSecret(secret.Id)\\\"\\n ><i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Delete this secret</button\\n >\\n </td>\\n </tr>\\n <tr>\\n <td>Created</td>\\n <td>{{ secret.CreatedAt | getisodate }}</td>\\n </tr>\\n <tr>\\n <td>Last updated</td>\\n <td>{{ secret.UpdatedAt | getisodate }}</td>\\n </tr>\\n <tr ng-if=\\\"!(secret.Labels | emptyobject)\\\">\\n <td>Labels</td>\\n <td>\\n <table class=\\\"table table-bordered table-condensed\\\">\\n <tr ng-repeat=\\\"(k, v) in secret.Labels\\\">\\n <td>{{ k }}</td>\\n <td>{{ v }}</td>\\n </tr>\\n </table>\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\\n<!-- access-control-panel -->\\n<por-access-control-panel ng-if=\\\"secret\\\" resource-id=\\\"secret.Id\\\" resource-control=\\\"secret.ResourceControl\\\" resource-type=\\\"'secret'\\\"> </por-access-control-panel>\\n<!-- !access-control-panel -->\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/secrets/create/createsecret.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Create secret\\\"></rd-header-title>\\n <rd-header-content> <a ui-sref=\\\"docker.secrets\\\">Secrets</a> > Add secret </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\">\\n <!-- name-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"secret_name\\\" class=\\\"col-sm-1 control-label text-left\\\">Name</label>\\n <div class=\\\"col-sm-11\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.Name\\\" id=\\\"secret_name\\\" placeholder=\\\"e.g. mySecret\\\" />\\n </div>\\n </div>\\n <!-- !name-input -->\\n <!-- secret-data -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"secret_data\\\" class=\\\"col-sm-1 control-label text-left\\\">Secret</label>\\n <div class=\\\"col-sm-11\\\">\\n <textarea class=\\\"form-control\\\" rows=\\\"5\\\" ng-model=\\\"formValues.Data\\\"></textarea>\\n </div>\\n </div>\\n <!-- !secret-data -->\\n <!-- encode-secret -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label for=\\\"encode_secret\\\" class=\\\"control-label text-left\\\">\\n Encode secret\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"Secrets need to be base64 encoded. Disable this if your secret is already base64 encoded.\\\"></portainer-tooltip>\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\"> <input type=\\\"checkbox\\\" name=\\\"encode_secret\\\" ng-model=\\\"formValues.encodeSecret\\\" /><i></i> </label>\\n </div>\\n </div>\\n <!-- !encode-secret -->\\n <!-- labels -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 5px;\\\">\\n <label class=\\\"control-label text-left\\\">Labels</label>\\n <span class=\\\"label label-default interactive\\\" style=\\\"margin-left: 10px;\\\" ng-click=\\\"addLabel()\\\"> <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add label </span>\\n </div>\\n <!-- labels-input-list -->\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\">\\n <div ng-repeat=\\\"label in formValues.Labels\\\" style=\\\"margin-top: 2px;\\\">\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">name</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"label.key\\\" placeholder=\\\"e.g. com.example.foo\\\" />\\n </div>\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">value</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"label.value\\\" placeholder=\\\"e.g. bar\\\" />\\n </div>\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removeLabel($index)\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n <!-- !labels-input-list -->\\n </div>\\n <!-- !labels-->\\n <!-- access-control -->\\n <por-access-control-form form-data=\\\"formValues.AccessControlData\\\"></por-access-control-form>\\n <!-- !access-control -->\\n <!-- actions -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"state.actionInProgress || !formValues.Name || !formValues.Data\\\"\\n ng-click=\\\"create()\\\"\\n button-spinner=\\\"state.actionInProgress\\\"\\n >\\n <span ng-hide=\\\"state.actionInProgress\\\">Create the secret</span>\\n <span ng-show=\\\"state.actionInProgress\\\">Creating secret...</span>\\n </button>\\n <span class=\\\"text-danger\\\" ng-if=\\\"state.formValidationError\\\" style=\\\"margin-left: 5px;\\\">{{ state.formValidationError }}</span>\\n </div>\\n </div>\\n <!-- !actions -->\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/services/services.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Service list\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"Refresh\\\" ui-sref=\\\"docker.services\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content>Services</rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\" ng-if=\\\"services\\\">\\n <div class=\\\"col-sm-12\\\">\\n <services-datatable\\n title-text=\\\"Services\\\"\\n title-icon=\\\"fa-list-alt\\\"\\n dataset=\\\"services\\\"\\n table-key=\\\"services\\\"\\n order-by=\\\"Name\\\"\\n nodes=\\\"nodes\\\"\\n agent-proxy=\\\"applicationState.endpoint.mode.agentProxy\\\"\\n show-update-action=\\\"applicationState.endpoint.apiVersion >= 1.25\\\"\\n show-task-logs-button=\\\"applicationState.endpoint.apiVersion >= 1.30\\\"\\n show-add-action=\\\"true\\\"\\n show-stack-column=\\\"true\\\"\\n refresh-callback=\\\"getServices\\\"\\n ></services-datatable>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/services/edit/service.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Service details\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"Refresh\\\" ui-sref=\\\"docker.services.service({id: service.Id})\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content>\\n <a ui-sref=\\\"docker.services\\\">Services</a> > <a ui-sref=\\\"docker.services.service({id: service.Id})\\\">{{ service.Name }}</a>\\n </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div ng-if=\\\"isUpdating\\\" class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <div class=\\\"alert alert-info\\\" role=\\\"alert\\\" id=\\\"service-update-alert\\\">\\n <p>This service is being updated. Editing this service is currently disabled.</p>\\n <a ui-sref=\\\"docker.services.service({id: service.Id}, {reload: true})\\\">Refresh to see if this service has finished updated.</a>\\n </div>\\n </div>\\n</div>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-lg-9 col-md-9 col-xs-9\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-list-alt\\\" title-text=\\\"Service details\\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr>\\n <td>Name</td>\\n <td ng-if=\\\"applicationState.endpoint.apiVersion <= 1.24\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"service.Name\\\" ng-change=\\\"updateServiceAttribute(service, 'Name')\\\" ng-disabled=\\\"isUpdating\\\" />\\n </td>\\n <td ng-if=\\\"applicationState.endpoint.apiVersion >= 1.25\\\">\\n {{ service.Name }}\\n </td>\\n </tr>\\n <tr>\\n <td>ID</td>\\n <td>\\n {{ service.Id }}\\n </td>\\n </tr>\\n <tr ng-if=\\\"service.CreatedAt\\\">\\n <td>Created at</td>\\n <td>{{ service.CreatedAt | getisodate }}</td>\\n </tr>\\n <tr ng-if=\\\"service.UpdatedAt\\\">\\n <td>Last updated at</td>\\n <td>{{ service.UpdatedAt | getisodate }}</td>\\n </tr>\\n <tr ng-if=\\\"service.Version\\\">\\n <td>Version</td>\\n <td>{{ service.Version }}</td>\\n </tr>\\n <tr>\\n <td>Scheduling mode</td>\\n <td>{{ service.Mode }}</td>\\n </tr>\\n <tr ng-if=\\\"service.Mode === 'replicated'\\\">\\n <td>Replicas</td>\\n <td>\\n <span ng-if=\\\"service.Mode === 'replicated'\\\">\\n <input\\n class=\\\"input-sm\\\"\\n type=\\\"number\\\"\\n ng-model=\\\"service.Replicas\\\"\\n ng-change=\\\"updateServiceAttribute(service, 'Replicas')\\\"\\n disable-authorization=\\\"DockerServiceUpdate\\\"\\n />\\n </span>\\n </td>\\n </tr>\\n <tr>\\n <td>Image</td>\\n <td>{{ service.Image }}</td>\\n </tr>\\n <tr ng-if=\\\"applicationState.endpoint.type !== 4\\\">\\n <td colspan=\\\"{{ webhookURL ? '1' : '2' }}\\\">\\n Service webhook\\n <portainer-tooltip\\n position=\\\"top\\\"\\n message=\\\"Webhook (or callback URI) used to automate the update of this service. Sending a POST request to this callback URI (without requiring any authentication) will pull the most up-to-date version of the associated image and re-deploy this service.\\\"\\n ></portainer-tooltip>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\">\\n <input disable-authorization=\\\"DockerServiceUpdate\\\" type=\\\"checkbox\\\" ng-model=\\\"WebhookExists\\\" ng-click=\\\"updateWebhook(service)\\\" /><i></i>\\n </label>\\n </td>\\n <td ng-if=\\\"webhookURL\\\">\\n <span class=\\\"text-muted\\\">{{ webhookURL | truncatelr }}</span>\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary btn-sm space-left\\\" ng-if=\\\"webhookURL\\\" ng-click=\\\"copyWebhook()\\\">\\n <span><i class=\\\"fa fa-copy space-right\\\" aria-hidden=\\\"true\\\"></i>Copy link</span>\\n </button>\\n <span>\\n <i id=\\\"copyNotification\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-left: 7px; display: none;\\\"></i>\\n </span>\\n </td>\\n </tr>\\n <tr authorization=\\\"DockerServiceLogs, DockerServiceUpdate, DockerServiceDelete\\\">\\n <td colspan=\\\"2\\\">\\n <p class=\\\"small text-muted\\\" authorization=\\\"DockerServiceUpdate\\\">\\n Note: you can only rollback one level of changes. Clicking the rollback button without making a new change will undo your previous rollback </p\\n ><p>\\n <a\\n authorization=\\\"DockerServiceLogs\\\"\\n ng-if=\\\"applicationState.endpoint.apiVersion >= 1.3\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n type=\\\"button\\\"\\n ui-sref=\\\"docker.services.service.logs({id: service.Id})\\\"\\n ><i class=\\\"fa fa-file-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Service logs</a\\n >\\n <button\\n authorization=\\\"DockerServiceUpdate\\\"\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"state.updateInProgress || isUpdating\\\"\\n ng-click=\\\"forceUpdateService(service)\\\"\\n button-spinner=\\\"state.updateInProgress\\\"\\n ng-if=\\\"applicationState.endpoint.apiVersion >= 1.25\\\"\\n >\\n <span ng-hide=\\\"state.updateInProgress\\\"><i class=\\\"fa fa-sync space-right\\\" aria-hidden=\\\"true\\\"></i>Update the service</span>\\n <span ng-show=\\\"state.updateInProgress\\\">Update in progress...</span>\\n </button>\\n <button\\n authorization=\\\"DockerServiceUpdate\\\"\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"state.rollbackInProgress || isUpdating\\\"\\n ng-click=\\\"rollbackService(service)\\\"\\n button-spinner=\\\"state.rollbackInProgress\\\"\\n ng-if=\\\"applicationState.endpoint.apiVersion >= 1.25\\\"\\n >\\n <span ng-hide=\\\"state.rollbackInProgress\\\"><i class=\\\"fa fa-undo space-right\\\" aria-hidden=\\\"true\\\"></i>Rollback the service</span>\\n <span ng-show=\\\"state.rollbackInProgress\\\">Rollback in progress...</span>\\n </button>\\n <button\\n authorization=\\\"DockerServiceDelete\\\"\\n type=\\\"button\\\"\\n class=\\\"btn btn-danger btn-sm\\\"\\n ng-disabled=\\\"state.deletionInProgress || isUpdating\\\"\\n ng-click=\\\"removeService()\\\"\\n button-spinner=\\\"state.deletionInProgress\\\"\\n >\\n <span ng-hide=\\\"state.deletionInProgress\\\"><i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Delete the service</span>\\n <span ng-show=\\\"state.deletionInProgress\\\">Deletion in progress...</span>\\n </button>\\n </p></td\\n >\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n <rd-widget-footer authorization=\\\"DockerServiceUpdate\\\">\\n <p class=\\\"small text-muted\\\">\\n Do you need help? View the Docker Service documentation <a href=\\\"https://docs.docker.com/engine/reference/commandline/service_update/\\\" target=\\\"self\\\">here</a>.\\n </p>\\n <div class=\\\"btn-toolbar\\\" role=\\\"toolbar\\\">\\n <div class=\\\"btn-group\\\" role=\\\"group\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-primary\\\" ng-disabled=\\\"!hasChanges(service, ['Mode', 'Replicas', 'Name', 'Webhooks'])\\\" ng-click=\\\"updateService(service)\\\"\\n >Apply changes</button\\n >\\n <button type=\\\"button\\\" class=\\\"btn btn-default dropdown-toggle\\\" data-toggle=\\\"dropdown\\\" aria-haspopup=\\\"true\\\" aria-expanded=\\\"false\\\">\\n <span class=\\\"caret\\\"></span>\\n </button>\\n <ul class=\\\"dropdown-menu\\\">\\n <li><a ng-click=\\\"cancelChanges(service, ['Mode', 'Replicas', 'Name'])\\\">Reset changes</a></li>\\n <li><a ng-click=\\\"cancelChanges(service)\\\">Reset all changes</a></li>\\n </ul>\\n </div>\\n </div>\\n </rd-widget-footer>\\n </rd-widget>\\n </div>\\n\\n <div class=\\\"col-lg-3 col-md-3 col-xs-3\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-bars\\\" title-text=\\\"Quick navigation\\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <ul class=\\\"nav nav-pills nav-stacked\\\">\\n <li><a href ng-click=\\\"goToItem('service-env-variables')\\\">Environment variables</a></li>\\n <li><a href ng-click=\\\"goToItem('service-container-image')\\\">Container image</a></li>\\n <li><a href ng-click=\\\"goToItem('service-container-labels')\\\">Container labels</a></li>\\n <li><a href ng-click=\\\"goToItem('service-mounts')\\\">Mounts</a></li>\\n <li><a href ng-click=\\\"goToItem('service-network-specs')\\\">Network & published ports</a></li>\\n <li><a href ng-click=\\\"goToItem('service-resources')\\\">Resource limits & reservations</a></li>\\n <li><a href ng-click=\\\"goToItem('service-placement-constraints')\\\">Placement constraints</a></li>\\n <li ng-if=\\\"applicationState.endpoint.apiVersion >= 1.3\\\"><a href ng-click=\\\"goToItem('service-placement-preferences')\\\">Placement preferences</a></li>\\n <li><a href ng-click=\\\"goToItem('service-restart-policy')\\\">Restart policy</a></li>\\n <li><a href ng-click=\\\"goToItem('service-update-config')\\\">Update configuration</a></li>\\n <li><a href ng-click=\\\"goToItem('service-logging')\\\">Logging</a></li>\\n <li><a href ng-click=\\\"goToItem('service-labels')\\\">Service labels</a></li>\\n <li><a href ng-click=\\\"goToItem('service-configs')\\\">Configs</a></li>\\n <li ng-if=\\\"applicationState.endpoint.apiVersion >= 1.25\\\"><a href ng-click=\\\"goToItem('service-secrets')\\\">Secrets</a></li>\\n <li><a href ng-click=\\\"goToItem('service-tasks')\\\">Tasks</a></li>\\n </ul>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\\n<!-- access-control-panel -->\\n<por-access-control-panel ng-if=\\\"service\\\" resource-id=\\\"service.Id\\\" resource-control=\\\"service.ResourceControl\\\" resource-type=\\\"'service'\\\"> </por-access-control-panel>\\n<!-- !access-control-panel -->\\n\\n<div class=\\\"row\\\">\\n <hr />\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <h3 id=\\\"container-specs\\\">Container specification</h3>\\n <div id=\\\"service-container-spec\\\" class=\\\"padding-top\\\" ng-include=\\\"'app/docker/views/services/edit/includes/container-specs.html'\\\"></div>\\n <div id=\\\"service-container-image\\\" class=\\\"padding-top\\\" ng-include=\\\"'app/docker/views/services/edit/includes/image.html'\\\"></div>\\n <div id=\\\"service-env-variables\\\" class=\\\"padding-top\\\" ng-include=\\\"'app/docker/views/services/edit/includes/environmentvariables.html'\\\"></div>\\n <div id=\\\"service-container-labels\\\" class=\\\"padding-top\\\" ng-include=\\\"'app/docker/views/services/edit/includes/containerlabels.html'\\\"></div>\\n <div id=\\\"service-mounts\\\" class=\\\"padding-top\\\" ng-include=\\\"'app/docker/views/services/edit/includes/mounts.html'\\\"></div>\\n </div>\\n</div>\\n\\n<div class=\\\"row\\\">\\n <hr />\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <h3 id=\\\"service-network-specs\\\">Networks & ports</h3>\\n <div id=\\\"service-networks\\\" class=\\\"padding-top\\\" ng-include=\\\"'app/docker/views/services/edit/includes/networks.html'\\\"></div>\\n <div id=\\\"service-published-ports\\\" class=\\\"padding-top\\\" ng-include=\\\"'app/docker/views/services/edit/includes/ports.html'\\\"></div>\\n <div id=\\\"service-hosts-entries\\\" class=\\\"padding-top\\\" ng-include=\\\"'app/docker/views/services/edit/includes/hosts.html'\\\"></div>\\n </div>\\n</div>\\n\\n<div class=\\\"row\\\">\\n <hr />\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <h3 id=\\\"service-specs\\\">Service specification</h3>\\n <div id=\\\"service-resources\\\" class=\\\"padding-top\\\" ng-include=\\\"'app/docker/views/services/edit/includes/resources.html'\\\"></div>\\n <div id=\\\"service-placement-constraints\\\" class=\\\"padding-top\\\" ng-include=\\\"'app/docker/views/services/edit/includes/constraints.html'\\\"></div>\\n <div\\n id=\\\"service-placement-preferences\\\"\\n ng-if=\\\"applicationState.endpoint.apiVersion >= 1.3\\\"\\n class=\\\"padding-top\\\"\\n ng-include=\\\"'app/docker/views/services/edit/includes/placementPreferences.html'\\\"\\n ></div>\\n <div id=\\\"service-restart-policy\\\" class=\\\"padding-top\\\" ng-include=\\\"'app/docker/views/services/edit/includes/restart.html'\\\"></div>\\n <div id=\\\"service-update-config\\\" class=\\\"padding-top\\\" ng-include=\\\"'app/docker/views/services/edit/includes/updateconfig.html'\\\"></div>\\n <div id=\\\"service-logging\\\" class=\\\"padding-top\\\" ng-include=\\\"'app/docker/views/services/edit/includes/logging.html'\\\"></div>\\n <div id=\\\"service-labels\\\" class=\\\"padding-top\\\" ng-include=\\\"'app/docker/views/services/edit/includes/servicelabels.html'\\\"></div>\\n <div id=\\\"service-configs\\\" class=\\\"padding-top\\\" ng-include=\\\"'app/docker/views/services/edit/includes/configs.html'\\\"></div>\\n <div id=\\\"service-secrets\\\" ng-if=\\\"applicationState.endpoint.apiVersion >= 1.25\\\" class=\\\"padding-top\\\" ng-include=\\\"'app/docker/views/services/edit/includes/secrets.html'\\\"></div>\\n <div id=\\\"service-tasks\\\" class=\\\"padding-top\\\" ng-include=\\\"'app/docker/views/services/edit/includes/tasks.html'\\\"></div>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/services/create/createservice.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Create service\\\"></rd-header-title>\\n <rd-header-content> <a ui-sref=\\\"docker.services\\\">Services</a> > Add service </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\" autocomplete=\\\"off\\\">\\n <!-- name-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"service_name\\\" class=\\\"col-sm-1 control-label text-left\\\">Name</label>\\n <div class=\\\"col-sm-11\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.Name\\\" id=\\\"service_name\\\" placeholder=\\\"e.g. myService\\\" />\\n </div>\\n </div>\\n <!-- !name-input -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Image configuration\\n </div>\\n <!-- image-and-registry -->\\n <por-image-registry\\n model=\\\"formValues.RegistryModel\\\"\\n auto-complete=\\\"true\\\"\\n label-class=\\\"col-sm-1\\\"\\n input-class=\\\"col-sm-11\\\"\\n endpoint=\\\"endpoint\\\"\\n is-admin=\\\"isAdmin\\\"\\n check-rate-limits=\\\"true\\\"\\n set-validity=\\\"setPullImageValidity\\\"\\n >\\n </por-image-registry>\\n <!-- !image-and-registry -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Scheduling\\n </div>\\n <!-- scheduling-mode -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label class=\\\"control-label text-left\\\">\\n Scheduling mode\\n </label>\\n <div class=\\\"btn-group btn-group-sm\\\" style=\\\"margin-left: 20px;\\\">\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"formValues.Mode\\\" uib-btn-radio=\\\"'global'\\\">Global</label>\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"formValues.Mode\\\" uib-btn-radio=\\\"'replicated'\\\">Replicated</label>\\n </div>\\n </div>\\n </div>\\n <div class=\\\"form-group form-inline\\\" ng-if=\\\"formValues.Mode === 'replicated'\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label class=\\\"control-label text-left\\\">\\n Replicas\\n </label>\\n <input type=\\\"number\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.Replicas\\\" id=\\\"replicas\\\" placeholder=\\\"e.g. 3\\\" style=\\\"margin-left: 20px;\\\" />\\n </div>\\n </div>\\n <!-- !scheduling-mode -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Ports configuration\\n </div>\\n <!-- port-mapping -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 5px;\\\">\\n <label class=\\\"control-label text-left\\\">Port mapping</label>\\n <span class=\\\"label label-default interactive\\\" style=\\\"margin-left: 10px;\\\" ng-click=\\\"addPortBinding()\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> map additional port\\n </span>\\n </div>\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\">\\n <div ng-repeat=\\\"portBinding in formValues.Ports\\\" style=\\\"margin-top: 2px;\\\">\\n <!-- host-port -->\\n <div class=\\\"input-group col-sm-3 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">host</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"portBinding.PublishedPort\\\" placeholder=\\\"e.g. 80 or 1.2.3.4:80 (optional)\\\" />\\n </div>\\n <!-- !host-port -->\\n <span style=\\\"margin: 0 10px 0 10px;\\\">\\n <i class=\\\"fa fa-long-arrow-alt-right\\\" aria-hidden=\\\"true\\\"></i>\\n </span>\\n <!-- container-port -->\\n <div class=\\\"input-group col-sm-3 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">container</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"portBinding.TargetPort\\\" placeholder=\\\"e.g. 80\\\" />\\n </div>\\n <!-- !container-port -->\\n <!-- protocol-actions -->\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <div class=\\\"btn-group btn-group-sm\\\">\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"portBinding.Protocol\\\" uib-btn-radio=\\\"'tcp'\\\">TCP</label>\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"portBinding.Protocol\\\" uib-btn-radio=\\\"'udp'\\\">UDP</label>\\n </div>\\n <div class=\\\"btn-group btn-group-sm\\\">\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"portBinding.PublishMode\\\" uib-btn-radio=\\\"'ingress'\\\">Ingress</label>\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"portBinding.PublishMode\\\" uib-btn-radio=\\\"'host'\\\">Host</label>\\n </div>\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removePortBinding($index)\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n <!-- !protocol-actions -->\\n </div>\\n </div>\\n <!-- !port-mapping-input-list -->\\n </div>\\n <!-- !port-mapping -->\\n <!-- create-webhook -->\\n <div ng-if=\\\"endpoint.Type !== 4\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Webhooks\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label class=\\\"control-label text-left\\\">\\n Create a service webhook\\n <portainer-tooltip\\n position=\\\"top\\\"\\n message=\\\"Create a webhook (or callback URI) to automate the update of this service. Sending a POST request to this callback URI (without requiring any authentication) will pull the most up-to-date version of the associated image and re-deploy this service.\\\"\\n ></portainer-tooltip>\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\"> <input type=\\\"checkbox\\\" ng-model=\\\"formValues.Webhook\\\" /><i></i> </label>\\n </div>\\n </div>\\n </div>\\n <!-- !create-webhook -->\\n <!-- access-control -->\\n <por-access-control-form form-data=\\\"formValues.AccessControlData\\\"></por-access-control-form>\\n <!-- !access-control -->\\n <!-- actions -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"state.actionInProgress || !formValues.RegistryModel.Image || !volumesAreValid()\\\"\\n ng-click=\\\"create()\\\"\\n button-spinner=\\\"state.actionInProgress\\\"\\n >\\n <span ng-hide=\\\"state.actionInProgress\\\">Create the service</span>\\n <span ng-show=\\\"state.actionInProgress\\\">Creating service...</span>\\n </button>\\n <span class=\\\"text-danger\\\" ng-if=\\\"state.formValidationError\\\" style=\\\"margin-left: 5px;\\\">{{ state.formValidationError }}</span>\\n </div>\\n </div>\\n <!-- !actions -->\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <ul class=\\\"nav nav-pills nav-justified\\\">\\n <li class=\\\"active interactive\\\"><a data-target=\\\"#command\\\" data-toggle=\\\"tab\\\">Command & Logging</a></li>\\n <li class=\\\"interactive\\\"><a data-target=\\\"#volumes\\\" data-toggle=\\\"tab\\\">Volumes</a></li>\\n <li class=\\\"interactive\\\"><a data-target=\\\"#network\\\" data-toggle=\\\"tab\\\">Network</a></li>\\n <li class=\\\"interactive\\\"><a data-target=\\\"#env\\\" data-toggle=\\\"tab\\\">Env</a></li>\\n <li class=\\\"interactive\\\"><a data-target=\\\"#labels\\\" data-toggle=\\\"tab\\\">Labels</a></li>\\n <li class=\\\"interactive\\\"><a data-target=\\\"#update-config\\\" data-toggle=\\\"tab\\\">Update config & Restart</a></li>\\n <li class=\\\"interactive\\\" ng-if=\\\"applicationState.endpoint.apiVersion >= 1.25\\\"><a data-target=\\\"#secrets\\\" data-toggle=\\\"tab\\\">Secrets</a></li>\\n <li class=\\\"interactive\\\"><a data-target=\\\"#configs\\\" data-toggle=\\\"tab\\\" ng-if=\\\"applicationState.endpoint.apiVersion >= 1.3\\\">Configs</a></li>\\n <li class=\\\"interactive\\\"><a data-target=\\\"#resources-placement\\\" data-toggle=\\\"tab\\\" ng-click=\\\"refreshSlider()\\\">Resources & Placement</a></li>\\n </ul>\\n <!-- tab-content -->\\n <div class=\\\"tab-content\\\">\\n <!-- tab-command -->\\n <div class=\\\"tab-pane active\\\" id=\\\"command\\\">\\n <form class=\\\"form-horizontal\\\" style=\\\"margin-top: 15px;\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Command\\n </div>\\n <!-- command-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"service_command\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Command</label>\\n <div class=\\\"col-sm-9\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.Command\\\" id=\\\"service_command\\\" placeholder=\\\"e.g. /usr/bin/nginx -t -c /mynginx.conf\\\" />\\n </div>\\n </div>\\n <!-- !command-input -->\\n <!-- entrypoint-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"service_entrypoint\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Entrypoint</label>\\n <div class=\\\"col-sm-9\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.EntryPoint\\\" id=\\\"service_entrypoint\\\" placeholder=\\\"e.g. /bin/sh -c\\\" />\\n </div>\\n </div>\\n <!-- !entrypoint-input -->\\n <!-- workdir-user-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"service_workingdir\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Working Dir</label>\\n <div class=\\\"col-sm-4\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.WorkingDir\\\" id=\\\"service_workingdir\\\" placeholder=\\\"e.g. /myapp\\\" />\\n </div>\\n <label for=\\\"service_user\\\" class=\\\"col-sm-1 control-label text-left\\\">User</label>\\n <div class=\\\"col-sm-4\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.User\\\" id=\\\"service_user\\\" placeholder=\\\"e.g. nginx\\\" />\\n </div>\\n </div>\\n <!-- !workdir-user-input -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Logging\\n </div>\\n <!-- logging-driver -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"log-driver\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Driver</label>\\n <div class=\\\"col-sm-4\\\">\\n <select class=\\\"form-control\\\" ng-model=\\\"formValues.LogDriverName\\\" id=\\\"log-driver\\\">\\n <option selected value=\\\"\\\">Default logging driver</option>\\n <option ng-repeat=\\\"driver in availableLoggingDrivers\\\" ng-value=\\\"driver\\\">{{ driver }}</option>\\n <option value=\\\"none\\\">none</option>\\n </select>\\n </div>\\n <div class=\\\"col-sm-5\\\">\\n <p class=\\\"small text-muted\\\">\\n Logging driver for service that will override the default docker daemon driver. Select Default logging driver if you don't want to override it. Supported\\n logging drivers can be found\\n <a href=\\\"https://docs.docker.com/engine/admin/logging/overview/#supported-logging-drivers\\\" target=\\\"_blank\\\">in the Docker documentation</a>.\\n </p>\\n </div>\\n </div>\\n <!-- !logging-driver -->\\n <!-- logging-opts -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 5px;\\\">\\n <label class=\\\"control-label text-left\\\">\\n Options\\n <portainer-tooltip\\n position=\\\"top\\\"\\n message=\\\"Add button is disabled unless a driver other than none or default is selected. Options are specific to the selected driver, refer to the driver documentation.\\\"\\n ></portainer-tooltip>\\n </label>\\n <span\\n class=\\\"label label-default interactive\\\"\\n style=\\\"margin-left: 10px;\\\"\\n ng-click=\\\"!formValues.LogDriverName || formValues.LogDriverName === 'none' || addLogDriverOpt(formValues.LogDriverName)\\\"\\n >\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add logging driver option\\n </span>\\n </div>\\n <!-- logging-opts-input-list -->\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\">\\n <div ng-repeat=\\\"opt in formValues.LogDriverOpts\\\" style=\\\"margin-top: 2px;\\\">\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">option</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"opt.name\\\" placeholder=\\\"e.g. FOO\\\" />\\n </div>\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">value</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"opt.value\\\" placeholder=\\\"e.g. bar\\\" />\\n </div>\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removeLogDriverOpt($index)\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n <!-- logging-opts-input-list -->\\n </div>\\n <!-- !logging-opts -->\\n </form>\\n </div>\\n <!-- !tab-command -->\\n <!-- tab-volume -->\\n <div class=\\\"tab-pane\\\" id=\\\"volumes\\\">\\n <form class=\\\"form-horizontal\\\" style=\\\"margin-top: 15px;\\\">\\n <!-- volumes -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 5px;\\\">\\n <label class=\\\"control-label text-left\\\">Volume mapping</label>\\n <span class=\\\"label label-default interactive\\\" style=\\\"margin-left: 10px;\\\" ng-click=\\\"addVolume()\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> map additional volume\\n </span>\\n </div>\\n <!-- volumes-input-list -->\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\">\\n <div ng-repeat=\\\"volume in formValues.Volumes\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 10px;\\\">\\n <!-- volume-line1 -->\\n <div class=\\\"col-sm-12 form-inline\\\">\\n <!-- container-path -->\\n <div class=\\\"input-group col-sm-6\\\">\\n <div class=\\\"input-group input-group-sm w-full\\\">\\n <span class=\\\"input-group-addon\\\">container</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"volume.Target\\\" placeholder=\\\"e.g. /path/in/container\\\" />\\n </div>\\n <div class=\\\"small text-warning\\\" ng-show=\\\"!volume.Target\\\"> <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Target is required. </div>\\n </div>\\n <!-- !container-path -->\\n <!-- volume-type -->\\n <div class=\\\"input-group col-sm-5\\\" style=\\\"margin-left: 5px; vertical-align: top;\\\">\\n <div class=\\\"btn-group btn-group-sm\\\" ng-if=\\\"allowBindMounts\\\">\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"volume.Type\\\" uib-btn-radio=\\\"'volume'\\\" ng-click=\\\"volume.Source = null\\\">Volume</label>\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"volume.Type\\\" uib-btn-radio=\\\"'bind'\\\" ng-click=\\\"volume.Source = null\\\">Bind</label>\\n </div>\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removeVolume($index)\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n <!-- !volume-type -->\\n </div>\\n <!-- !volume-line1 -->\\n <!-- volume-line2 -->\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 5px;\\\">\\n <div style=\\\"height: 30px; display: inline-block; vertical-align: top; display: inline-flex; align-items: center;\\\">\\n <i class=\\\"fa fa-long-arrow-alt-right\\\" aria-hidden=\\\"true\\\"></i>\\n </div>\\n <!-- volume -->\\n <div class=\\\"col-sm-6 input-group\\\" ng-if=\\\"volume.Type === 'volume'\\\" style=\\\"float: none; padding: 0;\\\">\\n <div class=\\\"input-group input-group-sm w-full\\\">\\n <span class=\\\"input-group-addon\\\">volume</span>\\n <select\\n class=\\\"form-control\\\"\\n ng-model=\\\"volume.Source\\\"\\n ng-options=\\\"vol as ((vol.Id|truncate:30) + ' - ' + (vol.Driver|truncate:30)) for vol in availableVolumes\\\"\\n >\\n <option selected disabled value=\\\"\\\">Select a volume</option>\\n </select>\\n </div>\\n <div class=\\\"small text-warning\\\" ng-show=\\\"!volume.Source\\\"> <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Source is required. </div>\\n </div>\\n <!-- !volume -->\\n <!-- bind -->\\n <div class=\\\"input-group input-group-sm col-sm-6\\\" ng-if=\\\"volume.Type === 'bind'\\\">\\n <div class=\\\"input-group input-group-sm w-full\\\">\\n <span class=\\\"input-group-addon\\\">host</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"volume.Source\\\" placeholder=\\\"e.g. /path/on/host\\\" />\\n </div>\\n <div class=\\\"small text-warning\\\" ng-show=\\\"!volume.Source\\\"> <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Source is required. </div>\\n </div>\\n <!-- !bind -->\\n <!-- read-only -->\\n <div class=\\\"input-group input-group-sm col-sm-5\\\" style=\\\"margin-left: 5px; vertical-align: top;\\\">\\n <div class=\\\"btn-group btn-group-sm\\\">\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"volume.ReadOnly\\\" uib-btn-radio=\\\"false\\\">Writable</label>\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"volume.ReadOnly\\\" uib-btn-radio=\\\"true\\\">Read-only</label>\\n </div>\\n </div>\\n <!-- !read-only -->\\n </div>\\n <!-- !volume-line2 -->\\n </div>\\n </div>\\n </div>\\n <!-- !volumes-input-list -->\\n </div>\\n <!-- !volumes -->\\n </form>\\n </div>\\n <!-- !tab-volume -->\\n <!-- tab-network -->\\n <div class=\\\"tab-pane\\\" id=\\\"network\\\">\\n <form class=\\\"form-horizontal\\\" style=\\\"margin-top: 15px;\\\">\\n <!-- network-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"container_network\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Network</label>\\n <div class=\\\"col-sm-9\\\">\\n <select class=\\\"form-control\\\" ng-model=\\\"formValues.Network\\\">\\n <option selected disabled hidden value=\\\"\\\">Select a network</option>\\n <option ng-repeat=\\\"net in availableNetworks | orderBy: 'Name'\\\" ng-value=\\\"net.Name\\\">{{ net.Name }}</option>\\n </select>\\n </div>\\n <div class=\\\"col-sm-2\\\"></div>\\n </div>\\n <!-- !network-input -->\\n <!-- extra-networks -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 5px;\\\">\\n <label class=\\\"control-label text-left\\\">Extra networks</label>\\n <span class=\\\"label label-default interactive\\\" style=\\\"margin-left: 10px;\\\" ng-click=\\\"addExtraNetwork()\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add extra network\\n </span>\\n </div>\\n <!-- network-input-list -->\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\">\\n <div ng-repeat=\\\"network in formValues.ExtraNetworks\\\" style=\\\"margin-top: 2px;\\\">\\n <select class=\\\"form-control\\\" ng-model=\\\"network.Name\\\">\\n <option selected disabled hidden value=\\\"\\\">Select a network</option>\\n <option ng-repeat=\\\"net in availableNetworks\\\" ng-value=\\\"net.Name\\\">{{ net.Name }}</option>\\n </select>\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removeExtraNetwork($index)\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n <!-- !network-input-list -->\\n </div>\\n <!-- !extra-networks -->\\n <!-- extra-hosts-variables -->\\n <div class=\\\"form-group\\\" ng-if=\\\"applicationState.endpoint.apiVersion >= 1.25\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 5px;\\\">\\n <label class=\\\"control-label text-left\\\">Hosts file entries</label>\\n <span class=\\\"label label-default interactive\\\" style=\\\"margin-left: 10px;\\\" ng-click=\\\"addHostsEntry()\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add additional entry\\n </span>\\n </div>\\n <!-- hosts-input-list -->\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\">\\n <div ng-repeat=\\\"variable in formValues.HostsEntries\\\" style=\\\"margin-top: 2px;\\\">\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">value</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"variable.value\\\" placeholder=\\\"e.g. host:IP\\\" />\\n </div>\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removeHostsEntry($index)\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n <!-- !hosts-input-list -->\\n </div>\\n <!-- !extra-hosts-variables -->\\n </form>\\n </div>\\n <!-- !tab-network -->\\n <!-- tab-env -->\\n <div class=\\\"tab-pane\\\" id=\\\"env\\\">\\n <environment-variables-panel\\n ng-model=\\\"formValues.Env\\\"\\n explanation=\\\"These values will be applied to the service when created\\\"\\n on-change=\\\"(handleEnvVarChange)\\\"\\n ></environment-variables-panel>\\n </div>\\n <!-- !tab-env -->\\n <!-- tab-labels -->\\n <div class=\\\"tab-pane\\\" id=\\\"labels\\\">\\n <form class=\\\"form-horizontal\\\" style=\\\"margin-top: 15px;\\\">\\n <!-- labels -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 5px;\\\">\\n <label class=\\\"control-label text-left\\\">Service labels</label>\\n <span class=\\\"label label-default interactive\\\" style=\\\"margin-left: 10px;\\\" ng-click=\\\"addLabel()\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add service label\\n </span>\\n </div>\\n <!-- labels-input-list -->\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\">\\n <div ng-repeat=\\\"label in formValues.Labels\\\" style=\\\"margin-top: 2px;\\\">\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">name</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"label.key\\\" placeholder=\\\"e.g. com.example.foo\\\" />\\n </div>\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">value</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"label.value\\\" placeholder=\\\"e.g. bar\\\" />\\n </div>\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removeLabel($index)\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n <!-- !labels-input-list -->\\n </div>\\n <!-- !labels-->\\n <!-- container-labels -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 5px;\\\">\\n <label class=\\\"control-label text-left\\\">Container labels</label>\\n <span class=\\\"label label-default interactive\\\" style=\\\"margin-left: 10px;\\\" ng-click=\\\"addContainerLabel()\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add container label\\n </span>\\n </div>\\n <!-- container-labels-input-list -->\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\">\\n <div ng-repeat=\\\"label in formValues.ContainerLabels\\\" style=\\\"margin-top: 2px;\\\">\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">name</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"label.key\\\" placeholder=\\\"e.g. com.example.foo\\\" />\\n </div>\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">value</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"label.value\\\" placeholder=\\\"e.g. bar\\\" />\\n </div>\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removeContainerLabel($index)\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n <!-- !container-labels-input-list -->\\n </div>\\n <!-- !container-labels-->\\n </form>\\n </div>\\n <!-- !tab-labels -->\\n <!-- tab-update-config -->\\n <div class=\\\"tab-pane\\\" id=\\\"update-config\\\" ng-include=\\\"'app/docker/views/services/create/includes/update-restart.html'\\\"></div>\\n <!-- !tab-update-config -->\\n <!-- tab-secrets -->\\n <div class=\\\"tab-pane\\\" id=\\\"secrets\\\" ng-if=\\\"applicationState.endpoint.apiVersion >= 1.25\\\" ng-include=\\\"'app/docker/views/services/create/includes/secret.html'\\\"></div>\\n <!-- !tab-secrets -->\\n <!-- tab-configs -->\\n <div class=\\\"tab-pane\\\" id=\\\"configs\\\" ng-if=\\\"applicationState.endpoint.apiVersion >= 1.3\\\" ng-include=\\\"'app/docker/views/services/create/includes/config.html'\\\"></div>\\n <!-- !tab-configs -->\\n <!-- tab-resources-placement -->\\n <div class=\\\"tab-pane\\\" id=\\\"resources-placement\\\" ng-include=\\\"'app/docker/views/services/create/includes/resources-placement.html'\\\"></div>\\n <!-- !tab-resources-placement -->\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/services/logs/servicelogs.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Service logs\\\"></rd-header-title>\\n <rd-header-content>\\n <a ui-sref=\\\"docker.services\\\">Services</a> > <a ui-sref=\\\"docker.services.service({id: service.Id})\\\">{{ service.Name }}</a> > Logs\\n </rd-header-content>\\n</rd-header>\\n\\n<log-viewer\\n data=\\\"logs\\\"\\n ng-if=\\\"logs\\\"\\n log-collection-change=\\\"changeLogCollection\\\"\\n display-timestamps=\\\"state.displayTimestamps\\\"\\n line-count=\\\"state.lineCount\\\"\\n since-timestamp=\\\"state.sinceTimestamp\\\"\\n resource-name=\\\"service.Name\\\"\\n></log-viewer>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/views/stacks/stacks.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Stacks list\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"Refresh\\\" ui-sref=\\\"docker.stacks\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content>Stacks</rd-header-content>\\n</rd-header>\\n<information-panel-offline ng-if=\\\"offlineMode\\\"></information-panel-offline>\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <stacks-datatable\\n title-text=\\\"Stacks\\\"\\n title-icon=\\\"fa-th-list\\\"\\n dataset=\\\"stacks\\\"\\n table-key=\\\"stacks\\\"\\n order-by=\\\"Name\\\"\\n remove-action=\\\"removeAction\\\"\\n offline-mode=\\\"offlineMode\\\"\\n refresh-callback=\\\"getStacks\\\"\\n create-enabled=\\\"createEnabled\\\"\\n ></stacks-datatable>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/views/stacks/edit/stack.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Stack details\\\">\\n <a data-toggle=\\\"tooltip\\\" title-text=\\\"Refresh\\\" ui-sref=\\\"docker.stacks.stack({id: stack.Id})\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content> <a ui-sref=\\\"docker.stacks\\\">Stacks</a> > {{ stackName }} </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <uib-tabset active=\\\"state.activeTab\\\">\\n <!-- tab-info -->\\n <uib-tab index=\\\"0\\\">\\n <uib-tab-heading> <i class=\\\"fa fa-th-list\\\" aria-hidden=\\\"true\\\"></i> Stack </uib-tab-heading>\\n <div style=\\\"margin-top: 10px;\\\">\\n <!-- stack-information -->\\n <div ng-if=\\\"external || orphaned\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Information\\n </div>\\n <div class=\\\"form-group\\\">\\n <span class=\\\"small\\\">\\n <p class=\\\"text-muted\\\">\\n <i class=\\\"fa fa-exclamation-circle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n <span ng-if=\\\"external\\\">This stack was created outside of Portainer. Control over this stack is limited.</span>\\n <span ng-if=\\\"orphaned\\\">This stack is orphaned. You can reassociate it with the current environment using the \\\"Associate to this environment\\\" feature.</span>\\n </p>\\n </span>\\n </div>\\n </div>\\n <!-- !stack-information -->\\n <!-- stack-details -->\\n <div>\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Stack details\\n </div>\\n <div class=\\\"form-group\\\">\\n {{ stackName }}\\n\\n <button\\n authorization=\\\"PortainerStackUpdate\\\"\\n ng-if=\\\"regular && stack.Status === 2\\\"\\n ng-disabled=\\\"state.actionInProgress\\\"\\n class=\\\"btn btn-xs btn-success\\\"\\n ng-click=\\\"startStack()\\\"\\n >\\n <i class=\\\"fa fa-play space-right\\\" aria-hidden=\\\"true\\\"></i>\\n Start this stack\\n </button>\\n\\n <button\\n ng-if=\\\"regular && stack.Status === 1\\\"\\n authorization=\\\"PortainerStackUpdate\\\"\\n ng-disabled=\\\"state.actionInProgress\\\"\\n class=\\\"btn btn-xs btn-danger\\\"\\n ng-click=\\\"stopStack()\\\"\\n >\\n <i class=\\\"fa fa-stop space-right\\\" aria-hidden=\\\"true\\\"></i>\\n Stop this stack\\n </button>\\n\\n <button authorization=\\\"PortainerStackDelete\\\" class=\\\"btn btn-xs btn-danger\\\" ng-click=\\\"removeStack()\\\" ng-if=\\\"!external || stack.Type == 1\\\">\\n <i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>\\n Delete this stack\\n </button>\\n\\n <button\\n ng-if=\\\"regular && stackFileContent\\\"\\n class=\\\"btn btn-primary btn-xs\\\"\\n ui-sref=\\\"docker.templates.custom.new({fileContent: stackFileContent, type: stack.Type})\\\"\\n >\\n <i class=\\\"fa fa-plus space-right\\\" aria-hidden=\\\"true\\\"></i>\\n Create template from stack\\n </button>\\n </div>\\n </div>\\n <!-- !stack-details -->\\n\\n <!-- associate -->\\n <div ng-if=\\\"orphaned\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Associate to this environment\\n </div>\\n <p class=\\\"small text-muted\\\">\\n This feature allows you to reassociate this stack to the current environment.\\n </p>\\n <form class=\\\"form-horizontal\\\">\\n <por-access-control-form form-data=\\\"formValues.AccessControlData\\\" hide-title=\\\"true\\\"></por-access-control-form>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"state.actionInProgress\\\"\\n ng-click=\\\"associateStack()\\\"\\n button-spinner=\\\"state.actionInProgress\\\"\\n style=\\\"margin-left: -5px;\\\"\\n >\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 3px;\\\"></i>\\n <span ng-hide=\\\"state.actionInProgress\\\">Associate</span>\\n <span ng-show=\\\"state.actionInProgress\\\">Association in progress...</span>\\n </button>\\n <span class=\\\"text-danger\\\" ng-if=\\\"state.formValidationError\\\" style=\\\"margin-left: 5px;\\\">{{ state.formValidationError }}</span>\\n </div>\\n </div>\\n </form>\\n </div>\\n <!-- !associate -->\\n\\n <stack-redeploy-git-form ng-if=\\\"stack.GitConfig\\\" model=\\\"stack.GitConfig\\\" stack=\\\"stack\\\" authorization=\\\"PortainerStackUpdate\\\"> </stack-redeploy-git-form>\\n <stack-duplication-form\\n ng-if=\\\"regular && endpoints.length > 0\\\"\\n endpoints=\\\"endpoints\\\"\\n groups=\\\"groups\\\"\\n current-endpoint-id=\\\"currentEndpointId\\\"\\n on-duplicate=\\\"duplicateStack(name, endpointId)\\\"\\n on-migrate=\\\"migrateStack(name, endpointId)\\\"\\n yaml-error=\\\"state.yamlError\\\"\\n >\\n </stack-duplication-form>\\n </div>\\n </uib-tab>\\n <!-- !tab-info -->\\n <!-- tab-file -->\\n <uib-tab index=\\\"1\\\" select=\\\"showEditor()\\\" ng-if=\\\"!external && !stack.GitConfig\\\">\\n <uib-tab-heading> <i class=\\\"fa fa-pencil-alt space-right\\\" aria-hidden=\\\"true\\\"></i> Editor </uib-tab-heading>\\n <form class=\\\"form-horizontal\\\" ng-if=\\\"state.showEditorTab\\\" style=\\\"margin-top: 10px;\\\" name=\\\"stackUpdateForm\\\">\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\" style=\\\"margin-bottom: 7px;\\\" ng-if=\\\"stackType == 2 && composeSyntaxMaxVersion == 2\\\">\\n This stack will be deployed using the equivalent of <code>docker-compose</code>. Only Compose file format version <b>2</b> is supported at the moment.\\n </span>\\n <span class=\\\"col-sm-12 text-muted small\\\" style=\\\"margin-bottom: 7px;\\\" ng-if=\\\"stackType == 2 && composeSyntaxMaxVersion > 2\\\">\\n This stack will be deployed using <code>docker-compose</code>.\\n </span>\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n You can get more information about Compose file format in the <a href=\\\"https://docs.docker.com/compose/compose-file/\\\" target=\\\"_blank\\\">official documentation</a>.\\n </span>\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <code-editor\\n read-only=\\\"orphaned\\\"\\n identifier=\\\"stack-editor\\\"\\n placeholder=\\\"# Define or paste the content of your docker-compose file here\\\"\\n yml=\\\"true\\\"\\n on-change=\\\"(editorUpdate)\\\"\\n value=\\\"stackFileContent\\\"\\n ></code-editor>\\n </div>\\n </div>\\n <!-- environment-variables -->\\n <div ng-if=\\\"stack\\\">\\n <environment-variables-panel\\n ng-model=\\\"formValues.Env\\\"\\n explanation=\\\"These values will be used as substitutions in the stack file\\\"\\n on-change=\\\"(handleEnvVarChange)\\\"\\n ></environment-variables-panel>\\n </div>\\n <!-- !environment-variables -->\\n <!-- options -->\\n <div ng-if=\\\"stack.Type === 1 && applicationState.endpoint.apiVersion >= 1.27\\\" authorization=\\\"PortainerStackUpdate\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Options\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label for=\\\"prune\\\" class=\\\"control-label text-left\\\">\\n Prune services\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"Prune services that are no longer referenced.\\\"></portainer-tooltip>\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\"> <input name=\\\"prune\\\" type=\\\"checkbox\\\" ng-model=\\\"formValues.Prune\\\" /><i></i> </label>\\n </div>\\n </div>\\n </div>\\n <!-- !options -->\\n <div authorization=\\\"PortainerStackUpdate\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-primary\\\"\\n ng-disabled=\\\"state.actionInProgress || !stackUpdateForm.$valid || !stackFileContent || orphaned\\\"\\n ng-click=\\\"deployStack()\\\"\\n button-spinner=\\\"state.actionInProgress\\\"\\n >\\n <span ng-hide=\\\"state.actionInProgress\\\">Update the stack</span>\\n <span ng-show=\\\"state.actionInProgress\\\">Deployment in progress...</span>\\n </button>\\n </div>\\n </div>\\n </div>\\n </form>\\n </uib-tab>\\n <!-- !tab-file -->\\n </uib-tabset>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\\n<div class=\\\"row\\\" ng-if=\\\"containers && (!orphaned || orphanedRunning)\\\">\\n <div class=\\\"col-sm-12\\\">\\n <containers-datatable\\n title-text=\\\"Containers\\\"\\n title-icon=\\\"fa-cubes\\\"\\n dataset=\\\"containers\\\"\\n table-key=\\\"stack-containers\\\"\\n order-by=\\\"Status\\\"\\n show-host-column=\\\"false\\\"\\n show-add-action=\\\"false\\\"\\n not-auto-focus=\\\"true\\\"\\n ></containers-datatable>\\n </div>\\n</div>\\n\\n<div class=\\\"row\\\" ng-if=\\\"services && (!orphaned || orphanedRunning)\\\">\\n <div class=\\\"col-sm-12\\\">\\n <services-datatable\\n title-text=\\\"Services\\\"\\n title-icon=\\\"fa-list-alt\\\"\\n dataset=\\\"services\\\"\\n table-key=\\\"stack-services\\\"\\n order-by=\\\"Name\\\"\\n nodes=\\\"nodes\\\"\\n agent-proxy=\\\"applicationState.endpoint.mode.agentProxy && applicationState.endpoint.mode.provider === 'DOCKER_SWARM_MODE'\\\"\\n show-ownership-column=\\\"false\\\"\\n show-update-action=\\\"applicationState.endpoint.apiVersion >= 1.25\\\"\\n show-task-logs-button=\\\"applicationState.endpoint.apiVersion >= 1.30\\\"\\n show-add-action=\\\"false\\\"\\n show-stack-column=\\\"false\\\"\\n not-auto-focus=\\\"true\\\"\\n ></services-datatable>\\n </div>\\n</div>\\n\\n<!-- access-control-panel -->\\n<por-access-control-panel ng-if=\\\"stack && !orphaned\\\" resource-id=\\\"stack.EndpointId + '_' + stack.Name\\\" resource-control=\\\"stack.ResourceControl\\\" resource-type=\\\"'stack'\\\">\\n</por-access-control-panel>\\n<!-- !access-control-panel -->\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/views/stacks/create/createstack.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Create stack\\\"></rd-header-title>\\n <rd-header-content> <a ui-sref=\\\"docker.stacks\\\">Stacks</a> > Add stack </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\" name=\\\"createStackForm\\\">\\n <!-- name-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"stack_name\\\" class=\\\"col-sm-1 control-label text-left\\\">Name</label>\\n <div class=\\\"col-sm-11\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"formValues.Name\\\"\\n id=\\\"stack_name\\\"\\n name=\\\"stack_name\\\"\\n placeholder=\\\"e.g. mystack\\\"\\n auto-focus\\n ng-pattern=\\\"STACK_NAME_VALIDATION_REGEX\\\"\\n />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"createStackForm.stack_name.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"createStackForm.stack_name.$error\\\">\\n <p ng-message=\\\"pattern\\\">\\n <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i>\\n <span>This field must consist of lower case alphanumeric characters, '_' or '-' (e.g. 'my-name', or 'abc-123').</span>\\n </p>\\n </div>\\n </div>\\n </div>\\n <!-- !name-input -->\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\" ng-if=\\\"state.StackType === 1\\\">\\n This stack will be deployed using the equivalent of the <code>docker stack deploy</code> command.\\n </span>\\n <div class=\\\"col-sm-12 text-muted small\\\" ng-if=\\\"state.StackType === 2 && composeSyntaxMaxVersion == 2\\\">\\n <div style=\\\"margin-bottom: 7px;\\\">\\n This stack will be deployed using the equivalent of <code>docker-compose</code>. Only Compose file format version <b>2</b> is supported at the moment.\\n </div>\\n <i class=\\\"fa fa-exclamation-circle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Note: Due to a limitation of libcompose, the name of the stack will be standardized to remove all special characters and uppercase letters.\\n </div>\\n <span class=\\\"col-sm-12 text-muted small\\\" ng-if=\\\"state.StackType === 2 && composeSyntaxMaxVersion > 2\\\">\\n This stack will be deployed using <code>docker-compose</code>.\\n </span>\\n </div>\\n <!-- build-method -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Build method\\n </div>\\n <div class=\\\"form-group\\\"></div>\\n <div class=\\\"form-group\\\" style=\\\"margin-bottom: 0;\\\">\\n <div class=\\\"boxselector_wrapper\\\">\\n <div>\\n <input type=\\\"radio\\\" id=\\\"method_editor\\\" ng-model=\\\"state.Method\\\" value=\\\"editor\\\" />\\n <label for=\\\"method_editor\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-edit\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Web editor\\n </div>\\n <p>Use our Web editor</p>\\n </label>\\n </div>\\n <div>\\n <input type=\\\"radio\\\" id=\\\"method_upload\\\" ng-model=\\\"state.Method\\\" value=\\\"upload\\\" />\\n <label for=\\\"method_upload\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-upload\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Upload\\n </div>\\n <p>Upload from your computer</p>\\n </label>\\n </div>\\n <div>\\n <input type=\\\"radio\\\" id=\\\"method_repository\\\" ng-model=\\\"state.Method\\\" value=\\\"repository\\\" />\\n <label for=\\\"method_repository\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fab fa-git\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Repository\\n </div>\\n <p>Use a git repository</p>\\n </label>\\n </div>\\n <div>\\n <input type=\\\"radio\\\" id=\\\"method_template\\\" ng-model=\\\"state.Method\\\" value=\\\"template\\\" />\\n <label for=\\\"method_template\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-rocket\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Custom template\\n </div>\\n <p>Use a custom template</p>\\n </label>\\n </div>\\n </div>\\n </div>\\n <!-- !build-method -->\\n\\n <!-- upload -->\\n <div ng-show=\\\"state.Method === 'upload'\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Upload\\n </div>\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n You can upload a Compose file from your computer.\\n </span>\\n <div class=\\\"col-sm-12\\\" ng-if=\\\"state.uploadYamlValidationError\\\"\\n ><span class=\\\"text-danger small\\\">{{ state.uploadYamlValidationError }}</span></div\\n >\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ngf-select=\\\"uploadFile($file)\\\">Select file</button>\\n <span style=\\\"margin-left: 5px;\\\">\\n {{ formValues.StackFile.name }}\\n <i class=\\\"fa fa-times red-icon\\\" ng-if=\\\"!formValues.StackFile\\\" aria-hidden=\\\"true\\\"></i>\\n </span>\\n </div>\\n </div>\\n </div>\\n <!-- !upload -->\\n <git-form\\n ng-if=\\\"state.Method === 'repository'\\\"\\n model=\\\"formValues\\\"\\n on-change=\\\"(onChangeFormValues)\\\"\\n additional-file=\\\"true\\\"\\n auto-update=\\\"true\\\"\\n show-auth-explanation=\\\"true\\\"\\n path-text-title=\\\"Compose path\\\"\\n path-placeholder=\\\"docker-compose.yml\\\"\\n ></git-form>\\n\\n <custom-template-selector\\n ng-show=\\\"state.Method === 'template'\\\"\\n new-template-path=\\\"docker.templates.custom.new\\\"\\n stack-type=\\\"state.StackType\\\"\\n on-change=\\\"(onChangeTemplateId)\\\"\\n value=\\\"state.selectedTemplateId\\\"\\n ></custom-template-selector>\\n\\n <web-editor-form\\n ng-if=\\\"state.Method === 'editor' || (state.Method === 'template' && state.selectedTemplateId)\\\"\\n identifier=\\\"stack-creation-editor\\\"\\n value=\\\"formValues.StackFileContent\\\"\\n on-change=\\\"(onChangeFileContent)\\\"\\n ng-required=\\\"true\\\"\\n yml=\\\"true\\\"\\n placeholder=\\\"# Define or paste the content of your docker-compose file here\\\"\\n >\\n <editor-description>\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n You can get more information about Compose file format in the <a href=\\\"https://docs.docker.com/compose/compose-file/\\\" target=\\\"_blank\\\">official documentation</a>.\\n </span>\\n <div class=\\\"col-sm-12\\\" ng-if=\\\"state.editorYamlValidationError\\\">\\n <span class=\\\"text-danger small\\\">{{ state.editorYamlValidationError }}</span>\\n </div>\\n </editor-description>\\n </web-editor-form>\\n\\n <!-- environment-variables -->\\n <environment-variables-panel ng-model=\\\"formValues.Env\\\" explanation=\\\"These values will be used as substitutions in the stack file\\\" on-change=\\\"(handleEnvVarChange)\\\">\\n </environment-variables-panel>\\n <!-- !environment-variables -->\\n <por-access-control-form form-data=\\\"formValues.AccessControlData\\\"></por-access-control-form>\\n <!-- actions -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"state.actionInProgress\\n || !createStackForm.$valid\\n || ((state.Method === 'editor' || state.Method === 'template') && (!formValues.StackFileContent || state.editorYamlValidationError))\\n || (state.Method === 'upload' && (!formValues.StackFile || state.uploadYamlValidationError))\\n || (state.Method === 'repository' && ((!formValues.RepositoryURL || !formValues.ComposeFilePathInRepository) || (formValues.RepositoryAuthentication && !formValues.RepositoryPassword)))\\n || !formValues.Name\\\"\\n ng-click=\\\"deployStack()\\\"\\n button-spinner=\\\"state.actionInProgress\\\"\\n analytics-on\\n analytics-category=\\\"docker\\\"\\n analytics-event=\\\"docker-stack-create\\\"\\n analytics-properties=\\\"buildAnalyticsProperties()\\\"\\n >\\n <span ng-hide=\\\"state.actionInProgress\\\">Deploy the stack</span>\\n <span ng-show=\\\"state.actionInProgress\\\">Deployment in progress...</span>\\n </button>\\n <span class=\\\"text-danger\\\" ng-if=\\\"state.formValidationError\\\" style=\\\"margin-left: 5px;\\\">{{ state.formValidationError }}</span>\\n </div>\\n </div>\\n <!-- !actions -->\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/swarm/swarm.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Cluster overview\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"Refresh\\\" ui-sref=\\\"docker.swarm\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content>Swarm</rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-object-group\\\" title-text=\\\"Cluster status\\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr>\\n <td>Nodes</td>\\n <td>{{ info.Swarm.Nodes }}</td>\\n </tr>\\n <tr>\\n <td>Docker API version</td>\\n <td>{{ docker.ApiVersion }}</td>\\n </tr>\\n <tr>\\n <td>Total CPU</td>\\n <td>{{ totalCPU }}</td>\\n </tr>\\n <tr>\\n <td>Total memory</td>\\n <td>{{ totalMemory | humansize: 2 }}</td>\\n </tr>\\n <tr>\\n <td colspan=\\\"2\\\">\\n <div class=\\\"btn-group\\\" role=\\\"group\\\" aria-label=\\\"...\\\">\\n <a ui-sref=\\\"docker.swarm.visualizer\\\"><i class=\\\"fa fa-object-group space-right\\\" aria-hidden=\\\"true\\\"></i>Go to cluster visualizer</a>\\n </div>\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <nodes-datatable\\n title-text=\\\"Nodes\\\"\\n title-icon=\\\"fa-hdd\\\"\\n dataset=\\\"nodes\\\"\\n table-key=\\\"nodes\\\"\\n order-by=\\\"Hostname\\\"\\n show-ip-address-column=\\\"applicationState.endpoint.apiVersion >= 1.25\\\"\\n access-to-node-details=\\\"isAdmin\\\"\\n refresh-callback=\\\"getNodes\\\"\\n ></nodes-datatable>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/swarm/visualizer/swarmvisualizer.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Swarm visualizer\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"Refresh\\\" ui-sref=\\\"docker.swarm.visualizer\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content> <a ui-sref=\\\"docker.swarm\\\">Swarm</a> > <a ui-sref=\\\"docker.swarm.visualizer\\\">Cluster visualizer</a> </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-object-group\\\" title-text=\\\"Cluster information\\\">\\n <div class=\\\"pull-right\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ng-click=\\\"changeShowInformationPanel(true)\\\" ng-if=\\\"!state.ShowInformationPanel\\\">Show</button>\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ng-click=\\\"changeShowInformationPanel(false)\\\" ng-if=\\\"state.ShowInformationPanel\\\">Hide</button>\\n </div>\\n </rd-widget-header>\\n <rd-widget-body ng-if=\\\"state.ShowInformationPanel\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr>\\n <td>Nodes</td>\\n <td>{{ nodes.length }}</td>\\n </tr>\\n <tr>\\n <td>Services</td>\\n <td>{{ services.length }}</td>\\n </tr>\\n <tr>\\n <td>Tasks</td>\\n <td>{{ tasks.length }}</td>\\n </tr>\\n </tbody>\\n </table>\\n <form class=\\\"form-horizontal\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Options\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label class=\\\"control-label text-left\\\">\\n Only display running tasks\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\">\\n <input type=\\\"checkbox\\\" ng-model=\\\"state.DisplayOnlyRunningTasks\\\" ng-change=\\\"changeDisplayOnlyRunningTasks()\\\" /><i></i>\\n </label>\\n </div>\\n <div class=\\\"col-sm-12\\\">\\n <label class=\\\"control-label text-left\\\">\\n Display node labels\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\"> <input type=\\\"checkbox\\\" ng-model=\\\"state.DisplayNodeLabels\\\" ng-change=\\\"changeDisplayNodeLabels()\\\" /><i></i> </label>\\n </div>\\n </div>\\n </form>\\n <form class=\\\"form-horizontal\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Refresh\\n </div>\\n <div class=\\\"form-group\\\">\\n <label for=\\\"refreshRate\\\" class=\\\"col-sm-1 margin-sm-top control-label text-left\\\">\\n Rate\\n <i id=\\\"refreshRateChange\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"display: none;\\\"></i>\\n </label>\\n <div class=\\\"col-sm-2\\\">\\n <select id=\\\"refreshRate\\\" ng-model=\\\"state.refreshRate\\\" ng-change=\\\"changeUpdateRepeater()\\\" class=\\\"form-control\\\">\\n <option value=\\\"5\\\">5s</option>\\n <option value=\\\"10\\\">10s</option>\\n <option value=\\\"30\\\">30s</option>\\n <option value=\\\"60\\\">60s</option>\\n </select>\\n </div>\\n </div>\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\\n<div class=\\\"row\\\" ng-if=\\\"visualizerData\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-object-group\\\" title-text=\\\"Cluster visualizer\\\"></rd-widget-header>\\n <rd-widget-body>\\n <div class=\\\"visualizer_container\\\">\\n <div class=\\\"node\\\" ng-repeat=\\\"node in visualizerData.nodes | orderBy : ['Role', 'Hostname'] track by $index\\\">\\n <div class=\\\"node_info\\\">\\n <div>\\n <div>\\n <b>{{ node.Name || node.Hostname }}</b>\\n <span class=\\\"node_platform\\\">\\n <i class=\\\"fab fa-linux\\\" aria-hidden=\\\"true\\\" ng-if=\\\"node.PlatformOS === 'linux'\\\"></i>\\n <i class=\\\"fab fa-windows\\\" aria-hidden=\\\"true\\\" ng-if=\\\"node.PlatformOS === 'windows'\\\"></i>\\n </span>\\n </div>\\n </div>\\n <div>{{ node.Role }}</div>\\n <div>CPU: {{ node.CPUs / 1000000000 }}</div>\\n <div>Memory: {{ node.Memory | humansize: 2 }}</div>\\n <div\\n ><span class=\\\"label label-{{ node.Status | nodestatusbadge }}\\\">{{ node.Status }}</span></div\\n >\\n <div class=\\\"node_labels\\\" ng-if=\\\"node.Labels.length > 0 && state.DisplayNodeLabels\\\">\\n <div>Labels</div>\\n <div class=\\\"node_label\\\" ng-repeat=\\\"label in node.Labels\\\">\\n <span class=\\\"label_key\\\">\\n {{ label.key }}\\n </span>\\n <span class=\\\"label_value\\\" ng-if=\\\"label.value\\\"> = {{ label.value }} </span>\\n </div>\\n </div>\\n </div>\\n <div class=\\\"tasks\\\">\\n <div\\n class=\\\"task task_{{ task.Status.State | visualizerTask }}\\\"\\n style=\\\"border: 2px solid {{ task.ServiceId | visualizerTaskBorderColor }}\\\"\\n ng-repeat=\\\"task in node.Tasks | orderBy: 'ServiceName' | filter: (state.DisplayOnlyRunningTasks || '') && { Status: { State: 'running' } }\\\"\\n >\\n <div class=\\\"service_name\\\">{{ task.ServiceName }}</div>\\n <div>Image: {{ task.Spec.ContainerSpec.Image | hideshasum }}</div>\\n <div>Status: {{ task.Status.State }}</div>\\n <div>Update: {{ task.Updated | getisodate }}</div>\\n <div ng-if=\\\"task.Spec.Resources.Limits.MemoryBytes\\\">Memory limit: {{ task.Spec.Resources.Limits.MemoryBytes | humansize: 2:2 }}</div>\\n <div ng-if=\\\"task.Spec.Resources.Limits.NanoCPUs\\\">CPU limit: {{ task.Spec.Resources.Limits.NanoCPUs / 1000000000 }}</div>\\n </div>\\n </div>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/tasks/edit/task.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Task details\\\"></rd-header-title>\\n <rd-header-content ng-if=\\\"task && service\\\">\\n <a ui-sref=\\\"docker.services\\\">Services</a> > <a ui-sref=\\\"docker.services.service({id: service.Id })\\\">{{ service.Name }}</a> > {{ task.Id }}\\n </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\" ng-if=\\\"task && service\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-tasks\\\" title-text=\\\"Task status\\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr>\\n <td>ID</td>\\n <td>{{ task.Id }}</td>\\n </tr>\\n <tr>\\n <td>State</td>\\n <td\\n ><span class=\\\"label label-{{ task.Status.State | taskstatusbadge }}\\\">{{ task.Status.State }}</span></td\\n >\\n </tr>\\n <tr>\\n <td>State Message</td>\\n <td>{{ task.Status.Message }}</td>\\n </tr>\\n <tr ng-if=\\\"task.Status.Err\\\">\\n <td>Error message</td>\\n <td\\n ><code>{{ task.Status.Err }}</code></td\\n >\\n </tr>\\n <tr>\\n <td>Image</td>\\n <td>{{ task.Spec.ContainerSpec.Image | hideshasum }}</td>\\n </tr>\\n <tr ng-if=\\\"service.Mode !== 'global'\\\">\\n <td>Slot</td>\\n <td>{{ task.Slot }}</td>\\n </tr>\\n <tr>\\n <td>Created</td>\\n <td>{{ task.Created | getisodate }}</td>\\n </tr>\\n <tr ng-if=\\\"task.Status.ContainerStatus.ContainerID\\\">\\n <td>Container ID</td>\\n <td>{{ task.Status.ContainerStatus.ContainerID }}</td>\\n </tr>\\n <tr ng-if=\\\"applicationState.endpoint.apiVersion >= 1.3 && task.Status.State | taskhaslogs\\\">\\n <td colspan=\\\"2\\\"\\n ><a class=\\\"btn btn-primary btn-sm\\\" type=\\\"button\\\" ui-sref=\\\"docker.tasks.task.logs({id: task.Id})\\\"\\n ><i class=\\\"fa fa-file-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Task logs</a\\n ></td\\n >\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/tasks/logs/tasklogs.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Task details\\\"></rd-header-title>\\n <rd-header-content ng-if=\\\"task && service\\\">\\n <a ui-sref=\\\"docker.services\\\">Services</a> > <a ui-sref=\\\"docker.services.service({id: service.Id })\\\">{{ service.Name }}</a> >\\n <a ui-sref=\\\"docker.tasks.task({id: task.Id })\\\">{{ task.Id }}</a> > Logs\\n </rd-header-content>\\n</rd-header>\\n\\n<log-viewer\\n data=\\\"logs\\\"\\n ng-if=\\\"logs\\\"\\n log-collection-change=\\\"changeLogCollection\\\"\\n display-timestamps=\\\"state.displayTimestamps\\\"\\n line-count=\\\"state.lineCount\\\"\\n since-timestamp=\\\"state.sinceTimestamp\\\"\\n resource-name=\\\"task.Id\\\"\\n></log-viewer>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/views/templates/templates.html';\nvar html = \"<rd-header id=\\\"view-top\\\">\\n <rd-header-title title-text=\\\"Application templates list\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"Refresh\\\" ui-sref=\\\"docker.templates\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content>Templates</rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <!-- stack-form -->\\n <stack-from-template-form\\n ng-if=\\\"state.selectedTemplate && (state.selectedTemplate.Type === 2 || state.selectedTemplate.Type === 3)\\\"\\n template=\\\"state.selectedTemplate\\\"\\n form-values=\\\"formValues\\\"\\n state=\\\"state\\\"\\n create-template=\\\"createTemplate\\\"\\n unselect-template=\\\"unselectTemplate\\\"\\n >\\n </stack-from-template-form>\\n <!-- !stack-form -->\\n <!-- container-form -->\\n <div class=\\\"col-sm-12\\\" ng-if=\\\"state.selectedTemplate && state.selectedTemplate.Type === 1\\\">\\n <rd-widget>\\n <rd-widget-custom-header icon=\\\"state.selectedTemplate.Logo\\\" title-text=\\\"state.selectedTemplate.Image\\\"></rd-widget-custom-header>\\n <rd-widget-body classes=\\\"padding\\\">\\n <form class=\\\"form-horizontal\\\" name=\\\"selectedTemplateType1\\\">\\n <!-- description -->\\n <div ng-if=\\\"state.selectedTemplate.Note\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Information\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <div class=\\\"template-note\\\" ng-if=\\\"state.selectedTemplate.Note\\\" ng-bind-html=\\\"state.selectedTemplate.Note\\\"></div>\\n </div>\\n </div>\\n </div>\\n <!-- !description -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Configuration\\n </div>\\n <!-- name-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"container_name\\\" class=\\\"col-sm-2 control-label text-left\\\">Name</label>\\n <div class=\\\"col-sm-10\\\">\\n <input type=\\\"text\\\" name=\\\"container_name\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.name\\\" placeholder=\\\"e.g. web (optional)\\\" />\\n </div>\\n </div>\\n <!-- !name-input -->\\n <!-- network-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"container_network\\\" class=\\\"col-sm-2 control-label text-left\\\">Network</label>\\n <div class=\\\"col-sm-10\\\">\\n <select class=\\\"form-control\\\" ng-options=\\\"net.Name for net in availableNetworks | orderBy: 'Name'\\\" ng-model=\\\"formValues.network\\\">\\n <option disabled hidden value=\\\"\\\">Select a network</option>\\n </select>\\n </div>\\n </div>\\n <!-- !network-input -->\\n <!-- env -->\\n <div ng-repeat=\\\"var in state.selectedTemplate.Env\\\" ng-if=\\\"!var.preset || var.select\\\" class=\\\"form-group\\\">\\n <label for=\\\"field_{{ $index }}\\\" class=\\\"col-sm-2 control-label text-left\\\">\\n {{ var.label }}\\n <portainer-tooltip ng-if=\\\"var.description\\\" position=\\\"bottom\\\" message=\\\"{{ var.description }}\\\"></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-if=\\\"!var.select\\\" ng-model=\\\"var.value\\\" id=\\\"field_{{ $index }}\\\" />\\n <select class=\\\"form-control\\\" ng-if=\\\"var.select\\\" ng-model=\\\"var.value\\\" id=\\\"field_{{ $index }}\\\">\\n <option selected disabled hidden value=\\\"\\\">Select value</option>\\n <option ng-repeat=\\\"choice in var.select\\\" value=\\\"{{ choice.value }}\\\">{{ choice.text }}</option>\\n </select>\\n </div>\\n </div>\\n <!-- !env -->\\n <!-- access-control -->\\n <por-access-control-form form-data=\\\"formValues.AccessControlData\\\"></por-access-control-form>\\n <!-- !access-control -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <a class=\\\"small interactive\\\" ng-if=\\\"!state.showAdvancedOptions\\\" ng-click=\\\"state.showAdvancedOptions = true;\\\">\\n <i class=\\\"fa fa-plus space-right\\\" aria-hidden=\\\"true\\\"></i> Show advanced options\\n </a>\\n <a class=\\\"small interactive\\\" ng-if=\\\"state.showAdvancedOptions\\\" ng-click=\\\"state.showAdvancedOptions = false;\\\">\\n <i class=\\\"fa fa-minus space-right\\\" aria-hidden=\\\"true\\\"></i> Hide advanced options\\n </a>\\n </div>\\n </div>\\n <div ng-if=\\\"state.showAdvancedOptions\\\">\\n <!-- port-mapping -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 5px;\\\">\\n <label class=\\\"control-label text-left\\\">Port mapping</label>\\n <span class=\\\"label label-default interactive\\\" style=\\\"margin-left: 10px;\\\" ng-click=\\\"addPortBinding()\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> map additional port\\n </span>\\n </div>\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 10px;\\\" ng-if=\\\"state.selectedTemplate.Ports.length > 0\\\">\\n <span class=\\\"small text-muted\\\">Portainer will automatically assign a port if you leave the host port empty.</span>\\n </div>\\n <!-- !port-mapping -->\\n <!-- port-mapping-input-list -->\\n <div class=\\\"col-sm-12\\\">\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\">\\n <div ng-repeat=\\\"portBinding in state.selectedTemplate.Ports\\\" style=\\\"margin-top: 2px;\\\">\\n <!-- host-port -->\\n <div class=\\\"input-group col-sm-4 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">host</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"portBinding.hostPort\\\" placeholder=\\\"e.g. 80 or 1.2.3.4:80 (optional)\\\" />\\n </div>\\n <!-- !host-port -->\\n <span style=\\\"margin: 0 10px 0 10px;\\\">\\n <i class=\\\"fa fa-long-arrow-alt-right\\\" aria-hidden=\\\"true\\\"></i>\\n </span>\\n <!-- container-port -->\\n <div class=\\\"input-group col-sm-4 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">container</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"portBinding.containerPort\\\" placeholder=\\\"e.g. 80\\\" />\\n </div>\\n <!-- !container-port -->\\n <!-- protocol-actions -->\\n <div class=\\\"input-group col-sm-3 input-group-sm\\\">\\n <div class=\\\"btn-group btn-group-sm\\\">\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"portBinding.protocol\\\" uib-btn-radio=\\\"'tcp'\\\">TCP</label>\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"portBinding.protocol\\\" uib-btn-radio=\\\"'udp'\\\">UDP</label>\\n </div>\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removePortBinding($index)\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n <!-- !protocol-actions -->\\n </div>\\n </div>\\n </div>\\n </div>\\n <!-- !port-mapping-input-list -->\\n <!-- volume-mapping -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 5px;\\\">\\n <label class=\\\"control-label text-left\\\">Volume mapping</label>\\n <span class=\\\"label label-default interactive\\\" style=\\\"margin-left: 10px;\\\" ng-click=\\\"addVolume()\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> map additional volume\\n </span>\\n </div>\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 10px;\\\" ng-if=\\\"state.selectedTemplate.Volumes.length > 0\\\">\\n <span class=\\\"small text-muted\\\">Portainer will automatically create and map a local volume when using the <b>auto</b> option.</span>\\n </div>\\n <div ng-repeat=\\\"volume in state.selectedTemplate.Volumes\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 10px;\\\">\\n <!-- volume-line1 -->\\n <div class=\\\"col-sm-12 form-inline\\\">\\n <!-- container-path -->\\n <div class=\\\"input-group input-group-sm col-sm-6\\\">\\n <span class=\\\"input-group-addon\\\">container</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"volume.container\\\" placeholder=\\\"e.g. /path/in/container\\\" />\\n </div>\\n <!-- !container-path -->\\n <!-- volume-type -->\\n <div class=\\\"input-group col-sm-5\\\" style=\\\"margin-left: 5px;\\\">\\n <div class=\\\"btn-group btn-group-sm\\\">\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"volume.type\\\" uib-btn-radio=\\\"'auto'\\\" ng-click=\\\"volume.bind = ''\\\">Auto</label>\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"volume.type\\\" uib-btn-radio=\\\"'volume'\\\" ng-click=\\\"volume.bind = ''\\\">Volume</label>\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"volume.type\\\" uib-btn-radio=\\\"'bind'\\\" ng-click=\\\"volume.bind = ''\\\" ng-if=\\\"isAdmin || allowBindMounts\\\">Bind</label>\\n </div>\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removeVolume($index)\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n <!-- !volume-type -->\\n </div>\\n <!-- !volume-line1 -->\\n <!-- volume-line2 -->\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 5px;\\\" ng-if=\\\"volume.type !== 'auto'\\\">\\n <i class=\\\"fa fa-long-arrow-alt-right\\\" aria-hidden=\\\"true\\\"></i>\\n <!-- volume -->\\n <div class=\\\"input-group input-group-sm col-sm-6\\\" ng-if=\\\"volume.type === 'volume'\\\">\\n <div class=\\\"col-sm-12 input-group\\\">\\n <span class=\\\"input-group-addon\\\">volume</span>\\n <div class=\\\"col-sm-12 input-group\\\">\\n <select class=\\\"form-control\\\" ng-model=\\\"volume.bind\\\" ng-options=\\\"vol.Name as vol.Name for vol in availableVolumes\\\">\\n <option value=\\\"\\\" disabled selected>Select a volume</option>\\n </select>\\n </div>\\n </div>\\n </div>\\n <!-- !volume -->\\n <!-- bind -->\\n <div class=\\\"input-group input-group-sm col-sm-6\\\" ng-if=\\\"volume.type === 'bind'\\\">\\n <span class=\\\"input-group-addon\\\">host</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"volume.bind\\\" placeholder=\\\"e.g. /path/on/host\\\" />\\n </div>\\n <!-- !bind -->\\n <!-- read-only -->\\n <div class=\\\"input-group input-group-sm col-sm-5\\\" style=\\\"margin-left: 5px;\\\">\\n <div class=\\\"btn-group btn-group-sm\\\">\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"volume.readonly\\\" uib-btn-radio=\\\"false\\\">Writable</label>\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"volume.readonly\\\" uib-btn-radio=\\\"true\\\">Read-only</label>\\n </div>\\n </div>\\n <!-- !read-only -->\\n </div>\\n <!-- !volume-line2 -->\\n </div>\\n </div>\\n </div>\\n <!-- !volume-mapping -->\\n <!-- extra-host -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 5px;\\\">\\n <label class=\\\"control-label text-left\\\">Hosts file entries</label>\\n <span class=\\\"label label-default interactive\\\" style=\\\"margin-left: 10px;\\\" ng-click=\\\"addExtraHost()\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add additional entry\\n </span>\\n </div>\\n <!-- extra-host-input-list -->\\n <div class=\\\"col-sm-12\\\">\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\">\\n <div ng-repeat=\\\"(idx, host) in state.selectedTemplate.Hosts track by $index\\\" style=\\\"margin-top: 2px;\\\">\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">value</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"state.selectedTemplate.Hosts[idx]\\\" placeholder=\\\"e.g. host:IP\\\" />\\n </div>\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removeExtraHost($index)\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n </div>\\n </div>\\n <!-- !extra-host -->\\n <!-- labels -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 5px;\\\">\\n <label class=\\\"control-label text-left\\\">Labels</label>\\n <span class=\\\"label label-default interactive\\\" style=\\\"margin-left: 10px;\\\" ng-click=\\\"addLabel()\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add label\\n </span>\\n </div>\\n <!-- labels-input-list -->\\n <div class=\\\"col-sm-12\\\">\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\">\\n <div ng-repeat=\\\"label in state.selectedTemplate.Labels\\\" style=\\\"margin-top: 2px;\\\">\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">name</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"label.name\\\" placeholder=\\\"e.g. com.example.foo\\\" />\\n </div>\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">value</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"label.value\\\" placeholder=\\\"e.g. bar\\\" />\\n </div>\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removeLabel($index)\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n </div>\\n <!-- !labels-input-list -->\\n </div>\\n <!-- !labels -->\\n <!-- hostname -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"container_hostname\\\" class=\\\"col-sm-2 control-label text-left\\\">Hostname</label>\\n <div class=\\\"col-sm-10\\\">\\n <input type=\\\"text\\\" name=\\\"container_hostname\\\" class=\\\"form-control\\\" ng-model=\\\"state.selectedTemplate.Hostname\\\" placeholder=\\\"leave empty to use docker default\\\" />\\n </div>\\n </div>\\n <!-- !hostname -->\\n </div>\\n <!-- !advanced-options -->\\n <!-- actions -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"state.actionInProgress || !formValues.network\\\"\\n ng-click=\\\"createTemplate()\\\"\\n button-spinner=\\\"state.actionInProgress\\\"\\n >\\n <span ng-hide=\\\"state.actionInProgress\\\">Deploy the container</span>\\n <span ng-show=\\\"state.actionInProgress\\\">Deployment in progress...</span>\\n </button>\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-default\\\" ng-click=\\\"unselectTemplate(state.selectedTemplate)\\\">Hide</button>\\n <span class=\\\"text-danger\\\" ng-if=\\\"state.formValidationError\\\" style=\\\"margin-left: 5px;\\\">{{ state.formValidationError }}</span>\\n </div>\\n </div>\\n <!-- !actions -->\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n <!-- container-form -->\\n</div>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <template-list\\n ng-if=\\\"templates\\\"\\n title-text=\\\"Templates\\\"\\n title-icon=\\\"fa-rocket\\\"\\n templates=\\\"templates\\\"\\n table-key=\\\"templates\\\"\\n select-action=\\\"selectTemplate\\\"\\n show-swarm-stacks=\\\"applicationState.endpoint.mode.provider === 'DOCKER_SWARM_MODE' && applicationState.endpoint.mode.role === 'MANAGER' && applicationState.endpoint.apiVersion >= 1.25\\\"\\n ></template-list>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/volumes/volumes.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Volume list\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"Refresh\\\" ui-sref=\\\"docker.volumes\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content>Volumes</rd-header-content>\\n</rd-header>\\n<information-panel-offline ng-if=\\\"offlineMode\\\"></information-panel-offline>\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <volumes-datatable\\n title-text=\\\"Volumes\\\"\\n title-icon=\\\"fa-hdd\\\"\\n dataset=\\\"volumes\\\"\\n table-key=\\\"volumes\\\"\\n order-by=\\\"Id\\\"\\n remove-action=\\\"removeAction\\\"\\n show-host-column=\\\"applicationState.endpoint.mode.agentProxy && applicationState.endpoint.mode.provider === 'DOCKER_SWARM_MODE'\\\"\\n show-browse-action=\\\"showBrowseAction\\\"\\n offline-mode=\\\"offlineMode\\\"\\n refresh-callback=\\\"getVolumes\\\"\\n ></volumes-datatable>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/volumes/edit/volume.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Volume details\\\"></rd-header-title>\\n <rd-header-content>\\n <a ui-sref=\\\"docker.volumes\\\">Volumes</a> > <a ui-sref=\\\"docker.volumes.volume({id: volume.Id})\\\">{{ volume.Id }}</a>\\n </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\" ng-if=\\\"volume\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-cube\\\" title-text=\\\"Volume details\\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr>\\n <td>ID</td>\\n <td>\\n {{ volume.Id }}\\n <button authorization=\\\"DockerVolumeDelete\\\" class=\\\"btn btn-xs btn-danger\\\" ng-click=\\\"removeVolume()\\\"\\n ><i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Remove this volume</button\\n >\\n </td>\\n </tr>\\n <tr>\\n <td>Created</td>\\n <td>{{ volume.CreatedAt | getisodate }}</td>\\n </tr>\\n <tr>\\n <td>Mount path</td>\\n <td>{{ volume.Mountpoint }}</td>\\n </tr>\\n <tr>\\n <td>Driver</td>\\n <td>{{ volume.Driver }}</td>\\n </tr>\\n <tr ng-if=\\\"!(volume.Labels | emptyobject)\\\">\\n <td>Labels</td>\\n <td>\\n <table class=\\\"table table-bordered table-condensed\\\">\\n <tr ng-repeat=\\\"(k, v) in volume.Labels\\\">\\n <td>{{ k }}</td>\\n <td>{{ v }}</td>\\n </tr>\\n </table>\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\\n<div class=\\\"row\\\" ng-if=\\\"isCioDriver\\\">\\n <div class=\\\"col-sm-12\\\">\\n <volume-storidge-info volume=\\\"storidgeVolume\\\"> </volume-storidge-info>\\n </div>\\n</div>\\n\\n<div class=\\\"row\\\" ng-if=\\\"isCioDriver\\\">\\n <div class=\\\"col-sm-12\\\">\\n <storidge-snapshot-creation volume-id=\\\"storidgeVolume.Vdisk\\\" ng-if=\\\"storidgeVolume.SnapshotEnabled\\\"> </storidge-snapshot-creation>\\n </div>\\n</div>\\n\\n<div class=\\\"row\\\" ng-if=\\\"isCioDriver && storidgeVolume.SnapshotEnabled\\\">\\n <div class=\\\"col-sm-12\\\">\\n <storidge-snapshots-datatable\\n title-text=\\\"Snapshots\\\"\\n title-icon=\\\"fa-camera\\\"\\n dataset=\\\"storidgeSnapshots\\\"\\n table-key=\\\"storidgeSnapshots\\\"\\n order-by=\\\"Id\\\"\\n remove-action=\\\"removeSnapshot\\\"\\n >\\n </storidge-snapshots-datatable>\\n </div>\\n</div>\\n\\n<!-- access-control-panel -->\\n<por-access-control-panel ng-if=\\\"volume\\\" resource-id=\\\"volume.ResourceId\\\" resource-control=\\\"volume.ResourceControl\\\" resource-type=\\\"'volume'\\\"> </por-access-control-panel>\\n<!-- !access-control-panel -->\\n\\n<div class=\\\"row\\\" ng-if=\\\"!(volume.Options | emptyobject)\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-cogs\\\" title-text=\\\"Volume options\\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr ng-repeat=\\\"(key, value) in volume.Options\\\">\\n <td>{{ key }}</td>\\n <td>{{ value }}</td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n<div class=\\\"row\\\" ng-if=\\\"containersUsingVolume.length > 0\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-cubes\\\" title-text=\\\"Containers using volume\\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <thead>\\n <th>Container Name</th>\\n <th>Mounted At</th>\\n <th>Read-only</th>\\n </thead>\\n <tbody>\\n <tr ng-repeat=\\\"container in containersUsingVolume\\\">\\n <td\\n ><a ui-sref=\\\"docker.containers.container({ id: container.Id, nodeName: container.NodeName })\\\">{{ container | containername }}</a></td\\n >\\n <td>{{ container.volumeData.Destination }}</td>\\n <td>{{ !container.volumeData.RW }}</td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/volumes/browse/browsevolume.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Volume browser\\\"></rd-header-title>\\n <rd-header-content>\\n <a ui-sref=\\\"docker.volumes\\\">Volumes</a> > <a ui-sref=\\\"docker.volumes.volume({ id: volumeId })\\\">{{ volumeId }}</a> > browse\\n </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <volume-browser volume-id=\\\"volumeId\\\" node-name=\\\"nodeName\\\" is-upload-enabled=\\\"agentApiVersion > 1\\\"></volume-browser>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/volumes/create/createvolume.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Create volume\\\"></rd-header-title>\\n <rd-header-content> <a ui-sref=\\\"docker.volumes\\\">Volumes</a> > Add volume </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\" name=\\\"volumeCreationForm\\\">\\n <!-- name-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"volume_name\\\" class=\\\"col-sm-2 col-md-1 control-label text-left\\\">Name</label>\\n <div class=\\\"col-sm-10 col-md-11\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.Name\\\" id=\\\"volume_name\\\" placeholder=\\\"e.g. myVolume\\\" />\\n </div>\\n </div>\\n <!-- !name-input -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Driver configuration\\n </div>\\n <!-- driver-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"volume_driver\\\" class=\\\"col-sm-2 col-md-1 control-label text-left\\\">Driver</label>\\n <div class=\\\"col-sm-10 col-md-11\\\">\\n <select class=\\\"form-control\\\" ng-options=\\\"driver for driver in availableVolumeDrivers\\\" ng-model=\\\"formValues.Driver\\\" ng-if=\\\"availableVolumeDrivers.length > 0\\\">\\n <option disabled hidden value=\\\"\\\">Select a driver</option>\\n </select>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.Driver\\\" id=\\\"volume_driver\\\" placeholder=\\\"e.g. driverName\\\" ng-if=\\\"availableVolumeDrivers.length === 0\\\" />\\n </div>\\n </div>\\n <!-- !driver-input -->\\n <!-- driver-options -->\\n <div class=\\\"form-group\\\" ng-hide=\\\"formValues.CIFSData.useCIFS || formValues.NFSData.useNFS\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 5px;\\\">\\n <label class=\\\"control-label text-left\\\">\\n Driver options\\n <portainer-tooltip\\n position=\\\"bottom\\\"\\n message=\\\"Driver options are specific to the selected driver. Please refer to the selected driver documentation.\\\"\\n ></portainer-tooltip>\\n </label>\\n <span class=\\\"label label-default interactive\\\" style=\\\"margin-left: 10px;\\\" ng-click=\\\"addDriverOption()\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add driver option\\n </span>\\n </div>\\n <!-- driver-options-input-list -->\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\">\\n <div ng-repeat=\\\"option in formValues.DriverOptions\\\" style=\\\"margin-top: 2px;\\\">\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">name</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"option.name\\\" placeholder=\\\"e.g. mountpoint\\\" />\\n </div>\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">value</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"option.value\\\" placeholder=\\\"e.g. /path/on/host\\\" />\\n </div>\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removeDriverOption($index)\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n <!-- !driver-options-input-list -->\\n </div>\\n <!-- !driver-options -->\\n <!-- nfs-management -->\\n <div class=\\\"form-group col-md-12\\\">\\n <label for=\\\"useNFS\\\" class=\\\"control-label text-left\\\">\\n Use NFS volume\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\">\\n <input type=\\\"checkbox\\\" name=\\\"useNFS\\\" ng-model=\\\"formValues.NFSData.useNFS\\\" ng-click=\\\"formValues.CIFSData.useCIFS = false\\\" />\\n <i></i>\\n </label>\\n <div ng-if=\\\"formValues.NFSData.useNFS\\\" class=\\\"small text-muted\\\" style=\\\"margin-top: 10px;\\\"> Ensure <code>nfs-utils</code> are installed on your hosts. </div>\\n </div>\\n <volumes-nfs-form data=\\\"formValues.NFSData\\\" ng-show=\\\"formValues.Driver === 'local'\\\"></volumes-nfs-form>\\n <!-- !nfs-management -->\\n <!-- cifs-management -->\\n <div class=\\\"form-group col-md-12\\\">\\n <label for=\\\"useCIFS\\\" class=\\\"control-label text-left\\\">\\n Use CIFS volume\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\">\\n <input type=\\\"checkbox\\\" name=\\\"useCIFS\\\" ng-model=\\\"formValues.CIFSData.useCIFS\\\" ng-click=\\\"formValues.NFSData.useNFS = false\\\" />\\n <i></i>\\n </label>\\n <div ng-if=\\\"formValues.CIFSData.useCIFS\\\" class=\\\"small text-muted\\\" style=\\\"margin-top: 10px;\\\"> Ensure <code>cifs-utils</code> are installed on your hosts. </div>\\n </div>\\n <volumes-cifs-form data=\\\"formValues.CIFSData\\\" ng-show=\\\"formValues.Driver === 'local'\\\"></volumes-cifs-form>\\n <!-- !cifs-management -->\\n <!-- storidge -->\\n <div ng-if=\\\"formValues.Driver === 'cio:latest'\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Storidge\\n </div>\\n <storidge-profile-selector storidge-profile=\\\"formValues.StoridgeProfile\\\"></storidge-profile-selector>\\n </div>\\n <!-- storidge -->\\n <div ng-if=\\\"applicationState.endpoint.mode.agentProxy && applicationState.endpoint.mode.provider === 'DOCKER_SWARM_MODE' && formValues.Driver === 'local'\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Deployment\\n </div>\\n <!-- node-selection -->\\n <node-selector model=\\\"formValues.NodeName\\\"> </node-selector>\\n <!-- !node-selection -->\\n </div>\\n <!-- access-control -->\\n <por-access-control-form form-data=\\\"formValues.AccessControlData\\\"></por-access-control-form>\\n <!-- !access-control -->\\n <!-- actions -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-click=\\\"create()\\\"\\n ng-disabled=\\\"state.actionInProgress || (formValues.NFSData.useNFS && !volumeCreationForm.nfsInformationForm.$valid) || (formValues.CIFSData.useCIFS && !volumeCreationForm.cifsInformationForm.$valid)\\\"\\n button-spinner=\\\"state.actionInProgress\\\"\\n >\\n <span ng-hide=\\\"state.actionInProgress\\\">Create the volume</span>\\n <span ng-show=\\\"state.actionInProgress\\\">Creating volume...</span>\\n </button>\\n <span class=\\\"text-danger\\\" ng-if=\\\"state.formValidationError\\\" style=\\\"margin-left: 5px;\\\">{{ state.formValidationError }}</span>\\n </div>\\n </div>\\n <!-- !actions -->\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/edge/views/edge-stacks/createEdgeStackView/create-edge-stack-view.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Create Edge stack\\\"></rd-header-title>\\n <rd-header-content> <a ui-sref=\\\"edge.stacks\\\">Edge Stacks</a> > Create Edge stack </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\" name=\\\"$ctrl.form\\\">\\n <!-- name-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"stack_name\\\" class=\\\"col-sm-1 control-label text-left\\\">\\n Name\\n </label>\\n <div class=\\\"col-sm-11\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"$ctrl.formValues.Name\\\"\\n id=\\\"stack_name\\\"\\n name=\\\"nameField\\\"\\n placeholder=\\\"e.g. mystack\\\"\\n auto-focus\\n required\\n data-cy=\\\"edgeStackCreate-nameInput\\\"\\n />\\n </div>\\n </div>\\n <!-- !name-input -->\\n\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Edge Groups\\n </div>\\n <div class=\\\"form-group\\\" ng-if=\\\"$ctrl.edgeGroups\\\">\\n <div class=\\\"col-sm-12\\\">\\n <edge-groups-selector ng-if=\\\"!$ctrl.noGroups\\\" model=\\\"$ctrl.formValues.Groups\\\" on-change=\\\"($ctrl.onChangeGroups)\\\" items=\\\"$ctrl.edgeGroups\\\"></edge-groups-selector>\\n </div>\\n <div ng-if=\\\"$ctrl.noGroups\\\" class=\\\"col-sm-12 small text-muted\\\">\\n No Edge groups are available. Head over to the <a ui-sref=\\\"edge.groups\\\">Edge groups view</a> to create one.\\n </div>\\n </div>\\n\\n <edge-stack-deployment-type-selector\\n value=\\\"$ctrl.formValues.DeploymentType\\\"\\n has-docker-endpoint=\\\"$ctrl.hasDockerEndpoint\\\"\\n on-change=\\\"($ctrl.onChangeDeploymentType)\\\"\\n ></edge-stack-deployment-type-selector>\\n\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <div class=\\\"small text-muted space-right\\\" ng-if=\\\"$ctrl.formValues.DeploymentType === 0 && $ctrl.hasKubeEndpoint()\\\">\\n <i class=\\\"fa fa-exclamation-triangle orange-icon\\\" aria-hidden=\\\"true\\\"></i>\\n Portainer uses <a href=\\\"https://kompose.io/\\\" target=\\\"_blank\\\">Kompose</a> to convert your Compose manifest to a Kubernetes compliant manifest. Be wary that not all\\n the Compose format options are supported by Kompose at the moment.\\n </div>\\n </div>\\n </div>\\n\\n <edge-stacks-docker-compose-form ng-if=\\\"$ctrl.formValues.DeploymentType == 0\\\" form-values=\\\"$ctrl.formValues\\\" state=\\\"$ctrl.state\\\"></edge-stacks-docker-compose-form>\\n\\n <edge-stacks-kube-manifest-form ng-if=\\\"$ctrl.formValues.DeploymentType == 1\\\" form-values=\\\"$ctrl.formValues\\\" state=\\\"$ctrl.state\\\"></edge-stacks-kube-manifest-form>\\n\\n <!-- actions -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"$ctrl.state.actionInProgress || $ctrl.formIsInvalid()\\\"\\n ng-click=\\\"$ctrl.createStack()\\\"\\n button-spinner=\\\"$ctrl.state.actionInProgress\\\"\\n analytics-on\\n analytics-event=\\\"edge-stack-creation\\\"\\n analytics-category=\\\"edge\\\"\\n analytics-properties=\\\"$ctrl.buildAnalyticsProperties()\\\"\\n data-cy=\\\"edgeStackCreate-createStackButton\\\"\\n >\\n <span ng-hide=\\\"$ctrl.state.actionInProgress\\\">Deploy the stack</span>\\n <span ng-show=\\\"$ctrl.state.actionInProgress\\\">Deployment in progress...</span>\\n </button>\\n <span class=\\\"text-danger\\\" ng-if=\\\"$ctrl.state.formValidationError\\\" style=\\\"margin-left: 5px;\\\">\\n {{ $ctrl.state.formValidationError }}\\n </span>\\n </div>\\n </div>\\n <!-- !actions -->\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/edge/views/edge-stacks/createEdgeStackView/docker-compose-form/docker-compose-form.html';\nvar html = \"<div class=\\\"col-sm-12 form-section-title\\\">\\n Build method\\n</div>\\n<box-selector radio-name=\\\"method\\\" ng-model=\\\"$ctrl.state.Method\\\" options=\\\"$ctrl.methodOptions\\\" on-change=\\\"($ctrl.onChangeMethod)\\\"></box-selector>\\n\\n<web-editor-form\\n ng-if=\\\"$ctrl.state.Method === 'editor'\\\"\\n identifier=\\\"stack-creation-editor\\\"\\n value=\\\"$ctrl.formValues.StackFileContent\\\"\\n on-change=\\\"($ctrl.onChangeFileContent)\\\"\\n ng-required=\\\"true\\\"\\n yml=\\\"true\\\"\\n placeholder=\\\"# Define or paste the content of your docker-compose file here\\\"\\n>\\n <editor-description>\\n You can get more information about Compose file format in the\\n <a href=\\\"https://docs.docker.com/compose/compose-file/\\\" target=\\\"_blank\\\">\\n official documentation\\n </a>\\n .\\n </editor-description>\\n</web-editor-form>\\n\\n<file-upload-form ng-if=\\\"$ctrl.state.Method === 'upload'\\\" file=\\\"$ctrl.formValues.StackFile\\\" on-change=\\\"($ctrl.onChangeFile)\\\" ng-required=\\\"true\\\">\\n <file-upload-description>\\n You can upload a Compose file from your computer.\\n </file-upload-description>\\n</file-upload-form>\\n\\n<git-form ng-if=\\\"$ctrl.state.Method === 'repository'\\\" model=\\\"$ctrl.formValues\\\" on-change=\\\"($ctrl.onChangeFormValues)\\\"></git-form>\\n\\n<!-- template -->\\n<div ng-if=\\\"$ctrl.state.Method === 'template'\\\">\\n <div class=\\\"form-group\\\">\\n <label for=\\\"stack_template\\\" class=\\\"col-sm-1 control-label text-left\\\">\\n Template\\n </label>\\n <div class=\\\"col-sm-11\\\">\\n <select\\n class=\\\"form-control\\\"\\n ng-model=\\\"$ctrl.selectedTemplate\\\"\\n ng-options=\\\"template as template.label for template in $ctrl.templates\\\"\\n ng-change=\\\"$ctrl.onChangeTemplate($ctrl.selectedTemplate)\\\"\\n >\\n <option value=\\\"\\\" label=\\\"Select an Edge stack template\\\" disabled selected=\\\"selected\\\"> </option>\\n </select>\\n </div>\\n </div>\\n <!-- description -->\\n <div ng-if=\\\"$ctrl.selectedTemplate.note\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Information\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <div class=\\\"template-note\\\" ng-bind-html=\\\"$ctrl.selectedTemplate.note\\\"></div>\\n </div>\\n </div>\\n </div>\\n <!-- !description -->\\n\\n <web-editor-form\\n ng-if=\\\"$ctrl.selectedTemplate && $ctrl.formValues.StackFileContent\\\"\\n identifier=\\\"template-content-editor\\\"\\n value=\\\"$ctrl.formValues.StackFileContent\\\"\\n on-change=\\\"($ctrl.onChangeFileContent)\\\"\\n yml=\\\"true\\\"\\n placeholder=\\\"# Define or paste the content of your docker-compose file here\\\"\\n ng-required=\\\"true\\\"\\n >\\n </web-editor-form>\\n\\n <!-- !template -->\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/edge/views/edge-stacks/createEdgeStackView/kube-manifest-form/kube-manifest-form.html';\nvar html = \"<div class=\\\"col-sm-12 form-section-title\\\">\\n Build method\\n</div>\\n<box-selector radio-name=\\\"method\\\" ng-model=\\\"$ctrl.state.Method\\\" options=\\\"$ctrl.methodOptions\\\" on-change=\\\"($ctrl.onChangeMethod)\\\"></box-selector>\\n\\n<web-editor-form\\n ng-if=\\\"$ctrl.state.Method === 'editor'\\\"\\n identifier=\\\"stack-creation-editor\\\"\\n value=\\\"$ctrl.formValues.StackFileContent\\\"\\n on-change=\\\"($ctrl.onChangeFileContent)\\\"\\n yml=\\\"true\\\"\\n placeholder=\\\"# Define or paste the content of your manifest here\\\"\\n ng-required=\\\"true\\\"\\n>\\n <editor-description>\\n <kube-deploy-description></kube-deploy-description>\\n </editor-description>\\n</web-editor-form>\\n\\n<file-upload-form ng-if=\\\"$ctrl.state.Method === 'upload'\\\" file=\\\"$ctrl.formValues.StackFile\\\" on-change=\\\"($ctrl.onChangeFile)\\\" ng-required=\\\"true\\\">\\n <file-upload-description>\\n <kube-deploy-description></kube-deploy-description>\\n </file-upload-description>\\n</file-upload-form>\\n\\n<git-form ng-if=\\\"$ctrl.state.Method === 'repository'\\\" deploy-method=\\\"kubernetes\\\" model=\\\"$ctrl.formValues\\\" on-change=\\\"($ctrl.onChangeFormValues)\\\"></git-form>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/edge/views/edge-stacks/createEdgeStackView/kube-deploy-description/kube-deploy-description.html';\nvar html = \"<p>\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n This feature allows you to deploy any kind of Kubernetes resource in this environment (Deployment, Secret, ConfigMap...).\\n</p>\\n<p>\\n You can get more information about Kubernetes file format in the\\n <a href=\\\"https://kubernetes.io/docs/concepts/overview/working-with-objects/kubernetes-objects/\\\" target=\\\"_blank\\\">official documentation</a>.\\n</p>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/views/sidebar/sidebar.html';\nvar html = \"<!-- Sidebar -->\\n<div id=\\\"sidebar-wrapper\\\">\\n <div class=\\\"sidebar-header\\\">\\n <a ui-sref=\\\"portainer.home\\\" data-cy=\\\"portainerSidebar-homeImage\\\">\\n <img ng-if=\\\"logo\\\" ng-src=\\\"{{ logo }}\\\" class=\\\"img-responsive logo\\\" />\\n <img ng-if=\\\"!logo\\\" src=\\\"\" + require(\"@/assets/images/logo.png\") + \"\\\" class=\\\"img-responsive logo\\\" alt=\\\"Portainer\\\" />\\n </a>\\n <a ng-click=\\\"toggleSidebar()\\\"><span class=\\\"menu-icon glyphicon glyphicon-transfer\\\"></span></a>\\n </div>\\n <div class=\\\"sidebar-content\\\">\\n <ul class=\\\"sidebar\\\">\\n <sidebar-menu-item path=\\\"portainer.home\\\" icon-class=\\\"fa-home fa-fw\\\" class-name=\\\"sidebar-list\\\" data-cy=\\\"portainerSidebar-home\\\">Home</sidebar-menu-item>\\n\\n <li class=\\\"sidebar-title endpoint-name\\\" ng-if=\\\"applicationState.endpoint.name\\\">\\n <span class=\\\"fa fa-plug space-right\\\"></span>{{ applicationState.endpoint.name }}\\n <kubectl-shell ng-if=\\\"applicationState.endpoint.mode && applicationState.endpoint.mode.provider === 'KUBERNETES'\\\" class=\\\"kubectl-shell\\\"></kubectl-shell>\\n </li>\\n <div ng-if=\\\"applicationState.endpoint.mode\\\">\\n <kubernetes-sidebar\\n ng-if=\\\"applicationState.endpoint.mode.provider === 'KUBERNETES'\\\"\\n is-sidebar-open=\\\"toggle\\\"\\n endpoint-id=\\\"endpointId\\\"\\n admin-access=\\\"isAdmin\\\"\\n ></kubernetes-sidebar>\\n\\n <azure-sidebar ng-if=\\\"applicationState.endpoint.mode.provider === 'AZURE'\\\" endpoint-id=\\\"endpointId\\\"> </azure-sidebar>\\n\\n <docker-sidebar\\n ng-if=\\\"applicationState.endpoint.mode.provider !== 'AZURE' && applicationState.endpoint.mode.provider !== 'KUBERNETES'\\\"\\n current-route-name=\\\"$state.current.name\\\"\\n is-sidebar-open=\\\"toggle\\\"\\n show-stacks=\\\"showStacks\\\"\\n endpoint-api-version=\\\"applicationState.endpoint.apiVersion\\\"\\n swarm-management=\\\"applicationState.endpoint.mode.provider === 'DOCKER_SWARM_MODE' && applicationState.endpoint.mode.role === 'MANAGER'\\\"\\n standalone-management=\\\"applicationState.endpoint.mode.provider === 'DOCKER_STANDALONE'\\\"\\n admin-access=\\\"isAdmin || isEndpointAdmin\\\"\\n offline-mode=\\\"endpointState.OfflineMode\\\"\\n endpoint-id=\\\"endpointId\\\"\\n ></docker-sidebar>\\n </div>\\n\\n <sidebar-section title=\\\"Integrations\\\" ng-if=\\\"applicationState.endpoint.mode && applicationState.endpoint.extensions.length > 0\\\" authorization=\\\"IntegrationStoridgeAdmin\\\">\\n <sidebar-menu\\n ng-if=\\\"\\n applicationState.endpoint.mode &&\\n applicationState.endpoint.extensions.indexOf('storidge') !== -1 &&\\n applicationState.endpoint.mode.provider === 'DOCKER_SWARM_MODE' &&\\n applicationState.endpoint.mode.role === 'MANAGER'\\n \\\"\\n icon-class=\\\"fa-bolt fa-fw\\\"\\n label=\\\"Storidge\\\"\\n path=\\\"storidge.cluster\\\"\\n is-sidebar-open=\\\"toggle\\\"\\n children-paths=\\\"['storidge.cluster', 'storidge.profiles', 'storidge.monitor', 'storidge.profiles.new', 'storidge.profiles.profile', 'storidge.drives', 'storidge.drives.drive', 'storidge.cluster.node']\\\"\\n >\\n <sidebar-menu-item path=\\\"storidge.monitor\\\" class-name=\\\"sidebar-sublist\\\">Monitor</sidebar-menu-item>\\n <sidebar-menu-item path=\\\"storidge.profiles\\\" class-name=\\\"sidebar-sublist\\\">Profiles</sidebar-menu-item>\\n <sidebar-menu-item path=\\\"storidge.drives\\\" class-name=\\\"sidebar-sublist\\\">Drives</sidebar-menu-item>\\n </sidebar-menu>\\n </sidebar-section>\\n\\n <sidebar-section title=\\\"Edge compute\\\" ng-if=\\\"isAdmin && applicationState.application.enableEdgeComputeFeatures\\\">\\n <sidebar-menu-item path=\\\"edge.groups\\\" icon-class=\\\"fa-object-group fa-fw\\\" class-name=\\\"sidebar-list\\\" data-cy=\\\"portainerSidebar-edgeGroups\\\">Edge Groups</sidebar-menu-item>\\n <sidebar-menu-item path=\\\"edge.stacks\\\" icon-class=\\\"fa-layer-group fa-fw\\\" class-name=\\\"sidebar-list\\\" data-cy=\\\"portainerSidebar-edgeStacks\\\">Edge Stacks</sidebar-menu-item>\\n <sidebar-menu-item path=\\\"edge.jobs\\\" icon-class=\\\"fa-clock fa-fw\\\" class-name=\\\"sidebar-list\\\" data-cy=\\\"portainerSidebar-edgeJobs\\\">Edge Jobs</sidebar-menu-item>\\n </sidebar-section>\\n\\n <sidebar-section ng-if=\\\"isAdmin || isTeamLeader\\\" title=\\\"Settings\\\">\\n <sidebar-menu\\n icon-class=\\\"fa-users fa-fw\\\"\\n label=\\\"Users\\\"\\n path=\\\"portainer.users\\\"\\n is-sidebar-open=\\\"toggle\\\"\\n children-paths=\\\"['portainer.users.user' ,'portainer.teams' ,'portainer.teams.team' ,'portainer.roles' ,'portainer.roles.role' ,'portainer.roles.new']\\\"\\n >\\n <sidebar-menu-item path=\\\"portainer.teams\\\" class-name=\\\"sidebar-sublist\\\" data-cy=\\\"portainerSidebar-teams\\\">Teams</sidebar-menu-item>\\n <sidebar-menu-item path=\\\"portainer.roles\\\" class-name=\\\"sidebar-sublist\\\" data-cy=\\\"portainerSidebar-roles\\\">Roles</sidebar-menu-item>\\n </sidebar-menu>\\n\\n <div ng-if=\\\"isAdmin\\\">\\n <sidebar-menu\\n icon-class=\\\"fa-plug fa-fw\\\"\\n label=\\\"Environments\\\"\\n path=\\\"portainer.endpoints\\\"\\n is-sidebar-open=\\\"toggle\\\"\\n children-paths=\\\"['portainer.endpoints.endpoint', 'portainer.endpoints.new', 'portainer.endpoints.endpoint.access', 'portainer.groups', 'portainer.groups.group', 'portainer.groups.group.access', 'portainer.groups.new', 'portainer.tags']\\\"\\n >\\n <sidebar-menu-item path=\\\"portainer.groups\\\" class-name=\\\"sidebar-sublist\\\" data-cy=\\\"portainerSidebar-endpointGroups\\\">Groups</sidebar-menu-item>\\n <sidebar-menu-item path=\\\"portainer.tags\\\" class-name=\\\"sidebar-sublist\\\" data-cy=\\\"portainerSidebar-endpointTags\\\">Tags</sidebar-menu-item>\\n </sidebar-menu>\\n\\n <sidebar-menu-item path=\\\"portainer.registries\\\" icon-class=\\\"fa-database fa-fw\\\" class-name=\\\"sidebar-list\\\" data-cy=\\\"portainerSidebar-registries\\\">\\n Registries</sidebar-menu-item\\n >\\n\\n <sidebar-menu label=\\\"Authentication logs\\\" icon-class=\\\"fa-history fa-fw\\\" path=\\\"portainer.authLogs\\\" is-sidebar-open=\\\"toggle\\\" children-paths=\\\"['portainer.activityLogs']\\\">\\n <sidebar-menu-item path=\\\"portainer.activityLogs\\\" class-name=\\\"sidebar-sublist\\\" data-cy=\\\"portainerSidebar-activityLogs\\\">Activity Logs</sidebar-menu-item>\\n </sidebar-menu>\\n\\n <sidebar-menu label=\\\"Settings\\\" icon-class=\\\"fa-cogs fa-fw\\\" path=\\\"portainer.settings\\\" is-sidebar-open=\\\"toggle\\\" children-paths=\\\"['portainer.settings.authentication']\\\">\\n <sidebar-menu-item path=\\\"portainer.settings.authentication\\\" class-name=\\\"sidebar-sublist\\\" data-cy=\\\"portainerSidebar-authentication\\\">Authentication</sidebar-menu-item>\\n\\n <div class=\\\"sidebar-sublist\\\">\\n <a href=\\\"https://www.portainer.io/community_help\\\" target=\\\"_blank\\\" data-cy=\\\"portainerSidebar-help\\\">Help / About</a>\\n </div>\\n </sidebar-menu>\\n </div>\\n </sidebar-section>\\n </ul>\\n <div class=\\\"sidebar-footer-content\\\">\\n <div class=\\\"update-notification\\\" ng-if=\\\"applicationState.application.versionStatus.UpdateAvailable\\\">\\n <a target=\\\"_blank\\\" href=\\\"https://github.com/portainer/portainer/releases/tag/{{ applicationState.application.versionStatus.LatestVersion }}\\\" style=\\\"color: #091e5d;\\\">\\n <i class=\\\"fa-lg fas fa-cloud-download-alt\\\" style=\\\"margin-right: 2px;\\\"></i> A new version is available\\n </a>\\n </div>\\n <div>\\n <img src=\\\"\" + require(\"@/assets/images/logo_small.png\") + \"\\\" class=\\\"img-responsive logo\\\" alt=\\\"Portainer\\\" />\\n <span class=\\\"version\\\" data-cy=\\\"portainerSidebar-versionNumber\\\">{{ uiVersion }}</span>\\n </div>\\n </div>\\n </div>\\n</div>\\n<!-- End Sidebar -->\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","module.exports = __webpack_public_path__ + \"f461b0cc3c2692b7b8475389b6a051ec.png\";","module.exports = __webpack_public_path__ + \"24b23490023e318f9c08cf94253542a0.png\";","var path = 'app/portainer/views/account/account.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"User settings\\\"></rd-header-title>\\n <rd-header-content>User settings</rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-lock\\\" title-text=\\\"Change user password\\\"></rd-widget-header>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\" style=\\\"margin-top: 15px;\\\">\\n <!-- current-password-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"current_password\\\" class=\\\"col-sm-2 control-label text-left\\\">Current password</label>\\n <div class=\\\"col-sm-8\\\">\\n <div class=\\\"input-group\\\">\\n <span class=\\\"input-group-addon\\\"><i class=\\\"fa fa-lock\\\" aria-hidden=\\\"true\\\"></i></span>\\n <input type=\\\"password\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.currentPassword\\\" id=\\\"current_password\\\" />\\n </div>\\n </div>\\n </div>\\n <!-- !current-password-input -->\\n <!-- new-password-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"new_password\\\" class=\\\"col-sm-2 control-label text-left\\\">New password</label>\\n <div class=\\\"col-sm-8\\\">\\n <div class=\\\"input-group\\\">\\n <span class=\\\"input-group-addon\\\"><i class=\\\"fa fa-lock\\\" aria-hidden=\\\"true\\\"></i></span>\\n <input type=\\\"password\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.newPassword\\\" id=\\\"new_password\\\" />\\n </div>\\n </div>\\n </div>\\n <!-- !new-password-input -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <i ng-class=\\\"{ true: 'fa fa-check green-icon', false: 'fa fa-times red-icon' }[formValues.newPassword.length >= 8]\\\" aria-hidden=\\\"true\\\"></i>\\n <span class=\\\"small text-muted\\\">Your new password must be at least 8 characters long</span>\\n </div>\\n </div>\\n <!-- confirm-password-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"confirm_password\\\" class=\\\"col-sm-2 control-label text-left\\\">Confirm password</label>\\n <div class=\\\"col-sm-8\\\">\\n <div class=\\\"input-group\\\">\\n <span class=\\\"input-group-addon\\\"><i class=\\\"fa fa-lock\\\" aria-hidden=\\\"true\\\"></i></span>\\n <input type=\\\"password\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.confirmPassword\\\" id=\\\"confirm_password\\\" />\\n <span class=\\\"input-group-addon\\\"\\n ><i\\n ng-class=\\\"\\n { true: 'fa fa-check green-icon', false: 'fa fa-times red-icon' }[formValues.newPassword !== '' && formValues.newPassword === formValues.confirmPassword]\\n \\\"\\n aria-hidden=\\\"true\\\"\\n ></i\\n ></span>\\n </div>\\n </div>\\n </div>\\n <!-- !confirm-password-input -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"submit\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"(AuthenticationMethod !== 1 && userID !== 1) || !formValues.currentPassword || formValues.newPassword.length < 8 || formValues.newPassword !== formValues.confirmPassword\\\"\\n ng-click=\\\"updatePassword()\\\"\\n >Update password</button\\n >\\n <span class=\\\"text-muted small\\\" style=\\\"margin-left: 5px;\\\" ng-if=\\\"AuthenticationMethod === 2 && userID !== 1\\\">\\n <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i>\\n You cannot change your password when using LDAP authentication.\\n </span>\\n <span class=\\\"text-muted small\\\" style=\\\"margin-left: 5px;\\\" ng-if=\\\"AuthenticationMethod === 3 && userID !== 1\\\">\\n <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i>\\n You cannot change your password when using OAuth authentication.\\n </span>\\n </div>\\n </div>\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n <access-tokens-datatable\\n title-text=\\\"Access tokens\\\"\\n title-icon=\\\"fa-key\\\"\\n dataset=\\\"tokens\\\"\\n table-key=\\\"tokens\\\"\\n order-by=\\\"Description\\\"\\n remove-action=\\\"removeAction\\\"\\n ></access-tokens-datatable>\\n <theme-settings></theme-settings>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/views/auth/auth.html';\nvar html = \"<div class=\\\"page-wrapper\\\">\\n <!-- login box -->\\n <div class=\\\"container simple-box\\\">\\n <div class=\\\"col-sm-6 col-sm-offset-3\\\">\\n <!-- login box logo -->\\n <div class=\\\"row\\\">\\n <img ng-if=\\\"!ctrl.logo\\\" src=\\\"\" + require(\"@/assets/images/logo_alt.svg\") + \"\\\" class=\\\"simple-box-logo\\\" alt=\\\"Portainer\\\" />\\n <img ng-if=\\\"ctrl.logo\\\" ng-src=\\\"{{ ctrl.logo }}\\\" class=\\\"simple-box-logo\\\" />\\n </div>\\n <!-- !login box logo -->\\n\\n <!-- login panel -->\\n <div class=\\\"panel panel-default\\\" ng-if=\\\"!ctrl.state.loginInProgress\\\">\\n <div class=\\\"panel-body\\\">\\n <!-- login form -->\\n <form class=\\\"simple-box-form form-horizontal\\\">\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"display: flex; justify-content: center;\\\" ng-if=\\\"ctrl.state.showOAuthLogin\\\">\\n <a ng-href=\\\"{{ ctrl.OAuthLoginURI }}\\\">\\n <div class=\\\"btn btn-primary pull-left\\\" style=\\\"font-size: 120%; margin-left: 2px;\\\" ng-if=\\\"ctrl.state.OAuthProvider === 'Microsoft'\\\">\\n <i class=\\\"fab fa-microsoft\\\" aria-hidden=\\\"true\\\"></i> Login with Microsoft\\n </div>\\n <div class=\\\"btn btn-primary pull-left\\\" style=\\\"font-size: 120%; margin-left: 2px;\\\" ng-if=\\\"ctrl.state.OAuthProvider === 'Google'\\\">\\n <i class=\\\"fab fa-google\\\" aria-hidden=\\\"true\\\"></i> Login with Google\\n </div>\\n <div class=\\\"btn btn-primary pull-left\\\" style=\\\"font-size: 120%; margin-left: 2px;\\\" ng-if=\\\"ctrl.state.OAuthProvider === 'Github'\\\">\\n <i class=\\\"fab fa-github\\\" aria-hidden=\\\"true\\\"></i> Login with Github\\n </div>\\n <div class=\\\"btn btn-primary pull-left\\\" style=\\\"font-size: 120%; margin-left: 2px;\\\" ng-if=\\\"ctrl.state.OAuthProvider === 'OAuth'\\\">\\n <i class=\\\"fa fa-sign-in-alt\\\" aria-hidden=\\\"true\\\"></i> Login with OAuth\\n </div>\\n </a>\\n </div>\\n </div>\\n\\n <!-- divider -->\\n <div class=\\\"form-group\\\" ng-if=\\\"ctrl.state.showOAuthLogin\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"display: flex; align-items: center; justify-content: center;\\\">\\n <div class=\\\"striketext small text-muted\\\" style=\\\"display: flex; align-items: center; justify-content: center; width: 90%;\\\">or</div>\\n </div>\\n </div>\\n\\n <!-- use internal auth button -->\\n <div class=\\\"form-group\\\" ng-if=\\\"ctrl.state.showOAuthLogin && !ctrl.state.showStandardLogin\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"display: flex; justify-content: center;\\\">\\n <div class=\\\"btn btn-sm btn-primary pull-left\\\" style=\\\"margin-left: 2px;\\\" ng-click=\\\"ctrl.toggleStandardLogin()\\\">\\n Use internal authentication\\n </div>\\n </div>\\n </div>\\n\\n <!-- !username input -->\\n <div class=\\\"input-group\\\" ng-if=\\\"ctrl.state.showStandardLogin\\\">\\n <span class=\\\"input-group-addon\\\"><i class=\\\"fa fa-user\\\" aria-hidden=\\\"true\\\"></i></span>\\n <input id=\\\"username\\\" type=\\\"text\\\" class=\\\"form-control\\\" name=\\\"username\\\" ng-model=\\\"ctrl.formValues.Username\\\" auto-focus data-cy=\\\"auth-usernameInput\\\" />\\n </div>\\n\\n <!-- password input -->\\n <div class=\\\"input-group\\\" ng-if=\\\"ctrl.state.showStandardLogin\\\">\\n <span class=\\\"input-group-addon\\\"><i class=\\\"fa fa-lock\\\" aria-hidden=\\\"true\\\"></i></span>\\n <input id=\\\"password\\\" type=\\\"password\\\" class=\\\"form-control\\\" name=\\\"password\\\" ng-model=\\\"ctrl.formValues.Password\\\" data-cy=\\\"auth-passwordInput\\\" />\\n </div>\\n\\n <div class=\\\"form-group\\\" ng-if=\\\"ctrl.state.showStandardLogin\\\">\\n <!-- login button -->\\n <div class=\\\"col-sm-12\\\" style=\\\"display: flex; align-items: center; justify-content: center;\\\">\\n <button\\n type=\\\"submit\\\"\\n class=\\\"btn btn-primary btn-sm pull-right\\\"\\n ng-click=\\\"ctrl.authenticateUser()\\\"\\n button-spinner=\\\"ctrl.state.loginInProgress\\\"\\n ng-disabled=\\\"ctrl.state.loginInProgress\\\"\\n data-cy=\\\"auth-loginButton\\\"\\n >\\n <span ng-hide=\\\"ctrl.state.loginInProgress\\\"><i class=\\\"fa fa-sign-in-alt\\\" aria-hidden=\\\"true\\\"></i> Login</span>\\n <span ng-show=\\\"ctrl.state.loginInProgress\\\">Login in progress...</span>\\n </button>\\n </div>\\n </div>\\n </form>\\n <!-- !login form -->\\n\\n <!-- error message -->\\n <div class=\\\"pull-right\\\" ng-if=\\\"ctrl.state.AuthenticationError\\\">\\n <i class=\\\"fa fa-exclamation-triangle red-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n <span class=\\\"small text-danger\\\">{{ ctrl.state.AuthenticationError }}</span>\\n </div>\\n </div>\\n </div>\\n\\n <!-- !login panel -->\\n <div class=\\\"panel panel-default\\\" ng-show=\\\"ctrl.state.loginInProgress\\\">\\n <div class=\\\"panel-body\\\">\\n <div class=\\\"form-group text-center\\\">\\n <span class=\\\"small text-muted\\\">Authentication in progress... <span button-spinner=\\\"true\\\"></span></span>\\n </div>\\n </div>\\n </div>\\n </div>\\n </div>\\n <!-- !login box -->\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/views/logout/logout.html';\nvar html = \"<div class=\\\"page-wrapper\\\">\\n <!-- login box -->\\n <div class=\\\"container simple-box\\\">\\n <div class=\\\"col-md-6 col-md-offset-3 col-sm-6 col-sm-offset-3\\\">\\n <!-- login box logo -->\\n <div class=\\\"row\\\">\\n <img ng-if=\\\"!ctrl.logo\\\" src=\\\"\" + require(\"@/assets/images/logo_alt.svg\") + \"\\\" class=\\\"simple-box-logo\\\" alt=\\\"Portainer\\\" />\\n <img ng-if=\\\"ctrl.logo\\\" ng-src=\\\"{{ ctrl.logo }}\\\" class=\\\"simple-box-logo\\\" />\\n </div>\\n <div class=\\\"row\\\" style=\\\"text-align: center;\\\">\\n Logout in progress...\\n <i class=\\\"fa fa-cog fa-spin\\\" style=\\\"margin-left: 5px;\\\"></i>\\n </div>\\n </div>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/views/endpoints/endpoints.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Environments\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"Refresh\\\" ui-sref=\\\"portainer.endpoints\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content>Environment management</rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <endpoints-datatable\\n title-text=\\\"Environments\\\"\\n title-icon=\\\"fa-plug\\\"\\n table-key=\\\"endpoints\\\"\\n order-by=\\\"Name\\\"\\n remove-action=\\\"removeAction\\\"\\n retrieve-page=\\\"getPaginatedEndpoints\\\"\\n ></endpoints-datatable>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/views/endpoints/edit/endpoint.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Environment details\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"Refresh\\\" ui-sref=\\\"portainer.endpoints.endpoint({id: endpoint.Id})\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content>\\n <a ui-sref=\\\"portainer.endpoints\\\">Environments</a> > <a ui-sref=\\\"portainer.endpoints.endpoint({id: endpoint.Id})\\\">{{ endpoint.Name }}</a>\\n </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <information-panel ng-if=\\\"state.edgeEndpoint && endpoint.EdgeID\\\" title-text=\\\"Edge information\\\">\\n <span class=\\\"small text-muted\\\">\\n <p>\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n This Edge environment is associated to an Edge environment {{ state.kubernetesEndpoint ? '(Kubernetes)' : '(Docker)' }}.\\n </p>\\n <p>\\n Edge key: <code>{{ endpoint.EdgeKey }}</code>\\n </p>\\n <p>\\n Edge identifier: <code>{{ endpoint.EdgeID }}</code>\\n </p>\\n <p>\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"state.actionInProgress\\\"\\n ng-click=\\\"onDeassociateEndpoint()\\\"\\n button-spinner=\\\"state.actionInProgress\\\"\\n analytics-on\\n analytics-event=\\\"edge-endpoint-deassociate\\\"\\n analytics-category=\\\"edge\\\"\\n >\\n <span ng-hide=\\\"state.actionInProgress\\\">De-associate</span>\\n </button>\\n </p>\\n </span>\\n </information-panel>\\n <information-panel ng-if=\\\"state.edgeEndpoint && !endpoint.EdgeID\\\" title-text=\\\"Deploy an agent\\\">\\n <span class=\\\"small text-muted\\\">\\n <p>\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Refer to the platform related command below to deploy the Edge agent in your remote cluster.\\n </p>\\n <p>\\n The agent will communicate with Portainer via <u>{{ edgeKeyDetails.instanceURL }}</u> and <u>tcp://{{ edgeKeyDetails.tunnelServerAddr }}</u>\\n </p>\\n <div class=\\\"input-group input-group-sm\\\" style=\\\"margin-top: 10px; margin-bottom: 10px;\\\">\\n <div class=\\\"btn-group btn-group-sm\\\">\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"state.platformType\\\" uib-btn-radio=\\\"'linux'\\\"><i class=\\\"fab fa-linux\\\" style=\\\"margin-right: 2px;\\\"></i> Linux</label>\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"state.platformType\\\" uib-btn-radio=\\\"'windows'\\\"><i class=\\\"fab fa-windows\\\" style=\\\"margin-right: 2px;\\\"></i> Windows</label>\\n </div>\\n </div>\\n <por-switch-field\\n label=\\\"Allow self-signed certs\\\"\\n ng-model=\\\"state.allowSelfSignedCerts\\\"\\n tooltip=\\\"When allowing self-signed certificates the edge agent will ignore the domain validation when connecting to Portainer via HTTPS\\\"\\n ></por-switch-field>\\n <div style=\\\"margin-top: 10px;\\\">\\n <uib-tabset active=\\\"state.deploymentTab\\\">\\n <uib-tab index=\\\"'kubernetes'\\\" heading=\\\"Kubernetes\\\" ng-if=\\\"state.platformType === 'linux'\\\">\\n <code style=\\\"display: block; white-space: pre-wrap; padding: 16px 45px;\\\">\\n {{ dockerCommands[state.deploymentTab][state.platformType](agentVersion, agentShortVersion, randomEdgeID, endpoint.EdgeKey, state.allowSelfSignedCerts) }}\\n </code>\\n </uib-tab>\\n <uib-tab index=\\\"'swarm'\\\" heading=\\\"Docker Swarm\\\">\\n <code style=\\\"display: block; white-space: pre-wrap; padding: 16px 45px;\\\">\\n {{ dockerCommands[state.deploymentTab][state.platformType](agentVersion, agentShortVersion, randomEdgeID, endpoint.EdgeKey, state.allowSelfSignedCerts) }}\\n </code>\\n </uib-tab>\\n <uib-tab index=\\\"'standalone'\\\" heading=\\\"Docker Standalone\\\">\\n <code style=\\\"display: block; white-space: pre-wrap; padding: 16px 45px;\\\">\\n {{ dockerCommands[state.deploymentTab][state.platformType](agentVersion, agentShortVersion, randomEdgeID, endpoint.EdgeKey, state.allowSelfSignedCerts) }}\\n </code>\\n </uib-tab>\\n </uib-tabset>\\n <div style=\\\"margin-top: 10px;\\\">\\n <span class=\\\"btn btn-primary btn-sm\\\" ng-click=\\\"copyEdgeAgentDeploymentCommand()\\\"><i class=\\\"fa fa-copy space-right\\\" aria-hidden=\\\"true\\\"></i>Copy command</span>\\n <span id=\\\"copyNotificationDeploymentCommand\\\" style=\\\"margin-left: 7px; display: none; color: #23ae89;\\\"> <i class=\\\"fa fa-check\\\" aria-hidden=\\\"true\\\"></i> copied </span>\\n </div>\\n </div>\\n <div class=\\\"col-sm-12 form-section-title\\\" style=\\\"margin-top: 25px;\\\">\\n Join token\\n </div>\\n <p>\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n For those prestaging the edge agent, use the following join token to associate the Edge agent with this environment.\\n </p>\\n <p> You can read more about pre-staging in the userguide available <a href=\\\"https://downloads.portainer.io/edge_agent_guide.pdf\\\">here.</a> </p>\\n <div style=\\\"margin-top: 10px; overflow-wrap: break-word;\\\">\\n <code>\\n {{ endpoint.EdgeKey }}\\n </code>\\n <div style=\\\"margin-top: 10px;\\\">\\n <span class=\\\"btn btn-primary btn-sm\\\" ng-click=\\\"copyEdgeAgentKey()\\\"><i class=\\\"fa fa-copy space-right\\\" aria-hidden=\\\"true\\\"></i>Copy token</span>\\n <span id=\\\"copyNotificationEdgeKey\\\" style=\\\"margin-left: 7px; display: none; color: #23ae89;\\\"> <i class=\\\"fa fa-check\\\" aria-hidden=\\\"true\\\"></i> copied </span>\\n </div>\\n </div>\\n </span>\\n </information-panel>\\n <information-panel ng-if=\\\"state.kubernetesEndpoint && (!state.edgeEndpoint || (state.edgeEndpoint && endpoint.EdgeID))\\\" title-text=\\\"Kubernetes features configuration\\\">\\n <span class=\\\"small text-muted\\\">\\n <i class=\\\"fa fa-tools blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n You should configure the features available in this Kubernetes environment in the\\n <a ui-sref=\\\"portainer.k8sendpoint.kubernetesConfig({id: endpoint.Id})\\\">Kubernetes configuration</a> view.\\n </span>\\n </information-panel>\\n</div>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Configuration\\n </div>\\n <!-- name-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"container_name\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Name</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"container_name\\\" ng-model=\\\"endpoint.Name\\\" placeholder=\\\"e.g. kubernetes-cluster01 / docker-prod01\\\" />\\n </div>\\n </div>\\n <!-- !name-input -->\\n <!-- endpoint-url-input -->\\n <div class=\\\"form-group\\\" ng-if=\\\"!state.edgeEndpoint\\\">\\n <label for=\\\"endpoint_url\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Environment URL\\n <portainer-tooltip\\n position=\\\"bottom\\\"\\n message=\\\"URL or IP address of a Docker host. The Docker API must be exposed over a TCP port. Please refer to the Docker documentation to configure it.\\\"\\n >\\n </portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input\\n ng-disabled=\\\"endpointType === 'local' || state.azureEndpoint\\\"\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n id=\\\"endpoint_url\\\"\\n ng-model=\\\"endpoint.URL\\\"\\n placeholder=\\\"e.g. 10.0.0.10:2375 or mydocker.mydomain.com:2375\\\"\\n />\\n </div>\\n </div>\\n <!-- !endpoint-url-input -->\\n <!-- endpoint-public-url-input -->\\n <div class=\\\"form-group\\\" ng-if=\\\"!state.azureEndpoint\\\">\\n <label for=\\\"endpoint_public_url\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Public IP\\n <portainer-tooltip\\n position=\\\"bottom\\\"\\n message=\\\"URL or IP address where exposed containers will be reachable. This field is optional and will default to the environment URL.\\\"\\n >\\n </portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"endpoint_public_url\\\" ng-model=\\\"endpoint.PublicURL\\\" placeholder=\\\"e.g. 10.0.0.10 or mydocker.mydomain.com\\\" />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-if=\\\"state.edgeEndpoint\\\">\\n <label for=\\\"edge_checkin\\\" class=\\\"col-sm-2 control-label text-left\\\">\\n Poll frequency\\n <portainer-tooltip\\n position=\\\"bottom\\\"\\n message=\\\"Interval used by this Edge agent to check in with the Portainer instance. Affects Edge environment management and Edge compute features.\\\"\\n ></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-10\\\">\\n <select\\n id=\\\"edge_checkin\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"endpoint.EdgeCheckinInterval\\\"\\n ng-options=\\\"+(opt.value) as opt.key for opt in state.availableEdgeAgentCheckinOptions\\\"\\n ></select>\\n </div>\\n </div>\\n <!-- !endpoint-public-url-input -->\\n <azure-endpoint-config\\n ng-if=\\\"state.azureEndpoint\\\"\\n application-id=\\\"endpoint.AzureCredentials.ApplicationID\\\"\\n tenant-id=\\\"endpoint.AzureCredentials.TenantID\\\"\\n authentication-key=\\\"endpoint.AzureCredentials.AuthenticationKey\\\"\\n ></azure-endpoint-config>\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Metadata\\n </div>\\n <!-- group -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"endpoint_group\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Group\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <select ng-options=\\\"group.Id as group.Name for group in groups\\\" ng-model=\\\"endpoint.GroupId\\\" id=\\\"endpoint_group\\\" class=\\\"form-control\\\"></select>\\n </div>\\n </div>\\n <!-- !group -->\\n <!-- tags -->\\n <div class=\\\"form-group\\\">\\n <tag-selector ng-if=\\\"endpoint && availableTags\\\" tags=\\\"availableTags\\\" model=\\\"endpoint.TagIds\\\" on-create=\\\"(onCreateTag)\\\" allow-create=\\\"state.allowCreate\\\"></tag-selector>\\n </div>\\n <!-- !tags -->\\n <!-- endpoint-security -->\\n <div ng-if=\\\"endpointType === 'remote' && !state.azureEndpoint && !state.kubernetesEndpoint && !state.edgeEndpoint && endpoint.Type !== 6\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Security\\n </div>\\n <por-endpoint-security form-data=\\\"formValues.SecurityFormData\\\" endpoint=\\\"endpoint\\\"></por-endpoint-security>\\n </div>\\n <!-- !endpoint-security -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"state.actionInProgress || !endpoint.Name || !endpoint.URL || (endpoint.TLS && ((endpoint.TLSVerify && !formValues.TLSCACert) || (endpoint.TLSClientCert && (!formValues.TLSCert || !formValues.TLSKey))))\\\"\\n ng-click=\\\"updateEndpoint()\\\"\\n button-spinner=\\\"state.actionInProgress\\\"\\n >\\n <span ng-hide=\\\"state.actionInProgress\\\">Update environment</span>\\n <span ng-show=\\\"state.actionInProgress\\\">Updating environment...</span>\\n </button>\\n <a type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ui-sref=\\\"portainer.endpoints\\\">Cancel</a>\\n </div>\\n </div>\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/kubernetes/views/configure/configure.html';\nvar html = \"<kubernetes-view-header title=\\\"Kubernetes features configuration\\\" state=\\\"portainer.k8sendpoint.kubernetesConfig\\\" view-ready=\\\"ctrl.state.viewReady\\\">\\n <a ui-sref=\\\"portainer.endpoints\\\">Environment</a> > <a ui-sref=\\\"portainer.endpoints.endpoint({id: ctrl.endpoint.Id})\\\">{{ ctrl.endpoint.Name }}</a> > Kubernetes configuration\\n</kubernetes-view-header>\\n\\n<kubernetes-view-loading view-ready=\\\"ctrl.state.viewReady\\\"></kubernetes-view-loading>\\n\\n<div ng-if=\\\"ctrl.state.viewReady\\\">\\n <div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\" name=\\\"kubernetesClusterSetupForm\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Networking\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n Enabling the load balancer feature will allow users to expose application they deploy over an external IP address assigned by cloud provider.\\n <p style=\\\"margin-top: 2px;\\\">\\n <i class=\\\"fa fa-exclamation-circle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Ensure that your cloud provider allows you to create load balancers if you want to use this feature. Might incur costs.\\n </p>\\n </span>\\n\\n <div class=\\\"col-sm-12\\\">\\n <label class=\\\"control-label text-left\\\">\\n Allow users to use external load balancer\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\">\\n <input type=\\\"checkbox\\\" ng-model=\\\"ctrl.formValues.UseLoadBalancer\\\" /><i data-cy=\\\"kubeSetup-loadBalancerToggle\\\"></i>\\n </label>\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n Configuring ingress controllers will allow users to expose application they deploy over a HTTP route.<br />\\n <p style=\\\"margin-top: 2px;\\\">\\n <i class=\\\"fa fa-exclamation-circle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Ingress classes must be manually specified for each controller you want to use in the cluster. Make sure that each controller is running inside your cluster.\\n </p>\\n </span>\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label class=\\\"control-label text-left\\\">Ingress controller</label>\\n <span class=\\\"label label-default interactive\\\" style=\\\"margin-left: 10px;\\\" ng-click=\\\"ctrl.addIngressClass()\\\" data-cy=\\\"kubeSetup-congifIngressButton\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> configure ingress controller\\n </span>\\n </div>\\n\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\">\\n <div ng-repeat-start=\\\"ingressClass in ctrl.formValues.IngressClasses\\\" style=\\\"margin-top: 2px;\\\">\\n <div class=\\\"col-sm-7 input-group input-group-sm\\\" ng-class=\\\"{ striked: ingressClass.NeedsDeletion }\\\">\\n <span class=\\\"input-group-addon\\\">Ingress class</span>\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n name=\\\"ingress_class_name_{{ $index }}\\\"\\n ng-model=\\\"ingressClass.Name\\\"\\n placeholder=\\\"nginx\\\"\\n ng-pattern=\\\"/^[a-z]([-a-z0-9]*[a-z0-9])?$/\\\"\\n ng-change=\\\"ctrl.onChangeIngressClassName($index)\\\"\\n required\\n data-cy=\\\"kubeSetup-ingressClassName\\\"\\n />\\n </div>\\n <div class=\\\"col-sm-3 input-group input-group-sm\\\" ng-class=\\\"{ striked: ingressClass.NeedsDeletion }\\\">\\n <span class=\\\"input-group-addon\\\">Type</span>\\n <select\\n class=\\\"form-control\\\"\\n name=\\\"ingress_class_type_{{ $index }}\\\"\\n ng-model=\\\"ingressClass.Type\\\"\\n ng-options=\\\"value as value for (key, value) in ctrl.IngressClassTypes\\\"\\n required\\n data-cy=\\\"kubeSetup-ingressType\\\"\\n >\\n <option selected disabled hidden value=\\\"\\\">Select a type</option>\\n </select>\\n </div>\\n <div class=\\\"col-sm-1 input-group input-group-sm\\\">\\n <button\\n ng-if=\\\"!ingressClass.NeedsDeletion\\\"\\n class=\\\"btn btn-sm btn-danger\\\"\\n type=\\\"button\\\"\\n ng-click=\\\"ctrl.removeIngressClass($index)\\\"\\n data-cy=\\\"kubeSetup-deleteIngress\\\"\\n >\\n <i class=\\\"fa fa-trash-alt\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n <button ng-if=\\\"ingressClass.NeedsDeletion\\\" class=\\\"btn btn-sm btn-primary\\\" type=\\\"button\\\" ng-click=\\\"ctrl.restoreIngressClass($index)\\\">\\n <i class=\\\"fa fa-trash-restore\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n\\n <div\\n ng-repeat-end\\n ng-show=\\\"\\n kubernetesClusterSetupForm['ingress_class_name_' + $index].$invalid ||\\n kubernetesClusterSetupForm['ingress_class_type_' + $index].$invalid ||\\n ctrl.state.duplicates.ingressClasses.refs[$index] !== undefined\\n \\\"\\n >\\n <div class=\\\"col-sm-7 input-group\\\">\\n <div\\n class=\\\"small text-warning\\\"\\n style=\\\"margin-top: 5px;\\\"\\n ng-if=\\\"kubernetesClusterSetupForm['ingress_class_name_' + $index].$invalid || ctrl.state.duplicates.ingressClasses.refs[$index] !== undefined\\\"\\n >\\n <div ng-messages=\\\"kubernetesClusterSetupForm['ingress_class_name_'+$index].$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Ingress class name is required.</p>\\n <p ng-message=\\\"pattern\\\"\\n ><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field must consist of lower case alphanumeric characters or '-', start with an\\n alphabetic character, and end with an alphanumeric character (e.g. 'my-name', or 'abc-123').</p\\n >\\n </div>\\n <p ng-if=\\\"ctrl.state.duplicates.ingressClasses.refs[$index] !== undefined\\\">\\n <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This ingress class is already defined.\\n </p>\\n </div>\\n </div>\\n <div class=\\\"col-sm-3 input-group\\\">\\n <div class=\\\"small text-warning\\\" style=\\\"margin-top: 5px;\\\" ng-if=\\\"kubernetesClusterSetupForm['ingress_class_type_' + $index].$invalid\\\">\\n <div ng-messages=\\\"kubernetesClusterSetupForm['ingress_class_type_'+$index].$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Ingress class type is required.</p>\\n </div>\\n </div>\\n </div>\\n </div>\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\" ng-if=\\\"ctrl.hasTraefikIngress()\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n <p>\\n <i class=\\\"fa fa-flask blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Traefik support is experimental.\\n </p>\\n </span>\\n </div>\\n\\n <!-- auto update window -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Change Window Setting\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <por-switch-field\\n ng-model=\\\"$ctrl.state.autoUpdateSettings.Enabled\\\"\\n name=\\\"disableSysctlSettingForRegularUsers\\\"\\n label=\\\"Enable Change Window\\\"\\n feature=\\\"ctrl.limitedFeatureAutoWindow\\\"\\n tooltip=\\\"Specify a timeframe during which automatic updates can occur in this environment.\\\"\\n >\\n </por-switch-field>\\n </div>\\n </div>\\n\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Security\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n By default, all the users have access to the default namespace. Enable this option to set accesses on the default namespace.\\n </span>\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label class=\\\"control-label text-left\\\">\\n Restrict access to the default namespace\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\">\\n <input type=\\\"checkbox\\\" ng-model=\\\"ctrl.formValues.RestrictDefaultNamespace\\\" /><i data-cy=\\\"kubeSetup-restrictDefaultNsToggle\\\"></i>\\n </label>\\n </div>\\n </div>\\n\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Resources and Metrics\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n By ENABLING resource over-commit, you are able to assign more resources to namespaces than is physically available in the cluster. This may lead to unexpected\\n deployment failures if there is insufficient resource to service demand.\\n <p style=\\\"margin-top: 2px;\\\">\\n <i class=\\\"fa fa-exclamation-circle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n By DISABLING resource over-commit (highly recommended), you are only able to assign resources to namespaces that are less (in aggregate) than the cluster total\\n minus any system resource reservation.\\n </p>\\n </span>\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <por-switch-field\\n label=\\\"Allow resource over-commit\\\"\\n name=\\\"resource-over-commit-switch\\\"\\n feature=\\\"ctrl.limitedFeature\\\"\\n ng-model=\\\"ctrl.formValues.EnableResourceOverCommit\\\"\\n ng-change=\\\"ctrl.onChangeEnableResourceOverCommit()\\\"\\n ng-data-cy=\\\"kubeSetup-resourceOverCommitToggle\\\"\\n ></por-switch-field>\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n Enabling this feature will allow users to use specific features like autoscaling and to see container and node resource usage.\\n <p style=\\\"margin-top: 2px;\\\">\\n <i class=\\\"fa fa-exclamation-circle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Ensure that <a href=\\\"https://kubernetes.io/docs/tasks/debug-application-cluster/resource-metrics-pipeline/#metrics-server\\\" target=\\\"_blank\\\">metrics server</a> or\\n <a href=\\\"https://github.com/kubernetes-sigs/prometheus-adapter\\\" target=\\\"_blank\\\">prometheus</a> is running inside your cluster.\\n </p>\\n </span>\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label class=\\\"control-label text-left\\\">\\n Enable features using the metrics API\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\">\\n <input type=\\\"checkbox\\\" ng-model=\\\"ctrl.formValues.UseServerMetrics\\\" ng-change=\\\"ctrl.enableMetricsServer()\\\" /><i data-cy=\\\"kubeSetup-metricsToggle\\\"></i>\\n </label>\\n </div>\\n <div ng-if=\\\"ctrl.state.metrics.pending && ctrl.state.metrics.userClick\\\" class=\\\"col-sm-12 small text-muted\\\" style=\\\"margin-top: 5px;\\\">\\n Checking metrics API... <i class=\\\"fa fa-spinner fa-spin\\\" style=\\\"margin-left: 2px;\\\"></i>\\n </div>\\n <div\\n ng-if=\\\"!ctrl.state.metrics.pending && ctrl.state.metrics.isServerRunning && ctrl.state.metrics.userClick\\\"\\n class=\\\"col-sm-12 small text-muted\\\"\\n style=\\\"margin-top: 5px;\\\"\\n >\\n <i class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> Successfully reached metrics API\\n </div>\\n <div\\n ng-if=\\\"!ctrl.state.metrics.pending && !ctrl.state.metrics.isServerRunning && ctrl.state.metrics.userClick\\\"\\n class=\\\"col-sm-12 small text-muted\\\"\\n style=\\\"margin-top: 5px;\\\"\\n >\\n <i class=\\\"fa fa-times red-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> Unable to reach metrics API, make sure metrics server is properly deployed inside\\n that cluster.\\n </div>\\n </div>\\n\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Available storage options\\n </div>\\n\\n <div class=\\\"form-group\\\" ng-if=\\\"!ctrl.storageClassAvailable()\\\">\\n <div class=\\\"col-sm-12 small text-muted\\\">\\n <i class=\\\"fa fa-exclamation-circle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Unable to detect any storage class available to persist data. Users won't be able to persist application data inside this cluster.\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\" ng-if=\\\"ctrl.storageClassAvailable()\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n <p>\\n Select which storage options will be available for use when deploying applications. Have a look at your storage driver documentation to figure out which access\\n policy to configure and if the volume expansion capability is supported.\\n </p>\\n <p>\\n You can find more information about access modes\\n <a href=\\\"https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes\\\" target=\\\"_blank\\\">in the official Kubernetes documentation</a>.\\n </p>\\n </span>\\n </div>\\n\\n <div class=\\\"form-group\\\" ng-if=\\\"ctrl.storageClassAvailable()\\\">\\n <div style=\\\"margin-top: 10px;\\\" class=\\\"col-sm-12\\\">\\n <table class=\\\"table\\\" style=\\\"table-layout: fixed;\\\">\\n <tbody>\\n <tr class=\\\"text-muted\\\">\\n <td>Storage</td>\\n <td>Shared access policy</td>\\n <td>Volume expansion</td>\\n </tr>\\n <tr ng-repeat=\\\"class in ctrl.StorageClasses\\\">\\n <td>\\n <div style=\\\"margin: 5px;\\\">\\n <label class=\\\"switch\\\" style=\\\"margin-right: 10px;\\\">\\n <input type=\\\"checkbox\\\" ng-model=\\\"class.selected\\\" /><i data-cy=\\\"kubeSetup-storageToggle{{ class.Name }}\\\"></i>\\n </label>\\n <span>{{ class.Name }}</span>\\n </div>\\n </td>\\n <td>\\n <span\\n isteven-multi-select\\n input-model=\\\"class.availableAccessModes\\\"\\n output-model=\\\"class.AccessModes\\\"\\n button-label=\\\"Name\\\"\\n item-label=\\\"Description\\\"\\n tick-property=\\\"selected\\\"\\n directive-id=\\\"{{ class.Name }}\\\"\\n helper-elements=\\\"\\\"\\n translation=\\\"{nothingSelected: 'Not configured'}\\\"\\n data-cy=\\\"kubeSetup-storageAccessSelect{{ class.Name }}\\\"\\n >\\n </span>\\n </td>\\n <td>\\n <div style=\\\"margin: 5px;\\\">\\n <label class=\\\"switch\\\"\\n ><input type=\\\"checkbox\\\" ng-model=\\\"class.AllowVolumeExpansion\\\" /><i data-cy=\\\"kubeSetup-storageExpansionToggle{{ class.Name }}\\\"></i>\\n </label>\\n </div>\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"col-sm-12\\\">\\n <span ng-if=\\\"!ctrl.hasValidStorageConfiguration()\\\" style=\\\"margin-left: 5px;\\\" class=\\\"text-muted small\\\">\\n <i class=\\\"fa fa-exclamation-circle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Shared access policy configuration required\\n </span>\\n </div>\\n </div>\\n\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <!-- actions -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"submit\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-click=\\\"ctrl.configure()\\\"\\n ng-disabled=\\\"ctrl.state.actionInProgress || !kubernetesClusterSetupForm.$valid || !ctrl.hasValidStorageConfiguration()\\\"\\n button-spinner=\\\"ctrl.state.actionInProgress\\\"\\n analytics-on\\n analytics-if=\\\"ctrl.restrictDefaultToggledOn()\\\"\\n analytics-category=\\\"kubernetes\\\"\\n analytics-event=\\\"kubernetes-configure\\\"\\n analytics-properties=\\\"{ metadata: { restrictAccessToDefaultNamespace: ctrl.formValues.RestrictDefaultNamespace } }\\\"\\n data-cy=\\\"kubeSetup-saveConfigurationButton\\\"\\n >\\n <span ng-hide=\\\"ctrl.state.actionInProgress\\\">Save configuration</span>\\n <span ng-show=\\\"ctrl.state.actionInProgress\\\">Saving configuration...</span>\\n </button>\\n </div>\\n </div>\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/views/endpoints/create/createendpoint.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Create environment\\\"></rd-header-title>\\n <rd-header-content> <a ui-sref=\\\"portainer.endpoints\\\">Environments</a> > Add environment </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\" name=\\\"endpointCreationForm\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Environment type\\n </div>\\n <div class=\\\"form-group\\\"></div>\\n <div class=\\\"form-group\\\" style=\\\"margin-bottom: 0;\\\">\\n <div class=\\\"boxselector_wrapper\\\">\\n <div ng-click=\\\"resetEndpointURL()\\\">\\n <input type=\\\"radio\\\" id=\\\"agent_endpoint\\\" ng-model=\\\"state.EnvironmentType\\\" value=\\\"agent\\\" />\\n <label for=\\\"agent_endpoint\\\" data-cy=\\\"endpointCreate-agentSelectButton\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-bolt\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Agent\\n </div>\\n <p>Portainer agent</p>\\n </label>\\n </div>\\n <div ng-click=\\\"setDefaultPortainerInstanceURL()\\\">\\n <input type=\\\"radio\\\" id=\\\"edge_agent_endpoint\\\" ng-model=\\\"state.EnvironmentType\\\" value=\\\"edge_agent\\\" />\\n <label for=\\\"edge_agent_endpoint\\\" data-cy=\\\"endpointCreate-edgeAgentSelectButton\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-cloud\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Edge Agent\\n </div>\\n <p>Portainer Edge agent</p>\\n </label>\\n </div>\\n <div ng-click=\\\"resetEndpointURL()\\\">\\n <input type=\\\"radio\\\" id=\\\"docker_endpoint\\\" ng-model=\\\"state.EnvironmentType\\\" value=\\\"docker\\\" />\\n <label for=\\\"docker_endpoint\\\" data-cy=\\\"endpointCreate-dockerSelectButton\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fab fa-docker\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Docker\\n </div>\\n <p>Directly connect to the Docker API</p>\\n </label>\\n </div>\\n <div ng-click=\\\"resetEndpointURL()\\\">\\n <input type=\\\"radio\\\" id=\\\"kubernetes_endpoint\\\" ng-model=\\\"state.EnvironmentType\\\" value=\\\"kubernetes\\\" />\\n <label for=\\\"kubernetes_endpoint\\\" data-cy=\\\"endpointCreate-kubeSelectButton\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fas fa-dharmachakra\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Kubernetes\\n </div>\\n <p>Local Kubernetes environment</p>\\n </label>\\n </div>\\n <div>\\n <input type=\\\"radio\\\" id=\\\"azure_endpoint\\\" ng-model=\\\"state.EnvironmentType\\\" value=\\\"azure\\\" />\\n <label for=\\\"azure_endpoint\\\" data-cy=\\\"endpointCreate-azureSelectButton\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fab fa-microsoft\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Azure\\n </div>\\n <p>Connect to Microsoft Azure ACI</p>\\n </label>\\n </div>\\n </div>\\n </div>\\n <div ng-if=\\\"state.EnvironmentType === 'docker'\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Important notice\\n </div>\\n <div class=\\\"form-group\\\">\\n <p class=\\\"col-sm-12 text-muted small\\\">\\n You can connect Portainer to a Docker environment via socket or via TCP. You can find more information about how to expose the Docker API over TCP\\n <a href=\\\"https://docs.docker.com/engine/security/https/\\\"> in the Docker documentation</a>.\\n </p>\\n\\n <p class=\\\"col-sm-12 text-muted small\\\">\\n When using the socket, ensure that you have started the Portainer container with the following Docker flag\\n <code> -v \\\"/var/run/docker.sock:/var/run/docker.sock\\\" </code>\\n (on Linux) or\\n <code> -v \\\\.\\\\pipe\\\\docker_engine:\\\\.\\\\pipe\\\\docker_engine </code>\\n (on Windows).\\n </p>\\n </div>\\n </div>\\n <div ng-if=\\\"state.EnvironmentType === 'agent'\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Information\\n </div>\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n Ensure that you have deployed the Portainer agent in your cluster first. Refer to the platform related command below to deploy it.\\n <div class=\\\"input-group input-group-sm\\\" style=\\\"margin-top: 10px; margin-bottom: 10px;\\\">\\n <div class=\\\"btn-group btn-group-sm\\\">\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"state.PlatformType\\\" uib-btn-radio=\\\"'linux'\\\"><i class=\\\"fab fa-linux\\\" style=\\\"margin-right: 2px;\\\"></i> Linux</label>\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"state.PlatformType\\\" uib-btn-radio=\\\"'windows'\\\"><i class=\\\"fab fa-windows\\\" style=\\\"margin-right: 2px;\\\"></i> Windows</label>\\n </div>\\n </div>\\n <div style=\\\"margin-top: 10px;\\\">\\n <uib-tabset active=\\\"state.deploymentTab\\\">\\n <uib-tab index=\\\"0\\\" ng-if=\\\"state.PlatformType === 'linux'\\\" heading=\\\"Kubernetes via load balancer\\\">\\n <code style=\\\"display: block; white-space: pre-wrap; padding: 16px 90px;\\\">{{ deployCommands.kubeLoadBalancer }}</code>\\n </uib-tab>\\n\\n <uib-tab index=\\\"1\\\" ng-if=\\\"state.PlatformType === 'linux'\\\" heading=\\\"Kubernetes via node port\\\">\\n <code style=\\\"display: block; white-space: pre-wrap; padding: 16px 90px;\\\">{{ deployCommands.kubeNodePort }}</code>\\n </uib-tab>\\n\\n <uib-tab index=\\\"2\\\" heading=\\\"Docker Swarm\\\">\\n <code ng-if=\\\"state.PlatformType === 'linux'\\\" style=\\\"display: block; white-space: pre-wrap; padding: 16px 90px;\\\">{{ deployCommands.agentLinux }}</code>\\n <code ng-if=\\\"state.PlatformType === 'windows'\\\" style=\\\"display: block; white-space: pre-wrap; padding: 16px 90px;\\\">{{ deployCommands.agentWindows }}</code>\\n </uib-tab>\\n </uib-tabset>\\n <div style=\\\"margin-top: 10px;\\\">\\n <span class=\\\"btn btn-primary btn-sm space-left\\\" ng-click=\\\"copyAgentCommand()\\\"><i class=\\\"fa fa-copy space-right\\\" aria-hidden=\\\"true\\\"></i>Copy command</span>\\n <span>\\n <i id=\\\"copyNotification\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-left: 7px; display: none;\\\"></i>\\n </span>\\n </div>\\n </div>\\n </span>\\n </div>\\n </div>\\n <div ng-if=\\\"state.EnvironmentType === 'edge_agent'\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Information\\n </div>\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n <p>\\n Allows you to create an environment that can be registered with an Edge agent. The Edge agent will initiate the communications with the Portainer instance. All\\n the required information on how to connect an Edge agent to this environment will be available after environment creation.\\n </p>\\n <p> You can read more about the Edge agent in the userguide available <a href=\\\"https://downloads.portainer.io/edge_agent_guide.pdf\\\">here.</a> </p>\\n </span>\\n </div>\\n </div>\\n <div ng-if=\\\"state.EnvironmentType === 'kubernetes'\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Important notice\\n </div>\\n <div class=\\\"form-group\\\">\\n <p class=\\\"col-sm-12 text-muted small\\\">\\n This will allow you to manage the Kubernetes environment where Portainer is running.\\n </p>\\n\\n <p class=\\\"col-sm-12 text-muted small\\\">\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n In order to manage a remote Kubernetes environment, please use the Agent or Edge agent options.\\n </p>\\n </div>\\n </div>\\n <div ng-if=\\\"state.EnvironmentType === 'azure'\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Information\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <span class=\\\"small\\\">\\n <p class=\\\"text-muted\\\"> <i class=\\\"fa fa-flask orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> This feature is experimental. </p>\\n <p class=\\\"text-primary\\\">\\n Connect to Microsoft Azure to manage Azure Container Instances (ACI).\\n </p>\\n <p class=\\\"text-muted\\\">\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Have a look at\\n <a href=\\\"https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-create-service-principal-portal\\\" target=\\\"_blank\\\"\\n >the Azure documentation</a\\n >\\n to retrieve the credentials required below.\\n </p>\\n </span>\\n </div>\\n </div>\\n </div>\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Environment details\\n </div>\\n <!-- name-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"container_name\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Name</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n name=\\\"container_name\\\"\\n ng-model=\\\"formValues.Name\\\"\\n placeholder=\\\"e.g. docker-prod01 / kubernetes-cluster01\\\"\\n required\\n auto-focus\\n data-cy=\\\"endpointCreate-nameInput\\\"\\n />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"endpointCreationForm.container_name.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"endpointCreationForm.container_name.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !name-input -->\\n <!-- connect-via-socket-input -->\\n <div ng-if=\\\"state.EnvironmentType === 'docker'\\\">\\n <div class=\\\"form-group\\\" style=\\\"padding-left: 15px;\\\">\\n <label for=\\\"connect_socket\\\" class=\\\"col-sm_12 control-label text-left\\\">\\n Connect via socket\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\">\\n <input type=\\\"checkbox\\\" ng-model=\\\"formValues.ConnectSocket\\\" /><i data-cy=\\\"endpointCreate-connectSocketSwitch\\\"></i>\\n </label>\\n </div>\\n </div>\\n\\n <div ng-if=\\\"state.EnvironmentType === 'docker' && formValues.ConnectSocket\\\">\\n <div class=\\\"form-group\\\" style=\\\"padding-left: 15px;\\\">\\n <label for=\\\"override_socket\\\" class=\\\"col-sm_12 control-label text-left\\\">\\n Override default socket path\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\">\\n <input type=\\\"checkbox\\\" ng-model=\\\"formValues.OverrideSocket\\\" /><i data-cy=\\\"endpointCreate-overrideSocketSwitch\\\"></i>\\n </label>\\n </div>\\n\\n <div ng-if=\\\"formValues.OverrideSocket\\\">\\n <div class=\\\"form-group\\\">\\n <label for=\\\"socket_path\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Socket path\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"Path to the Docker socket. Remember to bind-mount the socket, see the important notice above for more information.\\\">\\n </portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n name=\\\"socket_path\\\"\\n ng-model=\\\"formValues.SocketPath\\\"\\n placeholder=\\\"e.g. /var/run/docker.sock (on Linux) or //./pipe/docker_engine (on Windows)\\\"\\n required\\n data-cy=\\\"endpointCreate-socketPathInput\\\"\\n />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"endpointCreationForm.socket_path.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"endpointCreationForm.socket_path.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n </div>\\n </div>\\n <!-- !connect-via-socket-input -->\\n <!-- endpoint-url-input -->\\n <div ng-if=\\\"(state.EnvironmentType === 'docker' && !formValues.ConnectSocket) || state.EnvironmentType === 'agent'\\\">\\n <div class=\\\"form-group\\\">\\n <label for=\\\"endpoint_url\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Environment URL\\n <portainer-tooltip\\n position=\\\"bottom\\\"\\n message=\\\"URL or IP address of a Docker host. The Docker API must be exposed over a TCP port. Please refer to the Docker documentation to configure it.\\\"\\n >\\n </portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input\\n ng-if=\\\"state.EnvironmentType === 'docker'\\\"\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n name=\\\"endpoint_url\\\"\\n ng-model=\\\"formValues.URL\\\"\\n placeholder=\\\"e.g. 10.0.0.10:2375 or mydocker.mydomain.com:2375\\\"\\n required\\n data-cy=\\\"endpointCreate-endpointUrlDockerInput\\\"\\n />\\n <input\\n ng-if=\\\"state.EnvironmentType === 'agent'\\\"\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n name=\\\"endpoint_url\\\"\\n ng-model=\\\"formValues.URL\\\"\\n placeholder=\\\"e.g. 10.0.0.10:9001 or tasks.portainer_agent:9001\\\"\\n required\\n data-cy=\\\"endpointCreate-endpointUrlAgentInput\\\"\\n />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"endpointCreationForm.endpoint_url.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"endpointCreationForm.endpoint_url.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n </div>\\n <!-- !endpoint-url-input -->\\n <!-- portainer-instance-input -->\\n <div ng-if=\\\"state.EnvironmentType === 'edge_agent'\\\">\\n <div class=\\\"form-group\\\">\\n <label for=\\\"endpoint_url\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Portainer server URL\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"URL of the Portainer instance that the agent will use to initiate the communications.\\\"></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n name=\\\"endpoint_url\\\"\\n ng-model=\\\"formValues.URL\\\"\\n placeholder=\\\"e.g. 10.0.0.10:9443 or portainer.mydomain.com\\\"\\n required\\n data-cy=\\\"endpointCreate-portainerServerUrlInput\\\"\\n />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"endpointCreationForm.endpoint_url.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"endpointCreationForm.endpoint_url.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !portainer-instance-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"edge_checkin\\\" class=\\\"col-sm-2 control-label text-left\\\">\\n Poll frequency\\n <portainer-tooltip\\n position=\\\"bottom\\\"\\n message=\\\"Interval used by this Edge agent to check in with the Portainer instance. Affects Edge environment management and Edge compute features.\\\"\\n >\\n </portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-10\\\">\\n <select\\n id=\\\"edge_checkin\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"formValues.CheckinInterval\\\"\\n ng-options=\\\"+(opt.value) as opt.key for opt in state.availableEdgeAgentCheckinOptions\\\"\\n data-cy=\\\"endpointCreate-pollFrequencySelect\\\"\\n ></select>\\n </div>\\n </div>\\n </div>\\n <!-- endpoint-public-url-input -->\\n <div ng-if=\\\"state.EnvironmentType === 'docker' || state.EnvironmentType === 'agent'\\\">\\n <div class=\\\"form-group\\\">\\n <label for=\\\"endpoint_public_url\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Public IP\\n <portainer-tooltip\\n position=\\\"bottom\\\"\\n message=\\\"URL or IP address where exposed containers will be reachable. This field is optional and will default to the environment URL.\\\"\\n >\\n </portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n id=\\\"endpoint_public_url\\\"\\n ng-model=\\\"formValues.PublicURL\\\"\\n placeholder=\\\"e.g. 10.0.0.10 or mydocker.mydomain.com\\\"\\n data-cy=\\\"endpointCreate-publicIpInput\\\"\\n />\\n </div>\\n </div>\\n </div>\\n <!-- !endpoint-public-url-input -->\\n <!-- azure-details -->\\n <div ng-if=\\\"state.EnvironmentType === 'azure'\\\">\\n <!-- applicationId-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"azure_credential_appid\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Application ID</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n name=\\\"azure_credential_appid\\\"\\n ng-model=\\\"formValues.AzureApplicationId\\\"\\n placeholder=\\\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\\\"\\n required\\n data-cy=\\\"endpointCreate-azureAppIdInput\\\"\\n />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"endpointCreationForm.azure_credential_appid.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"endpointCreationForm.azure_credential_appid.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !applicationId-input -->\\n <!-- tenantId-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"azure_credential_tenantid\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Tenant ID</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n name=\\\"azure_credential_tenantid\\\"\\n ng-model=\\\"formValues.AzureTenantId\\\"\\n placeholder=\\\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\\\"\\n required\\n data-cy=\\\"endpointCreate-azureTenantIdInput\\\"\\n />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"endpointCreationForm.azure_credential_tenantid.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"endpointCreationForm.azure_credential_tenantid.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !tenantId-input -->\\n <!-- authenticationkey-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"azure_credential_authkey\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Authentication key</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n name=\\\"azure_credential_authkey\\\"\\n ng-model=\\\"formValues.AzureAuthenticationKey\\\"\\n placeholder=\\\"cOrXoK/1D35w8YQ8nH1/8ZGwzz45JIYD5jxHKXEQknk=\\\"\\n required\\n data-cy=\\\"endpointCreate-azureAuthKeyInput\\\"\\n />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"endpointCreationForm.azure_credential_authkey.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"endpointCreationForm.azure_credential_authkey.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !authenticationkey-input -->\\n </div>\\n <!-- !azure-details -->\\n <!-- endpoint-security -->\\n <por-endpoint-security ng-if=\\\"state.EnvironmentType === 'docker' && !formValues.ConnectSocket\\\" form-data=\\\"formValues.SecurityFormData\\\"></por-endpoint-security>\\n <!-- !endpoint-security -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Metadata\\n </div>\\n <!-- group -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"endpoint_group\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Group\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <select\\n ng-options=\\\"group.Id as group.Name for group in groups\\\"\\n ng-model=\\\"formValues.GroupId\\\"\\n id=\\\"endpoint_group\\\"\\n class=\\\"form-control\\\"\\n data-cy=\\\"endpointCreate-endpointGroup\\\"\\n ></select>\\n </div>\\n </div>\\n <!-- !group -->\\n <!-- tags -->\\n <div class=\\\"form-group\\\">\\n <tag-selector ng-if=\\\"formValues && availableTags\\\" tags=\\\"availableTags\\\" model=\\\"formValues.TagIds\\\" allow-create=\\\"state.allowCreateTag\\\" on-create=\\\"(onCreateTag)\\\">\\n </tag-selector>\\n </div>\\n <!-- !tags -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <!-- actions -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n ng-if=\\\"state.EnvironmentType === 'docker'\\\"\\n type=\\\"submit\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"state.actionInProgress || !endpointCreationForm.$valid || (formValues.TLS && ((formValues.TLSVerify && !formValues.TLSCACert) || (formValues.TLSClientCert && (!formValues.TLSCert || !formValues.TLSKey))))\\\"\\n ng-click=\\\"addDockerEndpoint()\\\"\\n button-spinner=\\\"state.actionInProgress\\\"\\n data-cy=\\\"endpointCreate-createDockerEndpoint\\\"\\n analytics-on\\n analytics-category=\\\"portainer\\\"\\n analytics-event=\\\"portainer-endpoint-creation\\\"\\n analytics-properties=\\\"{ metadata: { type: 'docker-api' } }\\\"\\n >\\n <span ng-hide=\\\"state.actionInProgress\\\"><i class=\\\"fa fa-plus\\\" aria-hidden=\\\"true\\\"></i> Add environment</span>\\n <span ng-show=\\\"state.actionInProgress\\\">Creating environment...</span>\\n </button>\\n <button\\n ng-if=\\\"state.EnvironmentType === 'agent'\\\"\\n type=\\\"submit\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"state.actionInProgress || !endpointCreationForm.$valid\\\"\\n ng-click=\\\"addAgentEndpoint()\\\"\\n button-spinner=\\\"state.actionInProgress\\\"\\n data-cy=\\\"endpointCreate-createAgentEndpoint\\\"\\n >\\n <span ng-hide=\\\"state.actionInProgress\\\"><i class=\\\"fa fa-plus\\\" aria-hidden=\\\"true\\\"></i> Add environment</span>\\n <span ng-show=\\\"state.actionInProgress\\\">Creating environment...</span>\\n </button>\\n <button\\n ng-if=\\\"state.EnvironmentType === 'edge_agent'\\\"\\n type=\\\"submit\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"state.actionInProgress || !endpointCreationForm.$valid\\\"\\n ng-click=\\\"addEdgeAgentEndpoint()\\\"\\n button-spinner=\\\"state.actionInProgress\\\"\\n data-cy=\\\"endpointCreate-createEdgeAgentEndpoint\\\"\\n analytics-on\\n analytics-category=\\\"portainer\\\"\\n analytics-event=\\\"portainer-endpoint-creation\\\"\\n analytics-properties=\\\"{ metadata: { type: 'edge-agent' } }\\\"\\n >\\n <span ng-hide=\\\"state.actionInProgress\\\"><i class=\\\"fa fa-plus\\\" aria-hidden=\\\"true\\\"></i> Add environment</span>\\n <span ng-show=\\\"state.actionInProgress\\\">Creating environment...</span>\\n </button>\\n <button\\n ng-if=\\\"state.EnvironmentType === 'kubernetes'\\\"\\n type=\\\"submit\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"state.actionInProgress || !endpointCreationForm.$valid\\\"\\n ng-click=\\\"addKubernetesEndpoint()\\\"\\n button-spinner=\\\"state.actionInProgress\\\"\\n analytics-on\\n analytics-category=\\\"portainer\\\"\\n analytics-event=\\\"portainer-endpoint-creation\\\"\\n analytics-properties=\\\"{ metadata: { type: 'kubernetes-api' } }\\\"\\n >\\n <span ng-hide=\\\"state.actionInProgress\\\"><i class=\\\"fa fa-plus\\\" aria-hidden=\\\"true\\\"></i> Add environment</span>\\n <span ng-show=\\\"state.actionInProgress\\\">Creating environment...</span>\\n </button>\\n <button\\n ng-if=\\\"state.EnvironmentType === 'azure'\\\"\\n type=\\\"submit\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"state.actionInProgress || !endpointCreationForm.$valid\\\"\\n ng-click=\\\"addAzureEndpoint()\\\"\\n button-spinner=\\\"state.actionInProgress\\\"\\n data-cy=\\\"endpointCreate-createAzureEndpoint\\\"\\n analytics-on\\n analytics-category=\\\"portainer\\\"\\n analytics-event=\\\"portainer-endpoint-creation\\\"\\n analytics-properties=\\\"{ metadata: { type: 'azure-api' } }\\\"\\n >\\n <span ng-hide=\\\"state.actionInProgress\\\"><i class=\\\"fa fa-plus\\\" aria-hidden=\\\"true\\\"></i> Add environment</span>\\n <span ng-show=\\\"state.actionInProgress\\\">Creating environment...</span>\\n </button>\\n </div>\\n </div>\\n <!-- !actions -->\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/views/endpoints/access/endpointAccess.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Environment access\\\"></rd-header-title>\\n <rd-header-content>\\n <a ui-sref=\\\"portainer.endpoints\\\">Environments</a> > <a ui-sref=\\\"portainer.endpoints.endpoint({id: ctrl.endpoint.Id})\\\">{{ ctrl.endpoint.Name }}</a> > Access management\\n </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\" ng-if=\\\"ctrl.endpoint\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-plug\\\" title-text=\\\"Environment\\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr>\\n <td>Name</td>\\n <td>\\n {{ ctrl.endpoint.Name }}\\n </td>\\n </tr>\\n <tr>\\n <td>URL</td>\\n <td>\\n {{ ctrl.endpoint.URL | stripprotocol }}\\n </td>\\n </tr>\\n <tr>\\n <td>Group</td>\\n <td>\\n <a ui-sref=\\\"portainer.groups.group({ id: ctrl.group.Id })\\\">{{ ctrl.group.Name }}</a>\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\\n<por-access-management\\n ng-if=\\\"ctrl.endpoint && ctrl.group\\\"\\n access-controlled-entity=\\\"ctrl.endpoint\\\"\\n action-in-progress=\\\"ctrl.state.actionInProgress\\\"\\n entity-type=\\\"endpoint\\\"\\n inherit-from=\\\"ctrl.group\\\"\\n update-access=\\\"ctrl.updateAccess\\\"\\n limited-feature=\\\"ctrl.limitedFeature\\\"\\n>\\n</por-access-management>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/views/groups/groups.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Environment groups\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"Refresh\\\" ui-sref=\\\"portainer.groups\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content>Environment group management</rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <groups-datatable\\n title-text=\\\"Environment groups\\\"\\n title-icon=\\\"fa-object-group\\\"\\n dataset=\\\"groups\\\"\\n table-key=\\\"groups\\\"\\n order-by=\\\"Name\\\"\\n remove-action=\\\"removeAction\\\"\\n ></groups-datatable>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/views/groups/edit/group.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Environment group details\\\"></rd-header-title>\\n <rd-header-content> <a ui-sref=\\\"portainer.groups\\\">Groups</a> > {{ ::group.Name }} </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <group-form\\n loaded=\\\"loaded\\\"\\n page-type=\\\"edit\\\"\\n model=\\\"group\\\"\\n available-endpoints=\\\"availableEndpoints\\\"\\n available-tags=\\\"availableTags\\\"\\n associated-endpoints=\\\"associatedEndpoints\\\"\\n add-label-action=\\\"addLabel\\\"\\n remove-label-action=\\\"removeLabel\\\"\\n form-action=\\\"update\\\"\\n form-action-label=\\\"Update the group\\\"\\n action-in-progress=\\\"state.actionInProgress\\\"\\n on-create-tag=\\\"(onCreateTag)\\\"\\n ></group-form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/views/groups/create/creategroup.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Create environment group\\\"></rd-header-title>\\n <rd-header-content> <a ui-sref=\\\"portainer.groups\\\">Environment groups</a> > Add group </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <group-form\\n loaded=\\\"loaded\\\"\\n page-type=\\\"create\\\"\\n model=\\\"model\\\"\\n available-endpoints=\\\"availableEndpoints\\\"\\n available-tags=\\\"availableTags\\\"\\n associated-endpoints=\\\"associatedEndpoints\\\"\\n add-label-action=\\\"addLabel\\\"\\n remove-label-action=\\\"removeLabel\\\"\\n form-action=\\\"create\\\"\\n form-action-label=\\\"Create the group\\\"\\n action-in-progress=\\\"state.actionInProgress\\\"\\n on-create-tag=\\\"(onCreateTag)\\\"\\n ></group-form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/views/groups/access/groupAccess.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Environment group access\\\"></rd-header-title>\\n <rd-header-content>\\n <a ui-sref=\\\"portainer.groups\\\">Groups</a> > <a ui-sref=\\\"portainer.groups.group({id: group.Id})\\\">{{ group.Name }}</a> > Access management\\n </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\" ng-if=\\\"group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-object-group\\\" title-text=\\\"Group\\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr>\\n <td>Name</td>\\n <td>\\n {{ group.Name }}\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\\n<por-access-management\\n ng-if=\\\"group\\\"\\n access-controlled-entity=\\\"group\\\"\\n entity-type=\\\"group\\\"\\n action-in-progress=\\\"state.actionInProgress\\\"\\n update-access=\\\"updateAccess\\\"\\n limited-feature=\\\"limitedFeature\\\"\\n></por-access-management>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/views/home/home.html';\nvar html = \"<!-- <react-example text=\\\"'text'\\\"></react-example> -->\\n\\n<rd-header>\\n <rd-header-title title-text=\\\"Home\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"Refresh\\\" ui-sref=\\\"portainer.home\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content>Environments</rd-header-content>\\n</rd-header>\\n\\n<motd-panel ng-if=\\\"motd && motd.Message !== '' && applicationState.UI.dismissedInfoHash !== motd.Hash\\\" motd=\\\"motd\\\" dismiss-action=\\\"dismissImportantInformation(motd.Hash)\\\">\\n</motd-panel>\\n\\n<kubernetes-feedback-panel></kubernetes-feedback-panel>\\n\\n<information-panel ng-if=\\\"!isAdmin && endpoints.length === 0\\\" title-text=\\\"Information\\\">\\n <span class=\\\"small text-muted\\\">\\n <p>\\n <i class=\\\"fa fa-exclamation-circle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n You do not have access to any environment. Please contact your administrator.\\n </p>\\n </span>\\n</information-panel>\\n\\n<div\\n class=\\\"row\\\"\\n style=\\\"width: 100%; height: 100%; text-align: center; display: flex; flex-direction: column; align-items: center; justify-content: center;\\\"\\n ng-if=\\\"state.connectingToEdgeEndpoint\\\"\\n>\\n Connecting to the Edge environment...\\n <i class=\\\"fa fa-cog fa-spin\\\" style=\\\"margin-left: 5px;\\\"></i>\\n</div>\\n\\n<information-panel ng-if=\\\"isAdmin && endpoints.length === 0\\\" title-text=\\\"Information\\\">\\n <span class=\\\"small text-muted\\\">\\n <p>\\n <i class=\\\"fa fa-exclamation-circle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n No environment available for management. Please head over the\\n <a ui-sref=\\\"portainer.endpoints.new\\\"> environments view </a>\\n to add an environment.\\n </p>\\n </span>\\n</information-panel>\\n\\n<div class=\\\"row\\\" ng-if=\\\"!state.connectingToEdgeEndpoint\\\">\\n <div class=\\\"col-sm-12\\\">\\n <endpoint-list\\n title-text=\\\"Environments\\\"\\n title-icon=\\\"fa-plug\\\"\\n table-key=\\\"home_endpoints\\\"\\n tags=\\\"tags\\\"\\n dashboard-action=\\\"goToDashboard\\\"\\n show-snapshot-action=\\\"isAdmin\\\"\\n snapshot-action=\\\"triggerSnapshot\\\"\\n edit-action=\\\"goToEdit\\\"\\n is-admin=\\\"isAdmin\\\"\\n retrieve-page=\\\"getPaginatedEndpoints\\\"\\n endpoint-init-time=\\\"state.homepageLoadTime\\\"\\n ></endpoint-list>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/views/init/endpoint/initEndpoint.html';\nvar html = \"<div class=\\\"page-wrapper\\\">\\n <!-- simple box -->\\n <div class=\\\"container simple-box\\\">\\n <div class=\\\"col-sm-12\\\">\\n <!-- simple box logo -->\\n <div class=\\\"row\\\">\\n <img ng-if=\\\"ctrl.logo\\\" ng-src=\\\"{{ ctrl.logo }}\\\" class=\\\"simple-box-logo\\\" />\\n <img ng-if=\\\"!ctrl.logo\\\" src=\\\"\" + require(\"@/assets/images/logo_alt.svg\") + \"\\\" class=\\\"simple-box-logo\\\" alt=\\\"Portainer\\\" />\\n </div>\\n <!-- !simple box logo -->\\n <!-- init-environment panel -->\\n <div class=\\\"panel panel-default\\\">\\n <div class=\\\"panel-body\\\">\\n <!-- init-environment form -->\\n <form class=\\\"simple-box-form form-horizontal\\\">\\n <!-- note -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <span class=\\\"small text-muted\\\">\\n Connect Portainer to the container environment you want to manage.\\n </span>\\n </div>\\n </div>\\n <!-- !note -->\\n <!-- environment-type -->\\n <div class=\\\"form-group\\\" style=\\\"margin-bottom: 0;\\\">\\n <div class=\\\"boxselector_wrapper\\\">\\n <div ng-repeat=\\\"type in ctrl.endpointSections\\\">\\n <input type=\\\"radio\\\" id=\\\"{{ type.Id }}\\\" ng-model=\\\"ctrl.formValues.ConnectionType\\\" ng-value=\\\"type.Value\\\" />\\n <label for=\\\"{{ type.Id }}\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i ng-class=\\\"type.Classes\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n {{ type.Title }}\\n </div>\\n <p>{{ type.Description }}</p>\\n </label>\\n </div>\\n </div>\\n </div>\\n <!-- !environment-type -->\\n <!-- environment-type-details -->\\n <div ng-if=\\\"ctrl.formValues.ConnectionType === ctrl.PortainerEndpointConnectionTypes.DOCKER_LOCAL\\\">\\n <ng-include src=\\\"'app/portainer/views/init/endpoint/includes/localDocker.html'\\\"></ng-include>\\n </div>\\n <div ng-if=\\\"ctrl.formValues.ConnectionType === ctrl.PortainerEndpointConnectionTypes.KUBERNETES_LOCAL\\\">\\n <ng-include src=\\\"'app/portainer/views/init/endpoint/includes/localKubernetes.html'\\\"></ng-include>\\n </div>\\n <div ng-if=\\\"ctrl.formValues.ConnectionType === ctrl.PortainerEndpointConnectionTypes.AGENT\\\">\\n <ng-include src=\\\"'app/portainer/views/init/endpoint/includes/agent.html'\\\"></ng-include>\\n </div>\\n <!-- !environment-type-details -->\\n <!-- actions -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"submit\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"ctrl.isConnectButtonDisabled()\\\"\\n ng-click=\\\"ctrl.createEndpoint()\\\"\\n button-spinner=\\\"ctrl.state.actionInProgress\\\"\\n >\\n <span ng-hide=\\\"ctrl.state.actionInProgress\\\"><i class=\\\"fa fa-bolt\\\" aria-hidden=\\\"true\\\"></i> Connect</span>\\n <span ng-show=\\\"ctrl.state.actionInProgress\\\">Connecting...</span>\\n </button>\\n <button type=\\\"submit\\\" class=\\\"btn btn-sm btn-default\\\" ng-click=\\\"ctrl.skipEndpointCreation()\\\" button-spinner=\\\"ctrl.state.actionInProgress\\\">\\n <span ng-hide=\\\"ctrl.state.actionInProgress\\\"><i class=\\\"fa fa-share\\\" aria-hidden=\\\"true\\\"></i> Skip</span>\\n </button>\\n </div>\\n </div>\\n <!-- !actions -->\\n </form>\\n <!-- !init-environment form -->\\n </div>\\n </div>\\n <!-- !init-environment panel -->\\n </div>\\n </div>\\n <!-- !simple box -->\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/views/init/admin/initAdmin.html';\nvar html = \"<div class=\\\"page-wrapper\\\">\\n <!-- simple box -->\\n <div class=\\\"container simple-box\\\">\\n <div class=\\\"col-md-8 col-md-offset-2 col-sm-10 col-sm-offset-1\\\">\\n <!-- simple box logo -->\\n <div class=\\\"row\\\">\\n <img ng-if=\\\"logo\\\" ng-src=\\\"{{ logo }}\\\" class=\\\"simple-box-logo\\\" />\\n <img ng-if=\\\"!logo\\\" src=\\\"\" + require(\"@/assets/images/logo_alt.svg\") + \"\\\" class=\\\"simple-box-logo\\\" alt=\\\"Portainer\\\" />\\n </div>\\n <!-- !simple box logo -->\\n <!-- init password panel -->\\n <div class=\\\"panel panel-default\\\">\\n <div class=\\\"panel-body\\\">\\n <!-- toggle -->\\n <div style=\\\"padding-bottom: 12px;\\\">\\n <a ng-click=\\\"togglePanel()\\\">\\n <i ng-class=\\\"{ true: 'glyphicon glyphicon-chevron-down', false: 'glyphicon glyphicon-chevron-right' }[state.showInitPassword]\\\" aria-hidden=\\\"true\\\"></i\\n ><span style=\\\"padding-left: 10px;\\\">New Portainer installation</span>\\n </a>\\n </div>\\n <!-- !toggle -->\\n\\n <!-- init password form -->\\n <form class=\\\"simple-box-form form-horizontal\\\" style=\\\"padding-left: 30px;\\\" ng-if=\\\"state.showInitPassword\\\">\\n <!-- note -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <span class=\\\"small text-muted\\\">\\n Please create the initial administrator user.\\n </span>\\n </div>\\n </div>\\n <!-- !note -->\\n <!-- username-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"username\\\" class=\\\"col-sm-4 control-label text-left\\\">\\n Username\\n </label>\\n <div class=\\\"col-sm-8\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"username\\\" ng-model=\\\"formValues.Username\\\" placeholder=\\\"e.g. admin\\\" />\\n </div>\\n </div>\\n <!-- !username-input -->\\n <!-- new-password-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"password\\\" class=\\\"col-sm-4 control-label text-left\\\">Password</label>\\n <div class=\\\"col-sm-8\\\">\\n <input type=\\\"password\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.Password\\\" id=\\\"password\\\" auto-focus />\\n </div>\\n </div>\\n <!-- !new-password-input -->\\n <!-- confirm-password-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"confirm_password\\\" class=\\\"col-sm-4 control-label text-left\\\">Confirm password</label>\\n <div class=\\\"col-sm-8\\\">\\n <div class=\\\"input-group\\\">\\n <input type=\\\"password\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.ConfirmPassword\\\" id=\\\"confirm_password\\\" />\\n <span class=\\\"input-group-addon\\\"\\n ><i\\n ng-class=\\\"{ true: 'fa fa-check green-icon', false: 'fa fa-times red-icon' }[formValues.Password !== '' && formValues.Password === formValues.ConfirmPassword]\\\"\\n aria-hidden=\\\"true\\\"\\n ></i\\n ></span>\\n </div>\\n </div>\\n </div>\\n <!-- !confirm-password-input -->\\n <!-- note -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <span class=\\\"small text-muted\\\">\\n <i ng-class=\\\"{ true: 'fa fa-check green-icon', false: 'fa fa-times red-icon' }[formValues.Password.length >= 8]\\\" aria-hidden=\\\"true\\\"></i>\\n The password must be at least 8 characters long\\n </span>\\n </div>\\n </div>\\n <!-- !note -->\\n <!-- actions -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"submit\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"state.actionInProgress || formValues.Password.length < 8 || formValues.Password !== formValues.ConfirmPassword\\\"\\n ng-click=\\\"createAdminUser()\\\"\\n button-spinner=\\\"state.actionInProgress\\\"\\n >\\n <span ng-hide=\\\"state.actionInProgress\\\"><i class=\\\"fa fa-user-plus\\\" aria-hidden=\\\"true\\\"></i> Create user</span>\\n <span ng-show=\\\"state.actionInProgress\\\">Creating user...</span>\\n </button>\\n </div>\\n </div>\\n <!-- !actions -->\\n <!-- enableTelemetry-->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <input type=\\\"checkbox\\\" name=\\\"toggle_enableTelemetry\\\" ng-model=\\\"formValues.enableTelemetry\\\" />\\n <span class=\\\"text-muted small\\\" style=\\\"margin-left: 2px;\\\"\\n >Allow collection of anonymous statistics. You can find more information about this in our\\n <a href=\\\"https://www.portainer.io/documentation/in-app-analytics-and-privacy-policy/\\\" target=\\\"_blank\\\">privacy policy</a>.</span\\n >\\n </div>\\n </div>\\n <!-- !enableTelemetry-->\\n </form>\\n <!-- !init password form -->\\n </div>\\n </div>\\n <!-- !init password panel -->\\n\\n <!-- restore backup panel -->\\n <div class=\\\"panel panel-default\\\">\\n <div class=\\\"panel-body\\\">\\n <!-- toggle -->\\n <div style=\\\"padding-bottom: 12px;\\\">\\n <a ng-click=\\\"togglePanel()\\\">\\n <i ng-class=\\\"{ true: 'glyphicon glyphicon-chevron-down', false: 'glyphicon glyphicon-chevron-right' }[state.showRestorePortainer]\\\" aria-hidden=\\\"true\\\"></i\\n ><span style=\\\"padding-left: 10px;\\\">Restore Portainer from backup</span>\\n </a>\\n </div>\\n <!-- !toggle -->\\n\\n <!-- restore form -->\\n <form class=\\\"simple-box-form form-horizontal\\\" style=\\\"padding-left: 30px;\\\" ng-if=\\\"state.showRestorePortainer\\\">\\n <!-- note -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-9\\\">\\n <span class=\\\"small text-muted\\\">\\n This will restore the Portainer metadata which contains information about the environments, stacks and applications, as well as the configured users.\\n </span>\\n </div>\\n </div>\\n <!-- !note -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"boxselector_wrapper\\\">\\n <div>\\n <input type=\\\"radio\\\" id=\\\"restore_file\\\" checked=\\\"checked\\\" />\\n <label for=\\\"restore_file\\\" style=\\\"padding-bottom: 20px;\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-upload\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Upload backup file\\n </div>\\n <p></p>\\n </label>\\n </div>\\n <div>\\n <input type=\\\"radio\\\" id=\\\"restore_s3\\\" disabled />\\n <label for=\\\"restore_s3\\\" class=\\\"boxselector_disabled\\\" style=\\\"background-color: #ffffff;\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-download\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Retrieve from S3\\n </div>\\n <p>This feature is available in <a href=\\\"https://www.portainer.io/business-upsell?from=restore-s3-form\\\" target=\\\"_blank\\\"> Portainer Business Edition</a></p>\\n </label>\\n </div>\\n </div>\\n </div>\\n <!-- note -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <span class=\\\"small text-muted\\\">\\n You can upload a backup file from your computer.\\n </span>\\n </div>\\n </div>\\n <!-- !note -->\\n <!-- select-file-input -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n class=\\\"btn btn-sm btn-primary\\\"\\n ngf-select\\n accept=\\\".gz,.encrypted\\\"\\n ngf-accept=\\\"'application/x-tar,application/x-gzip'\\\"\\n ng-model=\\\"formValues.BackupFile\\\"\\n auto-focus\\n >Select file</button\\n >\\n <span style=\\\"margin-left: 5px;\\\">\\n {{ formValues.BackupFile.name }}\\n <i class=\\\"fa fa-times red-icon\\\" ng-if=\\\"!formValues.BackupFile\\\" aria-hidden=\\\"true\\\"></i>\\n </span>\\n </div>\\n </div>\\n <!-- !select-file-input -->\\n <!-- password-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"password\\\" class=\\\"col-sm-3 control-label text-left\\\">\\n Password\\n <portainer-tooltip\\n position=\\\"bottom\\\"\\n message=\\\"If the backup is password protected, provide the password in order to extract the backup file, otherwise this field can be left empty.\\\"\\n ></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-4\\\">\\n <input type=\\\"password\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.Password\\\" id=\\\"password\\\" />\\n </div>\\n </div>\\n <!-- !password-input -->\\n <!-- note -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <span class=\\\"small text-muted\\\">\\n You are about to restore Portainer from this backup.\\n </span>\\n </div>\\n <div class=\\\"col-sm-12\\\">\\n <span class=\\\"small text-muted\\\">\\n After restoring has completed, please log in as a user that was known by the Portainer that was restored.\\n </span>\\n </div>\\n </div>\\n <!-- !note -->\\n <!-- actions -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"submit\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"!formValues.BackupFile || state.backupInProgress\\\"\\n ng-click=\\\"uploadBackup()\\\"\\n button-spinner=\\\"state.backupInProgress\\\"\\n >\\n <span ng-hide=\\\"state.backupInProgress\\\">Restore Portainer</span>\\n <span ng-show=\\\"state.backupInProgress\\\">Restoring Portainer...</span>\\n </button>\\n </div>\\n </div>\\n <!-- !actions -->\\n </form>\\n <!-- !restore backup form -->\\n </div>\\n </div>\\n <!-- !restore backup panel -->\\n </div>\\n </div>\\n <!-- !simple box -->\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/views/registries/registries.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Registries\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"Refresh\\\" ui-sref=\\\"portainer.registries\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content>Registry management</rd-header-content>\\n</rd-header>\\n\\n<information-panel title-text=\\\"Information\\\">\\n <span class=\\\"small text-muted\\\">\\n View registries via an environment to manage access for user(s) and/or team(s)\\n </span>\\n</information-panel>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <registries-datatable\\n title-text=\\\"Registries\\\"\\n title-icon=\\\"fa-database\\\"\\n dataset=\\\"registries\\\"\\n table-key=\\\"registries\\\"\\n order-by=\\\"Name\\\"\\n remove-action=\\\"removeAction\\\"\\n can-browse=\\\"canBrowse\\\"\\n ></registries-datatable>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/views/registries/edit/registry.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Registry details\\\"></rd-header-title>\\n <rd-header-content>\\n <a ui-sref=\\\"portainer.registries\\\">Registries</a> > <a ui-sref=\\\"portainer.registries.registry({id: registry.Id})\\\">{{ registry.Name }}</a>\\n </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\">\\n <!-- name-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"registry_name\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Name</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"registry_name\\\" ng-model=\\\"registry.Name\\\" placeholder=\\\"e.g. my-registry\\\" />\\n </div>\\n </div>\\n <!-- !name-input -->\\n <!-- registry-url-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"registry_url\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Registry URL\\n <portainer-tooltip\\n position=\\\"bottom\\\"\\n message=\\\"URL or IP address of a Docker registry. Any protocol or trailing slash will be stripped if present.\\\"\\n ></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"registry_url\\\" ng-model=\\\"registry.URL\\\" placeholder=\\\"e.g. 10.0.0.10:5000 or myregistry.domain.tld\\\" />\\n </div>\\n </div>\\n <!-- !registry-url-input -->\\n\\n <!-- authentication-checkbox -->\\n <div class=\\\"form-group\\\" ng-if=\\\"registry.Type !== RegistryTypes.PROGET\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label for=\\\"registry_auth\\\" class=\\\"control-label text-left\\\">\\n Authentication\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"Enable this option if you need to specify credentials to connect to this registry.\\\"></portainer-tooltip>\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\"> <input type=\\\"checkbox\\\" ng-model=\\\"registry.Authentication\\\" /><i></i> </label>\\n </div>\\n </div>\\n <!-- !authentication-checkbox -->\\n\\n <!-- authentication-credentials -->\\n <div ng-if=\\\"registry.Authentication\\\">\\n <!-- credentials-user -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"credentials_username\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n {{ registry.Type === RegistryTypes.ECR ? 'AWS Access Key' : 'Username' }}\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"credentials_username\\\" ng-model=\\\"registry.Username\\\" />\\n </div>\\n </div>\\n <!-- !credentials-user -->\\n <!-- credentials-password -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"credentials_password\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n {{ registry.Type === RegistryTypes.ECR ? 'AWS Secret Access Key' : 'Password' }}\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"password\\\" class=\\\"form-control\\\" id=\\\"credentials_password\\\" ng-model=\\\"formValues.Password\\\" placeholder=\\\"*******\\\" />\\n </div>\\n </div>\\n <!-- !credentials-password -->\\n </div>\\n <!-- !authentication-credentials -->\\n\\n <div ng-if=\\\"registry.Type == RegistryTypes.QUAY\\\">\\n <!-- organisation-checkbox -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label class=\\\"control-label text-left\\\">\\n Use organisation registry\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\"> <input type=\\\"checkbox\\\" ng-model=\\\"registry.Quay.UseOrganisation\\\" /><i></i> </label>\\n </div>\\n </div>\\n <!-- !organisation-checkbox -->\\n <div ng-if=\\\"registry.Quay.UseOrganisation\\\">\\n <!-- organisation_name -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"organisation_name\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Organisation name</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"organisation_name\\\" name=\\\"organisation_name\\\" ng-model=\\\"registry.Quay.OrganisationName\\\" required />\\n </div>\\n </div>\\n <!-- !organisation_name -->\\n </div>\\n </div>\\n\\n <div ng-if=\\\"registry.Type == RegistryTypes.ECR\\\">\\n <!-- region -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"registry_region\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Region</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"registry_region\\\" name=\\\"registry_region\\\" placeholder=\\\"us-west-1\\\" ng-model=\\\"registry.Ecr.Region\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"registryFormEcr.registry_region.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"registryFormEcr.registry_region.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !region -->\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"state.actionInProgress || !registry.Name || !registry.URL || (registry.Type == RegistryTypes.QUAY && registry.Quay.UseOrganisation && !registry.Quay.OrganisationName)\\\"\\n ng-click=\\\"updateRegistry()\\\"\\n button-spinner=\\\"state.actionInProgress\\\"\\n >\\n <span ng-hide=\\\"state.actionInProgress\\\">Update registry</span>\\n <span ng-show=\\\"state.actionInProgress\\\">Updating registry...</span>\\n </button>\\n <a type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ui-sref=\\\"portainer.registries\\\">Cancel</a>\\n </div>\\n </div>\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/views/settings/settings.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Settings\\\"></rd-header-title>\\n <rd-header-content>Settings</rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-cogs\\\" title-text=\\\"Application settings\\\"></rd-widget-header>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\">\\n <!-- snapshot-interval -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"snapshot_interval\\\" class=\\\"col-sm-2 control-label text-left\\\">Snapshot interval</label>\\n <div class=\\\"col-sm-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"settings.SnapshotInterval\\\" id=\\\"snapshot_interval\\\" placeholder=\\\"e.g. 15m\\\" />\\n </div>\\n </div>\\n <!-- !snapshot-interval -->\\n <!-- logo -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label for=\\\"toggle_logo\\\" class=\\\"control-label text-left\\\">\\n Use custom logo\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\"> <input type=\\\"checkbox\\\" name=\\\"toggle_logo\\\" ng-model=\\\"formValues.customLogo\\\" /><i></i> </label>\\n </div>\\n </div>\\n <div ng-if=\\\"formValues.customLogo\\\">\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n You can specify the URL to your logo here. For an optimal display, logo dimensions should be 155px by 55px.\\n </span>\\n </div>\\n <div class=\\\"form-group\\\">\\n <label for=\\\"logo_url\\\" class=\\\"col-sm-1 control-label text-left\\\">\\n URL\\n </label>\\n <div class=\\\"col-sm-11\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"settings.LogoURL\\\" id=\\\"logo_url\\\" placeholder=\\\"https://mycompany.com/logo.png\\\" />\\n </div>\\n </div>\\n </div>\\n <!-- !logo -->\\n <!-- analytics -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label for=\\\"toggle_enableTelemetry\\\" class=\\\"control-label text-left\\\">\\n Allow the collection of anonymous statistics\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\"> <input type=\\\"checkbox\\\" name=\\\"toggle_enableTelemetry\\\" ng-model=\\\"formValues.enableTelemetry\\\" /><i></i> </label>\\n </div>\\n <div class=\\\"col-sm-12 text-muted small\\\" style=\\\"margin-top: 10px;\\\">\\n You can find more information about this in our\\n <a href=\\\"https://www.portainer.io/documentation/in-app-analytics-and-privacy-policy/\\\" target=\\\"_blank\\\">privacy policy</a>.\\n </div>\\n </div>\\n <!-- !analytics -->\\n <!-- templates -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n App Templates\\n </div>\\n <div>\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n You can specify the URL to your own template definitions file here. See\\n <a href=\\\"https://documentation.portainer.io/v2.0/settings/apps/#build-and-host-your-own-templates\\\" target=\\\"_blank\\\">Portainer documentation</a> for more details.\\n </span>\\n </div>\\n <div class=\\\"form-group\\\">\\n <label for=\\\"templates_url\\\" class=\\\"col-sm-1 control-label text-left\\\">\\n URL\\n </label>\\n <div class=\\\"col-sm-11\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"settings.TemplatesURL\\\"\\n id=\\\"templates_url\\\"\\n placeholder=\\\"https://myserver.mydomain/templates.json\\\"\\n required\\n data-cy=\\\"settings-templateUrl\\\"\\n />\\n </div>\\n </div>\\n </div>\\n <!-- !templates -->\\n <!-- helm charts -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Helm Repository\\n </div>\\n <div>\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n You can specify the URL to your own helm repository here. See the\\n <a href=\\\"https://helm.sh/docs/topics/chart_repository/\\\" target=\\\"_blank\\\">official documentation</a> for more details.\\n </span>\\n </div>\\n <div class=\\\"form-group\\\">\\n <label for=\\\"helmrepository_url\\\" class=\\\"col-sm-1 control-label text-left\\\">\\n URL\\n </label>\\n <div class=\\\"col-sm-11\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"settings.HelmRepositoryURL\\\" id=\\\"helmrepository_url\\\" placeholder=\\\"https://charts.bitnami.com/bitnami\\\" required />\\n </div>\\n </div>\\n </div>\\n <!-- !helm charts -->\\n <!-- host-filesystem -->\\n\\n <!-- edge -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Edge Compute\\n </div>\\n <div class=\\\"form-group\\\">\\n <label for=\\\"edge_checkin\\\" class=\\\"col-sm-2 control-label text-left\\\">\\n Edge agent default poll frequency\\n <portainer-tooltip\\n position=\\\"bottom\\\"\\n message=\\\"Interval used by default by each Edge agent to check in with the Portainer instance. Affects Edge environment management and Edge compute features.\\\"\\n ></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-10\\\">\\n <select\\n id=\\\"edge_checkin\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"settings.EdgeAgentCheckinInterval\\\"\\n ng-options=\\\"+(opt.value) as opt.key for opt in state.availableEdgeAgentCheckinOptions\\\"\\n data-cy=\\\"settings-pollFrequencySelect\\\"\\n ></select>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label for=\\\"toggle_enableEdgeComputeFeatures\\\" class=\\\"control-label text-left\\\">\\n Enable edge compute features\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\" data-cy=\\\"settings-edgeToggle\\\">\\n <input type=\\\"checkbox\\\" name=\\\"toggle_enableEdgeComputeFeatures\\\" ng-model=\\\"formValues.enableEdgeComputeFeatures\\\" /><i></i>\\n </label>\\n </div>\\n </div>\\n <!-- !edge -->\\n <!-- kube -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Kubernetes\\n </div>\\n <div class=\\\"form-group\\\">\\n <label for=\\\"edge_checkin\\\" class=\\\"col-sm-2 control-label text-left\\\">\\n Kubeconfig expiry\\n </label>\\n <div class=\\\"col-sm-10\\\">\\n <select\\n id=\\\"kubeconfig_expiry\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"settings.KubeconfigExpiry\\\"\\n ng-options=\\\"opt.value as opt.key for opt in state.availableKubeconfigExpiryOptions\\\"\\n ></select>\\n </div>\\n </div>\\n <!-- ! kube -->\\n <!-- actions -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-click=\\\"saveApplicationSettings()\\\"\\n ng-disabled=\\\"state.actionInProgress || !settings.TemplatesURL\\\"\\n button-spinner=\\\"state.actionInProgress\\\"\\n data-cy=\\\"settings-saveSettingsButton\\\"\\n >\\n <span ng-hide=\\\"state.actionInProgress\\\">Save settings</span>\\n <span ng-show=\\\"state.actionInProgress\\\">Saving...</span>\\n </button>\\n </div>\\n </div>\\n <!-- !actions -->\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\\n<ssl-certificate-settings></ssl-certificate-settings>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-tags\\\" title-text=\\\"Hidden containers\\\"></rd-widget-header>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\" ng-submit=\\\"addFilteredContainerLabel()\\\" name=\\\"addTagForm\\\">\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n You can hide containers with specific labels from Portainer UI. You need to specify the label name and value.\\n </span>\\n </div>\\n <div class=\\\"form-group\\\">\\n <label for=\\\"header_name\\\" class=\\\"col-sm-1 control-label text-left\\\">Name</label>\\n <div class=\\\"col-sm-11 col-md-4\\\">\\n <input type=\\\"text\\\" required class=\\\"form-control\\\" id=\\\"header_name\\\" name=\\\"label_name\\\" ng-model=\\\"formValues.labelName\\\" placeholder=\\\"e.g. com.example.foo\\\" />\\n </div>\\n <label for=\\\"header_value\\\" class=\\\"col-sm-1 margin-sm-top control-label text-left\\\">Value</label>\\n <div class=\\\"col-sm-11 col-md-4 margin-sm-top\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"header_value\\\" ng-model=\\\"formValues.labelValue\\\" placeholder=\\\"e.g. bar\\\" />\\n </div>\\n <div class=\\\"col-sm-12 col-md-2 margin-sm-top\\\">\\n <button type=\\\"submit\\\" class=\\\"btn btn-primary btn-sm\\\" ng-disabled=\\\"!formValues.labelName\\\"><i class=\\\"fa fa-plus space-right\\\" aria-hidden=\\\"true\\\"></i>Add filter</button>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12 table-responsive\\\">\\n <table class=\\\"table table-hover\\\">\\n <thead>\\n <tr>\\n <th>Name</th>\\n <th>Value</th>\\n <th></th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr ng-repeat=\\\"label in settings.BlackListedLabels\\\">\\n <td>{{ label.name }}</td>\\n <td>{{ label.value }}</td>\\n <td\\n ><button type=\\\"button\\\" class=\\\"btn btn-danger btn-xs\\\" ng-click=\\\"removeFilteredContainerLabel($index)\\\"\\n ><i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Remove</button\\n ></td\\n >\\n </tr>\\n <tr ng-if=\\\"settings.BlackListedLabels.length === 0\\\">\\n <td colspan=\\\"3\\\" class=\\\"text-center text-muted\\\">No filter available.</td>\\n </tr>\\n <tr ng-if=\\\"!settings.BlackListedLabels\\\">\\n <td colspan=\\\"3\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n </div>\\n <!-- !filtered-labels -->\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-download\\\" title-text=\\\"Backup Portainer\\\"></rd-widget-header>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\" ng-submit=\\\"backupPortainer()\\\" name=\\\"backupPortainerForm\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Backup configuration\\n </div>\\n <box-selector options=\\\"backupOptions\\\" ng-model=\\\"formValues.backupFormType\\\" on-change=\\\"(onBackupOptionsChange)\\\"></box-selector>\\n <div ng-if=\\\"formValues.backupFormType === BACKUP_FORM_TYPES.S3\\\">\\n <!-- Schedule automatic backups -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <por-switch-field\\n label=\\\"Schedule automatic backups\\\"\\n name=\\\"s3-backup-setting\\\"\\n feature=\\\"s3BackupFeatureId\\\"\\n ng-model=\\\"formValues.scheduleAutomaticBackups\\\"\\n label-class=\\\"col-sm-2\\\"\\n ></por-switch-field>\\n </div>\\n </div>\\n <!-- !Schedule automatic backups -->\\n <!-- Cron rule -->\\n <div class=\\\"form-group\\\" ng-if=\\\"formValues.scheduleAutomaticBackups\\\">\\n <label for=\\\"cron_rule\\\" class=\\\"col-sm-2 col-lg-2 control-label text-left\\\">Cron rule</label>\\n <div class=\\\"col-sm-10 col-lg-10\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n placeholder=\\\"0 2 * * *\\\"\\n id=\\\"cron_rule\\\"\\n name=\\\"cron_rule\\\"\\n ng-model=\\\"formValues.cronRule\\\"\\n limited-feature-dir=\\\"{{::s3BackupFeatureId}}\\\"\\n limited-feature-disabled\\n limited-feature-class=\\\"limited-be\\\"\\n required\\n cronRule\\n />\\n </div>\\n </div>\\n <!-- !Cron rule -->\\n <!-- Access key id -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"access_key_id\\\" class=\\\"col-sm-2 col-lg-2 control-label text-left\\\">Access Key ID</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n id=\\\"access_key_id\\\"\\n name=\\\"access_key_id\\\"\\n ng-model=\\\"formValues.accessKeyId\\\"\\n ng-required=\\\"formValues.scheduleAutomaticBackups\\\"\\n limited-feature-dir=\\\"{{::s3BackupFeatureId}}\\\"\\n limited-feature-disabled\\n limited-feature-class=\\\"limited-be\\\"\\n />\\n </div>\\n </div>\\n <!-- !Access key id -->\\n <!-- Secret access key -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"secret_access_key\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Secret Access Key</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input\\n type=\\\"password\\\"\\n class=\\\"form-control\\\"\\n id=\\\"secret_access_key\\\"\\n name=\\\"secret_access_key\\\"\\n ng-model=\\\"formValues.secretAccessKey\\\"\\n ng-required=\\\"formValues.scheduleAutomaticBackups\\\"\\n limited-feature-dir=\\\"{{::s3BackupFeatureId}}\\\"\\n limited-feature-disabled\\n limited-feature-class=\\\"limited-be\\\"\\n />\\n </div>\\n </div>\\n <!-- !Secret access key -->\\n <!-- Region -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"region\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Region</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n placeholder=\\\"us-west-1\\\"\\n id=\\\"region\\\"\\n name=\\\"region\\\"\\n ng-model=\\\"formValues.region\\\"\\n ng-required=\\\"formValues.scheduleAutomaticBackups\\\"\\n limited-feature-dir=\\\"{{::s3BackupFeatureId}}\\\"\\n limited-feature-disabled\\n limited-feature-class=\\\"limited-be\\\"\\n />\\n </div>\\n </div>\\n <!-- !Region -->\\n <!-- Bucket name -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"bucket_name\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Bucket name</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n id=\\\"bucket_name\\\"\\n name=\\\"bucket_name\\\"\\n ng-model=\\\"formValues.bucketName\\\"\\n ng-required=\\\"formValues.scheduleAutomaticBackups\\\"\\n limited-feature-dir=\\\"{{::s3BackupFeatureId}}\\\"\\n limited-feature-disabled\\n limited-feature-class=\\\"limited-be\\\"\\n />\\n </div>\\n </div>\\n <!-- !Bucket name -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Security settings\\n </div>\\n <!-- Password protect S3 -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"password_protect\\\" class=\\\"col-sm-1 control-label text-left\\\">Password protect</label>\\n <div class=\\\"col-sm-1\\\">\\n <label class=\\\"switch\\\">\\n <input type=\\\"checkbox\\\" id=\\\"password_protect_s3\\\" name=\\\"password_protect_s3\\\" ng-model=\\\"formValues.passwordProtectS3\\\" disabled /><i></i>\\n </label>\\n </div>\\n </div>\\n <!-- !Password protect S3 -->\\n <!-- Password S3 -->\\n <div class=\\\"form-group\\\" ng-if=\\\"formValues.passwordProtectS3\\\">\\n <label for=\\\"password\\\" class=\\\"col-sm-1 control-label text-left\\\">Password</label>\\n <div class=\\\"col-sm-3\\\">\\n <input type=\\\"password\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.passwordS3\\\" id=\\\"password_S3\\\" name=\\\"password_S3\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group col-md-12\\\" ng-show=\\\"backupPortainerForm.password_S3.$invalid\\\">\\n <div class=\\\"small text-warning\\\">\\n <div ng-messages=\\\"backupPortainerForm.password_S3.$error\\\">\\n <p ng-message=\\\"required\\\"> <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !Password S3 -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"backupPortainerForm.$invalid\\\"\\n ng-click=\\\"exportBackup()\\\"\\n limited-feature-dir=\\\"{{::s3BackupFeatureId}}\\\"\\n limited-feature-disabled\\n limited-feature-class=\\\"limited-be\\\"\\n >\\n <span><i class=\\\"fa fa-upload\\\" aria-hidden=\\\"true\\\"></i> Export backup</span>\\n </button>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\">\\n <hr />\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"submit\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"backupPortainerForm.$invalid ||state.backupInProgress\\\"\\n ng-click=\\\"saveS3BackupSettings()\\\"\\n limited-feature-dir=\\\"{{::s3BackupFeatureId}}\\\"\\n limited-feature-disabled\\n limited-feature-class=\\\"limited-be\\\"\\n >\\n <span>Save backup settings</span>\\n </button>\\n </div>\\n </div>\\n </div>\\n <div ng-if=\\\"formValues.backupFormType === BACKUP_FORM_TYPES.FILE\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Security settings\\n </div>\\n <!-- Password protect -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"password_protect\\\" class=\\\"col-sm-1 control-label text-left\\\">Password protect</label>\\n <div class=\\\"col-sm-1\\\">\\n <label class=\\\"switch\\\"> <input type=\\\"checkbox\\\" id=\\\"password_protect\\\" name=\\\"password_protect\\\" ng-model=\\\"formValues.passwordProtect\\\" /><i></i> </label>\\n </div>\\n </div>\\n <!-- !Password protect -->\\n\\n <!-- Password -->\\n <div class=\\\"form-group\\\" ng-if=\\\"formValues.passwordProtect\\\">\\n <label for=\\\"password\\\" class=\\\"col-sm-1 control-label text-left\\\">Password</label>\\n <div class=\\\"col-sm-3\\\">\\n <input type=\\\"password\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.password\\\" id=\\\"password\\\" name=\\\"password\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group col-md-12\\\" ng-show=\\\"backupPortainerForm.password.$invalid\\\">\\n <div class=\\\"small text-warning\\\">\\n <div ng-messages=\\\"backupPortainerForm.password.$error\\\">\\n <p ng-message=\\\"required\\\"> <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !Password -->\\n\\n <!-- actions -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-click=\\\"downloadBackup()\\\"\\n ng-disabled=\\\"backupPortainerForm.$invalid || state.backupInProgress || state.featureLimited\\\"\\n button-spinner=\\\"state.backupInProgress\\\"\\n >\\n <span ng-hide=\\\"state.backupInProgress\\\">Download backup</span>\\n <span ng-show=\\\"state.backupInProgress\\\">Downloading backup</span>\\n </button>\\n </div>\\n </div>\\n </div>\\n <!-- !actions -->\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/views/settings/authentication/settingsAuthentication.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Authentication settings\\\"></rd-header-title>\\n <rd-header-content> <a ui-sref=\\\"portainer.settings\\\">Settings</a> > Authentication </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-users\\\" title-text=\\\"Authentication\\\"></rd-widget-header>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\" name=\\\"authSettingsForm\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Configuration\\n </div>\\n <div class=\\\"form-group\\\">\\n <label for=\\\"user_timeout\\\" class=\\\"col-sm-2 control-label text-left\\\">\\n Session lifetime\\n <portainer-tooltip message=\\\"Time before users are forced to relogin.\\\"></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-10\\\">\\n <select\\n id=\\\"user_timeout\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"settings.UserSessionTimeout\\\"\\n ng-options=\\\"opt.value as opt.key for opt in state.availableUserSessionTimeoutOptions\\\"\\n ></select>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n Changing from default is only recommended if you have additional layers of authentication in front of Portainer.\\n </span>\\n </div>\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Authentication method\\n </div>\\n\\n <box-selector radio-name=\\\"authOptions\\\" ng-model=\\\"authMethod\\\" options=\\\"authOptions\\\" on-change=\\\"(onChangeAuthMethod)\\\"></box-selector>\\n\\n <internal-auth ng-if=\\\"authenticationMethodSelected(1)\\\" on-save-settings=\\\"(saveSettings)\\\" save-button-state=\\\"state.actionInProgress\\\"></internal-auth>\\n\\n <ldap-settings\\n ng-if=\\\"authenticationMethodSelected(2)\\\"\\n settings=\\\"formValues.ldap.ldapSettings\\\"\\n tlsca-cert=\\\"formValues.TLSCACert\\\"\\n state=\\\"state\\\"\\n connectivity-check=\\\"LDAPConnectivityCheck\\\"\\n on-save-settings=\\\"(saveSettings)\\\"\\n save-button-state=\\\"state.actionInProgress\\\"\\n is-ldap-form-valid=\\\"isLDAPFormValid\\\"\\n ></ldap-settings>\\n\\n <ad-settings\\n ng-if=\\\"authenticationMethodSelected(4)\\\"\\n settings=\\\"formValues.ldap.adSettings\\\"\\n tlsca-cert=\\\"formValues.TLSCACert\\\"\\n state=\\\"state\\\"\\n connectivity-check=\\\"LDAPConnectivityCheck\\\"\\n on-save-settings=\\\"(saveSettings)\\\"\\n save-button-state=\\\"state.actionInProgress\\\"\\n is-ldap-form-valid=\\\"isLDAPFormValid()\\\"\\n ></ad-settings>\\n\\n <oauth-settings\\n ng-if=\\\"authenticationMethodSelected(3)\\\"\\n settings=\\\"OAuthSettings\\\"\\n teams=\\\"teams\\\"\\n on-save-settings=\\\"(saveSettings)\\\"\\n save-button-state=\\\"state.actionInProgress\\\"\\n ></oauth-settings>\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/views/tags/tags.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Tags\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"Refresh\\\" ui-sref=\\\"portainer.tags\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content>Tag management</rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-plus\\\" title-text=\\\"Add a new tag\\\"> </rd-widget-header>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\" name=\\\"tagCreationForm\\\" ng-submit=\\\"createTag()\\\">\\n <!-- name-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"name\\\" class=\\\"col-sm-2 control-label text-left\\\">\\n Name\\n </label>\\n <div class=\\\"col-sm-10\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n name=\\\"name\\\"\\n ng-model=\\\"formValues.Name\\\"\\n ng-change=\\\"checkNameValidity(tagCreationForm)\\\"\\n placeholder=\\\"org/acme\\\"\\n required\\n auto-focus\\n />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"tagCreationForm.name.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"tagCreationForm.name.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n <p ng-message=\\\"validName\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This tag already exists.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !name-input -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"state.actionInProgress || !tagCreationForm.$valid\\\"\\n ng-click=\\\"createTag()\\\"\\n button-spinner=\\\"state.actionInProgress\\\"\\n >\\n <span ng-hide=\\\"state.actionInProgress\\\"><i class=\\\"fa fa-plus\\\" aria-hidden=\\\"true\\\"></i> Create tag</span>\\n <span ng-show=\\\"state.actionInProgress\\\">Creating tag...</span>\\n </button>\\n </div>\\n </div>\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <tags-datatable title-text=\\\"Tags\\\" title-icon=\\\"fa-tags\\\" dataset=\\\"tags\\\" table-key=\\\"tags\\\" order-by=\\\"Name\\\" remove-action=\\\"removeAction\\\"></tags-datatable>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/views/users/users.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Users\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"Refresh\\\" ui-sref=\\\"portainer.users\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content>User management</rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-plus\\\" title-text=\\\"Add a new user\\\"> </rd-widget-header>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\">\\n <!-- name-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"username\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Username\\n <portainer-tooltip\\n ng-if=\\\"AuthenticationMethod === 2\\\"\\n position=\\\"bottom\\\"\\n message=\\\"Username must exactly match username defined in external LDAP source.\\\"\\n ></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-8\\\">\\n <div class=\\\"input-group\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n id=\\\"username\\\"\\n ng-model=\\\"formValues.Username\\\"\\n ng-change=\\\"checkUsernameValidity()\\\"\\n placeholder=\\\"e.g. jdoe\\\"\\n auto-focus\\n data-cy=\\\"user-usernameInput\\\"\\n />\\n <span class=\\\"input-group-addon\\\"><i ng-class=\\\"{ true: 'fa fa-check green-icon', false: 'fa fa-times red-icon' }[state.validUsername]\\\" aria-hidden=\\\"true\\\"></i></span>\\n </div>\\n </div>\\n </div>\\n <!-- !name-input -->\\n <!-- new-password-input -->\\n <div class=\\\"form-group\\\" ng-if=\\\"AuthenticationMethod === 1\\\">\\n <label for=\\\"password\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Password</label>\\n <div class=\\\"col-sm-8\\\">\\n <div class=\\\"input-group\\\">\\n <span class=\\\"input-group-addon\\\"><i class=\\\"fa fa-lock\\\" aria-hidden=\\\"true\\\"></i></span>\\n <input type=\\\"password\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.Password\\\" id=\\\"password\\\" data-cy=\\\"user-passwordInput\\\" />\\n </div>\\n </div>\\n </div>\\n <!-- !new-password-input -->\\n <!-- confirm-password-input -->\\n <div class=\\\"form-group\\\" ng-if=\\\"AuthenticationMethod === 1\\\">\\n <label for=\\\"confirm_password\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Confirm password</label>\\n <div class=\\\"col-sm-8\\\">\\n <div class=\\\"input-group\\\">\\n <span class=\\\"input-group-addon\\\"><i class=\\\"fa fa-lock\\\" aria-hidden=\\\"true\\\"></i></span>\\n <input type=\\\"password\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.ConfirmPassword\\\" id=\\\"confirm_password\\\" data-cy=\\\"user-passwordConfirmInput\\\" />\\n <span class=\\\"input-group-addon\\\"\\n ><i\\n ng-class=\\\"{ true: 'fa fa-check green-icon', false: 'fa fa-times red-icon' }[formValues.Password !== '' && formValues.Password === formValues.ConfirmPassword]\\\"\\n aria-hidden=\\\"true\\\"\\n ></i\\n ></span>\\n </div>\\n </div>\\n </div>\\n <!-- !confirm-password-input -->\\n <!-- admin-checkbox -->\\n <div class=\\\"form-group\\\" ng-if=\\\"isAdmin\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label for=\\\"permissions\\\" class=\\\"control-label text-left\\\">\\n Administrator\\n <portainer-tooltip\\n position=\\\"bottom\\\"\\n message=\\\"Administrators have access to Portainer settings management as well as full control over all defined environments and their resources.\\\"\\n ></portainer-tooltip>\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\"> <input type=\\\"checkbox\\\" ng-model=\\\"formValues.Administrator\\\" data-cy=\\\"user-adminCheckbox\\\" /><i></i> </label>\\n </div>\\n </div>\\n <!-- !admin-checkbox -->\\n <!-- teams -->\\n <div class=\\\"form-group\\\" ng-if=\\\"!formValues.Administrator\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label class=\\\"control-label text-left\\\">\\n Add to team(s)\\n </label>\\n <span class=\\\"small text-muted\\\" style=\\\"margin-left: 20px;\\\" ng-if=\\\"teams.length === 0\\\">\\n You don't seem to have any teams to add users into. Head over to the <a ui-sref=\\\"portainer.teams\\\">Teams view</a> to create some.\\n </span>\\n <span\\n isteven-multi-select\\n ng-if=\\\"teams.length > 0\\\"\\n input-model=\\\"teams\\\"\\n output-model=\\\"formValues.Teams\\\"\\n button-label=\\\"Name\\\"\\n item-label=\\\"Name\\\"\\n tick-property=\\\"ticked\\\"\\n helper-elements=\\\"filter\\\"\\n search-property=\\\"Name\\\"\\n translation=\\\"{nothingSelected: 'Select one or more teams', search: 'Search...'}\\\"\\n style=\\\"margin-left: 20px;\\\"\\n data-cy=\\\"user-teamSelect\\\"\\n >\\n </span>\\n </div>\\n </div>\\n <!-- !teams -->\\n <div class=\\\"form-group\\\" ng-if=\\\"isAdmin && !formValues.Administrator && formValues.Teams.length === 0\\\">\\n <div class=\\\"col-sm-12\\\">\\n <span class=\\\"small text-muted\\\">\\n Note: non-administrator users who aren't in a team don't have access to any environments by default. Head over to the\\n <a ui-sref=\\\"portainer.endpoints\\\">Environments view</a> to manage their accesses.\\n </span>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"state.actionInProgress || !state.validUsername || formValues.Username === '' || (AuthenticationMethod === 1 && formValues.Password === '') || (AuthenticationMethod === 1 && formValues.Password !== formValues.ConfirmPassword)\\\"\\n ng-click=\\\"addUser()\\\"\\n button-spinner=\\\"state.actionInProgress\\\"\\n data-cy=\\\"user-createUserButton\\\"\\n >\\n <span ng-hide=\\\"state.actionInProgress\\\"><i class=\\\"fa fa-plus\\\" aria-hidden=\\\"true\\\"></i> Create user</span>\\n <span ng-show=\\\"state.actionInProgress\\\">Creating user...</span>\\n </button>\\n <span class=\\\"text-danger\\\" ng-if=\\\"state.userCreationError\\\" style=\\\"margin: 5px;\\\">\\n <i class=\\\"fa fa-exclamation-circle\\\" aria-hidden=\\\"true\\\"></i> {{ state.userCreationError }}\\n </span>\\n </div>\\n </div>\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <users-datatable\\n title-text=\\\"Users\\\"\\n title-icon=\\\"fa-user\\\"\\n dataset=\\\"users\\\"\\n table-key=\\\"users\\\"\\n order-by=\\\"Username\\\"\\n authentication-method=\\\"AuthenticationMethod\\\"\\n remove-action=\\\"removeAction\\\"\\n ></users-datatable>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/views/users/edit/user.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"User details\\\"></rd-header-title>\\n <rd-header-content>\\n <a ui-sref=\\\"portainer.users\\\">Users</a> > <a ui-sref=\\\"portainer.users.user({id: user.Id})\\\">{{ formValues.username }}</a>\\n </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-user\\\" title-text=\\\"User details\\\"></rd-widget-header>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\" style=\\\"margin-top: 15px;\\\">\\n <div class=\\\"form-group\\\">\\n <label for=\\\"username_field\\\" class=\\\"col-sm-2 control-label text-left\\\">Username</label>\\n <div class=\\\"col-sm-8\\\">\\n <input class=\\\"form-control\\\" ng-model=\\\"formValues.username\\\" id=\\\"username_field\\\" />\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\" ng-if=\\\"isAdmin\\\">\\n <div class=\\\"col-sm-4\\\">\\n <label for=\\\"permissions\\\" class=\\\"control-label text-left\\\">\\n Administrator\\n <portainer-tooltip\\n position=\\\"bottom\\\"\\n message=\\\"Administrators have access to Portainer settings management as well as full control over all defined environments and their resources.\\\"\\n ></portainer-tooltip>\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\"> <input type=\\\"checkbox\\\" ng-model=\\\"formValues.Administrator\\\" /><i></i> </label>\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-4\\\">\\n <button class=\\\"btn btn-primary btn-sm\\\" ng-disabled=\\\"!isSubmitEnabled()\\\" ng-click=\\\"updateUser()\\\">Save</button>\\n <button class=\\\"btn btn-danger btn-sm\\\" ng-disabled=\\\"isDeleteDisabled()\\\" ng-click=\\\"deleteUser()\\\"\\n ><i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Delete this user</button\\n >\\n </div>\\n </div>\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\\n<div class=\\\"row\\\" ng-if=\\\"AuthenticationMethod === 1\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-lock\\\" title-text=\\\"Change user password\\\"></rd-widget-header>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\" style=\\\"margin-top: 15px;\\\">\\n <!-- new-password-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"new_password\\\" class=\\\"col-sm-2 control-label text-left\\\">New password</label>\\n <div class=\\\"col-sm-8\\\">\\n <div class=\\\"input-group\\\">\\n <span class=\\\"input-group-addon\\\"><i class=\\\"fa fa-lock\\\" aria-hidden=\\\"true\\\"></i></span>\\n <input type=\\\"password\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.newPassword\\\" id=\\\"new_password\\\" />\\n </div>\\n </div>\\n </div>\\n <!-- !new-password-input -->\\n <!-- confirm-password-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"confirm_password\\\" class=\\\"col-sm-2 control-label text-left\\\">Confirm password</label>\\n <div class=\\\"col-sm-8\\\">\\n <div class=\\\"input-group\\\">\\n <span class=\\\"input-group-addon\\\"><i class=\\\"fa fa-lock\\\" aria-hidden=\\\"true\\\"></i></span>\\n <input type=\\\"password\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.confirmPassword\\\" id=\\\"confirm_password\\\" />\\n <span class=\\\"input-group-addon\\\"\\n ><i\\n ng-class=\\\"\\n { true: 'fa fa-check green-icon', false: 'fa fa-times red-icon' }[formValues.newPassword !== '' && formValues.newPassword === formValues.confirmPassword]\\n \\\"\\n aria-hidden=\\\"true\\\"\\n ></i\\n ></span>\\n </div>\\n </div>\\n </div>\\n <!-- !confirm-password-input -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-2\\\">\\n <button\\n type=\\\"submit\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"formValues.newPassword === '' || formValues.newPassword !== formValues.confirmPassword\\\"\\n ng-click=\\\"updatePassword()\\\"\\n >Update password</button\\n >\\n </div>\\n </div>\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/views/teams/teams.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Teams\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"Refresh\\\" ui-sref=\\\"portainer.teams\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content>Teams management</rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\" ng-if=\\\"isAdmin\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-plus\\\" title-text=\\\"Add a new team\\\"> </rd-widget-header>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\" name=\\\"teamCreationForm\\\" ng-submit=\\\"addTeam()\\\">\\n <!-- name-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"team_name\\\" class=\\\"col-sm-2 control-label text-left\\\">Name</label>\\n <div class=\\\"col-sm-10\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n id=\\\"team_name\\\"\\n name=\\\"team_name\\\"\\n ng-model=\\\"formValues.Name\\\"\\n ng-change=\\\"checkNameValidity(teamCreationForm)\\\"\\n placeholder=\\\"e.g. development\\\"\\n auto-focus\\n required\\n data-cy=\\\"team-teamNameInput\\\"\\n />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"teamCreationForm.team_name.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"teamCreationForm.team_name.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n <p ng-message=\\\"validName\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This team already exists.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !name-input -->\\n <!-- team-leaders -->\\n <div class=\\\"form-group\\\" ng-if=\\\"users.length > 0\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label class=\\\"control-label text-left\\\">\\n Select team leader(s)\\n <portainer-tooltip\\n position=\\\"bottom\\\"\\n message=\\\"You can assign one or more leaders to this team. Team leaders can manage their teams users and resources.\\\"\\n ></portainer-tooltip>\\n </label>\\n <span\\n isteven-multi-select\\n ng-if=\\\"users.length > 0\\\"\\n input-model=\\\"users\\\"\\n output-model=\\\"formValues.Leaders\\\"\\n button-label=\\\"Username\\\"\\n item-label=\\\"Username\\\"\\n tick-property=\\\"ticked\\\"\\n helper-elements=\\\"filter\\\"\\n search-property=\\\"Username\\\"\\n translation=\\\"{nothingSelected: 'Select one or more team leaders', search: 'Search...'}\\\"\\n style=\\\"margin-left: 20px;\\\"\\n data-cy=\\\"team-teamLeaderSelect\\\"\\n >\\n </span>\\n </div>\\n </div>\\n <!-- !team-leaders -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"state.actionInProgress || !teamCreationForm.$valid\\\"\\n ng-click=\\\"addTeam()\\\"\\n button-spinner=\\\"state.actionInProgress\\\"\\n data-cy=\\\"team-createTeamButton\\\"\\n >\\n <span ng-hide=\\\"state.actionInProgress\\\"><i class=\\\"fa fa-plus\\\" aria-hidden=\\\"true\\\"></i> Create team</span>\\n <span ng-show=\\\"state.actionInProgress\\\">Creating team...</span>\\n </button>\\n </div>\\n </div>\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <teams-datatable title-text=\\\"Teams\\\" title-icon=\\\"fa-users\\\" dataset=\\\"teams\\\" table-key=\\\"teams\\\" order-by=\\\"Name\\\" remove-action=\\\"removeAction\\\"></teams-datatable>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/views/teams/edit/team.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Team details\\\"></rd-header-title>\\n <rd-header-content>\\n <a ui-sref=\\\"portainer.teams\\\">Teams</a> > <a ui-sref=\\\"portainer.teams.team({id: team.Id})\\\">{{ team.Name }}</a>\\n </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-users\\\" title-text=\\\"Team details\\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr>\\n <td>Name</td>\\n <td>\\n {{ team.Name }}\\n <button class=\\\"btn btn-xs btn-danger\\\" ng-if=\\\"isAdmin\\\" ng-click=\\\"deleteTeam()\\\"\\n ><i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Delete this team</button\\n >\\n </td>\\n </tr>\\n <tr>\\n <td>Leaders</td>\\n <td>{{ leaderCount }}</td>\\n </tr>\\n <tr>\\n <td>Total users in team</td>\\n <td>{{ teamMembers.length }}</td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\\n<div class=\\\"row\\\" ng-if=\\\"team\\\">\\n <div class=\\\"col-sm-6\\\">\\n <rd-widget>\\n <rd-widget-header classes=\\\"col-sm-12 col-md-6 nopadding\\\" icon=\\\"fa-users\\\" title-text=\\\"Users\\\">\\n <div class=\\\"pull-md-right pull-lg-right\\\">\\n Items per page:\\n <select ng-model=\\\"state.pagination_count_users\\\" ng-change=\\\"changePaginationCountUsers()\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </div>\\n </rd-widget-header>\\n <rd-widget-taskbar classes=\\\"col-sm-12 nopadding\\\">\\n <div class=\\\"col-sm-12 col-md-6 nopadding\\\">\\n <button class=\\\"btn btn-primary btn-sm\\\" ng-click=\\\"addAllUsers()\\\" ng-if=\\\"isAdmin\\\" ng-disabled=\\\"users.length === 0 || filteredUsers.length === 0\\\"\\n ><i class=\\\"fa fa-user-plus space-right\\\" aria-hidden=\\\"true\\\"></i>Add all users</button\\n >\\n </div>\\n <div class=\\\"col-sm-12 col-md-6 nopadding\\\">\\n <input type=\\\"text\\\" id=\\\"filter-users\\\" ng-model=\\\"state.filterUsers\\\" placeholder=\\\"Filter...\\\" class=\\\"form-control input-sm\\\" />\\n </div>\\n </rd-widget-taskbar>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover\\\">\\n <thead>\\n <tr>\\n <th>\\n <a ng-click=\\\"orderUsers('Username')\\\">\\n Name\\n <span ng-show=\\\"sortTypeUsers == 'Username' && !sortReverseUsers\\\" class=\\\"glyphicon glyphicon-chevron-down\\\"></span>\\n <span ng-show=\\\"sortTypeUsers == 'Username' && sortReverseUsers\\\" class=\\\"glyphicon glyphicon-chevron-up\\\"></span>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n pagination-id=\\\"table1\\\"\\n dir-paginate=\\\"user in users | filter:state.filterUsers | orderBy:sortTypeUsers:sortReverseUsers | itemsPerPage: state.pagination_count_users\\\"\\n >\\n <td>\\n {{ user.Username }}\\n <span style=\\\"margin-left: 5px;\\\">\\n <a ng-click=\\\"addUser(user)\\\"><i class=\\\"fa fa-plus-circle space-right\\\" aria-hidden=\\\"true\\\"></i>Add</a>\\n </span>\\n </td>\\n </tr>\\n <tr ng-if=\\\"!users\\\">\\n <td colspan=\\\"2\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"users.length === 0 || (users | filter: state.filterUsers).length === 0\\\">\\n <td colspan=\\\"2\\\" class=\\\"text-center text-muted\\\">No users.</td>\\n </tr>\\n </tbody>\\n </table>\\n <div ng-if=\\\"users\\\" class=\\\"pull-left pagination-controls\\\">\\n <dir-pagination-controls pagination-id=\\\"table1\\\"></dir-pagination-controls>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n <div class=\\\"col-sm-6\\\">\\n <rd-widget>\\n <rd-widget-header classes=\\\"col-sm-12 col-md-6 nopadding\\\" icon=\\\"fa-users\\\" title-text=\\\"Team members\\\">\\n <div class=\\\"pull-md-right pull-lg-right\\\">\\n Items per page:\\n <select ng-model=\\\"state.pagination_count_members\\\" ng-change=\\\"changePaginationCountGroupMembers()\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </div>\\n </rd-widget-header>\\n <rd-widget-taskbar classes=\\\"col-sm-12 nopadding\\\">\\n <div class=\\\"col-sm-12 col-md-6 nopadding\\\">\\n <button class=\\\"btn btn-primary btn-sm\\\" ng-click=\\\"removeAllUsers()\\\" ng-if=\\\"isAdmin\\\" ng-disabled=\\\"teamMembers.length === 0 || filteredGroupMembers.length === 0\\\"\\n ><i class=\\\"fa fa-user-times space-right\\\" aria-hidden=\\\"true\\\"></i>Remove all users</button\\n >\\n </div>\\n <div class=\\\"col-sm-12 col-md-6 nopadding\\\">\\n <input type=\\\"text\\\" id=\\\"filter-group\\\" ng-model=\\\"state.filterGroupMembers\\\" placeholder=\\\"Filter...\\\" class=\\\"form-control input-sm\\\" />\\n </div>\\n </rd-widget-taskbar>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover\\\">\\n <thead>\\n <tr>\\n <th>\\n <a ng-click=\\\"orderGroupMembers('Username')\\\">\\n Name\\n <span ng-show=\\\"sortTypeGroupMembers == 'Username' && !sortReverseGroupMembers\\\" class=\\\"glyphicon glyphicon-chevron-down\\\"></span>\\n <span ng-show=\\\"sortTypeGroupMembers == 'Username' && sortReverseGroupMembers\\\" class=\\\"glyphicon glyphicon-chevron-up\\\"></span>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"orderGroupMembers('TeamRole')\\\">\\n Team Role\\n <span ng-show=\\\"sortTypeGroupMembers == 'TeamRole' && !sortReverseGroupMembers\\\" class=\\\"glyphicon glyphicon-chevron-down\\\"></span>\\n <span ng-show=\\\"sortTypeGroupMembers == 'TeamRole' && sortReverseGroupMembers\\\" class=\\\"glyphicon glyphicon-chevron-up\\\"></span>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n pagination-id=\\\"table2\\\"\\n dir-paginate=\\\"user in teamMembers | filter:state.filterGroupMembers | orderBy:sortTypeGroupMembers:sortReverseGroupMembers | itemsPerPage: state.pagination_count_groupMembers\\\"\\n >\\n <td>\\n {{ user.Username }}\\n <span style=\\\"margin-left: 5px;\\\" ng-if=\\\"isAdmin || user.TeamRole === 'Member'\\\">\\n <a ng-click=\\\"removeUser(user)\\\"><i class=\\\"fa fa-minus-circle space-right\\\" aria-hidden=\\\"true\\\"></i>Remove</a>\\n </span>\\n </td>\\n <td>\\n <i ng-if=\\\"user.TeamRole === 'Leader'\\\" class=\\\"fa fa-user-plus\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n <i ng-if=\\\"user.TeamRole === 'Member'\\\" class=\\\"fa fa-user\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n {{ user.TeamRole }}\\n <span style=\\\"margin-left: 5px;\\\" ng-if=\\\"isAdmin\\\">\\n <a style=\\\"margin-left: 5px;\\\" ng-click=\\\"promoteToLeader(user)\\\" ng-if=\\\"user.TeamRole === 'Member'\\\"\\n ><i class=\\\"fa fa-user-plus space-right\\\" aria-hidden=\\\"true\\\"></i>Leader</a\\n >\\n <a style=\\\"margin-left: 5px;\\\" ng-click=\\\"demoteToMember(user)\\\" ng-if=\\\"user.TeamRole === 'Leader'\\\"\\n ><i class=\\\"fa fa-user-times space-right\\\" aria-hidden=\\\"true\\\"></i>Member</a\\n >\\n </span>\\n </td>\\n </tr>\\n <tr ng-if=\\\"!teamMembers\\\">\\n <td colspan=\\\"2\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"teamMembers.length === 0 || (teamMembers | filter: state.filterGroupMembers).length === 0\\\">\\n <td colspan=\\\"2\\\" class=\\\"text-center text-muted\\\">No team members.</td>\\n </tr>\\n </tbody>\\n </table>\\n <div ng-if=\\\"teamMembers\\\" class=\\\"pull-left pagination-controls\\\">\\n <dir-pagination-controls pagination-id=\\\"table2\\\"></dir-pagination-controls>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/rbac/views/roles/roles.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Roles\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"Refresh\\\" ui-sref=\\\"portainer.roles\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content>Role management</rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <roles-datatable title-text=\\\"Roles\\\" title-icon=\\\"fa-file-code\\\" dataset=\\\"$ctrl.roles\\\" table-key=\\\"roles\\\"></roles-datatable>\\n </div>\\n</div>\\n\\n<div class=\\\"row\\\">\\n <access-viewer> </access-viewer>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/rbac/components/access-viewer/access-viewer.html';\nvar html = \"<div class=\\\"col-sm-12\\\" style=\\\"margin-bottom: 0px;\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-user-lock\\\">\\n <header-title>\\n Effective access viewer\\n <be-feature-indicator feature=\\\"$ctrl.limitedFeature\\\" class=\\\"space-left\\\"></be-feature-indicator>\\n </header-title>\\n </rd-widget-header>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n User\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <span class=\\\"small text-muted\\\" ng-if=\\\"$ctrl.users.length === 0\\\">\\n No user available\\n </span>\\n <ui-select ng-if=\\\"$ctrl.users.length > 0\\\" ng-model=\\\"$ctrl.selectedUser\\\" ng-change=\\\"$ctrl.onUserSelect()\\\">\\n <ui-select-match placeholder=\\\"Select a user\\\">\\n <span>{{ $select.selected.Username }}</span>\\n </ui-select-match>\\n <ui-select-choices repeat=\\\"item in ($ctrl.users | filter: $select.search)\\\">\\n <span>{{ item.Username }}</span>\\n </ui-select-choices>\\n </ui-select>\\n </div>\\n </div>\\n\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Access\\n </div>\\n <div>\\n <div class=\\\"small text-muted\\\" style=\\\"margin-bottom: 15px;\\\">\\n <i class=\\\"fa fa-info-circle blue-icon space-right\\\" aria-hidden=\\\"true\\\"></i>\\n Effective role for each environment will be displayed for the selected user\\n </div>\\n </div>\\n <access-viewer-datatable table-key=\\\"access_viewer\\\" dataset=\\\"$ctrl.userRoles\\\" order-by=\\\"EndpointName\\\"> </access-viewer-datatable>\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/rbac/components/access-viewer/access-viewer-datatable/access-viewer-datatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input type=\\\"text\\\" class=\\\"searchInput\\\" ng-model=\\\"$ctrl.state.textFilter\\\" ng-change=\\\"$ctrl.onTextFilterChange()\\\" placeholder=\\\"Search...\\\" ng-model-options=\\\"{ debounce: 300 }\\\" />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('EndpointName')\\\">\\n Environment\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'EndpointName' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'EndpointName' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('RoleName')\\\">\\n Role\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'RoleName' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'RoleName' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>Access origin</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit)) track by $index\\\"\\n >\\n <td>{{ item.EndpointName }}</td>\\n <td>{{ item.RoleName }}</td>\\n <td\\n >{{ item.TeamName ? 'Team' : 'User' }} <code ng-if=\\\"item.TeamName\\\">{{ item.TeamName }}</code> access defined on {{ item.AccessLocation }}\\n <code ng-if=\\\"item.GroupName\\\">{{ item.GroupName }}</code>\\n <a ng-if=\\\"!item.GroupName\\\" ui-sref=\\\"portainer.endpoints.endpoint.access({id: item.EndpointId})\\\"\\n ><i style=\\\"margin-left: 5px;\\\" class=\\\"fa fa-users\\\" aria-hidden=\\\"true\\\"></i> Manage access\\n </a>\\n <a ng-if=\\\"item.GroupName\\\" ui-sref=\\\"portainer.groups.group.access({id: item.GroupId})\\\"\\n ><i style=\\\"margin-left: 5px;\\\" class=\\\"fa fa-users\\\" aria-hidden=\\\"true\\\"></i> Manage access\\n </a>\\n </td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"3\\\" class=\\\"text-center text-muted\\\">Select a user to show associated access and role</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"3\\\" class=\\\"text-center text-muted\\\">The selected user does not have access to any environment(s)</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/rbac/components/roles-datatable/roles-datatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n auto-focus\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Name')\\\">\\n Name\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Description')\\\">\\n Description\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Description' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Description' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th class=\\\"be-visual-indicator-col\\\"></th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit))\\\"\\n ng-class=\\\"{ active: item.Checked }\\\"\\n >\\n <td>{{ item.Name }}</td>\\n <td>{{ item.Description }}</td>\\n <td class=\\\"be-visual-indicator-col\\\" ng-switch on=\\\"$ctrl.isDefaultItem(item)\\\">\\n <span ng-switch-when=\\\"false\\\">\\n <be-feature-indicator feature=\\\"$ctrl.limitedFeature\\\"></be-feature-indicator>\\n </span>\\n <b ng-switch-when=\\\"true\\\">Default</b>\\n </td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"3\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"3\\\" class=\\\"text-center text-muted\\\">No role available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/components/sidebar/sidebar-menu/sidebar-menu.html';\nvar html = \"<li class=\\\"sidebar-list sidebar-menu\\\">\\n <sidebar-menu-item path=\\\"{{::$ctrl.path }}\\\" path-params=\\\"$ctrl.pathParams\\\" icon-class=\\\"{{::$ctrl.iconClass}}\\\" data-cy=\\\"portainerSidebar-{{ ::$ctrl.label }}\\\">\\n <div class=\\\"sidebar-menu-head\\\">\\n <button ng-click=\\\"$ctrl.onClickArrow($event)\\\" class=\\\"small sidebar-menu-indicator\\\">\\n <i class=\\\"fas\\\" ng-class=\\\"$ctrl.isOpen() ? 'fa-chevron-down' : 'fa-chevron-right'\\\"></i>\\n </button>\\n {{ ::$ctrl.label }}\\n </div>\\n </sidebar-menu-item>\\n\\n <div class=\\\"sidebar-list-items\\\" ng-if=\\\"$ctrl.isOpen()\\\">\\n <ng-transclude></ng-transclude>\\n </div>\\n</li>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/components/sidebar/sidebar-section/sidebar-section.html';\nvar html = \"<div class=\\\"sidebar-section\\\">\\n <li class=\\\"sidebar-title\\\">\\n <span>{{ ::$ctrl.title }}</span>\\n </li>\\n\\n <div class=\\\"sidebar-section-items\\\" ng-transclude> </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/components/sidebar/sidebar-menu-item/sidebar-menu-item.html';\nvar html = \"<li class=\\\"sidebar-menu-item\\\" ng-class=\\\"$ctrl.className\\\">\\n <a ui-state=\\\"$ctrl.path\\\" ui-state-params=\\\"$ctrl.pathParams\\\" ui-sref-active=\\\"active\\\">\\n <ng-transclude></ng-transclude>\\n <span ng-if=\\\"$ctrl.iconClass\\\" class=\\\"menu-icon fa\\\" ng-class=\\\"$ctrl.iconClass\\\"></span>\\n </a>\\n</li>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/components/forms/git-form/git-form.html';\nvar html = \"<ng-form name=\\\"$ctrl.gitForm\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Git repository\\n </div>\\n <git-form-url-field value=\\\"$ctrl.model.RepositoryURL\\\" on-change=\\\"($ctrl.onChangeURL)\\\"></git-form-url-field>\\n <git-form-ref-field value=\\\"$ctrl.model.RepositoryReferenceName\\\" on-change=\\\"($ctrl.onChangeRefName)\\\"></git-form-ref-field>\\n <git-form-compose-path-field\\n value=\\\"$ctrl.model.ComposeFilePathInRepository\\\"\\n on-change=\\\"($ctrl.onChangeComposePath)\\\"\\n deploy-method=\\\"{{ $ctrl.deployMethod }}\\\"\\n ></git-form-compose-path-field>\\n\\n <git-form-additional-files-panel ng-if=\\\"$ctrl.additionalFile\\\" model=\\\"$ctrl.model\\\" on-change=\\\"($ctrl.onChange)\\\"></git-form-additional-files-panel>\\n\\n <git-form-auth-fieldset model=\\\"$ctrl.model\\\" on-change=\\\"($ctrl.onChange)\\\"></git-form-auth-fieldset>\\n\\n <git-form-auto-update-fieldset ng-if=\\\"$ctrl.autoUpdate\\\" model=\\\"$ctrl.model\\\" on-change=\\\"($ctrl.onChange)\\\"></git-form-auto-update-fieldset>\\n</ng-form>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/components/forms/git-form/git-form-auth-fieldset/git-form-auth-fieldset.html';\nvar html = \"<div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <por-switch-field\\n ng-model=\\\"$ctrl.model.RepositoryAuthentication\\\"\\n label=\\\"Authentication\\\"\\n name=\\\"authSwitch\\\"\\n on-change=\\\"($ctrl.onChangeAuth)\\\"\\n data-cy=\\\"component-gitAuthToggle\\\"\\n ></por-switch-field>\\n </div>\\n</div>\\n<div class=\\\"small text-warning\\\" style=\\\"margin: 5px 0 15px 0;\\\" ng-if=\\\"$ctrl.model.RepositoryAuthentication && $ctrl.showAuthExplanation\\\">\\n <i class=\\\"fa fa-exclamation-circle\\\" aria-hidden=\\\"true\\\"></i>\\n <span class=\\\"text-muted\\\">Enabling authentication will store the credentials and it is advisable to use a git service account</span>\\n</div>\\n<div ng-if=\\\"$ctrl.model.RepositoryAuthentication\\\">\\n <div class=\\\"form-group\\\">\\n <label for=\\\"repository_username\\\" class=\\\"control-label text-left inline-label\\\">\\n Username\\n </label>\\n <div class=\\\"inline-input\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"$ctrl.model.RepositoryUsername\\\"\\n name=\\\"repository_username\\\"\\n placeholder=\\\"git username\\\"\\n ng-change=\\\"$ctrl.onChangeUsername($ctrl.model.RepositoryUsername)\\\"\\n data-cy=\\\"component-gitUsernameInput\\\"\\n />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\">\\n <label for=\\\"repository_password\\\" class=\\\"control-label text-left inline-label\\\">\\n Personal Access Token\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"Provide a personal access token or password\\\"></portainer-tooltip>\\n </label>\\n <div class=\\\"inline-input\\\">\\n <input\\n type=\\\"password\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"$ctrl.model.RepositoryPassword\\\"\\n name=\\\"repository_password\\\"\\n placeholder=\\\"*******\\\"\\n ng-change=\\\"$ctrl.onChangePassword($ctrl.model.RepositoryPassword)\\\"\\n ng-required=\\\"!$ctrl.isEdit\\\"\\n data-cy=\\\"component-gitPasswordInput\\\"\\n />\\n </div>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/components/forms/git-form/git-form-additional-files-panel/git-form-additional-files-panel.html';\nvar html = \"<div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 5px;\\\">\\n <label class=\\\"control-label text-left\\\">Additional paths</label>\\n <span class=\\\"label label-default interactive\\\" style=\\\"margin-left: 10px;\\\" ng-click=\\\"$ctrl.add()\\\"> <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add file </span>\\n </div>\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\">\\n <git-form-additional-file-item\\n ng-repeat=\\\"variable in $ctrl.model.AdditionalFiles track by $index\\\"\\n variable=\\\"variable\\\"\\n index=\\\"$index\\\"\\n on-change=\\\"($ctrl.onChangeVariable)\\\"\\n ></git-form-additional-file-item>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/components/forms/git-form/git-form-additional-files-panel/git-form-additional-file-item/git-form-additional-file-item.html';\nvar html = \"<ng-form class=\\\"env-item form-horizontal\\\" name=\\\"$ctrl.{{ $ctrl.formName }}\\\">\\n <div class=\\\"form-group col-sm-12\\\">\\n <div class=\\\"form-inline\\\" style=\\\"margin-top: 10px;\\\">\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">path</span>\\n <input type=\\\"text\\\" name=\\\"name\\\" class=\\\"form-control\\\" ng-model=\\\"$ctrl.variable\\\" ng-change=\\\"$ctrl.onChangePath($ctrl.variable)\\\" required />\\n </div>\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"$ctrl.removeValue()\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n <div ng-show=\\\"$ctrl[$ctrl.formName].name.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"$ctrl[$ctrl.formName].name.$error\\\">\\n <p ng-message=\\\"required\\\"> <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Path is required. </p>\\n </div>\\n </div>\\n </div>\\n </div>\\n</ng-form>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/components/forms/git-form/git-form-auto-update-fieldset/git-form-auto-update-fieldset.html';\nvar html = \"<ng-form name=\\\"autoUpdateForm\\\">\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <por-switch-field name=\\\"autoUpdate\\\" ng-model=\\\"$ctrl.model.RepositoryAutomaticUpdates\\\" label=\\\"Automatic Updates\\\" on-change=\\\"($ctrl.onChangeAutoUpdate)\\\"></por-switch-field>\\n </div>\\n </div>\\n <div class=\\\"small text-warning\\\" style=\\\"margin: 5px 0 10px 0;\\\" ng-if=\\\"$ctrl.model.RepositoryAutomaticUpdates\\\">\\n <i class=\\\"fa fa-exclamation-circle\\\" aria-hidden=\\\"true\\\"></i>\\n <span class=\\\"text-muted\\\">Any changes to this stack or application made locally in Portainer will be overridden, which may cause service interruption.</span>\\n </div>\\n <div class=\\\"form-group\\\" ng-if=\\\"$ctrl.model.RepositoryAutomaticUpdates\\\">\\n <label for=\\\"repository_mechanism\\\" class=\\\"col-sm-1 control-label text-left\\\">\\n Mechanism\\n </label>\\n <div class=\\\"col-sm-11\\\">\\n <div class=\\\"input-group col-sm-10 input-group-sm\\\">\\n <div class=\\\"btn-group btn-group-sm\\\">\\n <label class=\\\"btn btn-primary\\\" ng-click=\\\"$ctrl.onChangeMechanism($ctrl.model.RepositoryMechanism)\\\" ng-model=\\\"$ctrl.model.RepositoryMechanism\\\" uib-btn-radio=\\\"'Interval'\\\"\\n >Polling</label\\n >\\n <label class=\\\"btn btn-primary\\\" ng-click=\\\"$ctrl.onChangeMechanism($ctrl.model.RepositoryMechanism)\\\" ng-model=\\\"$ctrl.model.RepositoryMechanism\\\" uib-btn-radio=\\\"'Webhook'\\\"\\n >Webhook</label\\n >\\n </div>\\n </div>\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\" ng-if=\\\"$ctrl.model.RepositoryAutomaticUpdates && $ctrl.model.RepositoryMechanism === 'Webhook'\\\">\\n <label for=\\\"repository_mechanism\\\" class=\\\"col-sm-1 control-label text-left\\\">\\n Webhook\\n </label>\\n <div class=\\\"col-sm-11\\\">\\n <span class=\\\"text-muted\\\"> {{ $ctrl.model.RepositoryWebhookURL | truncatelr }} </span>\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary btn-sm space-left\\\" ng-if=\\\"$ctrl.model.RepositoryWebhookURL\\\" ng-click=\\\"$ctrl.copyWebhook()\\\">\\n <span><i class=\\\"fa fa-copy space-right\\\" aria-hidden=\\\"true\\\"></i>Copy link</span>\\n </button>\\n <span>\\n <i id=\\\"copyNotification\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-left: 7px; display: none;\\\"></i>\\n </span>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-if=\\\"$ctrl.model.RepositoryAutomaticUpdates && $ctrl.model.RepositoryMechanism === 'Interval'\\\">\\n <label for=\\\"repository_fetch_interval\\\" class=\\\"col-sm-1 control-label text-left\\\">\\n Fetch interval\\n </label>\\n <div class=\\\"col-sm-11\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n ng-change=\\\"$ctrl.onChangeInterval($ctrl.model.RepositoryFetchInterval)\\\"\\n ng-model=\\\"$ctrl.model.RepositoryFetchInterval\\\"\\n name=\\\"repository_fetch_interval\\\"\\n placeholder=\\\"5m\\\"\\n required\\n interval-format\\n />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-if=\\\"$ctrl.model.RepositoryAutomaticUpdates\\\">\\n <div class=\\\"col-sm-12\\\">\\n <por-switch-field name=\\\"forceUpdate\\\" feature=\\\"$ctrl.limitedFeature\\\" ng-model=\\\"$ctrl.model.RepositoryAutomaticUpdatesForce\\\" label=\\\"Force Redeployment\\\"></por-switch-field>\\n </div>\\n </div>\\n <div class=\\\"small text-warning\\\" style=\\\"margin: 5px 0 10px 0;\\\" ng-if=\\\"$ctrl.model.RepositoryAutomaticUpdates\\\">\\n <i class=\\\"fa fa-exclamation-circle blue-icon\\\" aria-hidden=\\\"true\\\"></i>\\n <span class=\\\"text-muted\\\">When enabled, enforces automatic deployment at each interval or webhook invocation.</span>\\n </div>\\n <div class=\\\"form-group col-md-12\\\" ng-show=\\\"autoUpdateForm.repository_fetch_interval.$touched && autoUpdateForm.repository_fetch_interval.$invalid\\\">\\n <div class=\\\"small text-warning\\\">\\n <div ng-messages=\\\"autoUpdateForm.repository_fetch_interval.$error\\\">\\n <p ng-message=\\\"required\\\"> <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n <p ng-message=\\\"invalidIntervalFormat\\\"> <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Please enter a valid time interval.</p>\\n <p ng-message=\\\"minimumInterval\\\"> <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Minimum interval is 1m</p>\\n </div>\\n </div>\\n </div>\\n <div class=\\\"small text-warning\\\" style=\\\"margin: 5px 0 10px 0;\\\" ng-if=\\\"!$ctrl.model.RepositoryAutomaticUpdates\\\">\\n <i class=\\\"fa fa-exclamation-circle blue-icon\\\" aria-hidden=\\\"true\\\"></i>\\n <span class=\\\"text-muted\\\">When enabled, updates from the git repository will occur automatically at an interval or webhook.</span>\\n </div>\\n</ng-form>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/components/forms/git-form/git-form-compose-path-field/git-form-compose-path-field.html';\nvar html = \"<div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\"> Indicate the path to the {{ $ctrl.deployMethod == 'compose' ? 'Compose' : 'Manifest' }} file from the root of your repository. </span>\\n</div>\\n<div class=\\\"form-group\\\">\\n <label for=\\\"stack_repository_path\\\" class=\\\"col-sm-2 control-label text-left\\\">{{ $ctrl.deployMethod == 'compose' ? 'Compose' : 'Manifest' }} path</label>\\n <div class=\\\"col-sm-10\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n name=\\\"repoPathField\\\"\\n ng-model=\\\"$ctrl.value\\\"\\n ng-change=\\\"$ctrl.onChange($ctrl.value)\\\"\\n id=\\\"stack_repository_path\\\"\\n placeholder=\\\"{{ $ctrl.deployMethod == 'compose' ? 'docker-compose.yml' : 'manifest.yml' }}\\\"\\n required\\n />\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/components/forms/git-form/git-form-ref-field/git-form-ref-field.html';\nvar html = \"<div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n Specify a reference of the repository using the following syntax: branches with <code>refs/heads/branch_name</code> or tags with <code>refs/tags/tag_name</code>. If not\\n specified, will use the default <code>HEAD</code> reference normally the <code>master</code> branch.\\n </span>\\n</div>\\n<div class=\\\"form-group\\\">\\n <label for=\\\"stack_repository_reference_name\\\" class=\\\"col-sm-2 control-label text-left\\\">Repository reference</label>\\n <div class=\\\"col-sm-10\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"$ctrl.value\\\"\\n id=\\\"stack_repository_reference_name\\\"\\n placeholder=\\\"refs/heads/master\\\"\\n ng-change=\\\"$ctrl.onChange($ctrl.value)\\\"\\n data-cy=\\\"component-gitRefInput\\\"\\n />\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/components/forms/git-form/git-form-url-field/git-form-url-field.html';\nvar html = \"<div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n You can use the URL of a git repository.\\n </span>\\n</div>\\n<div class=\\\"form-group\\\">\\n <label for=\\\"stack_repository_url\\\" class=\\\"col-sm-2 control-label text-left\\\">Repository URL</label>\\n <div class=\\\"col-sm-10\\\">\\n <input\\n type=\\\"text\\\"\\n name=\\\"repoUrlField\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"$ctrl.value\\\"\\n ng-change=\\\"$ctrl.onChange($ctrl.value)\\\"\\n id=\\\"stack_repository_url\\\"\\n placeholder=\\\"https://github.com/portainer/portainer-compose\\\"\\n data-cy=\\\"component-gitUrlInput\\\"\\n required\\n />\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/components/forms/git-form/git-form-info-panel/git-form-info-panel.html';\nvar html = \"<div class=\\\"form-group\\\" ng-class=\\\"$ctrl.className\\\">\\n <div class=\\\"col-sm-12\\\">\\n <p>\\n This {{ $ctrl.type }} was deployed from the git repository <code>{{ $ctrl.url }}</code>\\n .\\n </p>\\n <p>\\n Update\\n <code\\n >{{ $ctrl.configFilePath }}<span ng-if=\\\"$ctrl.additionalFiles.length > 0\\\">, {{ $ctrl.additionalFiles.join(',') }}</span></code\\n >\\n in git and pull from here to update the {{ $ctrl.type }}.\\n </p>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/components/accessManagement/porAccessManagement.html';\nvar html = \"<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget ng-if=\\\"ctrl.availableUsersAndTeams && ctrl.accessControlledEntity\\\">\\n <rd-widget-header icon=\\\"fa-user-lock\\\" title-text=\\\"Create access\\\"></rd-widget-header>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\">\\n <div ng-if=\\\"ctrl.entityType !== 'registry'\\\" class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 small text-warning\\\">\\n <p>\\n <i class=\\\"fa fa-exclamation-circle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Adding user access will require the affected user(s) to logout and login for the changes to be taken into account.\\n </p>\\n </span>\\n </div>\\n\\n <por-access-management-users-selector options=\\\"ctrl.availableUsersAndTeams\\\" value=\\\"ctrl.formValues.multiselectOutput\\\"></por-access-management-users-selector>\\n\\n <div class=\\\"form-group\\\" ng-if=\\\"ctrl.entityType !== 'registry'\\\">\\n <label class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Role\\n </label>\\n <div class=\\\"col-sm-9 col-lg-6\\\">\\n <div class=\\\"flex items-center\\\">\\n <select\\n class=\\\"form-control\\\"\\n ng-model=\\\"ctrl.formValues.selectedRole\\\"\\n ng-options=\\\"role as ctrl.roleLabel(role) disable when ctrl.isRoleLimitedToBE(role) for role in ctrl.roles\\\"\\n >\\n </select>\\n <be-feature-indicator feature=\\\"ctrl.limitedFeature\\\" class=\\\"space-left\\\"></be-feature-indicator>\\n </div>\\n </div>\\n </div>\\n\\n <!-- actions -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"submit\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"(ctrl.availableUsersAndTeams | filter:{ticked:true}).length === 0 || ctrl.actionInProgress\\\"\\n ng-click=\\\"ctrl.authorizeAccess()\\\"\\n button-spinner=\\\"ctrl.actionInProgress\\\"\\n data-cy=\\\"access-createAccess\\\"\\n >\\n <span ng-hide=\\\"ctrl.state.actionInProgress\\\"><i class=\\\"fa fa-plus\\\" aria-hidden=\\\"true\\\"></i> Create access</span>\\n <span ng-show=\\\"ctrl.state.actionInProgress\\\">Creating access...</span>\\n </button>\\n </div>\\n </div>\\n <!-- !actions -->\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <access-datatable\\n ng-if=\\\"ctrl.authorizedUsersAndTeams\\\"\\n title-text=\\\"Access\\\"\\n title-icon=\\\"fa-user-lock\\\"\\n table-key=\\\"{{ 'access_' + ctrl.entityType }}\\\"\\n order-by=\\\"Name\\\"\\n show-warning=\\\"ctrl.entityType !== 'registry'\\\"\\n is-update-enabled=\\\"ctrl.entityType !== 'registry'\\\"\\n show-roles=\\\"ctrl.entityType !== 'registry'\\\"\\n roles=\\\"ctrl.roles\\\"\\n inherit-from=\\\"ctrl.inheritFrom\\\"\\n dataset=\\\"ctrl.authorizedUsersAndTeams\\\"\\n update-action=\\\"ctrl.updateAction\\\"\\n remove-action=\\\"ctrl.unauthorizeAccess\\\"\\n >\\n </access-datatable>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/components/accessManagement/por-access-management-users-selector/por-access-management-users-selector.html';\nvar html = \"<div class=\\\"form-group\\\">\\n <label class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Select user(s) and/or team(s)\\n </label>\\n <div class=\\\"col-sm-9 col-lg-4\\\">\\n <span class=\\\"small text-muted\\\" ng-if=\\\"$ctrl.options.length === 0\\\">\\n No users or teams available.\\n </span>\\n <span\\n isteven-multi-select\\n ng-if=\\\"$ctrl.options.length > 0\\\"\\n input-model=\\\"$ctrl.options\\\"\\n output-model=\\\"$ctrl.value\\\"\\n button-label=\\\"icon Name\\\"\\n item-label=\\\"icon Name\\\"\\n tick-property=\\\"ticked\\\"\\n helper-elements=\\\"filter\\\"\\n search-property=\\\"Name\\\"\\n translation=\\\"{nothingSelected: 'Select one or more users and/or teams', search: 'Search...'}\\\"\\n data-cy=\\\"component-selectUser\\\"\\n >\\n </span>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/components/form-components/web-editor-form/web-editor-form.html';\nvar html = \"<ng-form name=\\\"$ctrl.webEditorForm\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Web editor\\n </div>\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\" ng-transclude=\\\"description\\\"> </span>\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <code-editor identifier=\\\"{{ $ctrl.identifier }}\\\" placeholder=\\\"{{ $ctrl.placeholder }}\\\" yml=\\\"$ctrl.yml\\\" value=\\\"$ctrl.value\\\" on-change=\\\"($ctrl.editorUpdate)\\\"></code-editor>\\n </div>\\n </div>\\n</ng-form>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/components/form-components/file-upload-form/file-upload-form.html';\nvar html = \"<ng-form class=\\\"file-upload-form\\\" name=\\\"$ctrl.fileUploadForm\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Upload\\n </div>\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\" ng-transclude=\\\"description\\\"> </span>\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ngf-select=\\\"$ctrl.onChange($file)\\\" ng-model=\\\"$ctrl.file\\\" ng-required=\\\"$ctrl.ngRequired\\\" name=\\\"file\\\">\\n Select file\\n </button>\\n <span class=\\\"space-left\\\">\\n {{ $ctrl.file.name }}\\n <i class=\\\"fa fa-times red-icon\\\" ng-if=\\\"!$ctrl.file\\\" aria-hidden=\\\"true\\\"></i>\\n </span>\\n </div>\\n </div>\\n</ng-form>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/settings/authentication/ldap/ad-settings/ad-settings.html';\nvar html = \"<ng-form class=\\\"ad-settings\\\" limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\" limited-feature-class=\\\"limited-be\\\">\\n <be-feature-indicator feature=\\\"$ctrl.limitedFeatureId\\\" class=\\\"my-8 block\\\"></be-feature-indicator>\\n\\n <auto-user-provision-toggle ng-model=\\\"$ctrl.settings.AutoCreateUsers\\\">\\n <field-description>\\n With automatic user provisioning enabled, Portainer will create user(s) automatically with standard user role and assign them to team(s) which matches to LDAP group name(s).\\n If disabled, users must be created in Portainer beforehand.\\n </field-description>\\n </auto-user-provision-toggle>\\n\\n <div>\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Information\\n </div>\\n <div class=\\\"form-group col-sm-12 text-muted small\\\">\\n When using Microsoft AD authentication, Portainer will delegate user authentication to the Domain Controller(s) configured below; if there is no connectivity, Portainer will\\n fallback to internal authentication.\\n </div>\\n </div>\\n\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n AD configuration\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12 small text-muted\\\">\\n <p>\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n You can configure multiple AD Controllers for authentication fallback. Make sure all servers are using the same configuration (i.e. if TLS is enabled, they should all use\\n the same certificates).\\n </p>\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <label for=\\\"ldap_url\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\" style=\\\"display: flex; flex-wrap: wrap;\\\">\\n AD Controller\\n <button\\n type=\\\"button\\\"\\n class=\\\"label label-default interactive\\\"\\n style=\\\"border: 0;\\\"\\n ng-click=\\\"$ctrl.addLDAPUrl()\\\"\\n limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\"\\n limited-feature-tabindex=\\\"-1\\\"\\n >\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> Add additional server\\n </button>\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <div ng-repeat=\\\"url in $ctrl.settings.URLs track by $index\\\" style=\\\"display: flex; margin-bottom: 10px;\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n id=\\\"ldap_url\\\"\\n ng-model=\\\"$ctrl.settings.URLs[$index]\\\"\\n placeholder=\\\"e.g. 10.0.0.10:389 or myldap.domain.tld:389\\\"\\n limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\"\\n limited-feature-tabindex=\\\"-1\\\"\\n />\\n <button\\n ng-if=\\\"$index > 0\\\"\\n class=\\\"btn btn-sm btn-danger\\\"\\n type=\\\"button\\\"\\n ng-click=\\\"$ctrl.removeLDAPUrl($index)\\\"\\n limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\"\\n limited-feature-tabindex=\\\"-1\\\"\\n >\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <label for=\\\"ldap_username\\\" class=\\\"col-sm-3 control-label text-left\\\">\\n Service Account\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"Account that will be used to search for users.\\\"></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-9\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n id=\\\"ldap_username\\\"\\n ng-model=\\\"$ctrl.settings.ReaderDN\\\"\\n placeholder=\\\"reader@domain.tld\\\"\\n ng-change=\\\"$ctrl.onAccountChange($ctrl.settings.ReaderDN)\\\"\\n limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\"\\n limited-feature-tabindex=\\\"-1\\\"\\n />\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <label for=\\\"ldap_password\\\" class=\\\"col-sm-3 control-label text-left\\\">\\n Service Account Password\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"If you do not enter a password, Portainer will leave the current password unchanged.\\\"></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-9\\\">\\n <input\\n type=\\\"password\\\"\\n class=\\\"form-control\\\"\\n id=\\\"ldap_password\\\"\\n ng-model=\\\"$ctrl.settings.Password\\\"\\n placeholder=\\\"password\\\"\\n autocomplete=\\\"new-password\\\"\\n limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\"\\n limited-feature-tabindex=\\\"-1\\\"\\n />\\n </div>\\n </div>\\n\\n <ldap-connectivity-check\\n ng-if=\\\"!$ctrl.settings.TLSConfig.TLS && !$ctrl.settings.StartTLS\\\"\\n settings=\\\"$ctrl.settings\\\"\\n state=\\\"$ctrl.state\\\"\\n connectivity-check=\\\"$ctrl.connectivityCheck\\\"\\n limited-feature-id=\\\"$ctrl.limitedFeatureId\\\"\\n ></ldap-connectivity-check>\\n\\n <ldap-settings-security\\n title=\\\"AD Connectivity Security\\\"\\n settings=\\\"$ctrl.settings\\\"\\n tlsca-cert=\\\"$ctrl.tlscaCert\\\"\\n upload-in-progress=\\\"$ctrl.state.uploadInProgress\\\"\\n on-tlsca-cert-change=\\\"($ctrl.onTlscaCertChange)\\\"\\n limited-feature-id=\\\"$ctrl.limitedFeatureId\\\"\\n ></ldap-settings-security>\\n\\n <ldap-connectivity-check\\n ng-if=\\\"$ctrl.settings.TLSConfig.TLS || $ctrl.settings.StartTLS\\\"\\n settings=\\\"$ctrl.settings\\\"\\n state=\\\"$ctrl.state\\\"\\n connectivity-check=\\\"$ctrl.connectivityCheck\\\"\\n limited-feature-id=\\\"$ctrl.limitedFeatureId\\\"\\n ></ldap-connectivity-check>\\n\\n <ldap-user-search\\n style=\\\"margin-top: 5px;\\\"\\n show-username-format=\\\"true\\\"\\n settings=\\\"$ctrl.settings.SearchSettings\\\"\\n domain-suffix=\\\"{{ $ctrl.domainSuffix }}\\\"\\n base-filter=\\\"(objectClass=user)\\\"\\n on-search-click=\\\"($ctrl.searchUsers)\\\"\\n limited-feature-id=\\\"$ctrl.limitedFeatureId\\\"\\n ></ldap-user-search>\\n\\n <ldap-group-search\\n style=\\\"margin-top: 5px;\\\"\\n settings=\\\"$ctrl.settings.GroupSearchSettings\\\"\\n domain-suffix=\\\"{{ $ctrl.domainSuffix }}\\\"\\n base-filter=\\\"(objectClass=group)\\\"\\n on-search-click=\\\"($ctrl.searchGroups)\\\"\\n limited-feature-id=\\\"$ctrl.limitedFeatureId\\\"\\n ></ldap-group-search>\\n\\n <ldap-custom-admin-group\\n style=\\\"margin-top: 5px;\\\"\\n settings=\\\"$ctrl.settings\\\"\\n on-search-click=\\\"($ctrl.onSearchAdminGroupsClick)\\\"\\n selected-admin-groups=\\\"$ctrl.selectedAdminGroups\\\"\\n default-admin-group-search-filter=\\\"'(objectClass=groupOfNames)'\\\"\\n limited-feature-id=\\\"$ctrl.limitedFeatureId\\\"\\n is-limited-feature-self-contained=\\\"false\\\"\\n ></ldap-custom-admin-group>\\n\\n <ldap-settings-test-login settings=\\\"$ctrl.settings\\\" limited-feature-id=\\\"$ctrl.limitedFeatureId\\\" is-limited-feature-self-contained=\\\"false\\\"></ldap-settings-test-login>\\n <save-auth-settings-button\\n on-save-settings=\\\"($ctrl.onSaveSettings)\\\"\\n save-button-state=\\\"($ctrl.saveButtonState)\\\"\\n limited-feature-id=\\\"$ctrl.limitedFeatureId\\\"\\n save-button-disabled=\\\"($ctrl.isSaveSettingButtonDisabled())\\\"\\n ></save-auth-settings-button>\\n</ng-form>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/settings/authentication/ldap/ldap-settings/ldap-settings.html';\nvar html = \"<div>\\n <auto-user-provision-toggle ng-model=\\\"$ctrl.settings.AutoCreateUsers\\\">\\n <field-description>\\n With automatic user provisioning enabled, Portainer will create user(s) automatically with standard user role and assign them to team(s) which matches to LDAP group name(s).\\n If disabled, users must be created in Portainer beforehand.\\n </field-description>\\n </auto-user-provision-toggle>\\n\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Server Type\\n </div>\\n\\n <box-selector\\n style=\\\"margin-bottom: 0;\\\"\\n radio-name=\\\"ldap-server-type-selector\\\"\\n ng-model=\\\"$ctrl.settings.ServerType\\\"\\n options=\\\"$ctrl.boxSelectorOptions\\\"\\n on-change=\\\"($ctrl.onChangeServerType)\\\"\\n ></box-selector>\\n\\n <ldap-settings-custom\\n ng-if=\\\"$ctrl.settings.ServerType === $ctrl.SERVER_TYPES.CUSTOM\\\"\\n settings=\\\"$ctrl.settings\\\"\\n tlsca-cert=\\\"$ctrl.tlscaCert\\\"\\n state=\\\"$ctrl.state\\\"\\n on-tlsca-cert-change=\\\"($ctrl.onTlscaCertChange)\\\"\\n connectivity-check=\\\"$ctrl.connectivityCheck\\\"\\n on-search-users-click=\\\"($ctrl.searchUsers)\\\"\\n on-search-groups-click=\\\"($ctrl.searchGroups)\\\"\\n on-save-settings=\\\"($ctrl.onSaveSettings)\\\"\\n save-button-state=\\\"($ctrl.saveButtonState)\\\"\\n save-button-disabled=\\\"$ctrl.isLdapFormValid\\\"\\n ></ldap-settings-custom>\\n <ldap-settings-open-ldap\\n ng-if=\\\"$ctrl.settings.ServerType === $ctrl.SERVER_TYPES.OPEN_LDAP\\\"\\n settings=\\\"$ctrl.settings\\\"\\n tlsca-cert=\\\"$ctrl.tlscaCert\\\"\\n state=\\\"$ctrl.state\\\"\\n on-tlsca-cert-change=\\\"($ctrl.onTlscaCertChange)\\\"\\n connectivity-check=\\\"$ctrl.connectivityCheck\\\"\\n on-search-users-click=\\\"($ctrl.searchUsers)\\\"\\n on-search-groups-click=\\\"($ctrl.searchGroups)\\\"\\n on-save-settings=\\\"($ctrl.onSaveSettings)\\\"\\n save-button-state=\\\"($ctrl.saveButtonState)\\\"\\n save-button-disabled=\\\"$ctrl.isLdapFormValid\\\"\\n ></ldap-settings-open-ldap>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/settings/authentication/ldap/ldap-settings-custom/ldap-settings-custom.html';\nvar html = \"<div>\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Information\\n </div>\\n <div class=\\\"form-group col-sm-12 text-muted small\\\">\\n When using LDAP authentication, Portainer will delegate user authentication to a LDAP server and fallback to internal authentication if LDAP authentication fails.\\n </div>\\n</div>\\n\\n<div class=\\\"col-sm-12 form-section-title\\\">\\n LDAP configuration\\n</div>\\n\\n<div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12 small text-muted\\\">\\n <p>\\n <i class=\\\"fa fa-info-circle blue-icon m-r-2\\\" aria-hidden=\\\"true\\\"></i>\\n You can configure multiple LDAP Servers for authentication fallback. Make sure all servers are using the same configuration (i.e. if TLS is enabled, they should all use the\\n same certificates).\\n </p>\\n </div>\\n</div>\\n\\n<div class=\\\"form-group\\\">\\n <label for=\\\"ldap_url\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left dispay-flex flex-wrap\\\">\\n LDAP Server\\n <button\\n type=\\\"button\\\"\\n class=\\\"label label-default interactive no-border\\\"\\n ng-click=\\\"$ctrl.addLDAPUrl()\\\"\\n limited-feature-dir=\\\"{{ $ctrl.limitedFeatureId }}\\\"\\n limited-feature-disabled\\n limited-feature-class=\\\"limited-be\\\"\\n >\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> Add additional server\\n </button>\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <div class=\\\"m-b-10 dispay-flex\\\" ng-repeat=\\\"url in $ctrl.settings.URLs track by $index\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"ldap_url\\\" ng-model=\\\"$ctrl.settings.URLs[$index]\\\" placeholder=\\\"e.g. 10.0.0.10:389 or myldap.domain.tld:389\\\" required />\\n <button ng-if=\\\"$index > 0\\\" class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"$ctrl.removeLDAPUrl($index)\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n</div>\\n\\n<div class=\\\"form-group\\\">\\n <label for=\\\"anonymous_mode\\\" class=\\\"control-label text-left col-sm-3 col-lg-2\\\">\\n Anonymous mode\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"Enable this option if the server is configured for Anonymous access.\\\"></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <label class=\\\"switch\\\">\\n <input type=\\\"checkbox\\\" id=\\\"anonymous_mode\\\" ng-model=\\\"$ctrl.settings.AnonymousMode\\\" limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\" limited-feature-tabindex=\\\"-1\\\" /><i></i>\\n </label>\\n </div>\\n</div>\\n<!-- !Anonymous mode-->\\n\\n<div ng-if=\\\"!$ctrl.settings.AnonymousMode\\\">\\n <div class=\\\"form-group\\\">\\n <label for=\\\"ldap_username\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Reader DN\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"Account that will be used to search for users.\\\"></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"ldap_username\\\" ng-model=\\\"$ctrl.settings.ReaderDN\\\" placeholder=\\\"{{ $ctrl.clickToSetValues.readerDNPlaceholder }}\\\" />\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <label for=\\\"ldap_password\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Password\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"If you do not enter a password, Portainer will leave the current password unchanged.\\\"></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"password\\\" class=\\\"form-control\\\" id=\\\"ldap_password\\\" ng-model=\\\"$ctrl.settings.Password\\\" placeholder=\\\"password\\\" autocomplete=\\\"new-password\\\" />\\n </div>\\n </div>\\n</div>\\n\\n<ldap-connectivity-check\\n ng-if=\\\"!$ctrl.settings.TLSConfig.TLS && !$ctrl.settings.StartTLS\\\"\\n settings=\\\"$ctrl.settings\\\"\\n state=\\\"$ctrl.state\\\"\\n connectivity-check=\\\"$ctrl.connectivityCheck\\\"\\n></ldap-connectivity-check>\\n\\n<ldap-settings-security\\n settings=\\\"$ctrl.settings\\\"\\n tlsca-cert=\\\"$ctrl.tlscaCert\\\"\\n upload-in-progress=\\\"$ctrl.state.uploadInProgress\\\"\\n on-tlsca-cert-change=\\\"($ctrl.onTlscaCertChange)\\\"\\n></ldap-settings-security>\\n\\n<ldap-connectivity-check\\n ng-if=\\\"$ctrl.settings.TLSConfig.TLS || $ctrl.settings.StartTLS\\\"\\n settings=\\\"$ctrl.settings\\\"\\n state=\\\"$ctrl.state\\\"\\n connectivity-check=\\\"$ctrl.connectivityCheck\\\"\\n></ldap-connectivity-check>\\n\\n<ldap-custom-user-search\\n class=\\\"m-r-5\\\"\\n settings=\\\"$ctrl.settings.SearchSettings\\\"\\n on-search-click=\\\"($ctrl.onSearchUsersClick)\\\"\\n limited-feature-id=\\\"$ctrl.limitedFeatureId\\\"\\n></ldap-custom-user-search>\\n<ldap-custom-group-search\\n class=\\\"m-r-5\\\"\\n settings=\\\"$ctrl.settings.GroupSearchSettings\\\"\\n on-search-click=\\\"($ctrl.onSearchGroupsClick)\\\"\\n limited-feature-id=\\\"$ctrl.limitedFeatureId\\\"\\n></ldap-custom-group-search>\\n\\n<ldap-custom-admin-group\\n class=\\\"m-r-5\\\"\\n settings=\\\"$ctrl.settings\\\"\\n on-search-click=\\\"($ctrl.onSearchAdminGroupsClick)\\\"\\n selected-admin-groups=\\\"$ctrl.selectedAdminGroups\\\"\\n default-admin-group-search-filter=\\\"'(objectClass=groupOfNames)'\\\"\\n limited-feature-id=\\\"$ctrl.limitedFeatureId\\\"\\n is-limited-feature-self-contained=\\\"true\\\"\\n></ldap-custom-admin-group>\\n\\n<ldap-settings-test-login\\n settings=\\\"$ctrl.settings\\\"\\n limited-feature-id=\\\"$ctrl.limitedFeatureId\\\"\\n show-be-indicator-if-needed=\\\"true\\\"\\n is-limited-feature-self-contained=\\\"true\\\"\\n></ldap-settings-test-login>\\n\\n<save-auth-settings-button\\n on-save-settings=\\\"($ctrl.onSaveSettings)\\\"\\n save-button-state=\\\"($ctrl.saveButtonState)\\\"\\n save-button-disabled=\\\"!$ctrl.saveButtonDisabled()\\\"\\n limited-feature-dir=\\\"{{ $ctrl.limitedFeatureId }}\\\"\\n></save-auth-settings-button>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/settings/authentication/ldap/ldap-settings-openldap/ldap-settings-openldap.html';\nvar html = \"<ng-form limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\" limited-feature-class=\\\"limited-be\\\" class=\\\"ldap-settings-openldap\\\">\\n <be-feature-indicator feature=\\\"$ctrl.limitedFeatureId\\\" class=\\\"my-8 block\\\"></be-feature-indicator>\\n\\n <div>\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Information\\n </div>\\n <div class=\\\"form-group col-sm-12 text-muted small\\\">\\n When using LDAP authentication, Portainer will delegate user authentication to a LDAP server and fallback to internal authentication if LDAP authentication fails.\\n </div>\\n </div>\\n\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n LDAP configuration\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12 small text-muted\\\">\\n <p>\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n You can configure multiple LDAP Servers for authentication fallback. Make sure all servers are using the same configuration (i.e. if TLS is enabled, they should all use the\\n same certificates).\\n </p>\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <label for=\\\"ldap_url\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\" style=\\\"display: flex; flex-wrap: wrap;\\\">\\n LDAP Server\\n <button\\n type=\\\"button\\\"\\n class=\\\"label label-default interactive\\\"\\n style=\\\"border: 0;\\\"\\n ng-click=\\\"$ctrl.addLDAPUrl()\\\"\\n limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\"\\n limited-feature-tabindex=\\\"-1\\\"\\n >\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> Add additional server\\n </button>\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <div ng-repeat=\\\"url in $ctrl.settings.URLs track by $index\\\" style=\\\"display: flex; margin-bottom: 10px;\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n id=\\\"ldap_url\\\"\\n ng-model=\\\"$ctrl.settings.URLs[$index]\\\"\\n placeholder=\\\"e.g. 10.0.0.10:389 or myldap.domain.tld:389\\\"\\n limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\"\\n limited-feature-tabindex=\\\"-1\\\"\\n />\\n <button\\n ng-if=\\\"$index > 0\\\"\\n class=\\\"btn btn-sm btn-danger\\\"\\n type=\\\"button\\\"\\n ng-click=\\\"$ctrl.removeLDAPUrl($index)\\\"\\n limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\"\\n limited-feature-tabindex=\\\"-1\\\"\\n >\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n </div>\\n\\n <!-- Anonymous mode-->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"anonymous_mode\\\" class=\\\"control-label text-left col-sm-3\\\" style=\\\"padding-top: 0;\\\">\\n Anonymous mode\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"Enable this option if the server is configured for Anonymous access.\\\"></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-9\\\">\\n <label class=\\\"switch\\\">\\n <input\\n type=\\\"checkbox\\\"\\n id=\\\"anonymous_mode\\\"\\n ng-model=\\\"$ctrl.settings.AnonymousMode\\\"\\n limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\"\\n limited-feature-tabindex=\\\"-1\\\"\\n /><i></i>\\n </label>\\n </div>\\n </div>\\n <!-- !Anonymous mode-->\\n\\n <div ng-if=\\\"!$ctrl.settings.AnonymousMode\\\">\\n <div class=\\\"form-group\\\">\\n <label for=\\\"ldap_username\\\" class=\\\"col-sm-3 control-label text-left\\\">\\n Reader DN\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"Account that will be used to search for users.\\\"></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-9\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n id=\\\"ldap_username\\\"\\n ng-model=\\\"$ctrl.settings.ReaderDN\\\"\\n placeholder=\\\"cn=user,dc=domain,dc=tld\\\"\\n ng-change=\\\"$ctrl.onAccountChange($ctrl.settings.ReaderDN)\\\"\\n limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\"\\n limited-feature-tabindex=\\\"-1\\\"\\n />\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <label for=\\\"ldap_password\\\" class=\\\"col-sm-3 control-label text-left\\\">\\n Password\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"If you do not enter a password, Portainer will leave the current password unchanged.\\\"></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-9\\\">\\n <input\\n type=\\\"password\\\"\\n class=\\\"form-control\\\"\\n id=\\\"ldap_password\\\"\\n ng-model=\\\"$ctrl.settings.Password\\\"\\n placeholder=\\\"password\\\"\\n autocomplete=\\\"new-password\\\"\\n limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\"\\n limited-feature-tabindex=\\\"-1\\\"\\n />\\n </div>\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\" ng-if=\\\"$ctrl.settings.AnonymousMode\\\">\\n <label for=\\\"ldap_domain_root\\\" class=\\\"col-sm-3 control-label text-left\\\">\\n Domain root\\n </label>\\n <div class=\\\"col-sm-9\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n id=\\\"ldap_domain_root\\\"\\n ng-model=\\\"$ctrl.domainSuffix\\\"\\n placeholder=\\\"dc=domain,dc=tld\\\"\\n limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\"\\n limited-feature-tabindex=\\\"-1\\\"\\n />\\n </div>\\n </div>\\n\\n <ldap-connectivity-check\\n ng-if=\\\"!$ctrl.settings.TLSConfig.TLS && !$ctrl.settings.StartTLS\\\"\\n settings=\\\"$ctrl.settings\\\"\\n state=\\\"$ctrl.state\\\"\\n connectivity-check=\\\"$ctrl.connectivityCheck\\\"\\n limited-feature-id=\\\"$ctrl.limitedFeatureId\\\"\\n ></ldap-connectivity-check>\\n\\n <ldap-settings-security\\n title=\\\"Connectivity Security\\\"\\n settings=\\\"$ctrl.settings\\\"\\n tlsca-cert=\\\"$ctrl.tlscaCert\\\"\\n upload-in-progress=\\\"$ctrl.state.uploadInProgress\\\"\\n on-tlsca-cert-change=\\\"($ctrl.onTlscaCertChange)\\\"\\n limited-feature-id=\\\"$ctrl.limitedFeatureId\\\"\\n ></ldap-settings-security>\\n\\n <ldap-connectivity-check\\n ng-if=\\\"$ctrl.settings.TLSConfig.TLS || $ctrl.settings.StartTLS\\\"\\n settings=\\\"$ctrl.settings\\\"\\n state=\\\"$ctrl.state\\\"\\n connectivity-check=\\\"$ctrl.connectivityCheck\\\"\\n limited-feature-id=\\\"$ctrl.limitedFeatureId\\\"\\n ></ldap-connectivity-check>\\n\\n <ldap-user-search\\n style=\\\"margin-top: 5px;\\\"\\n settings=\\\"$ctrl.settings.SearchSettings\\\"\\n domain-suffix=\\\"{{ $ctrl.domainSuffix }}\\\"\\n base-filter=\\\"(objectClass=inetOrgPerson)\\\"\\n on-search-click=\\\"($ctrl.onSearchUsersClick)\\\"\\n limited-feature-id=\\\"$ctrl.limitedFeatureId\\\"\\n ></ldap-user-search>\\n\\n <ldap-group-search\\n style=\\\"margin-top: 5px;\\\"\\n settings=\\\"$ctrl.settings.GroupSearchSettings\\\"\\n domain-suffix=\\\"{{ $ctrl.domainSuffix }}\\\"\\n base-filter=\\\"(objectClass=groupOfNames)\\\"\\n on-search-click=\\\"($ctrl.onSearchGroupsClick)\\\"\\n limited-feature-id=\\\"$ctrl.limitedFeatureId\\\"\\n ></ldap-group-search>\\n\\n <ldap-settings-test-login settings=\\\"$ctrl.settings\\\" limited-feature-id=\\\"$ctrl.limitedFeatureId\\\"></ldap-settings-test-login>\\n <save-auth-settings-button\\n on-save-settings=\\\"($ctrl.onSaveSettings)\\\"\\n save-button-state=\\\"($ctrl.saveButtonState)\\\"\\n save-button-disabled=\\\"!$ctrl.saveButtonDisabled()\\\"\\n limited-feature-id=\\\"$ctrl.limitedFeatureId\\\"\\n ></save-auth-settings-button>\\n</ng-form>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/settings/authentication/ldap/ldap-connectivity-check/ldap-connectivity-check.html';\nvar html = \"<div class=\\\"form-group\\\">\\n <label for=\\\"ldap_password\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Connectivity check\\n <i class=\\\"fa fa-check green-icon m-l-5\\\" ng-if=\\\"$ctrl.state.successfulConnectivityCheck\\\"></i>\\n <i class=\\\"fa fa-times red-icon m-l-5\\\" ng-if=\\\"$ctrl.state.failedConnectivityCheck\\\"></i>\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"($ctrl.state.connectivityCheckInProgress) || (!$ctrl.settings.URLs.length) || ((!$ctrl.settings.ReaderDN || !$ctrl.settings.Password) && !$ctrl.settings.AnonymousMode)\\\"\\n ng-click=\\\"$ctrl.connectivityCheck()\\\"\\n button-spinner=\\\"$ctrl.state.connectivityCheckInProgress\\\"\\n limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\"\\n limited-feature-tabindex=\\\"-1\\\"\\n >\\n <span ng-hide=\\\"$ctrl.state.connectivityCheckInProgress\\\">Test connectivity</span>\\n <span ng-show=\\\"$ctrl.state.connectivityCheckInProgress\\\">Testing connectivity...</span>\\n </button>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/settings/authentication/ldap/ldap-groups-datatable/ldap-groups-datatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n auto-focus\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Name')\\\">\\n User Name\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n Groups\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit))\\\"\\n ng-class=\\\"{ active: item.Checked }\\\"\\n >\\n <td>\\n {{ item.Name }}\\n </td>\\n <td>\\n <p ng-repeat=\\\"group in item.Groups\\\" style=\\\"margin: 0;\\\">{{ group }}</p>\\n </td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"3\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"5\\\" class=\\\"text-center text-muted\\\">No groups found.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/settings/authentication/ldap/ldap-group-search/ldap-group-search.html';\nvar html = \"<div class=\\\"col-sm-12 form-section-title\\\" style=\\\"float: initial;\\\">\\n Group search configurations\\n</div>\\n\\n<div style=\\\"margin-top: 10px;\\\" ng-repeat=\\\"config in $ctrl.settings | limitTo: (1 - $ctrl.settings)\\\">\\n <ldap-group-search-item\\n config=\\\"config\\\"\\n domain-suffix=\\\"{{ $ctrl.domainSuffix }}\\\"\\n index=\\\"$index\\\"\\n base-filter=\\\"{{ $ctrl.baseFilter }}\\\"\\n on-remove-click=\\\"($ctrl.onRemoveClick)\\\"\\n limited-feature-id=\\\"$ctrl.limitedFeatureId\\\"\\n ></ldap-group-search-item>\\n</div>\\n\\n<div class=\\\"form-group\\\" style=\\\"margin-top: 10px;\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n class=\\\"label label-default interactive\\\"\\n style=\\\"border: 0;\\\"\\n ng-click=\\\"$ctrl.onAddClick()\\\"\\n limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\"\\n limited-feature-tabindex=\\\"-1\\\"\\n >\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add group search configuration\\n </button>\\n </div>\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 10px;\\\">\\n <button class=\\\"btn btm-sm btn-primary\\\" type=\\\"button\\\" ng-click=\\\"$ctrl.search()\\\" limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\" limited-feature-tabindex=\\\"-1\\\">\\n Display User/Group matching\\n </button>\\n </div>\\n</div>\\n\\n<div ng-if=\\\"$ctrl.showTable\\\">\\n <div class=\\\"form-group\\\">\\n <ldap-groups-datatable dataset=\\\"$ctrl.groups\\\" title-text=\\\"Groups\\\" title-icon=\\\"fa-users\\\" table-key=\\\"ldapGroups\\\"></ldap-groups-datatable>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/settings/authentication/ldap/ldap-group-search-item/ldap-group-search-item.html';\nvar html = \"<rd-widget>\\n <rd-widget-body>\\n <div ng-if=\\\"$ctrl.index > 0\\\" style=\\\"margin-bottom: 10px;\\\">\\n <span class=\\\"text-muted small\\\">\\n Extra search configuration\\n </span>\\n <button\\n class=\\\"btn btn-sm btn-danger\\\"\\n type=\\\"button\\\"\\n ng-click=\\\"$ctrl.onRemoveClick($ctrl.index)\\\"\\n limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\"\\n limited-feature-tabindex=\\\"-1\\\"\\n >\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n\\n <ldap-settings-dn-builder\\n label=\\\"Group Search Path (optional)\\\"\\n suffix=\\\"{{ $ctrl.domainSuffix }}\\\"\\n ng-model=\\\"$ctrl.config.GroupBaseDN\\\"\\n on-change=\\\"($ctrl.onChangeBaseDN)\\\"\\n limited-feature-id=\\\"$ctrl.limitedFeatureId\\\"\\n ></ldap-settings-dn-builder>\\n\\n <div class=\\\"form-group\\\">\\n <label class=\\\"col-sm-4 col-md-2 control-label text-left\\\">\\n Group Base DN\\n </label>\\n <div class=\\\"col-sm-8 col-md-10\\\">\\n {{ $ctrl.config.GroupBaseDN }}\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-bottom: 5px;\\\">\\n <label class=\\\"control-label text-left\\\">Groups</label>\\n <span class=\\\"label label-default interactive\\\" style=\\\"margin-left: 10px;\\\" ng-click=\\\"$ctrl.addGroup()\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add another group\\n </span>\\n </div>\\n <div class=\\\"col-sm-12\\\" ng-if=\\\"$ctrl.groups.length\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <div class=\\\"form-group no-margin-last-child\\\" ng-repeat=\\\"entry in $ctrl.groups\\\">\\n <div class=\\\"col-sm-4\\\">\\n <select\\n class=\\\"form-control\\\"\\n ng-model=\\\"entry.type\\\"\\n ng-change=\\\"$ctrl.onGroupsChange()\\\"\\n limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\"\\n limited-feature-tabindex=\\\"-1\\\"\\n >\\n <option value=\\\"ou\\\">OU Name</option>\\n <option value=\\\"cn\\\">Folder Name</option>\\n </select>\\n </div>\\n <div class=\\\"col-sm-5\\\">\\n <input\\n class=\\\"form-control\\\"\\n ng-model=\\\"entry.value\\\"\\n ng-change=\\\"$ctrl.onGroupsChange()\\\"\\n limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\"\\n limited-feature-tabindex=\\\"-1\\\"\\n />\\n </div>\\n <div class=\\\"col-sm-3 text-right\\\">\\n <button\\n class=\\\"btn btn-sm btn-danger\\\"\\n type=\\\"button\\\"\\n ng-click=\\\"$ctrl.removeGroup($index)\\\"\\n limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\"\\n limited-feature-tabindex=\\\"-1\\\"\\n >\\n <i class=\\\"fa fa-trash-alt\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n </div>\\n\\n <div class=\\\"form-group no-margin-last-child\\\">\\n <label class=\\\"col-sm-4 col-md-2 control-label text-left\\\">\\n Group Filter\\n </label>\\n <div class=\\\"col-sm-8 col-md-10\\\">\\n {{ $ctrl.config.GroupFilter }}\\n </div>\\n </div>\\n </rd-widget-body>\\n</rd-widget>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/settings/authentication/ldap/ldap-user-search/ldap-user-search.html';\nvar html = \"<div class=\\\"col-sm-12 form-section-title\\\" style=\\\"float: initial;\\\">\\n User search configurations\\n</div>\\n\\n<div style=\\\"margin-top: 10px;\\\" ng-repeat=\\\"config in $ctrl.settings | limitTo: (1 - $ctrl.settings)\\\">\\n <ldap-user-search-item\\n index=\\\"$index\\\"\\n config=\\\"config\\\"\\n domain-suffix=\\\"{{ $ctrl.domainSuffix }}\\\"\\n show-username-format=\\\"$ctrl.showUsernameFormat\\\"\\n base-filter=\\\"{{ $ctrl.baseFilter }}\\\"\\n on-remove-click=\\\"($ctrl.onRemoveClick)\\\"\\n limited-feature-id=\\\"$ctrl.limitedFeatureId\\\"\\n ></ldap-user-search-item>\\n</div>\\n\\n<div class=\\\"form-group\\\" style=\\\"margin-top: 10px;\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n class=\\\"label label-default interactive\\\"\\n style=\\\"border: 0;\\\"\\n ng-click=\\\"$ctrl.onAddClick()\\\"\\n limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\"\\n limited-feature-tabindex=\\\"-1\\\"\\n >\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add user search configuration\\n </button>\\n </div>\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 10px;\\\">\\n <button class=\\\"btn btm-sm btn-primary\\\" type=\\\"button\\\" ng-click=\\\"$ctrl.search()\\\" limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\" limited-feature-tabindex=\\\"-1\\\">\\n Display Users\\n </button>\\n </div>\\n</div>\\n\\n<div ng-if=\\\"$ctrl.showTable\\\">\\n <div class=\\\"form-group\\\">\\n <ldap-users-datatable dataset=\\\"$ctrl.users\\\" title-text=\\\"Users\\\" title-icon=\\\"fa-users\\\" table-key=\\\"ldapUsers\\\" order-by=\\\"\\\" reverse-order=\\\"\\\"></ldap-users-datatable>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/settings/authentication/ldap/ldap-user-search-item/ldap-user-search-item.html';\nvar html = \"<rd-widget>\\n <rd-widget-body>\\n <div ng-if=\\\"$ctrl.index > 0\\\" style=\\\"margin-bottom: 10px;\\\">\\n <span class=\\\"text-muted small\\\">\\n Extra search configuration\\n </span>\\n <button\\n ng-if=\\\"$ctrl.index > 0\\\"\\n class=\\\"btn btn-sm btn-danger\\\"\\n type=\\\"button\\\"\\n ng-click=\\\"$ctrl.onRemoveClick($ctrl.index)\\\"\\n limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\"\\n limited-feature-tabindex=\\\"-1\\\"\\n >\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n\\n <div class=\\\"form-group\\\" ng-if=\\\"$ctrl.showUsernameFormat\\\">\\n <div class=\\\"col-sm-4\\\" style=\\\"margin-bottom: 5px;\\\">\\n <label class=\\\"control-label text-left\\\">Username Format</label>\\n </div>\\n <div class=\\\"col-sm-8\\\">\\n <div class=\\\"input-group\\\">\\n <div class=\\\"input-group-btn\\\">\\n <button\\n class=\\\"btn btn-primary\\\"\\n ng-model=\\\"$ctrl.config.UserNameAttribute\\\"\\n uib-btn-radio=\\\"'sAMAccountName'\\\"\\n style=\\\"margin-left: 0px;\\\"\\n limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\"\\n limited-feature-tabindex=\\\"-1\\\"\\n >username</button\\n >\\n <button\\n class=\\\"btn btn-primary\\\"\\n ng-model=\\\"$ctrl.config.UserNameAttribute\\\"\\n uib-btn-radio=\\\"'userPrincipalName'\\\"\\n limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\"\\n limited-feature-tabindex=\\\"-1\\\"\\n >user@domainname</button\\n >\\n </div>\\n </div>\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <label class=\\\"col-sm-4 control-label text-left\\\">\\n Root Domain\\n </label>\\n <div class=\\\"col-sm-8\\\">\\n {{ $ctrl.config.BaseDN }}\\n </div>\\n </div>\\n\\n <ldap-settings-dn-builder\\n ng-model=\\\"$ctrl.config.BaseDN\\\"\\n label=\\\"User Search Path (optional)\\\"\\n suffix=\\\"{{ $ctrl.domainSuffix }}\\\"\\n on-change=\\\"($ctrl.onBaseDNChange)\\\"\\n limited-feature-id=\\\"$ctrl.limitedFeatureId\\\"\\n ></ldap-settings-dn-builder>\\n\\n <div class=\\\"form-group no-margin-last-child\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-bottom: 5px;\\\">\\n <label class=\\\"control-label text-left\\\">Allowed Groups (optional)</label>\\n <button\\n type=\\\"button\\\"\\n class=\\\"label label-default interactive\\\"\\n style=\\\"margin-left: 10px; border: 0;\\\"\\n ng-click=\\\"$ctrl.addGroup()\\\"\\n limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\"\\n limited-feature-tabindex=\\\"-1\\\"\\n >\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add another group\\n </button>\\n </div>\\n <div class=\\\"col-sm-12\\\">\\n <div ng-repeat=\\\"group in $ctrl.groups track by $index\\\" style=\\\"margin-bottom: 10px;\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <ldap-settings-group-dn-builder\\n ng-model=\\\"group\\\"\\n index=\\\"$index\\\"\\n suffix=\\\"{{ $ctrl.domainSuffix }}\\\"\\n on-change=\\\"($ctrl.onGroupChange)\\\"\\n on-remove-click=\\\"($ctrl.removeGroup)\\\"\\n limited-feature-id=\\\"$ctrl.limitedFeatureId\\\"\\n ></ldap-settings-group-dn-builder>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <label class=\\\"col-sm-4 control-label text-left\\\">\\n User Filter\\n </label>\\n <div class=\\\"col-sm-8\\\">\\n {{ $ctrl.config.Filter }}\\n </div>\\n </div>\\n </rd-widget-body>\\n</rd-widget>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/settings/authentication/ldap/ldap-settings-dn-builder/ldap-settings-dn-builder.html';\nvar html = \"<div class=\\\"form-group ldap-dn-builder\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-bottom: 5px;\\\">\\n <label class=\\\"control-label text-left\\\">{{ $ctrl.label || 'DN entries' }}</label>\\n <button\\n type=\\\"button\\\"\\n class=\\\"label label-default interactive\\\"\\n style=\\\"margin-left: 10px; border: 0;\\\"\\n ng-click=\\\"$ctrl.addEntry()\\\"\\n limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\"\\n limited-feature-tabindex=\\\"-1\\\"\\n >\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add another entry\\n </button>\\n </div>\\n <div class=\\\"col-sm-12\\\" ng-if=\\\"$ctrl.entries.length\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <div class=\\\"form-group no-margin-last-child\\\" ng-repeat=\\\"entry in $ctrl.entries\\\">\\n <div class=\\\"col-sm-4\\\">\\n <select class=\\\"form-control\\\" ng-model=\\\"entry.type\\\" ng-change=\\\"$ctrl.onEntriesChange()\\\" limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\" limited-feature-tabindex=\\\"-1\\\">\\n <option value=\\\"ou\\\">OU Name</option>\\n <option value=\\\"cn\\\">Folder Name</option>\\n </select>\\n </div>\\n <div class=\\\"col-sm-5\\\">\\n <input\\n class=\\\"form-control\\\"\\n ng-model=\\\"entry.value\\\"\\n ng-change=\\\"$ctrl.onEntriesChange()\\\"\\n limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\"\\n limited-feature-tabindex=\\\"-1\\\"\\n />\\n </div>\\n <div class=\\\"col-sm-3 text-right\\\">\\n <button\\n class=\\\"btn btn-sm btn-primary\\\"\\n type=\\\"button\\\"\\n ng-disabled=\\\"$first\\\"\\n ng-click=\\\"$ctrl.moveUp($index)\\\"\\n limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\"\\n limited-feature-tabindex=\\\"-1\\\"\\n >\\n <i class=\\\"fa fa-arrow-up\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n <button\\n class=\\\"btn btn-sm btn-primary\\\"\\n type=\\\"button\\\"\\n ng-disabled=\\\"$last\\\"\\n ng-click=\\\"$ctrl.moveDown($index)\\\"\\n limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\"\\n limited-feature-tabindex=\\\"-1\\\"\\n >\\n <i class=\\\"fa fa-arrow-down\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n <button\\n class=\\\"btn btn-sm btn-danger\\\"\\n type=\\\"button\\\"\\n ng-click=\\\"$ctrl.removeEntry($index)\\\"\\n limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\"\\n limited-feature-tabindex=\\\"-1\\\"\\n >\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/settings/authentication/ldap/ldap-settings-group-dn-builder/ldap-settings-group-dn-builder.html';\nvar html = \"<div class=\\\"form-group\\\">\\n <label for=\\\"group-name-input\\\" class=\\\"col-sm-4 control-label text-left\\\">\\n Group Name\\n </label>\\n <div class=\\\"col-sm-7\\\" style=\\\"padding-left: 0;\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n id=\\\"group-name-input\\\"\\n ng-model=\\\"$ctrl.groupName\\\"\\n ng-change=\\\"$ctrl.onGroupNameChange()\\\"\\n limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\"\\n limited-feature-tabindex=\\\"-1\\\"\\n />\\n </div>\\n <div class=\\\"col-sm-1\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-danger btn-sm\\\"\\n ng-if=\\\"$ctrl.onRemoveClick\\\"\\n ng-click=\\\"$ctrl.onRemoveClick()\\\"\\n limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\"\\n limited-feature-tabindex=\\\"-1\\\"\\n >\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n</div>\\n\\n<ldap-settings-dn-builder\\n ng-model=\\\"$ctrl.entries\\\"\\n label=\\\"Path to group\\\"\\n suffix=\\\"{{ $ctrl.suffix }}\\\"\\n on-change=\\\"($ctrl.onEntriesChange)\\\"\\n on-remove-click=\\\"($ctrl.removeGroup)\\\"\\n limited-feature-id=\\\"$ctrl.limitedFeatureId\\\"\\n></ldap-settings-dn-builder>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/settings/authentication/ldap/ldap-custom-group-search/ldap-custom-group-search.html';\nvar html = \"<div class=\\\"col-sm-12 form-section-title\\\" style=\\\"float: initial;\\\">\\n Group search configurations\\n</div>\\n\\n<rd-widget ng-repeat=\\\"config in $ctrl.settings | limitTo: (1 - $ctrl.settings)\\\" style=\\\"display: block; margin-bottom: 10px;\\\">\\n <rd-widget-body>\\n <div class=\\\"form-group\\\" ng-if=\\\"$index > 0\\\" style=\\\"margin-bottom: 10px;\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n Extra search configuration\\n </span>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <label for=\\\"ldap_group_basedn_{{ $index }}\\\" class=\\\"col-sm-4 col-md-2 control-label text-left\\\">\\n Group Base DN\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"The distinguished name of the element from which the LDAP server will search for groups.\\\"></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-8 col-md-4\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"ldap_group_basedn_{{ $index }}\\\" ng-model=\\\"config.GroupBaseDN\\\" placeholder=\\\"dc=ldap,dc=domain,dc=tld\\\" />\\n </div>\\n\\n <label for=\\\"ldap_group_att_{{ $index }}\\\" class=\\\"col-sm-4 col-md-2 control-label text-left\\\">\\n Group Membership Attribute\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"LDAP attribute which denotes the group membership.\\\"></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-8 col-md-4\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"ldap_group_att_{{ $index }}\\\" ng-model=\\\"config.GroupAttribute\\\" placeholder=\\\"member\\\" />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\">\\n <label for=\\\"ldap_group_filter_{{ $index }}\\\" class=\\\"col-sm-4 col-md-2 control-label text-left\\\">\\n Group Filter\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"The LDAP search filter used to select group elements, optional.\\\"></portainer-tooltip>\\n </label>\\n <div ng-class=\\\"{ 'col-sm-7 col-md-9': $index, 'col-sm-8 col-md-10': !$index }\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"ldap_group_filter_{{ $index }}\\\" ng-model=\\\"config.GroupFilter\\\" placeholder=\\\"(objectClass=account)\\\" />\\n </div>\\n <div class=\\\"col-sm-1\\\" ng-if=\\\"$index > 0\\\">\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"$ctrl.onRemoveClick($index)\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n </rd-widget-body>\\n</rd-widget>\\n\\n<div class=\\\"form-group\\\" style=\\\"margin-top: 10px;\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button class=\\\"label label-default interactive\\\" style=\\\"border: 0;\\\" ng-click=\\\"$ctrl.onAddClick()\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add group search configuration\\n </button>\\n </div>\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 10px;\\\">\\n <button\\n class=\\\"btn btm-sm btn-primary\\\"\\n type=\\\"button\\\"\\n ng-click=\\\"$ctrl.search()\\\"\\n limited-feature-dir=\\\"{{ $ctrl.limitedFeatureId }}\\\"\\n limited-feature-tabindex=\\\"-1\\\"\\n limited-feature-disabled\\n limited-feature-class=\\\"limited-be\\\"\\n >\\n Display User/Group matching\\n </button>\\n <be-feature-indicator feature=\\\"$ctrl.limitedFeatureId\\\" class=\\\"space-left\\\"></be-feature-indicator>\\n </div>\\n</div>\\n\\n<div ng-if=\\\"$ctrl.showTable\\\">\\n <div class=\\\"form-group\\\">\\n <ldap-groups-datatable dataset=\\\"$ctrl.groups\\\" title-text=\\\"Groups\\\" title-icon=\\\"fa-users\\\" table-key=\\\"ldapGroups\\\"></ldap-groups-datatable>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/settings/authentication/ldap/ldap-custom-admin-group/ldap-custom-admin-group.html';\nvar html = \"<div class=\\\"col-sm-12 form-section-title ldap-custom-admin-group-title\\\" ng-style=\\\"$ctrl.isLimitedFeatureSelfContained && { 'padding-bottom': '15px' }\\\">\\n Auto-populate team admins <be-feature-indicator feature=\\\"$ctrl.limitedFeatureId\\\" class=\\\"space-left\\\" ng-if=\\\"$ctrl.isLimitedFeatureSelfContained\\\"></be-feature-indicator>\\n</div>\\n\\n<rd-widget ng-repeat=\\\"config in $ctrl.settings.AdminGroupSearchSettings | limitTo: (1 - $ctrl.settings.AdminGroupSearchSettings)\\\">\\n <rd-widget-body>\\n <div class=\\\"form-group m-b-10\\\" ng-if=\\\"$index > 0\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n Extra search configuration\\n </span>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <label for=\\\"ldap_admin_group_basedn_{{ $index }}\\\" class=\\\"col-sm-4 col-md-2 control-label text-left\\\">\\n Group Base DN\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"The distinguished name of the element from which the LDAP server will search for groups.\\\"></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-8 col-md-4\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n id=\\\"ldap_admin_group_basedn_{{ $index }}\\\"\\n ng-model=\\\"config.GroupBaseDN\\\"\\n placeholder=\\\"dc=ldap,dc=domain,dc=tld\\\"\\n limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\"\\n limited-feature-class=\\\" {{ $ctrl.isLimitedFeatureSelfContained && 'limited-be' }}\\\"\\n ng-disabled=\\\"{{ $ctrl.isLimitedFeatureSelfContained }}\\\"\\n limited-feature-tabindex=\\\"-1\\\"\\n />\\n </div>\\n\\n <label for=\\\"ldap_admin_group_att_{{ $index }}\\\" class=\\\"col-sm-4 col-md-2 control-label text-left\\\">\\n Group Membership Attribute\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"LDAP attribute which denotes the group membership.\\\"></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-8 col-md-4\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n id=\\\"ldap_admin_group_att_{{ $index }}\\\"\\n ng-model=\\\"config.GroupAttribute\\\"\\n placeholder=\\\"member\\\"\\n limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\"\\n limited-feature-class=\\\" {{ $ctrl.isLimitedFeatureSelfContained && 'limited-be' }}\\\"\\n ng-disabled=\\\"{{ $ctrl.isLimitedFeatureSelfContained }}\\\"\\n limited-feature-tabindex=\\\"-1\\\"\\n />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\">\\n <label for=\\\"ldap_admin_group_filter_{{ $index }}\\\" class=\\\"col-sm-4 col-md-2 control-label text-left\\\">\\n Group Filter\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"The LDAP search filter used to select group elements, optional.\\\"></portainer-tooltip>\\n </label>\\n <div ng-class=\\\"{ 'col-sm-7 col-md-9': $index, 'col-sm-8 col-md-10': !$index }\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n id=\\\"ldap_admin_group_filter_{{ $index }}\\\"\\n ng-model=\\\"config.GroupFilter\\\"\\n placeholder=\\\"(objectClass=groupOfNames)\\\"\\n limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\"\\n limited-feature-class=\\\" {{ $ctrl.isLimitedFeatureSelfContained && 'limited-be' }}\\\"\\n ng-disabled=\\\"{{ $ctrl.isLimitedFeatureSelfContained }}\\\"\\n limited-feature-tabindex=\\\"-1\\\"\\n />\\n </div>\\n <div class=\\\"col-sm-1\\\" ng-if=\\\"$index > 0\\\">\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"$ctrl.onRemoveClick($index)\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n </rd-widget-body>\\n</rd-widget>\\n\\n<div class=\\\"form-group m-t-10\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n class=\\\"label label-default interactive no-border\\\"\\n ng-click=\\\"$ctrl.onAddClick()\\\"\\n limited-feature-dir=\\\"{{ $ctrl.limitedFeatureId }}\\\"\\n limited-feature-class=\\\" {{ $ctrl.isLimitedFeatureSelfContained && 'limited-be' }}\\\"\\n limited-feature-disabled\\n >\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add group search configuration\\n </button>\\n </div>\\n <div class=\\\"col-sm-12 m-t-10\\\">\\n <button\\n class=\\\"btn btm-sm btn-primary\\\"\\n type=\\\"button\\\"\\n ng-click=\\\"$ctrl.search()\\\"\\n limited-feature-dir=\\\"{{ $ctrl.limitedFeatureId }}\\\"\\n limited-feature-class=\\\" {{ $ctrl.isLimitedFeatureSelfContained && 'limited-be' }}\\\"\\n ng-disabled=\\\"{{ $ctrl.isLimitedFeatureSelfContained }}\\\"\\n limited-feature-tabindex=\\\"-1\\\"\\n >\\n Fetch Admin Group(s)\\n </button>\\n <span ng-if=\\\"$ctrl.groups && $ctrl.groups.length === 0\\\" class=\\\"m-l-30\\\"> <i class=\\\"fa fa-exclamation-triangle text-warning\\\" aria-hidden=\\\"true\\\"></i> No groups found</span>\\n </div>\\n</div>\\n\\n<div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label for=\\\"admin-auto-populate\\\" class=\\\"control-label text-left text-muted\\\" ng-class=\\\"{ 'text-muted': !$ctrl.enableAssignAdminGroup }\\\">\\n Assign admin rights to group(s)\\n </label>\\n <label class=\\\"switch m-l-20\\\" ng-class=\\\"{ 'business limited': $ctrl.isLimitedFeatureSelfContained }\\\">\\n <input id=\\\"admin-auto-populate\\\" ng-disabled=\\\"!$ctrl.enableAssignAdminGroup\\\" name=\\\"admin-auto-populate\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.settings.AdminAutoPopulate\\\" /><i></i>\\n </label>\\n </div>\\n</div>\\n\\n<div class=\\\"form-group\\\" ng-if=\\\"$ctrl.settings.AdminAutoPopulate\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label for=\\\"group-access\\\" class=\\\"control-label text-left\\\">\\n Select Group(s)\\n </label>\\n <span\\n class=\\\"m-l-20\\\"\\n isteven-multi-select\\n ng-if=\\\"$ctrl.enableAssignAdminGroup\\\"\\n input-model=\\\"$ctrl.groups\\\"\\n output-model=\\\"$ctrl.selectedAdminGroups\\\"\\n button-label=\\\"name\\\"\\n item-label=\\\"name\\\"\\n tick-property=\\\"selected\\\"\\n helper-elements=\\\"filter\\\"\\n search-property=\\\"name\\\"\\n translation=\\\"{nothingSelected: 'Select one or more groups', search: 'Search...'}\\\"\\n >\\n </span>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/settings/authentication/ldap/ldap-settings-security/ldap-settings-security.html';\nvar html = \"<div class=\\\"col-sm-12 form-section-title\\\">\\n {{ $ctrl.title || 'LDAP security' }}\\n</div>\\n\\n<!-- starttls -->\\n<div class=\\\"form-group\\\" ng-if=\\\"!$ctrl.settings.TLSConfig.TLS\\\">\\n <label for=\\\"tls\\\" class=\\\"control-label col-sm-3 text-left\\\" style=\\\"padding-top: 0;\\\">\\n Use StartTLS\\n <portainer-tooltip\\n position=\\\"bottom\\\"\\n message=\\\"Enable this option if want to use StartTLS to secure the connection to the server. Ignored if Use TLS is selected.\\\"\\n ></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-9\\\">\\n <label class=\\\"switch\\\">\\n <input type=\\\"checkbox\\\" ng-model=\\\"$ctrl.settings.StartTLS\\\" limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\" limited-feature-tabindex=\\\"-1\\\" /><i></i>\\n </label>\\n </div>\\n</div>\\n<!-- !starttls -->\\n\\n<!-- tls-checkbox -->\\n<div class=\\\"form-group\\\" ng-if=\\\"!$ctrl.settings.StartTLS\\\">\\n <label for=\\\"tls\\\" class=\\\"control-label col-sm-3 text-left\\\" style=\\\"padding-top: 0;\\\">\\n Use TLS\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"Enable this option if you need to specify TLS certificates to connect to the LDAP server.\\\"></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-9\\\">\\n <label class=\\\"switch\\\">\\n <input type=\\\"checkbox\\\" ng-model=\\\"$ctrl.settings.TLSConfig.TLS\\\" limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\" limited-feature-tabindex=\\\"-1\\\" /><i></i>\\n </label>\\n </div>\\n</div>\\n<!-- !tls-checkbox -->\\n\\n<!-- tls-skip-verify -->\\n<div class=\\\"form-group\\\">\\n <label for=\\\"tls\\\" class=\\\"control-label col-sm-3 text-left\\\" style=\\\"padding-top: 0;\\\">\\n Skip verification of server certificate\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"Skip the verification of the server TLS certificate. Not recommended on unsecured networks.\\\"></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-9\\\">\\n <label class=\\\"switch\\\">\\n <input type=\\\"checkbox\\\" ng-model=\\\"$ctrl.settings.TLSConfig.TLSSkipVerify\\\" limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\" limited-feature-tabindex=\\\"-1\\\" /><i></i>\\n </label>\\n </div>\\n</div>\\n<!-- !tls-skip-verify -->\\n\\n<!-- ca-input -->\\n<div class=\\\"form-group\\\" ng-if=\\\"$ctrl.settings.TLSConfig.TLS || ($ctrl.settings.StartTLS && !$ctrl.settings.TLSConfig.TLSSkipVerify)\\\">\\n <label class=\\\"col-sm-3 control-label text-left\\\">TLS CA certificate</label>\\n <div class=\\\"col-sm-9\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-primary\\\"\\n ngf-select=\\\"$ctrl.onTlscaCertChange($file)\\\"\\n ng-model=\\\"$ctrl.tlscaCert\\\"\\n limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\"\\n limited-feature-tabindex=\\\"-1\\\"\\n >\\n Select file\\n </button>\\n <span style=\\\"margin-left: 5px;\\\">\\n {{ $ctrl.tlscaCert.name }}\\n <i class=\\\"fa fa-check green-icon\\\" ng-if=\\\"$ctrl.tlscaCert && $ctrl.tlscaCert === $ctrl.settings.TLSConfig.TLSCACert\\\" aria-hidden=\\\"true\\\"></i>\\n <i class=\\\"fa fa-times red-icon\\\" ng-if=\\\"!$ctrl.tlscaCert\\\" aria-hidden=\\\"true\\\"></i>\\n <i class=\\\"fa fa-circle-notch fa-spin\\\" ng-if=\\\"$ctrl.uploadInProgress\\\"></i>\\n </span>\\n </div>\\n</div>\\n<!-- !ca-input -->\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/settings/authentication/ldap/ldap-settings-test-login/ldap-settings-test-login.html';\nvar html = \"<div class=\\\"col-sm-12 form-section-title\\\" ng-style=\\\"$ctrl.isLimitedFeatureSelfContained && { 'padding-bottom': '15px' }\\\">\\n Test login\\n <be-feature-indicator\\n ng-if=\\\"$ctrl.showBeIndicatorIfNeeded\\\"\\n feature=\\\"$ctrl.limitedFeatureId\\\"\\n class=\\\"space-left\\\"\\n ng-if=\\\"$ctrl.isLimitedFeatureSelfContained\\\"\\n ></be-feature-indicator>\\n</div>\\n<div class=\\\"form-inline\\\">\\n <div class=\\\"form-group\\\" style=\\\"margin: 0;\\\">\\n <label for=\\\"ldap_test_username\\\" style=\\\"font-size: 0.9em; margin-right: 5px;\\\">\\n Username\\n </label>\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n id=\\\"ldap_test_username\\\"\\n ng-model=\\\"$ctrl.username\\\"\\n limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\"\\n limited-feature-class=\\\" {{ $ctrl.isLimitedFeatureSelfContained && 'limited-be' }}\\\"\\n ng-disabled=\\\"{{ $ctrl.isLimitedFeatureSelfContained }}\\\"\\n limited-feature-tabindex=\\\"-1\\\"\\n />\\n </div>\\n\\n <div class=\\\"form-group no-margin\\\">\\n <label for=\\\"ldap_test_password\\\">\\n Password\\n </label>\\n <input\\n type=\\\"password\\\"\\n class=\\\"form-control\\\"\\n id=\\\"ldap_test_password\\\"\\n ng-model=\\\"$ctrl.password\\\"\\n autocomplete=\\\"new-password\\\"\\n limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\"\\n limited-feature-class=\\\" {{ $ctrl.isLimitedFeatureSelfContained && 'limited-be' }}\\\"\\n ng-disabled=\\\"{{ $ctrl.isLimitedFeatureSelfContained }}\\\"\\n limited-feature-tabindex=\\\"-1\\\"\\n />\\n </div>\\n\\n <div class=\\\"form-group no-margin\\\">\\n <button\\n type=\\\"submit\\\"\\n class=\\\"btn btn-primary\\\"\\n ng-disabled=\\\"$ctrl.state.testStatus === $ctrl.TEST_STATUS.LOADING || !$ctrl.username || !$ctrl.password\\\"\\n ng-click=\\\"$ctrl.testLogin($ctrl.username, $ctrl.password)\\\"\\n limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\"\\n limited-feature-class=\\\" {{ $ctrl.isLimitedFeatureSelfContained && 'limited-be' }}\\\"\\n limited-feature-tabindex=\\\"-1\\\"\\n >\\n <span ng-if=\\\"$ctrl.state.testStatus !== $ctrl.TEST_STATUS.LOADING\\\">Test</span>\\n <span ng-if=\\\"$ctrl.state.testStatus === $ctrl.TEST_STATUS.LOADING\\\">Testing...</span>\\n </button>\\n <i ng-if=\\\"$ctrl.state.testStatus === $ctrl.TEST_STATUS.SUCCESS\\\" class=\\\"fa fa-check green-icon\\\"></i>\\n <i ng-if=\\\"$ctrl.state.testStatus === $ctrl.TEST_STATUS.FAILURE\\\" class=\\\"fa fa-times red-icon\\\"></i>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/settings/authentication/ldap/ldap-custom-user-search/ldap-custom-user-search.html';\nvar html = \"<div class=\\\"col-sm-12 form-section-title\\\" style=\\\"float: initial;\\\">\\n User search configurations\\n</div>\\n\\n<rd-widget ng-repeat=\\\"config in $ctrl.settings | limitTo: (1 - $ctrl.settings)\\\" style=\\\"display: block; margin-bottom: 10px;\\\">\\n <rd-widget-body>\\n <div class=\\\"form-group\\\" ng-if=\\\"$index > 0\\\" style=\\\"margin-bottom: 10px;\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n Extra search configuration\\n </span>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <label for=\\\"ldap_basedn_{{ $index }}\\\" class=\\\"col-sm-4 col-md-2 control-label text-left\\\">\\n Base DN\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"The distinguished name of the element from which the LDAP server will search for users.\\\"></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-8 col-md-4\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"ldap_basedn_{{ $index }}\\\" ng-model=\\\"config.BaseDN\\\" placeholder=\\\"dc=ldap,dc=domain,dc=tld\\\" />\\n </div>\\n\\n <label for=\\\"ldap_username_att_{{ $index }}\\\" class=\\\"col-sm-4 col-md-3 col-lg-2 control-label text-left\\\">\\n Username attribute\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"LDAP attribute which denotes the username.\\\"></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-8 col-md-3 col-lg-4\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"ldap_username_att_{{ $index }}\\\" ng-model=\\\"config.UserNameAttribute\\\" placeholder=\\\"uid\\\" />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\">\\n <label for=\\\"ldap_filter_{{ $index }}\\\" class=\\\"col-sm-4 col-md-2 control-label text-left\\\">\\n Filter\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"The LDAP search filter used to select user elements, optional.\\\"></portainer-tooltip>\\n </label>\\n <div ng-class=\\\"{ 'col-sm-7 col-md-9': $index, 'col-sm-8 col-md-10': !$index }\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"ldap_filter_{{ $index }}\\\" ng-model=\\\"config.Filter\\\" placeholder=\\\"(objectClass=account)\\\" />\\n </div>\\n <div class=\\\"col-sm-1\\\" ng-if=\\\"$index > 0\\\">\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"$ctrl.onRemoveClick($index)\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n </rd-widget-body>\\n</rd-widget>\\n\\n<div class=\\\"form-group\\\" style=\\\"margin-top: 10px;\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button class=\\\"label label-default interactive\\\" style=\\\"border: 0;\\\" ng-click=\\\"$ctrl.onAddClick()\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add user search configuration\\n </button>\\n </div>\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 10px;\\\">\\n <button\\n class=\\\"btn btm-sm btn-primary\\\"\\n type=\\\"button\\\"\\n ng-click=\\\"$ctrl.search()\\\"\\n limited-feature-dir=\\\"{{ $ctrl.limitedFeatureId }}\\\"\\n limited-feature-disabled\\n limited-feature-class=\\\"limited-be\\\"\\n limited-feature-tabindex=\\\"-1\\\"\\n >\\n Display Users\\n </button>\\n <be-feature-indicator feature=\\\"$ctrl.limitedFeatureId\\\" class=\\\"space-left\\\"></be-feature-indicator>\\n </div>\\n</div>\\n\\n<div ng-if=\\\"$ctrl.showTable\\\">\\n <div class=\\\"form-group\\\">\\n <ldap-users-datatable dataset=\\\"$ctrl.users\\\" title-text=\\\"Users\\\" title-icon=\\\"fa-users\\\" table-key=\\\"ldapUsers\\\" order-by=\\\"\\\" reverse-order=\\\"\\\"></ldap-users-datatable>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/settings/authentication/ldap/ldap-users-datatable/ldap-users-datatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n auto-focus\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Name')\\\">\\n Name\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit)) track by $index\\\"\\n ng-class=\\\"{ active: item.Checked }\\\"\\n >\\n <td>\\n <a ui-sref=\\\"portainer.groups.group({id: item.Id})\\\">{{ item }}</a>\\n </td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"3\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"5\\\" class=\\\"text-center text-muted\\\">No users found.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/settings/authentication/auto-user-provision-toggle/auto-user-provision-toggle.html';\nvar html = \"<div class=\\\"col-sm-12 form-section-title\\\">\\n Automatic user provisioning\\n</div>\\n<div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\" ng-transclude=\\\"description\\\"> </span>\\n</div>\\n<div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label for=\\\"tls\\\" class=\\\"control-label text-left\\\">\\n Automatic user provisioning\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\"> <input type=\\\"checkbox\\\" ng-model=\\\"$ctrl.ngModel\\\" /><i></i> </label>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/settings/authentication/save-auth-settings-button/save-auth-settings-button.html';\nvar html = \"<div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n</div>\\n<div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n ng-class=\\\"[$ctrl.className, 'btn btn-primary btn-sm']\\\"\\n ng-click=\\\"$ctrl.onSaveSettings()\\\"\\n ng-disabled=\\\"$ctrl.saveButtonDisabled || $ctrl.saveButtonState\\\"\\n button-spinner=\\\"$ctrl.saveButtonState\\\"\\n limited-feature-dir=\\\"{{::$ctrl.limitedFeatureId}}\\\"\\n limited-feature-class=\\\"{{::$ctrl.limitedFeatureClass}}\\\"\\n >\\n <span ng-hide=\\\"$ctrl.saveButtonState\\\">Save settings</span>\\n <span ng-show=\\\"$ctrl.saveButtonState\\\">Saving...</span>\\n </button>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/settings/authentication/internal-auth/internal-auth.html';\nvar html = \"<div class=\\\"col-sm-12 form-section-title\\\">\\n Information\\n</div>\\n<div class=\\\"form-group col-sm-12 text-muted small\\\">\\n When using internal authentication, Portainer will encrypt user passwords and store credentials locally.\\n</div>\\n\\n<save-auth-settings-button on-save-settings=\\\"($ctrl.onSaveSettings)\\\" save-button-state=\\\"($ctrl.saveButtonState)\\\"></save-auth-settings-button>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/settings/general/ssl-certificate/ssl-certificate.html';\nvar html = \"<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-key\\\" title-text=\\\"SSL certificate\\\"></rd-widget-header>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\" name=\\\"$ctrl.sslForm\\\">\\n <span class=\\\"small\\\">\\n <p class=\\\"text-muted\\\">\\n <i class=\\\"fa fa-exclamation-circle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Forcing HTTPs only will cause Portainer to stop listening on the HTTP port. Any edge agent environment that is using HTTP will no longer be available.\\n </p>\\n </span>\\n\\n <por-switch-field ng-model=\\\"$ctrl.formValues.forceHTTPS\\\" label=\\\"Force HTTPS only\\\" on-change=\\\"($ctrl.onChangeForceHTTPS)\\\"></por-switch-field>\\n\\n <hr />\\n\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12\\\">\\n Provide a new SSL Certificate to replace the existing one that is used for HTTPS connections.\\n </span>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12\\\">\\n Upload a X.509 certificate, commonly a crt, a cer, or a pem file.\\n </span>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button class=\\\"btn btn-sm btn-primary\\\" ngf-select ng-model=\\\"$ctrl.formValues.certFile\\\" ngf-pattern=\\\"$ctrl.certFilePattern\\\" name=\\\"certFile\\\">\\n Select file\\n </button>\\n <span style=\\\"margin-left: 5px;\\\">\\n {{ $ctrl.formValues.certFile.name }}\\n <i class=\\\"fa fa-times red-icon\\\" ng-if=\\\"!$ctrl.formValues.certFile\\\" aria-hidden=\\\"true\\\"></i>\\n </span>\\n </div>\\n </div>\\n <div class=\\\"form-group col-md-12\\\" ng-show=\\\"$ctrl.sslForm.certFile.$invalid\\\">\\n <div class=\\\"small text-warning\\\">\\n <div ng-messages=\\\"$ctrl.sslForm.certFile.$error\\\">\\n <p ng-message=\\\"pattern\\\"> <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> File type is invalid.</p>\\n </div>\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12\\\">\\n Upload a private key, commonly a key, or a pem file.\\n </span>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button class=\\\"btn btn-sm btn-primary\\\" ngf-select ng-model=\\\"$ctrl.formValues.keyFile\\\" ngf-pattern=\\\"$ctrl.keyFilePattern\\\" name=\\\"keyFile\\\">\\n Select file\\n </button>\\n <span style=\\\"margin-left: 5px;\\\">\\n {{ $ctrl.formValues.keyFile.name }}\\n <i class=\\\"fa fa-times red-icon\\\" ng-if=\\\"!$ctrl.formValues.keyFile\\\" aria-hidden=\\\"true\\\"></i>\\n </span>\\n </div>\\n </div>\\n <div class=\\\"form-group col-md-12\\\" ng-show=\\\"$ctrl.sslForm.keyFile.$invalid\\\">\\n <div class=\\\"small text-warning\\\">\\n <div ng-messages=\\\"$ctrl.sslForm.keyFile.$error\\\">\\n <p ng-message=\\\"pattern\\\"> <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> File type is invalid.</p>\\n </div>\\n </div>\\n </div>\\n\\n <hr />\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"$ctrl.state.actionInProgress || !$ctrl.isFormChanged()\\\"\\n ng-click=\\\"$ctrl.save()\\\"\\n button-spinner=\\\"$ctrl.state.actionInProgress\\\"\\n analytics-on\\n analytics-if=\\\"$ctrl.wasHTTPsChanged()\\\"\\n analytics-category=\\\"portainer\\\"\\n analytics-event=\\\"portainer-settings-edit\\\"\\n analytics-properties=\\\"{ metadata: { forceHTTPS: $ctrl.formValues.forceHTTPS } }\\\"\\n >\\n <span ng-hide=\\\"$ctrl.state.actionInProgress || $ctrl.state.reloadingPage\\\">Apply Changes</span>\\n <span ng-show=\\\"$ctrl.state.actionInProgress\\\">Saving in progress...</span>\\n <span ng-show=\\\"$ctrl.state.reloadingPage\\\">Reloading Page...</span>\\n </button>\\n <span class=\\\"text-danger\\\" ng-if=\\\"state.formValidationError\\\" style=\\\"margin-left: 5px;\\\">{{ state.formValidationError }}</span>\\n </div>\\n </div>\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/user-activity/auth-logs-view/auth-logs-view.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"User Activity\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"Refresh\\\" ui-sref=\\\"portainer.authLogs\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content>User authentication activity</rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"be-indicator-container\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <div class=\\\"form-horizontal\\\">\\n <div class=\\\"form-group\\\">\\n <label for=\\\"dateRangeInput\\\" class=\\\"col-sm-2 control-label text-left\\\">Date Range</label>\\n <div class=\\\"col-sm-6\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" disabled />\\n </div>\\n </div>\\n </div>\\n\\n <p class=\\\"text-muted small\\\">\\n <i class=\\\"fa fa-info-circle blue-icon space-right\\\" aria-hidden=\\\"true\\\"></i>\\n Portainer user authentication activity logs have a maximum retention of 7 days.\\n </p>\\n\\n <div>\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary m-r-10\\\" limited-feature-dir=\\\"{{::$ctrl.limitedFeature}}\\\" limited-feature-class=\\\"limited-be\\\" limited-feature-disabled\\n ><i class=\\\"fa fa-download space-right\\\" aria-hidden=\\\"true\\\"></i>Export as CSV\\n </button>\\n <be-feature-indicator feature=\\\"$ctrl.limitedFeature\\\"></be-feature-indicator>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n\\n <auth-logs-datatable\\n logs=\\\"$ctrl.state.logs\\\"\\n keyword=\\\"$ctrl.state.keyword\\\"\\n sort=\\\"$ctrl.state.sort\\\"\\n limit=\\\"$ctrl.state.limit\\\"\\n context-filter=\\\"$ctrl.state.contextFilter\\\"\\n type-filter=\\\"$ctrl.state.typeFilter\\\"\\n total-items=\\\"$ctrl.state.totalItems\\\"\\n current-page=\\\"$ctrl.state.currentPage\\\"\\n feature=\\\"{{:: $ctrl.limitedFeature}}\\\"\\n on-change-context-filter=\\\"($ctrl.onChangeContextFilter)\\\"\\n on-change-type-filter=\\\"($ctrl.onChangeTypeFilter)\\\"\\n on-change-keyword=\\\"($ctrl.onChangeKeyword)\\\"\\n on-change-sort=\\\"($ctrl.onChangeSort)\\\"\\n on-change-limit=\\\"($ctrl.onChangeLimit)\\\"\\n on-change-page=\\\"($ctrl.onChangePage)\\\"\\n ></auth-logs-datatable>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/user-activity/auth-logs-view/auth-logs-datatable/auth-logs-datatable.html';\nvar html = \"<div class=\\\"datatable datatable-empty\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <datatable-titlebar title=\\\"Authentication Events\\\" icon=\\\"fa-history\\\" feature=\\\"{{::$ctrl.feature}}\\\"></datatable-titlebar>\\n <datatable-searchbar on-change=\\\"($ctrl.onChangeKeyword)\\\" ng-model=\\\"$ctrl.keyword\\\"></datatable-searchbar>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th>\\n <a>\\n Time\\n <datatable-sort-icon key=\\\"Timestamp\\\" selected-sort-key=\\\"{{ $ctrl.sort.key }}\\\" reverse-order=\\\"$ctrl.sort.desc\\\"></datatable-sort-icon>\\n </a>\\n </th>\\n <th>\\n <a>\\n Origin\\n <datatable-sort-icon key=\\\"Origin\\\" selected-sort-key=\\\"{{ $ctrl.sort.key }}\\\" reverse-order=\\\"$ctrl.sort.desc\\\"></datatable-sort-icon>\\n </a>\\n </th>\\n <th>\\n <a>\\n Context\\n <datatable-sort-icon key=\\\"Context\\\" selected-sort-key=\\\"{{ $ctrl.sort.key }}\\\" reverse-order=\\\"$ctrl.sort.desc\\\"></datatable-sort-icon>\\n </a>\\n <datatable-filter labels=\\\"$ctrl.contextFilterLabels\\\" filter-key=\\\"context\\\" state=\\\"$ctrl.contextFilter\\\" on-change=\\\"($ctrl.onChangeContextFilter)\\\"> </datatable-filter>\\n </th>\\n <th>\\n <a>\\n User\\n <datatable-sort-icon key=\\\"Username\\\" selected-sort-key=\\\"{{ $ctrl.sort.key }}\\\" reverse-order=\\\"$ctrl.sort.desc\\\"></datatable-sort-icon>\\n </a>\\n </th>\\n <th>\\n Result\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr dir-paginate=\\\"item in $ctrl.logs | itemsPerPage: $ctrl.limit\\\" total-items=\\\"$ctrl.totalItems\\\" current-page=\\\"$ctrl.currentPage\\\">\\n <td></td>\\n <td></td>\\n <td></td>\\n <td></td>\\n <td></td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.logs\\\">\\n <td class=\\\"text-center text-muted\\\" colspan=\\\"5\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.logs.length === 0\\\">\\n <td class=\\\"text-center text-muted\\\" colspan=\\\"8\\\">\\n No logs available.\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.logs\\\">\\n <datatable-pagination limit=\\\"$ctrl.limit\\\" on-change-limit=\\\"($ctrl.handleChangeLimit)\\\" on-change-page=\\\"($ctrl.onChangePage)\\\"></datatable-pagination>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/user-activity/activity-logs-view/activity-logs-view.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"User Activity\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"Refresh\\\" ui-sref=\\\".\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content>Activity Logs</rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"be-indicator-container\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <div class=\\\"form-horizontal\\\">\\n <div class=\\\"form-group\\\">\\n <label for=\\\"dateRangeInput\\\" class=\\\"col-sm-2 control-label text-left\\\">Date Range</label>\\n <div class=\\\"col-sm-6\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" disabled />\\n </div>\\n </div>\\n </div>\\n\\n <p class=\\\"text-muted small\\\">\\n <i class=\\\"fa fa-info-circle blue-icon space-right\\\" aria-hidden=\\\"true\\\"></i>\\n Portainer user activity logs have a maximum retention of 7 days.\\n </p>\\n\\n <div>\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary m-r-10\\\" limited-feature-dir=\\\"{{::$ctrl.limitedFeature}}\\\" limited-feature-class=\\\"limited-be\\\" limited-feature-disabled>\\n <i class=\\\"fa fa-download space-right\\\" aria-hidden=\\\"true\\\"></i>Export as CSV\\n </button>\\n <be-feature-indicator feature=\\\"$ctrl.limitedFeature\\\"></be-feature-indicator>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n\\n <activity-logs-datatable\\n logs=\\\"$ctrl.state.logs\\\"\\n keyword=\\\"$ctrl.state.keyword\\\"\\n sort=\\\"$ctrl.state.sort\\\"\\n limit=\\\"$ctrl.state.limit\\\"\\n context-filter=\\\"$ctrl.state.contextFilter\\\"\\n total-items=\\\"$ctrl.state.totalItems\\\"\\n current-page=\\\"$ctrl.state.currentPage\\\"\\n feature=\\\"{{:: $ctrl.limitedFeature}}\\\"\\n on-change-keyword=\\\"($ctrl.onChangeKeyword)\\\"\\n on-change-sort=\\\"($ctrl.onChangeSort)\\\"\\n on-change-limit=\\\"($ctrl.onChangeLimit)\\\"\\n on-change-page=\\\"($ctrl.onChangePage)\\\"\\n ></activity-logs-datatable>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/user-activity/activity-logs-view/activity-logs-datatable/activity-logs-datatable.html';\nvar html = \"<div class=\\\"datatable datatable-empty\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <datatable-titlebar title=\\\"Activity Logs\\\" icon=\\\"fa-history\\\" feature=\\\"{{::$ctrl.feature}}\\\"></datatable-titlebar>\\n <datatable-searchbar on-change=\\\"($ctrl.onChangeKeyword)\\\" ng-model=\\\"$ctrl.keyword\\\"></datatable-searchbar>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover\\\">\\n <thead>\\n <tr>\\n <th class=\\\"small-column\\\">\\n <a ng-click=\\\"$ctrl.changeSort('Timestamp')\\\">\\n Time\\n <datatable-sort-icon key=\\\"Timestamp\\\" selected-sort-key=\\\"{{ $ctrl.sort.key }}\\\" reverse-order=\\\"$ctrl.sort.desc\\\"></datatable-sort-icon>\\n </a>\\n </th>\\n <th class=\\\"small-column\\\">\\n <a ng-click=\\\"$ctrl.changeSort('Username')\\\">\\n User\\n <datatable-sort-icon key=\\\"Username\\\" selected-sort-key=\\\"{{ $ctrl.sort.key }}\\\" reverse-order=\\\"$ctrl.sort.desc\\\"></datatable-sort-icon>\\n </a>\\n </th>\\n <th class=\\\"small-column\\\">\\n <a ng-click=\\\"$ctrl.changeSort('Context')\\\">\\n Environment\\n <datatable-sort-icon key=\\\"Context\\\" selected-sort-key=\\\"{{ $ctrl.sort.key }}\\\" reverse-order=\\\"$ctrl.sort.desc\\\"></datatable-sort-icon>\\n </a>\\n </th>\\n\\n <th>\\n Action\\n </th>\\n <th>\\n Payload\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr dir-paginate-start=\\\"item in $ctrl.logs | itemsPerPage: $ctrl.limit\\\" total-items=\\\"$ctrl.totalItems\\\" current-page=\\\"$ctrl.currentPage\\\">\\n <td></td>\\n <td></td>\\n <td></td>\\n <td></td>\\n <td></td>\\n </tr>\\n <tr dir-paginate-end ng-show=\\\"item.Expanded\\\">\\n <td colspan=\\\"5\\\">\\n <json-tree object=\\\"item.payload\\\" root-name=\\\"containerInfo.Id\\\" start-expanded=\\\"true\\\"></json-tree>\\n </td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.logs\\\">\\n <td class=\\\"text-center text-muted\\\" colspan=\\\"5\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.logs.length === 0\\\">\\n <td class=\\\"text-center text-muted\\\" colspan=\\\"8\\\">\\n No logs available.\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.logs\\\">\\n <datatable-pagination limit=\\\"$ctrl.limit\\\" on-change-limit=\\\"($ctrl.handleChangeLimit)\\\" on-change-page=\\\"($ctrl.onChangePage)\\\"></datatable-pagination>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var map = {\n\t\"./__mocks__/fileMock.js\": 1038,\n\t\"./__mocks__/styleMock.js\": 1039,\n\t\"./__module.js\": 689,\n\t\"./agent/components/file-uploader/fileUploaderController.js\": 547,\n\t\"./agent/components/file-uploader/index.js\": 1040,\n\t\"./agent/components/files-datatable/index.js\": 1042,\n\t\"./agent/components/host-browser/hostBrowserController.js\": 548,\n\t\"./agent/components/host-browser/index.js\": 1044,\n\t\"./agent/components/node-selector/index.js\": 1046,\n\t\"./agent/components/node-selector/nodeSelectorController.js\": 549,\n\t\"./agent/components/volume-browser/index.js\": 1048,\n\t\"./agent/components/volume-browser/volumeBrowserController.js\": 550,\n\t\"./agent/index.js\": 731,\n\t\"./agent/models/agent.js\": 551,\n\t\"./agent/rest/agent.js\": 1050,\n\t\"./agent/rest/browse.js\": 1051,\n\t\"./agent/rest/dockerhub.js\": 1052,\n\t\"./agent/rest/host.js\": 1053,\n\t\"./agent/rest/ping.js\": 1054,\n\t\"./agent/rest/response/browse.js\": 292,\n\t\"./agent/rest/v1/agent.js\": 1055,\n\t\"./agent/rest/v1/browse.js\": 1056,\n\t\"./agent/services/agentService.js\": 1057,\n\t\"./agent/services/hostBrowserService.js\": 1058,\n\t\"./agent/services/pingService.js\": 1059,\n\t\"./agent/services/volumeBrowserService.js\": 1060,\n\t\"./angulartics.matomo/index.js\": 454,\n\t\"./app.js\": 1061,\n\t\"./assets/css/index.js\": 805,\n\t\"./azure/_module.js\": 732,\n\t\"./azure/components/azure-endpoint-config/azure-endpoint-config.js\": 1062,\n\t\"./azure/components/azure-sidebar/index.js\": 1064,\n\t\"./azure/components/datatables/containergroups-datatable/containerGroupsDatatable.js\": 1066,\n\t\"./azure/models/container_group.js\": 227,\n\t\"./azure/models/location.js\": 552,\n\t\"./azure/models/provider.js\": 553,\n\t\"./azure/models/resource_group.js\": 370,\n\t\"./azure/models/subscription.js\": 371,\n\t\"./azure/rest/azure.js\": 1068,\n\t\"./azure/rest/container_group.js\": 1069,\n\t\"./azure/rest/location.js\": 1070,\n\t\"./azure/rest/provider.js\": 1071,\n\t\"./azure/rest/resource_group.js\": 1072,\n\t\"./azure/rest/subscription.js\": 1073,\n\t\"./azure/services/azureService.js\": 1074,\n\t\"./azure/services/containerGroupService.js\": 1075,\n\t\"./azure/services/locationService.js\": 1076,\n\t\"./azure/services/providerService.js\": 1077,\n\t\"./azure/services/resourceGroupService.js\": 1078,\n\t\"./azure/services/subscriptionService.js\": 1079,\n\t\"./azure/views/containerinstances/container-instance-details/containerInstanceDetailsController.js\": 554,\n\t\"./azure/views/containerinstances/container-instance-details/index.js\": 1080,\n\t\"./azure/views/containerinstances/containerInstancesController.js\": 1082,\n\t\"./azure/views/containerinstances/create/createContainerInstanceController.js\": 1083,\n\t\"./azure/views/dashboard/dashboardController.js\": 1084,\n\t\"./config.js\": 1085,\n\t\"./constants.js\": 103,\n\t\"./docker/__module.js\": 733,\n\t\"./docker/components/container-capabilities/container-capabilities.js\": 1123,\n\t\"./docker/components/container-quick-actions/containerQuickActions.js\": 1125,\n\t\"./docker/components/container-restart-policy/container-restart-policy-controller.js\": 1127,\n\t\"./docker/components/container-restart-policy/container-restart-policy.js\": 1128,\n\t\"./docker/components/dashboard-cluster-agent-info/dashboard-cluster-agent-info.js\": 1130,\n\t\"./docker/components/dashboard-cluster-agent-info/dashboardClusterAgentInfoController.js\": 1132,\n\t\"./docker/components/datatables/configs-datatable/configsDatatable.js\": 1133,\n\t\"./docker/components/datatables/container-networks-datatable/containerNetworksDatatable.js\": 1135,\n\t\"./docker/components/datatables/container-networks-datatable/containerNetworksDatatableController.js\": 1137,\n\t\"./docker/components/datatables/container-processes-datatable/containerProcessesDatatable.js\": 1138,\n\t\"./docker/components/datatables/containers-datatable/actions/containersDatatableActions.js\": 1140,\n\t\"./docker/components/datatables/containers-datatable/actions/containersDatatableActionsController.js\": 1142,\n\t\"./docker/components/datatables/containers-datatable/containersDatatable.js\": 1143,\n\t\"./docker/components/datatables/containers-datatable/containersDatatableController.js\": 1145,\n\t\"./docker/components/datatables/events-datatable/eventsDatatable.js\": 1146,\n\t\"./docker/components/datatables/images-datatable/imagesDatatable.js\": 1148,\n\t\"./docker/components/datatables/images-datatable/imagesDatatableController.js\": 1150,\n\t\"./docker/components/datatables/macvlan-nodes-datatable/macvlanNodesDatatable.js\": 1151,\n\t\"./docker/components/datatables/networks-datatable/network-row-content/networkRowContent.js\": 1153,\n\t\"./docker/components/datatables/networks-datatable/networksDatatable.js\": 1155,\n\t\"./docker/components/datatables/networks-datatable/networksDatatableController.js\": 1157,\n\t\"./docker/components/datatables/node-tasks-datatable/nodeTasksDatatable.js\": 1158,\n\t\"./docker/components/datatables/nodes-datatable/nodesDatatable.js\": 1160,\n\t\"./docker/components/datatables/secrets-datatable/secretsDatatable.js\": 1162,\n\t\"./docker/components/datatables/service-tasks-datatable/serviceTasksDatatable.js\": 1164,\n\t\"./docker/components/datatables/service-tasks-datatable/serviceTasksDatatableController.js\": 1166,\n\t\"./docker/components/datatables/services-datatable/actions/servicesDatatableActions.js\": 1167,\n\t\"./docker/components/datatables/services-datatable/actions/servicesDatatableActionsController.js\": 1169,\n\t\"./docker/components/datatables/services-datatable/servicesDatatable.js\": 1170,\n\t\"./docker/components/datatables/services-datatable/servicesDatatableController.js\": 1172,\n\t\"./docker/components/datatables/tasks-datatable/tasksDatatable.js\": 1173,\n\t\"./docker/components/datatables/tasks-datatable/tasksDatatableController.js\": 1175,\n\t\"./docker/components/datatables/volumes-datatable/volumesDatatable.js\": 1176,\n\t\"./docker/components/datatables/volumes-datatable/volumesDatatableController.js\": 1178,\n\t\"./docker/components/docker-sidebar/docker-sidebar.js\": 1179,\n\t\"./docker/components/host-overview/host-overview.js\": 1181,\n\t\"./docker/components/host-view-panels/devices-panel/devices-panel.js\": 1183,\n\t\"./docker/components/host-view-panels/disks-panel/disks-panel.js\": 1185,\n\t\"./docker/components/host-view-panels/engine-details-panel/engine-details-panel.js\": 1187,\n\t\"./docker/components/host-view-panels/host-details-panel/host-details-panel.js\": 1189,\n\t\"./docker/components/host-view-panels/node-availability-select/node-availability-select-controller.js\": 1191,\n\t\"./docker/components/host-view-panels/node-availability-select/node-availability-select.js\": 1192,\n\t\"./docker/components/host-view-panels/node-labels-table/node-labels-table-controller.js\": 1194,\n\t\"./docker/components/host-view-panels/node-labels-table/node-labels-table.js\": 1195,\n\t\"./docker/components/host-view-panels/swarm-node-details-panel/swarm-node-details-panel-controller.js\": 1197,\n\t\"./docker/components/host-view-panels/swarm-node-details-panel/swarm-node-details-panel.js\": 1198,\n\t\"./docker/components/imageRegistry/por-image-registry-rate-limits.controller.js\": 555,\n\t\"./docker/components/imageRegistry/por-image-registry-rate-limits.js\": 1200,\n\t\"./docker/components/imageRegistry/por-image-registry.controller.js\": 1202,\n\t\"./docker/components/imageRegistry/por-image-registry.js\": 1203,\n\t\"./docker/components/log-viewer/log-viewer.js\": 1205,\n\t\"./docker/components/log-viewer/logViewerController.js\": 1207,\n\t\"./docker/components/network-macvlan-form/network-macvlan-form.js\": 1208,\n\t\"./docker/components/network-macvlan-form/networkMacvlanFormController.js\": 1210,\n\t\"./docker/components/network-macvlan-form/networkMacvlanFormModel.js\": 556,\n\t\"./docker/components/volumesCIFSForm/volumesCifsForm.js\": 1211,\n\t\"./docker/components/volumesCIFSForm/volumesCifsFormModel.js\": 557,\n\t\"./docker/components/volumesNFSForm/volumes-nfs-form.js\": 1213,\n\t\"./docker/components/volumesNFSForm/volumesNFSFormModel.js\": 558,\n\t\"./docker/filters/filters.js\": 1215,\n\t\"./docker/helpers/configHelper.js\": 1216,\n\t\"./docker/helpers/constraintsHelper.js\": 1217,\n\t\"./docker/helpers/containerHelper.js\": 1218,\n\t\"./docker/helpers/imageHelper.js\": 220,\n\t\"./docker/helpers/infoHelper.js\": 1219,\n\t\"./docker/helpers/labelHelper.js\": 1220,\n\t\"./docker/helpers/logHelper.js\": 1221,\n\t\"./docker/helpers/networkHelper.js\": 228,\n\t\"./docker/helpers/nodeHelper.js\": 1226,\n\t\"./docker/helpers/secretHelper.js\": 1227,\n\t\"./docker/helpers/serviceHelper.js\": 1228,\n\t\"./docker/helpers/taskHelper.js\": 1229,\n\t\"./docker/helpers/volumeHelper.js\": 1230,\n\t\"./docker/interceptors/containersInterceptor.js\": 1231,\n\t\"./docker/interceptors/imagesInterceptor.js\": 1232,\n\t\"./docker/interceptors/infoInterceptor.js\": 1233,\n\t\"./docker/interceptors/networksInterceptor.js\": 1234,\n\t\"./docker/interceptors/versionInterceptor.js\": 1235,\n\t\"./docker/interceptors/volumesInterceptor.js\": 1236,\n\t\"./docker/models/config.js\": 375,\n\t\"./docker/models/container.js\": 229,\n\t\"./docker/models/containerCapabilities.js\": 266,\n\t\"./docker/models/event.js\": 559,\n\t\"./docker/models/image.js\": 230,\n\t\"./docker/models/imageDetails.js\": 560,\n\t\"./docker/models/imageLayer.js\": 561,\n\t\"./docker/models/network.js\": 376,\n\t\"./docker/models/node.js\": 377,\n\t\"./docker/models/plugin.js\": 562,\n\t\"./docker/models/porImageRegistry.js\": 74,\n\t\"./docker/models/secret.js\": 378,\n\t\"./docker/models/service.js\": 379,\n\t\"./docker/models/swarm.js\": 563,\n\t\"./docker/models/task.js\": 380,\n\t\"./docker/models/volume.js\": 298,\n\t\"./docker/rest/build.js\": 1237,\n\t\"./docker/rest/commit.js\": 1238,\n\t\"./docker/rest/config.js\": 1239,\n\t\"./docker/rest/container.js\": 1240,\n\t\"./docker/rest/exec.js\": 1241,\n\t\"./docker/rest/image.js\": 1242,\n\t\"./docker/rest/network.js\": 1243,\n\t\"./docker/rest/node.js\": 1244,\n\t\"./docker/rest/plugin.js\": 1245,\n\t\"./docker/rest/response/handlers.js\": 37,\n\t\"./docker/rest/response/image.js\": 564,\n\t\"./docker/rest/secret.js\": 1246,\n\t\"./docker/rest/service.js\": 1247,\n\t\"./docker/rest/swarm.js\": 1248,\n\t\"./docker/rest/system.js\": 1249,\n\t\"./docker/rest/systemEndpoint.js\": 1250,\n\t\"./docker/rest/task.js\": 1251,\n\t\"./docker/rest/volume.js\": 1252,\n\t\"./docker/services/buildService.js\": 1253,\n\t\"./docker/services/configService.js\": 1254,\n\t\"./docker/services/containerService.js\": 1255,\n\t\"./docker/services/execService.js\": 1256,\n\t\"./docker/services/imageService.js\": 1257,\n\t\"./docker/services/networkService.js\": 1258,\n\t\"./docker/services/nodeService.js\": 1259,\n\t\"./docker/services/pluginService.js\": 1260,\n\t\"./docker/services/secretService.js\": 1261,\n\t\"./docker/services/serviceService.js\": 1262,\n\t\"./docker/services/swarmService.js\": 1263,\n\t\"./docker/services/systemService.js\": 1264,\n\t\"./docker/services/taskService.js\": 1265,\n\t\"./docker/services/volumeService.js\": 1266,\n\t\"./docker/views/configs/configsController.js\": 1267,\n\t\"./docker/views/configs/create/createConfigController.js\": 1268,\n\t\"./docker/views/configs/edit/configController.js\": 1269,\n\t\"./docker/views/containers/console/containerConsoleController.js\": 1270,\n\t\"./docker/views/containers/containersController.js\": 1271,\n\t\"./docker/views/containers/create/createContainerController.js\": 2089,\n\t\"./docker/views/containers/edit/containerController.js\": 1272,\n\t\"./docker/views/containers/inspect/containerInspectController.js\": 1273,\n\t\"./docker/views/containers/logs/containerLogsController.js\": 1274,\n\t\"./docker/views/containers/stats/containerStatsController.js\": 1275,\n\t\"./docker/views/dashboard/dashboardController.js\": 1276,\n\t\"./docker/views/docker-features-configuration/docker-features-configuration.controller.js\": 566,\n\t\"./docker/views/docker-features-configuration/index.js\": 1318,\n\t\"./docker/views/events/eventsController.js\": 1320,\n\t\"./docker/views/host/host-browser-view/host-browser-view-controller.js\": 1321,\n\t\"./docker/views/host/host-browser-view/host-browser-view.js\": 1322,\n\t\"./docker/views/host/host-view-controller.js\": 1324,\n\t\"./docker/views/host/host-view.js\": 1325,\n\t\"./docker/views/images/build/buildImageController.js\": 1327,\n\t\"./docker/views/images/edit/imageController.js\": 1328,\n\t\"./docker/views/images/imagesController.js\": 1329,\n\t\"./docker/views/images/import/importImageController.js\": 1330,\n\t\"./docker/views/networks/create/createNetworkController.js\": 1331,\n\t\"./docker/views/networks/edit/networkController.js\": 1332,\n\t\"./docker/views/networks/networksController.js\": 1333,\n\t\"./docker/views/nodes/node-browser/node-browser-controller.js\": 1334,\n\t\"./docker/views/nodes/node-browser/node-browser.js\": 1335,\n\t\"./docker/views/nodes/node-details/node-details-view-controller.js\": 1337,\n\t\"./docker/views/nodes/node-details/node-details-view.js\": 1338,\n\t\"./docker/views/registries/access/registryAccess.js\": 1340,\n\t\"./docker/views/registries/access/registryAccessController.js\": 1342,\n\t\"./docker/views/secrets/create/createSecretController.js\": 1343,\n\t\"./docker/views/secrets/edit/secretController.js\": 1344,\n\t\"./docker/views/secrets/secretsController.js\": 1345,\n\t\"./docker/views/services/create/createServiceController.js\": 1346,\n\t\"./docker/views/services/edit/serviceController.js\": 1351,\n\t\"./docker/views/services/logs/serviceLogsController.js\": 1370,\n\t\"./docker/views/services/servicesController.js\": 1371,\n\t\"./docker/views/swarm/swarmController.js\": 1372,\n\t\"./docker/views/swarm/visualizer/swarmVisualizerController.js\": 1373,\n\t\"./docker/views/tasks/edit/taskController.js\": 1374,\n\t\"./docker/views/tasks/logs/taskLogsController.js\": 1375,\n\t\"./docker/views/volumes/browse/browseVolumeController.js\": 1376,\n\t\"./docker/views/volumes/create/createVolumeController.js\": 1377,\n\t\"./docker/views/volumes/edit/volumeController.js\": 1378,\n\t\"./docker/views/volumes/volumesController.js\": 1379,\n\t\"./edge/__module.js\": 734,\n\t\"./edge/components/associated-endpoints-datatable/associatedEndpointsDatatableController.js\": 567,\n\t\"./edge/components/associated-endpoints-datatable/index.js\": 1380,\n\t\"./edge/components/edge-groups-selector/index.js\": 1382,\n\t\"./edge/components/edge-job-form/edgeJobFormController.js\": 568,\n\t\"./edge/components/edge-job-form/index.js\": 1384,\n\t\"./edge/components/edge-job-results-datatable/edgeJobResultsDatatableController.js\": 569,\n\t\"./edge/components/edge-job-results-datatable/index.js\": 2090,\n\t\"./edge/components/edge-jobs-datatable/index.js\": 1387,\n\t\"./edge/components/edge-stack-deployment-type-selector/edge-stack-deployment-type-selector.controller.js\": 570,\n\t\"./edge/components/edge-stack-deployment-type-selector/index.js\": 1389,\n\t\"./edge/components/edge-stack-endpoints-datatable/edgeStackEndpointsDatatableController.js\": 571,\n\t\"./edge/components/edge-stack-endpoints-datatable/index.js\": 1391,\n\t\"./edge/components/edge-stack-status/edgeStackStatusController.js\": 572,\n\t\"./edge/components/edge-stack-status/index.js\": 2091,\n\t\"./edge/components/edge-stacks-datatable/index.js\": 1394,\n\t\"./edge/components/edit-edge-stack-form/editEdgeStackFormController.js\": 573,\n\t\"./edge/components/edit-edge-stack-form/index.js\": 1396,\n\t\"./edge/components/group-form/groupFormController.js\": 574,\n\t\"./edge/components/group-form/index.js\": 1398,\n\t\"./edge/components/groups-datatable/groupsDatatableController.js\": 575,\n\t\"./edge/components/groups-datatable/index.js\": 1400,\n\t\"./edge/rest/edge-groups.js\": 1402,\n\t\"./edge/rest/edge-job-results.js\": 1403,\n\t\"./edge/rest/edge-jobs.js\": 1404,\n\t\"./edge/rest/edge-stacks.js\": 1405,\n\t\"./edge/rest/edge-templates.js\": 1406,\n\t\"./edge/services/edge-group.js\": 1407,\n\t\"./edge/services/edge-job.js\": 1408,\n\t\"./edge/services/edge-stack.js\": 1409,\n\t\"./edge/services/edge-template.js\": 1410,\n\t\"./edge/views/edge-groups/createEdgeGroupView/createEdgeGroupViewController.js\": 576,\n\t\"./edge/views/edge-groups/createEdgeGroupView/index.js\": 1411,\n\t\"./edge/views/edge-groups/edgeGroupsView/edgeGroupsViewController.js\": 577,\n\t\"./edge/views/edge-groups/edgeGroupsView/index.js\": 1413,\n\t\"./edge/views/edge-groups/editEdgeGroupView/editEdgeGroupViewController.js\": 578,\n\t\"./edge/views/edge-groups/editEdgeGroupView/index.js\": 1415,\n\t\"./edge/views/edge-jobs/createEdgeJobView/createEdgeJobViewController.js\": 579,\n\t\"./edge/views/edge-jobs/createEdgeJobView/index.js\": 1417,\n\t\"./edge/views/edge-jobs/edgeJob/edgeJobController.js\": 580,\n\t\"./edge/views/edge-jobs/edgeJob/index.js\": 1419,\n\t\"./edge/views/edge-jobs/edgeJobsView/edgeJobsViewController.js\": 581,\n\t\"./edge/views/edge-jobs/edgeJobsView/index.js\": 1421,\n\t\"./edge/views/edge-stacks/createEdgeStackView/create-edge-stack-view.controller.js\": 458,\n\t\"./edge/views/edge-stacks/createEdgeStackView/create-edge-stack-view.js\": 457,\n\t\"./edge/views/edge-stacks/createEdgeStackView/docker-compose-form/docker-compose-form.controller.js\": 460,\n\t\"./edge/views/edge-stacks/createEdgeStackView/docker-compose-form/index.js\": 459,\n\t\"./edge/views/edge-stacks/createEdgeStackView/index.js\": 456,\n\t\"./edge/views/edge-stacks/createEdgeStackView/kube-deploy-description/index.js\": 463,\n\t\"./edge/views/edge-stacks/createEdgeStackView/kube-manifest-form/index.js\": 461,\n\t\"./edge/views/edge-stacks/createEdgeStackView/kube-manifest-form/kube-manifest-form.controller.js\": 462,\n\t\"./edge/views/edge-stacks/edgeStacksView/edgeStacksViewController.js\": 582,\n\t\"./edge/views/edge-stacks/edgeStacksView/index.js\": 1423,\n\t\"./edge/views/edge-stacks/editEdgeStackView/editEdgeStackViewController.js\": 583,\n\t\"./edge/views/edge-stacks/editEdgeStackView/index.js\": 1425,\n\t\"./edge/views/edge-stacks/index.js\": 455,\n\t\"./integrations/_module.js\": 1427,\n\t\"./integrations/storidge/_module.js\": 1428,\n\t\"./integrations/storidge/components/cluster-events-datatable/storidgeClusterEventsDatatable.js\": 1438,\n\t\"./integrations/storidge/components/drives-datatable/storidgeDrivesDatatable.js\": 1440,\n\t\"./integrations/storidge/components/drives-datatable/storidgeDrivesDatatableController.js\": 1442,\n\t\"./integrations/storidge/components/nodes-datatable/storidgeNodesDatatable.js\": 1443,\n\t\"./integrations/storidge/components/nodes-datatable/storidgeNodesDatatableController.js\": 1445,\n\t\"./integrations/storidge/components/profileSelector/storidgeProfileSelector.js\": 1446,\n\t\"./integrations/storidge/components/profileSelector/storidgeProfileSelectorController.js\": 1448,\n\t\"./integrations/storidge/components/profiles-datatable/storidgeProfilesDatatable.js\": 1449,\n\t\"./integrations/storidge/components/snapshot-creation/storidgeSnapshotCreation.js\": 1451,\n\t\"./integrations/storidge/components/snapshot-creation/storidgeSnapshotCreationController.js\": 1453,\n\t\"./integrations/storidge/components/snapshots-datatable/storidgeSnapshotsDatatable.js\": 1454,\n\t\"./integrations/storidge/components/volume-storidge-info/volumeStoridgeInfo.js\": 1456,\n\t\"./integrations/storidge/components/volume-storidge-info/volumeStoridgeInfoController.js\": 1458,\n\t\"./integrations/storidge/filters/filters.js\": 1459,\n\t\"./integrations/storidge/models/drive.js\": 385,\n\t\"./integrations/storidge/models/events.js\": 584,\n\t\"./integrations/storidge/models/info.js\": 585,\n\t\"./integrations/storidge/models/node.js\": 386,\n\t\"./integrations/storidge/models/profile.js\": 152,\n\t\"./integrations/storidge/models/snapshot.js\": 387,\n\t\"./integrations/storidge/models/volume.js\": 388,\n\t\"./integrations/storidge/rest/storidge.js\": 1460,\n\t\"./integrations/storidge/services/chartService.js\": 1461,\n\t\"./integrations/storidge/services/clusterService.js\": 1504,\n\t\"./integrations/storidge/services/driveService.js\": 1505,\n\t\"./integrations/storidge/services/nodeService.js\": 1506,\n\t\"./integrations/storidge/services/profileService.js\": 1507,\n\t\"./integrations/storidge/services/snapshotService.js\": 1508,\n\t\"./integrations/storidge/services/volumeService.js\": 1509,\n\t\"./integrations/storidge/views/cluster/clusterController.js\": 1510,\n\t\"./integrations/storidge/views/drives/drivesController.js\": 1511,\n\t\"./integrations/storidge/views/drives/inspect/driveController.js\": 1512,\n\t\"./integrations/storidge/views/monitor/monitorController.js\": 1513,\n\t\"./integrations/storidge/views/nodes/inspect/nodeController.js\": 1514,\n\t\"./integrations/storidge/views/profiles/create/createProfileController.js\": 1515,\n\t\"./integrations/storidge/views/profiles/edit/profileController.js\": 1516,\n\t\"./integrations/storidge/views/profiles/profilesController.js\": 1517,\n\t\"./integrations/storidge/views/snapshots/inspect/snapshotController.js\": 1518,\n\t\"./kubernetes/__module.js\": 1519,\n\t\"./kubernetes/components/datatables/application/containers-datatable/containersDatatable.js\": 1525,\n\t\"./kubernetes/components/datatables/applications-datatable-details/applications-datatable-details.controller.js\": 597,\n\t\"./kubernetes/components/datatables/applications-datatable-details/applications-datatable-details.js\": 1527,\n\t\"./kubernetes/components/datatables/applications-datatable-url/applications-datatable-url.js\": 2092,\n\t\"./kubernetes/components/datatables/applications-datatable/applicationsDatatable.js\": 2093,\n\t\"./kubernetes/components/datatables/applications-datatable/applicationsDatatableController.js\": 1531,\n\t\"./kubernetes/components/datatables/applications-ports-datatable/applicationsPortsDatatable.js\": 1534,\n\t\"./kubernetes/components/datatables/applications-ports-datatable/applicationsPortsDatatableController.js\": 1536,\n\t\"./kubernetes/components/datatables/applications-stacks-datatable/applicationsStacksDatatable.js\": 1537,\n\t\"./kubernetes/components/datatables/applications-stacks-datatable/applicationsStacksDatatableController.js\": 1539,\n\t\"./kubernetes/components/datatables/configurations-datatable/configurationsDatatable.js\": 1540,\n\t\"./kubernetes/components/datatables/configurations-datatable/configurationsDatatableController.js\": 1542,\n\t\"./kubernetes/components/datatables/events-datatable/eventsDatatable.js\": 1547,\n\t\"./kubernetes/components/datatables/integrated-applications-datatable/integratedApplicationsDatatable.js\": 1549,\n\t\"./kubernetes/components/datatables/node-applications-datatable/nodeApplicationsDatatable.js\": 1551,\n\t\"./kubernetes/components/datatables/node-applications-datatable/nodeApplicationsDatatableController.js\": 1553,\n\t\"./kubernetes/components/datatables/nodes-datatable/nodesDatatable.js\": 1554,\n\t\"./kubernetes/components/datatables/resource-pool-applications-datatable/resourcePoolApplicationsDatatable.js\": 1556,\n\t\"./kubernetes/components/datatables/resource-pool-applications-datatable/resourcePoolApplicationsDatatableController.js\": 1558,\n\t\"./kubernetes/components/datatables/resource-pools-datatable/resourcePoolsDatatable.js\": 1559,\n\t\"./kubernetes/components/datatables/resource-pools-datatable/resourcePoolsDatatableController.js\": 1561,\n\t\"./kubernetes/components/datatables/volumes-datatable/volumesDatatable.js\": 1562,\n\t\"./kubernetes/components/datatables/volumes-datatable/volumesDatatableController.js\": 1564,\n\t\"./kubernetes/components/helm/helm-templates/helm-add-repository/helm-add-repository.controller.js\": 598,\n\t\"./kubernetes/components/helm/helm-templates/helm-add-repository/helm-add-repository.js\": 1565,\n\t\"./kubernetes/components/helm/helm-templates/helm-templates-list/helm-templates-list-item/helm-templates-list-item.js\": 2094,\n\t\"./kubernetes/components/helm/helm-templates/helm-templates-list/helm-templates-list.controller.js\": 599,\n\t\"./kubernetes/components/helm/helm-templates/helm-templates-list/helm-templates-list.js\": 1568,\n\t\"./kubernetes/components/helm/helm-templates/helm-templates.controller.js\": 600,\n\t\"./kubernetes/components/helm/helm-templates/helm-templates.js\": 1570,\n\t\"./kubernetes/components/kubectl-shell/kubectl-shell.controller.js\": 601,\n\t\"./kubernetes/components/kubectl-shell/kubectl-shell.js\": 2095,\n\t\"./kubernetes/components/kubernetes-configuration-data/kubernetesConfigurationData.js\": 1573,\n\t\"./kubernetes/components/kubernetes-configuration-data/kubernetesConfigurationDataController.js\": 1575,\n\t\"./kubernetes/components/kubernetes-sidebar/index.js\": 1582,\n\t\"./kubernetes/components/resource-reservation/resourceReservation.js\": 1584,\n\t\"./kubernetes/components/resource-reservation/resourceReservationController.js\": 1586,\n\t\"./kubernetes/components/view-header/viewHeader.js\": 1587,\n\t\"./kubernetes/components/view-loading/viewLoading.js\": 1589,\n\t\"./kubernetes/components/yaml-inspector/yamlInspector.js\": 1591,\n\t\"./kubernetes/components/yaml-inspector/yamlInspectorController.js\": 1593,\n\t\"./kubernetes/converters/application.js\": 82,\n\t\"./kubernetes/converters/configMap.js\": 88,\n\t\"./kubernetes/converters/configuration.js\": 173,\n\t\"./kubernetes/converters/daemonSet.js\": 254,\n\t\"./kubernetes/converters/deployment.js\": 253,\n\t\"./kubernetes/converters/event.js\": 608,\n\t\"./kubernetes/converters/namespace.js\": 302,\n\t\"./kubernetes/converters/persistentVolumeClaim.js\": 126,\n\t\"./kubernetes/converters/resourcePool.js\": 153,\n\t\"./kubernetes/converters/resourceQuota.js\": 139,\n\t\"./kubernetes/converters/secret.js\": 154,\n\t\"./kubernetes/converters/service.js\": 169,\n\t\"./kubernetes/converters/statefulSet.js\": 255,\n\t\"./kubernetes/converters/storageClass.js\": 395,\n\t\"./kubernetes/converters/volume.js\": 396,\n\t\"./kubernetes/custom-templates/index.js\": 589,\n\t\"./kubernetes/custom-templates/kube-create-custom-template-view/index.js\": 594,\n\t\"./kubernetes/custom-templates/kube-create-custom-template-view/kube-create-custom-template-view.controller.js\": 595,\n\t\"./kubernetes/custom-templates/kube-custom-templates-view/index.js\": 590,\n\t\"./kubernetes/custom-templates/kube-custom-templates-view/kube-custom-templates-view.controller.js\": 591,\n\t\"./kubernetes/custom-templates/kube-edit-custom-template-view/index.js\": 592,\n\t\"./kubernetes/custom-templates/kube-edit-custom-template-view/kube-edit-custom-template-view.controller.js\": 593,\n\t\"./kubernetes/endpoint/converter.js\": 613,\n\t\"./kubernetes/endpoint/models.js\": 304,\n\t\"./kubernetes/endpoint/rest.js\": 1594,\n\t\"./kubernetes/endpoint/service.js\": 1595,\n\t\"./kubernetes/filters/applicationFilters.js\": 1596,\n\t\"./kubernetes/filters/configurationFilters.js\": 1597,\n\t\"./kubernetes/filters/eventFilters.js\": 1598,\n\t\"./kubernetes/filters/filters.js\": 1599,\n\t\"./kubernetes/helm/rest.js\": 1600,\n\t\"./kubernetes/helm/service.js\": 1601,\n\t\"./kubernetes/helpers/application/index.js\": 22,\n\t\"./kubernetes/helpers/application/rollback.js\": 614,\n\t\"./kubernetes/helpers/commonHelper.js\": 51,\n\t\"./kubernetes/helpers/configMapHelper.js\": 305,\n\t\"./kubernetes/helpers/configurationHelper.js\": 80,\n\t\"./kubernetes/helpers/eventHelper.js\": 133,\n\t\"./kubernetes/helpers/formValidationHelper.js\": 71,\n\t\"./kubernetes/helpers/history/daemonset.js\": 397,\n\t\"./kubernetes/helpers/history/deployment.js\": 307,\n\t\"./kubernetes/helpers/history/index.js\": 615,\n\t\"./kubernetes/helpers/history/statefulset.js\": 398,\n\t\"./kubernetes/helpers/namespaceHelper.js\": 27,\n\t\"./kubernetes/helpers/resourceQuotaHelper.js\": 150,\n\t\"./kubernetes/helpers/resourceReservationHelper.js\": 20,\n\t\"./kubernetes/helpers/serviceHelper.js\": 257,\n\t\"./kubernetes/helpers/stackHelper.js\": 293,\n\t\"./kubernetes/helpers/stackHelper.test.js\": 1602,\n\t\"./kubernetes/helpers/volumeHelper.js\": 99,\n\t\"./kubernetes/horizontal-pod-auto-scaler/converter.js\": 105,\n\t\"./kubernetes/horizontal-pod-auto-scaler/helper.js\": 140,\n\t\"./kubernetes/horizontal-pod-auto-scaler/models.js\": 399,\n\t\"./kubernetes/horizontal-pod-auto-scaler/payload.js\": 617,\n\t\"./kubernetes/horizontal-pod-auto-scaler/rest.js\": 1603,\n\t\"./kubernetes/horizontal-pod-auto-scaler/service.js\": 1604,\n\t\"./kubernetes/ingress/constants.js\": 87,\n\t\"./kubernetes/ingress/converter.js\": 62,\n\t\"./kubernetes/ingress/helper.js\": 607,\n\t\"./kubernetes/ingress/models.js\": 205,\n\t\"./kubernetes/ingress/payloads.js\": 303,\n\t\"./kubernetes/ingress/rest.js\": 1605,\n\t\"./kubernetes/ingress/service.js\": 1606,\n\t\"./kubernetes/metrics/metrics.js\": 1607,\n\t\"./kubernetes/metrics/rest.js\": 1608,\n\t\"./kubernetes/models/application/formValues.js\": 24,\n\t\"./kubernetes/models/application/models/constants.js\": 451,\n\t\"./kubernetes/models/application/models/index.js\": 3,\n\t\"./kubernetes/models/application/payloads.js\": 114,\n\t\"./kubernetes/models/common/params.js\": 18,\n\t\"./kubernetes/models/common/payloads.js\": 58,\n\t\"./kubernetes/models/config-map/models.js\": 81,\n\t\"./kubernetes/models/config-map/payloads.js\": 301,\n\t\"./kubernetes/models/configuration/formvalues.js\": 86,\n\t\"./kubernetes/models/configuration/models.js\": 25,\n\t\"./kubernetes/models/daemon-set/models.js\": 162,\n\t\"./kubernetes/models/daemon-set/payloads.js\": 603,\n\t\"./kubernetes/models/deploy.js\": 21,\n\t\"./kubernetes/models/deployment/models.js\": 161,\n\t\"./kubernetes/models/deployment/payloads.js\": 602,\n\t\"./kubernetes/models/event/models.js\": 609,\n\t\"./kubernetes/models/history/models.js\": 155,\n\t\"./kubernetes/models/namespace/models.js\": 195,\n\t\"./kubernetes/models/namespace/payloads.js\": 610,\n\t\"./kubernetes/models/nodes-limits/models.js\": 618,\n\t\"./kubernetes/models/port/models.js\": 389,\n\t\"./kubernetes/models/resource-pool/formValues.js\": 73,\n\t\"./kubernetes/models/resource-pool/models.js\": 113,\n\t\"./kubernetes/models/resource-quota/models.js\": 38,\n\t\"./kubernetes/models/resource-quota/payloads.js\": 611,\n\t\"./kubernetes/models/resource-reservation/models.js\": 137,\n\t\"./kubernetes/models/resource-types/models.js\": 39,\n\t\"./kubernetes/models/secret/models.js\": 394,\n\t\"./kubernetes/models/secret/payloads.js\": 393,\n\t\"./kubernetes/models/service/models.js\": 42,\n\t\"./kubernetes/models/service/payloads.js\": 606,\n\t\"./kubernetes/models/stack/models.js\": 616,\n\t\"./kubernetes/models/stateful-set/models.js\": 112,\n\t\"./kubernetes/models/stateful-set/payloads.js\": 604,\n\t\"./kubernetes/models/storage-class/models.js\": 198,\n\t\"./kubernetes/models/storage-class/payload.js\": 612,\n\t\"./kubernetes/models/volume/models.js\": 256,\n\t\"./kubernetes/models/volume/payloads.js\": 605,\n\t\"./kubernetes/node/converter.js\": 129,\n\t\"./kubernetes/node/filters.js\": 1609,\n\t\"./kubernetes/node/formValues.js\": 206,\n\t\"./kubernetes/node/helper.js\": 231,\n\t\"./kubernetes/node/models.js\": 83,\n\t\"./kubernetes/node/payload.js\": 400,\n\t\"./kubernetes/node/rest.js\": 1610,\n\t\"./kubernetes/node/service.js\": 1611,\n\t\"./kubernetes/pod/converter.js\": 170,\n\t\"./kubernetes/pod/filters.js\": 1612,\n\t\"./kubernetes/pod/models/affinities.js\": 452,\n\t\"./kubernetes/pod/models/index.js\": 49,\n\t\"./kubernetes/pod/payloads/affinities.js\": 234,\n\t\"./kubernetes/pod/payloads/create.js\": 619,\n\t\"./kubernetes/pod/service.js\": 1613,\n\t\"./kubernetes/registries/index.js\": 586,\n\t\"./kubernetes/registries/kube-registry-access-view/index.js\": 587,\n\t\"./kubernetes/registries/kube-registry-access-view/kube-registry-access-view.controller.js\": 588,\n\t\"./kubernetes/rest/configMap.js\": 1614,\n\t\"./kubernetes/rest/controllerRevision.js\": 1615,\n\t\"./kubernetes/rest/daemonSet.js\": 1616,\n\t\"./kubernetes/rest/deployment.js\": 1617,\n\t\"./kubernetes/rest/endpoint.js\": 1618,\n\t\"./kubernetes/rest/event.js\": 1619,\n\t\"./kubernetes/rest/health.js\": 1620,\n\t\"./kubernetes/rest/kubeconfig.js\": 1621,\n\t\"./kubernetes/rest/namespace.js\": 1622,\n\t\"./kubernetes/rest/nodesLimits.js\": 1623,\n\t\"./kubernetes/rest/persistentVolumeClaim.js\": 1624,\n\t\"./kubernetes/rest/pod.js\": 1625,\n\t\"./kubernetes/rest/portainer-namespace.js\": 1626,\n\t\"./kubernetes/rest/replicaSet.js\": 1627,\n\t\"./kubernetes/rest/resourceQuota.js\": 1628,\n\t\"./kubernetes/rest/response/transform.js\": 36,\n\t\"./kubernetes/rest/secret.js\": 1629,\n\t\"./kubernetes/rest/service.js\": 1630,\n\t\"./kubernetes/rest/statefulSet.js\": 1631,\n\t\"./kubernetes/rest/storage.js\": 1632,\n\t\"./kubernetes/services/applicationService.js\": 1633,\n\t\"./kubernetes/services/configMapService.js\": 1634,\n\t\"./kubernetes/services/configurationService.js\": 1635,\n\t\"./kubernetes/services/controllerRevisionService.js\": 1636,\n\t\"./kubernetes/services/daemonSetService.js\": 1637,\n\t\"./kubernetes/services/deploymentService.js\": 1638,\n\t\"./kubernetes/services/eventService.js\": 1639,\n\t\"./kubernetes/services/healthService.js\": 1640,\n\t\"./kubernetes/services/historyService.js\": 1641,\n\t\"./kubernetes/services/kubeconfigService.js\": 1642,\n\t\"./kubernetes/services/namespaceService.js\": 1643,\n\t\"./kubernetes/services/nodesLimitsService.js\": 1644,\n\t\"./kubernetes/services/persistentVolumeClaimService.js\": 1645,\n\t\"./kubernetes/services/replicaSetService.js\": 1646,\n\t\"./kubernetes/services/resourcePoolService.js\": 1647,\n\t\"./kubernetes/services/resourceQuotaService.js\": 1648,\n\t\"./kubernetes/services/secretService.js\": 1649,\n\t\"./kubernetes/services/serviceService.js\": 1650,\n\t\"./kubernetes/services/stackService.js\": 1651,\n\t\"./kubernetes/services/statefulSetService.js\": 1652,\n\t\"./kubernetes/services/storageService.js\": 1653,\n\t\"./kubernetes/services/volumeService.js\": 1654,\n\t\"./kubernetes/store/namespace.js\": 252,\n\t\"./kubernetes/views/applications/applications.js\": 1655,\n\t\"./kubernetes/views/applications/applicationsController.js\": 1657,\n\t\"./kubernetes/views/applications/console/console.js\": 1658,\n\t\"./kubernetes/views/applications/console/consoleController.js\": 1660,\n\t\"./kubernetes/views/applications/create/createApplication.js\": 1661,\n\t\"./kubernetes/views/applications/create/createApplicationController.js\": 1663,\n\t\"./kubernetes/views/applications/edit/application.js\": 1664,\n\t\"./kubernetes/views/applications/edit/applicationController.js\": 1666,\n\t\"./kubernetes/views/applications/edit/components/placements-datatable/controller.js\": 1667,\n\t\"./kubernetes/views/applications/edit/components/placements-datatable/index.js\": 1668,\n\t\"./kubernetes/views/applications/helm/helm.controller.js\": 620,\n\t\"./kubernetes/views/applications/helm/index.js\": 2096,\n\t\"./kubernetes/views/applications/logs/logs.js\": 1671,\n\t\"./kubernetes/views/applications/logs/logsController.js\": 1673,\n\t\"./kubernetes/views/applications/stats/stats.js\": 1674,\n\t\"./kubernetes/views/applications/stats/statsController.js\": 1676,\n\t\"./kubernetes/views/cluster/cluster.js\": 1677,\n\t\"./kubernetes/views/cluster/clusterController.js\": 1679,\n\t\"./kubernetes/views/cluster/node/node.js\": 1680,\n\t\"./kubernetes/views/cluster/node/nodeController.js\": 1682,\n\t\"./kubernetes/views/cluster/node/stats/stats.js\": 1683,\n\t\"./kubernetes/views/cluster/node/stats/statsController.js\": 1685,\n\t\"./kubernetes/views/configurations/configurations.js\": 1686,\n\t\"./kubernetes/views/configurations/configurationsController.js\": 1688,\n\t\"./kubernetes/views/configurations/create/createConfiguration.js\": 1689,\n\t\"./kubernetes/views/configurations/create/createConfigurationController.js\": 1691,\n\t\"./kubernetes/views/configurations/edit/configuration.js\": 1692,\n\t\"./kubernetes/views/configurations/edit/configurationController.js\": 1694,\n\t\"./kubernetes/views/configure/configureController.js\": 1695,\n\t\"./kubernetes/views/dashboard/dashboard.js\": 1696,\n\t\"./kubernetes/views/dashboard/dashboardController.js\": 1698,\n\t\"./kubernetes/views/deploy/deploy.js\": 1699,\n\t\"./kubernetes/views/deploy/deployController.js\": 1701,\n\t\"./kubernetes/views/resource-pools/access/resourcePoolAccess.js\": 1703,\n\t\"./kubernetes/views/resource-pools/access/resourcePoolAccessController.js\": 1705,\n\t\"./kubernetes/views/resource-pools/create/createResourcePool.js\": 1706,\n\t\"./kubernetes/views/resource-pools/create/createResourcePoolController.js\": 621,\n\t\"./kubernetes/views/resource-pools/edit/components/ingresses-datatable/controller.js\": 1708,\n\t\"./kubernetes/views/resource-pools/edit/components/ingresses-datatable/index.js\": 1709,\n\t\"./kubernetes/views/resource-pools/edit/resourcePool.js\": 1711,\n\t\"./kubernetes/views/resource-pools/edit/resourcePoolController.js\": 1713,\n\t\"./kubernetes/views/resource-pools/resourcePools.js\": 1714,\n\t\"./kubernetes/views/resource-pools/resourcePoolsController.js\": 1716,\n\t\"./kubernetes/views/stacks/logs/logs.js\": 1717,\n\t\"./kubernetes/views/stacks/logs/logsController.js\": 1719,\n\t\"./kubernetes/views/summary/resources/applicationResources.js\": 622,\n\t\"./kubernetes/views/summary/resources/configurationResources.js\": 623,\n\t\"./kubernetes/views/summary/resources/helpers.js\": 308,\n\t\"./kubernetes/views/summary/resources/namespaceResources.js\": 624,\n\t\"./kubernetes/views/summary/summary.js\": 1720,\n\t\"./kubernetes/views/summary/summaryController.js\": 1722,\n\t\"./kubernetes/views/volumes/components/volumes-storages-datatable/controller.js\": 1723,\n\t\"./kubernetes/views/volumes/components/volumes-storages-datatable/index.js\": 1724,\n\t\"./kubernetes/views/volumes/edit/volume.js\": 1726,\n\t\"./kubernetes/views/volumes/edit/volumeController.js\": 1728,\n\t\"./kubernetes/views/volumes/volumes.js\": 1729,\n\t\"./kubernetes/views/volumes/volumesController.js\": 1731,\n\t\"./matomo-setup.js\": 730,\n\t\"./portainer/__module.js\": 735,\n\t\"./portainer/components/access-datatable/accessDatatable.js\": 1732,\n\t\"./portainer/components/access-datatable/accessDatatableController.js\": 1734,\n\t\"./portainer/components/access-table/access-table.js\": 1735,\n\t\"./portainer/components/accessControlForm/por-access-control-form.js\": 1737,\n\t\"./portainer/components/accessControlForm/porAccessControlFormController.js\": 1739,\n\t\"./portainer/components/accessControlForm/porAccessControlFormModel.js\": 45,\n\t\"./portainer/components/accessControlPanel/por-access-control-panel.js\": 1740,\n\t\"./portainer/components/accessControlPanel/porAccessControlPanelController.js\": 1742,\n\t\"./portainer/components/accessControlPanel/porAccessControlPanelModel.js\": 625,\n\t\"./portainer/components/accessManagement/index.js\": 488,\n\t\"./portainer/components/accessManagement/por-access-management-users-selector/index.js\": 490,\n\t\"./portainer/components/accessManagement/por-access-management.js\": 489,\n\t\"./portainer/components/accessManagement/porAccessManagementController.js\": 1743,\n\t\"./portainer/components/associated-endpoints-selector/associatedEndpointsSelector.js\": 1744,\n\t\"./portainer/components/associated-endpoints-selector/associatedEndpointsSelectorController.js\": 626,\n\t\"./portainer/components/autofocus.js\": 1746,\n\t\"./portainer/components/be-feature-indicator/be-feature-indicator.controller.js\": 627,\n\t\"./portainer/components/be-feature-indicator/index.js\": 2097,\n\t\"./portainer/components/beta-panel/betaPanel.js\": 1748,\n\t\"./portainer/components/box-selector/box-selector-item/box-selector-item.controller.js\": 628,\n\t\"./portainer/components/box-selector/box-selector-item/index.js\": 2098,\n\t\"./portainer/components/box-selector/box-selector.controller.js\": 596,\n\t\"./portainer/components/box-selector/index.js\": 47,\n\t\"./portainer/components/buttonSpinner.js\": 1751,\n\t\"./portainer/components/code-editor/code-editor.js\": 1752,\n\t\"./portainer/components/code-editor/codeEditorController.js\": 1754,\n\t\"./portainer/components/copy-button/copy-button.controller.js\": 629,\n\t\"./portainer/components/copy-button/copy-button.js\": 2099,\n\t\"./portainer/components/custom-template-common-fields/customTemplateCommonFieldsController.js\": 630,\n\t\"./portainer/components/custom-template-common-fields/index.js\": 1756,\n\t\"./portainer/components/custom-template-selector/custom-template-selector.controller.js\": 631,\n\t\"./portainer/components/custom-template-selector/index.js\": 1758,\n\t\"./portainer/components/custom-templates-list/customTemplatesListController.js\": 1760,\n\t\"./portainer/components/custom-templates-list/index.js\": 1761,\n\t\"./portainer/components/datatables/access-tokens-datatable/access-tokens-datatable.controller.js\": 632,\n\t\"./portainer/components/datatables/access-tokens-datatable/index.js\": 1763,\n\t\"./portainer/components/datatables/datatable-columns-visibility/datatable-columns-visibility.controller.js\": 633,\n\t\"./portainer/components/datatables/datatable-columns-visibility/index.js\": 1765,\n\t\"./portainer/components/datatables/endpoints-datatable/endpointsDatatable.js\": 1767,\n\t\"./portainer/components/datatables/endpoints-datatable/endpointsDatatableController.js\": 1769,\n\t\"./portainer/components/datatables/filter/datatable-filter.controller.js\": 634,\n\t\"./portainer/components/datatables/filter/index.js\": 635,\n\t\"./portainer/components/datatables/genericDatatableController.js\": 1771,\n\t\"./portainer/components/datatables/groups-datatable/groupsDatatable.js\": 1773,\n\t\"./portainer/components/datatables/index.js\": 1775,\n\t\"./portainer/components/datatables/pagination/index.js\": 640,\n\t\"./portainer/components/datatables/registries-datatable/registriesDatatable.js\": 1781,\n\t\"./portainer/components/datatables/registries-datatable/registriesDatatableController.js\": 1783,\n\t\"./portainer/components/datatables/searchbar/index.js\": 637,\n\t\"./portainer/components/datatables/sort-icon/datatable-sort-icon.controller.js\": 639,\n\t\"./portainer/components/datatables/sort-icon/index.js\": 638,\n\t\"./portainer/components/datatables/stacks-datatable/stacksDatatable.js\": 1784,\n\t\"./portainer/components/datatables/stacks-datatable/stacksDatatableController.js\": 1786,\n\t\"./portainer/components/datatables/strings-datatable/index.js\": 1787,\n\t\"./portainer/components/datatables/tags-datatable/tagsDatatable.js\": 1789,\n\t\"./portainer/components/datatables/teams-datatable/teamsDatatable.js\": 1791,\n\t\"./portainer/components/datatables/titlebar/index.js\": 636,\n\t\"./portainer/components/datatables/users-datatable/usersDatatable.js\": 1793,\n\t\"./portainer/components/datatables/users-datatable/usersDatatableController.js\": 641,\n\t\"./portainer/components/endpoint-list/endpoint-item/endpoint-item-controller.js\": 642,\n\t\"./portainer/components/endpoint-list/endpoint-item/endpointItem.js\": 1799,\n\t\"./portainer/components/endpoint-list/endpoint-list-controller.js\": 1804,\n\t\"./portainer/components/endpoint-list/endpoint-list.js\": 1805,\n\t\"./portainer/components/endpoint-selector/endpoint-selector.js\": 1807,\n\t\"./portainer/components/endpoint-selector/endpointSelectorController.js\": 1809,\n\t\"./portainer/components/endpointSecurity/por-endpoint-security.js\": 1810,\n\t\"./portainer/components/endpointSecurity/porEndpointSecurityController.js\": 1812,\n\t\"./portainer/components/endpointSecurity/porEndpointSecurityModel.js\": 199,\n\t\"./portainer/components/environment-variables-panel/environment-variables-panel.controller.js\": 643,\n\t\"./portainer/components/environment-variables-panel/environment-variables-simple-mode/environment-variables-simple-mode-item/environment-variables-simple-mode-item.controller.js\": 644,\n\t\"./portainer/components/environment-variables-panel/environment-variables-simple-mode/environment-variables-simple-mode-item/index.js\": 1813,\n\t\"./portainer/components/environment-variables-panel/environment-variables-simple-mode/environment-variables-simple-mode.controller.js\": 645,\n\t\"./portainer/components/environment-variables-panel/environment-variables-simple-mode/index.js\": 2100,\n\t\"./portainer/components/environment-variables-panel/index.js\": 2101,\n\t\"./portainer/components/focusIf.js\": 1817,\n\t\"./portainer/components/form-components/file-upload-form/index.js\": 494,\n\t\"./portainer/components/form-components/index.js\": 491,\n\t\"./portainer/components/form-components/web-editor-form/index.js\": 492,\n\t\"./portainer/components/form-components/web-editor-form/web-editor-form.controller.js\": 493,\n\t\"./portainer/components/forms/git-form/git-form-additional-files-panel/git-form-additional-file-item/git-form-additional-file-item.controller.js\": 481,\n\t\"./portainer/components/forms/git-form/git-form-additional-files-panel/git-form-additional-file-item/index.js\": 480,\n\t\"./portainer/components/forms/git-form/git-form-additional-files-panel/git-form-additional-files-panel.controller.js\": 479,\n\t\"./portainer/components/forms/git-form/git-form-additional-files-panel/index.js\": 478,\n\t\"./portainer/components/forms/git-form/git-form-auth-fieldset/git-form-auth-fieldset.controller.js\": 477,\n\t\"./portainer/components/forms/git-form/git-form-auth-fieldset/index.js\": 676,\n\t\"./portainer/components/forms/git-form/git-form-auto-update-fieldset/git-form-auto-update-fieldset.controller.js\": 483,\n\t\"./portainer/components/forms/git-form/git-form-auto-update-fieldset/index.js\": 482,\n\t\"./portainer/components/forms/git-form/git-form-compose-path-field/index.js\": 484,\n\t\"./portainer/components/forms/git-form/git-form-info-panel/index.js\": 487,\n\t\"./portainer/components/forms/git-form/git-form-ref-field/index.js\": 485,\n\t\"./portainer/components/forms/git-form/git-form-url-field/index.js\": 486,\n\t\"./portainer/components/forms/git-form/git-form.controller.js\": 476,\n\t\"./portainer/components/forms/git-form/git-form.js\": 475,\n\t\"./portainer/components/forms/git-form/index.js\": 474,\n\t\"./portainer/components/forms/group-form/group-form.js\": 1818,\n\t\"./portainer/components/forms/group-form/groupFormController.js\": 646,\n\t\"./portainer/components/forms/kubernetes-app-git-form/kubernetes-app-git-form.controller.js\": 647,\n\t\"./portainer/components/forms/kubernetes-app-git-form/kubernetes-app-git-form.js\": 1820,\n\t\"./portainer/components/forms/kubernetes-redeploy-app-git-form/kubernetes-redeploy-app-git-form.controller.js\": 648,\n\t\"./portainer/components/forms/kubernetes-redeploy-app-git-form/kubernetes-redeploy-app-git-form.js\": 1822,\n\t\"./portainer/components/forms/por-switch-field/por-switch-field.js\": 1824,\n\t\"./portainer/components/forms/por-switch/por-switch.controller.js\": 649,\n\t\"./portainer/components/forms/por-switch/por-switch.js\": 2102,\n\t\"./portainer/components/forms/registry-form-aws-ecr/registry-form-ecr.js\": 1827,\n\t\"./portainer/components/forms/registry-form-azure/registry-form-azure.js\": 1829,\n\t\"./portainer/components/forms/registry-form-custom/registry-form-custom.js\": 1831,\n\t\"./portainer/components/forms/registry-form-dockerhub/registry-form-dockerhub.js\": 1833,\n\t\"./portainer/components/forms/registry-form-gitlab/gitlab-projects-datatable/gitlabProjectsDatatable.js\": 1835,\n\t\"./portainer/components/forms/registry-form-gitlab/gitlab-projects-datatable/gitlabProjectsDatatableController.js\": 1837,\n\t\"./portainer/components/forms/registry-form-gitlab/registry-form-gitlab.js\": 1838,\n\t\"./portainer/components/forms/registry-form-proget/registry-form-proget.js\": 1840,\n\t\"./portainer/components/forms/registry-form-quay/registry-form-quay.js\": 1842,\n\t\"./portainer/components/forms/stack-from-template-form/index.js\": 1844,\n\t\"./portainer/components/forms/stack-redeploy-git-form/index.js\": 1846,\n\t\"./portainer/components/forms/stack-redeploy-git-form/stack-redeploy-git-form.controller.js\": 650,\n\t\"./portainer/components/group-association-table/group-association-table.js\": 1848,\n\t\"./portainer/components/header-content.js\": 1850,\n\t\"./portainer/components/header-title.js\": 1851,\n\t\"./portainer/components/header.js\": 1852,\n\t\"./portainer/components/index.js\": 671,\n\t\"./portainer/components/information-panel-offline/informationPanelOffline.js\": 1853,\n\t\"./portainer/components/information-panel-offline/informationPanelOfflineController.js\": 1855,\n\t\"./portainer/components/information-panel/information-panel.js\": 1856,\n\t\"./portainer/components/intervalFormat.js\": 1858,\n\t\"./portainer/components/motd-panel/motd-panel.js\": 1859,\n\t\"./portainer/components/onEnterKey.js\": 1861,\n\t\"./portainer/components/product-list/product-item/product-item.js\": 1862,\n\t\"./portainer/components/product-list/product-list.js\": 1866,\n\t\"./portainer/components/registry-details/index.js\": 1868,\n\t\"./portainer/components/sensitive-details/sensitive-details.js\": 2103,\n\t\"./portainer/components/show-hide/show-hide.js\": 1871,\n\t\"./portainer/components/sidebar/index.js\": 673,\n\t\"./portainer/components/sidebar/sidebar-menu-item/index.js\": 675,\n\t\"./portainer/components/sidebar/sidebar-menu/index.js\": 674,\n\t\"./portainer/components/sidebar/sidebar-menu/sidebar-menu.controller.js\": 472,\n\t\"./portainer/components/sidebar/sidebar-section/index.js\": 473,\n\t\"./portainer/components/slider/slider.js\": 1873,\n\t\"./portainer/components/slider/sliderController.js\": 1875,\n\t\"./portainer/components/stack-duplication-form/stack-duplication-form-controller.js\": 1876,\n\t\"./portainer/components/stack-duplication-form/stack-duplication-form.js\": 1877,\n\t\"./portainer/components/status-indicator/index.js\": 2104,\n\t\"./portainer/components/tag-selector/tag-selector.js\": 1880,\n\t\"./portainer/components/tag-selector/tagSelectorController.js\": 1882,\n\t\"./portainer/components/template-list/template-item/template-item.js\": 2105,\n\t\"./portainer/components/template-list/template-list-controller.js\": 1884,\n\t\"./portainer/components/template-list/template-list.js\": 1885,\n\t\"./portainer/components/template-widget.js\": 1887,\n\t\"./portainer/components/theme/theme-settings.controller.js\": 651,\n\t\"./portainer/components/theme/theme-settings.js\": 1888,\n\t\"./portainer/error.js\": 11,\n\t\"./portainer/feature-flags/enums.js\": 65,\n\t\"./portainer/feature-flags/feature-flags.service.js\": 536,\n\t\"./portainer/feature-flags/feature-ids.js\": 19,\n\t\"./portainer/feature-flags/index.js\": 680,\n\t\"./portainer/feature-flags/limited-feature.directive.js\": 535,\n\t\"./portainer/filters/filters.js\": 93,\n\t\"./portainer/filters/index.js\": 1890,\n\t\"./portainer/helpers/endpointHelper.js\": 148,\n\t\"./portainer/helpers/env-vars.js\": 110,\n\t\"./portainer/helpers/formHelper.js\": 1891,\n\t\"./portainer/helpers/genericHelper.js\": 652,\n\t\"./portainer/helpers/networkHelper.js\": 1892,\n\t\"./portainer/helpers/resourceControlHelper.js\": 1893,\n\t\"./portainer/helpers/stackHelper.js\": 1894,\n\t\"./portainer/helpers/tagHelper.js\": 295,\n\t\"./portainer/helpers/templateHelper.js\": 1895,\n\t\"./portainer/helpers/urlHelper.js\": 1896,\n\t\"./portainer/helpers/userHelper.js\": 1897,\n\t\"./portainer/helpers/webhookHelper.js\": 1898,\n\t\"./portainer/interceptors/endpointStatusInterceptor.js\": 1899,\n\t\"./portainer/models/access.js\": 111,\n\t\"./portainer/models/dockerhub.js\": 168,\n\t\"./portainer/models/endpoint/formValues.js\": 401,\n\t\"./portainer/models/endpoint/models.js\": 15,\n\t\"./portainer/models/gitlabRegistry.js\": 653,\n\t\"./portainer/models/group.js\": 232,\n\t\"./portainer/models/motd.js\": 654,\n\t\"./portainer/models/registry.js\": 207,\n\t\"./portainer/models/registryRepository.js\": 655,\n\t\"./portainer/models/registryTypes.js\": 30,\n\t\"./portainer/models/resourceControl/resourceControl.js\": 70,\n\t\"./portainer/models/resourceControl/resourceControlCreatePayload.js\": 1900,\n\t\"./portainer/models/resourceControl/resourceControlOwnership.js\": 29,\n\t\"./portainer/models/resourceControl/resourceControlOwnershipParameters.js\": 268,\n\t\"./portainer/models/resourceControl/resourceControlTypes.js\": 156,\n\t\"./portainer/models/resourceControl/resourceControlUpdatePayload.js\": 1901,\n\t\"./portainer/models/schedule.js\": 299,\n\t\"./portainer/models/settings.js\": 402,\n\t\"./portainer/models/stack.js\": 174,\n\t\"./portainer/models/status.js\": 403,\n\t\"./portainer/models/tag.js\": 404,\n\t\"./portainer/models/team.js\": 405,\n\t\"./portainer/models/teamMembership.js\": 221,\n\t\"./portainer/models/template.js\": 656,\n\t\"./portainer/models/user.js\": 309,\n\t\"./portainer/models/webhook.js\": 657,\n\t\"./portainer/oauth/__module.js\": 1902,\n\t\"./portainer/oauth/components/oauth-providers-selector/index.js\": 1903,\n\t\"./portainer/oauth/components/oauth-providers-selector/oauth-provider-selector.controller.js\": 658,\n\t\"./portainer/oauth/components/oauth-settings/index.js\": 1905,\n\t\"./portainer/oauth/components/oauth-settings/oauth-settings.controller.js\": 659,\n\t\"./portainer/oauth/components/oauth-settings/providers.js\": 406,\n\t\"./portainer/oauth/services/rest/oauth.js\": 1907,\n\t\"./portainer/rbac/components/access-viewer/access-viewer-datatable/index.js\": 468,\n\t\"./portainer/rbac/components/access-viewer/access-viewer.controller.js\": 467,\n\t\"./portainer/rbac/components/access-viewer/index.js\": 466,\n\t\"./portainer/rbac/components/roles-datatable/index.js\": 672,\n\t\"./portainer/rbac/components/roles-datatable/roles-datatable.controller.js\": 469,\n\t\"./portainer/rbac/index.js\": 736,\n\t\"./portainer/rbac/models/access.js\": 262,\n\t\"./portainer/rbac/models/role.js\": 101,\n\t\"./portainer/rbac/services/role.rest.js\": 471,\n\t\"./portainer/rbac/services/role.service.js\": 470,\n\t\"./portainer/rbac/views/roles/index.js\": 464,\n\t\"./portainer/rbac/views/roles/roles.controller.js\": 465,\n\t\"./portainer/rest/auth.js\": 1908,\n\t\"./portainer/rest/backup.js\": 1909,\n\t\"./portainer/rest/customTemplate.js\": 1910,\n\t\"./portainer/rest/endpoint.js\": 1911,\n\t\"./portainer/rest/gitlab.js\": 1912,\n\t\"./portainer/rest/group.js\": 1913,\n\t\"./portainer/rest/legacyExtension.js\": 1914,\n\t\"./portainer/rest/motd.js\": 1915,\n\t\"./portainer/rest/registry.js\": 1916,\n\t\"./portainer/rest/resourceControl.js\": 1917,\n\t\"./portainer/rest/settings.js\": 1918,\n\t\"./portainer/rest/ssl.js\": 1919,\n\t\"./portainer/rest/stack.js\": 1920,\n\t\"./portainer/rest/status.js\": 1921,\n\t\"./portainer/rest/support.js\": 1922,\n\t\"./portainer/rest/tag.js\": 1923,\n\t\"./portainer/rest/team.js\": 1924,\n\t\"./portainer/rest/teamMembership.js\": 1925,\n\t\"./portainer/rest/template.js\": 1926,\n\t\"./portainer/rest/transform/getEndpointsTotalCount.js\": 660,\n\t\"./portainer/rest/transform/gitlabResponseGetLink.js\": 407,\n\t\"./portainer/rest/user.js\": 1927,\n\t\"./portainer/rest/webhooks.js\": 1928,\n\t\"./portainer/services/allSettled.js\": 294,\n\t\"./portainer/services/api/accessService.js\": 1929,\n\t\"./portainer/services/api/backupService.js\": 1930,\n\t\"./portainer/services/api/customTemplate.js\": 1931,\n\t\"./portainer/services/api/dockerhubService.js\": 1932,\n\t\"./portainer/services/api/endpointService.js\": 1933,\n\t\"./portainer/services/api/groupService.js\": 1934,\n\t\"./portainer/services/api/legacyExtensionService.js\": 1935,\n\t\"./portainer/services/api/motdService.js\": 1936,\n\t\"./portainer/services/api/registryService.js\": 1937,\n\t\"./portainer/services/api/resourceControlService.js\": 1938,\n\t\"./portainer/services/api/settingsService.js\": 1939,\n\t\"./portainer/services/api/sslService.js\": 1940,\n\t\"./portainer/services/api/stackService.js\": 1941,\n\t\"./portainer/services/api/statusService.js\": 1942,\n\t\"./portainer/services/api/supportService.js\": 1943,\n\t\"./portainer/services/api/tagService.js\": 1944,\n\t\"./portainer/services/api/teamMembershipService.js\": 1945,\n\t\"./portainer/services/api/teamService.js\": 1946,\n\t\"./portainer/services/api/templateService.js\": 1947,\n\t\"./portainer/services/api/userService.js\": 1948,\n\t\"./portainer/services/api/webhookService.js\": 1949,\n\t\"./portainer/services/async.js\": 1950,\n\t\"./portainer/services/authentication.js\": 1951,\n\t\"./portainer/services/chartService.js\": 1952,\n\t\"./portainer/services/codeMirror.js\": 1953,\n\t\"./portainer/services/datatableService.js\": 1979,\n\t\"./portainer/services/endpointProvider.js\": 1980,\n\t\"./portainer/services/fileUpload.js\": 1981,\n\t\"./portainer/services/formValidator.js\": 1982,\n\t\"./portainer/services/httpRequestHelper.js\": 1983,\n\t\"./portainer/services/legacyExtensionManager.js\": 1984,\n\t\"./portainer/services/localStorage.js\": 1985,\n\t\"./portainer/services/modalService.js\": 1986,\n\t\"./portainer/services/nameValidator.js\": 1987,\n\t\"./portainer/services/notifications.js\": 1988,\n\t\"./portainer/services/pagination.js\": 1989,\n\t\"./portainer/services/registryGitlabService.js\": 1990,\n\t\"./portainer/services/registryModalService.js\": 1991,\n\t\"./portainer/services/session-storage.js\": 260,\n\t\"./portainer/services/stateManager.js\": 1992,\n\t\"./portainer/services/terminal-window.js\": 1993,\n\t\"./portainer/services/themeManager.js\": 1994,\n\t\"./portainer/settings/authentication/auth-method-constants.js\": 263,\n\t\"./portainer/settings/authentication/auth-type-constants.js\": 210,\n\t\"./portainer/settings/authentication/auto-user-provision-toggle/index.js\": 529,\n\t\"./portainer/settings/authentication/index.js\": 496,\n\t\"./portainer/settings/authentication/internal-auth/index.js\": 531,\n\t\"./portainer/settings/authentication/ldap/ad-settings/ad-settings.controller.js\": 499,\n\t\"./portainer/settings/authentication/ldap/ad-settings/index.js\": 498,\n\t\"./portainer/settings/authentication/ldap/index.js\": 497,\n\t\"./portainer/settings/authentication/ldap/ldap-connectivity-check/index.js\": 505,\n\t\"./portainer/settings/authentication/ldap/ldap-custom-admin-group/index.js\": 678,\n\t\"./portainer/settings/authentication/ldap/ldap-custom-admin-group/ldap-custom-admin-group.controller.js\": 521,\n\t\"./portainer/settings/authentication/ldap/ldap-custom-group-search/index.js\": 519,\n\t\"./portainer/settings/authentication/ldap/ldap-custom-group-search/ldap-custom-group-search.controller.js\": 520,\n\t\"./portainer/settings/authentication/ldap/ldap-custom-user-search/index.js\": 524,\n\t\"./portainer/settings/authentication/ldap/ldap-custom-user-search/ldap-custom-user-search.controller.js\": 525,\n\t\"./portainer/settings/authentication/ldap/ldap-group-search-item/index.js\": 509,\n\t\"./portainer/settings/authentication/ldap/ldap-group-search-item/ldap-group-search-item.controller.js\": 510,\n\t\"./portainer/settings/authentication/ldap/ldap-group-search/index.js\": 507,\n\t\"./portainer/settings/authentication/ldap/ldap-group-search/ldap-group-search.controller.js\": 508,\n\t\"./portainer/settings/authentication/ldap/ldap-groups-datatable/index.js\": 506,\n\t\"./portainer/settings/authentication/ldap/ldap-settings-custom/index.js\": 677,\n\t\"./portainer/settings/authentication/ldap/ldap-settings-custom/ldap-settings-custom.controller.js\": 502,\n\t\"./portainer/settings/authentication/ldap/ldap-settings-dn-builder/index.js\": 515,\n\t\"./portainer/settings/authentication/ldap/ldap-settings-dn-builder/ldap-settings-dn-builder.controller.js\": 516,\n\t\"./portainer/settings/authentication/ldap/ldap-settings-group-dn-builder/index.js\": 517,\n\t\"./portainer/settings/authentication/ldap/ldap-settings-group-dn-builder/ldap-settings-group-dn-builder.controller.js\": 518,\n\t\"./portainer/settings/authentication/ldap/ldap-settings-openldap/index.js\": 503,\n\t\"./portainer/settings/authentication/ldap/ldap-settings-openldap/ldap-settings-openldap.controller.js\": 504,\n\t\"./portainer/settings/authentication/ldap/ldap-settings-security/index.js\": 522,\n\t\"./portainer/settings/authentication/ldap/ldap-settings-test-login/index.js\": 679,\n\t\"./portainer/settings/authentication/ldap/ldap-settings-test-login/ldap-settings-test-login.controller.js\": 523,\n\t\"./portainer/settings/authentication/ldap/ldap-settings.model.js\": 226,\n\t\"./portainer/settings/authentication/ldap/ldap-settings/index.js\": 500,\n\t\"./portainer/settings/authentication/ldap/ldap-settings/ldap-settings.controller.js\": 501,\n\t\"./portainer/settings/authentication/ldap/ldap-user-search-item/index.js\": 513,\n\t\"./portainer/settings/authentication/ldap/ldap-user-search-item/ldap-user-search-item.controller.js\": 514,\n\t\"./portainer/settings/authentication/ldap/ldap-user-search/index.js\": 511,\n\t\"./portainer/settings/authentication/ldap/ldap-user-search/ldap-user-search.controller.js\": 512,\n\t\"./portainer/settings/authentication/ldap/ldap-users-datatable/index.js\": 526,\n\t\"./portainer/settings/authentication/ldap/ldap.rest.js\": 528,\n\t\"./portainer/settings/authentication/ldap/ldap.service.js\": 527,\n\t\"./portainer/settings/authentication/save-auth-settings-button/index.js\": 530,\n\t\"./portainer/settings/general/index.js\": 532,\n\t\"./portainer/settings/general/ssl-certificate/index.js\": 533,\n\t\"./portainer/settings/general/ssl-certificate/ssl-certificate.controller.js\": 534,\n\t\"./portainer/settings/index.js\": 495,\n\t\"./portainer/user-activity/activity-logs-view/activity-logs-datatable/activity-logs-datatable.controller.js\": 546,\n\t\"./portainer/user-activity/activity-logs-view/activity-logs-datatable/index.js\": 681,\n\t\"./portainer/user-activity/activity-logs-view/activity-logs-view.controller.js\": 545,\n\t\"./portainer/user-activity/activity-logs-view/activity-logs-view.js\": 544,\n\t\"./portainer/user-activity/activity-logs-view/index.js\": 543,\n\t\"./portainer/user-activity/auth-logs-view/auth-logs-datatable/auth-logs-datatable.controller.js\": 542,\n\t\"./portainer/user-activity/auth-logs-view/auth-logs-datatable/index.js\": 541,\n\t\"./portainer/user-activity/auth-logs-view/auth-logs-view.controller.js\": 540,\n\t\"./portainer/user-activity/auth-logs-view/auth-logs-view.js\": 539,\n\t\"./portainer/user-activity/auth-logs-view/index.js\": 538,\n\t\"./portainer/user-activity/index.js\": 537,\n\t\"./portainer/views/account/accountController.js\": 1995,\n\t\"./portainer/views/account/create-user-access-token/create-user-access-token.controller.js\": 661,\n\t\"./portainer/views/account/create-user-access-token/index.js\": 1996,\n\t\"./portainer/views/auth/authController.js\": 1998,\n\t\"./portainer/views/custom-templates/create-custom-template-view/createCustomTemplateViewController.js\": 662,\n\t\"./portainer/views/custom-templates/create-custom-template-view/index.js\": 2001,\n\t\"./portainer/views/custom-templates/custom-templates-view/customTemplatesViewController.js\": 663,\n\t\"./portainer/views/custom-templates/custom-templates-view/index.js\": 2003,\n\t\"./portainer/views/custom-templates/edit-custom-template-view/editCustomTemplateViewController.js\": 664,\n\t\"./portainer/views/custom-templates/edit-custom-template-view/index.js\": 2005,\n\t\"./portainer/views/endpoint-registries/registries.js\": 2007,\n\t\"./portainer/views/endpoint-registries/registriesController.js\": 2009,\n\t\"./portainer/views/endpoints/access/endpointAccessController.js\": 2010,\n\t\"./portainer/views/endpoints/create/createEndpointController.js\": 2011,\n\t\"./portainer/views/endpoints/edit/endpointController.js\": 2012,\n\t\"./portainer/views/endpoints/endpointsController.js\": 2013,\n\t\"./portainer/views/endpoints/helpers.js\": 163,\n\t\"./portainer/views/groups/access/groupAccessController.js\": 2014,\n\t\"./portainer/views/groups/create/createGroupController.js\": 2015,\n\t\"./portainer/views/groups/edit/groupController.js\": 2016,\n\t\"./portainer/views/groups/groupsController.js\": 2017,\n\t\"./portainer/views/home/homeController.js\": 2018,\n\t\"./portainer/views/init/admin/initAdminController.js\": 2019,\n\t\"./portainer/views/init/endpoint/initEndpointController.js\": 2020,\n\t\"./portainer/views/logout/logoutController.js\": 2024,\n\t\"./portainer/views/main/mainController.js\": 2025,\n\t\"./portainer/views/registries/create/createRegistry.js\": 2026,\n\t\"./portainer/views/registries/create/createRegistryController.js\": 665,\n\t\"./portainer/views/registries/edit/registryController.js\": 2028,\n\t\"./portainer/views/registries/registriesController.js\": 2029,\n\t\"./portainer/views/settings/authentication/settingsAuthenticationController.js\": 2030,\n\t\"./portainer/views/settings/settingsController.js\": 2031,\n\t\"./portainer/views/sidebar/sidebarController.js\": 2032,\n\t\"./portainer/views/stacks/create/createStackController.js\": 2033,\n\t\"./portainer/views/stacks/edit/stackController.js\": 2034,\n\t\"./portainer/views/stacks/stacksController.js\": 2035,\n\t\"./portainer/views/tags/tagsController.js\": 2036,\n\t\"./portainer/views/teams/edit/teamController.js\": 2037,\n\t\"./portainer/views/teams/teamsController.js\": 2038,\n\t\"./portainer/views/templates/templatesController.js\": 2039,\n\t\"./portainer/views/users/edit/userController.js\": 2040,\n\t\"./portainer/views/users/usersController.js\": 2041,\n\t\"./portainer/views/wizard/index.js\": 2042,\n\t\"./portainer/views/wizard/wizard-endpoints/index.js\": 2106,\n\t\"./portainer/views/wizard/wizard-endpoints/wizard-endpoint-aci/index.js\": 2045,\n\t\"./portainer/views/wizard/wizard-endpoints/wizard-endpoint-aci/wizard-aci.controller.js\": 668,\n\t\"./portainer/views/wizard/wizard-endpoints/wizard-endpoint-docker/index.js\": 2047,\n\t\"./portainer/views/wizard/wizard-endpoints/wizard-endpoint-docker/wizard-docker.controller.js\": 669,\n\t\"./portainer/views/wizard/wizard-endpoints/wizard-endpoint-kubernetes/index.js\": 2049,\n\t\"./portainer/views/wizard/wizard-endpoints/wizard-endpoint-kubernetes/wizard-kubernetes.controller.js\": 670,\n\t\"./portainer/views/wizard/wizard-endpoints/wizard-endpoint-list/index.js\": 2107,\n\t\"./portainer/views/wizard/wizard-endpoints/wizard-endpoints.controller.js\": 667,\n\t\"./portainer/views/wizard/wizard-endpoints/wizard-stepper/index.js\": 2108,\n\t\"./portainer/views/wizard/wizard-endpoints/wizard-stepper/wizard-endpoint-type/index.js\": 2053,\n\t\"./portainer/views/wizard/wizard-link/index.js\": 2109,\n\t\"./portainer/views/wizard/wizard-tls/index.js\": 2056,\n\t\"./portainer/views/wizard/wizard-view.controller.js\": 666,\n\t\"./setup-tests.js\": 2058,\n\t\"./vendors.js\": 2059\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 1037;","module.exports = 'test-file-stub';\n","module.exports = {};\n","const autoNgTemplateLoaderTemplate1 = require('./fileUploader.html');\n\nimport angular from 'angular';\nimport { FileUploaderController } from './fileUploaderController';\n\nangular.module('portainer.agent').component('fileUploader', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: FileUploaderController,\n bindings: {\n uploadFile: '<onFileSelected',\n },\n});\n","var path = 'app/agent/components/file-uploader/fileUploader.html';\nvar html = \"<button type=\\\"button\\\" ngf-select=\\\"$ctrl.onFileSelected($file)\\\" class=\\\"btn ng-scope\\\" button-spinner=\\\"$ctrl.state.uploadInProgress\\\">\\n <i style=\\\"margin: 0;\\\" class=\\\"fa fa-upload\\\" ng-if=\\\"!$ctrl.state.uploadInProgress\\\"></i>\\n</button>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./filesDatatable.html');\n\nimport angular from 'angular';\n\nangular.module('portainer.agent').component('filesDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'GenericDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n\n isRoot: '<',\n goToParent: '&',\n browse: '&',\n rename: '&',\n download: '&',\n delete: '&',\n\n isUploadAllowed: '<',\n onFileSelectedForUpload: '<',\n },\n});\n","var path = 'app/agent/components/files-datatable/filesDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"{{ $ctrl.titleIcon }}\\\" title-text=\\\"{{ $ctrl.titleText }}\\\">\\n <file-uploader authorization=\\\"DockerAgentBrowsePut\\\" ng-if=\\\"$ctrl.isUploadAllowed\\\" on-file-selected=\\\"($ctrl.onFileSelectedForUpload)\\\"> </file-uploader>\\n </rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n auto-focus\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table\\\">\\n <thead>\\n <tr>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Name')\\\">\\n Name\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Size')\\\">\\n Size\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Size' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Size' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('ModTime')\\\">\\n Last modification\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'ModTime' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'ModTime' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n Actions\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr ng-if=\\\"!$ctrl.isRoot\\\">\\n <td colspan=\\\"4\\\">\\n <a ng-click=\\\"$ctrl.goToParent()\\\"><i class=\\\"fa fa-level-up-alt space-right\\\"></i>Go to parent</a>\\n </td>\\n </tr>\\n <tr ng-repeat=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder))\\\">\\n <td>\\n <span ng-if=\\\"item.edit\\\">\\n <input\\n class=\\\"input-sm\\\"\\n type=\\\"text\\\"\\n ng-model=\\\"item.newName\\\"\\n on-enter-key=\\\"$ctrl.rename({ name: item.Name, newName: item.newName }); item.edit = false\\\"\\n auto-focus\\n />\\n <a class=\\\"interactive\\\" ng-click=\\\"item.edit = false;\\\"><i class=\\\"fa fa-times\\\"></i></a>\\n <a class=\\\"interactive\\\" ng-click=\\\"$ctrl.rename({name: item.Name, newName: item.newName}); item.edit = false;\\\"><i class=\\\"fa fa-check-square\\\"></i></a>\\n </span>\\n <span ng-if=\\\"!item.edit && item.Dir\\\">\\n <a ng-click=\\\"$ctrl.browse({name: item.Name})\\\"><i class=\\\"fa fa-folder space-right\\\" aria-hidden=\\\"true\\\"></i>{{ item.Name }}</a>\\n </span>\\n <span ng-if=\\\"!item.edit && !item.Dir\\\"> <i class=\\\"fa fa-file space-right\\\" aria-hidden=\\\"true\\\"></i>{{ item.Name }} </span>\\n </td>\\n <td>{{ item.Size | humansize }}</td>\\n <td>\\n {{ item.ModTime | getisodatefromtimestamp }}\\n </td>\\n <td>\\n <btn authorization=\\\"DockerAgentBrowseGet\\\" class=\\\"btn btn-xs btn-primary space-right\\\" ng-click=\\\"$ctrl.download({ name: item.Name })\\\" ng-if=\\\"!item.Dir\\\">\\n <i class=\\\"fa fa-download\\\" aria-hidden=\\\"true\\\"></i> Download\\n </btn>\\n <btn authorization=\\\"DockerAgentBrowseRename\\\" class=\\\"btn btn-xs btn-primary space-right\\\" ng-click=\\\"item.newName = item.Name; item.edit = true\\\">\\n <i class=\\\"fa fa-edit\\\" aria-hidden=\\\"true\\\"></i> Rename\\n </btn>\\n <btn authorization=\\\"DockerAgentBrowseDelete\\\" class=\\\"btn btn-xs btn-danger\\\" ng-click=\\\"$ctrl.delete({ name: item.Name })\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i> Delete\\n </btn>\\n </td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"5\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"5\\\" class=\\\"text-center text-muted\\\">No files found.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./hostBrowser.html');\n\nimport angular from 'angular';\nimport { HostBrowserController } from './hostBrowserController';\n\nangular.module('portainer.agent').component('hostBrowser', {\n controller: HostBrowserController,\n templateUrl: autoNgTemplateLoaderTemplate1,\n});\n","var path = 'app/agent/components/host-browser/hostBrowser.html';\nvar html = \"<files-datatable\\n title-text=\\\"Host browser - {{ $ctrl.getRelativePath() }}\\\"\\n title-icon=\\\"fa-file\\\"\\n dataset=\\\"$ctrl.files\\\"\\n table-key=\\\"host_browser\\\"\\n order-by=\\\"Dir\\\"\\n is-root=\\\"$ctrl.isRoot()\\\"\\n go-to-parent=\\\"$ctrl.goToParent()\\\"\\n browse=\\\"$ctrl.browse(name)\\\"\\n rename=\\\"$ctrl.renameFile(name, newName)\\\"\\n download=\\\"$ctrl.downloadFile(name)\\\"\\n delete=\\\"$ctrl.confirmDeleteFile(name)\\\"\\n is-upload-allowed=\\\"true\\\"\\n on-file-selected-for-upload=\\\"($ctrl.onFileSelectedForUpload)\\\"\\n>\\n</files-datatable>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./nodeSelector.html');\n\nimport angular from 'angular';\n\nimport { NodeSelectorController } from './nodeSelectorController';\n\nangular.module('portainer.agent').component('nodeSelector', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: NodeSelectorController,\n bindings: {\n model: '=',\n },\n});\n","var path = 'app/agent/components/node-selector/nodeSelector.html';\nvar html = \"<div class=\\\"form-group\\\">\\n <label for=\\\"target_node\\\" class=\\\"col-sm-1 control-label text-left\\\">Node</label>\\n <div class=\\\"col-sm-11\\\">\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.model\\\" ng-options=\\\"agent.NodeName as agent.NodeName for agent in $ctrl.agents\\\"></select>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./volumeBrowser.html');\n\nimport angular from 'angular';\n\nimport { VolumeBrowserController } from './volumeBrowserController';\n\nangular.module('portainer.agent').component('volumeBrowser', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: VolumeBrowserController,\n bindings: {\n volumeId: '<',\n nodeName: '<',\n isUploadEnabled: '<',\n },\n});\n","var path = 'app/agent/components/volume-browser/volumeBrowser.html';\nvar html = \"<files-datatable\\n title-text=\\\"Volume browser\\\"\\n title-icon=\\\"fa-file\\\"\\n dataset=\\\"$ctrl.files\\\"\\n table-key=\\\"volume_browser\\\"\\n order-by=\\\"Dir\\\"\\n is-root=\\\"$ctrl.state.path === '/'\\\"\\n go-to-parent=\\\"$ctrl.up()\\\"\\n browse=\\\"$ctrl.browse(name)\\\"\\n rename=\\\"$ctrl.rename(name, newName)\\\"\\n download=\\\"$ctrl.download(name)\\\"\\n delete=\\\"$ctrl.confirmDelete(name)\\\"\\n is-upload-allowed=\\\"$ctrl.isUploadEnabled\\\"\\n on-file-selected-for-upload=\\\"($ctrl.onFileSelectedForUpload)\\\"\\n></files-datatable>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import angular from 'angular';\n\nangular.module('portainer.agent').factory('Agent', AgentFactory);\n\nfunction AgentFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider, StateManager) {\n return $resource(\n `${API_ENDPOINT_ENDPOINTS}/:endpointId/docker/v:version/agents`,\n {\n endpointId: EndpointProvider.endpointID,\n version: StateManager.getAgentApiVersion,\n },\n {\n query: { method: 'GET', isArray: true },\n }\n );\n}\n","import angular from 'angular';\n\nimport { browseGetResponse } from './response/browse';\n\nangular.module('portainer.agent').factory('Browse', BrowseFactory);\n\nfunction BrowseFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider, StateManager) {\n return $resource(\n `${API_ENDPOINT_ENDPOINTS}/:endpointId/docker/v:version/browse/:action`,\n {\n endpointId: EndpointProvider.endpointID,\n version: StateManager.getAgentApiVersion,\n },\n {\n ls: {\n method: 'GET',\n isArray: true,\n params: { action: 'ls' },\n },\n get: {\n method: 'GET',\n params: { action: 'get' },\n transformResponse: browseGetResponse,\n responseType: 'arraybuffer',\n },\n delete: {\n method: 'DELETE',\n params: { action: 'delete' },\n },\n rename: {\n method: 'PUT',\n params: { action: 'rename' },\n },\n }\n );\n}\n","import angular from 'angular';\n\nangular.module('portainer.agent').factory('AgentDockerhub', AgentDockerhub);\n\nfunction AgentDockerhub($resource, API_ENDPOINT_ENDPOINTS) {\n return $resource(\n `${API_ENDPOINT_ENDPOINTS}/:endpointId/agent/:endpointType/v2/dockerhub/:registryId`,\n {},\n {\n limits: { method: 'GET', params: { registryId: '@registryId' } },\n }\n );\n}\n","import angular from 'angular';\n\nangular.module('portainer.agent').factory('Host', HostFactory);\n\nfunction HostFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider, StateManager) {\n return $resource(\n `${API_ENDPOINT_ENDPOINTS}/:endpointId/docker/v:version/host/:action`,\n {\n endpointId: EndpointProvider.endpointID,\n version: StateManager.getAgentApiVersion,\n },\n {\n info: { method: 'GET', params: { action: 'info' } },\n }\n );\n}\n","import angular from 'angular';\n\nangular.module('portainer.agent').factory('AgentPing', AgentPingFactory);\n\nfunction AgentPingFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider, $q) {\n return $resource(\n `${API_ENDPOINT_ENDPOINTS}/:endpointId/docker/ping`,\n {\n endpointId: EndpointProvider.endpointID,\n },\n {\n ping: {\n method: 'GET',\n interceptor: {\n response: function versionInterceptor(response) {\n const instance = response.resource;\n const version = response.headers('Portainer-Agent-Api-Version') || 1;\n instance.version = Number(version);\n return instance;\n },\n responseError: function versionResponseError(error) {\n // 404 - agent is up - set version to 1\n if (error.status === 404) {\n return { version: 1 };\n }\n return $q.reject(error);\n },\n },\n },\n }\n );\n}\n","import angular from 'angular';\n\nangular.module('portainer.agent').factory('AgentVersion1', AgentFactory);\n\nfunction AgentFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider) {\n return $resource(\n `${API_ENDPOINT_ENDPOINTS}/:endpointId/docker/agents`,\n {\n endpointId: EndpointProvider.endpointID,\n },\n {\n query: { method: 'GET', isArray: true },\n }\n );\n}\n","import angular from 'angular';\n\nimport { browseGetResponse } from '../response/browse';\n\nangular.module('portainer.agent').factory('BrowseVersion1', BrowseFactory);\n\nfunction BrowseFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider) {\n return $resource(\n `${API_ENDPOINT_ENDPOINTS}/:endpointId/docker/browse/:volumeID/:action`,\n {\n endpointId: EndpointProvider.endpointID,\n },\n {\n ls: {\n method: 'GET',\n isArray: true,\n params: { action: 'ls' },\n },\n get: {\n method: 'GET',\n params: { action: 'get' },\n transformResponse: browseGetResponse,\n responseType: 'arraybuffer',\n },\n delete: {\n method: 'DELETE',\n params: { action: 'delete' },\n },\n rename: {\n method: 'PUT',\n params: { action: 'rename' },\n },\n }\n );\n}\n","import angular from 'angular';\n\nimport { AgentViewModel } from '../models/agent';\n\nangular.module('portainer.agent').factory('AgentService', AgentServiceFactory);\n\nfunction AgentServiceFactory(Agent, AgentVersion1, HttpRequestHelper, Host, StateManager) {\n return {\n agents,\n hostInfo,\n };\n\n function getAgentApiVersion() {\n const state = StateManager.getState();\n return state.endpoint.agentApiVersion;\n }\n\n function hostInfo(nodeName) {\n HttpRequestHelper.setPortainerAgentTargetHeader(nodeName);\n return Host.info().$promise;\n }\n\n async function agents() {\n const agentVersion = getAgentApiVersion();\n const service = agentVersion > 1 ? Agent : AgentVersion1;\n try {\n const agents = await service.query({ version: agentVersion }).$promise;\n return agents.map(function (item) {\n return new AgentViewModel(item);\n });\n } catch (err) {\n throw { msg: 'Unable to retrieve agents', err };\n }\n }\n}\n","import angular from 'angular';\n\nangular.module('portainer.agent').factory('HostBrowserService', HostBrowserServiceFactory);\n\nfunction HostBrowserServiceFactory(Browse, Upload, API_ENDPOINT_ENDPOINTS, EndpointProvider, StateManager) {\n return { ls, get, delete: deletePath, rename, upload };\n\n function ls(path) {\n return Browse.ls({ path: path }).$promise;\n }\n\n function get(path) {\n return Browse.get({ path: path }).$promise;\n }\n\n function deletePath(path) {\n return Browse.delete({ path: path }).$promise;\n }\n\n function rename(path, newPath) {\n const payload = {\n CurrentFilePath: path,\n NewFilePath: newPath,\n };\n return Browse.rename({}, payload).$promise;\n }\n\n function upload(path, file, onProgress) {\n const agentVersion = StateManager.getAgentApiVersion();\n const url = `${API_ENDPOINT_ENDPOINTS}/${EndpointProvider.endpointID()}/docker${agentVersion > 1 ? '/v' + agentVersion : ''}/browse/put`;\n\n return new Promise((resolve, reject) => {\n Upload.upload({\n url: url,\n data: { file: file, Path: path },\n }).then(resolve, reject, onProgress);\n });\n }\n}\n","import angular from 'angular';\n\nangular.module('portainer.agent').service('AgentPingService', AgentPingService);\n\nfunction AgentPingService(AgentPing) {\n return { ping };\n\n function ping() {\n return AgentPing.ping().$promise;\n }\n}\n","import angular from 'angular';\n\nangular.module('portainer.agent').factory('VolumeBrowserService', VolumeBrowserServiceFactory);\n\nfunction VolumeBrowserServiceFactory(StateManager, Browse, BrowseVersion1, API_ENDPOINT_ENDPOINTS, EndpointProvider, Upload) {\n return {\n ls,\n get,\n delete: deletePath,\n rename,\n upload,\n };\n\n function getAgentApiVersion() {\n const state = StateManager.getState();\n return state.endpoint.agentApiVersion;\n }\n\n function getBrowseService() {\n const agentVersion = getAgentApiVersion();\n return agentVersion > 1 ? Browse : BrowseVersion1;\n }\n\n function ls(volumeId, path) {\n return getBrowseService().ls({ volumeID: volumeId, path, version: getAgentApiVersion() }).$promise;\n }\n\n function get(volumeId, path) {\n return getBrowseService().get({ volumeID: volumeId, path, version: getAgentApiVersion() }).$promise;\n }\n\n function deletePath(volumeId, path) {\n return getBrowseService().delete({ volumeID: volumeId, path, version: getAgentApiVersion() }).$promise;\n }\n\n function rename(volumeId, path, newPath) {\n const payload = {\n CurrentFilePath: path,\n NewFilePath: newPath,\n };\n return getBrowseService().rename({ volumeID: volumeId, version: getAgentApiVersion() }, payload).$promise;\n }\n\n function upload(path, file, volumeId, onProgress) {\n const agentVersion = StateManager.getAgentApiVersion();\n if (agentVersion < 2) {\n throw new Error('upload is not supported on this agent version');\n }\n\n const url = `${API_ENDPOINT_ENDPOINTS}/${EndpointProvider.endpointID()}/docker/v${agentVersion}/browse/put?volumeID=${volumeId}`;\n\n return new Promise((resolve, reject) => {\n Upload.upload({\n url: url,\n data: { file, Path: path },\n }).then(resolve, reject, onProgress);\n });\n }\n}\n","import $ from 'jquery';\nimport { PortainerEndpointTypes } from 'Portainer/models/endpoint/models';\n\nangular.module('portainer').run([\n '$rootScope',\n '$state',\n '$interval',\n 'LocalStorage',\n 'EndpointProvider',\n 'SystemService',\n 'cfpLoadingBar',\n '$transitions',\n 'HttpRequestHelper',\n function ($rootScope, $state, $interval, LocalStorage, EndpointProvider, SystemService, cfpLoadingBar, $transitions, HttpRequestHelper) {\n 'use strict';\n\n EndpointProvider.initialize();\n\n $rootScope.$state = $state;\n $rootScope.defaultTitle = document.title;\n\n // Workaround to prevent the loading bar from going backward\n // https://github.com/chieffancypants/angular-loading-bar/issues/273\n var originalSet = cfpLoadingBar.set;\n cfpLoadingBar.set = function overrideSet(n) {\n if (n > cfpLoadingBar.status()) {\n originalSet.apply(cfpLoadingBar, arguments);\n }\n };\n\n $transitions.onBefore({}, function () {\n HttpRequestHelper.resetAgentHeaders();\n });\n\n // Keep-alive Edge endpoints by sending a ping request every minute\n $interval(function () {\n ping(EndpointProvider, SystemService);\n }, 60 * 1000);\n\n $(document).ajaxSend(function (event, jqXhr, jqOpts) {\n const type = jqOpts.type === 'POST' || jqOpts.type === 'PUT' || jqOpts.type === 'PATCH';\n const hasNoContentType = jqOpts.contentType !== 'application/json' && jqOpts.headers && !jqOpts.headers['Content-Type'];\n if (type && hasNoContentType) {\n jqXhr.setRequestHeader('Content-Type', 'application/json');\n }\n jqXhr.setRequestHeader('Authorization', 'Bearer ' + LocalStorage.getJWT());\n });\n },\n]);\n\nfunction ping(EndpointProvider, SystemService) {\n let endpoint = EndpointProvider.currentEndpoint();\n if (endpoint !== undefined && endpoint.Type == PortainerEndpointTypes.EdgeAgentOnDockerEnvironment) {\n SystemService.ping(endpoint.Id);\n }\n}\n","const autoNgTemplateLoaderTemplate1 = require('./azureEndpointConfig.html');\n\nangular.module('portainer.azure').component('azureEndpointConfig', {\n bindings: {\n applicationId: '=',\n tenantId: '=',\n authenticationKey: '=',\n },\n templateUrl: autoNgTemplateLoaderTemplate1,\n});\n","var path = 'app/azure/components/azure-endpoint-config/azureEndpointConfig.html';\nvar html = \"<div>\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Azure configuration\\n </div>\\n <!-- applicationId-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"azure_credential_appid\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Application ID</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" name=\\\"azure_credential_appid\\\" ng-model=\\\"$ctrl.applicationId\\\" placeholder=\\\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\\\" required />\\n </div>\\n </div>\\n <!-- !applicationId-input -->\\n <!-- tenantId-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"azure_credential_tenantid\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Tenant ID</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" name=\\\"azure_credential_tenantid\\\" ng-model=\\\"$ctrl.tenantId\\\" placeholder=\\\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\\\" required />\\n </div>\\n </div>\\n <!-- !tenantId-input -->\\n <!-- authenticationkey-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"azure_credential_authkey\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Authentication key</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n name=\\\"azure_credential_authkey\\\"\\n ng-model=\\\"$ctrl.authenticationKey\\\"\\n placeholder=\\\"cOrXoK/1D35w8YQ8nH1/8ZGwzz45JIYD5jxHKXEQknk=\\\"\\n required\\n />\\n </div>\\n </div>\\n <!-- !authenticationkey-input -->\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./azure-sidebar.html');\n\nimport angular from 'angular';\n\nangular.module('portainer.azure').component('azureSidebar', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n endpointId: '<',\n },\n});\n","var path = 'app/azure/components/azure-sidebar/azure-sidebar.html';\nvar html = \"<sidebar-menu-item\\n path=\\\"azure.dashboard\\\"\\n path-params=\\\"{ endpointId: $ctrl.endpointId }\\\"\\n icon-class=\\\"fa-tachometer-alt fa-fw\\\"\\n class-name=\\\"sidebar-list\\\"\\n data-cy=\\\"azureSidebar-dashboard\\\"\\n>\\n Dashboard\\n</sidebar-menu-item>\\n\\n<sidebar-menu-item\\n path=\\\"azure.containerinstances\\\"\\n path-params=\\\"{ endpointId: $ctrl.endpointId }\\\"\\n icon-class=\\\"fa-cubes fa-fw\\\"\\n class-name=\\\"sidebar-list\\\"\\n data-cy=\\\"azureSidebar-containerInstances\\\"\\n>\\n Container instances\\n</sidebar-menu-item>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./containerGroupsDatatable.html');\n\nangular.module('portainer.azure').component('containergroupsDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'GenericDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n removeAction: '<',\n },\n});\n","var path = 'app/azure/components/datatables/containergroups-datatable/containerGroupsDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n </div>\\n <div class=\\\"actionBar\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-danger\\\" ng-disabled=\\\"$ctrl.state.selectedItemCount === 0\\\" ng-click=\\\"$ctrl.removeAction($ctrl.state.selectedItems)\\\">\\n <i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Remove\\n </button>\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ui-sref=\\\"azure.containerinstances.new\\\">\\n <i class=\\\"fa fa-plus space-right\\\" aria-hidden=\\\"true\\\"></i>Add container\\n </button>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n auto-focus\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover table-filters nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th>\\n <span class=\\\"md-checkbox\\\">\\n <input id=\\\"select_all\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.state.selectAll\\\" ng-change=\\\"$ctrl.selectAll()\\\" />\\n <label for=\\\"select_all\\\"></label>\\n </span>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Name')\\\">\\n Name\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Location')\\\">\\n Location\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Location' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Location' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n Published Ports\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('ResourceControl.Ownership')\\\">\\n Ownership\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'ResourceControl.Ownership' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'ResourceControl.Ownership' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit))\\\"\\n ng-class=\\\"{ active: item.Checked }\\\"\\n >\\n <td>\\n <span class=\\\"md-checkbox\\\">\\n <input id=\\\"select_{{ $index }}\\\" type=\\\"checkbox\\\" ng-model=\\\"item.Checked\\\" ng-click=\\\"$ctrl.selectItem(item, $event)\\\" />\\n <label for=\\\"select_{{ $index }}\\\"></label>\\n </span>\\n <a ui-sref=\\\"azure.containerinstances.container({ id: item.Id })\\\">{{ item.Name | truncate: 50 }}</a>\\n </td>\\n <td>{{ item.Location }}</td>\\n <td>\\n <a ng-if=\\\"item.Ports.length > 0\\\" ng-repeat=\\\"p in item.Ports\\\" class=\\\"image-tag\\\" ng-href=\\\"http://{{ item.IPAddress }}:{{ p.host }}\\\" target=\\\"_blank\\\">\\n <i class=\\\"fa fa-external-link-alt\\\" aria-hidden=\\\"true\\\"></i> {{ item.IPAddress }}:{{ p.host }}\\n </a>\\n <span ng-if=\\\"item.Ports.length == 0\\\">-</span>\\n </td>\\n <td>\\n <span>\\n <i ng-class=\\\"item.ResourceControl.Ownership | ownershipicon\\\" aria-hidden=\\\"true\\\"></i>\\n {{ item.ResourceControl.Ownership ? item.ResourceControl.Ownership : item.ResourceControl.Ownership = $ctrl.RCO.ADMINISTRATORS }}\\n </span>\\n </td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"3\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"3\\\" class=\\\"text-center text-muted\\\">No container available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","angular.module('portainer.azure').factory('Azure', [\n '$http',\n 'API_ENDPOINT_ENDPOINTS',\n 'EndpointProvider',\n function AzureFactory($http, API_ENDPOINT_ENDPOINTS, EndpointProvider) {\n 'use strict';\n\n var service = {};\n\n service.delete = function (id, apiVersion) {\n var url = API_ENDPOINT_ENDPOINTS + '/' + EndpointProvider.endpointID() + '/azure' + id + '?api-version=' + apiVersion;\n return $http({\n method: 'DELETE',\n url: url,\n });\n };\n\n return service;\n },\n]);\n","angular.module('portainer.azure').factory('ContainerGroup', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n 'EndpointProvider',\n function ContainerGroupFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider) {\n 'use strict';\n\n var resource = {};\n\n var base = $resource(\n API_ENDPOINT_ENDPOINTS + '/:endpointId/azure/subscriptions/:subscriptionId/providers/Microsoft.ContainerInstance/containerGroups',\n {\n endpointId: EndpointProvider.endpointID,\n 'api-version': '2018-04-01',\n },\n {\n query: { method: 'GET', params: { subscriptionId: '@subscriptionId' } },\n }\n );\n\n var withResourceGroup = $resource(\n API_ENDPOINT_ENDPOINTS +\n '/:endpointId/azure/subscriptions/:subscriptionId/resourceGroups/:resourceGroupName/providers/Microsoft.ContainerInstance/containerGroups/:containerGroupName',\n {\n endpointId: EndpointProvider.endpointID,\n 'api-version': '2018-04-01',\n },\n {\n create: {\n method: 'PUT',\n params: {\n subscriptionId: '@subscriptionId',\n resourceGroupName: '@resourceGroupName',\n containerGroupName: '@containerGroupName',\n },\n },\n get: {\n method: 'GET',\n },\n }\n );\n\n resource.query = base.query;\n resource.create = withResourceGroup.create;\n resource.get = withResourceGroup.get;\n return resource;\n },\n]);\n","angular.module('portainer.azure').factory('Location', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n 'EndpointProvider',\n function LocationFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider) {\n 'use strict';\n return $resource(\n API_ENDPOINT_ENDPOINTS + '/:endpointId/azure/subscriptions/:subscriptionId/locations',\n {\n endpointId: EndpointProvider.endpointID,\n 'api-version': '2016-06-01',\n },\n {\n query: { method: 'GET', params: { subscriptionId: '@subscriptionId' } },\n }\n );\n },\n]);\n","angular.module('portainer.azure').factory('Provider', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n 'EndpointProvider',\n function ProviderFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider) {\n 'use strict';\n return $resource(\n API_ENDPOINT_ENDPOINTS + '/:endpointId/azure/subscriptions/:subscriptionId/providers/:providerNamespace',\n {\n endpointId: EndpointProvider.endpointID,\n 'api-version': '2018-02-01',\n },\n {\n get: { method: 'GET', params: { subscriptionId: '@subscriptionId', providerNamespace: '@providerNamespace' } },\n }\n );\n },\n]);\n","angular.module('portainer.azure').factory('ResourceGroup', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n 'EndpointProvider',\n function ResourceGroupFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider) {\n 'use strict';\n return $resource(\n API_ENDPOINT_ENDPOINTS + '/:endpointId/azure/subscriptions/:subscriptionId/resourcegroups/:resourceGroupName',\n {\n endpointId: EndpointProvider.endpointID,\n 'api-version': '2018-02-01',\n },\n {\n query: { method: 'GET', params: { subscriptionId: '@subscriptionId' } },\n get: { method: 'GET' },\n }\n );\n },\n]);\n","angular.module('portainer.azure').factory('Subscription', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n 'EndpointProvider',\n function SubscriptionFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider) {\n 'use strict';\n return $resource(\n API_ENDPOINT_ENDPOINTS + '/:endpointId/azure/subscriptions/:id',\n {\n endpointId: EndpointProvider.endpointID,\n 'api-version': '2016-06-01',\n },\n {\n query: { method: 'GET' },\n get: { method: 'GET', params: { id: '@id' } },\n }\n );\n },\n]);\n","angular.module('portainer.azure').factory('AzureService', [\n '$q',\n 'Azure',\n 'SubscriptionService',\n 'ResourceGroupService',\n 'ContainerGroupService',\n 'ProviderService',\n function AzureServiceFactory($q, Azure, SubscriptionService, ResourceGroupService, ContainerGroupService, ProviderService) {\n 'use strict';\n var service = {};\n\n service.deleteContainerGroup = function (id) {\n return Azure.delete(id, '2018-04-01');\n };\n\n service.createContainerGroup = function (model, subscriptionId, resourceGroupName) {\n return ContainerGroupService.create(model, subscriptionId, resourceGroupName);\n };\n\n service.subscriptions = function () {\n return SubscriptionService.subscriptions();\n };\n\n service.containerInstanceProvider = function (subscriptions) {\n return retrieveResourcesForEachSubscription(subscriptions, ProviderService.containerInstanceProvider);\n };\n\n service.resourceGroups = function (subscriptions) {\n return retrieveResourcesForEachSubscription(subscriptions, ResourceGroupService.resourceGroups);\n };\n\n service.containerGroups = function (subscriptions) {\n return retrieveResourcesForEachSubscription(subscriptions, ContainerGroupService.containerGroups);\n };\n\n service.aggregate = function (resourcesBySubcription) {\n var aggregatedResources = [];\n Object.keys(resourcesBySubcription).forEach(function (key) {\n aggregatedResources = aggregatedResources.concat(resourcesBySubcription[key]);\n });\n return aggregatedResources;\n };\n\n function retrieveResourcesForEachSubscription(subscriptions, resourceQuery) {\n var deferred = $q.defer();\n\n var resources = {};\n\n var resourceQueries = [];\n for (var i = 0; i < subscriptions.length; i++) {\n var subscription = subscriptions[i];\n resourceQueries.push(resourceQuery(subscription.Id));\n }\n\n $q.all(resourceQueries)\n .then(function success(data) {\n for (var i = 0; i < data.length; i++) {\n var result = data[i];\n resources[subscriptions[i].Id] = result;\n }\n deferred.resolve(resources);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve resources', err: err });\n });\n\n return deferred.promise;\n }\n\n return service;\n },\n]);\n","import { ContainerGroupViewModel, CreateContainerGroupRequest } from '../models/container_group';\n\nangular.module('portainer.azure').factory('ContainerGroupService', [\n '$q',\n 'ContainerGroup',\n function ContainerGroupServiceFactory($q, ContainerGroup) {\n 'use strict';\n var service = {};\n\n service.containerGroups = function (subscriptionId) {\n var deferred = $q.defer();\n\n ContainerGroup.query({ subscriptionId: subscriptionId })\n .$promise.then(function success(data) {\n var containerGroups = data.value.map(function (item) {\n return new ContainerGroupViewModel(item);\n });\n deferred.resolve(containerGroups);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve container groups', err: err });\n });\n\n return deferred.promise;\n };\n\n service.containerGroup = containerGroup;\n async function containerGroup(subscriptionId, resourceGroupName, containerGroupName) {\n const containerGroup = await ContainerGroup.get({ subscriptionId, resourceGroupName, containerGroupName }).$promise;\n return new ContainerGroupViewModel(containerGroup);\n }\n\n service.create = function (model, subscriptionId, resourceGroupName) {\n var payload = new CreateContainerGroupRequest(model);\n return ContainerGroup.create(\n {\n subscriptionId: subscriptionId,\n resourceGroupName: resourceGroupName,\n containerGroupName: model.Name,\n },\n payload\n ).$promise;\n };\n\n return service;\n },\n]);\n","import { LocationViewModel } from '../models/location';\n\nangular.module('portainer.azure').factory('LocationService', [\n '$q',\n 'Location',\n function LocationServiceFactory($q, Location) {\n 'use strict';\n var service = {};\n\n service.locations = function (subscriptionId) {\n var deferred = $q.defer();\n\n Location.query({ subscriptionId: subscriptionId })\n .$promise.then(function success(data) {\n var locations = data.value.map(function (item) {\n return new LocationViewModel(item);\n });\n deferred.resolve(locations);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve locations', err: err });\n });\n\n return deferred.promise;\n };\n\n return service;\n },\n]);\n","import { ContainerInstanceProviderViewModel } from '../models/provider';\n\nangular.module('portainer.azure').factory('ProviderService', [\n '$q',\n 'Provider',\n function ProviderServiceFactory($q, Provider) {\n 'use strict';\n var service = {};\n\n service.containerInstanceProvider = function (subscriptionId) {\n var deferred = $q.defer();\n\n Provider.get({ subscriptionId: subscriptionId, providerNamespace: 'Microsoft.ContainerInstance' })\n .$promise.then(function success(data) {\n var provider = new ContainerInstanceProviderViewModel(data);\n deferred.resolve(provider);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve provider', err: err });\n });\n\n return deferred.promise;\n };\n\n return service;\n },\n]);\n","import { ResourceGroupViewModel } from '../models/resource_group';\n\nangular.module('portainer.azure').factory('ResourceGroupService', [\n '$q',\n 'ResourceGroup',\n function ResourceGroupServiceFactory($q, ResourceGroup) {\n 'use strict';\n var service = {};\n\n service.resourceGroups = function (subscriptionId) {\n var deferred = $q.defer();\n\n ResourceGroup.query({ subscriptionId: subscriptionId })\n .$promise.then(function success(data) {\n var resourceGroups = data.value.map(function (item) {\n return new ResourceGroupViewModel(item, subscriptionId);\n });\n deferred.resolve(resourceGroups);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve resource groups', err: err });\n });\n\n return deferred.promise;\n };\n\n service.resourceGroup = resourceGroup;\n async function resourceGroup(subscriptionId, resourceGroupName) {\n const group = await ResourceGroup.get({ subscriptionId, resourceGroupName }).$promise;\n return new ResourceGroupViewModel(group);\n }\n\n return service;\n },\n]);\n","import { SubscriptionViewModel } from '../models/subscription';\n\nangular.module('portainer.azure').factory('SubscriptionService', [\n '$q',\n 'Subscription',\n function SubscriptionServiceFactory($q, Subscription) {\n 'use strict';\n var service = {};\n\n service.subscriptions = function () {\n var deferred = $q.defer();\n\n Subscription.query({})\n .$promise.then(function success(data) {\n var subscriptions = data.value.map(function (item) {\n return new SubscriptionViewModel(item);\n });\n deferred.resolve(subscriptions);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve subscriptions', err: err });\n });\n\n return deferred.promise;\n };\n\n service.subscription = subscription;\n async function subscription(id) {\n const subscription = await Subscription.get({ id }).$promise;\n return new SubscriptionViewModel(subscription);\n }\n\n return service;\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./containerInstanceDetails.html');\n\nimport ContainerInstanceDetailsController from './containerInstanceDetailsController.js';\n\nangular.module('portainer.azure').component('containerInstanceDetails', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: ContainerInstanceDetailsController,\n});\n","var path = 'app/azure/views/containerinstances/container-instance-details/containerInstanceDetails.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Container Instance\\\"></rd-header-title>\\n <rd-header-content> <a ui-sref=\\\"azure.containerinstances\\\">Container instances</a> > {{ $ctrl.container.Name }} </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\" ng-if=\\\"!$ctrl.state.loading\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <div class=\\\"form-horizontal\\\" autocomplete=\\\"off\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Azure settings\\n </div>\\n <!-- subscription-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"azure_subscription\\\" class=\\\"col-sm-2 control-label text-left\\\">Subscription</label>\\n <div class=\\\"col-sm-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"$ctrl.subscription.Name\\\" disabled />\\n </div>\\n </div>\\n <!-- !subscription-input -->\\n <!-- resourcegroup-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"azure_resourcegroup\\\" class=\\\"col-sm-2 control-label text-left\\\">Resource group</label>\\n <div class=\\\"col-sm-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"$ctrl.resourceGroup.Name\\\" disabled />\\n </div>\\n </div>\\n <!-- !resourcegroup-input -->\\n <!-- location-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"azure_location\\\" class=\\\"col-sm-2 control-label text-left\\\">Location</label>\\n <div class=\\\"col-sm-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"$ctrl.container.Location\\\" disabled />\\n </div>\\n </div>\\n <!-- !location-input -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Container configuration\\n </div>\\n <!-- name-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"container_name\\\" class=\\\"col-sm-2 control-label text-left\\\">Name</label>\\n <div class=\\\"col-sm-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"$ctrl.container.Name\\\" disabled />\\n </div>\\n </div>\\n <!-- !name-input -->\\n <!-- image-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"image_name\\\" class=\\\"col-sm-2 control-label text-left\\\">Image</label>\\n <div class=\\\"col-sm-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"$ctrl.container.Image\\\" disabled />\\n </div>\\n </div>\\n <!-- !image-input -->\\n <!-- os-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"container_os\\\" class=\\\"col-sm-2 control-label text-left\\\">OS</label>\\n <div class=\\\"col-sm-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"$ctrl.container.OSType\\\" disabled />\\n </div>\\n </div>\\n <!-- !os-input -->\\n <!-- port-mapping -->\\n <div class=\\\"form-group\\\" ng-if=\\\"$ctrl.container.Ports.length > 0\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label class=\\\"control-label text-left\\\">Port mapping</label>\\n </div>\\n <!-- port-mapping-input-list -->\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\">\\n <div ng-repeat=\\\"binding in $ctrl.container.Ports\\\" style=\\\"margin-top: 2px;\\\">\\n <!-- host-port -->\\n <div class=\\\"input-group col-sm-4 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">host</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"binding.host\\\" placeholder=\\\"e.g. 80\\\" disabled />\\n </div>\\n <!-- !host-port -->\\n <span style=\\\"margin: 0 10px 0 10px;\\\">\\n <i class=\\\"fa fa-long-arrow-alt-right\\\" aria-hidden=\\\"true\\\"></i>\\n </span>\\n <!-- container-port -->\\n <div class=\\\"input-group col-sm-4 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">container</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"binding.container\\\" placeholder=\\\"e.g. 80\\\" disabled />\\n </div>\\n <!-- !container-port -->\\n <!-- protocol-actions -->\\n <div class=\\\"input-group col-sm-3 input-group-sm\\\">\\n <div class=\\\"btn-group btn-group-sm\\\">\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"binding.protocol\\\" uib-btn-radio=\\\"'TCP'\\\" disabled>TCP</label>\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"binding.protocol\\\" uib-btn-radio=\\\"'UDP'\\\" disabled>UDP</label>\\n </div>\\n </div>\\n <!-- !protocol-actions -->\\n </div>\\n </div>\\n <!-- !port-mapping-input-list -->\\n </div>\\n <!-- !port-mapping -->\\n <!-- public-ip -->\\n <div class=\\\"form-group\\\" ng-if=\\\"$ctrl.container.AllocatePublicIP\\\">\\n <label for=\\\"public_ip\\\" class=\\\"col-sm-2 control-label text-left\\\">\\n Public IP\\n </label>\\n <div class=\\\"col-sm-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"$ctrl.container.IPAddress\\\" disabled />\\n </div>\\n </div>\\n <!-- public-ip -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Container resources\\n </div>\\n <!-- cpu-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"container_cpu\\\" class=\\\"col-sm-2 control-label text-left\\\">CPU</label>\\n <div class=\\\"col-sm-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"$ctrl.container.CPU\\\" disabled />\\n </div>\\n </div>\\n <!-- !cpu-input -->\\n <!-- memory-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"container_memory\\\" class=\\\"col-sm-2 control-label text-left\\\">Memory</label>\\n <div class=\\\"col-sm-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"$ctrl.container.Memory\\\" disabled />\\n </div>\\n </div>\\n <!-- !memory-input -->\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n <!-- access-control-panel -->\\n <por-access-control-panel ng-if=\\\"$ctrl.container\\\" resource-id=\\\"$ctrl.container.Id\\\" resource-control=\\\"$ctrl.container.ResourceControl\\\" resource-type=\\\"'container-group'\\\">\\n </por-access-control-panel>\\n <!-- !access-control-panel -->\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","angular.module('portainer.azure').controller('AzureContainerInstancesController', [\n '$scope',\n '$state',\n 'AzureService',\n 'Notifications',\n function ($scope, $state, AzureService, Notifications) {\n function initView() {\n AzureService.subscriptions()\n .then(function success(data) {\n var subscriptions = data;\n return AzureService.containerGroups(subscriptions);\n })\n .then(function success(data) {\n $scope.containerGroups = AzureService.aggregate(data);\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to load container groups');\n });\n }\n\n $scope.deleteAction = function (selectedItems) {\n var actionCount = selectedItems.length;\n angular.forEach(selectedItems, function (item) {\n AzureService.deleteContainerGroup(item.Id)\n .then(function success() {\n Notifications.success('Container group successfully removed', item.Name);\n var index = $scope.containerGroups.indexOf(item);\n $scope.containerGroups.splice(index, 1);\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to remove container group');\n })\n .finally(function final() {\n --actionCount;\n if (actionCount === 0) {\n $state.reload();\n }\n });\n });\n };\n\n initView();\n },\n]);\n","import { ContainerGroupDefaultModel } from '../../../models/container_group';\n\nangular.module('portainer.azure').controller('AzureCreateContainerInstanceController', [\n '$q',\n '$scope',\n '$state',\n 'AzureService',\n 'Notifications',\n 'Authentication',\n 'ResourceControlService',\n 'FormValidator',\n function ($q, $scope, $state, AzureService, Notifications, Authentication, ResourceControlService, FormValidator) {\n var allResourceGroups = [];\n var allProviders = [];\n\n $scope.state = {\n actionInProgress: false,\n selectedSubscription: null,\n selectedResourceGroup: null,\n formValidationError: '',\n };\n\n $scope.changeSubscription = function () {\n var selectedSubscription = $scope.state.selectedSubscription;\n updateResourceGroupsAndLocations(selectedSubscription, allResourceGroups, allProviders);\n };\n\n $scope.addPortBinding = function () {\n $scope.model.Ports.push({ host: '', container: '', protocol: 'TCP' });\n };\n\n $scope.removePortBinding = function (index) {\n $scope.model.Ports.splice(index, 1);\n };\n\n $scope.create = function () {\n var model = $scope.model;\n var subscriptionId = $scope.state.selectedSubscription.Id;\n var resourceGroupName = $scope.state.selectedResourceGroup.Name;\n\n $scope.state.formValidationError = validateForm(model);\n if ($scope.state.formValidationError) {\n return false;\n }\n\n $scope.state.actionInProgress = true;\n AzureService.createContainerGroup(model, subscriptionId, resourceGroupName)\n .then(applyResourceControl)\n .then(() => {\n Notifications.success('Container successfully created', model.Name);\n $state.go('azure.containerinstances');\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to create container');\n })\n .finally(function final() {\n $scope.state.actionInProgress = false;\n });\n };\n\n function applyResourceControl(newResourceGroup) {\n const userId = Authentication.getUserDetails().ID;\n const resourceControl = newResourceGroup.Portainer.ResourceControl;\n const accessControlData = $scope.model.AccessControlData;\n\n return ResourceControlService.applyResourceControl(userId, accessControlData, resourceControl);\n }\n\n function validateForm(model) {\n if (!model.Ports || !model.Ports.length || model.Ports.every((port) => !port.host || !port.container)) {\n return 'At least one port binding is required';\n }\n\n const error = FormValidator.validateAccessControl(model.AccessControlData, Authentication.isAdmin());\n if (error !== '') {\n return error;\n }\n\n return null;\n }\n\n function updateResourceGroupsAndLocations(subscription, resourceGroups, providers) {\n $scope.state.selectedResourceGroup = resourceGroups[subscription.Id][0];\n $scope.resourceGroups = resourceGroups[subscription.Id];\n\n var currentSubLocations = providers[subscription.Id].Locations;\n $scope.model.Location = currentSubLocations[0];\n $scope.locations = currentSubLocations;\n }\n\n function initView() {\n $scope.model = new ContainerGroupDefaultModel();\n\n AzureService.subscriptions()\n .then(function success(data) {\n var subscriptions = data;\n $scope.state.selectedSubscription = subscriptions[0];\n $scope.subscriptions = subscriptions;\n\n return $q.all({\n resourceGroups: AzureService.resourceGroups(subscriptions),\n containerInstancesProviders: AzureService.containerInstanceProvider(subscriptions),\n });\n })\n .then(function success(data) {\n var resourceGroups = data.resourceGroups;\n allResourceGroups = resourceGroups;\n\n var containerInstancesProviders = data.containerInstancesProviders;\n allProviders = containerInstancesProviders;\n\n var selectedSubscription = $scope.state.selectedSubscription;\n updateResourceGroupsAndLocations(selectedSubscription, resourceGroups, containerInstancesProviders);\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve Azure resources');\n });\n }\n\n initView();\n },\n]);\n","angular.module('portainer.azure').controller('AzureDashboardController', [\n '$scope',\n 'AzureService',\n 'Notifications',\n function ($scope, AzureService, Notifications) {\n function initView() {\n AzureService.subscriptions()\n .then(function success(data) {\n var subscriptions = data;\n $scope.subscriptions = subscriptions;\n return AzureService.resourceGroups(subscriptions);\n })\n .then(function success(data) {\n $scope.resourceGroups = AzureService.aggregate(data);\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to load dashboard data');\n });\n }\n\n initView();\n },\n]);\n","import toastr from 'toastr';\nimport { Terminal } from 'xterm';\nimport * as fit from 'xterm/lib/addons/fit/fit';\n\nangular.module('portainer').config([\n '$urlRouterProvider',\n '$httpProvider',\n 'localStorageServiceProvider',\n 'jwtOptionsProvider',\n '$uibTooltipProvider',\n '$compileProvider',\n 'cfpLoadingBarProvider',\n function ($urlRouterProvider, $httpProvider, localStorageServiceProvider, jwtOptionsProvider, $uibTooltipProvider, $compileProvider, cfpLoadingBarProvider) {\n 'use strict';\n\n if (process.env.NODE_ENV === 'testing') {\n $compileProvider.debugInfoEnabled(false);\n }\n\n localStorageServiceProvider.setPrefix('portainer');\n\n jwtOptionsProvider.config({\n tokenGetter: [\n 'LocalStorage',\n function (LocalStorage) {\n return LocalStorage.getJWT();\n },\n ],\n });\n $httpProvider.interceptors.push('jwtInterceptor');\n $httpProvider.interceptors.push('EndpointStatusInterceptor');\n $httpProvider.defaults.headers.post['Content-Type'] = 'application/json';\n $httpProvider.defaults.headers.put['Content-Type'] = 'application/json';\n $httpProvider.defaults.headers.patch['Content-Type'] = 'application/json';\n\n $httpProvider.interceptors.push([\n 'HttpRequestHelper',\n function (HttpRequestHelper) {\n return {\n request: function (config) {\n if (config.url.indexOf('/docker/') > -1) {\n config.headers['X-PortainerAgent-Target'] = HttpRequestHelper.portainerAgentTargetHeader();\n if (HttpRequestHelper.portainerAgentManagerOperation()) {\n config.headers['X-PortainerAgent-ManagerOperation'] = '1';\n }\n }\n return config;\n },\n };\n },\n ]);\n\n toastr.options = {\n timeOut: 3000,\n closeButton: true,\n progressBar: true,\n tapToDismiss: false,\n };\n\n Terminal.applyAddon(fit);\n\n $uibTooltipProvider.setTriggers({\n mouseenter: 'mouseleave',\n click: 'click',\n focus: 'blur',\n outsideClick: 'outsideClick',\n });\n\n cfpLoadingBarProvider.includeSpinner = false;\n cfpLoadingBarProvider.parentSelector = '#loadingbar-placeholder';\n cfpLoadingBarProvider.latencyThreshold = 600;\n\n $urlRouterProvider.otherwise('/auth');\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./containerCapabilities.html');\n\nangular.module('portainer.docker').component('containerCapabilities', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n capabilities: '=',\n },\n});\n","var path = 'app/docker/components/container-capabilities/containerCapabilities.html';\nvar html = \"<form class=\\\"form-horizontal\\\" style=\\\"margin-top: 15px;\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Container capabilities\\n </div>\\n <div class=\\\"form-group\\\">\\n <div ng-repeat=\\\"cap in $ctrl.capabilities\\\" class=\\\"col-xs-12 col-sm-6 col-md-4\\\">\\n <div class=\\\"row\\\">\\n <div class=\\\"col-xs-8\\\">\\n <label for=\\\"capability\\\" class=\\\"control-label text-left\\\" style=\\\"display: flex; padding: 0;\\\">\\n {{ cap.capability }}\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"{{ cap.description }}\\\"></portainer-tooltip>\\n </label>\\n </div>\\n <div class=\\\"col-xs-4\\\">\\n <label class=\\\"switch\\\"> <input type=\\\"checkbox\\\" name=\\\"capability\\\" ng-model=\\\"cap.allowed\\\" /><i></i> </label>\\n </div>\\n </div>\\n </div>\\n </div>\\n</form>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./containerQuickActions.html');\n\nangular.module('portainer.docker').component('containerQuickActions', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n containerId: '<',\n nodeName: '<',\n status: '<',\n state: '<',\n taskId: '<',\n },\n});\n","var path = 'app/docker/components/container-quick-actions/containerQuickActions.html';\nvar html = \"<div class=\\\"btn-group btn-group-xs\\\" role=\\\"group\\\" aria-label=\\\"...\\\" style=\\\"display: inline-flex;\\\">\\n <a\\n authorization=\\\"DockerContainerLogs\\\"\\n ng-if=\\\"$ctrl.state.showQuickActionLogs && $ctrl.taskId === undefined\\\"\\n style=\\\"margin: 0 2.5px;\\\"\\n ui-sref=\\\"docker.containers.container.logs({id: $ctrl.containerId, nodeName: $ctrl.nodeName})\\\"\\n title=\\\"Logs\\\"\\n >\\n <i class=\\\"fa fa-file-alt space-right\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n <a\\n authorization=\\\"DockerTaskLogs\\\"\\n ng-if=\\\"$ctrl.state.showQuickActionLogs && $ctrl.taskId !== undefined\\\"\\n style=\\\"margin: 0 2.5px;\\\"\\n ui-sref=\\\"docker.tasks.task.logs({id: $ctrl.taskId})\\\"\\n title=\\\"Logs\\\"\\n >\\n <i class=\\\"fa fa-file-alt space-right\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n <a\\n authorization=\\\"DockerContainerInspect\\\"\\n ng-if=\\\"$ctrl.state.showQuickActionInspect && $ctrl.taskId === undefined\\\"\\n style=\\\"margin: 0 2.5px;\\\"\\n ui-sref=\\\"docker.containers.container.inspect({id: $ctrl.containerId, nodeName: $ctrl.nodeName})\\\"\\n title=\\\"Inspect\\\"\\n >\\n <i class=\\\"fa fa-info-circle space-right\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n <a\\n authorization=\\\"DockerTaskInspect\\\"\\n ng-if=\\\"$ctrl.state.showQuickActionInspect && $ctrl.taskId !== undefined\\\"\\n style=\\\"margin: 0 2.5px;\\\"\\n ui-sref=\\\"docker.tasks.task({id: $ctrl.taskId})\\\"\\n title=\\\"Inspect\\\"\\n >\\n <i class=\\\"fa fa-info-circle space-right\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n <a\\n authorization=\\\"DockerContainerStats\\\"\\n ng-if=\\\"$ctrl.state.showQuickActionStats && ['starting', 'running', 'healthy', 'unhealthy'].indexOf($ctrl.status) !== -1 && $ctrl.taskId === undefined\\\"\\n style=\\\"margin: 0 2.5px;\\\"\\n ui-sref=\\\"docker.containers.container.stats({id: $ctrl.containerId, nodeName: $ctrl.nodeName})\\\"\\n title=\\\"Stats\\\"\\n >\\n <i class=\\\"fa fa-chart-area space-right\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n <a\\n authorization=\\\"DockerExecStart\\\"\\n ng-if=\\\"$ctrl.state.showQuickActionExec && ['starting', 'running', 'healthy', 'unhealthy'].indexOf($ctrl.status) !== -1 && $ctrl.taskId === undefined\\\"\\n style=\\\"margin: 0 2.5px;\\\"\\n ui-sref=\\\"docker.containers.container.exec({id: $ctrl.containerId, nodeName: $ctrl.nodeName})\\\"\\n title=\\\"Exec Console\\\"\\n >\\n <i class=\\\"fa fa-terminal space-right\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n <a\\n authorization=\\\"DockerContainerAttach\\\"\\n ng-if=\\\"$ctrl.state.showQuickActionAttach && ['starting', 'running', 'healthy', 'unhealthy'].indexOf($ctrl.status) !== -1 && $ctrl.taskId === undefined\\\"\\n style=\\\"margin: 0 2.5px;\\\"\\n ui-sref=\\\"docker.containers.container.attach({id: $ctrl.containerId, nodeName: $ctrl.nodeName})\\\"\\n title=\\\"Attach Console\\\"\\n >\\n <i class=\\\"fa fa-plug space-right\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","angular.module('portainer.docker').controller('ContainerRestartPolicyController', [\n function ContainerRestartPolicyController() {\n var ctrl = this;\n\n this.state = {\n editModel: {},\n };\n\n ctrl.save = save;\n\n function save() {\n if (ctrl.state.editModel.name === ctrl.name && ctrl.state.editModel.maximumRetryCount === ctrl.maximumRetryCount) {\n return;\n }\n ctrl.updateRestartPolicy(ctrl.state.editModel);\n }\n\n this.$onInit = function () {\n ctrl.state.editModel = {\n name: ctrl.name ? ctrl.name : 'no',\n maximumRetryCount: ctrl.maximumRetryCount,\n };\n };\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./container-restart-policy.html');\n\nangular.module('portainer.docker').component('containerRestartPolicy', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'ContainerRestartPolicyController',\n bindings: {\n name: '<',\n maximumRetryCount: '<',\n updateRestartPolicy: '&',\n },\n});\n","var path = 'app/docker/components/container-restart-policy/container-restart-policy.html';\nvar html = \"<div>\\n <table class=\\\"table table-bordered table-condensed\\\">\\n <tr>\\n <td class=\\\"col-md-3\\\">\\n <span>Name</span>\\n </td>\\n <td>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.editModel.name\\\" disable-authorization=\\\"DockerContainerUpdate\\\">\\n <option value=\\\"no\\\">None</option>\\n <option value=\\\"on-failure\\\">On Failure</option>\\n <option value=\\\"always\\\">Always</option>\\n <option value=\\\"unless-stopped\\\">Unless Stopped</option>\\n </select>\\n </td>\\n <td class=\\\"col-md-2\\\" authorization=\\\"DockerContainerUpdate\\\">\\n <button class=\\\"btn btn-sm btn-primary\\\" ng-click=\\\"$ctrl.save()\\\">Update</button>\\n </td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.editModel.name === 'on-failure'\\\">\\n <td class=\\\"col-md-3\\\">Maximum Retry Count</td>\\n <td colspan=\\\"2\\\">\\n <input type=\\\"number\\\" class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.editModel.maximumRetryCount\\\" />\\n </td>\\n </tr>\\n </table>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./dashboardClusterAgentInfo.html');\n\nangular.module('portainer.docker').component('dashboardClusterAgentInfo', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'DashboardClusterAgentInfoController',\n});\n","var path = 'app/docker/components/dashboard-cluster-agent-info/dashboardClusterAgentInfo.html';\nvar html = \"<rd-widget>\\n <rd-widget-header icon=\\\"fa-tachometer-alt\\\" title-text=\\\"Cluster information\\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr>\\n <td>Nodes in the cluster</td>\\n <td>{{ $ctrl.agentCount }}</td>\\n </tr>\\n <tr>\\n <td colspan=\\\"2\\\">\\n <div class=\\\"btn-group\\\" role=\\\"group\\\" aria-label=\\\"...\\\">\\n <a ui-sref=\\\"docker.swarm.visualizer\\\"><i class=\\\"fa fa-object-group space-right\\\" aria-hidden=\\\"true\\\"></i>Go to cluster visualizer</a>\\n </div>\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n</rd-widget>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","angular.module('portainer.docker').controller('DashboardClusterAgentInfoController', [\n 'AgentService',\n 'Notifications',\n function (AgentService, Notifications) {\n var ctrl = this;\n\n this.$onInit = function () {\n AgentService.agents()\n .then(function success(data) {\n ctrl.agentCount = data.length;\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve agent information');\n });\n };\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./configsDatatable.html');\n\nangular.module('portainer.docker').component('configsDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'GenericDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n removeAction: '<',\n refreshCallback: '<',\n },\n});\n","var path = 'app/docker/components/datatables/configs-datatable/configsDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n <div class=\\\"settings\\\">\\n <span class=\\\"setting\\\" ng-class=\\\"{ 'setting-active': $ctrl.settings.open }\\\" uib-dropdown dropdown-append-to-body auto-close=\\\"disabled\\\" is-open=\\\"$ctrl.settings.open\\\">\\n <span uib-dropdown-toggle><i class=\\\"fa fa-cog\\\" aria-hidden=\\\"true\\\"></i> Settings</span>\\n <div class=\\\"dropdown-menu dropdown-menu-right\\\" uib-dropdown-menu>\\n <div class=\\\"tableMenu\\\">\\n <div class=\\\"menuHeader\\\">\\n Table settings\\n </div>\\n <div class=\\\"menuContent\\\">\\n <div>\\n <div class=\\\"md-checkbox\\\">\\n <input id=\\\"setting_auto_refresh\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.settings.repeater.autoRefresh\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" />\\n <label for=\\\"setting_auto_refresh\\\">Auto refresh</label>\\n </div>\\n <div ng-if=\\\"$ctrl.settings.repeater.autoRefresh\\\">\\n <label for=\\\"settings_refresh_rate\\\">\\n Refresh rate\\n </label>\\n <select id=\\\"settings_refresh_rate\\\" ng-model=\\\"$ctrl.settings.repeater.refreshRate\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" class=\\\"small-select\\\">\\n <option value=\\\"10\\\">10s</option>\\n <option value=\\\"30\\\">30s</option>\\n <option value=\\\"60\\\">1min</option>\\n <option value=\\\"120\\\">2min</option>\\n <option value=\\\"300\\\">5min</option>\\n </select>\\n <span>\\n <i id=\\\"refreshRateChange\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-top: 7px; display: none;\\\"></i>\\n </span>\\n </div>\\n </div>\\n </div>\\n <div>\\n <a type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"$ctrl.settings.open = false;\\\">Close</a>\\n </div>\\n </div>\\n </div>\\n </span>\\n </div>\\n </div>\\n <div class=\\\"actionBar\\\" authorization=\\\"DockerConfigDelete, DockerConfigCreate\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-danger\\\"\\n authorization=\\\"DockerConfigDelete\\\"\\n ng-disabled=\\\"$ctrl.state.selectedItemCount === 0\\\"\\n ng-click=\\\"$ctrl.removeAction($ctrl.state.selectedItems)\\\"\\n >\\n <i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Remove\\n </button>\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ui-sref=\\\"docker.configs.new\\\" authorization=\\\"DockerConfigCreate\\\">\\n <i class=\\\"fa fa-plus space-right\\\" aria-hidden=\\\"true\\\"></i>Add config\\n </button>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n auto-focus\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th>\\n <span class=\\\"md-checkbox\\\" authorization=\\\"DockerConfigDelete, DockerConfigCreate\\\">\\n <input id=\\\"select_all\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.state.selectAll\\\" ng-change=\\\"$ctrl.selectAll()\\\" />\\n <label for=\\\"select_all\\\"></label>\\n </span>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Name')\\\">\\n Name\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('CreatedAt')\\\">\\n Creation Date\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'CreatedAt' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'CreatedAt' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('ResourceControl.Ownership')\\\">\\n Ownership\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'ResourceControl.Ownership' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'ResourceControl.Ownership' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit))\\\"\\n ng-class=\\\"{ active: item.Checked }\\\"\\n >\\n <td>\\n <span class=\\\"md-checkbox\\\" authorization=\\\"DockerConfigDelete, DockerConfigCreate\\\">\\n <input id=\\\"select_{{ $index }}\\\" type=\\\"checkbox\\\" ng-model=\\\"item.Checked\\\" ng-click=\\\"$ctrl.selectItem(item, $event)\\\" />\\n <label for=\\\"select_{{ $index }}\\\"></label>\\n </span>\\n <a ui-sref=\\\"docker.configs.config({id: item.Id})\\\">{{ item.Name }}</a>\\n </td>\\n <td>{{ item.CreatedAt | getisodate }}</td>\\n <td>\\n <span>\\n <i ng-class=\\\"item.ResourceControl.Ownership | ownershipicon\\\" aria-hidden=\\\"true\\\"></i>\\n {{ item.ResourceControl.Ownership ? item.ResourceControl.Ownership : item.ResourceControl.Ownership = $ctrl.RCO.ADMINISTRATORS }}\\n </span>\\n </td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"3\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"3\\\" class=\\\"text-center text-muted\\\">No config available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./containerNetworksDatatable.html');\n\nangular.module('portainer.docker').component('containerNetworksDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'ContainerNetworksDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n container: '<',\n availableNetworks: '<',\n joinNetworkAction: '<',\n joinNetworkActionInProgress: '<',\n leaveNetworkActionInProgress: '<',\n leaveNetworkAction: '<',\n nodeName: '<',\n },\n});\n","var path = 'app/docker/components/datatables/container-networks-datatable/containerNetworksDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n </div>\\n <div class=\\\"actionBar\\\">\\n <form class=\\\"form-horizontal\\\">\\n <div class=\\\"row\\\" authorization=\\\"DockerNetworkConnect\\\">\\n <label for=\\\"container_network\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Join a network</label>\\n <div class=\\\"col-sm-5 col-lg-4\\\">\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.selectedNetwork\\\" id=\\\"container_network\\\">\\n <option selected disabled hidden value=\\\"\\\">Select a network</option>\\n <option ng-repeat=\\\"net in $ctrl.availableNetworks | orderBy: 'Name'\\\" ng-value=\\\"net.Id\\\">{{ net.Name }}</option>\\n </select>\\n </div>\\n <div class=\\\"col-sm-1\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"$ctrl.joinNetworkActionInProgress || !$ctrl.selectedNetwork\\\"\\n ng-click=\\\"$ctrl.joinNetworkAction($ctrl.container, $ctrl.selectedNetwork)\\\"\\n button-spinner=\\\"$ctrl.joinNetworkActionInProgress\\\"\\n >\\n <span ng-hide=\\\"$ctrl.joinNetworkActionInProgress\\\">Join network</span>\\n <span ng-show=\\\"$ctrl.joinNetworkActionInProgress\\\">Joining network...</span>\\n </button>\\n </div>\\n </div>\\n </form>\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th>Network</th>\\n <th>\\n IP Address\\n <a ng-click=\\\"$ctrl.expandAll()\\\" ng-if=\\\"$ctrl.hasExpandableItems()\\\">\\n <i ng-class=\\\"{ 'fas fa-angle-down': $ctrl.state.expandAll, 'fas fa-angle-right': !$ctrl.state.expandAll }\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </th>\\n <th>Gateway</th>\\n <th>MAC Address</th>\\n <th authorization=\\\"DockerNetworkDisconnect\\\">Actions</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate-start=\\\"(key, value) in $ctrl.dataset | itemsPerPage: $ctrl.state.paginatedItemLimit\\\"\\n ng-class=\\\"{ active: item.Checked }\\\"\\n ng-click=\\\"$ctrl.expandItem(value, !value.Expanded)\\\"\\n >\\n <td>\\n <a ng-if=\\\"$ctrl.itemCanExpand(value)\\\">\\n <i ng-class=\\\"{ 'fas fa-angle-down': value.Expanded, 'fas fa-angle-right': !value.Expanded }\\\" class=\\\"space-right\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n <a ui-sref=\\\"docker.networks.network({ id: key, nodeName: $ctrl.nodeName })\\\">{{ key }}</a>\\n </td>\\n <td>{{ value.IPAddress || '-' }}</td>\\n <td>{{ value.Gateway || '-' }}</td>\\n <td>{{ value.MacAddress || '-' }}</td>\\n <td authorization=\\\"DockerNetworkDisconnect\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-xs btn-danger\\\"\\n ng-disabled=\\\"$ctrl.leaveNetworkActionInProgress\\\"\\n button-spinner=\\\"$ctrl.leaveNetworkActionInProgress\\\"\\n ng-click=\\\"$ctrl.leaveNetworkAction($ctrl.container, key)\\\"\\n >\\n <span ng-hide=\\\"$ctrl.leaveNetworkActionInProgress\\\"><i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i> Leave network</span>\\n <span ng-show=\\\"$ctrl.leaveNetworkActionInProgress\\\">Leaving network...</span>\\n </button>\\n </td>\\n </tr>\\n <tr\\n dir-paginate-end\\n ng-show=\\\"$ctrl.itemCanExpand(value) && value.Expanded\\\"\\n ng-class=\\\"{ 'datatable-highlighted': value.Highlighted, 'datatable-unhighlighted': !value.Highlighted }\\\"\\n >\\n <td colspan=\\\"1\\\"></td>\\n <td colspan=\\\"1\\\">\\n {{ value.GlobalIPv6Address }}\\n </td>\\n <td colspan=\\\"3\\\">\\n {{ value.IPv6Gateway || '-' }}\\n </td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"5\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.dataset.length === 0\\\">\\n <td colspan=\\\"5\\\" class=\\\"text-center text-muted\\\">No network available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import _ from 'lodash-es';\n\nangular.module('portainer.docker').controller('ContainerNetworksDatatableController', [\n '$scope',\n '$controller',\n 'DatatableService',\n function ($scope, $controller, DatatableService) {\n angular.extend(this, $controller('GenericDatatableController', { $scope: $scope }));\n this.state = Object.assign(this.state, {\n expandedItems: [],\n expandAll: true,\n });\n\n this.expandItem = function (item, expanded) {\n if (!this.itemCanExpand(item)) {\n return;\n }\n\n item.Expanded = expanded;\n if (!expanded) {\n item.Highlighted = false;\n }\n if (!item.Expanded) {\n this.state.expandAll = false;\n }\n };\n\n this.itemCanExpand = function (item) {\n return item.GlobalIPv6Address !== '';\n };\n\n this.hasExpandableItems = function () {\n return _.filter(this.dataset, (item) => this.itemCanExpand(item)).length;\n };\n\n this.expandAll = function () {\n this.state.expandAll = !this.state.expandAll;\n _.forEach(this.dataset, (item) => {\n if (this.itemCanExpand(item)) {\n this.expandItem(item, this.state.expandAll);\n }\n });\n };\n\n this.$onInit = function () {\n this.setDefaults();\n this.prepareTableFromDataset();\n\n this.state.orderBy = this.orderBy;\n var storedOrder = DatatableService.getDataTableOrder(this.tableKey);\n if (storedOrder !== null) {\n this.state.reverseOrder = storedOrder.reverse;\n this.state.orderBy = storedOrder.orderBy;\n }\n\n var textFilter = DatatableService.getDataTableTextFilters(this.tableKey);\n if (textFilter !== null) {\n this.state.textFilter = textFilter;\n this.onTextFilterChange();\n }\n\n var storedFilters = DatatableService.getDataTableFilters(this.tableKey);\n if (storedFilters !== null) {\n this.filters = storedFilters;\n }\n if (this.filters && this.filters.state) {\n this.filters.state.open = false;\n }\n\n var storedSettings = DatatableService.getDataTableSettings(this.tableKey);\n if (storedSettings !== null) {\n this.settings = storedSettings;\n this.settings.open = false;\n }\n\n _.forEach(this.dataset, (item) => {\n item.Expanded = true;\n item.Highlighted = true;\n });\n };\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./containerProcessesDatatable.html');\n\nangular.module('portainer.docker').component('containerProcessesDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'GenericDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '=',\n headerset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n },\n});\n","var path = 'app/docker/components/datatables/container-processes-datatable/containerProcessesDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input type=\\\"text\\\" class=\\\"searchInput\\\" ng-model=\\\"$ctrl.state.textFilter\\\" placeholder=\\\"Search...\\\" auto-focus ng-model-options=\\\"{ debounce: 300 }\\\" />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th ng-repeat=\\\"header in $ctrl.headerset\\\">\\n {{ header }}\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr dir-paginate=\\\"item in ($ctrl.state.filteredProcesses = ($ctrl.dataset | filter:$ctrl.state.textFilter | itemsPerPage: $ctrl.state.paginatedItemLimit))\\\">\\n <td ng-repeat=\\\"info in item track by $index\\\">{{ info }}</td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"{{ $ctrl.headerset.length }}\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredProcesses.length === 0\\\">\\n <td colspan=\\\"{{ $ctrl.headerset.length }}\\\" class=\\\"text-center text-muted\\\">No process available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./containersDatatableActions.html');\n\nangular.module('portainer.docker').component('containersDatatableActions', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'ContainersDatatableActionsController',\n bindings: {\n selectedItems: '=',\n selectedItemCount: '=',\n noStoppedItemsSelected: '=',\n noRunningItemsSelected: '=',\n noPausedItemsSelected: '=',\n showAddAction: '<',\n },\n});\n","var path = 'app/docker/components/datatables/containers-datatable/actions/containersDatatableActions.html';\nvar html = \"<div\\n class=\\\"actionBar\\\"\\n authorization=\\\"DockerContainerStart, DockerContainerStop, DockerContainerKill, DockerContainerRestart, DockerContainerPause, DockerContainerUnpause, DockerContainerDelete, DockerContainerCreate\\\"\\n>\\n <div class=\\\"btn-group\\\" role=\\\"group\\\" aria-label=\\\"...\\\">\\n <button\\n authorization=\\\"DockerContainerStart\\\"\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-success\\\"\\n ng-click=\\\"$ctrl.startAction($ctrl.selectedItems)\\\"\\n ng-disabled=\\\"$ctrl.selectedItemCount === 0 || $ctrl.noStoppedItemsSelected\\\"\\n >\\n <i class=\\\"fa fa-play space-right\\\" aria-hidden=\\\"true\\\"></i>Start\\n </button>\\n <button\\n authorization=\\\"DockerContainerStop\\\"\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-danger\\\"\\n ng-click=\\\"$ctrl.stopAction($ctrl.selectedItems)\\\"\\n ng-disabled=\\\"$ctrl.selectedItemCount === 0 || $ctrl.noRunningItemsSelected\\\"\\n >\\n <i class=\\\"fa fa-stop space-right\\\" aria-hidden=\\\"true\\\"></i>Stop\\n </button>\\n <button\\n authorization=\\\"DockerContainerKill\\\"\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-danger\\\"\\n ng-click=\\\"$ctrl.killAction($ctrl.selectedItems)\\\"\\n ng-disabled=\\\"$ctrl.selectedItemCount === 0\\\"\\n >\\n <i class=\\\"fa fa-bomb space-right\\\" aria-hidden=\\\"true\\\"></i>Kill\\n </button>\\n <button\\n authorization=\\\"DockerContainerRestart\\\"\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-primary\\\"\\n ng-click=\\\"$ctrl.restartAction($ctrl.selectedItems)\\\"\\n ng-disabled=\\\"$ctrl.selectedItemCount === 0\\\"\\n >\\n <i class=\\\"fa fa-sync space-right\\\" aria-hidden=\\\"true\\\"></i>Restart\\n </button>\\n <button\\n authorization=\\\"DockerContainerPause\\\"\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-primary\\\"\\n ng-click=\\\"$ctrl.pauseAction($ctrl.selectedItems)\\\"\\n ng-disabled=\\\"$ctrl.selectedItemCount === 0 || $ctrl.noRunningItemsSelected\\\"\\n >\\n <i class=\\\"fa fa-pause space-right\\\" aria-hidden=\\\"true\\\"></i>Pause\\n </button>\\n <button\\n authorization=\\\"DockerContainerUnpause\\\"\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-primary\\\"\\n ng-click=\\\"$ctrl.resumeAction($ctrl.selectedItems)\\\"\\n ng-disabled=\\\"$ctrl.selectedItemCount === 0 || $ctrl.noPausedItemsSelected\\\"\\n >\\n <i class=\\\"fa fa-play space-right\\\" aria-hidden=\\\"true\\\"></i>Resume\\n </button>\\n <button\\n authorization=\\\"DockerContainerDelete\\\"\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-danger\\\"\\n ng-disabled=\\\"$ctrl.selectedItemCount === 0\\\"\\n ng-click=\\\"$ctrl.removeAction($ctrl.selectedItems)\\\"\\n >\\n <i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Remove\\n </button>\\n </div>\\n <button authorization=\\\"DockerContainerCreate\\\" type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ui-sref=\\\"docker.containers.new\\\" ng-if=\\\"$ctrl.showAddAction\\\">\\n <i class=\\\"fa fa-plus space-right\\\" aria-hidden=\\\"true\\\"></i>Add container\\n </button>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","angular.module('portainer.docker').controller('ContainersDatatableActionsController', [\n '$state',\n 'ContainerService',\n 'ModalService',\n 'Notifications',\n 'HttpRequestHelper',\n function ($state, ContainerService, ModalService, Notifications, HttpRequestHelper) {\n this.startAction = function (selectedItems) {\n var successMessage = 'Container successfully started';\n var errorMessage = 'Unable to start container';\n executeActionOnContainerList(selectedItems, ContainerService.startContainer, successMessage, errorMessage);\n };\n\n this.stopAction = function (selectedItems) {\n var successMessage = 'Container successfully stopped';\n var errorMessage = 'Unable to stop container';\n executeActionOnContainerList(selectedItems, ContainerService.stopContainer, successMessage, errorMessage);\n };\n\n this.restartAction = function (selectedItems) {\n var successMessage = 'Container successfully restarted';\n var errorMessage = 'Unable to restart container';\n executeActionOnContainerList(selectedItems, ContainerService.restartContainer, successMessage, errorMessage);\n };\n\n this.killAction = function (selectedItems) {\n var successMessage = 'Container successfully killed';\n var errorMessage = 'Unable to kill container';\n executeActionOnContainerList(selectedItems, ContainerService.killContainer, successMessage, errorMessage);\n };\n\n this.pauseAction = function (selectedItems) {\n var successMessage = 'Container successfully paused';\n var errorMessage = 'Unable to pause container';\n executeActionOnContainerList(selectedItems, ContainerService.pauseContainer, successMessage, errorMessage);\n };\n\n this.resumeAction = function (selectedItems) {\n var successMessage = 'Container successfully resumed';\n var errorMessage = 'Unable to resume container';\n executeActionOnContainerList(selectedItems, ContainerService.resumeContainer, successMessage, errorMessage);\n };\n\n this.removeAction = function (selectedItems) {\n var isOneContainerRunning = false;\n for (var i = 0; i < selectedItems.length; i++) {\n var container = selectedItems[i];\n if (container.State === 'running') {\n isOneContainerRunning = true;\n break;\n }\n }\n\n var title = 'You are about to remove one or more container.';\n if (isOneContainerRunning) {\n title = 'You are about to remove one or more running container.';\n }\n\n ModalService.confirmContainerDeletion(title, function (result) {\n if (!result) {\n return;\n }\n var cleanVolumes = false;\n if (result[0]) {\n cleanVolumes = true;\n }\n removeSelectedContainers(selectedItems, cleanVolumes);\n });\n };\n\n function executeActionOnContainerList(containers, action, successMessage, errorMessage) {\n var actionCount = containers.length;\n angular.forEach(containers, function (container) {\n HttpRequestHelper.setPortainerAgentTargetHeader(container.NodeName);\n action(container.Id)\n .then(function success() {\n Notifications.success(successMessage, container.Names[0]);\n })\n .catch(function error(err) {\n errorMessage = errorMessage + ':' + container.Names[0];\n Notifications.error('Failure', err, errorMessage);\n })\n .finally(function final() {\n --actionCount;\n if (actionCount === 0) {\n $state.reload();\n }\n });\n });\n }\n\n function removeSelectedContainers(containers, cleanVolumes) {\n var actionCount = containers.length;\n angular.forEach(containers, function (container) {\n HttpRequestHelper.setPortainerAgentTargetHeader(container.NodeName);\n ContainerService.remove(container, cleanVolumes)\n .then(function success() {\n Notifications.success('Container successfully removed', container.Names[0]);\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to remove container');\n })\n .finally(function final() {\n --actionCount;\n if (actionCount === 0) {\n $state.reload();\n }\n });\n });\n }\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./containersDatatable.html');\n\nangular.module('portainer.docker').component('containersDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'ContainersDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n showHostColumn: '<',\n showAddAction: '<',\n offlineMode: '<',\n refreshCallback: '<',\n notAutoFocus: '<',\n },\n});\n","var path = 'app/docker/components/datatables/containers-datatable/containersDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n <div class=\\\"settings\\\">\\n <datatable-columns-visibility columns=\\\"$ctrl.columnVisibility.columns\\\" on-change=\\\"($ctrl.onColumnVisibilityChange)\\\"></datatable-columns-visibility>\\n\\n <span class=\\\"setting\\\" ng-class=\\\"{ 'setting-active': $ctrl.settings.open }\\\" uib-dropdown dropdown-append-to-body auto-close=\\\"disabled\\\" is-open=\\\"$ctrl.settings.open\\\">\\n <span uib-dropdown-toggle><i class=\\\"fa fa-cog\\\" aria-hidden=\\\"true\\\"></i> Settings</span>\\n <div class=\\\"dropdown-menu dropdown-menu-right\\\" uib-dropdown-menu>\\n <div class=\\\"tableMenu\\\">\\n <div class=\\\"menuHeader\\\">\\n Table settings\\n </div>\\n <div class=\\\"menuContent\\\">\\n <div class=\\\"md-checkbox\\\">\\n <input id=\\\"setting_container_trunc\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.settings.truncateContainerName\\\" ng-change=\\\"$ctrl.onSettingsContainerNameTruncateChange()\\\" />\\n <label for=\\\"setting_container_trunc\\\">Truncate container name</label>\\n </div>\\n <div>\\n <div class=\\\"md-checkbox\\\">\\n <input id=\\\"setting_auto_refresh\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.settings.repeater.autoRefresh\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" />\\n <label for=\\\"setting_auto_refresh\\\">Auto refresh</label>\\n </div>\\n <div ng-if=\\\"$ctrl.settings.repeater.autoRefresh\\\">\\n <label for=\\\"settings_refresh_rate\\\">\\n Refresh rate\\n </label>\\n <select id=\\\"settings_refresh_rate\\\" ng-model=\\\"$ctrl.settings.repeater.refreshRate\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" class=\\\"small-select\\\">\\n <option value=\\\"10\\\">10s</option>\\n <option value=\\\"30\\\">30s</option>\\n <option value=\\\"60\\\">1min</option>\\n <option value=\\\"120\\\">2min</option>\\n <option value=\\\"300\\\">5min</option>\\n </select>\\n <span>\\n <i id=\\\"refreshRateChange\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-top: 7px; display: none;\\\"></i>\\n </span>\\n </div>\\n </div>\\n </div>\\n <div authorization=\\\"DockerContainerStats, DockerContainerLogs, DockerExecStart, DockerContainerInspect, DockerTaskInspect, DockerTaskLogs, DockerContainerAttach\\\">\\n <div class=\\\"menuHeader\\\">\\n Quick actions\\n </div>\\n <div class=\\\"menuContent\\\">\\n <div class=\\\"md-checkbox\\\" authorization=\\\"DockerContainerStats\\\">\\n <input id=\\\"setting_show_stats\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.settings.showQuickActionStats\\\" ng-change=\\\"$ctrl.onSettingsQuickActionChange()\\\" />\\n <label for=\\\"setting_show_stats\\\">Stats</label>\\n </div>\\n <div class=\\\"md-checkbox\\\" authorization=\\\"DockerContainerLogs\\\">\\n <input id=\\\"setting_show_logs\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.settings.showQuickActionLogs\\\" ng-change=\\\"$ctrl.onSettingsQuickActionChange()\\\" />\\n <label for=\\\"setting_show_logs\\\">Logs</label>\\n </div>\\n <div class=\\\"md-checkbox\\\" authorization=\\\"DockerExecStart\\\">\\n <input id=\\\"setting_show_console\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.settings.showQuickActionExec\\\" ng-change=\\\"$ctrl.onSettingsQuickActionChange()\\\" />\\n <label for=\\\"setting_show_console\\\">Console</label>\\n </div>\\n <div class=\\\"md-checkbox\\\" authorization=\\\"DockerContainerInspect\\\">\\n <input id=\\\"setting_show_inspect\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.settings.showQuickActionInspect\\\" ng-change=\\\"$ctrl.onSettingsQuickActionChange()\\\" />\\n <label for=\\\"setting_show_inspect\\\">Inspect</label>\\n </div>\\n <div class=\\\"md-checkbox\\\" authorization=\\\"DockerContainerAttach\\\">\\n <input id=\\\"setting_show_attach\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.settings.showQuickActionAttach\\\" ng-change=\\\"$ctrl.onSettingsQuickActionChange()\\\" />\\n <label for=\\\"setting_show_attach\\\">Attach</label>\\n </div>\\n </div>\\n </div>\\n <div>\\n <a type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"$ctrl.settings.open = false;\\\">Close</a>\\n </div>\\n </div>\\n </div>\\n </span>\\n </div>\\n </div>\\n <containers-datatable-actions\\n ng-if=\\\"!$ctrl.offlineMode\\\"\\n selected-items=\\\"$ctrl.state.selectedItems\\\"\\n selected-item-count=\\\"$ctrl.state.selectedItemCount\\\"\\n no-stopped-items-selected=\\\"$ctrl.state.noStoppedItemsSelected\\\"\\n no-running-items-selected=\\\"$ctrl.state.noRunningItemsSelected\\\"\\n no-paused-items-selected=\\\"$ctrl.state.noPausedItemsSelected\\\"\\n show-add-action=\\\"$ctrl.showAddAction\\\"\\n ></containers-datatable-actions>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n focus-if=\\\"!$ctrl.notAutoFocus\\\"\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover table-filters nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th>\\n <span\\n class=\\\"md-checkbox\\\"\\n ng-if=\\\"!$ctrl.offlineMode\\\"\\n authorization=\\\"DockerContainerStart, DockerContainerStop, DockerContainerKill, DockerContainerRestart, DockerContainerPause, DockerContainerUnpause, DockerContainerDelete, DockerContainerCreate\\\"\\n >\\n <input id=\\\"select_all\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.state.selectAll\\\" ng-change=\\\"$ctrl.selectAll()\\\" />\\n <label for=\\\"select_all\\\"></label>\\n </span>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Names')\\\">\\n Name\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Names' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Names' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th uib-dropdown dropdown-append-to-body auto-close=\\\"disabled\\\" is-open=\\\"$ctrl.filters.state.open\\\" ng-show=\\\"$ctrl.columnVisibility.columns.state.display\\\">\\n <a ng-click=\\\"$ctrl.changeOrderBy('Status')\\\">\\n State\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Status' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Status' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n <div>\\n <span uib-dropdown-toggle class=\\\"table-filter\\\" ng-if=\\\"!$ctrl.filters.state.enabled\\\">Filter <i class=\\\"fa fa-filter\\\" aria-hidden=\\\"true\\\"></i></span>\\n <span uib-dropdown-toggle class=\\\"table-filter filter-active\\\" ng-if=\\\"$ctrl.filters.state.enabled\\\">Filter <i class=\\\"fa fa-check\\\" aria-hidden=\\\"true\\\"></i></span>\\n </div>\\n <div class=\\\"dropdown-menu\\\" uib-dropdown-menu>\\n <div class=\\\"tableMenu\\\">\\n <div class=\\\"menuHeader\\\">\\n Filter by state\\n </div>\\n <div class=\\\"menuContent\\\">\\n <div class=\\\"md-checkbox\\\" ng-repeat=\\\"filter in $ctrl.filters.state.values track by $index\\\">\\n <input id=\\\"filter_state_{{ $index }}\\\" type=\\\"checkbox\\\" ng-model=\\\"filter.display\\\" ng-change=\\\"$ctrl.onStateFilterChange()\\\" />\\n <label for=\\\"filter_state_{{ $index }}\\\">{{ filter.label }}</label>\\n </div>\\n </div>\\n <div>\\n <a type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"$ctrl.filters.state.open = false;\\\">Close</a>\\n </div>\\n </div>\\n </div>\\n </th>\\n <th\\n ng-if=\\\"\\n $ctrl.settings.showQuickActionStats ||\\n $ctrl.settings.showQuickActionLogs ||\\n $ctrl.settings.showQuickActionExec ||\\n $ctrl.settings.showQuickActionAttach ||\\n $ctrl.settings.showQuickActionInspect\\n \\\"\\n ng-show=\\\"$ctrl.columnVisibility.columns.actions.display\\\"\\n authorization=\\\"DockerContainerStats, DockerContainerLogs, DockerExecStart, DockerContainerInspect, DockerTaskInspect, DockerTaskLogs, DockerContainerAttach\\\"\\n >\\n Quick actions\\n </th>\\n <th ng-show=\\\"$ctrl.columnVisibility.columns.stack.display\\\">\\n <a ng-click=\\\"$ctrl.changeOrderBy('StackName')\\\">\\n Stack\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'StackName' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'StackName' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th ng-show=\\\"$ctrl.columnVisibility.columns.image.display\\\">\\n <a ng-click=\\\"$ctrl.changeOrderBy('Image')\\\">\\n Image\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Image' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Image' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th ng-show=\\\"$ctrl.columnVisibility.columns.created.display\\\">\\n <a ng-click=\\\"$ctrl.changeOrderBy('Created')\\\">\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Created' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Created' && $ctrl.state.reverseOrder\\\"></i>\\n Created\\n </a>\\n </th>\\n <th ng-show=\\\"$ctrl.columnVisibility.columns.ip.display\\\">\\n <a ng-click=\\\"$ctrl.changeOrderBy('IP')\\\">\\n IP Address\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'IP' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'IP' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th ng-if=\\\"$ctrl.showHostColumn\\\" ng-show=\\\"$ctrl.columnVisibility.columns.host.display\\\">\\n <a ng-click=\\\"$ctrl.changeOrderBy('NodeName')\\\">\\n Host\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'NodeName' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'NodeName' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th ng-show=\\\"$ctrl.columnVisibility.columns.ports.display\\\">\\n <a ng-click=\\\"$ctrl.changeOrderBy('Ports')\\\">\\n Published Ports\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Ports' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Ports' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th ng-show=\\\"$ctrl.columnVisibility.columns.ownership.display\\\">\\n <a ng-click=\\\"$ctrl.changeOrderBy('ResourceControl.Ownership')\\\">\\n Ownership\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'ResourceControl.Ownership' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'ResourceControl.Ownership' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter: $ctrl.applyFilters | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit))\\\"\\n ng-class=\\\"{ active: item.Checked }\\\"\\n >\\n <td>\\n <span\\n class=\\\"md-checkbox\\\"\\n ng-if=\\\"!$ctrl.offlineMode\\\"\\n authorization=\\\"DockerContainerStart, DockerContainerStop, DockerContainerKill, DockerContainerRestart, DockerContainerPause, DockerContainerUnpause, DockerContainerDelete, DockerContainerCreate\\\"\\n >\\n <input id=\\\"select_{{ $index }}\\\" type=\\\"checkbox\\\" ng-model=\\\"item.Checked\\\" ng-click=\\\"$ctrl.selectItem(item, $event)\\\" />\\n <label for=\\\"select_{{ $index }}\\\"></label>\\n </span>\\n <a ng-if=\\\"!$ctrl.offlineMode\\\" ui-sref=\\\"docker.containers.container({ id: item.Id, nodeName: item.NodeName })\\\" title=\\\"{{ item | containername }}\\\">{{\\n item | containername | truncate: $ctrl.settings.containerNameTruncateSize\\n }}</a>\\n <span ng-if=\\\"$ctrl.offlineMode\\\">{{ item | containername | truncate: $ctrl.settings.containerNameTruncateSize }}</span>\\n </td>\\n <td ng-show=\\\"$ctrl.columnVisibility.columns.state.display\\\">\\n <span\\n ng-if=\\\"['starting', 'healthy', 'unhealthy'].indexOf(item.Status) !== -1\\\"\\n class=\\\"label label-{{ item.Status | containerstatusbadge }} interactive\\\"\\n uib-tooltip=\\\"This container has a health check\\\"\\n >{{ item.Status }}</span\\n >\\n <span ng-if=\\\"['starting', 'healthy', 'unhealthy'].indexOf(item.Status) === -1\\\" class=\\\"label label-{{ item.Status | containerstatusbadge }}\\\">{{ item.Status }}</span>\\n </td>\\n <td\\n ng-if=\\\"\\n !$ctrl.offlineMode &&\\n ($ctrl.settings.showQuickActionStats ||\\n $ctrl.settings.showQuickActionLogs ||\\n $ctrl.settings.showQuickActionExec ||\\n $ctrl.settings.showQuickActionAttach ||\\n $ctrl.settings.showQuickActionInspect)\\n \\\"\\n ng-show=\\\"$ctrl.columnVisibility.columns.actions.display\\\"\\n authorization=\\\"DockerContainerStats, DockerContainerLogs, DockerExecStart, DockerContainerInspect, DockerTaskInspect, DockerTaskLogs\\\"\\n >\\n <container-quick-actions container-id=\\\"item.Id\\\" node-name=\\\"item.NodeName\\\" status=\\\"item.Status\\\" state=\\\"$ctrl.settings\\\"></container-quick-actions>\\n </td>\\n <td ng-if=\\\"$ctrl.offlineMode\\\"> </td>\\n <td ng-show=\\\"$ctrl.columnVisibility.columns.stack.display\\\">{{ item.StackName ? item.StackName : '-' }}</td>\\n <td ng-show=\\\"$ctrl.columnVisibility.columns.image.display\\\">\\n <a ng-if=\\\"!$ctrl.offlineMode\\\" ui-sref=\\\"docker.images.image({ id: item.Image })\\\">{{ item.Image | trimshasum }}</a>\\n <span ng-if=\\\"$ctrl.offlineMode\\\">{{ item.Image | trimshasum }}</span>\\n </td>\\n <td ng-show=\\\"$ctrl.columnVisibility.columns.created.display\\\">\\n {{ item.Created | getisodatefromtimestamp }}\\n </td>\\n <td ng-show=\\\"$ctrl.columnVisibility.columns.ip.display\\\">{{ item.IP ? item.IP : '-' }}</td>\\n <td ng-if=\\\"$ctrl.showHostColumn\\\" ng-show=\\\"$ctrl.columnVisibility.columns.host.display\\\">{{ item.NodeName ? item.NodeName : '-' }}</td>\\n <td ng-show=\\\"$ctrl.columnVisibility.columns.ports.display\\\">\\n <a\\n ng-if=\\\"item.Ports.length > 0\\\"\\n ng-repeat=\\\"p in item.Ports | unique: 'public'\\\"\\n class=\\\"image-tag\\\"\\n ng-href=\\\"http://{{ $ctrl.state.publicURL || p.host }}:{{ p.public }}\\\"\\n target=\\\"_blank\\\"\\n >\\n <i class=\\\"fa fa-external-link-alt\\\" aria-hidden=\\\"true\\\"></i> {{ p.public }}:{{ p.private }}\\n </a>\\n <span ng-if=\\\"item.Ports.length == 0\\\">-</span>\\n </td>\\n <td ng-show=\\\"$ctrl.columnVisibility.columns.ownership.display\\\">\\n <span>\\n <i ng-class=\\\"item.ResourceControl.Ownership | ownershipicon\\\" aria-hidden=\\\"true\\\"></i>\\n {{ item.ResourceControl.Ownership ? item.ResourceControl.Ownership : item.ResourceControl.Ownership = $ctrl.RCO.ADMINISTRATORS }}\\n </span>\\n </td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"9\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"9\\\" class=\\\"text-center text-muted\\\">No container available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import _ from 'lodash-es';\n\nangular.module('portainer.docker').controller('ContainersDatatableController', [\n '$scope',\n '$controller',\n 'DatatableService',\n 'EndpointProvider',\n function ($scope, $controller, DatatableService, EndpointProvider) {\n angular.extend(this, $controller('GenericDatatableController', { $scope: $scope }));\n\n var ctrl = this;\n\n this.state = Object.assign(this.state, {\n noStoppedItemsSelected: true,\n noRunningItemsSelected: true,\n noPausedItemsSelected: true,\n publicURL: EndpointProvider.endpointPublicURL(),\n });\n\n this.settings = Object.assign(this.settings, {\n truncateContainerName: true,\n containerNameTruncateSize: 32,\n showQuickActionStats: true,\n showQuickActionLogs: true,\n showQuickActionExec: true,\n showQuickActionInspect: true,\n showQuickActionAttach: false,\n });\n\n this.filters = {\n state: {\n open: false,\n enabled: false,\n values: [],\n },\n };\n\n this.columnVisibility = {\n columns: {\n state: {\n label: 'State',\n display: true,\n },\n actions: {\n label: 'Quick Actions',\n display: true,\n },\n stack: {\n label: 'Stack',\n display: true,\n },\n image: {\n label: 'Image',\n display: true,\n },\n created: {\n label: 'Created',\n display: true,\n },\n ip: {\n label: 'IP Address',\n display: true,\n },\n host: {\n label: 'Host',\n display: true,\n },\n ports: {\n label: 'Published Ports',\n display: true,\n },\n ownership: {\n label: 'Ownership',\n display: true,\n },\n },\n };\n\n this.onColumnVisibilityChange = onColumnVisibilityChange.bind(this);\n function onColumnVisibilityChange(columns) {\n this.columnVisibility.columns = columns;\n DatatableService.setColumnVisibilitySettings(this.tableKey, this.columnVisibility);\n }\n\n this.onSelectionChanged = function () {\n this.updateSelectionState();\n };\n\n this.updateSelectionState = function () {\n this.state.noStoppedItemsSelected = true;\n this.state.noRunningItemsSelected = true;\n this.state.noPausedItemsSelected = true;\n\n for (var i = 0; i < this.dataset.length; i++) {\n var item = this.dataset[i];\n if (item.Checked) {\n this.updateSelectionStateBasedOnItemStatus(item);\n }\n }\n };\n\n this.updateSelectionStateBasedOnItemStatus = function (item) {\n if (item.Status === 'paused') {\n this.state.noPausedItemsSelected = false;\n } else if (['stopped', 'created'].indexOf(item.Status) !== -1) {\n this.state.noStoppedItemsSelected = false;\n } else if (['running', 'healthy', 'unhealthy', 'starting'].indexOf(item.Status) !== -1) {\n this.state.noRunningItemsSelected = false;\n }\n };\n\n this.applyFilters = function (value) {\n var container = value;\n var filters = ctrl.filters;\n for (var i = 0; i < filters.state.values.length; i++) {\n var filter = filters.state.values[i];\n if (container.Status === filter.label && filter.display) {\n return true;\n }\n }\n return false;\n };\n\n this.onStateFilterChange = function () {\n var filters = this.filters.state.values;\n var filtered = false;\n for (var i = 0; i < filters.length; i++) {\n var filter = filters[i];\n if (!filter.display) {\n filtered = true;\n }\n }\n this.filters.state.enabled = filtered;\n };\n\n this.onSettingsContainerNameTruncateChange = function () {\n if (this.settings.truncateContainerName) {\n this.settings.containerNameTruncateSize = 32;\n } else {\n this.settings.containerNameTruncateSize = 256;\n }\n DatatableService.setDataTableSettings(this.tableKey, this.settings);\n };\n\n this.onSettingsQuickActionChange = function () {\n DatatableService.setDataTableSettings(this.tableKey, this.settings);\n };\n\n this.prepareTableFromDataset = function () {\n var availableStateFilters = [];\n for (var i = 0; i < this.dataset.length; i++) {\n var item = this.dataset[i];\n availableStateFilters.push({ label: item.Status, display: true });\n }\n this.filters.state.values = _.uniqBy(availableStateFilters, 'label');\n };\n\n this.updateStoredFilters = function (storedFilters) {\n var datasetFilters = this.filters.state.values;\n\n for (var i = 0; i < datasetFilters.length; i++) {\n var filter = datasetFilters[i];\n var existingFilter = _.find(storedFilters, ['label', filter.label]);\n if (existingFilter && !existingFilter.display) {\n filter.display = existingFilter.display;\n this.filters.state.enabled = true;\n }\n }\n };\n\n this.$onInit = function () {\n this.setDefaults();\n this.prepareTableFromDataset();\n\n this.state.orderBy = this.orderBy;\n var storedOrder = DatatableService.getDataTableOrder(this.tableKey);\n if (storedOrder !== null) {\n this.state.reverseOrder = storedOrder.reverse;\n this.state.orderBy = storedOrder.orderBy;\n }\n\n var textFilter = DatatableService.getDataTableTextFilters(this.tableKey);\n if (textFilter !== null) {\n this.state.textFilter = textFilter;\n this.onTextFilterChange();\n }\n\n var storedFilters = DatatableService.getDataTableFilters(this.tableKey);\n if (storedFilters !== null) {\n this.filters = storedFilters;\n this.filters.state.open = false;\n this.updateStoredFilters(storedFilters.state.values);\n }\n\n var storedSettings = DatatableService.getDataTableSettings(this.tableKey);\n if (storedSettings !== null) {\n this.settings = storedSettings;\n this.settings.open = false;\n }\n this.onSettingsRepeaterChange();\n\n var storedColumnVisibility = DatatableService.getColumnVisibilitySettings(this.tableKey);\n if (storedColumnVisibility !== null) {\n this.columnVisibility = storedColumnVisibility;\n }\n };\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./eventsDatatable.html');\n\nangular.module('portainer.docker').component('eventsDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'GenericDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n },\n});\n","var path = 'app/docker/components/datatables/events-datatable/eventsDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n auto-focus\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Time')\\\">\\n Date\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Time' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Time' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Type')\\\">\\n Category\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Type' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Type' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Details')\\\">\\n Details\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Details' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Details' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit))\\\"\\n ng-class=\\\"{ active: item.Checked }\\\"\\n >\\n <td>{{ item.Time | getisodatefromtimestamp }}</td>\\n <td>{{ item.Type }}</td>\\n <td>{{ item.Details }}</td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"3\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"3\\\" class=\\\"text-center text-muted\\\">No event available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./imagesDatatable.html');\n\nangular.module('portainer.docker').component('imagesDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'ImagesDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n showHostColumn: '<',\n removeAction: '<',\n downloadAction: '<',\n forceRemoveAction: '<',\n exportInProgress: '<',\n offlineMode: '<',\n refreshCallback: '<',\n },\n});\n","var path = 'app/docker/components/datatables/images-datatable/imagesDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n <div class=\\\"settings\\\">\\n <span class=\\\"setting\\\" ng-class=\\\"{ 'setting-active': $ctrl.settings.open }\\\" uib-dropdown dropdown-append-to-body auto-close=\\\"disabled\\\" is-open=\\\"$ctrl.settings.open\\\">\\n <span uib-dropdown-toggle><i class=\\\"fa fa-cog\\\" aria-hidden=\\\"true\\\"></i> Settings</span>\\n <div class=\\\"dropdown-menu dropdown-menu-right\\\" uib-dropdown-menu>\\n <div class=\\\"tableMenu\\\">\\n <div class=\\\"menuHeader\\\">\\n Table settings\\n </div>\\n <div class=\\\"menuContent\\\">\\n <div>\\n <div class=\\\"md-checkbox\\\">\\n <input id=\\\"setting_auto_refresh\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.settings.repeater.autoRefresh\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" />\\n <label for=\\\"setting_auto_refresh\\\">Auto refresh</label>\\n </div>\\n <div ng-if=\\\"$ctrl.settings.repeater.autoRefresh\\\">\\n <label for=\\\"settings_refresh_rate\\\">\\n Refresh rate\\n </label>\\n <select id=\\\"settings_refresh_rate\\\" ng-model=\\\"$ctrl.settings.repeater.refreshRate\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" class=\\\"small-select\\\">\\n <option value=\\\"10\\\">10s</option>\\n <option value=\\\"30\\\">30s</option>\\n <option value=\\\"60\\\">1min</option>\\n <option value=\\\"120\\\">2min</option>\\n <option value=\\\"300\\\">5min</option>\\n </select>\\n <span>\\n <i id=\\\"refreshRateChange\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-top: 7px; display: none;\\\"></i>\\n </span>\\n </div>\\n </div>\\n </div>\\n <div>\\n <a type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"$ctrl.settings.open = false;\\\">Close</a>\\n </div>\\n </div>\\n </div>\\n </span>\\n </div>\\n </div>\\n <div class=\\\"actionBar\\\" ng-if=\\\"!$ctrl.offlineMode\\\" authorization=\\\"DockerImageDelete, DockerImageBuild, DockerImageLoad, DockerImageGet\\\">\\n <div class=\\\"btn-group\\\" authorization=\\\"DockerImageDelete\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-danger\\\" ng-disabled=\\\"$ctrl.state.selectedItemCount === 0\\\" ng-click=\\\"$ctrl.removeAction($ctrl.state.selectedItems, false)\\\">\\n <i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Remove\\n </button>\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-danger dropdown-toggle\\\"\\n data-toggle=\\\"dropdown\\\"\\n aria-haspopup=\\\"true\\\"\\n aria-expanded=\\\"false\\\"\\n ng-disabled=\\\"$ctrl.state.selectedItemCount === 0\\\"\\n >\\n <span class=\\\"caret\\\"></span>\\n <span class=\\\"sr-only\\\">Toggle Dropdown</span>\\n </button>\\n <ul class=\\\"dropdown-menu\\\">\\n <li><a ng-click=\\\"$ctrl.forceRemoveAction($ctrl.state.selectedItems, true)\\\" ng-disabled=\\\"$ctrl.state.selectedItemCount === 0\\\">Force Remove</a></li>\\n </ul>\\n </div>\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ui-sref=\\\"docker.images.build\\\" authorization=\\\"DockerImageBuild\\\">\\n <i class=\\\"fa fa-plus space-right\\\" aria-hidden=\\\"true\\\"></i>Build a new image\\n </button>\\n <div class=\\\"btn-group\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ng-disabled=\\\"$ctrl.exportInProgress\\\" ui-sref=\\\"docker.images.import\\\" authorization=\\\"DockerImageLoad\\\">\\n <i class=\\\"fa fa-upload space-right\\\" aria-hidden=\\\"true\\\"></i>Import\\n </button>\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-primary\\\"\\n ng-disabled=\\\"$ctrl.state.selectedItemCount === 0 || $ctrl.exportInProgress\\\"\\n ng-click=\\\"$ctrl.downloadAction($ctrl.state.selectedItems)\\\"\\n button-spinner=\\\"$ctrl.exportInProgress\\\"\\n authorization=\\\"DockerImageGet\\\"\\n >\\n <i class=\\\"fa fa-download space-right\\\" aria-hidden=\\\"true\\\"></i>\\n <span ng-hide=\\\"$ctrl.exportInProgress\\\">Export</span>\\n <span ng-show=\\\"$ctrl.exportInProgress\\\">Export in progress...</span>\\n </button>\\n </div>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n auto-focus\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover table-filters nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th uib-dropdown dropdown-append-to-body auto-close=\\\"disabled\\\" popover-placement=\\\"bottom-left\\\" is-open=\\\"$ctrl.filters.state.open\\\">\\n <span class=\\\"md-checkbox\\\" ng-if=\\\"!$ctrl.offlineMode\\\">\\n <input id=\\\"select_all\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.state.selectAll\\\" ng-change=\\\"$ctrl.selectAll()\\\" />\\n <label for=\\\"select_all\\\"></label>\\n </span>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Id')\\\">\\n Id\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Id' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Id' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n <div>\\n <span uib-dropdown-toggle class=\\\"table-filter\\\" ng-if=\\\"!$ctrl.filters.state.enabled\\\">Filter <i class=\\\"fa fa-filter\\\" aria-hidden=\\\"true\\\"></i></span>\\n <span uib-dropdown-toggle class=\\\"table-filter filter-active\\\" ng-if=\\\"$ctrl.filters.state.enabled\\\">Filter <i class=\\\"fa fa-check\\\" aria-hidden=\\\"true\\\"></i></span>\\n </div>\\n <div class=\\\"dropdown-menu\\\" uib-dropdown-menu>\\n <div class=\\\"tableMenu\\\">\\n <div class=\\\"menuHeader\\\">\\n Filter by usage\\n </div>\\n <div class=\\\"menuContent\\\">\\n <div class=\\\"md-checkbox\\\">\\n <input id=\\\"filter_usage_usedImages\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.filters.state.showUsedImages\\\" ng-change=\\\"$ctrl.onstateFilterChange()\\\" />\\n <label for=\\\"filter_usage_usedImages\\\">Used images</label>\\n </div>\\n <div class=\\\"md-checkbox\\\">\\n <input id=\\\"filter_usage_unusedImages\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.filters.state.showUnusedImages\\\" ng-change=\\\"$ctrl.onstateFilterChange()\\\" />\\n <label for=\\\"filter_usage_unusedImages\\\">Unused images</label>\\n </div>\\n </div>\\n <div>\\n <a type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"$ctrl.filters.state.open = false;\\\">Close</a>\\n </div>\\n </div>\\n </div>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('RepoTags')\\\">\\n Tags\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'RepoTags' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'RepoTags' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('VirtualSize')\\\">\\n Size\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'VirtualSize' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'VirtualSize' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Created')\\\">\\n Created\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Created' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Created' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th ng-if=\\\"$ctrl.showHostColumn\\\">\\n <a ng-click=\\\"$ctrl.changeOrderBy('NodeName')\\\">\\n Host\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'NodeName' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'NodeName' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter: $ctrl.applyFilters | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit))\\\"\\n ng-class=\\\"{ active: item.Checked }\\\"\\n >\\n <td>\\n <span class=\\\"md-checkbox\\\" ng-if=\\\"!$ctrl.offlineMode\\\">\\n <input id=\\\"select_{{ $index }}\\\" type=\\\"checkbox\\\" ng-model=\\\"item.Checked\\\" ng-click=\\\"$ctrl.selectItem(item, $event)\\\" />\\n <label for=\\\"select_{{ $index }}\\\"></label>\\n </span>\\n <a ng-if=\\\"!$ctrl.offlineMode\\\" ui-sref=\\\"docker.images.image({ id: item.Id, nodeName: item.NodeName })\\\" class=\\\"monospaced\\\" title=\\\"{{ item.Id }}\\\">{{\\n item.Id | truncate: 40\\n }}</a>\\n <span ng-if=\\\"$ctrl.offlineMode\\\">{{ item.Id | truncate: 40 }}</span>\\n <span style=\\\"margin-left: 10px;\\\" class=\\\"label label-warning image-tag\\\" ng-if=\\\"::item.ContainerCount === 0\\\">Unused</span>\\n </td>\\n <td>\\n <span class=\\\"label label-primary image-tag\\\" ng-repeat=\\\"tag in (item | repotags) track by $index\\\">{{ tag }}</span>\\n </td>\\n <td>{{ item.VirtualSize | humansize }}</td>\\n <td>{{ item.Created | getisodatefromtimestamp }}</td>\\n <td ng-if=\\\"$ctrl.showHostColumn\\\">{{ item.NodeName ? item.NodeName : '-' }}</td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"5\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"5\\\" class=\\\"text-center text-muted\\\">No image available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","angular.module('portainer.docker').controller('ImagesDatatableController', [\n '$scope',\n '$controller',\n 'DatatableService',\n function ($scope, $controller, DatatableService) {\n angular.extend(this, $controller('GenericDatatableController', { $scope: $scope }));\n\n var ctrl = this;\n\n this.filters = {\n state: {\n open: false,\n enabled: false,\n showUsedImages: true,\n showUnusedImages: true,\n },\n };\n\n this.applyFilters = function (value) {\n var image = value;\n var filters = ctrl.filters;\n if ((image.ContainerCount === 0 && filters.state.showUnusedImages) || (image.ContainerCount !== 0 && filters.state.showUsedImages)) {\n return true;\n }\n return false;\n };\n\n this.onstateFilterChange = function () {\n var filters = this.filters.state;\n var filtered = false;\n if (!filters.showUsedImages || !filters.showUnusedImages) {\n filtered = true;\n }\n this.filters.state.enabled = filtered;\n DatatableService.setDataTableFilters(this.tableKey, this.filters);\n };\n\n this.$onInit = function () {\n this.setDefaults();\n this.prepareTableFromDataset();\n\n this.state.orderBy = this.orderBy;\n var storedOrder = DatatableService.getDataTableOrder(this.tableKey);\n if (storedOrder !== null) {\n this.state.reverseOrder = storedOrder.reverse;\n this.state.orderBy = storedOrder.orderBy;\n }\n\n var textFilter = DatatableService.getDataTableTextFilters(this.tableKey);\n if (textFilter !== null) {\n this.state.textFilter = textFilter;\n this.onTextFilterChange();\n }\n\n var storedFilters = DatatableService.getDataTableFilters(this.tableKey);\n if (storedFilters !== null) {\n this.filters = storedFilters;\n }\n if (this.filters && this.filters.state) {\n this.filters.state.open = false;\n }\n\n var storedSettings = DatatableService.getDataTableSettings(this.tableKey);\n if (storedSettings !== null) {\n this.settings = storedSettings;\n this.settings.open = false;\n }\n\n this.onSettingsRepeaterChange();\n };\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./macvlanNodesDatatable.html');\n\nangular.module('portainer.docker').component('macvlanNodesDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'GenericDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n showIpAddressColumn: '<',\n accessToNodeDetails: '<',\n state: '=',\n },\n});\n","var path = 'app/docker/components/datatables/macvlan-nodes-datatable/macvlanNodesDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n auto-focus\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th>\\n <span class=\\\"md-checkbox\\\">\\n <input id=\\\"select_all\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.state.selectAll\\\" ng-change=\\\"$ctrl.selectAll()\\\" />\\n <label for=\\\"select_all\\\"></label>\\n </span>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Hostname')\\\">\\n Name\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Hostname' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Hostname' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Role')\\\">\\n Role\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Role' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Role' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('EngineVersion')\\\">\\n Engine\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'EngineVersion' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'EngineVersion' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th ng-if=\\\"$ctrl.showIpAddressColumn\\\">\\n <a ng-click=\\\"$ctrl.changeOrderBy('Addr')\\\">\\n IP Address\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Addr' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Addr' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Status')\\\">\\n Status\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Status' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Status' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit))\\\"\\n ng-class=\\\"{ active: item.Checked }\\\"\\n >\\n <td>\\n <span class=\\\"md-checkbox\\\">\\n <input id=\\\"select_{{ $index }}\\\" type=\\\"checkbox\\\" ng-model=\\\"item.Checked\\\" ng-click=\\\"$ctrl.selectItem(item, $event)\\\" />\\n <label for=\\\"select_{{ $index }}\\\"></label>\\n </span>\\n <a ui-sref=\\\"docker.nodes.node({id: item.Id})\\\" ng-if=\\\"$ctrl.accessToNodeDetails\\\">{{ item.Hostname }}</a>\\n <span ng-if=\\\"!$ctrl.accessToNodeDetails\\\">{{ item.Hostname }}</span>\\n </td>\\n <td>{{ item.Role }}</td>\\n <td>{{ item.EngineVersion }}</td>\\n <td ng-if=\\\"$ctrl.showIpAddressColumn\\\">{{ item.Addr }}</td>\\n <td>\\n <span class=\\\"label label-{{ item.Status | nodestatusbadge }}\\\">{{ item.Status }}</span>\\n </td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"7\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"7\\\" class=\\\"text-center text-muted\\\">No node available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./networkRowContent.html');\n\nimport { ResourceControlOwnership as RCO } from 'Portainer/models/resourceControl/resourceControlOwnership';\n\nangular.module('portainer.docker').directive('networkRowContent', [\n function networkRowContent() {\n var directive = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n restrict: 'A',\n transclude: true,\n scope: {\n item: '<',\n parentCtrl: '<',\n allowCheckbox: '<',\n allowExpand: '<',\n },\n controller: ($scope) => {\n $scope.RCO = RCO;\n },\n };\n return directive;\n },\n]);\n","var path = 'app/docker/components/datatables/networks-datatable/network-row-content/networkRowContent.html';\nvar html = \"<td ng-if=\\\"allowCheckbox\\\">\\n <span class=\\\"md-checkbox\\\" ng-if=\\\"!parentCtrl.offlineMode\\\" authorization=\\\"DockerNetworkDelete, DockerNetworkCreate\\\">\\n <input\\n id=\\\"select_{{ $index }}\\\"\\n type=\\\"checkbox\\\"\\n ng-model=\\\"item.Checked\\\"\\n ng-click=\\\"parentCtrl.selectItem(item, $event); $event.stopPropagation()\\\"\\n ng-disabled=\\\"parentCtrl.disableRemove(item)\\\"\\n />\\n <label for=\\\"select_{{ $index }}\\\"></label>\\n </span>\\n <a ng-if=\\\"parentCtrl.itemCanExpand(item)\\\"\\n ><i ng-class=\\\"{ 'fas fa-angle-down': item.Expanded, 'fas fa-angle-right': !item.Expanded }\\\" class=\\\"space-right\\\" aria-hidden=\\\"true\\\"></i\\n ></a>\\n</td>\\n<td ng-if=\\\"!allowCheckbox\\\"></td>\\n<td>\\n <a ng-if=\\\"!parentCtrl.offlineMode\\\" ui-sref=\\\"docker.networks.network({ id: item.Id, nodeName: item.NodeName })\\\" title=\\\"{{ item.Name }}\\\">{{ item.Name | truncate: 40 }}</a>\\n <span ng-if=\\\"parentCtrl.offlineMode\\\">{{ item.Name | truncate: 40 }}</span>\\n <span style=\\\"margin-left: 10px;\\\" class=\\\"label label-info image-tag space-left\\\" ng-if=\\\"item.ResourceControl.System\\\">System</span>\\n</td>\\n<td>{{ item.StackName ? item.StackName : '-' }}</td>\\n<td>{{ item.Driver }}</td>\\n<td>{{ item.Attachable }}</td>\\n<td>{{ item.IPAM.Driver }}</td>\\n<td>{{ item.IPAM.IPV4Configs[0].Subnet ? item.IPAM.IPV4Configs[0].Subnet : '-' }}</td>\\n<td>{{ item.IPAM.IPV4Configs[0].Gateway ? item.IPAM.IPV4Configs[0].Gateway : '-' }}</td>\\n<td>{{ item.IPAM.IPV6Configs[0].Subnet ? item.IPAM.IPV6Configs[0].Subnet : '-' }}</td>\\n<td>{{ item.IPAM.IPV6Configs[0].Gateway ? item.IPAM.IPV6Configs[0].Gateway : '-' }}</td>\\n<td ng-if=\\\"parentCtrl.showHostColumn\\\">{{ item.NodeName ? item.NodeName : '-' }}</td>\\n<td>\\n <span>\\n <i ng-class=\\\"item.ResourceControl.Ownership | ownershipicon\\\" aria-hidden=\\\"true\\\"></i>\\n {{ item.ResourceControl.Ownership ? item.ResourceControl.Ownership : item.ResourceControl.Ownership = RCO.ADMINISTRATORS }}\\n </span>\\n</td>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./networksDatatable.html');\n\nangular.module('portainer.docker').component('networksDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'NetworksDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n showHostColumn: '<',\n removeAction: '<',\n offlineMode: '<',\n refreshCallback: '<',\n },\n});\n","var path = 'app/docker/components/datatables/networks-datatable/networksDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n <div class=\\\"settings\\\">\\n <span class=\\\"setting\\\" ng-class=\\\"{ 'setting-active': $ctrl.settings.open }\\\" uib-dropdown dropdown-append-to-body auto-close=\\\"disabled\\\" is-open=\\\"$ctrl.settings.open\\\">\\n <span uib-dropdown-toggle><i class=\\\"fa fa-cog\\\" aria-hidden=\\\"true\\\"></i> Settings</span>\\n <div class=\\\"dropdown-menu dropdown-menu-right\\\" uib-dropdown-menu>\\n <div class=\\\"tableMenu\\\">\\n <div class=\\\"menuHeader\\\">\\n Table settings\\n </div>\\n <div class=\\\"menuContent\\\">\\n <div>\\n <div class=\\\"md-checkbox\\\">\\n <input id=\\\"setting_auto_refresh\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.settings.repeater.autoRefresh\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" />\\n <label for=\\\"setting_auto_refresh\\\">Auto refresh</label>\\n </div>\\n <div ng-if=\\\"$ctrl.settings.repeater.autoRefresh\\\">\\n <label for=\\\"settings_refresh_rate\\\">\\n Refresh rate\\n </label>\\n <select id=\\\"settings_refresh_rate\\\" ng-model=\\\"$ctrl.settings.repeater.refreshRate\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" class=\\\"small-select\\\">\\n <option value=\\\"10\\\">10s</option>\\n <option value=\\\"30\\\">30s</option>\\n <option value=\\\"60\\\">1min</option>\\n <option value=\\\"120\\\">2min</option>\\n <option value=\\\"300\\\">5min</option>\\n </select>\\n <span>\\n <i id=\\\"refreshRateChange\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-top: 7px; display: none;\\\"></i>\\n </span>\\n </div>\\n </div>\\n </div>\\n <div>\\n <a type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"$ctrl.settings.open = false;\\\">Close</a>\\n </div>\\n </div>\\n </div>\\n </span>\\n </div>\\n </div>\\n <div class=\\\"actionBar\\\" ng-if=\\\"!$ctrl.offlineMode\\\" authorization=\\\"DockerNetworkDelete, DockerNetworkCreate\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-danger\\\"\\n authorization=\\\"DockerNetworkDelete\\\"\\n ng-disabled=\\\"$ctrl.state.selectedItemCount === 0\\\"\\n ng-click=\\\"$ctrl.removeAction($ctrl.state.selectedItems)\\\"\\n >\\n <i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Remove\\n </button>\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ui-sref=\\\"docker.networks.new\\\" authorization=\\\"DockerNetworkCreate\\\">\\n <i class=\\\"fa fa-plus space-right\\\" aria-hidden=\\\"true\\\"></i>Add network\\n </button>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n auto-focus\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th style=\\\"width: 55px;\\\">\\n <span class=\\\"md-checkbox\\\" ng-if=\\\"!$ctrl.offlineMode\\\" authorization=\\\"DockerNetworkDelete, DockerNetworkCreate\\\">\\n <input id=\\\"select_all\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.state.selectAll\\\" ng-change=\\\"$ctrl.selectAll()\\\" />\\n <label for=\\\"select_all\\\"></label>\\n </span>\\n <a ng-click=\\\"$ctrl.expandAll()\\\" ng-if=\\\"$ctrl.hasExpandableItems()\\\">\\n <i ng-class=\\\"{ 'fas fa-angle-down': $ctrl.state.expandAll, 'fas fa-angle-right': !$ctrl.state.expandAll }\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Name')\\\">\\n Name\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('StackName')\\\">\\n Stack\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'StackName' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'StackName' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Driver')\\\">\\n Driver\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Driver' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Driver' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Attachable')\\\">\\n Attachable\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Attachable' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Attachable' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('IPAM.Driver')\\\">\\n IPAM Driver\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'IPAM.Driver' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'IPAM.Driver' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('IPAM.IPV4Configs[0].Subnet')\\\">\\n IPV4 IPAM Subnet\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'IPAM.IPV4Configs[0].Subnet' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'IPAM.IPV4Configs[0].Subnet' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('IPAM.IPV4Configs[0].Gateway')\\\">\\n IPV4 IPAM Gateway\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'IPAM.IPV4Configs[0].Gateway' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'IPAM.IPV4Configs[0].Gateway' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('IPAM.IPV6Configs[0].Subnet')\\\">\\n IPV6 IPAM Subnet\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'IPAM.IPV6Configs[0].Subnet' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'IPAM.IPV6Configs[0].Subnet' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('IPAM.IPV6Configs[0].Gateway')\\\">\\n IPV6 IPAM Gateway\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'IPAM.IPV6Configs[0].Gateway' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'IPAM.IPV6Configs[0].Gateway' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th ng-if=\\\"$ctrl.showHostColumn\\\">\\n <a ng-click=\\\"$ctrl.changeOrderBy('NodeName')\\\">\\n Host\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'NodeName' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'NodeName' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('ResourceControl.Ownership')\\\">\\n Ownership\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'ResourceControl.Ownership' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'ResourceControl.Ownership' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate-start=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit))\\\"\\n ng-class=\\\"{ active: item.Checked }\\\"\\n network-row-content\\n item=\\\"item\\\"\\n parent-ctrl=\\\"$ctrl\\\"\\n ng-click=\\\"$ctrl.expandItem(item, !item.Expanded)\\\"\\n allow-checkbox=\\\"true\\\"\\n >\\n </tr>\\n <tr dir-paginate-end ng-show=\\\"item.Expanded\\\" ng-repeat=\\\"it in item.Subs\\\" class=\\\"datatable-highlighted\\\" network-row-content item=\\\"it\\\" parent-ctrl=\\\"$ctrl\\\"> </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"9\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"9\\\" class=\\\"text-center text-muted\\\">No network available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import _ from 'lodash-es';\n\nangular.module('portainer.docker').controller('NetworksDatatableController', [\n '$scope',\n '$controller',\n 'NetworkHelper',\n 'DatatableService',\n function ($scope, $controller, NetworkHelper, DatatableService) {\n angular.extend(this, $controller('GenericDatatableController', { $scope: $scope }));\n\n this.disableRemove = function (item) {\n return NetworkHelper.isSystemNetwork(item);\n };\n\n this.state = Object.assign(this.state, {\n expandedItems: [],\n });\n\n /**\n * Do not allow system networks to be selected\n */\n this.allowSelection = function (item) {\n return !this.disableRemove(item);\n };\n\n this.$onInit = function () {\n this.setDefaults();\n this.prepareTableFromDataset();\n\n this.state.orderBy = this.orderBy;\n var storedOrder = DatatableService.getDataTableOrder(this.tableKey);\n if (storedOrder !== null) {\n this.state.reverseOrder = storedOrder.reverse;\n this.state.orderBy = storedOrder.orderBy;\n }\n\n var textFilter = DatatableService.getDataTableTextFilters(this.tableKey);\n if (textFilter !== null) {\n this.state.textFilter = textFilter;\n this.onTextFilterChange();\n }\n\n var storedFilters = DatatableService.getDataTableFilters(this.tableKey);\n if (storedFilters !== null) {\n this.filters = storedFilters;\n }\n if (this.filters && this.filters.state) {\n this.filters.state.open = false;\n }\n\n var storedSettings = DatatableService.getDataTableSettings(this.tableKey);\n if (storedSettings !== null) {\n this.settings = storedSettings;\n this.settings.open = false;\n }\n this.onSettingsRepeaterChange();\n };\n\n this.expandItem = function (item, expanded) {\n item.Expanded = expanded;\n };\n\n this.itemCanExpand = function (item) {\n return item.Subs.length > 0;\n };\n\n this.hasExpandableItems = function () {\n return _.filter(this.state.filteredDataSet, (item) => this.itemCanExpand(item)).length;\n };\n\n this.expandAll = function () {\n this.state.expandAll = !this.state.expandAll;\n _.forEach(this.state.filteredDataSet, (item) => {\n if (this.itemCanExpand(item)) {\n this.expandItem(item, this.state.expandAll);\n }\n });\n };\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./nodeTasksDatatable.html');\n\nangular.module('portainer.docker').component('nodeTasksDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'GenericDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n },\n});\n","var path = 'app/docker/components/datatables/node-tasks-datatable/nodeTasksDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n auto-focus\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Id')\\\">\\n Id\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Id' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Id' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Status')\\\">\\n Status\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Status' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Status' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Slot')\\\">\\n Slot\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Slot' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Slot' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Spec.ContainerSpec.Image')\\\">\\n Image\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Spec.ContainerSpec.Image' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Spec.ContainerSpec.Image' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Updated')\\\">\\n Last Update\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Updated' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Updated' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit))\\\"\\n ng-class=\\\"{ active: item.Checked }\\\"\\n >\\n <td\\n ><a ui-sref=\\\"docker.tasks.task({id: item.Id})\\\" class=\\\"monospaced\\\">{{ item.Id }}</a></td\\n >\\n <td\\n ><span class=\\\"label label-{{ item.Status.State | taskstatusbadge }}\\\">{{ item.Status.State }}</span></td\\n >\\n <td>{{ item.Slot ? item.Slot : '-' }}</td>\\n <td>{{ item.Spec.ContainerSpec.Image | hideshasum }}</td>\\n <td>{{ item.Updated | getisodate }}</td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"5\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"5\\\" class=\\\"text-center text-muted\\\">No task available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./nodesDatatable.html');\n\nangular.module('portainer.docker').component('nodesDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'GenericDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n showIpAddressColumn: '<',\n accessToNodeDetails: '<',\n refreshCallback: '<',\n },\n});\n","var path = 'app/docker/components/datatables/nodes-datatable/nodesDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n <div class=\\\"settings\\\">\\n <span class=\\\"setting\\\" ng-class=\\\"{ 'setting-active': $ctrl.settings.open }\\\" uib-dropdown dropdown-append-to-body auto-close=\\\"disabled\\\" is-open=\\\"$ctrl.settings.open\\\">\\n <span uib-dropdown-toggle><i class=\\\"fa fa-cog\\\" aria-hidden=\\\"true\\\"></i> Settings</span>\\n <div class=\\\"dropdown-menu dropdown-menu-right\\\" uib-dropdown-menu>\\n <div class=\\\"tableMenu\\\">\\n <div class=\\\"menuHeader\\\">\\n Table settings\\n </div>\\n <div class=\\\"menuContent\\\">\\n <div>\\n <div class=\\\"md-checkbox\\\">\\n <input id=\\\"setting_auto_refresh\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.settings.repeater.autoRefresh\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" />\\n <label for=\\\"setting_auto_refresh\\\">Auto refresh</label>\\n </div>\\n <div ng-if=\\\"$ctrl.settings.repeater.autoRefresh\\\">\\n <label for=\\\"settings_refresh_rate\\\">\\n Refresh rate\\n </label>\\n <select id=\\\"settings_refresh_rate\\\" ng-model=\\\"$ctrl.settings.repeater.refreshRate\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" class=\\\"small-select\\\">\\n <option value=\\\"10\\\">10s</option>\\n <option value=\\\"30\\\">30s</option>\\n <option value=\\\"60\\\">1min</option>\\n <option value=\\\"120\\\">2min</option>\\n <option value=\\\"300\\\">5min</option>\\n </select>\\n <span>\\n <i id=\\\"refreshRateChange\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-top: 7px; display: none;\\\"></i>\\n </span>\\n </div>\\n </div>\\n </div>\\n <div>\\n <a type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"$ctrl.settings.open = false;\\\">Close</a>\\n </div>\\n </div>\\n </div>\\n </span>\\n </div>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n auto-focus\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Hostname')\\\">\\n Name\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Hostname' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Hostname' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Role')\\\">\\n Role\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Role' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Role' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('CPUs')\\\">\\n CPU\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'CPUs' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'CPUs' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Memory')\\\">\\n Memory\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Memory' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Memory' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('EngineVersion')\\\">\\n Engine\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'EngineVersion' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'EngineVersion' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th ng-if=\\\"$ctrl.showIpAddressColumn\\\">\\n <a ng-click=\\\"$ctrl.changeOrderBy('Addr')\\\">\\n IP Address\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Addr' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Addr' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Status')\\\">\\n Status\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Status' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Status' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Availability')\\\">\\n Availability\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Availability' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Availability' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit))\\\"\\n ng-class=\\\"{ active: item.Checked }\\\"\\n >\\n <td>\\n <a ui-sref=\\\"docker.nodes.node({id: item.Id})\\\" ng-if=\\\"$ctrl.accessToNodeDetails\\\">{{ item.Name || item.Hostname }}</a>\\n <span ng-if=\\\"!$ctrl.accessToNodeDetails\\\">{{ item.Name || item.Hostname }}</span>\\n </td>\\n <td>{{ item.Role }}</td>\\n <td>{{ item.CPUs / 1000000000 }}</td>\\n <td>{{ item.Memory | humansize }}</td>\\n <td>{{ item.EngineVersion }}</td>\\n <td ng-if=\\\"$ctrl.showIpAddressColumn\\\">{{ item.Addr }}</td>\\n <td\\n ><span class=\\\"label label-{{ item.Status | nodestatusbadge }}\\\">{{ item.Status }}</span></td\\n >\\n <td\\n ><span class=\\\"label label-{{ item.Availability | dockerNodeAvailabilityBadge }}\\\">{{ item.Availability }}</span></td\\n >\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"7\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"7\\\" class=\\\"text-center text-muted\\\">No node available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./secretsDatatable.html');\n\nangular.module('portainer.docker').component('secretsDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'GenericDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n removeAction: '<',\n refreshCallback: '<',\n },\n});\n","var path = 'app/docker/components/datatables/secrets-datatable/secretsDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n <div class=\\\"settings\\\">\\n <span class=\\\"setting\\\" ng-class=\\\"{ 'setting-active': $ctrl.settings.open }\\\" uib-dropdown dropdown-append-to-body auto-close=\\\"disabled\\\" is-open=\\\"$ctrl.settings.open\\\">\\n <span uib-dropdown-toggle><i class=\\\"fa fa-cog\\\" aria-hidden=\\\"true\\\"></i> Settings</span>\\n <div class=\\\"dropdown-menu dropdown-menu-right\\\" uib-dropdown-menu>\\n <div class=\\\"tableMenu\\\">\\n <div class=\\\"menuHeader\\\">\\n Table settings\\n </div>\\n <div class=\\\"menuContent\\\">\\n <div>\\n <div class=\\\"md-checkbox\\\">\\n <input id=\\\"setting_auto_refresh\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.settings.repeater.autoRefresh\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" />\\n <label for=\\\"setting_auto_refresh\\\">Auto refresh</label>\\n </div>\\n <div ng-if=\\\"$ctrl.settings.repeater.autoRefresh\\\">\\n <label for=\\\"settings_refresh_rate\\\">\\n Refresh rate\\n </label>\\n <select id=\\\"settings_refresh_rate\\\" ng-model=\\\"$ctrl.settings.repeater.refreshRate\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" class=\\\"small-select\\\">\\n <option value=\\\"10\\\">10s</option>\\n <option value=\\\"30\\\">30s</option>\\n <option value=\\\"60\\\">1min</option>\\n <option value=\\\"120\\\">2min</option>\\n <option value=\\\"300\\\">5min</option>\\n </select>\\n <span>\\n <i id=\\\"refreshRateChange\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-top: 7px; display: none;\\\"></i>\\n </span>\\n </div>\\n </div>\\n </div>\\n <div>\\n <a type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"$ctrl.settings.open = false;\\\">Close</a>\\n </div>\\n </div>\\n </div>\\n </span>\\n </div>\\n </div>\\n <div class=\\\"actionBar\\\" authorization=\\\"DockerSecretDelete, DockerSecretCreate\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-danger\\\"\\n authorization=\\\"DockerSecretDelete\\\"\\n ng-disabled=\\\"$ctrl.state.selectedItemCount === 0\\\"\\n ng-click=\\\"$ctrl.removeAction($ctrl.state.selectedItems)\\\"\\n >\\n <i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Remove\\n </button>\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ui-sref=\\\"docker.secrets.new\\\" authorization=\\\"DockerSecretCreate\\\">\\n <i class=\\\"fa fa-plus space-right\\\" aria-hidden=\\\"true\\\"></i>Add secret\\n </button>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n auto-focus\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th>\\n <span class=\\\"md-checkbox\\\" authorization=\\\"DockerSecretDelete, DockerSecretCreate\\\">\\n <input id=\\\"select_all\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.state.selectAll\\\" ng-change=\\\"$ctrl.selectAll()\\\" />\\n <label for=\\\"select_all\\\"></label>\\n </span>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Name')\\\">\\n Name\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('CreatedAt')\\\">\\n Creation Date\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'CreatedAt' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'CreatedAt' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('ResourceControl.Ownership')\\\">\\n Ownership\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'ResourceControl.Ownership' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'ResourceControl.Ownership' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit))\\\"\\n ng-class=\\\"{ active: item.Checked }\\\"\\n >\\n <td>\\n <span class=\\\"md-checkbox\\\" authorization=\\\"DockerSecretDelete, DockerSecretCreate\\\">\\n <input id=\\\"select_{{ $index }}\\\" type=\\\"checkbox\\\" ng-model=\\\"item.Checked\\\" ng-click=\\\"$ctrl.selectItem(item, $event)\\\" />\\n <label for=\\\"select_{{ $index }}\\\"></label>\\n </span>\\n <a ui-sref=\\\"docker.secrets.secret({id: item.Id})\\\">{{ item.Name }}</a>\\n </td>\\n <td>{{ item.CreatedAt | getisodate }}</td>\\n <td>\\n <span>\\n <i ng-class=\\\"item.ResourceControl.Ownership | ownershipicon\\\" aria-hidden=\\\"true\\\"></i>\\n {{ item.ResourceControl.Ownership ? item.ResourceControl.Ownership : item.ResourceControl.Ownership = $ctrl.RCO.ADMINISTRATORS }}\\n </span>\\n </td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"3\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"3\\\" class=\\\"text-center text-muted\\\">No secret available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./serviceTasksDatatable.html');\n\nangular.module('portainer.docker').component('serviceTasksDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'ServiceTasksDatatableController',\n bindings: {\n dataset: '<',\n serviceId: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n nodes: '<',\n agentProxy: '<',\n textFilter: '=',\n showTaskLogsButton: '<',\n },\n});\n","var path = 'app/docker/components/datatables/service-tasks-datatable/serviceTasksDatatable.html';\nvar html = \"<div class=\\\"service-datatable\\\">\\n <table class=\\\"table table-condensed table-hover nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th uib-dropdown dropdown-append-to-body auto-close=\\\"disabled\\\" is-open=\\\"$ctrl.filters.state.open\\\" style=\\\"width: 10%;\\\">\\n <a ng-click=\\\"$ctrl.changeOrderBy('Status.State')\\\">\\n Status\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Status.State' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Status.State' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n <span class=\\\"space-left\\\">\\n <span uib-dropdown-toggle class=\\\"table-filter\\\" ng-if=\\\"!$ctrl.filters.state.enabled\\\">Filter <i class=\\\"fa fa-filter\\\" aria-hidden=\\\"true\\\"></i></span>\\n <span uib-dropdown-toggle class=\\\"table-filter filter-active\\\" ng-if=\\\"$ctrl.filters.state.enabled\\\">Filter <i class=\\\"fa fa-check\\\" aria-hidden=\\\"true\\\"></i></span>\\n </span>\\n <div class=\\\"dropdown-menu\\\" uib-dropdown-menu>\\n <div class=\\\"tableMenu\\\">\\n <div class=\\\"menuHeader\\\">\\n Filter by state\\n </div>\\n <div class=\\\"menuContent\\\">\\n <div class=\\\"md-checkbox\\\" ng-repeat=\\\"filter in $ctrl.filters.state.values track by $index\\\">\\n <input id=\\\"filter_state_{{ $ctrl.serviceId }}_{{ $index }}\\\" type=\\\"checkbox\\\" ng-model=\\\"filter.display\\\" ng-change=\\\"$ctrl.onStateFilterChange()\\\" />\\n <label for=\\\"filter_state_{{ $ctrl.serviceId }}_{{ $index }}\\\">{{ filter.label }}</label>\\n </div>\\n </div>\\n <div>\\n <a type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"$ctrl.filters.state.open = false;\\\">Close</a>\\n </div>\\n </div>\\n </div>\\n </th>\\n <th style=\\\"width: 22%;\\\">Task</th>\\n <th>Actions</th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Slot')\\\">\\n Slot\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Slot' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Slot' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('NodeId')\\\">\\n Node\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'NodeId' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'NodeId' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Updated')\\\">\\n Last Update\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Updated' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Updated' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n ng-repeat=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter: $ctrl.applyFilters | filter:$ctrl.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder))\\\"\\n >\\n <td class=\\\"text-center\\\">\\n <span class=\\\"label label-{{ item.Status.State | taskstatusbadge }} space-right\\\">{{ item.Status.State }}</span>\\n </td>\\n <td>\\n <a ng-if=\\\"!$ctrl.agentProxy || !item.Container\\\" ui-sref=\\\"docker.tasks.task({id: item.Id})\\\" class=\\\"monospaced\\\">{{ item.Id }}</a>\\n <a ng-if=\\\"$ctrl.agentProxy && item.Container\\\" ui-sref=\\\"docker.containers.container({ id: item.Container.Id, nodeName: item.Container.NodeName })\\\" class=\\\"monospaced\\\">{{\\n item.Id\\n }}</a>\\n </td>\\n <td>\\n <container-quick-actions\\n ng-if=\\\"!$ctrl.agentProxy || !item.Container\\\"\\n container-id=\\\"item.ContainerId\\\"\\n task-id=\\\"item.Id\\\"\\n status=\\\"item.Status.State\\\"\\n state=\\\"$ctrl.state\\\"\\n ></container-quick-actions>\\n <container-quick-actions\\n ng-if=\\\"$ctrl.agentProxy && item.Container\\\"\\n container-id=\\\"item.Container.Id\\\"\\n node-name=\\\"item.Container.NodeName\\\"\\n status=\\\"item.Status.State\\\"\\n state=\\\"$ctrl.state\\\"\\n ></container-quick-actions>\\n </td>\\n <td>{{ item.Slot ? item.Slot : '-' }}</td>\\n <td>{{ item.NodeId | tasknodename: $ctrl.nodes }}</td>\\n <td>{{ item.Updated | getisodate }}</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"5\\\" class=\\\"text-center text-muted\\\">No task matching filter.</td>\\n </tr>\\n </tbody>\\n </table>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import _ from 'lodash-es';\n\nangular.module('portainer.docker').controller('ServiceTasksDatatableController', [\n '$scope',\n '$controller',\n 'DatatableService',\n function ($scope, $controller, DatatableService) {\n angular.extend(this, $controller('GenericDatatableController', { $scope: $scope }));\n\n var ctrl = this;\n\n this.state = Object.assign(this.state, {\n showQuickActionStats: true,\n showQuickActionLogs: true,\n showQuickActionConsole: true,\n showQuickActionInspect: true,\n showQuickActionExec: true,\n showQuickActionAttach: false,\n });\n\n this.filters = {\n state: {\n open: false,\n enabled: false,\n values: [],\n },\n };\n\n this.applyFilters = function (item) {\n var filters = ctrl.filters;\n for (var i = 0; i < filters.state.values.length; i++) {\n var filter = filters.state.values[i];\n if (item.Status.State === filter.label && filter.display) {\n return true;\n }\n }\n return false;\n };\n\n this.onStateFilterChange = function () {\n var filters = this.filters.state.values;\n var filtered = false;\n for (var i = 0; i < filters.length; i++) {\n var filter = filters[i];\n if (!filter.display) {\n filtered = true;\n }\n }\n this.filters.state.enabled = filtered;\n };\n\n this.prepareTableFromDataset = function () {\n var availableStateFilters = [];\n for (var i = 0; i < this.dataset.length; i++) {\n var item = this.dataset[i];\n availableStateFilters.push({ label: item.Status.State, display: true });\n }\n this.filters.state.values = _.uniqBy(availableStateFilters, 'label');\n };\n\n this.$onInit = function () {\n this.setDefaults();\n this.prepareTableFromDataset();\n\n this.state.orderBy = this.orderBy;\n var storedOrder = DatatableService.getDataTableOrder(this.tableKey);\n if (storedOrder !== null) {\n this.state.reverseOrder = storedOrder.reverse;\n this.state.orderBy = storedOrder.orderBy;\n }\n\n var textFilter = DatatableService.getDataTableTextFilters(this.tableKey);\n if (textFilter !== null) {\n this.state.textFilter = textFilter;\n this.onTextFilterChange();\n }\n\n var storedFilters = DatatableService.getDataTableFilters(this.tableKey);\n if (storedFilters !== null) {\n this.filters = storedFilters;\n }\n if (this.filters && this.filters.state) {\n this.filters.state.open = false;\n }\n\n var storedSettings = DatatableService.getDataTableSettings(this.tableKey);\n if (storedSettings !== null) {\n this.settings = storedSettings;\n this.settings.open = false;\n }\n this.onSettingsRepeaterChange();\n };\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./servicesDatatableActions.html');\n\nangular.module('portainer.docker').component('servicesDatatableActions', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'ServicesDatatableActionsController',\n bindings: {\n selectedItems: '=',\n selectedItemCount: '=',\n showUpdateAction: '<',\n showAddAction: '<',\n },\n});\n","var path = 'app/docker/components/datatables/services-datatable/actions/servicesDatatableActions.html';\nvar html = \"<div class=\\\"actionBar\\\" authorization=\\\"DockerServiceUpdate, DockerServiceDelete, DockerServiceCreate\\\">\\n <div class=\\\"btn-group\\\" role=\\\"group\\\" aria-label=\\\"...\\\">\\n <button\\n ng-if=\\\"$ctrl.showUpdateAction\\\"\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-primary\\\"\\n authorization=\\\"DockerServiceUpdate\\\"\\n ng-disabled=\\\"$ctrl.selectedItemCount === 0\\\"\\n ng-click=\\\"$ctrl.updateAction($ctrl.selectedItems)\\\"\\n >\\n <i class=\\\"fa fa-sync space-right\\\" aria-hidden=\\\"true\\\"></i>Update\\n </button>\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-danger\\\"\\n authorization=\\\"DockerServiceDelete\\\"\\n ng-disabled=\\\"$ctrl.selectedItemCount === 0\\\"\\n ng-click=\\\"$ctrl.removeAction($ctrl.selectedItems)\\\"\\n >\\n <i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Remove\\n </button>\\n </div>\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ui-sref=\\\"docker.services.new\\\" ng-if=\\\"$ctrl.showAddAction\\\" authorization=\\\"DockerServiceCreate\\\">\\n <i class=\\\"fa fa-plus space-right\\\" aria-hidden=\\\"true\\\"></i>Add service\\n </button>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","angular.module('portainer.docker').controller('ServicesDatatableActionsController', [\n '$q',\n '$state',\n 'ServiceService',\n 'ServiceHelper',\n 'Notifications',\n 'ModalService',\n 'ImageHelper',\n 'WebhookService',\n 'EndpointProvider',\n function ($q, $state, ServiceService, ServiceHelper, Notifications, ModalService, ImageHelper, WebhookService, EndpointProvider) {\n this.scaleAction = function scaleService(service) {\n var config = ServiceHelper.serviceToConfig(service.Model);\n config.Mode.Replicated.Replicas = service.Replicas;\n ServiceService.update(service, config)\n .then(function success() {\n Notifications.success('Service successfully scaled', 'New replica count: ' + service.Replicas);\n $state.reload();\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to scale service');\n service.Scale = false;\n service.Replicas = service.ReplicaCount;\n });\n };\n\n this.removeAction = function (selectedItems) {\n ModalService.confirmDeletion(\n 'Do you want to remove the selected service(s)? All the containers associated to the selected service(s) will be removed too.',\n function onConfirm(confirmed) {\n if (!confirmed) {\n return;\n }\n removeServices(selectedItems);\n }\n );\n };\n\n this.updateAction = function (selectedItems) {\n ModalService.confirmServiceForceUpdate(\n 'Do you want to force an update of the selected service(s)? All the tasks associated to the selected service(s) will be recreated.',\n function (result) {\n if (!result) {\n return;\n }\n var pullImage = false;\n if (result[0]) {\n pullImage = true;\n }\n forceUpdateServices(selectedItems, pullImage);\n }\n );\n };\n\n function forceUpdateServices(services, pullImage) {\n var actionCount = services.length;\n angular.forEach(services, function (service) {\n var config = ServiceHelper.serviceToConfig(service.Model);\n if (pullImage) {\n config.TaskTemplate.ContainerSpec.Image = ImageHelper.removeDigestFromRepository(config.TaskTemplate.ContainerSpec.Image);\n }\n\n // As explained in https://github.com/docker/swarmkit/issues/2364 ForceUpdate can accept a random\n // value or an increment of the counter value to force an update.\n config.TaskTemplate.ForceUpdate++;\n ServiceService.update(service, config)\n .then(function success() {\n Notifications.success('Service successfully updated', service.Name);\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to force update service' + service.Name);\n })\n .finally(function final() {\n --actionCount;\n if (actionCount === 0) {\n $state.reload();\n }\n });\n });\n }\n\n function removeServices(services) {\n var actionCount = services.length;\n angular.forEach(services, function (service) {\n ServiceService.remove(service)\n .then(function success() {\n return WebhookService.webhooks(service.Id, EndpointProvider.endpointID());\n })\n .then(function success(data) {\n return $q.when(data.length !== 0 && WebhookService.deleteWebhook(data[0].Id));\n })\n .then(function success() {\n Notifications.success('Service successfully removed', service.Name);\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to remove service');\n })\n .finally(function final() {\n --actionCount;\n if (actionCount === 0) {\n $state.reload();\n }\n });\n });\n }\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./servicesDatatable.html');\n\nangular.module('portainer.docker').component('servicesDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'ServicesDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n nodes: '<',\n agentProxy: '<',\n showUpdateAction: '<',\n showAddAction: '<',\n showStackColumn: '<',\n showTaskLogsButton: '<',\n refreshCallback: '<',\n notAutoFocus: '<',\n },\n});\n","var path = 'app/docker/components/datatables/services-datatable/servicesDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n <div class=\\\"settings\\\">\\n <span class=\\\"setting\\\" ng-class=\\\"{ 'setting-active': $ctrl.settings.open }\\\" uib-dropdown dropdown-append-to-body auto-close=\\\"disabled\\\" is-open=\\\"$ctrl.settings.open\\\">\\n <span uib-dropdown-toggle><i class=\\\"fa fa-cog\\\" aria-hidden=\\\"true\\\"></i> Settings</span>\\n <div class=\\\"dropdown-menu dropdown-menu-right\\\" uib-dropdown-menu>\\n <div class=\\\"tableMenu\\\">\\n <div class=\\\"menuHeader\\\">\\n Table settings\\n </div>\\n <div class=\\\"menuContent\\\">\\n <div>\\n <div class=\\\"md-checkbox\\\">\\n <input id=\\\"setting_auto_refresh\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.settings.repeater.autoRefresh\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" />\\n <label for=\\\"setting_auto_refresh\\\">Auto refresh</label>\\n </div>\\n <div ng-if=\\\"$ctrl.settings.repeater.autoRefresh\\\">\\n <label for=\\\"settings_refresh_rate\\\">\\n Refresh rate\\n </label>\\n <select id=\\\"settings_refresh_rate\\\" ng-model=\\\"$ctrl.settings.repeater.refreshRate\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" class=\\\"small-select\\\">\\n <option value=\\\"10\\\">10s</option>\\n <option value=\\\"30\\\">30s</option>\\n <option value=\\\"60\\\">1min</option>\\n <option value=\\\"120\\\">2min</option>\\n <option value=\\\"300\\\">5min</option>\\n </select>\\n <span>\\n <i id=\\\"refreshRateChange\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-top: 7px; display: none;\\\"></i>\\n </span>\\n </div>\\n </div>\\n </div>\\n <div>\\n <a type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"$ctrl.settings.open = false;\\\">Close</a>\\n </div>\\n </div>\\n </div>\\n </span>\\n </div>\\n </div>\\n <services-datatable-actions\\n selected-items=\\\"$ctrl.state.selectedItems\\\"\\n selected-item-count=\\\"$ctrl.state.selectedItemCount\\\"\\n show-add-action=\\\"$ctrl.showAddAction\\\"\\n show-update-action=\\\"$ctrl.showUpdateAction\\\"\\n ></services-datatable-actions>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n focus-if=\\\"!$ctrl.notAutoFocus\\\"\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th style=\\\"width: 55px;\\\">\\n <span class=\\\"md-checkbox\\\" authorization=\\\"DockerServiceUpdate, DockerServiceDelete, DockerServiceCreate\\\">\\n <input id=\\\"select_all\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.state.selectAll\\\" ng-change=\\\"$ctrl.selectAll()\\\" />\\n <label for=\\\"select_all\\\"></label>\\n </span>\\n <a ng-click=\\\"$ctrl.expandAll()\\\">\\n <i ng-class=\\\"{ 'fas fa-angle-down': $ctrl.state.expandAll, 'fas fa-angle-right': !$ctrl.state.expandAll }\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Name')\\\">\\n Name\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th ng-if=\\\"$ctrl.showStackColumn\\\">\\n <a ng-click=\\\"$ctrl.changeOrderBy('StackName')\\\">\\n Stack\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'StackName' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'StackName' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Image')\\\">\\n Image\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Image' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Image' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Mode')\\\">\\n Scheduling Mode\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Mode' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Mode' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Ports')\\\">\\n Published Ports\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Ports' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Ports' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('UpdatedAt')\\\">\\n Last Update\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'UpdatedAt' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'UpdatedAt' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('ResourceControl.Ownership')\\\">\\n Ownership\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'ResourceControl.Ownership' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'ResourceControl.Ownership' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n ng-click=\\\"$ctrl.expandItem(item, !item.Expanded)\\\"\\n dir-paginate-start=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit))\\\"\\n ng-class=\\\"{ active: item.Checked }\\\"\\n class=\\\"interactive\\\"\\n >\\n <td>\\n <span class=\\\"md-checkbox\\\" authorization=\\\"DockerServiceUpdate, DockerServiceDelete, DockerServiceCreate\\\">\\n <input id=\\\"select_{{ $index }}\\\" type=\\\"checkbox\\\" ng-model=\\\"item.Checked\\\" ng-click=\\\"$ctrl.selectItem(item, $event); $event.stopPropagation()\\\" />\\n <label for=\\\"select_{{ $index }}\\\"></label>\\n </span>\\n <a><i ng-class=\\\"{ 'fas fa-angle-down': item.Expanded, 'fas fa-angle-right': !item.Expanded }\\\" class=\\\"space-right\\\" aria-hidden=\\\"true\\\"></i></a>\\n </td>\\n <td>\\n <a ui-sref=\\\"docker.services.service({id: item.Id})\\\" ng-click=\\\"$event.stopPropagation()\\\">{{ item.Name }}</a>\\n </td>\\n <td ng-if=\\\"$ctrl.showStackColumn\\\">{{ item.StackName ? item.StackName : '-' }}</td>\\n <td>{{ item.Image | hideshasum }}</td>\\n <td ng-controller=\\\"ServicesDatatableActionsController as actionCtrl\\\">\\n {{ item.Mode }}\\n <code>{{ item.Tasks | runningtaskscount }}</code> / <code>{{ item.Mode === 'replicated' ? item.Replicas : ($ctrl.nodes | availablenodecount: item) }}</code>\\n <span ng-if=\\\"item.Mode === 'replicated' && !item.Scale\\\" authorization=\\\"DockerServiceUpdate\\\">\\n <a class=\\\"interactive\\\" ng-click=\\\"item.Scale = true; item.ReplicaCount = item.Replicas; $event.stopPropagation();\\\">\\n <i class=\\\"fa fa-arrows-alt-v\\\" aria-hidden=\\\"true\\\"></i> Scale\\n </a>\\n </span>\\n <span ng-if=\\\"item.Mode === 'replicated' && item.Scale\\\">\\n <input\\n class=\\\"input-sm\\\"\\n type=\\\"number\\\"\\n min=\\\"0\\\"\\n step=\\\"1\\\"\\n ng-model=\\\"item.Replicas\\\"\\n on-enter-key=\\\"actionCtrl.scaleAction(item)\\\"\\n auto-focus\\n ng-click=\\\"$event.stopPropagation();\\\"\\n />\\n <a class=\\\"interactive\\\" ng-click=\\\"item.Scale = false; $event.stopPropagation();\\\"><i class=\\\"fa fa-times\\\"></i></a>\\n <a class=\\\"interactive\\\" ng-click=\\\"actionCtrl.scaleAction(item); $event.stopPropagation();\\\"><i class=\\\"fa fa-check-square\\\"></i></a>\\n </span>\\n </td>\\n <td>\\n <a\\n ng-if=\\\"item.Ports && item.Ports.length > 0 && p.PublishedPort\\\"\\n ng-repeat=\\\"p in item.Ports\\\"\\n class=\\\"image-tag\\\"\\n ng-href=\\\"http://{{ $ctrl.state.publicURL }}:{{ p.PublishedPort }}\\\"\\n target=\\\"_blank\\\"\\n ng-click=\\\"$event.stopPropagation();\\\"\\n >\\n <i class=\\\"fa fa-external-link-alt\\\" aria-hidden=\\\"true\\\"></i> {{ p.PublishedPort }}:{{ p.TargetPort }}\\n </a>\\n <span ng-if=\\\"!item.Ports || item.Ports.length === 0\\\">-</span>\\n </td>\\n <td>{{ item.UpdatedAt | getisodate }}</td>\\n <td>\\n <span>\\n <i ng-class=\\\"item.ResourceControl.Ownership | ownershipicon\\\" aria-hidden=\\\"true\\\"></i>\\n {{ item.ResourceControl.Ownership ? item.ResourceControl.Ownership : item.ResourceControl.Ownership = $ctrl.RCO.ADMINISTRATORS }}\\n </span>\\n </td>\\n </tr>\\n <tr dir-paginate-end ng-show=\\\"item.Expanded\\\">\\n <td></td>\\n <td colspan=\\\"8\\\">\\n <service-tasks-datatable\\n dataset=\\\"item.Tasks\\\"\\n service-id=\\\"item.Id\\\"\\n table-key=\\\"service-tasks\\\"\\n order-by=\\\"Status.State\\\"\\n nodes=\\\"$ctrl.nodes\\\"\\n agent-proxy=\\\"$ctrl.agentProxy\\\"\\n show-task-logs-button=\\\"$ctrl.showTaskLogsButton\\\"\\n text-filter=\\\"$ctrl.state.textFilter\\\"\\n ></service-tasks-datatable>\\n </td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"8\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"8\\\" class=\\\"text-center text-muted\\\">No service available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import _ from 'lodash-es';\n\nangular.module('portainer.docker').controller('ServicesDatatableController', [\n '$scope',\n '$controller',\n 'DatatableService',\n 'EndpointProvider',\n function ($scope, $controller, DatatableService, EndpointProvider) {\n angular.extend(this, $controller('GenericDatatableController', { $scope: $scope }));\n\n var ctrl = this;\n\n this.state = Object.assign(this.state, {\n expandAll: false,\n expandedItems: [],\n publicURL: EndpointProvider.endpointPublicURL(),\n });\n\n this.expandAll = function () {\n this.state.expandAll = !this.state.expandAll;\n for (var i = 0; i < this.state.filteredDataSet.length; i++) {\n var item = this.state.filteredDataSet[i];\n this.expandItem(item, this.state.expandAll);\n }\n };\n\n this.expandItem = function (item, expanded) {\n item.Expanded = expanded;\n if (item.Expanded) {\n if (this.state.expandedItems.indexOf(item.Id) === -1) {\n this.state.expandedItems.push(item.Id);\n }\n } else {\n var index = this.state.expandedItems.indexOf(item.Id);\n if (index > -1) {\n this.state.expandedItems.splice(index, 1);\n }\n }\n DatatableService.setDataTableExpandedItems(this.tableKey, this.state.expandedItems);\n };\n\n function expandPreviouslyExpandedItem(item, storedExpandedItems) {\n var expandedItem = _.find(storedExpandedItems, function (storedId) {\n return item.Id === storedId;\n });\n\n if (expandedItem) {\n ctrl.expandItem(item, true);\n }\n }\n\n this.expandItems = function (storedExpandedItems) {\n var expandedItemCount = 0;\n this.state.expandedItems = storedExpandedItems;\n\n for (var i = 0; i < this.dataset.length; i++) {\n var item = this.dataset[i];\n expandPreviouslyExpandedItem(item, storedExpandedItems);\n if (item.Expanded) {\n ++expandedItemCount;\n }\n }\n\n if (expandedItemCount === this.dataset.length) {\n this.state.expandAll = true;\n }\n };\n\n this.onDataRefresh = function () {\n var storedExpandedItems = DatatableService.getDataTableExpandedItems(this.tableKey);\n if (storedExpandedItems !== null) {\n this.expandItems(storedExpandedItems);\n }\n };\n\n this.$onInit = function () {\n this.setDefaults();\n this.prepareTableFromDataset();\n\n this.state.orderBy = this.orderBy;\n var storedOrder = DatatableService.getDataTableOrder(this.tableKey);\n if (storedOrder !== null) {\n this.state.reverseOrder = storedOrder.reverse;\n this.state.orderBy = storedOrder.orderBy;\n }\n\n var textFilter = DatatableService.getDataTableTextFilters(this.tableKey);\n if (textFilter !== null) {\n this.state.textFilter = textFilter;\n this.onTextFilterChange();\n }\n\n var storedFilters = DatatableService.getDataTableFilters(this.tableKey);\n if (storedFilters !== null) {\n this.filters = storedFilters;\n }\n if (this.filters && this.filters.state) {\n this.filters.state.open = false;\n }\n\n var storedExpandedItems = DatatableService.getDataTableExpandedItems(this.tableKey);\n if (storedExpandedItems !== null) {\n this.expandItems(storedExpandedItems);\n }\n\n var storedSettings = DatatableService.getDataTableSettings(this.tableKey);\n if (storedSettings !== null) {\n this.settings = storedSettings;\n this.settings.open = false;\n }\n this.onSettingsRepeaterChange();\n };\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./tasksDatatable.html');\n\nangular.module('portainer.docker').component('tasksDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'TasksDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n nodes: '<',\n showSlotColumn: '<',\n showLogsButton: '<',\n agentProxy: '<',\n },\n});\n","var path = 'app/docker/components/datatables/tasks-datatable/tasksDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Status')\\\">\\n Status\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Status' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Status' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Id')\\\">\\n Id\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Id' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Id' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>Actions</th>\\n <th ng-if=\\\"$ctrl.showSlotColumn\\\">\\n <a ng-click=\\\"$ctrl.changeOrderBy('Slot')\\\">\\n Slot\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Slot' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Slot' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('NodeId')\\\">\\n Node\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'NodeId' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'NodeId' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Updated')\\\">\\n Last Update\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Updated' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Updated' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit))\\\"\\n ng-class=\\\"{ active: item.Checked }\\\"\\n >\\n <td\\n ><span class=\\\"label label-{{ item.Status.State | taskstatusbadge }}\\\">{{ item.Status.State }}</span></td\\n >\\n <td>\\n <a ng-if=\\\"!$ctrl.agentProxy || !item.Container\\\" ui-sref=\\\"docker.tasks.task({id: item.Id})\\\" class=\\\"monospaced\\\"\\n >{{ item.ServiceName }}{{ item.Slot ? '.' + item.Slot : '' }}{{ '.' + item.Id }}</a\\n >\\n <a ng-if=\\\"$ctrl.agentProxy && item.Container\\\" ui-sref=\\\"docker.containers.container({ id: item.Container.Id, nodeName: item.Container.NodeName })\\\" class=\\\"monospaced\\\"\\n >{{ item.ServiceName }}{{ item.Slot ? '.' + item.Slot : '' }}{{ '.' + item.Id }}</a\\n >\\n </td>\\n <td>\\n <container-quick-actions\\n ng-if=\\\"!$ctrl.agentProxy || !item.Container\\\"\\n container-id=\\\"item.ContainerId\\\"\\n task-id=\\\"item.Id\\\"\\n status=\\\"item.Status.State\\\"\\n state=\\\"$ctrl.state\\\"\\n ></container-quick-actions>\\n <container-quick-actions\\n ng-if=\\\"$ctrl.agentProxy && item.Container\\\"\\n container-id=\\\"item.Container.Id\\\"\\n node-name=\\\"item.Container.NodeName\\\"\\n status=\\\"item.Status.State\\\"\\n state=\\\"$ctrl.state\\\"\\n ></container-quick-actions>\\n </td>\\n <td ng-if=\\\"$ctrl.showSlotColumn\\\">{{ item.Slot ? item.Slot : '-' }}</td>\\n <td>{{ item.NodeId | tasknodename: $ctrl.nodes }}</td>\\n <td>{{ item.Updated | getisodate }}</td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"6\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"6\\\" class=\\\"text-center text-muted\\\">No task available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","angular.module('portainer.docker').controller('TasksDatatableController', [\n '$scope',\n '$controller',\n 'DatatableService',\n function ($scope, $controller, DatatableService) {\n angular.extend(this, $controller('GenericDatatableController', { $scope: $scope }));\n\n this.state = Object.assign(this.state, {\n showQuickActionStats: true,\n showQuickActionLogs: true,\n showQuickActionExec: true,\n showQuickActionInspect: true,\n showQuickActionAttach: false,\n });\n\n this.$onInit = function () {\n this.setDefaults();\n this.prepareTableFromDataset();\n\n this.state.orderBy = this.orderBy;\n var storedOrder = DatatableService.getDataTableOrder(this.tableKey);\n if (storedOrder !== null) {\n this.state.reverseOrder = storedOrder.reverse;\n this.state.orderBy = storedOrder.orderBy;\n }\n\n var textFilter = DatatableService.getDataTableTextFilters(this.tableKey);\n if (textFilter !== null) {\n this.state.textFilter = textFilter;\n this.onTextFilterChange();\n }\n\n var storedFilters = DatatableService.getDataTableFilters(this.tableKey);\n if (storedFilters !== null) {\n this.filters = storedFilters;\n }\n if (this.filters && this.filters.state) {\n this.filters.state.open = false;\n }\n\n var storedSettings = DatatableService.getDataTableSettings(this.tableKey);\n if (storedSettings !== null) {\n this.settings = storedSettings;\n this.settings.open = false;\n }\n this.onSettingsRepeaterChange();\n };\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./volumesDatatable.html');\n\nangular.module('portainer.docker').component('volumesDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'VolumesDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n showHostColumn: '<',\n removeAction: '<',\n showBrowseAction: '<',\n offlineMode: '<',\n refreshCallback: '<',\n },\n});\n","var path = 'app/docker/components/datatables/volumes-datatable/volumesDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n <div class=\\\"settings\\\">\\n <span class=\\\"setting\\\" ng-class=\\\"{ 'setting-active': $ctrl.settings.open }\\\" uib-dropdown dropdown-append-to-body auto-close=\\\"disabled\\\" is-open=\\\"$ctrl.settings.open\\\">\\n <span uib-dropdown-toggle><i class=\\\"fa fa-cog\\\" aria-hidden=\\\"true\\\"></i> Settings</span>\\n <div class=\\\"dropdown-menu dropdown-menu-right\\\" uib-dropdown-menu>\\n <div class=\\\"tableMenu\\\">\\n <div class=\\\"menuHeader\\\">\\n Table settings\\n </div>\\n <div class=\\\"menuContent\\\">\\n <div>\\n <div class=\\\"md-checkbox\\\">\\n <input id=\\\"setting_auto_refresh\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.settings.repeater.autoRefresh\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" />\\n <label for=\\\"setting_auto_refresh\\\">Auto refresh</label>\\n </div>\\n <div ng-if=\\\"$ctrl.settings.repeater.autoRefresh\\\">\\n <label for=\\\"settings_refresh_rate\\\">\\n Refresh rate\\n </label>\\n <select id=\\\"settings_refresh_rate\\\" ng-model=\\\"$ctrl.settings.repeater.refreshRate\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" class=\\\"small-select\\\">\\n <option value=\\\"10\\\">10s</option>\\n <option value=\\\"30\\\">30s</option>\\n <option value=\\\"60\\\">1min</option>\\n <option value=\\\"120\\\">2min</option>\\n <option value=\\\"300\\\">5min</option>\\n </select>\\n <span>\\n <i id=\\\"refreshRateChange\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-top: 7px; display: none;\\\"></i>\\n </span>\\n </div>\\n </div>\\n </div>\\n <div>\\n <a type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"$ctrl.settings.open = false;\\\">Close</a>\\n </div>\\n </div>\\n </div>\\n </span>\\n </div>\\n </div>\\n <div class=\\\"actionBar\\\" ng-if=\\\"!$ctrl.offlineMode\\\" authorization=\\\"DockerVolumeDelete, DockerVolumeCreate\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-danger\\\"\\n authorization=\\\"DockerVolumeDelete\\\"\\n ng-disabled=\\\"$ctrl.state.selectedItemCount === 0\\\"\\n ng-click=\\\"$ctrl.removeAction($ctrl.state.selectedItems)\\\"\\n >\\n <i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Remove\\n </button>\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ui-sref=\\\"docker.volumes.new\\\" authorization=\\\"DockerVolumeCreate\\\">\\n <i class=\\\"fa fa-plus space-right\\\" aria-hidden=\\\"true\\\"></i>Add volume\\n </button>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n auto-focus\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover table-filters nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th uib-dropdown dropdown-append-to-body auto-close=\\\"disabled\\\" is-open=\\\"$ctrl.filters.state.open\\\">\\n <span class=\\\"md-checkbox\\\" ng-if=\\\"!$ctrl.offlineMode\\\" authorization=\\\"DockerVolumeDelete, DockerVolumeCreate\\\">\\n <input id=\\\"select_all\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.state.selectAll\\\" ng-change=\\\"$ctrl.selectAll()\\\" />\\n <label for=\\\"select_all\\\"></label>\\n </span>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Id')\\\">\\n Name\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Id' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Id' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n <div>\\n <span uib-dropdown-toggle class=\\\"table-filter\\\" ng-if=\\\"!$ctrl.filters.state.enabled\\\">Filter <i class=\\\"fa fa-filter\\\" aria-hidden=\\\"true\\\"></i></span>\\n <span uib-dropdown-toggle class=\\\"table-filter filter-active\\\" ng-if=\\\"$ctrl.filters.state.enabled\\\">Filter <i class=\\\"fa fa-check\\\" aria-hidden=\\\"true\\\"></i></span>\\n </div>\\n <div class=\\\"dropdown-menu\\\" uib-dropdown-menu>\\n <div class=\\\"tableMenu\\\">\\n <div class=\\\"menuHeader\\\">\\n Filter by usage\\n </div>\\n <div class=\\\"menuContent\\\">\\n <div class=\\\"md-checkbox\\\">\\n <input id=\\\"filter_usage_usedImages\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.filters.state.showUsedVolumes\\\" ng-change=\\\"$ctrl.onstateFilterChange()\\\" />\\n <label for=\\\"filter_usage_usedImages\\\">Used volumes</label>\\n </div>\\n <div class=\\\"md-checkbox\\\">\\n <input id=\\\"filter_usage_unusedImages\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.filters.state.showUnusedVolumes\\\" ng-change=\\\"$ctrl.onstateFilterChange()\\\" />\\n <label for=\\\"filter_usage_unusedImages\\\">Unused volumes</label>\\n </div>\\n </div>\\n <div>\\n <a type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"$ctrl.filters.state.open = false;\\\">Close</a>\\n </div>\\n </div>\\n </div>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('StackName')\\\">\\n Stack\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'StackName' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'StackName' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Driver')\\\">\\n Driver\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Driver' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Driver' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Mountpoint')\\\">\\n Mount point\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Mountpoint' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Mountpoint' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('CreatedAt')\\\">\\n Created\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'CreatedAt' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'CreatedAt' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th ng-if=\\\"$ctrl.showHostColumn\\\">\\n <a ng-click=\\\"$ctrl.changeOrderBy('NodeName')\\\">\\n Host\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'NodeName' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'NodeName' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('ResourceControl.Ownership')\\\">\\n Ownership\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'ResourceControl.Ownership' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'ResourceControl.Ownership' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter: $ctrl.applyFilters | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit))\\\"\\n ng-class=\\\"{ active: item.Checked }\\\"\\n >\\n <td>\\n <span class=\\\"md-checkbox\\\" ng-if=\\\"!$ctrl.offlineMode\\\" authorization=\\\"DockerVolumeDelete, DockerVolumeCreate\\\">\\n <input id=\\\"select_{{ $index }}\\\" type=\\\"checkbox\\\" ng-model=\\\"item.Checked\\\" ng-click=\\\"$ctrl.selectItem(item, $event)\\\" />\\n <label for=\\\"select_{{ $index }}\\\"></label>\\n </span>\\n <a ng-if=\\\"!$ctrl.offlineMode\\\" ui-sref=\\\"docker.volumes.volume({ id: item.Id, nodeName: item.NodeName })\\\" class=\\\"monospaced\\\" title=\\\"{{ item.Id }}\\\">{{\\n item.Id | truncate: 40\\n }}</a>\\n <span ng-if=\\\"$ctrl.offlineMode\\\">{{ item.Id | truncate: 40 }}</span>\\n <btn authorization=\\\"DockerAgentBrowseList\\\" ng-if=\\\"$ctrl.showBrowseAction && !$ctrl.offlineMode\\\">\\n <a ui-sref=\\\"docker.volumes.volume.browse({ id: item.Id, nodeName: item.NodeName })\\\" class=\\\"btn btn-xs btn-primary space-left\\\">\\n <i class=\\\"fa fa-search\\\"></i> browse\\n </a>\\n </btn>\\n <span style=\\\"margin-left: 10px;\\\" class=\\\"label label-warning image-tag space-left\\\" ng-if=\\\"item.dangling\\\">Unused</span>\\n </td>\\n <td>{{ item.StackName ? item.StackName : '-' }}</td>\\n <td>{{ item.Driver }}</td>\\n <td>{{ item.Mountpoint | truncatelr }}</td>\\n <td>{{ item.CreatedAt | getisodate }}</td>\\n <td ng-if=\\\"$ctrl.showHostColumn\\\">{{ item.NodeName ? item.NodeName : '-' }}</td>\\n <td>\\n <span>\\n <i ng-class=\\\"item.ResourceControl.Ownership | ownershipicon\\\" aria-hidden=\\\"true\\\"></i>\\n {{ item.ResourceControl.Ownership ? item.ResourceControl.Ownership : item.ResourceControl.Ownership = $ctrl.RCO.ADMINISTRATORS }}\\n </span>\\n </td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"6\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"6\\\" class=\\\"text-center text-muted\\\">No volume available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","angular.module('portainer.docker').controller('VolumesDatatableController', [\n '$scope',\n '$controller',\n 'DatatableService',\n function ($scope, $controller, DatatableService) {\n angular.extend(this, $controller('GenericDatatableController', { $scope: $scope }));\n\n var ctrl = this;\n\n this.filters = {\n state: {\n open: false,\n enabled: false,\n showUsedVolumes: true,\n showUnusedVolumes: true,\n },\n };\n\n this.applyFilters = function (value) {\n var volume = value;\n var filters = ctrl.filters;\n if ((volume.dangling && filters.state.showUnusedVolumes) || (!volume.dangling && filters.state.showUsedVolumes)) {\n return true;\n }\n return false;\n };\n\n this.onstateFilterChange = function () {\n var filters = this.filters.state;\n var filtered = false;\n if (!filters.showUsedVolumes || !filters.showUnusedVolumes) {\n filtered = true;\n }\n this.filters.state.enabled = filtered;\n DatatableService.setDataTableFilters(this.tableKey, this.filters);\n };\n\n this.$onInit = function () {\n this.setDefaults();\n this.prepareTableFromDataset();\n\n this.state.orderBy = this.orderBy;\n var storedOrder = DatatableService.getDataTableOrder(this.tableKey);\n if (storedOrder !== null) {\n this.state.reverseOrder = storedOrder.reverse;\n this.state.orderBy = storedOrder.orderBy;\n }\n\n var textFilter = DatatableService.getDataTableTextFilters(this.tableKey);\n if (textFilter !== null) {\n this.state.textFilter = textFilter;\n this.onTextFilterChange();\n }\n\n var storedFilters = DatatableService.getDataTableFilters(this.tableKey);\n if (storedFilters !== null) {\n this.filters = storedFilters;\n }\n if (this.filters && this.filters.state) {\n this.filters.state.open = false;\n }\n\n var storedSettings = DatatableService.getDataTableSettings(this.tableKey);\n if (storedSettings !== null) {\n this.settings = storedSettings;\n this.settings.open = false;\n }\n this.onSettingsRepeaterChange();\n };\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./docker-sidebar.html');\n\nangular.module('portainer.docker').component('dockerSidebar', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n isSidebarOpen: '<',\n\n endpointApiVersion: '<',\n swarmManagement: '<',\n standaloneManagement: '<',\n adminAccess: '<',\n offlineMode: '<',\n currentRouteName: '<',\n endpointId: '<',\n showStacks: '<',\n },\n});\n","var path = 'app/docker/components/docker-sidebar/docker-sidebar.html';\nvar html = \"<sidebar-menu-item\\n path=\\\"docker.dashboard\\\"\\n path-params=\\\"{ endpointId: $ctrl.endpointId }\\\"\\n icon-class=\\\"fa-tachometer-alt fa-fw\\\"\\n class-name=\\\"sidebar-list\\\"\\n data-cy=\\\"dockerSidebar-dashboard\\\"\\n>\\n Dashboard\\n</sidebar-menu-item>\\n\\n<sidebar-menu\\n ng-if=\\\"!$ctrl.offlineMode\\\"\\n label=\\\"App Templates\\\"\\n icon-class=\\\"fa-rocket fa-fw\\\"\\n path=\\\"docker.templates\\\"\\n path-params=\\\"{ endpointId: $ctrl.endpointId }\\\"\\n is-sidebar-open=\\\"$ctrl.isSidebarOpen\\\"\\n children-paths=\\\"[]\\\"\\n>\\n <sidebar-menu-item path=\\\"docker.templates.custom\\\" path-params=\\\"{ endpointId: $ctrl.endpointId }\\\" class-name=\\\"sidebar-sublist\\\" data-cy=\\\"dockerSidebar-customTemplates\\\">\\n Custom Templates\\n </sidebar-menu-item>\\n</sidebar-menu>\\n\\n<sidebar-menu-item\\n ng-if=\\\"$ctrl.showStacks\\\"\\n path=\\\"docker.stacks\\\"\\n path-params=\\\"{ endpointId: $ctrl.endpointId }\\\"\\n icon-class=\\\"fa-th-list fa-fw\\\"\\n class-name=\\\"sidebar-list\\\"\\n data-cy=\\\"dockerSidebar-stacks\\\"\\n>\\n Stacks\\n</sidebar-menu-item>\\n\\n<sidebar-menu-item\\n ng-if=\\\"$ctrl.swarmManagement\\\"\\n path=\\\"docker.services\\\"\\n path-params=\\\"{ endpointId: $ctrl.endpointId }\\\"\\n icon-class=\\\"fa-list-alt fa-fw\\\"\\n class-name=\\\"sidebar-list\\\"\\n data-cy=\\\"dockerSidebar-services\\\"\\n>\\n Services\\n</sidebar-menu-item>\\n\\n<sidebar-menu-item path=\\\"docker.containers\\\" path-params=\\\"{ endpointId: $ctrl.endpointId }\\\" icon-class=\\\"fa-cubes fa-fw\\\" class-name=\\\"sidebar-list\\\" data-cy=\\\"dockerSidebar-containers\\\">\\n Containers\\n</sidebar-menu-item>\\n\\n<sidebar-menu-item path=\\\"docker.images\\\" path-params=\\\"{ endpointId: $ctrl.endpointId }\\\" icon-class=\\\"fa-clone fa-fw\\\" class-name=\\\"sidebar-list\\\" data-cy=\\\"dockerSidebar-images\\\">\\n Images\\n</sidebar-menu-item>\\n\\n<sidebar-menu-item path=\\\"docker.networks\\\" path-params=\\\"{ endpointId: $ctrl.endpointId }\\\" icon-class=\\\"fa-sitemap fa-fw\\\" class-name=\\\"sidebar-list\\\" data-cy=\\\"dockerSidebar-networks\\\">\\n Networks\\n</sidebar-menu-item>\\n\\n<sidebar-menu-item path=\\\"docker.volumes\\\" path-params=\\\"{ endpointId: $ctrl.endpointId }\\\" icon-class=\\\"fa-hdd fa-fw\\\" class-name=\\\"sidebar-list\\\" data-cy=\\\"dockerSidebar-volumes\\\">\\n Volumes\\n</sidebar-menu-item>\\n\\n<sidebar-menu-item\\n ng-if=\\\"$ctrl.endpointApiVersion >= 1.3 && $ctrl.swarmManagement\\\"\\n path=\\\"docker.configs\\\"\\n path-params=\\\"{ endpointId: $ctrl.endpointId }\\\"\\n icon-class=\\\"fa-file-code fa-fw\\\"\\n class-name=\\\"sidebar-list\\\"\\n data-cy=\\\"dockerSidebar-configs\\\"\\n>\\n Configs\\n</sidebar-menu-item>\\n\\n<sidebar-menu-item\\n ng-if=\\\"$ctrl.endpointApiVersion >= 1.25 && $ctrl.swarmManagement\\\"\\n path=\\\"docker.secrets\\\"\\n path-params=\\\"{ endpointId: $ctrl.endpointId }\\\"\\n icon-class=\\\"fa-user-secret fa-fw\\\"\\n class-name=\\\"sidebar-list\\\"\\n data-cy=\\\"dockerSidebar-secrets\\\"\\n>\\n Secrets\\n</sidebar-menu-item>\\n\\n<sidebar-menu-item\\n ng-if=\\\"$ctrl.standaloneManagement && $ctrl.adminAccess && !$ctrl.offlineMode\\\"\\n path=\\\"docker.events\\\"\\n path-params=\\\"{ endpointId: $ctrl.endpointId }\\\"\\n icon-class=\\\"fa-history fa-fw\\\"\\n class-name=\\\"sidebar-list\\\"\\n data-cy=\\\"dockerSidebar-events\\\"\\n>\\n Events\\n</sidebar-menu-item>\\n\\n<sidebar-menu\\n ng-if=\\\"$ctrl.standaloneManagement\\\"\\n label=\\\"Host\\\"\\n icon-class=\\\"fa-th fa-fw\\\"\\n path=\\\"docker.host\\\"\\n path-params=\\\"{ endpointId: $ctrl.endpointId }\\\"\\n is-sidebar-open=\\\"$ctrl.isSidebarOpen\\\"\\n children-paths=\\\"['docker.registries', 'docker.registries.access', 'docker.featuresConfiguration']\\\"\\n>\\n <div ng-if=\\\"$ctrl.adminAccess\\\">\\n <sidebar-menu-item\\n authorization=\\\"PortainerEndpointUpdateSettings\\\"\\n path=\\\"docker.featuresConfiguration\\\"\\n path-params=\\\"{ endpointId: $ctrl.endpointId }\\\"\\n class-name=\\\"sidebar-sublist\\\"\\n data-cy=\\\"dockerSidebar-setup\\\"\\n >\\n Setup\\n </sidebar-menu-item>\\n\\n <sidebar-menu-item\\n authorization=\\\"PortainerRegistryList\\\"\\n path=\\\"docker.registries\\\"\\n path-params=\\\"{ endpointId: $ctrl.endpointId }\\\"\\n class-name=\\\"sidebar-sublist\\\"\\n data-cy=\\\"dockerSidebar-registries\\\"\\n >\\n Registries\\n </sidebar-menu-item>\\n </div>\\n</sidebar-menu>\\n\\n<sidebar-menu\\n ng-if=\\\"$ctrl.swarmManagement\\\"\\n label=\\\"Swarm\\\"\\n icon-class=\\\"fa-object-group fa-fw\\\"\\n path=\\\"docker.swarm\\\"\\n path-params=\\\"{ endpointId: $ctrl.endpointId }\\\"\\n is-sidebar-open=\\\"$ctrl.isSidebarOpen\\\"\\n children-paths=\\\"['docker.registries', 'docker.registries.access', 'docker.featuresConfiguration']\\\"\\n>\\n <div ng-if=\\\"$ctrl.adminAccess\\\">\\n <sidebar-menu-item\\n authorization=\\\"PortainerEndpointUpdateSettings\\\"\\n path=\\\"docker.featuresConfiguration\\\"\\n path-params=\\\"{ endpointId: $ctrl.endpointId }\\\"\\n class-name=\\\"sidebar-sublist\\\"\\n data-cy=\\\"swarmSidebar-setup\\\"\\n >\\n Setup\\n </sidebar-menu-item>\\n\\n <sidebar-menu-item\\n authorization=\\\"PortainerRegistryList\\\"\\n path=\\\"docker.registries\\\"\\n path-params=\\\"{ endpointId: $ctrl.endpointId }\\\"\\n class-name=\\\"sidebar-sublist\\\"\\n data-cy=\\\"swarmSidebar-registries\\\"\\n >\\n Registries\\n </sidebar-menu-item>\\n </div>\\n</sidebar-menu>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./host-overview.html');\n\nangular.module('portainer.docker').component('hostOverview', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n hostDetails: '<',\n engineDetails: '<',\n devices: '<',\n disks: '<',\n isAgent: '<',\n offlineMode: '<',\n agentApiVersion: '<',\n refreshUrl: '@',\n browseUrl: '@',\n hostFeaturesEnabled: '<',\n },\n transclude: true,\n});\n","var path = 'app/docker/components/host-overview/host-overview.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Host overview\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"Refresh\\\" ui-sref=\\\"{{ $ctrl.refreshUrl }}\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content>Docker</rd-header-content>\\n</rd-header>\\n\\n<information-panel-offline ng-if=\\\"$ctrl.offlineMode\\\"></information-panel-offline>\\n\\n<host-details-panel\\n host=\\\"$ctrl.hostDetails\\\"\\n is-browse-enabled=\\\"$ctrl.isAgent && $ctrl.agentApiVersion > 1 && !$ctrl.offlineMode && $ctrl.hostFeaturesEnabled\\\"\\n browse-url=\\\"{{ $ctrl.browseUrl }}\\\"\\n></host-details-panel>\\n\\n<engine-details-panel engine=\\\"$ctrl.engineDetails\\\"></engine-details-panel>\\n\\n<devices-panel ng-if=\\\"$ctrl.isAgent && $ctrl.agentApiVersion > 1 && !$ctrl.offlineMode && $ctrl.hostFeaturesEnabled\\\" devices=\\\"$ctrl.devices\\\"></devices-panel>\\n<disks-panel ng-if=\\\"$ctrl.isAgent && $ctrl.agentApiVersion > 1 && !$ctrl.offlineMode && $ctrl.hostFeaturesEnabled\\\" disks=\\\"$ctrl.disks\\\"></disks-panel>\\n\\n<ng-transclude></ng-transclude>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./devices-panel.html');\n\nangular.module('portainer.docker').component('devicesPanel', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n devices: '<',\n },\n});\n","var path = 'app/docker/components/host-view-panels/devices-panel/devices-panel.html';\nvar html = \"<div class=\\\"row\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-sm-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-code\\\" title-text=\\\"PCI Devices\\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <thead>\\n <tr>\\n <th>Name</th>\\n <th>Vendor</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr ng-if=\\\"$ctrl.devices && $ctrl.devices.length\\\" ng-repeat=\\\"device in $ctrl.devices\\\">\\n <td>{{ device.Name }}</td>\\n <td>{{ device.Vendor }}</td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.devices\\\">\\n <td colspan=\\\"2\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.devices.length === 0\\\">\\n <td colspan=\\\"2\\\" class=\\\"text-center text-muted\\\">\\n No device available.\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./disks-panel.html');\n\nangular.module('portainer.docker').component('disksPanel', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n disks: '<',\n },\n});\n","var path = 'app/docker/components/host-view-panels/disks-panel/disks-panel.html';\nvar html = \"<div class=\\\"row\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-sm-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-code\\\" title-text=\\\"Physical Disks\\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <thead>\\n <tr>\\n <th>Vendor</th>\\n <th>Size</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr ng-if=\\\"$ctrl.disks\\\" ng-repeat=\\\"disk in $ctrl.disks\\\">\\n <td>{{ disk.Vendor }}</td>\\n <td>{{ disk.Size | humansize }}</td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.disks\\\">\\n <td colspan=\\\"2\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.disks.length === 0\\\">\\n <td colspan=\\\"2\\\" class=\\\"text-center text-muted\\\">\\n No disks available.\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./engine-details-panel.html');\n\nangular.module('portainer.docker').component('engineDetailsPanel', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n engine: '<',\n },\n});\n","var path = 'app/docker/components/host-view-panels/engine-details-panel/engine-details-panel.html';\nvar html = \"<div class=\\\"row\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-sm-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-code\\\" title-text=\\\"Engine Details\\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr>\\n <td>Version</td>\\n <td\\n >{{ $ctrl.engine.releaseVersion }} <span ng-if=\\\"$ctrl.engine.apiVersion\\\">(API: {{ $ctrl.engine.apiVersion }})</span></td\\n >\\n </tr>\\n <tr ng-if=\\\"$ctrl.engine.rootDirectory\\\">\\n <td>Root directory</td>\\n <td>{{ $ctrl.engine.rootDirectory }}</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.engine.storageDriver\\\">\\n <td>Storage Driver</td>\\n <td>{{ $ctrl.engine.storageDriver }}</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.engine.loggingDriver\\\">\\n <td>Logging Driver</td>\\n <td>{{ $ctrl.engine.loggingDriver }}</td>\\n </tr>\\n <tr>\\n <td>Volume Plugins</td>\\n <td>{{ $ctrl.engine.volumePlugins | arraytostr: ', ' }}</td>\\n </tr>\\n <tr>\\n <td>Network Plugins</td>\\n <td>{{ $ctrl.engine.networkPlugins | arraytostr: ', ' }}</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.engine.engineLabels.length\\\">\\n <td>Engine Labels</td>\\n <td>{{ $ctrl.engine.engineLabels | labelsToStr: ', ' }}</td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./host-details-panel.html');\n\nangular.module('portainer.docker').component('hostDetailsPanel', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n host: '<',\n isBrowseEnabled: '<',\n browseUrl: '@',\n },\n});\n","var path = 'app/docker/components/host-view-panels/host-details-panel/host-details-panel.html';\nvar html = \"<div class=\\\"row\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-sm-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-code\\\" title-text=\\\"Host Details\\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr>\\n <td>Hostname</td>\\n <td>{{ $ctrl.host.name }}</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.host.os\\\">\\n <td>OS Information</td>\\n <td>{{ $ctrl.host.os.type }} {{ $ctrl.host.os.arch }} {{ $ctrl.host.os.name }}</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.host.kernelVersion\\\">\\n <td>Kernel Version</td>\\n <td>{{ $ctrl.host.kernelVersion }}</td>\\n </tr>\\n <tr>\\n <td>Total CPU</td>\\n <td>{{ $ctrl.host.totalCPU }}</td>\\n </tr>\\n <tr>\\n <td>Total memory</td>\\n <td>{{ $ctrl.host.totalMemory | humansize }}</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.isBrowseEnabled\\\">\\n <td colspan=\\\"2\\\">\\n <button class=\\\"btn btn-primary btn-sm\\\" title=\\\"Browse\\\" ui-sref=\\\"{{ $ctrl.browseUrl }}\\\">\\n Browse\\n </button>\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","angular.module('portainer.docker').controller('NodeAvailabilitySelectController', [\n function NodeAvailabilitySelectController() {\n this.onChange = onChange;\n\n function onChange() {\n this.onSave({ availability: this.availability });\n }\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./node-availability-select.html');\n\nangular.module('portainer.docker').component('nodeAvailabilitySelect', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'NodeAvailabilitySelectController',\n bindings: {\n availability: '<',\n originalValue: '<',\n onSave: '&',\n },\n});\n","var path = 'app/docker/components/host-view-panels/node-availability-select/node-availability-select.html';\nvar html = \"<div class=\\\"input-group input-group-sm\\\">\\n <select name=\\\"nodeAvailability\\\" class=\\\"selectpicker form-control\\\" ng-model=\\\"$ctrl.availability\\\" ng-change=\\\"$ctrl.onChange()\\\">\\n <option value=\\\"active\\\">Active</option>\\n <option value=\\\"pause\\\">Pause</option>\\n <option value=\\\"drain\\\">Drain</option>\\n </select>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","angular.module('portainer.docker').controller('NodeLabelsTableController', [\n function NodeLabelsTableController() {\n var ctrl = this;\n ctrl.removeLabel = removeLabel;\n ctrl.updateLabel = updateLabel;\n\n function removeLabel(index) {\n var label = ctrl.labels.splice(index, 1);\n if (label !== null) {\n ctrl.onChangedLabels({ labels: ctrl.labels });\n }\n }\n\n function updateLabel(label) {\n if (label.value !== label.originalValue || label.key !== label.originalKey) {\n ctrl.onChangedLabels({ labels: ctrl.labels });\n }\n }\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./node-labels-table.html');\n\nangular.module('portainer.docker').component('nodeLabelsTable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'NodeLabelsTableController',\n bindings: {\n labels: '<',\n onChangedLabels: '&',\n },\n});\n","var path = 'app/docker/components/host-view-panels/node-labels-table/node-labels-table.html';\nvar html = \"<div ng-if=\\\"!$ctrl.labels.length\\\">\\n There are no labels for this node.\\n</div>\\n\\n<div class=\\\"col-sm-12 form-inline\\\" style=\\\"padding: 0px;\\\" ng-if=\\\"$ctrl.labels.length\\\">\\n <div ng-repeat=\\\"label in $ctrl.labels\\\" style=\\\"margin-top: 2px;\\\">\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">name</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"label.key\\\" placeholder=\\\"e.g. com.example.foo\\\" ng-change=\\\"$ctrl.updateLabel(label)\\\" />\\n </div>\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">value</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"label.value\\\" placeholder=\\\"e.g. bar\\\" ng-change=\\\"$ctrl.updateLabel(label)\\\" />\\n </div>\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"$ctrl.removeLabel($index)\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","angular.module('portainer.docker').controller('SwarmNodeDetailsPanelController', [\n 'NodeService',\n 'LabelHelper',\n 'Notifications',\n '$state',\n function SwarmNodeDetailsPanelController(NodeService, LabelHelper, Notifications, $state) {\n var ctrl = this;\n ctrl.state = {\n managerAddress: '',\n hasChanges: false,\n };\n ctrl.$onChanges = $onChanges;\n ctrl.addLabel = addLabel;\n ctrl.updateNodeLabels = updateNodeLabels;\n ctrl.updateNodeAvailability = updateNodeAvailability;\n ctrl.saveChanges = saveChanges;\n ctrl.cancelChanges = cancelChanges;\n\n var managerRole = 'manager';\n\n function $onChanges() {\n if (!ctrl.details) {\n return;\n }\n if (ctrl.details.role === managerRole) {\n ctrl.state.managerAddress = '(' + ctrl.details.managerAddress + ')';\n }\n }\n\n function addLabel() {\n ctrl.details.nodeLabels.push({\n key: '',\n value: '',\n originalValue: '',\n originalKey: '',\n });\n }\n\n function updateNodeLabels(labels) {\n ctrl.details.nodeLabels = labels;\n ctrl.state.hasChanges = true;\n }\n\n function updateNodeAvailability(availability) {\n ctrl.details.availability = availability;\n ctrl.state.hasChanges = true;\n }\n\n function saveChanges() {\n var originalNode = ctrl.originalNode;\n var config = {\n Name: originalNode.Name,\n Availability: ctrl.details.availability,\n Role: originalNode.Role,\n Labels: LabelHelper.fromKeyValueToLabelHash(ctrl.details.nodeLabels),\n Id: originalNode.Id,\n Version: originalNode.Version,\n };\n\n NodeService.updateNode(config).then(onUpdateSuccess).catch(notifyOnError);\n\n function onUpdateSuccess() {\n Notifications.success('Node successfully updated', 'Node updated');\n $state.go('docker.nodes.node', { id: originalNode.Id }, { reload: true });\n }\n\n function notifyOnError(error) {\n Notifications.error('Failure', error, 'Failed to update node');\n }\n }\n\n function cancelChanges() {\n cancelLabelChanges();\n ctrl.details.availability = ctrl.originalNode.Availability;\n ctrl.state.hasChanges = false;\n }\n\n function cancelLabelChanges() {\n ctrl.details.nodeLabels = ctrl.details.nodeLabels\n .filter(function (label) {\n return label.originalValue || label.originalKey;\n })\n .map(function (label) {\n return Object.assign(label, {\n value: label.originalValue,\n key: label.originalKey,\n });\n });\n }\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./swarm-node-details-panel.html');\n\nangular.module('portainer.docker').component('swarmNodeDetailsPanel', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'SwarmNodeDetailsPanelController',\n bindings: {\n details: '<',\n originalNode: '<',\n },\n});\n","var path = 'app/docker/components/host-view-panels/swarm-node-details-panel/swarm-node-details-panel.html';\nvar html = \"<div class=\\\"row\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-sm-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-code\\\" title-text=\\\"Node Details\\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr ng-if=\\\"$ctrl.details.name\\\">\\n <td>Node name</td>\\n <td>{{ $ctrl.details.name }}</td>\\n </tr>\\n <tr>\\n <td>Role</td>\\n <td>{{ $ctrl.details.role }} {{ $ctrl.state.managerAddress }}</td>\\n </tr>\\n <tr>\\n <td>Availability</td>\\n <td>\\n <node-availability-select\\n on-save=\\\"$ctrl.updateNodeAvailability(availability)\\\"\\n availability=\\\"$ctrl.details.availability\\\"\\n original-value=\\\"$ctrl.details.availability\\\"\\n >\\n </node-availability-select>\\n </td>\\n </tr>\\n <tr>\\n <td>Status</td>\\n <td\\n ><span class=\\\"label label-{{ $ctrl.details.status | nodestatusbadge }}\\\">{{ $ctrl.details.status }}</span></td\\n >\\n </tr>\\n <tr>\\n <td>\\n <div class=\\\"nopadding\\\">\\n <a class=\\\"btn btn-default btn-sm pull-right\\\" ng-click=\\\"$ctrl.addLabel(node)\\\"> <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> label </a>\\n </div>\\n Node Labels\\n </td>\\n <td></td>\\n </tr>\\n <tr>\\n <td colspan=\\\"2\\\">\\n <node-labels-table labels=\\\"$ctrl.details.nodeLabels\\\" on-changed-labels=\\\"$ctrl.updateNodeLabels(labels)\\\"></node-labels-table>\\n </td>\\n </tr>\\n <tr>\\n <td colspan=\\\"2\\\">\\n <div class=\\\"btn-toolbar\\\" role=\\\"toolbar\\\">\\n <div class=\\\"btn-group\\\" role=\\\"group\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-primary btn-sm\\\" ng-disabled=\\\"!$ctrl.state.hasChanges\\\" ng-click=\\\"$ctrl.saveChanges()\\\">\\n Apply changes\\n </button>\\n <button type=\\\"button\\\" class=\\\"btn btn-default btn-sm dropdown-toggle\\\" data-toggle=\\\"dropdown\\\" aria-haspopup=\\\"true\\\" aria-expanded=\\\"false\\\">\\n <span class=\\\"caret\\\"></span>\\n </button>\\n <ul class=\\\"dropdown-menu\\\">\\n <li><a ng-click=\\\"$ctrl.cancelChanges()\\\">Reset changes</a></li>\\n </ul>\\n </div>\\n </div>\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./por-image-registry-rate-limits.html');\n\nimport angular from 'angular';\n\nimport controller from './por-image-registry-rate-limits.controller';\n\nangular.module('portainer.docker').component('porImageRegistryRateLimits', {\n bindings: {\n endpoint: '<',\n registry: '<',\n setValidity: '<',\n isAdmin: '<',\n isDockerHubRegistry: '<',\n isAuthenticated: '<',\n registryId: '<',\n },\n controller,\n transclude: {\n rateLimitExceeded: '?porImageRegistryRateLimitExceeded',\n },\n templateUrl: autoNgTemplateLoaderTemplate1,\n});\n","var path = 'app/docker/components/imageRegistry/por-image-registry-rate-limits.html';\nvar html = \"<div class=\\\"form-group\\\" ng-if=\\\"$ctrl.pullRateLimits\\\">\\n <div class=\\\"col-sm-12 small\\\">\\n <div ng-if=\\\"$ctrl.pullRateLimits.remaining > 0\\\" class=\\\"text-muted\\\">\\n <i class=\\\"fa fa-exclamation-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n <span ng-if=\\\"$ctrl.isAuthenticated\\\">\\n You are currently using a free account to pull images from DockerHub and will be limited to 200 pulls every 6 hours. Remaining pulls:\\n <span style=\\\"font-weight: bold;\\\">{{ $ctrl.pullRateLimits.remaining }}/{{ $ctrl.pullRateLimits.limit }}</span>\\n </span>\\n <span ng-if=\\\"!$ctrl.isAuthenticated\\\">\\n <span ng-if=\\\"$ctrl.isAdmin\\\">\\n You are currently using an anonymous account to pull images from DockerHub and will be limited to 100 pulls every 6 hours. You can configure DockerHub authentication in\\n the\\n <a ui-sref=\\\"portainer.registries\\\">Registries View</a>. Remaining pulls:\\n <span style=\\\"font-weight: bold;\\\">{{ $ctrl.pullRateLimits.remaining }}/{{ $ctrl.pullRateLimits.limit }}</span>\\n </span>\\n <span ng-if=\\\"!$ctrl.isAdmin\\\">\\n You are currently using an anonymous account to pull images from DockerHub and will be limited to 100 pulls every 6 hours. Contact your administrator to configure\\n DockerHub authentication. Remaining pulls: <span style=\\\"font-weight: bold;\\\">{{ $ctrl.pullRateLimits.remaining }}/{{ $ctrl.pullRateLimits.limit }}</span>\\n </span>\\n </span>\\n </div>\\n <div ng-if=\\\"$ctrl.pullRateLimits.remaining <= 0\\\" class=\\\"text-warning\\\">\\n <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i>\\n <span ng-if=\\\"$ctrl.isAuthenticated\\\">\\n Your authorized pull count quota as a free user is now exceeded.\\n <span ng-transclude=\\\"rateLimitExceeded\\\">You will not be able to pull any image from the DockerHub registry.</span>\\n </span>\\n <span ng-if=\\\"!$ctrl.isAuthenticated\\\">\\n Your authorized pull count quota as an anonymous user is now exceeded.\\n <span ng-transclude=\\\"rateLimitExceeded\\\">You will not be able to pull any image from the DockerHub registry.</span>\\n </span>\\n </div>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import angular from 'angular';\nimport _ from 'lodash-es';\nimport { DockerHubViewModel } from 'Portainer/models/dockerhub';\nimport { RegistryTypes } from '@/portainer/models/registryTypes';\n\nclass porImageRegistryController {\n /* @ngInject */\n constructor($async, $scope, ImageHelper, RegistryService, EndpointService, ImageService, Notifications) {\n this.$async = $async;\n this.$scope = $scope;\n this.ImageHelper = ImageHelper;\n this.RegistryService = RegistryService;\n this.EndpointService = EndpointService;\n this.ImageService = ImageService;\n this.Notifications = Notifications;\n\n this.onRegistryChange = this.onRegistryChange.bind(this);\n this.onImageChange = this.onImageChange.bind(this);\n\n this.registries = [];\n this.images = [];\n this.defaultRegistry = new DockerHubViewModel();\n\n this.$scope.$watch(() => this.model.Registry, this.onRegistryChange);\n this.$scope.$watch(() => this.model.Image, this.onImageChange);\n }\n\n isKnownRegistry(registry) {\n return !(registry instanceof DockerHubViewModel) && registry.URL;\n }\n\n getRegistryURL(registry) {\n let url = registry.URL;\n if (registry.Type === RegistryTypes.GITLAB) {\n url = registry.URL + '/' + registry.Gitlab.ProjectPath;\n }\n return url;\n }\n\n prepareAutocomplete() {\n let images = [];\n const registry = this.model.Registry;\n if (this.isKnownRegistry(registry)) {\n const url = this.getRegistryURL(registry);\n const registryImages = _.filter(this.images, (image) => _.includes(image, url));\n images = _.map(registryImages, (image) => _.replace(image, new RegExp(url + '/?'), ''));\n } else {\n const registries = _.filter(this.registries, (reg) => this.isKnownRegistry(reg));\n const registryImages = _.flatMap(registries, (registry) => _.filter(this.images, (image) => _.includes(image, registry.URL)));\n const imagesWithoutKnown = _.difference(this.images, registryImages);\n images = _.filter(imagesWithoutKnown, (image) => !this.ImageHelper.imageContainsURL(image));\n }\n this.availableImages = images;\n }\n\n isDockerHubRegistry() {\n return this.model.UseRegistry && (this.model.Registry.Type === RegistryTypes.DOCKERHUB || this.model.Registry.Type === RegistryTypes.ANONYMOUS);\n }\n\n async onRegistryChange() {\n this.prepareAutocomplete();\n if (this.model.Registry.Type === RegistryTypes.GITLAB && this.model.Image) {\n this.model.Image = _.replace(this.model.Image, this.model.Registry.Gitlab.ProjectPath, '');\n }\n }\n\n async onImageChange() {\n if (!this.isDockerHubRegistry()) {\n this.setValidity(true);\n }\n }\n\n displayedRegistryURL() {\n return this.getRegistryURL(this.model.Registry) || 'docker.io';\n }\n\n async reloadRegistries() {\n return this.$async(async () => {\n try {\n let showDefaultRegistry = false;\n this.registries = await this.EndpointService.registries(this.endpoint.Id, this.namespace);\n\n // Sort the registries by Name\n this.registries.sort((a, b) => a.Name.localeCompare(b.Name));\n\n // hide default(anonymous) dockerhub registry if user has an authenticated one\n if (!this.registries.some((registry) => registry.Type === RegistryTypes.DOCKERHUB)) {\n showDefaultRegistry = true;\n // Add dockerhub on top\n this.registries.splice(0, 0, this.defaultRegistry);\n }\n\n const id = this.model.Registry.Id;\n const registry = _.find(this.registries, { Id: id });\n if (!registry) {\n this.model.Registry = showDefaultRegistry ? this.defaultRegistry : this.registries[0];\n }\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve registries');\n }\n });\n }\n\n async loadImages() {\n return this.$async(async () => {\n try {\n if (!this.autoComplete) {\n this.images = [];\n return;\n }\n\n const images = await this.ImageService.images();\n this.images = this.ImageService.getUniqueTagListFromImages(images);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve images');\n }\n });\n }\n\n $onChanges({ namespace, endpoint }) {\n if ((namespace || endpoint) && this.endpoint.Id) {\n this.reloadRegistries();\n }\n }\n\n $onInit() {\n return this.$async(async () => {\n await this.loadImages();\n });\n }\n}\n\nexport default porImageRegistryController;\nangular.module('portainer.docker').controller('porImageRegistryController', porImageRegistryController);\n","const autoNgTemplateLoaderTemplate1 = require('./por-image-registry.html');\n\nangular.module('portainer.docker').component('porImageRegistry', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'porImageRegistryController',\n bindings: {\n model: '=', // must be of type PorImageRegistryModel\n autoComplete: '<',\n labelClass: '@',\n inputClass: '@',\n endpoint: '<',\n isAdmin: '<',\n checkRateLimits: '<',\n onImageChange: '&',\n setValidity: '<',\n namespace: '<',\n },\n require: {\n form: '^form',\n },\n transclude: true,\n});\n","var path = 'app/docker/components/imageRegistry/por-image-registry.html';\nvar html = \"<!-- use registry -->\\n<div>\\n <div class=\\\"form-group\\\" ng-if=\\\"$ctrl.model.UseRegistry\\\">\\n <label for=\\\"image_registry\\\" class=\\\"control-label text-left\\\" ng-class=\\\"$ctrl.labelClass\\\">\\n Registry\\n </label>\\n <div ng-class=\\\"$ctrl.inputClass\\\">\\n <select\\n ng-options=\\\"registry as registry.Name for registry in $ctrl.registries track by registry.Id\\\"\\n ng-model=\\\"$ctrl.model.Registry\\\"\\n id=\\\"image_registry\\\"\\n class=\\\"form-control\\\"\\n data-cy=\\\"component-registrySelect\\\"\\n ></select>\\n </div>\\n <label for=\\\"image_name\\\" ng-class=\\\"$ctrl.labelClass\\\" class=\\\"margin-sm-top control-label text-left\\\">Image</label>\\n <div ng-class=\\\"$ctrl.inputClass\\\" class=\\\"margin-sm-top\\\">\\n <div class=\\\"input-group\\\">\\n <span class=\\\"input-group-addon\\\" id=\\\"registry-name\\\">{{ $ctrl.displayedRegistryURL() }}</span>\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n aria-describedby=\\\"registry-name\\\"\\n uib-typeahead=\\\"image for image in $ctrl.availableImages | filter:$viewValue | limitTo:5\\\"\\n ng-model=\\\"$ctrl.model.Image\\\"\\n name=\\\"image_name\\\"\\n placeholder=\\\"e.g. my-image:my-tag\\\"\\n ng-change=\\\"$ctrl.onImageChange()\\\"\\n required\\n data-cy=\\\"component-imageInput\\\"\\n />\\n <span ng-if=\\\"$ctrl.isDockerHubRegistry()\\\" class=\\\"input-group-btn\\\">\\n <a\\n href=\\\"https://hub.docker.com/search?type=image&q={{ $ctrl.model.Image | trimshasum | trimversiontag }}\\\"\\n class=\\\"btn btn-default\\\"\\n title=\\\"Search image on Docker Hub\\\"\\n target=\\\"_blank\\\"\\n >\\n <i class=\\\"fab fa-docker\\\"></i> Search\\n </a>\\n </span>\\n </div>\\n </div>\\n </div>\\n <!-- ! use registry -->\\n <!-- don't use registry -->\\n <div ng-if=\\\"!$ctrl.model.UseRegistry\\\">\\n <div class=\\\"form-group\\\">\\n <span class=\\\"small\\\">\\n <p class=\\\"text-muted\\\" style=\\\"margin-left: 15px;\\\">\\n <i class=\\\"fa fa-exclamation-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n When using advanced mode, image and repository <b>must be</b> publicly available.\\n </p>\\n </span>\\n <label for=\\\"image_name\\\" ng-class=\\\"$ctrl.labelClass\\\" class=\\\"control-label text-left\\\">Image </label>\\n <div ng-class=\\\"$ctrl.inputClass\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"$ctrl.model.Image\\\" name=\\\"image_name\\\" placeholder=\\\"e.g. registry:port/my-image:my-tag\\\" required />\\n </div>\\n </div>\\n </div>\\n <!-- ! don't use registry -->\\n <!-- info message -->\\n <div class=\\\"form-group\\\" ng-show=\\\"$ctrl.form.image_name.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"$ctrl.form.image_name.$error\\\">\\n <p ng-message=\\\"required\\\">\\n <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Image name is required.\\n <span ng-if=\\\"$ctrl.canPull\\\">Tag must be specified otherwise Portainer will pull all tags associated to the image.</span>\\n </p>\\n </div>\\n </div>\\n </div>\\n <!-- ! info message -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <p>\\n <a class=\\\"small interactive\\\" ng-if=\\\"!$ctrl.model.UseRegistry\\\" ng-click=\\\"$ctrl.model.UseRegistry = true;\\\">\\n <i class=\\\"fa fa-database space-right\\\" aria-hidden=\\\"true\\\"></i> Simple mode\\n </a>\\n <a class=\\\"small interactive\\\" ng-if=\\\"$ctrl.model.UseRegistry\\\" ng-click=\\\"$ctrl.model.UseRegistry = false;\\\">\\n <i class=\\\"fa fa-globe space-right\\\" aria-hidden=\\\"true\\\"></i> Advanced mode\\n </a>\\n </p>\\n </div>\\n </div>\\n\\n <div ng-transclude></div>\\n\\n <por-image-registry-rate-limits\\n ng-if=\\\"$ctrl.checkRateLimits && $ctrl.isDockerHubRegistry()\\\"\\n endpoint=\\\"$ctrl.endpoint\\\"\\n registry=\\\"$ctrl.model.Registry\\\"\\n set-validity=\\\"$ctrl.setValidity\\\"\\n is-authenticated=\\\"$ctrl.model.Registry.Authentication\\\"\\n is-admin=\\\"$ctrl.isAdmin\\\"\\n registry-id=\\\"$ctrl.model.Registry.Id\\\"\\n >\\n </por-image-registry-rate-limits>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./logViewer.html');\n\nangular.module('portainer.docker').component('logViewer', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'LogViewerController',\n bindings: {\n data: '=',\n displayTimestamps: '=',\n logCollectionChange: '<',\n sinceTimestamp: '=',\n lineCount: '=',\n resourceName: '<',\n },\n});\n","var path = 'app/docker/components/log-viewer/logViewer.html';\nvar html = \"<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-file-alt\\\" title-text=\\\"Log viewer settings\\\"></rd-widget-header>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\">\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label for=\\\"tls\\\" class=\\\"control-label text-left\\\">\\n Auto-refresh logs\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"Disabling this option allows you to pause the log collection process and the auto-scrolling.\\\"></portainer-tooltip>\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\">\\n <input\\n type=\\\"checkbox\\\"\\n ng-model=\\\"$ctrl.state.logCollection\\\"\\n ng-change=\\\"$ctrl.state.autoScroll = $ctrl.state.logCollection; $ctrl.logCollectionChange($ctrl.state.logCollection)\\\"\\n /><i></i>\\n </label>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label for=\\\"tls\\\" class=\\\"control-label text-left\\\">\\n Wrap lines\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\"> <input type=\\\"checkbox\\\" ng-model=\\\"$ctrl.state.wrapLines\\\" /><i></i> </label>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label for=\\\"tls\\\" class=\\\"control-label text-left\\\">\\n Display timestamps\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\"> <input type=\\\"checkbox\\\" ng-model=\\\"$ctrl.displayTimestamps\\\" /><i></i> </label>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\">\\n <label for=\\\"logs_since\\\" class=\\\"col-sm-1 control-label text-left\\\">\\n Fetch\\n </label>\\n <div class=\\\"col-sm-2\\\">\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.sinceTimestamp\\\" id=\\\"logs_since\\\">\\n <option selected value=\\\"\\\">All logs</option>\\n <option ng-repeat=\\\"dt in $ctrl.state.availableSinceDatetime\\\" ng-value=\\\"dt.value\\\" title=\\\"{{ dt.value }}\\\">{{ dt.desc }}</option>\\n </select>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\">\\n <label for=\\\"logs_search\\\" class=\\\"col-sm-1 control-label text-left\\\">\\n Search\\n </label>\\n <div class=\\\"col-sm-11\\\">\\n <input class=\\\"form-control\\\" type=\\\"text\\\" name=\\\"logs_search\\\" ng-model=\\\"$ctrl.state.search\\\" ng-change=\\\"$ctrl.state.selectedLines.length = 0;\\\" placeholder=\\\"Filter...\\\" />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\">\\n <label for=\\\"lines_count\\\" class=\\\"col-sm-1 control-label text-left\\\">\\n Lines\\n </label>\\n <div class=\\\"col-sm-11\\\">\\n <input class=\\\"form-control\\\" type=\\\"number\\\" name=\\\"lines_count\\\" ng-model=\\\"$ctrl.lineCount\\\" placeholder=\\\"Enter no of lines...\\\" />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-if=\\\"$ctrl.state.copySupported\\\">\\n <label class=\\\"col-sm-1 control-label text-left\\\">\\n Actions\\n </label>\\n <div class=\\\"col-sm-11\\\">\\n <button class=\\\"btn btn-primary btn-sm\\\" type=\\\"button\\\" ng-click=\\\"$ctrl.downloadLogs()\\\" style=\\\"margin-left: 0;\\\"><i class=\\\"fa fa-download\\\"></i> Download logs</button>\\n <button\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-click=\\\"$ctrl.copy()\\\"\\n ng-disabled=\\\"($ctrl.state.filteredLogs.length === 1 && !$ctrl.state.filteredLogs[0].line) || !$ctrl.state.filteredLogs.length\\\"\\n ><i class=\\\"fa fa-copy space-right\\\" aria-hidden=\\\"true\\\"></i>Copy</button\\n >\\n <button\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-click=\\\"$ctrl.copySelection()\\\"\\n ng-disabled=\\\"($ctrl.state.filteredLogs.length === 1 && !$ctrl.state.filteredLogs[0].line) || !$ctrl.state.filteredLogs.length || !$ctrl.state.selectedLines.length\\\"\\n ><i class=\\\"fa fa-copy space-right\\\" aria-hidden=\\\"true\\\"></i>Copy selected lines</button\\n >\\n <button class=\\\"btn btn-primary btn-sm\\\" ng-click=\\\"$ctrl.clearSelection()\\\" ng-disabled=\\\"$ctrl.state.selectedLines.length === 0\\\"\\n ><i class=\\\"fa fa-times space-right\\\" aria-hidden=\\\"true\\\"></i>Unselect</button\\n >\\n <span>\\n <i id=\\\"refreshRateChange\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-left: 7px; display: none;\\\"></i>\\n </span>\\n </div>\\n </div>\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\\n<div class=\\\"row\\\" style=\\\"height: 54%;\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"height: 100%;\\\">\\n <pre ng-class=\\\"{ wrap_lines: $ctrl.state.wrapLines }\\\" class=\\\"log_viewer\\\" scroll-glue=\\\"$ctrl.state.autoScroll\\\" force-glue>\\n <div ng-repeat=\\\"log in $ctrl.state.filteredLogs = ($ctrl.data | filter:{ 'line': $ctrl.state.search }) track by $index\\\" class=\\\"line\\\" ng-if=\\\"log.line\\\"><p class=\\\"inner_line\\\" ng-click=\\\"$ctrl.selectLine(log.line)\\\" ng-class=\\\"{ 'line_selected': $ctrl.state.selectedLines.indexOf(log.line) > -1 }\\\"><span ng-repeat=\\\"span in log.spans\\\" ng-style=\\\"{ 'color': span.foregroundColor, 'background-color': span.backgroundColor }\\\">{{ span.text }}</span></p></div>\\n <div ng-if=\\\"!$ctrl.state.filteredLogs.length\\\" class=\\\"line\\\"><p class=\\\"inner_line\\\">No log line matching the '{{ $ctrl.state.search }}' filter</p></div>\\n <div ng-if=\\\"$ctrl.state.filteredLogs.length === 1 && !$ctrl.state.filteredLogs[0].line\\\" class=\\\"line\\\"><p class=\\\"inner_line\\\">No logs available</p></div>\\n </pre>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import moment from 'moment';\nimport _ from 'lodash-es';\nimport { NEW_LINE_BREAKER } from '@/constants';\n\nangular.module('portainer.docker').controller('LogViewerController', [\n 'clipboard',\n 'Blob',\n 'FileSaver',\n function (clipboard, Blob, FileSaver) {\n this.state = {\n availableSinceDatetime: [\n { desc: 'Last day', value: moment().subtract(1, 'days').format() },\n { desc: 'Last 4 hours', value: moment().subtract(4, 'hours').format() },\n { desc: 'Last hour', value: moment().subtract(1, 'hours').format() },\n { desc: 'Last 10 minutes', value: moment().subtract(10, 'minutes').format() },\n ],\n copySupported: clipboard.supported,\n logCollection: true,\n autoScroll: true,\n wrapLines: true,\n search: '',\n filteredLogs: [],\n selectedLines: [],\n };\n\n this.copy = function () {\n clipboard.copyText(this.state.filteredLogs.map((log) => log.line).join(NEW_LINE_BREAKER));\n $('#refreshRateChange').show();\n $('#refreshRateChange').fadeOut(2000);\n };\n\n this.copySelection = function () {\n clipboard.copyText(this.state.selectedLines.join(NEW_LINE_BREAKER));\n $('#refreshRateChange').show();\n $('#refreshRateChange').fadeOut(2000);\n };\n\n this.clearSelection = function () {\n this.state.selectedLines = [];\n };\n\n this.selectLine = function (line) {\n var idx = this.state.selectedLines.indexOf(line);\n if (idx === -1) {\n this.state.selectedLines.push(line);\n } else {\n this.state.selectedLines.splice(idx, 1);\n }\n };\n\n this.downloadLogs = function () {\n // To make the feature of downloading container logs working both on Windows and Linux,\n // we need to use correct new line breakers on corresponding OS.\n const data = new Blob([_.reduce(this.state.filteredLogs, (acc, log) => acc + log.line + NEW_LINE_BREAKER, '')]);\n FileSaver.saveAs(data, this.resourceName + '_logs.txt');\n };\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./networkMacvlanForm.html');\n\nangular.module('portainer.docker').component('networkMacvlanForm', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'NetworkMacvlanFormController',\n bindings: {\n data: '=',\n applicationState: '<',\n },\n});\n","var path = 'app/docker/components/network-macvlan-form/networkMacvlanForm.html';\nvar html = \"<div>\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Macvlan configuration\\n </div>\\n <!-- selector -->\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n To create a MACVLAN network you need to create a configuration, then create the network from this configuration.\\n </span>\\n </div>\\n <div class=\\\"col-sm-12\\\">\\n <div class=\\\"form-group\\\" style=\\\"margin-bottom: 0;\\\">\\n <div class=\\\"boxselector_wrapper\\\">\\n <div>\\n <input type=\\\"radio\\\" id=\\\"network_config\\\" ng-model=\\\"$ctrl.data.Scope\\\" value=\\\"local\\\" />\\n <label for=\\\"network_config\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-cog\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Configuration\\n </div>\\n <p>I want to configure a network before deploying it</p>\\n </label>\\n </div>\\n <div>\\n <input type=\\\"radio\\\" id=\\\"network_deploy\\\" ng-model=\\\"$ctrl.data.Scope\\\" value=\\\"swarm\\\" ng-disabled=\\\"$ctrl.availableNetworks.length === 0\\\" />\\n <label for=\\\"network_deploy\\\" ng-class=\\\"$ctrl.availableNetworks.length === 0 ? 'boxselector_disabled' : ''\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-sitemap\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Creation\\n </div>\\n <p>I want to create a network from a configuration</p>\\n </label>\\n </div>\\n </div>\\n </div>\\n </div>\\n <!-- !selector -->\\n\\n <ng-form name=\\\"macvlanConfigurationForm\\\">\\n <!-- configuration-inputs -->\\n <div ng-show=\\\"$ctrl.data.Scope === 'local'\\\">\\n <!-- network-card-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"network_card\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Parent network card</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n name=\\\"network_card\\\"\\n ng-model=\\\"$ctrl.data.ParentNetworkCard\\\"\\n placeholder=\\\"e.g. eth0 or ens160 ...\\\"\\n ng-required=\\\"$ctrl.data.Scope === 'local' && !$ctrl.data.ParentNetworkCard\\\"\\n />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"macvlanConfigurationForm.network_card.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"macvlanConfigurationForm.network_card.$error\\\">\\n <p ng-message=\\\"required\\\"> <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Parent network card must be specified.</p>\\n </div>\\n </div>\\n </div>\\n <!-- network-card-input -->\\n <!-- nodes-selector -->\\n <div ng-if=\\\"$ctrl.applicationState.endpoint.mode.agentProxy && $ctrl.applicationState.endpoint.mode.provider === 'DOCKER_SWARM_MODE'\\\">\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <macvlan-nodes-datatable\\n title-text=\\\"Select the nodes where you want to deploy the local configuration\\\"\\n title-icon=\\\"fa-hdd\\\"\\n dataset=\\\"$ctrl.nodes\\\"\\n table-key=\\\"nodes\\\"\\n state=\\\"$ctrl.data.DatatableState\\\"\\n order-by=\\\"Hostname\\\"\\n show-ip-address-column=\\\"$ctrl.applicationState.endpoint.apiVersion >= 1.25\\\"\\n access-to-node-details=\\\"$ctrl.isAdmin\\\"\\n name=\\\"node_selector\\\"\\n ng-model=\\\"tmp\\\"\\n ng-required=\\\"$ctrl.requiredNodeSelection()\\\"\\n ></macvlan-nodes-datatable>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"macvlanConfigurationForm.node_selector.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"macvlanConfigurationForm.node_selector.$error\\\">\\n <p ng-message=\\\"required\\\"> <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> At least one node must be selected.</p>\\n </div>\\n </div>\\n </div>\\n </div>\\n <!-- !nodes-selector -->\\n </div>\\n <!-- configuration-inputs -->\\n <!-- deploy-inputs -->\\n <div ng-show=\\\"$ctrl.data.Scope === 'swarm'\\\">\\n <!-- configuration-selector -->\\n <!-- network-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"config_network\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Configuration</label>\\n <div class=\\\"col-sm-9\\\">\\n <select\\n class=\\\"form-control\\\"\\n ng-options=\\\"net.Name for net in $ctrl.availableNetworks\\\"\\n ng-model=\\\"$ctrl.data.SelectedNetworkConfig\\\"\\n name=\\\"config_network\\\"\\n ng-required=\\\"$ctrl.requiredConfigSelection()\\\"\\n >\\n <option selected disabled hidden value=\\\"\\\">Select a network</option>\\n </select>\\n </div>\\n </div>\\n <!-- !network-input -->\\n <div class=\\\"form-group\\\" ng-show=\\\"macvlanConfigurationForm.config_network.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"macvlanConfigurationForm.config_network.$error\\\">\\n <p ng-message=\\\"required\\\"> <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Select a configuration network.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !configuration-selector -->\\n </div>\\n <!-- deploy-inputs -->\\n </ng-form>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","angular.module('portainer.docker').controller('NetworkMacvlanFormController', [\n '$q',\n 'NodeService',\n 'NetworkService',\n 'Notifications',\n 'StateManager',\n 'Authentication',\n function ($q, NodeService, NetworkService, Notifications, StateManager, Authentication) {\n var ctrl = this;\n\n ctrl.requiredNodeSelection = function () {\n if (ctrl.data.Scope !== 'local' || ctrl.data.DatatableState === undefined) {\n return false;\n }\n return ctrl.data.DatatableState.selectedItemCount === 0;\n };\n\n ctrl.requiredConfigSelection = function () {\n if (ctrl.data.Scope !== 'swarm') {\n return false;\n }\n return !ctrl.data.SelectedNetworkConfig;\n };\n\n this.$onInit = $onInit;\n function $onInit() {\n var isAdmin = Authentication.isAdmin();\n ctrl.isAdmin = isAdmin;\n\n var provider = ctrl.applicationState.endpoint.mode.provider;\n var apiVersion = ctrl.applicationState.endpoint.apiVersion;\n $q.all({\n nodes: provider !== 'DOCKER_SWARM_MODE' || NodeService.nodes(),\n networks: NetworkService.networks(provider === 'DOCKER_STANDALONE' || provider === 'DOCKER_SWARM_MODE', false, provider === 'DOCKER_SWARM_MODE' && apiVersion >= 1.25),\n })\n .then(function success(data) {\n if (data.nodes !== true) {\n ctrl.nodes = data.nodes;\n }\n ctrl.availableNetworks = data.networks.filter(function (item) {\n return item.ConfigOnly === true;\n });\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve informations for macvlan');\n });\n }\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./volumesCifsForm.html');\n\nangular.module('portainer.docker').component('volumesCifsForm', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n data: '=',\n },\n});\n","var path = 'app/docker/components/volumesCIFSForm/volumesCifsForm.html';\nvar html = \"<!-- CIFS-settings -->\\n<div ng-show=\\\"$ctrl.data.useCIFS\\\">\\n <ng-form class=\\\"form-horizontal\\\" name=\\\"cifsInformationForm\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n CIFS Settings\\n </div>\\n <!-- address-input -->\\n <div class=\\\"form-group col-md-12\\\">\\n <label for=\\\"cifs_address\\\" class=\\\"col-sm-2 col-md-1 control-label text-left\\\">Address</label>\\n <div class=\\\"col-sm-10 col-md-11\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"$ctrl.data.serverAddress\\\" name=\\\"cifs_address\\\" placeholder=\\\"e.g. my.cifs-server.com OR xxx.xxx.xxx.xxx\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group col-md-12\\\" ng-show=\\\"cifsInformationForm.cifs_address.$invalid\\\">\\n <div class=\\\"small text-warning\\\">\\n <div ng-messages=\\\"cifsInformationForm.cifs_address.$error\\\">\\n <p ng-message=\\\"required\\\"> <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !address-input -->\\n <!-- mount-point-input -->\\n <div class=\\\"form-group col-md-12\\\">\\n <label for=\\\"cifs_share\\\" class=\\\"col-sm-2 col-md-1 control-label text-left\\\">Share</label>\\n <div class=\\\"col-sm-10 col-md-11\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"$ctrl.data.share\\\" name=\\\"cifs_share\\\" placeholder=\\\"e.g. /myshare\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group col-md-12\\\" ng-show=\\\"cifsInformationForm.cifs_share.$invalid\\\">\\n <div class=\\\"small text-warning\\\">\\n <div ng-messages=\\\"cifsInformationForm.cifs_share.$error\\\">\\n <p ng-message=\\\"required\\\"> <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !mount-point-input -->\\n <!-- version-input -->\\n <div class=\\\"form-group col-md-12\\\">\\n <label for=\\\"cifs_version\\\" class=\\\"col-sm-2 col-md-1 control-label text-left\\\">CIFS Version</label>\\n <div class=\\\"col-sm-10 col-md-11\\\">\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.data.version\\\" name=\\\"cifs_version\\\" ng-options=\\\"version for version in $ctrl.data.versions\\\" required></select>\\n </div>\\n </div>\\n <div class=\\\"form-group col-md-12\\\" ng-show=\\\"cifsInformationForm.cifs_version.$invalid\\\">\\n <div class=\\\"small text-warning\\\">\\n <div ng-messages=\\\"cifsInformationForm.cifs_version.$error\\\">\\n <p ng-message=\\\"required\\\"> <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !version-input -->\\n <!-- username -->\\n <div class=\\\"form-group col-md-12\\\">\\n <label for=\\\"cifs_username\\\" class=\\\"col-sm-2 col-md-1 control-label text-left\\\">Username</label>\\n <div class=\\\"col-sm-10 col-md-11\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"$ctrl.data.username\\\" name=\\\"cifs_username\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group col-md-12\\\" ng-show=\\\"cifsInformationForm.cifs_username.$invalid\\\">\\n <div class=\\\"small text-warning\\\">\\n <div ng-messages=\\\"cifsInformationForm.cifs_username.$error\\\">\\n <p ng-message=\\\"required\\\"> <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !username -->\\n <!-- password -->\\n <div class=\\\"form-group col-md-12\\\">\\n <label for=\\\"cifs_password\\\" class=\\\"col-sm-2 col-md-1 control-label text-left\\\">Password</label>\\n <div class=\\\"col-sm-10 col-md-11\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"$ctrl.data.password\\\" name=\\\"cifs_password\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group col-md-12\\\" ng-show=\\\"cifsInformationForm.password.$invalid\\\">\\n <div class=\\\"small text-warning\\\">\\n <div ng-messages=\\\"cifsInformationForm.cifs_password.$error\\\">\\n <p ng-message=\\\"required\\\"> <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !password -->\\n </ng-form>\\n</div>\\n<!-- !CIFS-settings -->\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./volumesnfsForm.html');\n\nangular.module('portainer.docker').component('volumesNfsForm', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n data: '=',\n },\n});\n","var path = 'app/docker/components/volumesNFSForm/volumesnfsForm.html';\nvar html = \"<!-- NFS-settings -->\\n<div ng-show=\\\"$ctrl.data.useNFS\\\">\\n <ng-form class=\\\"form-horizontal\\\" name=\\\"nfsInformationForm\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n NFS Settings\\n </div>\\n <!-- address-input -->\\n <div class=\\\"form-group col-md-12\\\">\\n <label for=\\\"nfs_address\\\" class=\\\"col-sm-2 col-md-1 control-label text-left\\\">Address</label>\\n <div class=\\\"col-sm-10 col-md-11\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"$ctrl.data.serverAddress\\\" name=\\\"nfs_address\\\" placeholder=\\\"e.g. my.nfs-server.com OR xxx.xxx.xxx.xxx\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group col-md-12\\\" ng-show=\\\"nfsInformationForm.nfs_address.$invalid\\\">\\n <div class=\\\"small text-warning\\\">\\n <div ng-messages=\\\"nfsInformationForm.nfs_address.$error\\\">\\n <p ng-message=\\\"required\\\"> <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !address-input -->\\n <!-- version-input -->\\n <div class=\\\"form-group col-md-12\\\">\\n <label for=\\\"nfs_version\\\" class=\\\"col-sm-2 col-md-1 control-label text-left\\\">NFS Version</label>\\n <div class=\\\"col-sm-10 col-md-11\\\">\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.data.version\\\" name=\\\"nfs_version\\\" ng-options=\\\"version for version in $ctrl.data.versions\\\" required></select>\\n </div>\\n </div>\\n <div class=\\\"form-group col-md-12\\\" ng-show=\\\"nfsInformationForm.nfs_version.$invalid\\\">\\n <div class=\\\"small text-warning\\\">\\n <div ng-messages=\\\"nfsInformationForm.nfs_version.$error\\\">\\n <p ng-message=\\\"required\\\"> <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !version-input -->\\n <!-- mount-point-input -->\\n <div class=\\\"form-group col-md-12\\\">\\n <label for=\\\"nfs_mountpoint\\\" class=\\\"col-sm-2 col-md-1 control-label text-left\\\">Mount point</label>\\n <div class=\\\"col-sm-10 col-md-11\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"$ctrl.data.mountPoint\\\"\\n name=\\\"nfs_mountpoint\\\"\\n placeholder=\\\"e.g. /export/share, :/export/share, /share or :/share\\\"\\n required\\n />\\n </div>\\n </div>\\n <div class=\\\"form-group col-md-12\\\" ng-show=\\\"nfsInformationForm.nfs_mountpoint.$invalid\\\">\\n <div class=\\\"small text-warning\\\">\\n <div ng-messages=\\\"nfsInformationForm.nfs_mountpoint.$error\\\">\\n <p ng-message=\\\"required\\\"> <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !mount-point-input -->\\n <!-- options-input -->\\n <div class=\\\"form-group col-md-12\\\">\\n <label for=\\\"nfs_options\\\" class=\\\"col-sm-2 col-md-1 control-label text-left\\\"\\n >Options\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"Comma separated list of options\\\"></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-10 col-md-11\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"$ctrl.data.options\\\" name=\\\"nfs_options\\\" placeholder=\\\"e.g. rw,noatime,tcp ...\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group col-md-12\\\" ng-show=\\\"nfsInformationForm.nfs_options.$invalid\\\">\\n <div class=\\\"small text-warning\\\">\\n <div ng-messages=\\\"nfsInformationForm.nfs_options.$error\\\">\\n <p ng-message=\\\"required\\\"> <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !options-input -->\\n </ng-form>\\n</div>\\n<!-- !NFS-settings -->\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import _ from 'lodash-es';\n\nfunction includeString(text, values) {\n return values.some(function (val) {\n return text.indexOf(val) !== -1;\n });\n}\n\nfunction strToHash(str) {\n var hash = 0;\n for (var i = 0; i < str.length; i++) {\n hash = str.charCodeAt(i) + ((hash << 5) - hash);\n }\n return hash;\n}\n\nfunction hashToHexColor(hash) {\n var color = '#';\n for (var i = 0; i < 3; ) {\n color += ('00' + ((hash >> (i++ * 8)) & 0xff).toString(16)).slice(-2);\n }\n return color;\n}\n\nangular\n .module('portainer.docker')\n .filter('visualizerTask', function () {\n 'use strict';\n return function (text) {\n var status = _.toLower(text);\n if (includeString(status, ['new', 'allocated', 'assigned', 'accepted', 'complete', 'preparing'])) {\n return 'info';\n } else if (includeString(status, ['pending'])) {\n return 'warning';\n } else if (includeString(status, ['shutdown', 'failed', 'rejected'])) {\n return 'stopped';\n }\n return 'running';\n };\n })\n .filter('visualizerTaskBorderColor', function () {\n 'use strict';\n return function (str) {\n var hash = strToHash(str);\n var color = hashToHexColor(hash);\n return color;\n };\n })\n .filter('taskstatusbadge', function () {\n 'use strict';\n return function (text) {\n var status = _.toLower(text);\n var labelStyle = 'default';\n if (includeString(status, ['new', 'allocated', 'assigned', 'accepted', 'preparing', 'ready', 'starting', 'remove'])) {\n labelStyle = 'info';\n } else if (includeString(status, ['pending'])) {\n labelStyle = 'warning';\n } else if (includeString(status, ['shutdown', 'failed', 'rejected', 'orphaned'])) {\n labelStyle = 'danger';\n } else if (includeString(status, ['complete'])) {\n labelStyle = 'primary';\n } else if (includeString(status, ['running'])) {\n labelStyle = 'success';\n }\n return labelStyle;\n };\n })\n .filter('taskhaslogs', function () {\n 'use strict';\n return function (state) {\n var validState = ['running', 'complete', 'failed', 'shutdown'];\n if (validState.indexOf(state) > -1) {\n return true;\n }\n return false;\n };\n })\n .filter('containerstatusbadge', function () {\n 'use strict';\n return function (text) {\n var status = _.toLower(text);\n if (includeString(status, ['paused', 'starting', 'unhealthy'])) {\n return 'warning';\n } else if (includeString(status, ['created'])) {\n return 'info';\n } else if (includeString(status, ['stopped', 'dead', 'exited'])) {\n return 'danger';\n }\n return 'success';\n };\n })\n .filter('nodestatusbadge', function () {\n 'use strict';\n return function (text) {\n if (text === 'down' || text === 'Unhealthy') {\n return 'danger';\n }\n return 'success';\n };\n })\n .filter('dockerNodeAvailabilityBadge', function () {\n 'use strict';\n return function (text) {\n if (text === 'pause') {\n return 'warning';\n } else if (text === 'drain') {\n return 'danger';\n }\n return 'success';\n };\n })\n .filter('trimcontainername', function () {\n 'use strict';\n return function (name) {\n if (name) {\n return name.indexOf('/') === 0 ? name.replace('/', '') : name;\n }\n return '';\n };\n })\n .filter('getstatetext', function () {\n 'use strict';\n return function (state) {\n if (state === undefined) {\n return '';\n }\n if (state.Dead) {\n return 'Dead';\n }\n if (state.Ghost && state.Running) {\n return 'Ghost';\n }\n if (state.Running && state.Paused) {\n return 'Running (Paused)';\n }\n if (state.Running) {\n return 'Running';\n }\n if (state.Status === 'created') {\n return 'Created';\n }\n return 'Stopped';\n };\n })\n .filter('getstatelabel', function () {\n 'use strict';\n return function (state) {\n if (state === undefined) {\n return 'label-default';\n }\n if (state.Ghost && state.Running) {\n return 'label-important';\n }\n if (state.Running) {\n return 'label-success';\n }\n return 'label-default';\n };\n })\n .filter('containername', function () {\n 'use strict';\n return function (container) {\n var name = container.Names[0];\n return name.substring(1, name.length);\n };\n })\n .filter('swarmversion', function () {\n 'use strict';\n return function (text) {\n return _.split(text, '/')[1];\n };\n })\n .filter('swarmhostname', function () {\n 'use strict';\n return function (container) {\n return _.split(container.Names[0], '/')[1];\n };\n })\n .filter('repotags', function () {\n 'use strict';\n return function (image) {\n if (image.RepoTags && image.RepoTags.length > 0) {\n var tag = image.RepoTags[0];\n if (tag === '<none>:<none>') {\n return [];\n }\n return image.RepoTags;\n }\n return [];\n };\n })\n .filter('command', function () {\n 'use strict';\n return function (command) {\n if (command) {\n return command.join(' ');\n }\n };\n })\n .filter('hideshasum', function () {\n 'use strict';\n return function (imageName) {\n if (imageName) {\n return imageName.split('@sha')[0];\n }\n return '';\n };\n })\n .filter('availablenodecount', [\n 'ConstraintsHelper',\n function (ConstraintsHelper) {\n 'use strict';\n return function (nodes, service) {\n var availableNodes = 0;\n for (var i = 0; i < nodes.length; i++) {\n var node = nodes[i];\n if (node.Availability === 'active' && node.Status === 'ready' && ConstraintsHelper.matchesServiceConstraints(service, node)) {\n availableNodes++;\n }\n }\n return availableNodes;\n };\n },\n ])\n .filter('runningtaskscount', function () {\n 'use strict';\n return function (tasks) {\n var runningTasks = 0;\n for (var i = 0; i < tasks.length; i++) {\n var task = tasks[i];\n if (task.Status.State === 'running' && task.DesiredState === 'running') {\n runningTasks++;\n }\n }\n return runningTasks;\n };\n })\n .filter('runningcontainers', function () {\n 'use strict';\n return function runningContainersFilter(containers) {\n return containers.filter(function (container) {\n return container.State === 'running';\n }).length;\n };\n })\n .filter('stoppedcontainers', function () {\n 'use strict';\n return function stoppedContainersFilter(containers) {\n return containers.filter(function (container) {\n return container.State === 'exited';\n }).length;\n };\n })\n .filter('healthycontainers', function () {\n 'use strict';\n return function healthyContainersFilter(containers) {\n return containers.filter(function (container) {\n return container.Status === 'healthy';\n }).length;\n };\n })\n .filter('unhealthycontainers', function () {\n 'use strict';\n return function unhealthyContainersFilter(containers) {\n return containers.filter(function (container) {\n return container.Status === 'unhealthy';\n }).length;\n };\n })\n .filter('imagestotalsize', function () {\n 'use strict';\n return function (images) {\n var totalImageSize = 0;\n for (var i = 0; i < images.length; i++) {\n var item = images[i];\n totalImageSize += item.VirtualSize;\n }\n return totalImageSize;\n };\n })\n .filter('tasknodename', function () {\n 'use strict';\n return function (nodeId, nodes) {\n var node = _.find(nodes, { Id: nodeId });\n if (node) {\n return node.Hostname;\n }\n return '';\n };\n })\n .filter('imagelayercommand', function () {\n 'use strict';\n return function (createdBy) {\n return createdBy.replace('/bin/sh -c #(nop) ', '').replace('/bin/sh -c ', 'RUN ');\n };\n })\n .filter('trimshasum', function () {\n 'use strict';\n return function (imageName) {\n if (!imageName) {\n return;\n }\n if (imageName.indexOf('sha256:') === 0) {\n return imageName.substring(7, 19);\n }\n return _.split(imageName, '@sha256')[0];\n };\n })\n .filter('trimversiontag', function () {\n 'use strict';\n return function trimversiontag(fullName) {\n if (!fullName) {\n return fullName;\n }\n var versionIdx = fullName.lastIndexOf(':');\n if (versionIdx < 0) {\n return fullName;\n }\n var hostIdx = fullName.indexOf('/');\n if (hostIdx > versionIdx) {\n return fullName;\n }\n return fullName.substring(0, versionIdx);\n };\n })\n .filter('unique', function () {\n return _.uniqBy;\n });\n","angular.module('portainer.docker').factory('ConfigHelper', [\n function ConfigHelperFactory() {\n 'use strict';\n return {\n flattenConfig: function (config) {\n if (config) {\n return {\n Id: config.ConfigID,\n Name: config.ConfigName,\n FileName: config.File.Name,\n Uid: config.File.UID,\n Gid: config.File.GID,\n Mode: config.File.Mode,\n };\n }\n return {};\n },\n configConfig: function (config) {\n if (config) {\n return {\n ConfigID: config.Id,\n ConfigName: config.Name,\n File: {\n Name: config.FileName || config.Name,\n UID: config.Uid || '0',\n GID: config.Gid || '0',\n Mode: config.Mode || 292,\n },\n };\n }\n return {};\n },\n };\n },\n]);\n","import _ from 'lodash-es';\n\nfunction ConstraintModel(op, key, value) {\n this.op = op;\n this.value = value;\n this.key = key;\n}\n\nvar patterns = {\n id: {\n nodeId: 'node.id',\n nodeHostname: 'node.hostname',\n nodeRole: 'node.role',\n nodeLabels: 'node.labels.',\n engineLabels: 'engine.labels.',\n },\n op: {\n eq: '==',\n neq: '!=',\n },\n};\n\nfunction matchesConstraint(value, constraint) {\n if (!constraint || (constraint.op === patterns.op.eq && value === constraint.value) || (constraint.op === patterns.op.neq && value !== constraint.value)) {\n return true;\n }\n return false;\n}\n\nfunction matchesLabel(labels, constraint) {\n if (!constraint) {\n return true;\n }\n var found = _.find(labels, function (label) {\n return label.key === constraint.key && label.value === constraint.value;\n });\n return found !== undefined;\n}\n\nfunction extractValue(constraint, op) {\n return constraint.split(op).pop().trim();\n}\n\nfunction extractCustomLabelKey(constraint, op, baseLabelKey) {\n return constraint.split(op).shift().trim().replace(baseLabelKey, '');\n}\n\nangular.module('portainer.docker').factory('ConstraintsHelper', [\n function ConstraintsHelperFactory() {\n 'use strict';\n return {\n transformConstraints: function (constraints) {\n var transform = {};\n for (var i = 0; i < constraints.length; i++) {\n var constraint = constraints[i];\n\n var op;\n if (constraint.includes(patterns.op.eq)) {\n op = patterns.op.eq;\n } else if (constraint.includes(patterns.op.neq)) {\n op = patterns.op.neq;\n }\n\n var value = extractValue(constraint, op);\n var key = '';\n switch (true) {\n case constraint.includes(patterns.id.nodeId):\n transform.nodeId = new ConstraintModel(op, key, value);\n break;\n case constraint.includes(patterns.id.nodeHostname):\n transform.nodeHostname = new ConstraintModel(op, key, value);\n break;\n case constraint.includes(patterns.id.nodeRole):\n transform.nodeRole = new ConstraintModel(op, key, value);\n break;\n case constraint.includes(patterns.id.nodeLabels):\n key = extractCustomLabelKey(constraint, op, patterns.id.nodeLabels);\n transform.nodeLabels = new ConstraintModel(op, key, value);\n break;\n case constraint.includes(patterns.id.engineLabels):\n key = extractCustomLabelKey(constraint, op, patterns.id.engineLabels);\n transform.engineLabels = new ConstraintModel(op, key, value);\n break;\n default:\n break;\n }\n }\n return transform;\n },\n matchesServiceConstraints: function (service, node) {\n if (service.Constraints === undefined || service.Constraints.length === 0) {\n return true;\n }\n var constraints = this.transformConstraints(angular.copy(service.Constraints));\n if (\n matchesConstraint(node.Id, constraints.nodeId) &&\n matchesConstraint(node.Hostname, constraints.nodeHostname) &&\n matchesConstraint(node.Role, constraints.nodeRole) &&\n matchesLabel(node.Labels, constraints.nodeLabels) &&\n matchesLabel(node.EngineLabels, constraints.engineLabels)\n ) {\n return true;\n }\n return false;\n },\n };\n },\n]);\n","import _ from 'lodash-es';\nimport splitargs from 'splitargs/src/splitargs';\n\nconst portPattern = /^([1-9]|[1-5]?[0-9]{2,4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$/m;\n\nfunction parsePort(port) {\n if (portPattern.test(port)) {\n return parseInt(port, 10);\n } else {\n return 0;\n }\n}\n\nfunction parsePortRange(portRange) {\n if (typeof portRange !== 'string') {\n portRange = portRange.toString();\n }\n\n // Split the range and convert to integers\n const stringPorts = _.split(portRange, '-', 2);\n const intPorts = _.map(stringPorts, parsePort);\n\n // If it's not a range, we still make sure that we return two ports (start & end)\n if (intPorts.length == 1) {\n intPorts.push(intPorts[0]);\n }\n\n return intPorts;\n}\n\nfunction isValidPortRange(portRange) {\n if (typeof portRange === 'string') {\n portRange = parsePortRange();\n }\n\n return Array.isArray(portRange) && portRange.length === 2 && portRange[0] > 0 && portRange[1] >= portRange[0];\n}\n\nfunction createPortRange(portRangeText, port) {\n if (typeof portRangeText !== 'string') {\n portRangeText = portRangeText.toString();\n }\n\n let hostIp = null;\n const colonIndex = portRangeText.indexOf(':');\n if (colonIndex >= 0) {\n hostIp = portRangeText.substr(0, colonIndex);\n portRangeText = portRangeText.substr(colonIndex + 1);\n }\n\n port = typeof port === 'number' ? port : parsePort(port);\n const portRange = parsePortRange(portRangeText);\n const startPort = Math.min(portRange[0], port);\n const endPort = Math.max(portRange[1], port);\n\n if (hostIp) {\n return hostIp + ':' + startPort + '-' + endPort;\n } else {\n return startPort + '-' + endPort;\n }\n}\n\nangular.module('portainer.docker').factory('ContainerHelper', [\n function ContainerHelperFactory() {\n 'use strict';\n var helper = {};\n\n helper.commandStringToArray = function (command) {\n return splitargs(command);\n };\n\n helper.commandArrayToString = function (array) {\n return array\n .map(function (elem) {\n return \"'\" + elem + \"'\";\n })\n .join(' ');\n };\n\n helper.configFromContainer = function (container) {\n var config = container.Config;\n // HostConfig\n config.HostConfig = container.HostConfig;\n // Name\n config.name = container.Name.replace(/^\\//g, '');\n // Network\n var mode = config.HostConfig.NetworkMode;\n config.NetworkingConfig = {\n EndpointsConfig: {},\n };\n config.NetworkingConfig.EndpointsConfig = container.NetworkSettings.Networks;\n\n if (config.ExposedPorts === undefined) {\n config.ExposedPorts = {};\n }\n\n if (mode.indexOf('container:') !== -1) {\n delete config.Hostname;\n delete config.ExposedPorts;\n }\n // Set volumes\n var binds = [];\n var volumes = {};\n for (var v in container.Mounts) {\n if ({}.hasOwnProperty.call(container.Mounts, v)) {\n var mount = container.Mounts[v];\n var name = mount.Name || mount.Source;\n var containerPath = mount.Destination;\n if (name && containerPath) {\n var bind = name + ':' + containerPath;\n volumes[containerPath] = {};\n if (mount.RW === false) {\n bind += ':ro';\n }\n binds.push(bind);\n }\n }\n }\n config.HostConfig.Binds = binds;\n config.Volumes = volumes;\n return config;\n };\n\n helper.preparePortBindings = function (portBindings) {\n const bindings = {};\n _.forEach(portBindings, (portBinding) => {\n if (!portBinding.containerPort) {\n return;\n }\n\n let hostPort = portBinding.hostPort;\n const containerPortRange = parsePortRange(portBinding.containerPort);\n if (!isValidPortRange(containerPortRange)) {\n throw new Error('Invalid port specification: ' + portBinding.containerPort);\n }\n\n const startPort = containerPortRange[0];\n const endPort = containerPortRange[1];\n let hostIp = undefined;\n let startHostPort = 0;\n let endHostPort = 0;\n if (hostPort) {\n if (hostPort.indexOf('[') > -1) {\n const hostAndPort = _.split(hostPort, ']:');\n\n if (hostAndPort.length < 2) {\n throw new Error('Invalid port specification: ' + portBinding.containerPort);\n }\n\n hostIp = hostAndPort[0].replace('[', '');\n hostPort = hostAndPort[1];\n } else {\n if (hostPort.indexOf(':') > -1) {\n const hostAndPort = _.split(hostPort, ':');\n hostIp = hostAndPort[0];\n hostPort = hostAndPort[1];\n }\n }\n\n const hostPortRange = parsePortRange(hostPort);\n if (!isValidPortRange(hostPortRange)) {\n throw new Error('Invalid port specification: ' + hostPort);\n }\n\n startHostPort = hostPortRange[0];\n endHostPort = hostPortRange[1];\n if (endPort !== startPort && endPort - startPort !== endHostPort - startHostPort) {\n throw new Error('Invalid port specification: ' + hostPort);\n }\n }\n\n for (let i = 0; i <= endPort - startPort; i++) {\n const containerPort = (startPort + i).toString();\n if (startHostPort > 0) {\n hostPort = (startHostPort + i).toString();\n }\n if (startPort === endPort && startHostPort !== endHostPort) {\n hostPort += '-' + endHostPort.toString();\n }\n\n const bindKey = containerPort + '/' + portBinding.protocol;\n if (bindings[bindKey]) {\n bindings[bindKey].push({ HostIp: hostIp, HostPort: hostPort });\n } else {\n bindings[bindKey] = [{ HostIp: hostIp, HostPort: hostPort }];\n }\n }\n });\n return bindings;\n };\n\n helper.sortAndCombinePorts = function (portBindings) {\n const bindings = [];\n const portBindingKeys = _.keys(portBindings);\n\n // Group the port bindings by protocol\n const portBindingKeysByProtocol = _.groupBy(portBindingKeys, (portKey) => {\n return _.split(portKey, '/')[1];\n });\n\n _.forEach(portBindingKeysByProtocol, (portBindingKeys, protocol) => {\n // Group the port bindings by host IP\n const portBindingKeysByHostIp = {};\n for (const portKey of portBindingKeys) {\n for (const portBinding of portBindings[portKey]) {\n portBindingKeysByHostIp[portBinding.HostIp] = portBindingKeysByHostIp[portBinding.HostIp] || [];\n portBindingKeysByHostIp[portBinding.HostIp].push(portKey);\n }\n }\n\n _.forEach(portBindingKeysByHostIp, (portBindingKeys, ip) => {\n // Sort by host port\n const sortedPortBindingKeys = _.orderBy(portBindingKeys, (portKey) => {\n return parseInt(_.split(portKey, '/')[0], 10);\n });\n\n let previousHostPort = -1;\n let previousContainerPort = -1;\n _.forEach(sortedPortBindingKeys, (portKey) => {\n const portKeySplit = _.split(portKey, '/');\n const containerPort = parseInt(portKeySplit[0], 10);\n const portBinding = portBindings[portKey][0];\n portBindings[portKey].shift();\n const hostPort = parsePort(portBinding.HostPort);\n\n // We only combine single ports, and skip the host port ranges on one container port\n if (hostPort > 0) {\n // If we detect consecutive ports, we create a range of them\n if (bindings.length > 0 && previousHostPort === hostPort - 1 && previousContainerPort === containerPort - 1) {\n bindings[bindings.length - 1].hostPort = createPortRange(bindings[bindings.length - 1].hostPort, hostPort);\n bindings[bindings.length - 1].containerPort = createPortRange(bindings[bindings.length - 1].containerPort, containerPort);\n previousHostPort = hostPort;\n previousContainerPort = containerPort;\n return;\n }\n\n previousHostPort = hostPort;\n previousContainerPort = containerPort;\n } else {\n previousHostPort = -1;\n previousContainerPort = -1;\n }\n\n let bindingHostPort = portBinding.HostPort.toString();\n if (ip) {\n bindingHostPort = `${ip}:${bindingHostPort}`;\n }\n\n const binding = {\n hostPort: bindingHostPort,\n containerPort: containerPort,\n protocol: protocol,\n };\n bindings.push(binding);\n });\n });\n });\n\n return bindings;\n };\n\n helper.getContainerNames = function (containers) {\n return _.map(_.flatten(_.map(containers, 'Names')), (name) => _.trimStart(name, '/'));\n };\n\n return helper;\n },\n]);\n","import _ from 'lodash-es';\n\nangular.module('portainer.docker').factory('InfoHelper', [\n function InfoHelperFactory() {\n 'use strict';\n\n var helper = {};\n\n helper.determineEndpointMode = function (info, type) {\n var mode = {\n provider: '',\n role: '',\n agentProxy: false,\n };\n\n if (type === 2 || type === 4) {\n mode.agentProxy = true;\n }\n\n if (!info.Swarm || _.isEmpty(info.Swarm.NodeID)) {\n mode.provider = 'DOCKER_STANDALONE';\n } else {\n mode.provider = 'DOCKER_SWARM_MODE';\n if (info.Swarm.ControlAvailable) {\n mode.role = 'MANAGER';\n } else {\n mode.role = 'WORKER';\n }\n }\n return mode;\n };\n\n return helper;\n },\n]);\n","angular.module('portainer.docker').factory('LabelHelper', [\n function LabelHelperFactory() {\n 'use strict';\n return {\n fromLabelHashToKeyValue: function (labels) {\n if (labels) {\n return Object.keys(labels).map(function (key) {\n return { key: key, value: labels[key], originalKey: key, originalValue: labels[key], added: true };\n });\n }\n return [];\n },\n fromKeyValueToLabelHash: function (labelKV) {\n var labels = {};\n if (labelKV) {\n labelKV.forEach(function (label) {\n if (label.key) {\n labels[label.key] = label.value;\n }\n });\n }\n return labels;\n },\n };\n },\n]);\n","import tokenize from '@nxmix/tokenize-ansi';\nimport x256 from 'x256';\n\nconst FOREGROUND_COLORS_BY_ANSI = {\n black: x256.colors[0],\n red: x256.colors[1],\n green: x256.colors[2],\n yellow: x256.colors[3],\n blue: x256.colors[4],\n magenta: x256.colors[5],\n cyan: x256.colors[6],\n white: x256.colors[7],\n brightBlack: x256.colors[8],\n brightRed: x256.colors[9],\n brightGreen: x256.colors[10],\n brightYellow: x256.colors[11],\n brightBlue: x256.colors[12],\n brightMagenta: x256.colors[13],\n brightCyan: x256.colors[14],\n brightWhite: x256.colors[15],\n};\n\nconst BACKGROUND_COLORS_BY_ANSI = {\n bgBlack: x256.colors[0],\n bgRed: x256.colors[1],\n bgGreen: x256.colors[2],\n bgYellow: x256.colors[3],\n bgBlue: x256.colors[4],\n bgMagenta: x256.colors[5],\n bgCyan: x256.colors[6],\n bgWhite: x256.colors[7],\n bgBrightBlack: x256.colors[8],\n bgBrightRed: x256.colors[9],\n bgBrightGreen: x256.colors[10],\n bgBrightYellow: x256.colors[11],\n bgBrightBlue: x256.colors[12],\n bgBrightMagenta: x256.colors[13],\n bgBrightCyan: x256.colors[14],\n bgBrightWhite: x256.colors[15],\n};\n\nangular.module('portainer.docker').factory('LogHelper', [\n function LogHelperFactory() {\n 'use strict';\n var helper = {};\n\n function stripHeaders(logs) {\n logs = logs.substring(8);\n logs = logs.replace(/\\r?\\n(.{8})/g, '\\n');\n\n return logs;\n }\n\n function stripEscapeCodes(logs) {\n return logs.replace(/[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, '');\n }\n\n function cssColorFromRgb(rgb) {\n const [r, g, b] = rgb;\n\n return `rgb(${r}, ${g}, ${b})`;\n }\n\n function extendedColorForToken(token) {\n const colorMode = token[1];\n\n if (colorMode === 2) {\n return cssColorFromRgb(token.slice(2));\n }\n\n if (colorMode === 5 && x256.colors[token[2]]) {\n return cssColorFromRgb(x256.colors[token[2]]);\n }\n\n return '';\n }\n\n // Return an array with each log including a line and styled spans for each entry.\n // If the skipHeaders param is specified, it will strip the 8 first characters of each line.\n helper.formatLogs = function (logs, skipHeaders) {\n if (skipHeaders) {\n logs = stripHeaders(logs);\n }\n\n const tokens = tokenize(logs);\n const formattedLogs = [];\n\n let foregroundColor = null;\n let backgroundColor = null;\n let line = '';\n let spans = [];\n\n for (const token of tokens) {\n const type = token[0];\n\n if (FOREGROUND_COLORS_BY_ANSI[type]) {\n foregroundColor = cssColorFromRgb(FOREGROUND_COLORS_BY_ANSI[type]);\n } else if (type === 'moreColor') {\n foregroundColor = extendedColorForToken(token);\n } else if (type === 'fgDefault') {\n foregroundColor = null;\n } else if (BACKGROUND_COLORS_BY_ANSI[type]) {\n backgroundColor = cssColorFromRgb(BACKGROUND_COLORS_BY_ANSI[type]);\n } else if (type === 'bgMoreColor') {\n backgroundColor = extendedColorForToken(token);\n } else if (type === 'bgDefault') {\n backgroundColor = null;\n } else if (type === 'reset') {\n foregroundColor = null;\n backgroundColor = null;\n } else if (type === 'text') {\n const tokenLines = token[1].split('\\n');\n\n for (let i = 0; i < tokenLines.length; i++) {\n if (i !== 0) {\n formattedLogs.push({ line, spans });\n\n line = '';\n spans = [];\n }\n\n const text = stripEscapeCodes(tokenLines[i]);\n\n line += text;\n spans.push({ foregroundColor, backgroundColor, text });\n }\n }\n }\n\n if (line) {\n formattedLogs.push({ line, spans });\n }\n\n return formattedLogs;\n };\n\n return helper;\n },\n]);\n","angular.module('portainer.docker').factory('NodeHelper', [\n function NodeHelperFactory() {\n 'use strict';\n return {\n nodeToConfig: function (node) {\n return {\n Name: node.Spec.Name,\n Role: node.Spec.Role,\n Labels: node.Spec.Labels,\n Availability: node.Spec.Availability,\n };\n },\n };\n },\n]);\n","angular.module('portainer.docker').factory('SecretHelper', [\n function SecretHelperFactory() {\n 'use strict';\n return {\n flattenSecret: function (secret) {\n if (secret) {\n return {\n Id: secret.SecretID,\n Name: secret.SecretName,\n FileName: secret.File.Name,\n Uid: secret.File.UID,\n Gid: secret.File.GID,\n Mode: secret.File.Mode,\n };\n }\n return {};\n },\n secretConfig: function (secret) {\n if (secret) {\n return {\n SecretID: secret.Id,\n SecretName: secret.Name,\n File: {\n Name: secret.FileName,\n UID: secret.Uid || '0',\n GID: secret.Gid || '0',\n Mode: secret.Mode || 444,\n },\n };\n }\n return {};\n },\n };\n },\n]);\n","import moment from 'moment';\n\nangular.module('portainer.docker').factory('ServiceHelper', [\n function ServiceHelperFactory() {\n 'use strict';\n\n var helper = {};\n\n helper.associateTasksToService = function (service, tasks) {\n service.Tasks = [];\n var otherServicesTasks = [];\n for (var i = 0; i < tasks.length; i++) {\n var task = tasks[i];\n if (task.ServiceId === service.Id) {\n service.Tasks.push(task);\n task.ServiceName = service.Name;\n } else {\n otherServicesTasks.push(task);\n }\n }\n tasks = otherServicesTasks;\n };\n\n helper.serviceToConfig = function (service) {\n return {\n Name: service.Spec.Name,\n Labels: service.Spec.Labels,\n TaskTemplate: service.Spec.TaskTemplate,\n Mode: service.Spec.Mode,\n UpdateConfig: service.Spec.UpdateConfig,\n Networks: service.Spec.Networks,\n EndpointSpec: service.Spec.EndpointSpec,\n };\n };\n\n helper.translateKeyValueToPlacementPreferences = function (keyValuePreferences) {\n if (keyValuePreferences) {\n var preferences = [];\n keyValuePreferences.forEach(function (preference) {\n if (preference.strategy && preference.strategy !== '' && preference.value && preference.value !== '') {\n switch (preference.strategy.toLowerCase()) {\n case 'spread':\n preferences.push({\n Spread: {\n SpreadDescriptor: preference.value,\n },\n });\n break;\n }\n }\n });\n return preferences;\n }\n return [];\n };\n\n helper.translateKeyValueToPlacementConstraints = function (keyValueConstraints) {\n if (keyValueConstraints) {\n var constraints = [];\n keyValueConstraints.forEach(function (constraint) {\n if (constraint.key && constraint.key !== '' && constraint.value && constraint.value !== '') {\n constraints.push(constraint.key + constraint.operator + constraint.value);\n }\n });\n return constraints;\n }\n return [];\n };\n\n helper.translatePreferencesToKeyValue = function (preferences) {\n if (preferences) {\n var keyValuePreferences = [];\n preferences.forEach(function (preference) {\n if (preference.Spread) {\n keyValuePreferences.push({\n strategy: 'Spread',\n value: preference.Spread.SpreadDescriptor,\n });\n }\n });\n return keyValuePreferences;\n }\n return [];\n };\n\n helper.translateConstraintsToKeyValue = function (constraints) {\n function getOperator(constraint) {\n var indexEquals = constraint.indexOf('==');\n if (indexEquals >= 0) {\n return [indexEquals, '=='];\n }\n return [constraint.indexOf('!='), '!='];\n }\n if (constraints) {\n var keyValueConstraints = [];\n constraints.forEach(function (constraint) {\n var operatorIndices = getOperator(constraint);\n\n var key = constraint.slice(0, operatorIndices[0]);\n var operator = operatorIndices[1];\n var value = constraint.slice(operatorIndices[0] + 2);\n\n keyValueConstraints.push({\n key: key,\n value: value,\n operator: operator,\n originalKey: key,\n originalValue: value,\n });\n });\n return keyValueConstraints;\n }\n };\n\n helper.translateHumanDurationToNanos = function (humanDuration) {\n var nanos;\n var regex = /^([0-9]+)(h|m|s|ms|us|ns)$/i;\n var matches = humanDuration.match(regex);\n\n if (matches !== null && matches.length === 3) {\n var duration = parseInt(matches[1], 10);\n var unit = matches[2];\n // Moment.js cannot use micro or nanoseconds\n switch (unit) {\n case 'ns':\n nanos = duration;\n break;\n case 'us':\n nanos = duration * 1000;\n break;\n default:\n nanos = moment.duration(duration, unit).asMilliseconds() * 1000000;\n }\n }\n return nanos;\n };\n\n // Convert nanoseconds to the higher unit possible\n // e.g 1840 nanoseconds = 1804ns\n // e.g 300000000000 nanoseconds = 5m\n // e.g 3510000000000 nanoseconds = 3510s\n // e.g 3540000000000 nanoseconds = 59m\n // e.g 3600000000000 nanoseconds = 1h\n\n helper.translateNanosToHumanDuration = function (nanos) {\n var humanDuration = '0s';\n var conversionFromNano = {};\n conversionFromNano['ns'] = 1;\n conversionFromNano['us'] = conversionFromNano['ns'] * 1000;\n conversionFromNano['ms'] = conversionFromNano['us'] * 1000;\n conversionFromNano['s'] = conversionFromNano['ms'] * 1000;\n conversionFromNano['m'] = conversionFromNano['s'] * 60;\n conversionFromNano['h'] = conversionFromNano['m'] * 60;\n\n Object.keys(conversionFromNano).forEach(function (unit) {\n if (nanos % conversionFromNano[unit] === 0 && nanos / conversionFromNano[unit] > 0) {\n humanDuration = nanos / conversionFromNano[unit] + unit;\n }\n });\n return humanDuration;\n };\n\n helper.translateLogDriverOptsToKeyValue = function (logOptions) {\n var options = [];\n if (logOptions) {\n Object.keys(logOptions).forEach(function (key) {\n options.push({\n key: key,\n value: logOptions[key],\n originalKey: key,\n originalValue: logOptions[key],\n added: true,\n });\n });\n }\n return options;\n };\n\n helper.translateKeyValueToLogDriverOpts = function (keyValueLogDriverOpts) {\n var options = {};\n if (keyValueLogDriverOpts) {\n keyValueLogDriverOpts.forEach(function (option) {\n if (option.key && option.key !== '' && option.value && option.value !== '') {\n options[option.key] = option.value;\n }\n });\n }\n return options;\n };\n\n helper.translateHostsEntriesToHostnameIP = function (entries) {\n var ipHostEntries = [];\n if (entries) {\n entries.forEach(function (entry) {\n if (entry.indexOf(' ') && entry.split(' ').length === 2) {\n var keyValue = entry.split(' ');\n ipHostEntries.push({ hostname: keyValue[1], ip: keyValue[0] });\n }\n });\n }\n return ipHostEntries;\n };\n\n helper.translateHostnameIPToHostsEntries = function (entries) {\n var ipHostEntries = [];\n if (entries) {\n entries.forEach(function (entry) {\n if (entry.ip && entry.hostname) {\n ipHostEntries.push(entry.ip + ' ' + entry.hostname);\n }\n });\n }\n return ipHostEntries;\n };\n\n return helper;\n },\n]);\n","angular.module('portainer.docker').factory('TaskHelper', [\n function TaskHelperFactory() {\n 'use strict';\n\n var helper = {};\n\n helper.associateContainerToTask = function (task, containers) {\n for (var i = 0; i < containers.length; i++) {\n var container = containers[i];\n if (task.ContainerId === container.Id) {\n task.Container = container;\n break;\n }\n }\n };\n\n return helper;\n },\n]);\n","angular.module('portainer.docker').factory('VolumeHelper', [\n function VolumeHelperFactory() {\n 'use strict';\n var helper = {};\n\n helper.createDriverOptions = function (optionArray) {\n var options = {};\n optionArray.forEach(function (option) {\n options[option.name] = option.value;\n });\n return options;\n };\n\n helper.isVolumeUsedByAService = function (volume, services) {\n for (var i = 0; i < services.length; i++) {\n var service = services[i];\n var mounts = service.Mounts;\n for (var j = 0; j < mounts.length; j++) {\n var mount = mounts[j];\n if (mount.Source === volume.Id) {\n return true;\n }\n }\n }\n\n return false;\n };\n\n return helper;\n },\n]);\n","angular.module('portainer.app').factory('ContainersInterceptor', [\n '$q',\n 'EndpointProvider',\n function ($q, EndpointProvider) {\n 'use strict';\n var interceptor = {};\n\n interceptor.responseError = responseErrorInterceptor;\n\n function responseErrorInterceptor(rejection) {\n if (rejection.status === 502 || rejection.status === 503 || rejection.status === -1) {\n var endpoint = EndpointProvider.currentEndpoint();\n if (endpoint !== undefined) {\n var data = endpoint.Snapshots[0].SnapshotRaw.Containers;\n if (data !== undefined) {\n return data;\n }\n }\n }\n return $q.reject(rejection);\n }\n return interceptor;\n },\n]);\n","angular.module('portainer.app').factory('ImagesInterceptor', [\n '$q',\n 'EndpointProvider',\n function ($q, EndpointProvider) {\n 'use strict';\n var interceptor = {};\n\n interceptor.responseError = responseErrorInterceptor;\n\n function responseErrorInterceptor(rejection) {\n if (rejection.status === 502 || rejection.status === 503 || rejection.status === -1) {\n var endpoint = EndpointProvider.currentEndpoint();\n if (endpoint !== undefined) {\n var data = endpoint.Snapshots[0].SnapshotRaw.Images;\n if (data !== undefined) {\n return data;\n }\n }\n }\n return $q.reject(rejection);\n }\n return interceptor;\n },\n]);\n","angular.module('portainer.app').factory('InfoInterceptor', [\n '$q',\n 'EndpointProvider',\n function ($q, EndpointProvider) {\n 'use strict';\n var interceptor = {};\n\n interceptor.responseError = responseErrorInterceptor;\n\n function responseErrorInterceptor(rejection) {\n if (rejection.status === 502 || rejection.status === 503 || rejection.status === -1) {\n var endpoint = EndpointProvider.currentEndpoint();\n if (endpoint !== undefined && endpoint.Snapshots.length && endpoint.Snapshots[0].SnapshotRaw) {\n var data = endpoint.Snapshots[0].SnapshotRaw.Info;\n if (data !== undefined) {\n return data;\n }\n }\n }\n return $q.reject(rejection);\n }\n return interceptor;\n },\n]);\n","angular.module('portainer.app').factory('NetworksInterceptor', [\n '$q',\n 'EndpointProvider',\n function ($q, EndpointProvider) {\n 'use strict';\n var interceptor = {};\n\n interceptor.responseError = responseErrorInterceptor;\n\n function responseErrorInterceptor(rejection) {\n if (rejection.status === 502 || rejection.status === 503 || rejection.status === -1) {\n var endpoint = EndpointProvider.currentEndpoint();\n if (endpoint !== undefined) {\n var data = endpoint.Snapshots[0].SnapshotRaw.Networks;\n if (data !== undefined) {\n return data;\n }\n }\n }\n return $q.reject(rejection);\n }\n return interceptor;\n },\n]);\n","angular.module('portainer.app').factory('VersionInterceptor', [\n '$q',\n 'EndpointProvider',\n function ($q, EndpointProvider) {\n 'use strict';\n var interceptor = {};\n\n interceptor.responseError = responseErrorInterceptor;\n\n function responseErrorInterceptor(rejection) {\n if (rejection.status === 502 || rejection.status === 503 || rejection.status === -1) {\n var endpoint = EndpointProvider.currentEndpoint();\n if (endpoint !== undefined && endpoint.Snapshots.length && endpoint.Snapshots[0].SnapshotRaw) {\n var data = endpoint.Snapshots[0].SnapshotRaw.Version;\n if (data !== undefined) {\n return data;\n }\n }\n }\n return $q.reject(rejection);\n }\n return interceptor;\n },\n]);\n","angular.module('portainer.app').factory('VolumesInterceptor', [\n '$q',\n 'EndpointProvider',\n function ($q, EndpointProvider) {\n 'use strict';\n var interceptor = {};\n\n interceptor.responseError = responseErrorInterceptor;\n\n function responseErrorInterceptor(rejection) {\n if (rejection.status === 502 || rejection.status === 503 || rejection.status === -1) {\n var endpoint = EndpointProvider.currentEndpoint();\n if (endpoint !== undefined) {\n var data = endpoint.Snapshots[0].SnapshotRaw.Volumes;\n if (data !== undefined) {\n return data;\n }\n }\n }\n return $q.reject(rejection);\n }\n return interceptor;\n },\n]);\n","import { jsonObjectsToArrayHandler } from './response/handlers';\n\nangular.module('portainer.docker').factory('Build', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n 'EndpointProvider',\n function BuildFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider) {\n 'use strict';\n return $resource(\n API_ENDPOINT_ENDPOINTS + '/:endpointId/docker/build',\n {\n endpointId: EndpointProvider.endpointID,\n },\n {\n buildImage: {\n method: 'POST',\n ignoreLoadingBar: true,\n transformResponse: jsonObjectsToArrayHandler,\n isArray: true,\n headers: { 'Content-Type': 'application/x-tar' },\n },\n buildImageOverride: {\n method: 'POST',\n ignoreLoadingBar: true,\n transformResponse: jsonObjectsToArrayHandler,\n isArray: true,\n },\n }\n );\n },\n]);\n","angular.module('portainer.docker').factory('Commit', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n 'EndpointProvider',\n function CommitFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider) {\n 'use strict';\n return $resource(\n API_ENDPOINT_ENDPOINTS + '/:endpointId/docker/commit',\n {\n endpointId: EndpointProvider.endpointID,\n },\n {\n commitContainer: { method: 'POST', params: { container: '@id', repo: '@repo' }, ignoreLoadingBar: true },\n }\n );\n },\n]);\n","angular.module('portainer.docker').factory('Config', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n 'EndpointProvider',\n function ConfigFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider) {\n 'use strict';\n return $resource(\n API_ENDPOINT_ENDPOINTS + '/:endpointId/docker/configs/:id/:action',\n {\n endpointId: EndpointProvider.endpointID,\n },\n {\n get: { method: 'GET', params: { id: '@id' } },\n query: { method: 'GET', isArray: true },\n create: { method: 'POST', params: { action: 'create' }, ignoreLoadingBar: true },\n remove: { method: 'DELETE', params: { id: '@id' } },\n }\n );\n },\n]);\n","import { genericHandler, logsHandler } from './response/handlers';\n\nangular.module('portainer.docker').factory('Container', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n 'EndpointProvider',\n 'ContainersInterceptor',\n function ContainerFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider, ContainersInterceptor) {\n 'use strict';\n return $resource(\n API_ENDPOINT_ENDPOINTS + '/:endpointId/docker/containers/:id/:action',\n {\n name: '@name',\n endpointId: EndpointProvider.endpointID,\n },\n {\n query: {\n method: 'GET',\n params: { all: 0, action: 'json', filters: '@filters' },\n isArray: true,\n interceptor: ContainersInterceptor,\n },\n get: {\n method: 'GET',\n params: { action: 'json' },\n },\n stop: {\n method: 'POST',\n params: { id: '@id', action: 'stop' },\n },\n restart: {\n method: 'POST',\n params: { id: '@id', action: 'restart' },\n },\n kill: {\n method: 'POST',\n params: { id: '@id', action: 'kill' },\n },\n pause: {\n method: 'POST',\n params: { id: '@id', action: 'pause' },\n },\n unpause: {\n method: 'POST',\n params: { id: '@id', action: 'unpause' },\n },\n logs: {\n method: 'GET',\n params: { id: '@id', action: 'logs' },\n ignoreLoadingBar: true,\n transformResponse: logsHandler,\n },\n stats: {\n method: 'GET',\n params: { id: '@id', stream: false, action: 'stats' },\n ignoreLoadingBar: true,\n },\n top: {\n method: 'GET',\n params: { id: '@id', action: 'top' },\n ignoreLoadingBar: true,\n },\n start: {\n method: 'POST',\n params: { id: '@id', action: 'start' },\n transformResponse: genericHandler,\n },\n create: {\n method: 'POST',\n params: { action: 'create' },\n transformResponse: genericHandler,\n ignoreLoadingBar: true,\n },\n remove: {\n method: 'DELETE',\n params: { id: '@id', v: '@v', force: '@force' },\n transformResponse: genericHandler,\n },\n rename: {\n method: 'POST',\n params: { id: '@id', action: 'rename', name: '@name' },\n transformResponse: genericHandler,\n },\n exec: {\n method: 'POST',\n params: { id: '@id', action: 'exec' },\n transformResponse: genericHandler,\n ignoreLoadingBar: true,\n },\n inspect: {\n method: 'GET',\n params: { id: '@id', action: 'json' },\n },\n update: {\n method: 'POST',\n params: { id: '@id', action: 'update' },\n },\n prune: {\n method: 'POST',\n params: { action: 'prune', filters: '@filters' },\n },\n resize: {\n method: 'POST',\n params: { id: '@id', action: 'resize', h: '@height', w: '@width' },\n transformResponse: genericHandler,\n ignoreLoadingBar: true,\n },\n }\n );\n },\n]);\n","import { genericHandler } from './response/handlers';\n\nangular.module('portainer.docker').factory('Exec', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n 'EndpointProvider',\n function ExecFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider) {\n 'use strict';\n return $resource(\n API_ENDPOINT_ENDPOINTS + '/:endpointId/docker/exec/:id/:action',\n {\n endpointId: EndpointProvider.endpointID,\n },\n {\n resize: {\n method: 'POST',\n params: { id: '@id', action: 'resize', h: '@height', w: '@width' },\n transformResponse: genericHandler,\n ignoreLoadingBar: true,\n },\n }\n );\n },\n]);\n","import { deleteImageHandler, jsonObjectsToArrayHandler } from './response/handlers';\nimport { imageGetResponse } from './response/image';\n\nangular.module('portainer.docker').factory('Image', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n 'EndpointProvider',\n 'HttpRequestHelper',\n 'ImagesInterceptor',\n function ImageFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider, HttpRequestHelper, ImagesInterceptor) {\n 'use strict';\n\n return $resource(\n API_ENDPOINT_ENDPOINTS + '/:endpointId/docker/images/:id/:action',\n {\n endpointId: EndpointProvider.endpointID,\n },\n {\n query: { method: 'GET', params: { all: 0, action: 'json' }, isArray: true, interceptor: ImagesInterceptor },\n get: { method: 'GET', params: { action: 'json' } },\n search: { method: 'GET', params: { action: 'search' } },\n history: { method: 'GET', params: { action: 'history' }, isArray: true },\n insert: { method: 'POST', params: { id: '@id', action: 'insert' } },\n tag: { method: 'POST', params: { id: '@id', action: 'tag', force: 0, repo: '@repo' }, ignoreLoadingBar: true },\n inspect: { method: 'GET', params: { id: '@id', action: 'json' } },\n push: {\n method: 'POST',\n params: { action: 'push', id: '@imageName' },\n isArray: true,\n transformResponse: jsonObjectsToArrayHandler,\n headers: { 'X-Registry-Auth': HttpRequestHelper.registryAuthenticationHeader },\n ignoreLoadingBar: true,\n },\n create: {\n method: 'POST',\n params: { action: 'create', fromImage: '@fromImage' },\n isArray: true,\n transformResponse: jsonObjectsToArrayHandler,\n headers: { 'X-Registry-Auth': HttpRequestHelper.registryAuthenticationHeader },\n ignoreLoadingBar: true,\n },\n download: {\n method: 'GET',\n params: { action: 'get', names: '@names' },\n transformResponse: imageGetResponse,\n responseType: 'blob',\n ignoreLoadingBar: true,\n },\n remove: {\n method: 'DELETE',\n params: { id: '@id', force: '@force' },\n isArray: true,\n transformResponse: deleteImageHandler,\n },\n }\n );\n },\n]);\n","import { genericHandler } from './response/handlers';\n\nangular.module('portainer.docker').factory('Network', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n 'EndpointProvider',\n 'NetworksInterceptor',\n function NetworkFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider, NetworksInterceptor) {\n 'use strict';\n return $resource(\n API_ENDPOINT_ENDPOINTS + '/:endpointId/docker/networks/:id/:action',\n {\n id: '@id',\n endpointId: EndpointProvider.endpointID,\n },\n {\n query: {\n method: 'GET',\n isArray: true,\n interceptor: NetworksInterceptor,\n },\n get: {\n method: 'GET',\n },\n create: {\n method: 'POST',\n params: { action: 'create' },\n transformResponse: genericHandler,\n ignoreLoadingBar: true,\n },\n remove: {\n method: 'DELETE',\n transformResponse: genericHandler,\n },\n connect: {\n method: 'POST',\n params: { action: 'connect' },\n },\n disconnect: {\n method: 'POST',\n params: { action: 'disconnect' },\n },\n }\n );\n },\n]);\n","angular.module('portainer.docker').factory('Node', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n 'EndpointProvider',\n function NodeFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider) {\n 'use strict';\n return $resource(\n API_ENDPOINT_ENDPOINTS + '/:endpointId/docker/nodes/:id/:action',\n {\n endpointId: EndpointProvider.endpointID,\n },\n {\n query: { method: 'GET', isArray: true },\n get: { method: 'GET', params: { id: '@id' } },\n update: { method: 'POST', params: { id: '@id', action: 'update', version: '@version' } },\n remove: { method: 'DELETE', params: { id: '@id' } },\n }\n );\n },\n]);\n","angular.module('portainer.docker').factory('Plugin', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n 'EndpointProvider',\n function PluginFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider) {\n 'use strict';\n return $resource(\n API_ENDPOINT_ENDPOINTS + '/:endpointId/docker/plugins/:id/:action',\n {\n endpointId: EndpointProvider.endpointID,\n },\n {\n query: { method: 'GET', isArray: true },\n }\n );\n },\n]);\n","angular.module('portainer.docker').factory('Secret', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n 'EndpointProvider',\n function SecretFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider) {\n 'use strict';\n return $resource(\n API_ENDPOINT_ENDPOINTS + '/:endpointId/docker/secrets/:id/:action',\n {\n endpointId: EndpointProvider.endpointID,\n },\n {\n get: { method: 'GET', params: { id: '@id' } },\n query: { method: 'GET', isArray: true },\n create: { method: 'POST', params: { action: 'create' }, ignoreLoadingBar: true },\n remove: { method: 'DELETE', params: { id: '@id' } },\n }\n );\n },\n]);\n","import { logsHandler } from './response/handlers';\n\nangular.module('portainer.docker').factory('Service', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n 'EndpointProvider',\n 'HttpRequestHelper',\n function ServiceFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider, HttpRequestHelper) {\n 'use strict';\n return $resource(\n API_ENDPOINT_ENDPOINTS + '/:endpointId/docker/services/:id/:action',\n {\n endpointId: EndpointProvider.endpointID,\n },\n {\n get: { method: 'GET', params: { id: '@id' } },\n query: { method: 'GET', isArray: true, params: { filters: '@filters' } },\n create: {\n method: 'POST',\n params: { action: 'create' },\n headers: {\n 'X-Registry-Auth': HttpRequestHelper.registryAuthenticationHeader,\n version: '1.29',\n },\n ignoreLoadingBar: true,\n },\n update: {\n method: 'POST',\n params: { id: '@id', action: 'update', version: '@version', rollback: '@rollback' },\n headers: {\n version: '1.29',\n },\n },\n remove: { method: 'DELETE', params: { id: '@id' } },\n logs: {\n method: 'GET',\n params: { id: '@id', action: 'logs' },\n ignoreLoadingBar: true,\n transformResponse: logsHandler,\n },\n }\n );\n },\n]);\n","angular.module('portainer.docker').factory('Swarm', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n 'EndpointProvider',\n function SwarmFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider) {\n 'use strict';\n return $resource(\n API_ENDPOINT_ENDPOINTS + '/:endpointId/docker/swarm',\n {\n endpointId: EndpointProvider.endpointID,\n },\n {\n get: { method: 'GET' },\n }\n );\n },\n]);\n","import { jsonObjectsToArrayHandler } from './response/handlers';\n\nangular.module('portainer.docker').factory('System', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n 'EndpointProvider',\n 'InfoInterceptor',\n 'VersionInterceptor',\n function SystemFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider, InfoInterceptor, VersionInterceptor) {\n 'use strict';\n return $resource(\n API_ENDPOINT_ENDPOINTS + '/:endpointId/docker/:action/:subAction',\n {\n name: '@name',\n endpointId: EndpointProvider.endpointID,\n },\n {\n info: {\n method: 'GET',\n params: { action: 'info' },\n interceptor: InfoInterceptor,\n },\n version: { method: 'GET', params: { action: 'version' }, interceptor: VersionInterceptor },\n events: {\n method: 'GET',\n params: { action: 'events', since: '@since', until: '@until' },\n isArray: true,\n transformResponse: jsonObjectsToArrayHandler,\n },\n auth: { method: 'POST', params: { action: 'auth' } },\n dataUsage: { method: 'GET', params: { action: 'system', subAction: 'df' } },\n }\n );\n },\n]);\n","angular.module('portainer.docker').factory('SystemEndpoint', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n function SystemEndpointFactory($resource, API_ENDPOINT_ENDPOINTS) {\n 'use strict';\n return $resource(\n API_ENDPOINT_ENDPOINTS + '/:endpointId/docker/:action/:subAction',\n {\n name: '@name',\n },\n {\n ping: {\n method: 'GET',\n params: { action: '_ping', endpointId: '@endpointId' },\n },\n }\n );\n },\n]);\n","import { logsHandler } from './response/handlers';\n\nangular.module('portainer.docker').factory('Task', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n 'EndpointProvider',\n function TaskFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider) {\n 'use strict';\n return $resource(\n API_ENDPOINT_ENDPOINTS + '/:endpointId/docker/tasks/:id/:action',\n {\n endpointId: EndpointProvider.endpointID,\n },\n {\n get: { method: 'GET', params: { id: '@id' } },\n query: { method: 'GET', isArray: true, params: { filters: '@filters' } },\n logs: {\n method: 'GET',\n params: { id: '@id', action: 'logs' },\n ignoreLoadingBar: true,\n transformResponse: logsHandler,\n },\n }\n );\n },\n]);\n","import { genericHandler } from './response/handlers';\n\nangular.module('portainer.docker').factory('Volume', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n 'EndpointProvider',\n 'VolumesInterceptor',\n function VolumeFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider, VolumesInterceptor) {\n 'use strict';\n\n function addVolumeNameToHeader(config) {\n return config.data.Name || '';\n }\n\n return $resource(\n API_ENDPOINT_ENDPOINTS + '/:endpointId/docker/volumes/:id/:action',\n {\n endpointId: EndpointProvider.endpointID,\n },\n {\n query: { method: 'GET', interceptor: VolumesInterceptor },\n get: { method: 'GET', params: { id: '@id' } },\n create: {\n method: 'POST',\n params: { action: 'create' },\n transformResponse: genericHandler,\n ignoreLoadingBar: true,\n headers: { 'X-Portainer-VolumeName': addVolumeNameToHeader },\n },\n remove: {\n method: 'DELETE',\n transformResponse: genericHandler,\n params: { id: '@id' },\n },\n }\n );\n },\n]);\n","import { ImageBuildModel } from '../models/image';\n\nangular.module('portainer.docker').factory('BuildService', [\n '$q',\n 'Build',\n 'FileUploadService',\n function BuildServiceFactory($q, Build, FileUploadService) {\n 'use strict';\n var service = {};\n\n service.buildImageFromUpload = function (names, file, path) {\n var deferred = $q.defer();\n\n FileUploadService.buildImage(names, file, path)\n .then(function success(response) {\n var model = new ImageBuildModel(response.data);\n deferred.resolve(model);\n })\n .catch(function error(err) {\n deferred.reject(err);\n });\n\n return deferred.promise;\n };\n\n service.buildImageFromURL = function (names, url, path) {\n var params = {\n t: names,\n remote: url,\n dockerfile: path,\n };\n\n var deferred = $q.defer();\n\n Build.buildImage(params, {})\n .$promise.then(function success(data) {\n var model = new ImageBuildModel(data);\n deferred.resolve(model);\n })\n .catch(function error(err) {\n deferred.reject(err);\n });\n\n return deferred.promise;\n };\n\n service.buildImageFromDockerfileContent = function (names, content) {\n var params = {\n t: names,\n };\n var payload = {\n content: content,\n };\n\n var deferred = $q.defer();\n\n Build.buildImageOverride(params, payload)\n .$promise.then(function success(data) {\n var model = new ImageBuildModel(data);\n deferred.resolve(model);\n })\n .catch(function error(err) {\n deferred.reject(err);\n });\n\n return deferred.promise;\n };\n\n return service;\n },\n]);\n","import { ConfigViewModel } from '../models/config';\n\nangular.module('portainer.docker').factory('ConfigService', [\n '$q',\n 'Config',\n function ConfigServiceFactory($q, Config) {\n 'use strict';\n var service = {};\n\n service.config = function (configId) {\n var deferred = $q.defer();\n\n Config.get({ id: configId })\n .$promise.then(function success(data) {\n var config = new ConfigViewModel(data);\n deferred.resolve(config);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve config details', err: err });\n });\n\n return deferred.promise;\n };\n\n service.configs = function () {\n var deferred = $q.defer();\n\n Config.query({})\n .$promise.then(function success(data) {\n var configs = data.map(function (item) {\n return new ConfigViewModel(item);\n });\n deferred.resolve(configs);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve configs', err: err });\n });\n\n return deferred.promise;\n };\n\n service.remove = function (configId) {\n var deferred = $q.defer();\n\n Config.remove({ id: configId })\n .$promise.then(function success(data) {\n if (data.message) {\n deferred.reject({ msg: data.message });\n } else {\n deferred.resolve();\n }\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to remove config', err: err });\n });\n\n return deferred.promise;\n };\n\n service.create = function (config) {\n return Config.create(config).$promise;\n };\n\n return service;\n },\n]);\n","import { ContainerDetailsViewModel, ContainerStatsViewModel, ContainerViewModel } from '../models/container';\n\nangular.module('portainer.docker').factory('ContainerService', [\n '$q',\n 'Container',\n 'ResourceControlService',\n 'LogHelper',\n '$timeout',\n function ContainerServiceFactory($q, Container, ResourceControlService, LogHelper, $timeout) {\n 'use strict';\n var service = {};\n\n service.container = function (id) {\n var deferred = $q.defer();\n\n Container.get({ id: id })\n .$promise.then(function success(data) {\n var container = new ContainerDetailsViewModel(data);\n deferred.resolve(container);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve container information', err: err });\n });\n\n return deferred.promise;\n };\n\n service.containers = function (all, filters) {\n var deferred = $q.defer();\n Container.query({ all: all, filters: filters })\n .$promise.then(function success(data) {\n var containers = data.map(function (item) {\n return new ContainerViewModel(item);\n });\n deferred.resolve(containers);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve containers', err: err });\n });\n\n return deferred.promise;\n };\n\n service.resizeTTY = function (id, width, height, timeout) {\n var deferred = $q.defer();\n\n $timeout(function () {\n Container.resize({}, { id: id, height: height, width: width })\n .$promise.then(function success(data) {\n if (data.message) {\n deferred.reject({ msg: 'Unable to resize tty of container ' + id, err: data.message });\n } else {\n deferred.resolve(data);\n }\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to resize tty of container ' + id, err: err });\n });\n }, timeout);\n\n return deferred.promise;\n };\n\n service.startContainer = function (id) {\n return Container.start({ id: id }, {}).$promise;\n };\n\n service.stopContainer = function (id) {\n return Container.stop({ id: id }, {}).$promise;\n };\n\n service.restartContainer = function (id) {\n return Container.restart({ id: id }, {}).$promise;\n };\n\n service.killContainer = function (id) {\n return Container.kill({ id: id }, {}).$promise;\n };\n\n service.pauseContainer = function (id) {\n return Container.pause({ id: id }, {}).$promise;\n };\n\n service.resumeContainer = function (id) {\n return Container.unpause({ id: id }, {}).$promise;\n };\n\n service.renameContainer = function (id, newContainerName) {\n return Container.rename({ id: id, name: newContainerName }, {}).$promise;\n };\n\n service.updateRestartPolicy = updateRestartPolicy;\n service.updateLimits = updateLimits;\n\n function updateRestartPolicy(id, restartPolicy, maximumRetryCounts) {\n return Container.update({ id: id }, { RestartPolicy: { Name: restartPolicy, MaximumRetryCount: maximumRetryCounts } }).$promise;\n }\n\n function updateLimits(id, config) {\n return Container.update(\n { id: id },\n {\n // MemorySwap: must be set\n // -1: non limits, 0: treated as unset(cause update error).\n MemoryReservation: config.HostConfig.MemoryReservation,\n Memory: config.HostConfig.Memory,\n MemorySwap: -1,\n NanoCpus: config.HostConfig.NanoCpus,\n }\n ).$promise;\n }\n\n service.createContainer = function (configuration) {\n var deferred = $q.defer();\n Container.create(configuration)\n .$promise.then(function success(data) {\n deferred.resolve(data);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to create container', err: err });\n });\n return deferred.promise;\n };\n\n service.createAndStartContainer = function (configuration) {\n var deferred = $q.defer();\n var container;\n service\n .createContainer(configuration)\n .then(function success(data) {\n container = data;\n return service.startContainer(container.Id);\n })\n .then(function success() {\n deferred.resolve(container);\n })\n .catch(function error(err) {\n deferred.reject(err);\n });\n return deferred.promise;\n };\n\n service.remove = function (container, removeVolumes) {\n var deferred = $q.defer();\n\n Container.remove({ id: container.Id, v: removeVolumes ? 1 : 0, force: true })\n .$promise.then(function success(data) {\n if (data.message) {\n deferred.reject({ msg: data.message, err: data.message });\n } else {\n deferred.resolve();\n }\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to remove container', err: err });\n });\n\n return deferred.promise;\n };\n\n service.createExec = function (execConfig) {\n var deferred = $q.defer();\n\n Container.exec({}, execConfig)\n .$promise.then(function success(data) {\n if (data.message) {\n deferred.reject({ msg: data.message, err: data.message });\n } else {\n deferred.resolve(data);\n }\n })\n .catch(function error(err) {\n deferred.reject(err);\n });\n\n return deferred.promise;\n };\n\n service.logs = function (id, stdout, stderr, timestamps, since, tail, stripHeaders) {\n var deferred = $q.defer();\n\n var parameters = {\n id: id,\n stdout: stdout || 0,\n stderr: stderr || 0,\n timestamps: timestamps || 0,\n since: since || 0,\n tail: tail || 'all',\n };\n\n Container.logs(parameters)\n .$promise.then(function success(data) {\n var logs = LogHelper.formatLogs(data.logs, stripHeaders);\n deferred.resolve(logs);\n })\n .catch(function error(err) {\n deferred.reject(err);\n });\n\n return deferred.promise;\n };\n\n service.containerStats = function (id) {\n var deferred = $q.defer();\n\n Container.stats({ id: id })\n .$promise.then(function success(data) {\n var containerStats = new ContainerStatsViewModel(data);\n deferred.resolve(containerStats);\n })\n .catch(function error(err) {\n deferred.reject(err);\n });\n\n return deferred.promise;\n };\n\n service.containerTop = function (id) {\n return Container.top({ id: id }).$promise;\n };\n\n service.inspect = function (id) {\n return Container.inspect({ id: id }).$promise;\n };\n\n service.prune = function (filters) {\n return Container.prune({ filters: filters }).$promise;\n };\n\n return service;\n },\n]);\n","angular.module('portainer.docker').factory('ExecService', [\n '$q',\n '$timeout',\n 'Exec',\n function ExecServiceFactory($q, $timeout, Exec) {\n 'use strict';\n var service = {};\n\n service.resizeTTY = function (execId, width, height, timeout) {\n var deferred = $q.defer();\n\n $timeout(function () {\n Exec.resize({}, { id: execId, height: height, width: width })\n .$promise.then(function success(data) {\n if (data.message) {\n deferred.reject({ msg: 'Unable to resize tty of exec', err: data.message });\n } else {\n deferred.resolve(data);\n }\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to resize tty of exec', err: err });\n });\n }, timeout);\n\n return deferred.promise;\n };\n\n return service;\n },\n]);\n","import _ from 'lodash-es';\nimport { ImageViewModel } from '../models/image';\nimport { ImageDetailsViewModel } from '../models/imageDetails';\nimport { ImageLayerViewModel } from '../models/imageLayer';\n\nangular.module('portainer.docker').factory('ImageService', [\n '$q',\n 'Image',\n 'ImageHelper',\n 'RegistryService',\n 'HttpRequestHelper',\n 'ContainerService',\n 'FileUploadService',\n function ImageServiceFactory($q, Image, ImageHelper, RegistryService, HttpRequestHelper, ContainerService, FileUploadService) {\n 'use strict';\n var service = {};\n\n service.image = function (imageId) {\n var deferred = $q.defer();\n Image.get({ id: imageId })\n .$promise.then(function success(data) {\n if (data.message) {\n deferred.reject({ msg: data.message });\n } else {\n var image = new ImageDetailsViewModel(data);\n deferred.resolve(image);\n }\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve image details', err: err });\n });\n return deferred.promise;\n };\n\n service.images = function (withUsage) {\n var deferred = $q.defer();\n\n $q.all({\n containers: withUsage ? ContainerService.containers(1) : [],\n images: Image.query({}).$promise,\n })\n .then(function success(data) {\n var containers = data.containers;\n\n var images = data.images.map(function (item) {\n item.ContainerCount = 0;\n for (var i = 0; i < containers.length; i++) {\n var container = containers[i];\n if (container.ImageID === item.Id) {\n item.ContainerCount++;\n }\n }\n return new ImageViewModel(item);\n });\n\n deferred.resolve(images);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve images', err: err });\n });\n return deferred.promise;\n };\n\n service.history = function (imageId) {\n var deferred = $q.defer();\n Image.history({ id: imageId })\n .$promise.then(function success(data) {\n if (data.message) {\n deferred.reject({ msg: data.message });\n } else {\n var layers = [];\n var order = data.length;\n angular.forEach(data, function (imageLayer) {\n layers.push(new ImageLayerViewModel(order, imageLayer));\n order--;\n });\n deferred.resolve(layers);\n }\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve image details', err: err });\n });\n return deferred.promise;\n };\n\n service.pushImage = pushImage;\n /**\n *\n * @param {PorImageRegistryModel} registryModel\n */\n function pushImage(registryModel) {\n var deferred = $q.defer();\n\n var authenticationDetails = registryModel.Registry.Authentication ? RegistryService.encodedCredentials(registryModel.Registry) : '';\n HttpRequestHelper.setRegistryAuthenticationHeader(authenticationDetails);\n\n const imageConfiguration = ImageHelper.createImageConfigForContainer(registryModel);\n\n Image.push({ imageName: imageConfiguration.fromImage })\n .$promise.then(function success(data) {\n if (data[data.length - 1].error) {\n deferred.reject({ msg: data[data.length - 1].error });\n } else {\n deferred.resolve();\n }\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to push image tag', err: err });\n });\n return deferred.promise;\n }\n\n /**\n * PULL IMAGE\n */\n\n function pullImageAndIgnoreErrors(imageConfiguration) {\n var deferred = $q.defer();\n\n Image.create({}, imageConfiguration)\n .$promise.catch(() => {\n // left empty to ignore errors\n })\n .finally(function final() {\n deferred.resolve();\n });\n\n return deferred.promise;\n }\n\n function pullImageAndAcknowledgeErrors(imageConfiguration) {\n var deferred = $q.defer();\n\n Image.create({}, imageConfiguration)\n .$promise.then(function success(data) {\n var err = data.length > 0 && data[data.length - 1].message;\n if (err) {\n var detail = data[data.length - 1];\n deferred.reject({ msg: detail.message });\n } else {\n deferred.resolve(data);\n }\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to pull image', err: err });\n });\n\n return deferred.promise;\n }\n\n service.pullImage = pullImage;\n\n /**\n *\n * @param {PorImageRegistryModel} registry\n * @param {bool} ignoreErrors\n */\n function pullImage(registry, ignoreErrors) {\n var authenticationDetails = registry.Registry.Authentication ? RegistryService.encodedCredentials(registry.Registry) : '';\n HttpRequestHelper.setRegistryAuthenticationHeader(authenticationDetails);\n\n var imageConfiguration = ImageHelper.createImageConfigForContainer(registry);\n\n if (ignoreErrors) {\n return pullImageAndIgnoreErrors(imageConfiguration);\n }\n return pullImageAndAcknowledgeErrors(imageConfiguration);\n }\n\n /**\n * ! PULL IMAGE\n */\n\n service.tagImage = function (id, image) {\n return Image.tag({ id: id, repo: image }).$promise;\n };\n\n service.downloadImages = function (images) {\n var names = ImageHelper.getImagesNamesForDownload(images);\n return Image.download(names).$promise;\n };\n\n service.uploadImage = function (file) {\n return FileUploadService.loadImages(file);\n };\n\n service.deleteImage = function (id, forceRemoval) {\n var deferred = $q.defer();\n Image.remove({ id: id, force: forceRemoval })\n .$promise.then(function success(data) {\n if (data[0].message) {\n deferred.reject({ msg: data[0].message });\n } else {\n deferred.resolve();\n }\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to remove image', err: err });\n });\n return deferred.promise;\n };\n\n service.getUniqueTagListFromImages = function (availableImages) {\n return _.uniq(\n _.flatMap(availableImages, function (image) {\n _.remove(image.RepoTags, function (item) {\n return item.indexOf('<none>') !== -1;\n });\n return image.RepoTags ? _.uniqWith(image.RepoTags, _.isEqual) : [];\n })\n );\n };\n\n return service;\n },\n]);\n","import { NetworkViewModel } from '../models/network';\n\nangular.module('portainer.docker').factory('NetworkService', [\n '$q',\n 'Network',\n function NetworkServiceFactory($q, Network) {\n 'use strict';\n var service = {};\n\n service.create = function (networkConfiguration) {\n var deferred = $q.defer();\n\n Network.create(networkConfiguration)\n .$promise.then(function success(data) {\n deferred.resolve(data);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to create network', err: err });\n });\n return deferred.promise;\n };\n\n service.network = function (id) {\n var deferred = $q.defer();\n\n Network.get({ id: id })\n .$promise.then(function success(data) {\n var network = new NetworkViewModel(data);\n deferred.resolve(network);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve network details', err: err });\n });\n\n return deferred.promise;\n };\n\n service.networks = function (localNetworks, swarmNetworks, swarmAttachableNetworks, filters) {\n var deferred = $q.defer();\n\n Network.query({ filters: filters })\n .$promise.then(function success(data) {\n var networks = data;\n var filteredNetworks = networks\n .filter(function (network) {\n if (localNetworks && network.Scope === 'local') {\n return network;\n }\n if (swarmNetworks && network.Scope === 'swarm') {\n return network;\n }\n if (swarmAttachableNetworks && network.Scope === 'swarm' && network.Attachable === true) {\n return network;\n }\n })\n .map(function (item) {\n return new NetworkViewModel(item);\n });\n\n deferred.resolve(filteredNetworks);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve networks', err: err });\n });\n\n return deferred.promise;\n };\n\n service.remove = function (id) {\n return Network.remove({ id: id }).$promise;\n };\n\n service.disconnectContainer = function (networkId, containerId, force) {\n return Network.disconnect({ id: networkId }, { Container: containerId, Force: force }).$promise;\n };\n\n service.connectContainer = function (networkId, containerId, aliases) {\n var payload = {\n Container: containerId,\n };\n if (aliases) {\n payload.EndpointConfig = {\n Aliases: aliases,\n };\n }\n return Network.connect({ id: networkId }, payload).$promise;\n };\n\n return service;\n },\n]);\n","import { NodeViewModel } from '../models/node';\n\nangular.module('portainer.docker').factory('NodeService', [\n '$q',\n 'Node',\n function NodeServiceFactory($q, Node) {\n 'use strict';\n var service = {};\n\n service.nodes = nodes;\n service.node = node;\n service.updateNode = updateNode;\n service.getActiveManager = getActiveManager;\n\n function node(id) {\n var deferred = $q.defer();\n Node.get({ id: id })\n .$promise.then(function onNodeLoaded(rawNode) {\n var node = new NodeViewModel(rawNode);\n return deferred.resolve(node);\n })\n .catch(function onFailed(err) {\n deferred.reject({ msg: 'Unable to retrieve node', err: err });\n });\n\n return deferred.promise;\n }\n\n function nodes() {\n var deferred = $q.defer();\n\n Node.query({})\n .$promise.then(function success(data) {\n var nodes = data.map(function (item) {\n return new NodeViewModel(item);\n });\n deferred.resolve(nodes);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve nodes', err: err });\n });\n\n return deferred.promise;\n }\n\n function updateNode(node) {\n return Node.update({ id: node.Id, version: node.Version }, node).$promise;\n }\n\n function getActiveManager() {\n var deferred = $q.defer();\n\n service\n .nodes()\n .then(function success(data) {\n for (var i = 0; i < data.length; ++i) {\n var node = data[i];\n if (node.Role === 'manager' && node.Availability === 'active' && node.Status === 'ready' && node.Addr !== '0.0.0.0') {\n deferred.resolve(node);\n break;\n }\n }\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve nodes', err: err });\n });\n\n return deferred.promise;\n }\n\n return service;\n },\n]);\n","import _ from 'lodash-es';\nimport { PluginViewModel } from '../models/plugin';\n\nangular.module('portainer.docker').factory('PluginService', [\n '$q',\n 'Plugin',\n 'SystemService',\n function PluginServiceFactory($q, Plugin, SystemService) {\n 'use strict';\n var service = {};\n\n service.plugins = function () {\n var deferred = $q.defer();\n var plugins = [];\n\n Plugin.query({})\n .$promise.then(function success(data) {\n for (var i = 0; i < data.length; i++) {\n var plugin = new PluginViewModel(data[i]);\n plugins.push(plugin);\n }\n })\n .finally(function final() {\n deferred.resolve(plugins);\n });\n\n return deferred.promise;\n };\n\n function servicePlugins(systemOnly, pluginType, pluginVersion) {\n var deferred = $q.defer();\n\n $q.all({\n system: SystemService.plugins(),\n plugins: systemOnly ? [] : service.plugins(),\n })\n .then(function success(data) {\n var aggregatedPlugins = [];\n var systemPlugins = data.system;\n var plugins = data.plugins;\n\n if (systemPlugins[pluginType]) {\n aggregatedPlugins = aggregatedPlugins.concat(systemPlugins[pluginType]);\n }\n\n for (var i = 0; i < plugins.length; i++) {\n var plugin = plugins[i];\n if (plugin.Enabled && _.includes(plugin.Config.Interface.Types, pluginVersion)) {\n aggregatedPlugins.push(plugin.Name);\n }\n }\n\n deferred.resolve(aggregatedPlugins);\n })\n .catch(function error(err) {\n deferred.reject({ msg: err.msg, err: err });\n });\n\n return deferred.promise;\n }\n\n service.volumePlugins = function (systemOnly) {\n return servicePlugins(systemOnly, 'Volume', 'docker.volumedriver/1.0');\n };\n\n service.networkPlugins = function (systemOnly) {\n return servicePlugins(systemOnly, 'Network', 'docker.networkdriver/1.0');\n };\n\n service.loggingPlugins = function (systemOnly) {\n return servicePlugins(systemOnly, 'Log', 'docker.logdriver/1.0');\n };\n\n return service;\n },\n]);\n","import { SecretViewModel } from '../models/secret';\n\nangular.module('portainer.docker').factory('SecretService', [\n '$q',\n 'Secret',\n function SecretServiceFactory($q, Secret) {\n 'use strict';\n var service = {};\n\n service.secret = function (secretId) {\n var deferred = $q.defer();\n\n Secret.get({ id: secretId })\n .$promise.then(function success(data) {\n var secret = new SecretViewModel(data);\n deferred.resolve(secret);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve secret details', err: err });\n });\n\n return deferred.promise;\n };\n\n service.secrets = function () {\n var deferred = $q.defer();\n\n Secret.query({})\n .$promise.then(function success(data) {\n var secrets = data.map(function (item) {\n return new SecretViewModel(item);\n });\n deferred.resolve(secrets);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve secrets', err: err });\n });\n\n return deferred.promise;\n };\n\n service.remove = function (secretId) {\n var deferred = $q.defer();\n\n Secret.remove({ id: secretId })\n .$promise.then(function success(data) {\n if (data.message) {\n deferred.reject({ msg: data.message });\n } else {\n deferred.resolve();\n }\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to remove secret', err: err });\n });\n\n return deferred.promise;\n };\n\n service.create = function (secretConfig) {\n return Secret.create(secretConfig).$promise;\n };\n\n return service;\n },\n]);\n","import { ServiceViewModel } from '../models/service';\n\nangular.module('portainer.docker').factory('ServiceService', [\n '$q',\n 'Service',\n 'ServiceHelper',\n 'TaskService',\n 'ResourceControlService',\n 'LogHelper',\n function ServiceServiceFactory($q, Service, ServiceHelper, TaskService, ResourceControlService, LogHelper) {\n 'use strict';\n var service = {};\n\n service.services = function (filters) {\n var deferred = $q.defer();\n\n Service.query({ filters: filters ? filters : {} })\n .$promise.then(function success(data) {\n var services = data.map(function (item) {\n return new ServiceViewModel(item);\n });\n deferred.resolve(services);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve services', err: err });\n });\n\n return deferred.promise;\n };\n\n service.service = function (id) {\n var deferred = $q.defer();\n\n Service.get({ id: id })\n .$promise.then(function success(data) {\n var service = new ServiceViewModel(data);\n deferred.resolve(service);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve service details', err: err });\n });\n\n return deferred.promise;\n };\n\n service.remove = function (service) {\n var deferred = $q.defer();\n\n Service.remove({ id: service.Id })\n .$promise.then(function success(data) {\n if (data.message) {\n deferred.reject({ msg: data.message, err: data.message });\n } else {\n deferred.resolve();\n }\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to remove service', err: err });\n });\n\n return deferred.promise;\n };\n\n service.update = function (serv, config, rollback) {\n return service.service(serv.Id).then((data) => {\n const params = {\n id: serv.Id,\n version: data.Version,\n };\n if (rollback) {\n params.rollback = rollback;\n }\n return Service.update(params, config).$promise;\n });\n };\n\n service.logs = function (id, stdout, stderr, timestamps, since, tail) {\n var deferred = $q.defer();\n\n var parameters = {\n id: id,\n stdout: stdout || 0,\n stderr: stderr || 0,\n timestamps: timestamps || 0,\n since: since || 0,\n tail: tail || 'all',\n };\n\n Service.logs(parameters)\n .$promise.then(function success(data) {\n var logs = LogHelper.formatLogs(data.logs, true);\n deferred.resolve(logs);\n })\n .catch(function error(err) {\n deferred.reject(err);\n });\n\n return deferred.promise;\n };\n\n return service;\n },\n]);\n","import { SwarmViewModel } from '../models/swarm';\n\nangular.module('portainer.docker').factory('SwarmService', [\n '$q',\n 'Swarm',\n function SwarmServiceFactory($q, Swarm) {\n 'use strict';\n var service = {};\n\n service.swarm = function () {\n var deferred = $q.defer();\n\n Swarm.get()\n .$promise.then(function success(data) {\n var swarm = new SwarmViewModel(data);\n deferred.resolve(swarm);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve Swarm details', err: err });\n });\n\n return deferred.promise;\n };\n\n return service;\n },\n]);\n","import { EventViewModel } from '../models/event';\n\nangular.module('portainer.docker').factory('SystemService', [\n '$q',\n 'System',\n 'SystemEndpoint',\n function SystemServiceFactory($q, System, SystemEndpoint) {\n 'use strict';\n var service = {};\n\n service.plugins = function () {\n var deferred = $q.defer();\n System.info({})\n .$promise.then(function success(data) {\n var plugins = data.Plugins;\n deferred.resolve(plugins);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve plugins information from system', err: err });\n });\n return deferred.promise;\n };\n\n service.info = function () {\n return System.info({}).$promise;\n };\n\n service.ping = function (endpointId) {\n return SystemEndpoint.ping({ endpointId: endpointId }).$promise;\n };\n\n service.version = function () {\n return System.version({}).$promise;\n };\n\n service.events = function (from, to) {\n var deferred = $q.defer();\n\n System.events({ since: from, until: to })\n .$promise.then(function success(data) {\n var events = data.map(function (item) {\n return new EventViewModel(item);\n });\n deferred.resolve(events);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve engine events', err: err });\n });\n\n return deferred.promise;\n };\n\n service.dataUsage = function () {\n return System.dataUsage().$promise;\n };\n\n return service;\n },\n]);\n","import { TaskViewModel } from '../models/task';\n\nangular.module('portainer.docker').factory('TaskService', [\n '$q',\n 'Task',\n 'LogHelper',\n function TaskServiceFactory($q, Task, LogHelper) {\n 'use strict';\n var service = {};\n\n service.task = function (id) {\n var deferred = $q.defer();\n\n Task.get({ id: id })\n .$promise.then(function success(data) {\n var task = new TaskViewModel(data);\n deferred.resolve(task);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve task details', err: err });\n });\n\n return deferred.promise;\n };\n\n service.tasks = function (filters) {\n var deferred = $q.defer();\n\n Task.query({ filters: filters ? filters : {} })\n .$promise.then(function success(data) {\n var tasks = data.map(function (item) {\n return new TaskViewModel(item);\n });\n deferred.resolve(tasks);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve tasks', err: err });\n });\n\n return deferred.promise;\n };\n\n service.logs = function (id, stdout, stderr, timestamps, since, tail) {\n var deferred = $q.defer();\n\n var parameters = {\n id: id,\n stdout: stdout || 0,\n stderr: stderr || 0,\n timestamps: timestamps || 0,\n since: since || 0,\n tail: tail || 'all',\n };\n\n Task.logs(parameters)\n .$promise.then(function success(data) {\n var logs = LogHelper.formatLogs(data.logs, true);\n deferred.resolve(logs);\n })\n .catch(function error(err) {\n deferred.reject(err);\n });\n\n return deferred.promise;\n };\n\n return service;\n },\n]);\n","import { VolumeViewModel } from '../models/volume';\n\nangular.module('portainer.docker').factory('VolumeService', [\n '$q',\n 'Volume',\n 'VolumeHelper',\n function VolumeServiceFactory($q, Volume, VolumeHelper) {\n 'use strict';\n var service = {};\n\n service.volumes = function (params) {\n var deferred = $q.defer();\n Volume.query(params)\n .$promise.then(function success(data) {\n var volumes = data.Volumes || [];\n volumes = volumes.map(function (item) {\n return new VolumeViewModel(item);\n });\n deferred.resolve(volumes);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve volumes', err: err });\n });\n return deferred.promise;\n };\n\n service.volume = function (id) {\n var deferred = $q.defer();\n Volume.get({ id: id })\n .$promise.then(function success(data) {\n var volume = new VolumeViewModel(data);\n deferred.resolve(volume);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve volume details', err: err });\n });\n return deferred.promise;\n };\n\n service.getVolumes = function () {\n return Volume.query({}).$promise;\n };\n\n service.remove = function (volume) {\n var deferred = $q.defer();\n\n Volume.remove({ id: volume.Id })\n .$promise.then(function success(data) {\n if (data.message) {\n deferred.reject({ msg: data.message, err: data.message });\n } else {\n deferred.resolve();\n }\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to remove volume', err: err });\n });\n\n return deferred.promise;\n };\n\n service.createVolumeConfiguration = function (name, driver, driverOptions) {\n var volumeConfiguration = {\n Name: name,\n Driver: driver,\n DriverOpts: VolumeHelper.createDriverOptions(driverOptions),\n };\n return volumeConfiguration;\n };\n\n service.createVolume = function (volumeConfiguration) {\n var deferred = $q.defer();\n Volume.create(volumeConfiguration)\n .$promise.then(function success(data) {\n if (data.message) {\n deferred.reject({ msg: data.message });\n } else {\n var volume = new VolumeViewModel(data);\n deferred.resolve(volume);\n }\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to create volume', err: err });\n });\n return deferred.promise;\n };\n\n service.createVolumes = function (volumeConfigurations) {\n var createVolumeQueries = volumeConfigurations.map(function (volumeConfiguration) {\n return service.createVolume(volumeConfiguration);\n });\n return $q.all(createVolumeQueries);\n };\n\n service.createXAutoGeneratedLocalVolumes = function (x) {\n var createVolumeQueries = [];\n for (var i = 0; i < x; i++) {\n createVolumeQueries.push(service.createVolume({ Driver: 'local' }));\n }\n return $q.all(createVolumeQueries);\n };\n\n return service;\n },\n]);\n","import angular from 'angular';\n\nclass ConfigsController {\n /* @ngInject */\n constructor($state, ConfigService, Notifications, $async) {\n this.$state = $state;\n this.ConfigService = ConfigService;\n this.Notifications = Notifications;\n this.$async = $async;\n\n this.removeAction = this.removeAction.bind(this);\n this.removeActionAsync = this.removeActionAsync.bind(this);\n this.getConfigs = this.getConfigs.bind(this);\n this.getConfigsAsync = this.getConfigsAsync.bind(this);\n }\n\n getConfigs() {\n return this.$async(this.getConfigsAsync);\n }\n\n async getConfigsAsync() {\n try {\n this.configs = await this.ConfigService.configs();\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve configs');\n }\n }\n\n async $onInit() {\n this.configs = [];\n this.getConfigs();\n }\n\n removeAction(selectedItems) {\n return this.$async(this.removeActionAsync, selectedItems);\n }\n\n async removeActionAsync(selectedItems) {\n let actionCount = selectedItems.length;\n for (const config of selectedItems) {\n try {\n await this.ConfigService.remove(config.Id);\n this.Notifications.success('Config successfully removed', config.Name);\n const index = this.configs.indexOf(config);\n this.configs.splice(index, 1);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to remove config');\n } finally {\n --actionCount;\n if (actionCount === 0) {\n this.$state.reload();\n }\n }\n }\n }\n}\nexport default ConfigsController;\nangular.module('portainer.docker').controller('ConfigsController', ConfigsController);\n","import _ from 'lodash-es';\nimport angular from 'angular';\nimport { AccessControlFormData } from 'Portainer/components/accessControlForm/porAccessControlFormModel';\n\nclass CreateConfigController {\n /* @ngInject */\n constructor($async, $state, $transition$, $window, ModalService, Notifications, ConfigService, Authentication, FormValidator, ResourceControlService) {\n this.$state = $state;\n this.$transition$ = $transition$;\n this.$window = $window;\n this.ModalService = ModalService;\n this.Notifications = Notifications;\n this.ConfigService = ConfigService;\n this.Authentication = Authentication;\n this.FormValidator = FormValidator;\n this.ResourceControlService = ResourceControlService;\n this.$async = $async;\n\n this.formValues = {\n Name: '',\n Labels: [],\n AccessControlData: new AccessControlFormData(),\n ConfigContent: '',\n };\n\n this.state = {\n formValidationError: '',\n isEditorDirty: false,\n };\n\n this.editorUpdate = this.editorUpdate.bind(this);\n this.createAsync = this.createAsync.bind(this);\n }\n\n async $onInit() {\n this.$window.onbeforeunload = () => {\n if (this.formValues.displayCodeEditor && this.formValues.ConfigContent && this.state.isEditorDirty) {\n return '';\n }\n };\n\n if (!this.$transition$.params().id) {\n this.formValues.displayCodeEditor = true;\n return;\n }\n\n try {\n let data = await this.ConfigService.config(this.$transition$.params().id);\n this.formValues.Name = data.Name + '_copy';\n this.formValues.Data = data.Data;\n let labels = _.keys(data.Labels);\n for (let i = 0; i < labels.length; i++) {\n let labelName = labels[i];\n let labelValue = data.Labels[labelName];\n this.formValues.Labels.push({ name: labelName, value: labelValue });\n }\n this.formValues.displayCodeEditor = true;\n } catch (err) {\n this.formValues.displayCodeEditor = true;\n this.Notifications.error('Failure', err, 'Unable to clone config');\n }\n }\n\n $onDestroy() {\n this.state.isEditorDirty = false;\n }\n\n async uiCanExit() {\n if (this.formValues.displayCodeEditor && this.formValues.ConfigContent && this.state.isEditorDirty) {\n return this.ModalService.confirmWebEditorDiscard();\n }\n }\n\n addLabel() {\n this.formValues.Labels.push({ name: '', value: '' });\n }\n\n removeLabel(index) {\n this.formValues.Labels.splice(index, 1);\n }\n\n prepareLabelsConfig(config) {\n let labels = {};\n this.formValues.Labels.forEach(function (label) {\n if (label.name && label.value) {\n labels[label.name] = label.value;\n }\n });\n config.Labels = labels;\n }\n\n prepareConfigData(config) {\n let configData = this.formValues.ConfigContent;\n config.Data = btoa(unescape(encodeURIComponent(configData)));\n }\n\n prepareConfiguration() {\n let config = {};\n config.Name = this.formValues.Name;\n this.prepareConfigData(config);\n this.prepareLabelsConfig(config);\n return config;\n }\n\n validateForm(accessControlData, isAdmin) {\n this.state.formValidationError = '';\n let error = '';\n error = this.FormValidator.validateAccessControl(accessControlData, isAdmin);\n\n if (error) {\n this.state.formValidationError = error;\n return false;\n }\n return true;\n }\n\n create() {\n return this.$async(this.createAsync);\n }\n\n async createAsync() {\n const accessControlData = this.formValues.AccessControlData;\n const userDetails = this.Authentication.getUserDetails();\n const isAdmin = this.Authentication.isAdmin();\n\n if (this.formValues.ConfigContent === '') {\n this.state.formValidationError = 'Config content must not be empty';\n return;\n }\n\n if (!this.validateForm(accessControlData, isAdmin)) {\n return;\n }\n\n const config = this.prepareConfiguration();\n\n try {\n const data = await this.ConfigService.create(config);\n const resourceControl = data.Portainer.ResourceControl;\n const userId = userDetails.ID;\n await this.ResourceControlService.applyResourceControl(userId, accessControlData, resourceControl);\n this.Notifications.success('Config successfully created');\n this.state.isEditorDirty = false;\n this.$state.go('docker.configs', {}, { reload: true });\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to create config');\n }\n }\n\n editorUpdate(cm) {\n this.formValues.ConfigContent = cm.getValue();\n this.state.isEditorDirty = true;\n }\n}\n\nexport default CreateConfigController;\nangular.module('portainer.docker').controller('CreateConfigController', CreateConfigController);\n","angular.module('portainer.docker').controller('ConfigController', [\n '$scope',\n '$transition$',\n '$state',\n 'ConfigService',\n 'Notifications',\n function ($scope, $transition$, $state, ConfigService, Notifications) {\n $scope.removeConfig = function removeConfig(configId) {\n ConfigService.remove(configId)\n .then(function success() {\n Notifications.success('Config successfully removed');\n $state.go('docker.configs', {});\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to remove config');\n });\n };\n\n function initView() {\n ConfigService.config($transition$.params().id)\n .then(function success(data) {\n $scope.config = data;\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve config details');\n });\n }\n\n initView();\n },\n]);\n","import { Terminal } from 'xterm';\n\nangular.module('portainer.docker').controller('ContainerConsoleController', [\n '$scope',\n '$transition$',\n 'ContainerService',\n 'ImageService',\n 'EndpointProvider',\n 'Notifications',\n 'ContainerHelper',\n 'ExecService',\n 'HttpRequestHelper',\n 'LocalStorage',\n 'CONSOLE_COMMANDS_LABEL_PREFIX',\n function (\n $scope,\n $transition$,\n ContainerService,\n ImageService,\n EndpointProvider,\n Notifications,\n ContainerHelper,\n ExecService,\n HttpRequestHelper,\n LocalStorage,\n CONSOLE_COMMANDS_LABEL_PREFIX\n ) {\n var socket, term;\n\n let states = Object.freeze({\n disconnected: 0,\n connecting: 1,\n connected: 2,\n });\n\n $scope.loaded = false;\n $scope.states = states;\n $scope.state = states.disconnected;\n\n $scope.formValues = {};\n $scope.containerCommands = [];\n\n // Ensure the socket is closed before leaving the view\n $scope.$on('$stateChangeStart', function () {\n $scope.disconnect();\n });\n\n $scope.connectAttach = function () {\n if ($scope.state > states.disconnected) {\n return;\n }\n\n $scope.state = states.connecting;\n\n let attachId = $transition$.params().id;\n\n ContainerService.container(attachId)\n .then((details) => {\n if (!details.State.Running) {\n Notifications.error('Failure', details, 'Container ' + attachId + ' is not running!');\n $scope.disconnect();\n return;\n }\n\n const params = {\n token: LocalStorage.getJWT(),\n endpointId: EndpointProvider.endpointID(),\n id: attachId,\n };\n\n var url =\n window.location.href.split('#')[0] +\n 'api/websocket/attach?' +\n Object.keys(params)\n .map((k) => k + '=' + params[k])\n .join('&');\n\n initTerm(url, ContainerService.resizeTTY.bind(this, attachId));\n })\n .catch(function error(err) {\n Notifications.error('Error', err, 'Unable to retrieve container details');\n $scope.disconnect();\n });\n };\n\n $scope.connectExec = function () {\n if ($scope.state > states.disconnected) {\n return;\n }\n\n $scope.state = states.connecting;\n var command = $scope.formValues.isCustomCommand ? $scope.formValues.customCommand : $scope.formValues.command;\n var execConfig = {\n id: $transition$.params().id,\n AttachStdin: true,\n AttachStdout: true,\n AttachStderr: true,\n Tty: true,\n User: $scope.formValues.user,\n Cmd: ContainerHelper.commandStringToArray(command),\n };\n\n ContainerService.createExec(execConfig)\n .then(function success(data) {\n const params = {\n token: LocalStorage.getJWT(),\n endpointId: EndpointProvider.endpointID(),\n id: data.Id,\n };\n\n var url =\n window.location.href.split('#')[0] +\n 'api/websocket/exec?' +\n Object.keys(params)\n .map((k) => k + '=' + params[k])\n .join('&');\n\n initTerm(url, ExecService.resizeTTY.bind(this, params.id));\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to exec into container');\n $scope.disconnect();\n });\n };\n\n $scope.disconnect = function () {\n if (socket) {\n socket.close();\n }\n if ($scope.state > states.disconnected) {\n $scope.state = states.disconnected;\n if (term) {\n term.write('\\n\\r(connection closed)');\n term.dispose();\n }\n }\n };\n\n $scope.autoconnectAttachView = function () {\n return $scope.initView().then(function success() {\n if ($scope.container.State.Running) {\n $scope.connectAttach();\n }\n });\n };\n\n function resize(restcall, add) {\n add = add || 0;\n\n term.fit();\n var termWidth = term.cols;\n var termHeight = 30;\n term.resize(termWidth, termHeight);\n\n restcall(termWidth + add, termHeight + add, 1);\n }\n\n function initTerm(url, resizeRestCall) {\n let resizefun = resize.bind(this, resizeRestCall);\n\n if ($transition$.params().nodeName) {\n url += '&nodeName=' + $transition$.params().nodeName;\n }\n if (url.indexOf('https') > -1) {\n url = url.replace('https://', 'wss://');\n } else {\n url = url.replace('http://', 'ws://');\n }\n\n socket = new WebSocket(url);\n\n socket.onopen = function () {\n $scope.state = states.connected;\n term = new Terminal();\n\n term.on('data', function (data) {\n socket.send(data);\n });\n var terminal_container = document.getElementById('terminal-container');\n term.open(terminal_container);\n term.focus();\n term.setOption('cursorBlink', true);\n\n window.onresize = function () {\n resizefun();\n $scope.$apply();\n };\n\n $scope.$watch('toggle', function () {\n setTimeout(resizefun, 400);\n });\n\n socket.onmessage = function (e) {\n term.write(e.data);\n };\n socket.onerror = function (err) {\n $scope.disconnect();\n $scope.$apply();\n Notifications.error('Failure', err, 'Connection error');\n };\n socket.onclose = function () {\n $scope.disconnect();\n $scope.$apply();\n };\n\n resizefun(1);\n $scope.$apply();\n };\n }\n\n $scope.initView = function () {\n HttpRequestHelper.setPortainerAgentTargetHeader($transition$.params().nodeName);\n return ContainerService.container($transition$.params().id)\n .then(function success(data) {\n var container = data;\n $scope.container = container;\n return ImageService.image(container.Image);\n })\n .then(function success(data) {\n var image = data;\n var containerLabels = $scope.container.Config.Labels;\n $scope.imageOS = image.Os;\n $scope.formValues.command = image.Os === 'windows' ? 'powershell' : 'bash';\n $scope.containerCommands = Object.keys(containerLabels)\n .filter(function (label) {\n return label.indexOf(CONSOLE_COMMANDS_LABEL_PREFIX) === 0;\n })\n .map(function (label) {\n return {\n title: label.replace(CONSOLE_COMMANDS_LABEL_PREFIX, ''),\n command: containerLabels[label],\n };\n });\n $scope.loaded = true;\n })\n .catch(function error(err) {\n Notifications.error('Error', err, 'Unable to retrieve container details');\n });\n };\n },\n]);\n","angular.module('portainer.docker').controller('ContainersController', [\n '$scope',\n 'ContainerService',\n 'Notifications',\n 'EndpointProvider',\n function ($scope, ContainerService, Notifications, EndpointProvider) {\n $scope.offlineMode = false;\n\n $scope.getContainers = getContainers;\n\n function getContainers() {\n ContainerService.containers(1)\n .then(function success(data) {\n $scope.containers = data;\n $scope.offlineMode = EndpointProvider.offlineMode();\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve containers');\n $scope.containers = [];\n });\n }\n\n function initView() {\n getContainers();\n }\n\n initView();\n },\n]);\n","import moment from 'moment';\nimport _ from 'lodash-es';\nimport { PorImageRegistryModel } from 'Docker/models/porImageRegistry';\n\nangular.module('portainer.docker').controller('ContainerController', [\n '$q',\n '$scope',\n '$state',\n '$transition$',\n '$filter',\n '$async',\n 'Commit',\n 'ContainerHelper',\n 'ContainerService',\n 'ImageHelper',\n 'NetworkService',\n 'Notifications',\n 'ModalService',\n 'ResourceControlService',\n 'RegistryService',\n 'ImageService',\n 'HttpRequestHelper',\n 'Authentication',\n 'endpoint',\n function (\n $q,\n $scope,\n $state,\n $transition$,\n $filter,\n $async,\n Commit,\n ContainerHelper,\n ContainerService,\n ImageHelper,\n NetworkService,\n Notifications,\n ModalService,\n ResourceControlService,\n RegistryService,\n ImageService,\n HttpRequestHelper,\n Authentication,\n endpoint\n ) {\n $scope.endpoint = endpoint;\n $scope.isAdmin = Authentication.isAdmin();\n $scope.activityTime = 0;\n $scope.portBindings = [];\n $scope.displayRecreateButton = false;\n\n $scope.config = {\n RegistryModel: new PorImageRegistryModel(),\n commitInProgress: false,\n };\n\n $scope.state = {\n recreateContainerInProgress: false,\n joinNetworkInProgress: false,\n leaveNetworkInProgress: false,\n pullImageValidity: false,\n };\n\n $scope.setPullImageValidity = setPullImageValidity;\n function setPullImageValidity(validity) {\n $scope.state.pullImageValidity = validity;\n }\n\n $scope.updateRestartPolicy = updateRestartPolicy;\n\n var update = function () {\n var nodeName = $transition$.params().nodeName;\n HttpRequestHelper.setPortainerAgentTargetHeader(nodeName);\n $scope.nodeName = nodeName;\n\n ContainerService.container($transition$.params().id)\n .then(function success(data) {\n var container = data;\n $scope.container = container;\n $scope.container.edit = false;\n $scope.container.newContainerName = $filter('trimcontainername')(container.Name);\n\n if (container.State.Running) {\n $scope.activityTime = moment.duration(moment(container.State.StartedAt).utc().diff(moment().utc())).humanize();\n } else if (container.State.Status === 'created') {\n $scope.activityTime = moment.duration(moment(container.Created).utc().diff(moment().utc())).humanize();\n } else {\n $scope.activityTime = moment.duration(moment().utc().diff(moment(container.State.FinishedAt).utc())).humanize();\n }\n\n $scope.portBindings = [];\n if (container.NetworkSettings.Ports) {\n _.forEach(Object.keys(container.NetworkSettings.Ports), function (key) {\n if (container.NetworkSettings.Ports[key]) {\n _.forEach(container.NetworkSettings.Ports[key], (portMapping) => {\n const mapping = {};\n mapping.container = key;\n mapping.host = `${portMapping.HostIp}:${portMapping.HostPort}`;\n $scope.portBindings.push(mapping);\n });\n }\n });\n }\n\n $scope.container.Config.Env = _.sortBy($scope.container.Config.Env, _.toLower);\n const inSwarm = $scope.container.Config.Labels['com.docker.swarm.service.id'];\n const autoRemove = $scope.container.HostConfig.AutoRemove;\n const admin = Authentication.isAdmin();\n const {\n allowContainerCapabilitiesForRegularUsers,\n allowHostNamespaceForRegularUsers,\n allowDeviceMappingForRegularUsers,\n allowSysctlSettingForRegularUsers,\n allowBindMountsForRegularUsers,\n allowPrivilegedModeForRegularUsers,\n } = endpoint.SecuritySettings;\n\n const settingRestrictsRegularUsers =\n !allowContainerCapabilitiesForRegularUsers ||\n !allowBindMountsForRegularUsers ||\n !allowDeviceMappingForRegularUsers ||\n !allowSysctlSettingForRegularUsers ||\n !allowHostNamespaceForRegularUsers ||\n !allowPrivilegedModeForRegularUsers;\n\n $scope.displayRecreateButton = !inSwarm && !autoRemove && (admin || !settingRestrictsRegularUsers);\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve container info');\n });\n };\n\n function executeContainerAction(id, action, successMessage, errorMessage) {\n action(id)\n .then(function success() {\n Notifications.success(successMessage, id);\n update();\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, errorMessage);\n });\n }\n\n $scope.start = function () {\n var successMessage = 'Container successfully started';\n var errorMessage = 'Unable to start container';\n executeContainerAction($transition$.params().id, ContainerService.startContainer, successMessage, errorMessage);\n };\n\n $scope.stop = function () {\n var successMessage = 'Container successfully stopped';\n var errorMessage = 'Unable to stop container';\n executeContainerAction($transition$.params().id, ContainerService.stopContainer, successMessage, errorMessage);\n };\n\n $scope.kill = function () {\n var successMessage = 'Container successfully killed';\n var errorMessage = 'Unable to kill container';\n executeContainerAction($transition$.params().id, ContainerService.killContainer, successMessage, errorMessage);\n };\n\n $scope.pause = function () {\n var successMessage = 'Container successfully paused';\n var errorMessage = 'Unable to pause container';\n executeContainerAction($transition$.params().id, ContainerService.pauseContainer, successMessage, errorMessage);\n };\n\n $scope.unpause = function () {\n var successMessage = 'Container successfully resumed';\n var errorMessage = 'Unable to resume container';\n executeContainerAction($transition$.params().id, ContainerService.resumeContainer, successMessage, errorMessage);\n };\n\n $scope.restart = function () {\n var successMessage = 'Container successfully restarted';\n var errorMessage = 'Unable to restart container';\n executeContainerAction($transition$.params().id, ContainerService.restartContainer, successMessage, errorMessage);\n };\n\n $scope.renameContainer = function () {\n var container = $scope.container;\n ContainerService.renameContainer($transition$.params().id, container.newContainerName)\n .then(function success() {\n container.Name = container.newContainerName;\n Notifications.success('Container successfully renamed', container.Name);\n })\n .catch(function error(err) {\n container.newContainerName = container.Name;\n Notifications.error('Failure', err, 'Unable to rename container');\n })\n .finally(function final() {\n $scope.container.edit = false;\n });\n };\n\n $scope.containerLeaveNetwork = function containerLeaveNetwork(container, networkId) {\n $scope.state.leaveNetworkInProgress = true;\n NetworkService.disconnectContainer(networkId, container.Id, false)\n .then(function success() {\n Notifications.success('Container left network', container.Id);\n $state.reload();\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to disconnect container from network');\n })\n .finally(function final() {\n $scope.state.leaveNetworkInProgress = false;\n });\n };\n\n $scope.containerJoinNetwork = function containerJoinNetwork(container, networkId) {\n $scope.state.joinNetworkInProgress = true;\n NetworkService.connectContainer(networkId, container.Id)\n .then(function success() {\n Notifications.success('Container joined network', container.Id);\n $state.reload();\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to connect container to network');\n })\n .finally(function final() {\n $scope.state.joinNetworkInProgress = false;\n });\n };\n\n async function commitContainerAsync() {\n $scope.config.commitInProgress = true;\n const registryModel = $scope.config.RegistryModel;\n const imageConfig = ImageHelper.createImageConfigForContainer(registryModel);\n try {\n await Commit.commitContainer({ id: $transition$.params().id, repo: imageConfig.fromImage }).$promise;\n Notifications.success('Image created', $transition$.params().id);\n $state.reload();\n } catch (err) {\n Notifications.error('Failure', err, 'Unable to create image');\n $scope.config.commitInProgress = false;\n }\n }\n\n $scope.commit = function () {\n return $async(commitContainerAsync);\n };\n\n $scope.confirmRemove = function () {\n var title = 'You are about to remove a container.';\n if ($scope.container.State.Running) {\n title = 'You are about to remove a running container.';\n }\n ModalService.confirmContainerDeletion(title, function (result) {\n if (!result) {\n return;\n }\n var cleanAssociatedVolumes = false;\n if (result[0]) {\n cleanAssociatedVolumes = true;\n }\n removeContainer(cleanAssociatedVolumes);\n });\n };\n\n function removeContainer(cleanAssociatedVolumes) {\n ContainerService.remove($scope.container, cleanAssociatedVolumes)\n .then(function success() {\n Notifications.success('Container successfully removed');\n $state.go('docker.containers', {}, { reload: true });\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to remove container');\n });\n }\n\n function recreateContainer(pullImage) {\n var container = $scope.container;\n var config = ContainerHelper.configFromContainer(container.Model);\n $scope.state.recreateContainerInProgress = true;\n var isRunning = container.State.Running;\n\n return pullImageIfNeeded()\n .then(stopContainerIfNeeded)\n .then(renameContainer)\n .then(setMainNetworkAndCreateContainer)\n .then(connectContainerToOtherNetworks)\n .then(startContainerIfNeeded)\n .then(createResourceControl)\n .then(deleteOldContainer)\n .then(notifyAndChangeView)\n .catch(notifyOnError);\n\n function stopContainerIfNeeded() {\n if (!isRunning) {\n return $q.when();\n }\n return ContainerService.stopContainer(container.Id);\n }\n\n function renameContainer() {\n return ContainerService.renameContainer(container.Id, container.Name + '-old');\n }\n\n function pullImageIfNeeded() {\n if (!pullImage) {\n return $q.when();\n }\n return RegistryService.retrievePorRegistryModelFromRepository(container.Config.Image, endpoint.Id).then((registryModel) => {\n return ImageService.pullImage(registryModel, true);\n });\n }\n\n function setMainNetworkAndCreateContainer() {\n var networks = config.NetworkingConfig.EndpointsConfig;\n var networksNames = Object.keys(networks);\n if (networksNames.length > 1) {\n config.NetworkingConfig.EndpointsConfig = {};\n config.NetworkingConfig.EndpointsConfig[networksNames[0]] = networks[0];\n }\n return $q.all([ContainerService.createContainer(config), networks]);\n }\n\n function connectContainerToOtherNetworks(createContainerData) {\n var newContainer = createContainerData[0];\n var networks = createContainerData[1];\n var networksNames = Object.keys(networks);\n var connectionPromises = networksNames.map(function connectToNetwork(name) {\n NetworkService.connectContainer(name, newContainer.Id);\n });\n return $q.all(connectionPromises).then(function onConnectToNetworkSuccess() {\n return newContainer;\n });\n }\n\n function deleteOldContainer(newContainer) {\n return ContainerService.remove(container, true).then(function onRemoveSuccess() {\n return newContainer;\n });\n }\n\n function startContainerIfNeeded(newContainer) {\n if (!isRunning) {\n return $q.when(newContainer);\n }\n return ContainerService.startContainer(newContainer.Id).then(function onStartSuccess() {\n return newContainer;\n });\n }\n\n function createResourceControl(newContainer) {\n const userId = Authentication.getUserDetails().ID;\n const oldResourceControl = container.ResourceControl;\n const newResourceControl = newContainer.Portainer.ResourceControl;\n return ResourceControlService.duplicateResourceControl(userId, oldResourceControl, newResourceControl);\n }\n\n function notifyAndChangeView() {\n Notifications.success('Container successfully re-created');\n $state.go('docker.containers', {}, { reload: true });\n }\n\n function notifyOnError(err) {\n Notifications.error('Failure', err, 'Unable to re-create container');\n $scope.state.recreateContainerInProgress = false;\n }\n }\n\n $scope.recreate = function () {\n ModalService.confirmContainerRecreation(function (result) {\n if (!result) {\n return;\n }\n var pullImage = false;\n if (result[0]) {\n pullImage = true;\n }\n recreateContainer(pullImage);\n });\n };\n\n function updateRestartPolicy(restartPolicy, maximumRetryCount) {\n maximumRetryCount = restartPolicy === 'on-failure' ? maximumRetryCount : undefined;\n\n return ContainerService.updateRestartPolicy($scope.container.Id, restartPolicy, maximumRetryCount).then(onUpdateSuccess).catch(notifyOnError);\n\n function onUpdateSuccess() {\n $scope.container.HostConfig.RestartPolicy = {\n Name: restartPolicy,\n MaximumRetryCount: maximumRetryCount,\n };\n Notifications.success('Restart policy updated');\n }\n\n function notifyOnError(err) {\n Notifications.error('Failure', err, 'Unable to update restart policy');\n return $q.reject(err);\n }\n }\n\n var provider = $scope.applicationState.endpoint.mode.provider;\n var apiVersion = $scope.applicationState.endpoint.apiVersion;\n NetworkService.networks(provider === 'DOCKER_STANDALONE' || provider === 'DOCKER_SWARM_MODE', false, provider === 'DOCKER_SWARM_MODE' && apiVersion >= 1.25)\n .then(function success(data) {\n var networks = data;\n $scope.availableNetworks = networks;\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve networks');\n });\n\n update();\n },\n]);\n","angular.module('portainer.docker').controller('ContainerInspectController', [\n '$scope',\n '$transition$',\n 'Notifications',\n 'ContainerService',\n 'HttpRequestHelper',\n function ($scope, $transition$, Notifications, ContainerService, HttpRequestHelper) {\n $scope.state = {\n DisplayTextView: false,\n };\n $scope.containerInfo = {};\n\n function initView() {\n HttpRequestHelper.setPortainerAgentTargetHeader($transition$.params().nodeName);\n ContainerService.inspect($transition$.params().id)\n .then(function success(d) {\n $scope.containerInfo = d;\n })\n .catch(function error(e) {\n Notifications.error('Failure', e, 'Unable to inspect container');\n });\n }\n\n initView();\n },\n]);\n","import moment from 'moment';\n\nangular.module('portainer.docker').controller('ContainerLogsController', [\n '$scope',\n '$transition$',\n '$interval',\n 'ContainerService',\n 'Notifications',\n 'HttpRequestHelper',\n function ($scope, $transition$, $interval, ContainerService, Notifications, HttpRequestHelper) {\n $scope.state = {\n refreshRate: 3,\n lineCount: 100,\n sinceTimestamp: '',\n displayTimestamps: false,\n };\n\n $scope.changeLogCollection = function (logCollectionStatus) {\n if (!logCollectionStatus) {\n stopRepeater();\n } else {\n setUpdateRepeater(!$scope.container.Config.Tty);\n }\n };\n\n $scope.$on('$destroy', function () {\n stopRepeater();\n });\n\n function stopRepeater() {\n var repeater = $scope.repeater;\n if (angular.isDefined(repeater)) {\n $interval.cancel(repeater);\n repeater = null;\n }\n }\n\n function setUpdateRepeater(skipHeaders) {\n var refreshRate = $scope.state.refreshRate;\n $scope.repeater = $interval(function () {\n ContainerService.logs(\n $transition$.params().id,\n 1,\n 1,\n $scope.state.displayTimestamps ? 1 : 0,\n moment($scope.state.sinceTimestamp).unix(),\n $scope.state.lineCount,\n skipHeaders\n )\n .then(function success(data) {\n $scope.logs = data;\n })\n .catch(function error(err) {\n stopRepeater();\n Notifications.error('Failure', err, 'Unable to retrieve container logs');\n });\n }, refreshRate * 1000);\n }\n\n function startLogPolling(skipHeaders) {\n ContainerService.logs($transition$.params().id, 1, 1, $scope.state.displayTimestamps ? 1 : 0, moment($scope.state.sinceTimestamp).unix(), $scope.state.lineCount, skipHeaders)\n .then(function success(data) {\n $scope.logs = data;\n setUpdateRepeater(skipHeaders);\n })\n .catch(function error(err) {\n stopRepeater();\n Notifications.error('Failure', err, 'Unable to retrieve container logs');\n });\n }\n\n function initView() {\n HttpRequestHelper.setPortainerAgentTargetHeader($transition$.params().nodeName);\n ContainerService.container($transition$.params().id)\n .then(function success(data) {\n var container = data;\n $scope.container = container;\n startLogPolling(!container.Config.Tty);\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve container information');\n });\n }\n\n initView();\n },\n]);\n","import moment from 'moment';\n\nangular.module('portainer.docker').controller('ContainerStatsController', [\n '$q',\n '$scope',\n '$transition$',\n '$document',\n '$interval',\n 'ContainerService',\n 'ChartService',\n 'Notifications',\n 'HttpRequestHelper',\n function ($q, $scope, $transition$, $document, $interval, ContainerService, ChartService, Notifications, HttpRequestHelper) {\n $scope.state = {\n refreshRate: '5',\n networkStatsUnavailable: false,\n ioStatsUnavailable: false,\n };\n\n $scope.$on('$destroy', function () {\n stopRepeater();\n });\n\n function stopRepeater() {\n var repeater = $scope.repeater;\n if (angular.isDefined(repeater)) {\n $interval.cancel(repeater);\n repeater = null;\n }\n }\n\n function updateNetworkChart(stats, chart) {\n if (stats.Networks.length > 0) {\n var rx = stats.Networks[0].rx_bytes;\n var tx = stats.Networks[0].tx_bytes;\n var label = moment(stats.read).format('HH:mm:ss');\n\n ChartService.UpdateNetworkChart(label, rx, tx, chart);\n }\n }\n\n function updateMemoryChart(stats, chart) {\n var label = moment(stats.read).format('HH:mm:ss');\n\n ChartService.UpdateMemoryChart(label, stats.MemoryUsage, stats.MemoryCache, chart);\n }\n\n function updateIOChart(stats, chart) {\n var label = moment(stats.read).format('HH:mm:ss');\n if (stats.noIOData !== true) {\n ChartService.UpdateIOChart(label, stats.BytesRead, stats.BytesWrite, chart);\n }\n }\n\n function updateCPUChart(stats, chart) {\n var label = moment(stats.read).format('HH:mm:ss');\n var value = stats.isWindows ? calculateCPUPercentWindows(stats) : calculateCPUPercentUnix(stats);\n\n ChartService.UpdateCPUChart(label, value, chart);\n }\n\n function calculateCPUPercentUnix(stats) {\n var cpuPercent = 0.0;\n var cpuDelta = stats.CurrentCPUTotalUsage - stats.PreviousCPUTotalUsage;\n var systemDelta = stats.CurrentCPUSystemUsage - stats.PreviousCPUSystemUsage;\n\n if (systemDelta > 0.0 && cpuDelta > 0.0) {\n cpuPercent = (cpuDelta / systemDelta) * stats.CPUCores * 100.0;\n }\n\n return cpuPercent;\n }\n\n function calculateCPUPercentWindows(stats) {\n var possIntervals =\n stats.NumProcs * parseFloat(moment(stats.read, 'YYYY-MM-DDTHH:mm:ss.SSSSSSSSSZ').valueOf() - moment(stats.preread, 'YYYY-MM-DDTHH:mm:ss.SSSSSSSSSZ').valueOf());\n var windowsCpuUsage = 0.0;\n if (possIntervals > 0) {\n windowsCpuUsage = parseFloat(stats.CurrentCPUTotalUsage - stats.PreviousCPUTotalUsage) / parseFloat(possIntervals * 100);\n }\n return windowsCpuUsage;\n }\n\n $scope.changeUpdateRepeater = function () {\n var networkChart = $scope.networkChart;\n var cpuChart = $scope.cpuChart;\n var memoryChart = $scope.memoryChart;\n var ioChart = $scope.ioChart;\n\n stopRepeater();\n setUpdateRepeater(networkChart, cpuChart, memoryChart, ioChart);\n $('#refreshRateChange').show();\n $('#refreshRateChange').fadeOut(1500);\n };\n\n function startChartUpdate(networkChart, cpuChart, memoryChart, ioChart) {\n $q.all({\n stats: ContainerService.containerStats($transition$.params().id),\n top: ContainerService.containerTop($transition$.params().id),\n })\n .then(function success(data) {\n var stats = data.stats;\n $scope.processInfo = data.top;\n if (stats.Networks.length === 0) {\n $scope.state.networkStatsUnavailable = true;\n }\n if (stats.noIOData === true) {\n $scope.state.ioStatsUnavailable = true;\n }\n updateNetworkChart(stats, networkChart);\n updateMemoryChart(stats, memoryChart);\n updateCPUChart(stats, cpuChart);\n updateIOChart(stats, ioChart);\n setUpdateRepeater(networkChart, cpuChart, memoryChart, ioChart);\n })\n .catch(function error(err) {\n stopRepeater();\n Notifications.error('Failure', err, 'Unable to retrieve container statistics');\n });\n }\n\n function setUpdateRepeater(networkChart, cpuChart, memoryChart, ioChart) {\n var refreshRate = $scope.state.refreshRate;\n $scope.repeater = $interval(function () {\n $q.all({\n stats: ContainerService.containerStats($transition$.params().id),\n top: ContainerService.containerTop($transition$.params().id),\n })\n .then(function success(data) {\n var stats = data.stats;\n $scope.processInfo = data.top;\n updateNetworkChart(stats, networkChart);\n updateMemoryChart(stats, memoryChart);\n updateCPUChart(stats, cpuChart);\n updateIOChart(stats, ioChart);\n })\n .catch(function error(err) {\n stopRepeater();\n Notifications.error('Failure', err, 'Unable to retrieve container statistics');\n });\n }, refreshRate * 1000);\n }\n\n function initCharts() {\n var networkChartCtx = $('#networkChart');\n var networkChart = ChartService.CreateNetworkChart(networkChartCtx);\n $scope.networkChart = networkChart;\n\n var cpuChartCtx = $('#cpuChart');\n var cpuChart = ChartService.CreateCPUChart(cpuChartCtx);\n $scope.cpuChart = cpuChart;\n\n var memoryChartCtx = $('#memoryChart');\n var memoryChart = ChartService.CreateMemoryChart(memoryChartCtx);\n $scope.memoryChart = memoryChart;\n\n var ioChartCtx = $('#ioChart');\n var ioChart = ChartService.CreateIOChart(ioChartCtx);\n $scope.ioChart = ioChart;\n\n startChartUpdate(networkChart, cpuChart, memoryChart, ioChart);\n }\n\n function initView() {\n HttpRequestHelper.setPortainerAgentTargetHeader($transition$.params().nodeName);\n ContainerService.container($transition$.params().id)\n .then(function success(data) {\n $scope.container = data;\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve container information');\n });\n\n $document.ready(function () {\n initCharts();\n });\n }\n\n initView();\n },\n]);\n","import angular from 'angular';\nimport _ from 'lodash';\n\nangular.module('portainer.docker').controller('DashboardController', [\n '$scope',\n '$q',\n 'Authentication',\n 'ContainerService',\n 'ImageService',\n 'NetworkService',\n 'VolumeService',\n 'SystemService',\n 'ServiceService',\n 'StackService',\n 'EndpointService',\n 'Notifications',\n 'EndpointProvider',\n 'StateManager',\n 'TagService',\n 'endpoint',\n function (\n $scope,\n $q,\n Authentication,\n ContainerService,\n ImageService,\n NetworkService,\n VolumeService,\n SystemService,\n ServiceService,\n StackService,\n EndpointService,\n Notifications,\n EndpointProvider,\n StateManager,\n TagService,\n endpoint\n ) {\n $scope.dismissInformationPanel = function (id) {\n StateManager.dismissInformationPanel(id);\n };\n\n $scope.offlineMode = false;\n $scope.showStacks = false;\n\n async function initView() {\n const endpointMode = $scope.applicationState.endpoint.mode;\n const endpointId = EndpointProvider.endpointID();\n $scope.endpointId = endpointId;\n\n $scope.showStacks = await shouldShowStacks();\n\n $q.all({\n containers: ContainerService.containers(1),\n images: ImageService.images(false),\n volumes: VolumeService.volumes(),\n networks: NetworkService.networks(true, true, true),\n services: endpointMode.provider === 'DOCKER_SWARM_MODE' && endpointMode.role === 'MANAGER' ? ServiceService.services() : [],\n stacks: StackService.stacks(true, endpointMode.provider === 'DOCKER_SWARM_MODE' && endpointMode.role === 'MANAGER', endpointId),\n info: SystemService.info(),\n endpoint: EndpointService.endpoint(endpointId),\n tags: TagService.tags(),\n })\n .then(function success(data) {\n $scope.containers = data.containers;\n $scope.images = data.images;\n $scope.volumeCount = data.volumes.length;\n $scope.networkCount = data.networks.length;\n $scope.serviceCount = data.services.length;\n $scope.stackCount = data.stacks.length;\n $scope.info = data.info;\n $scope.endpoint = data.endpoint;\n $scope.endpointTags = $scope.endpoint.TagIds.length\n ? _.join(\n _.filter(\n _.map($scope.endpoint.TagIds, (id) => {\n const tag = data.tags.find((tag) => tag.Id === id);\n return tag ? tag.Name : '';\n }),\n Boolean\n ),\n ', '\n )\n : '-';\n $scope.offlineMode = EndpointProvider.offlineMode();\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to load dashboard data');\n });\n }\n\n async function shouldShowStacks() {\n const isAdmin = Authentication.isAdmin();\n\n return isAdmin || endpoint.SecuritySettings.allowStackManagementForRegularUsers;\n }\n\n initView();\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./docker-features-configuration.html');\n\nimport angular from 'angular';\n\nimport controller from './docker-features-configuration.controller';\n\nangular.module('portainer.docker').component('dockerFeaturesConfigurationView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n endpoint: '<',\n },\n});\n","var path = 'app/docker/views/docker-features-configuration/docker-features-configuration.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Docker features configuration\\\"></rd-header-title>\\n <rd-header-content>Docker configuration</rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\" name=\\\"$ctrl.form\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Host and Filesystem\\n </div>\\n <div ng-if=\\\"!$ctrl.isAgent\\\" class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n These features are only available for an Agent enabled environments.\\n </span>\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <por-switch-field\\n ng-model=\\\"$ctrl.formValues.enableHostManagementFeatures\\\"\\n name=\\\"enableHostManagementFeatures\\\"\\n label=\\\"Enable host management features\\\"\\n tooltip=\\\"Enable host management features: host system browsing and advanced host details.\\\"\\n disabled=\\\"!$ctrl.isAgent\\\"\\n label-class=\\\"col-sm-7 col-lg-4\\\"\\n ></por-switch-field>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <por-switch-field\\n ng-model=\\\"$ctrl.formValues.allowVolumeBrowserForRegularUsers\\\"\\n name=\\\"allowVolumeBrowserForRegularUsers\\\"\\n label=\\\"Enable volume management for non-administrators\\\"\\n tooltip=\\\"When enabled, regular users will be able to use Portainer volume management features.\\\"\\n disabled=\\\"!$ctrl.isAgent\\\"\\n label-class=\\\"col-sm-7 col-lg-4\\\"\\n ></por-switch-field>\\n </div>\\n </div>\\n <!-- auto update window -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Change Window Setting\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <por-switch-field\\n ng-model=\\\"$ctrl.state.autoUpdateSettings.Enabled\\\"\\n name=\\\"disableSysctlSettingForRegularUsers\\\"\\n label=\\\"Enable Change Window\\\"\\n label-class=\\\"col-sm-7 col-lg-4\\\"\\n feature=\\\"$ctrl.limitedFeature\\\"\\n tooltip=\\\"Specify a timeframe during which automatic updates can occur in this environment.\\\"\\n >\\n </por-switch-field>\\n </div>\\n </div>\\n\\n <!-- security -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Docker Security Settings\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <por-switch-field\\n ng-model=\\\"$ctrl.formValues.disableBindMountsForRegularUsers\\\"\\n name=\\\"disableBindMountsForRegularUsers\\\"\\n label=\\\"Disable bind mounts for non-administrators\\\"\\n tooltip=\\\"When enabled, regular users will not be able to use bind mounts when creating containers.\\\"\\n label-class=\\\"col-sm-7 col-lg-4\\\"\\n ></por-switch-field>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <por-switch-field\\n ng-model=\\\"$ctrl.formValues.disablePrivilegedModeForRegularUsers\\\"\\n name=\\\"disablePrivilegedModeForRegularUsers\\\"\\n label=\\\"Disable privileged mode for non-administrators\\\"\\n tooltip=\\\"When enabled, regular users will not be able to use privileged mode when creating containers.\\\"\\n label-class=\\\"col-sm-7 col-lg-4\\\"\\n ></por-switch-field>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <por-switch-field\\n ng-model=\\\"$ctrl.formValues.disableHostNamespaceForRegularUsers\\\"\\n name=\\\"disableHostNamespaceForRegularUsers\\\"\\n label=\\\"Disable the use of host PID 1 for non-administrators\\\"\\n tooltip=\\\"Prevent users from accessing the host filesystem through the host PID namespace.\\\"\\n label-class=\\\"col-sm-7 col-lg-4\\\"\\n ></por-switch-field>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <por-switch-field\\n ng-model=\\\"$ctrl.formValues.disableStackManagementForRegularUsers\\\"\\n name=\\\"disableStackManagementForRegularUsers\\\"\\n label=\\\"Disable the use of Stacks for non-administrators\\\"\\n label-class=\\\"col-sm-7 col-lg-4\\\"\\n ></por-switch-field>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <por-switch-field\\n ng-model=\\\"$ctrl.formValues.disableDeviceMappingForRegularUsers\\\"\\n name=\\\"disableDeviceMappingForRegularUsers\\\"\\n label=\\\"Disable device mappings for non-administrators\\\"\\n label-class=\\\"col-sm-7 col-lg-4\\\"\\n ></por-switch-field>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <por-switch-field\\n ng-model=\\\"$ctrl.formValues.disableContainerCapabilitiesForRegularUsers\\\"\\n name=\\\"disableContainerCapabilitiesForRegularUsers\\\"\\n label=\\\"Disable container capabilities for non-administrators\\\"\\n label-class=\\\"col-sm-7 col-lg-4\\\"\\n ></por-switch-field>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <por-switch-field\\n ng-model=\\\"$ctrl.formValues.disableSysctlSettingForRegularUsers\\\"\\n name=\\\"disableSysctlSettingForRegularUsers\\\"\\n label=\\\"Disable sysctl settings for non-administrators\\\"\\n label-class=\\\"col-sm-7 col-lg-4\\\"\\n ></por-switch-field>\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\" ng-if=\\\"$ctrl.isContainerEditDisabled()\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Note: The recreate/duplicate/edit feature is currently disabled (for non-admin users) by one or more security settings.\\n </span>\\n </div>\\n <!-- !security -->\\n\\n <!-- actions -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-primary btn-sm\\\" ng-click=\\\"$ctrl.save()\\\" ng-disabled=\\\"$ctrl.state.actionInProgress\\\" button-spinner=\\\"$ctrl.state.actionInProgress\\\">\\n <span ng-hide=\\\"$ctrl.state.actionInProgress\\\">Save configuration</span>\\n <span ng-show=\\\"$ctrl.state.actionInProgress\\\">Saving...</span>\\n </button>\\n </div>\\n </div>\\n <!-- !actions -->\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import moment from 'moment';\n\nangular.module('portainer.docker').controller('EventsController', [\n '$scope',\n 'Notifications',\n 'SystemService',\n function ($scope, Notifications, SystemService) {\n function initView() {\n var from = moment().subtract(24, 'hour').unix();\n var to = moment().unix();\n\n SystemService.events(from, to)\n .then(function success(data) {\n $scope.events = data;\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to load events');\n });\n }\n\n initView();\n },\n]);\n","angular.module('portainer.docker').controller('HostBrowserViewController', [\n 'SystemService',\n 'Notifications',\n function HostBrowserViewController(SystemService, Notifications) {\n var ctrl = this;\n ctrl.$onInit = $onInit;\n\n function $onInit() {\n SystemService.info()\n .then(function onInfoLoaded(host) {\n ctrl.host = host;\n })\n .catch(function onError(err) {\n Notifications.error('Unable to retrieve host information', err);\n });\n }\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./host-browser-view.html');\n\nangular.module('portainer.docker').component('hostBrowserView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'HostBrowserViewController',\n});\n","var path = 'app/docker/views/host/host-browser-view/host-browser-view.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Host Browser\\\"></rd-header-title>\\n <rd-header-content>\\n Host > <a ui-sref=\\\"docker.host\\\">{{ $ctrl.host.Name }}</a> > browse\\n </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <host-browser ng-if=\\\"$ctrl.host\\\"></host-browser>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","angular.module('portainer.docker').controller('HostViewController', [\n '$q',\n 'SystemService',\n 'Notifications',\n 'StateManager',\n 'AgentService',\n 'ContainerService',\n 'Authentication',\n 'EndpointProvider',\n function HostViewController($q, SystemService, Notifications, StateManager, AgentService, ContainerService, Authentication, EndpointProvider) {\n var ctrl = this;\n\n this.$onInit = initView;\n\n ctrl.state = {\n isAgent: false,\n isAdmin: false,\n offlineMode: false,\n };\n\n this.engineDetails = {};\n this.hostDetails = {};\n this.devices = null;\n this.disks = null;\n\n function initView() {\n var applicationState = StateManager.getState();\n ctrl.state.isAgent = applicationState.endpoint.mode.agentProxy;\n ctrl.state.isAdmin = Authentication.isAdmin();\n var agentApiVersion = applicationState.endpoint.agentApiVersion;\n ctrl.state.agentApiVersion = agentApiVersion;\n ctrl.state.enableHostManagementFeatures = ctrl.endpoint.SecuritySettings.enableHostManagementFeatures;\n\n $q.all({\n version: SystemService.version(),\n info: SystemService.info(),\n jobs: ctrl.state.isAdmin ? ContainerService.containers(true, { label: ['io.portainer.job.endpoint'] }) : [],\n })\n .then(function success(data) {\n ctrl.engineDetails = buildEngineDetails(data);\n ctrl.hostDetails = buildHostDetails(data.info);\n ctrl.state.offlineMode = EndpointProvider.offlineMode();\n ctrl.jobs = data.jobs;\n\n if (ctrl.state.isAgent && agentApiVersion > 1) {\n return AgentService.hostInfo(data.info.Hostname).then(function onHostInfoLoad(agentHostInfo) {\n ctrl.devices = agentHostInfo.PCIDevices;\n ctrl.disks = agentHostInfo.PhysicalDisks;\n });\n }\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve engine details');\n });\n }\n\n function buildEngineDetails(data) {\n var versionDetails = data.version;\n var info = data.info;\n return {\n releaseVersion: versionDetails.Version,\n apiVersion: versionDetails.ApiVersion,\n rootDirectory: info.DockerRootDir,\n storageDriver: info.Driver,\n loggingDriver: info.LoggingDriver,\n volumePlugins: info.Plugins.Volume,\n networkPlugins: info.Plugins.Network,\n };\n }\n\n function buildHostDetails(info) {\n return {\n os: {\n arch: info.Architecture,\n type: info.OSType,\n name: info.OperatingSystem,\n },\n name: info.Name,\n kernelVersion: info.KernelVersion,\n totalCPU: info.NCPU,\n totalMemory: info.MemTotal,\n };\n }\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./host-view.html');\n\nangular.module('portainer.docker').component('hostView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'HostViewController',\n bindings: {\n endpoint: '<',\n },\n});\n","var path = 'app/docker/views/host/host-view.html';\nvar html = \"<host-overview\\n engine-details=\\\"$ctrl.engineDetails\\\"\\n host-details=\\\"$ctrl.hostDetails\\\"\\n is-agent=\\\"$ctrl.state.isAgent\\\"\\n agent-api-version=\\\"$ctrl.state.agentApiVersion\\\"\\n disks=\\\"$ctrl.disks\\\"\\n devices=\\\"$ctrl.devices\\\"\\n refresh-url=\\\"docker.host\\\"\\n browse-url=\\\"docker.host.browser\\\"\\n offline-mode=\\\"$ctrl.state.offlineMode\\\"\\n host-features-enabled=\\\"$ctrl.state.enableHostManagementFeatures\\\"\\n></host-overview>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","angular.module('portainer.docker').controller('BuildImageController', BuildImageController);\n\nfunction BuildImageController($scope, $async, $window, ModalService, BuildService, Notifications, HttpRequestHelper) {\n $scope.state = {\n BuildType: 'editor',\n actionInProgress: false,\n activeTab: 0,\n isEditorDirty: false,\n };\n\n $scope.formValues = {\n ImageNames: [{ Name: '' }],\n UploadFile: null,\n DockerFileContent: '',\n URL: '',\n Path: 'Dockerfile',\n NodeName: null,\n };\n\n $window.onbeforeunload = () => {\n if ($scope.state.BuildType === 'editor' && $scope.formValues.DockerFileContent && $scope.state.isEditorDirty) {\n return '';\n }\n };\n\n $scope.$on('$destroy', function () {\n $scope.state.isEditorDirty = false;\n });\n\n $scope.addImageName = function () {\n $scope.formValues.ImageNames.push({ Name: '' });\n };\n\n $scope.removeImageName = function (index) {\n $scope.formValues.ImageNames.splice(index, 1);\n };\n\n function buildImageBasedOnBuildType(method, names) {\n var buildType = $scope.state.BuildType;\n var dockerfilePath = $scope.formValues.Path;\n\n if (buildType === 'upload') {\n var file = $scope.formValues.UploadFile;\n return BuildService.buildImageFromUpload(names, file, dockerfilePath);\n } else if (buildType === 'url') {\n var URL = $scope.formValues.URL;\n return BuildService.buildImageFromURL(names, URL, dockerfilePath);\n } else {\n var dockerfileContent = $scope.formValues.DockerFileContent;\n return BuildService.buildImageFromDockerfileContent(names, dockerfileContent);\n }\n }\n\n $scope.buildImage = buildImage;\n\n async function buildImage() {\n return $async(async () => {\n var buildType = $scope.state.BuildType;\n\n if (buildType === 'editor' && $scope.formValues.DockerFileContent === '') {\n $scope.state.formValidationError = 'Dockerfile content must not be empty';\n return;\n }\n\n $scope.state.actionInProgress = true;\n\n var imageNames = $scope.formValues.ImageNames.filter(function filterNull(x) {\n return x.Name;\n }).map(function getNames(x) {\n return x.Name;\n });\n\n var nodeName = $scope.formValues.NodeName;\n HttpRequestHelper.setPortainerAgentTargetHeader(nodeName);\n\n try {\n const data = await buildImageBasedOnBuildType(buildType, imageNames);\n $scope.buildLogs = data.buildLogs;\n $scope.state.activeTab = 1;\n if (data.hasError) {\n Notifications.error('An error occurred during build', { msg: 'Please check build logs output' });\n } else {\n Notifications.success('Image successfully built');\n $scope.state.isEditorDirty = false;\n }\n } catch (err) {\n Notifications.error('Failure', err, 'Unable to build image');\n } finally {\n $scope.state.actionInProgress = false;\n }\n });\n }\n\n $scope.validImageNames = function () {\n for (var i = 0; i < $scope.formValues.ImageNames.length; i++) {\n var item = $scope.formValues.ImageNames[i];\n if (item.Name !== '') {\n return true;\n }\n }\n return false;\n };\n\n $scope.editorUpdate = function (cm) {\n $scope.formValues.DockerFileContent = cm.getValue();\n $scope.state.isEditorDirty = true;\n };\n\n this.uiCanExit = async function () {\n if ($scope.state.BuildType === 'editor' && $scope.formValues.DockerFileContent && $scope.state.isEditorDirty) {\n return ModalService.confirmWebEditorDiscard();\n }\n };\n}\n","import _ from 'lodash-es';\nimport { PorImageRegistryModel } from 'Docker/models/porImageRegistry';\n\nangular.module('portainer.docker').controller('ImageController', [\n '$async',\n '$q',\n '$scope',\n '$transition$',\n '$state',\n 'Authentication',\n 'ImageService',\n 'ImageHelper',\n 'RegistryService',\n 'Notifications',\n 'HttpRequestHelper',\n 'ModalService',\n 'FileSaver',\n 'Blob',\n 'endpoint',\n 'EndpointService',\n 'RegistryModalService',\n function (\n $async,\n $q,\n $scope,\n $transition$,\n $state,\n Authentication,\n ImageService,\n ImageHelper,\n RegistryService,\n Notifications,\n HttpRequestHelper,\n ModalService,\n FileSaver,\n Blob,\n endpoint,\n EndpointService,\n RegistryModalService\n ) {\n $scope.endpoint = endpoint;\n $scope.isAdmin = Authentication.isAdmin();\n\n $scope.formValues = {\n RegistryModel: new PorImageRegistryModel(),\n };\n\n $scope.state = {\n exportInProgress: false,\n pullImageValidity: false,\n };\n\n $scope.sortType = 'Order';\n $scope.sortReverse = false;\n\n $scope.order = function (sortType) {\n $scope.sortReverse = $scope.sortType === sortType ? !$scope.sortReverse : false;\n $scope.sortType = sortType;\n };\n\n $scope.toggleLayerCommand = function (layerId) {\n $('#layer-command-expander' + layerId + ' span').toggleClass('glyphicon-plus-sign glyphicon-minus-sign');\n $('#layer-command-' + layerId + '-short').toggle();\n $('#layer-command-' + layerId + '-full').toggle();\n };\n\n $scope.setPullImageValidity = setPullImageValidity;\n function setPullImageValidity(validity) {\n $scope.state.pullImageValidity = validity;\n }\n\n $scope.tagImage = function () {\n const registryModel = $scope.formValues.RegistryModel;\n\n const image = ImageHelper.createImageConfigForContainer(registryModel);\n\n ImageService.tagImage($transition$.params().id, image.fromImage)\n .then(function success() {\n Notifications.success('Image successfully tagged');\n $state.go('docker.images.image', { id: $transition$.params().id }, { reload: true });\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to tag image');\n });\n };\n\n $scope.pushTag = pushTag;\n\n async function pushTag(repository) {\n return $async(async () => {\n try {\n const registryModel = await RegistryModalService.registryModal(repository, $scope.registries);\n if (registryModel) {\n $('#uploadResourceHint').show();\n await ImageService.pushImage(registryModel);\n Notifications.success('Image successfully pushed', repository);\n }\n } catch (err) {\n Notifications.error('Failure', err, 'Unable to push image to repository');\n } finally {\n $('#uploadResourceHint').hide();\n }\n });\n }\n\n $scope.pullTag = pullTag;\n async function pullTag(repository) {\n return $async(async () => {\n try {\n const registryModel = await RegistryModalService.registryModal(repository, $scope.registries);\n if (registryModel) {\n $('#downloadResourceHint').show();\n await ImageService.pullImage(registryModel);\n Notifications.success('Image successfully pulled', repository);\n }\n } catch (err) {\n Notifications.error('Failure', err, 'Unable to pull image from repository');\n } finally {\n $('#downloadResourceHint').hide();\n }\n });\n }\n\n $scope.removeTag = function (repository) {\n ImageService.deleteImage(repository, false)\n .then(function success() {\n if ($scope.image.RepoTags.length === 1) {\n Notifications.success('Image successfully deleted', repository);\n $state.go('docker.images', {}, { reload: true });\n } else {\n Notifications.success('Tag successfully deleted', repository);\n $state.go('docker.images.image', { id: $transition$.params().id }, { reload: true });\n }\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to remove image');\n });\n };\n\n $scope.removeImage = function (id) {\n ImageService.deleteImage(id, false)\n .then(function success() {\n Notifications.success('Image successfully deleted', id);\n $state.go('docker.images', {}, { reload: true });\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to remove image');\n });\n };\n\n function exportImage(image) {\n HttpRequestHelper.setPortainerAgentTargetHeader(image.NodeName);\n $scope.state.exportInProgress = true;\n ImageService.downloadImages([image])\n .then(function success(data) {\n var downloadData = new Blob([data.file], { type: 'application/x-tar' });\n FileSaver.saveAs(downloadData, 'images.tar');\n Notifications.success('Image successfully downloaded');\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to download image');\n })\n .finally(function final() {\n $scope.state.exportInProgress = false;\n });\n }\n\n $scope.exportImage = function (image) {\n if (image.RepoTags.length === 0 || _.includes(image.RepoTags, '<none>')) {\n Notifications.warning('', 'Cannot download a untagged image');\n return;\n }\n\n ModalService.confirmImageExport(function (confirmed) {\n if (!confirmed) {\n return;\n }\n exportImage(image);\n });\n };\n\n async function initView() {\n HttpRequestHelper.setPortainerAgentTargetHeader($transition$.params().nodeName);\n\n try {\n $scope.registries = await RegistryService.loadRegistriesForDropdown(endpoint.Id);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to load registries');\n }\n\n $q.all({\n image: ImageService.image($transition$.params().id),\n history: ImageService.history($transition$.params().id),\n })\n .then(function success(data) {\n $scope.image = data.image;\n $scope.history = data.history;\n $scope.image.Env = _.sortBy($scope.image.Env, _.toLower);\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve image details');\n $state.go('docker.images');\n });\n }\n\n initView();\n },\n]);\n","import _ from 'lodash-es';\nimport { PorImageRegistryModel } from 'Docker/models/porImageRegistry';\n\nangular.module('portainer.docker').controller('ImagesController', [\n '$scope',\n '$state',\n 'Authentication',\n 'ImageService',\n 'Notifications',\n 'ModalService',\n 'HttpRequestHelper',\n 'FileSaver',\n 'Blob',\n 'EndpointProvider',\n 'endpoint',\n function ($scope, $state, Authentication, ImageService, Notifications, ModalService, HttpRequestHelper, FileSaver, Blob, EndpointProvider, endpoint) {\n $scope.endpoint = endpoint;\n $scope.isAdmin = Authentication.isAdmin();\n\n $scope.state = {\n actionInProgress: false,\n exportInProgress: false,\n pullRateValid: false,\n };\n\n $scope.formValues = {\n RegistryModel: new PorImageRegistryModel(),\n NodeName: null,\n };\n\n $scope.pullImage = function () {\n const registryModel = $scope.formValues.RegistryModel;\n\n var nodeName = $scope.formValues.NodeName;\n HttpRequestHelper.setPortainerAgentTargetHeader(nodeName);\n\n $scope.state.actionInProgress = true;\n ImageService.pullImage(registryModel, false)\n .then(function success(data) {\n var err = data[data.length - 1].errorDetail;\n if (err) {\n return Notifications.error('Failure', err, 'Unable to pull image');\n }\n Notifications.success('Image successfully pulled', registryModel.Image);\n $state.reload();\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to pull image');\n })\n .finally(function final() {\n $scope.state.actionInProgress = false;\n });\n };\n\n $scope.confirmRemovalAction = function (selectedItems, force) {\n ModalService.confirmImageForceRemoval(function (confirmed) {\n if (!confirmed) {\n return;\n }\n $scope.removeAction(selectedItems, force);\n });\n };\n\n function isAuthorizedToDownload(selectedItems) {\n for (var i = 0; i < selectedItems.length; i++) {\n var image = selectedItems[i];\n\n var untagged = _.find(image.RepoTags, function (item) {\n return item.indexOf('<none>') > -1;\n });\n\n if (untagged) {\n Notifications.warning('', 'Cannot download a untagged image');\n return false;\n }\n }\n\n if (_.uniqBy(selectedItems, 'NodeName').length > 1) {\n Notifications.warning('', 'Cannot download images from different nodes at the same time');\n return false;\n }\n\n return true;\n }\n\n function exportImages(images) {\n HttpRequestHelper.setPortainerAgentTargetHeader(images[0].NodeName);\n $scope.state.exportInProgress = true;\n ImageService.downloadImages(images)\n .then(function success(data) {\n var downloadData = new Blob([data.file], { type: 'application/x-tar' });\n FileSaver.saveAs(downloadData, 'images.tar');\n Notifications.success('Image(s) successfully downloaded');\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to download image(s)');\n })\n .finally(function final() {\n $scope.state.exportInProgress = false;\n });\n }\n\n $scope.downloadAction = function (selectedItems) {\n if (!isAuthorizedToDownload(selectedItems)) {\n return;\n }\n\n ModalService.confirmImageExport(function (confirmed) {\n if (!confirmed) {\n return;\n }\n exportImages(selectedItems);\n });\n };\n\n $scope.removeAction = function (selectedItems, force) {\n var actionCount = selectedItems.length;\n angular.forEach(selectedItems, function (image) {\n HttpRequestHelper.setPortainerAgentTargetHeader(image.NodeName);\n ImageService.deleteImage(image.Id, force)\n .then(function success() {\n Notifications.success('Image successfully removed', image.Id);\n var index = $scope.images.indexOf(image);\n $scope.images.splice(index, 1);\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to remove image');\n })\n .finally(function final() {\n --actionCount;\n if (actionCount === 0) {\n $state.reload();\n }\n });\n });\n };\n\n $scope.offlineMode = false;\n\n $scope.getImages = getImages;\n function getImages() {\n ImageService.images(true)\n .then(function success(data) {\n $scope.images = data;\n $scope.offlineMode = EndpointProvider.offlineMode();\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve images');\n $scope.images = [];\n });\n }\n\n $scope.setPullImageValidity = setPullImageValidity;\n function setPullImageValidity(validity) {\n $scope.state.pullRateValid = validity;\n }\n\n function initView() {\n getImages();\n }\n\n initView();\n },\n]);\n","import { PorImageRegistryModel } from 'Docker/models/porImageRegistry';\n\nangular.module('portainer.docker').controller('ImportImageController', [\n '$scope',\n '$state',\n 'ImageService',\n 'Notifications',\n 'HttpRequestHelper',\n 'Authentication',\n 'ImageHelper',\n 'endpoint',\n function ($scope, $state, ImageService, Notifications, HttpRequestHelper, Authentication, ImageHelper, endpoint) {\n $scope.state = {\n actionInProgress: false,\n };\n\n $scope.endpoint = endpoint;\n\n $scope.isAdmin = Authentication.isAdmin();\n\n $scope.formValues = {\n UploadFile: null,\n NodeName: null,\n RegistryModel: new PorImageRegistryModel(),\n };\n\n $scope.setPullImageValidity = setPullImageValidity;\n function setPullImageValidity(validity) {\n $scope.state.pullImageValidity = validity;\n }\n\n async function tagImage(id) {\n const registryModel = $scope.formValues.RegistryModel;\n if (registryModel.Image) {\n const image = ImageHelper.createImageConfigForContainer(registryModel);\n try {\n await ImageService.tagImage(id, image.fromImage);\n } catch (err) {\n Notifications.error('Failure', err, 'Unable to tag image');\n }\n }\n }\n\n $scope.uploadImage = async function () {\n $scope.state.actionInProgress = true;\n\n var nodeName = $scope.formValues.NodeName;\n HttpRequestHelper.setPortainerAgentTargetHeader(nodeName);\n var file = $scope.formValues.UploadFile;\n try {\n const { data } = await ImageService.uploadImage(file);\n if (data.error) {\n Notifications.error('Failure', data.error, 'Unable to upload image');\n } else if (data.stream) {\n var regex = /Loaded.*?: (.*?)\\n$/g;\n var imageIds = regex.exec(data.stream);\n if (imageIds && imageIds.length == 2) {\n await tagImage(imageIds[1]);\n $state.go('docker.images.image', { id: imageIds[1] }, { reload: true });\n }\n Notifications.success('Images successfully uploaded');\n } else {\n Notifications.success('The uploaded tar file contained multiple images. The provided tag therefore has been ignored.');\n }\n } catch (err) {\n Notifications.error('Failure', err, 'Unable to upload image');\n } finally {\n $scope.state.actionInProgress = false;\n }\n };\n },\n]);\n","import _ from 'lodash-es';\nimport { AccessControlFormData } from '../../../../portainer/components/accessControlForm/porAccessControlFormModel';\nimport { MacvlanFormData } from '../../../components/network-macvlan-form/networkMacvlanFormModel';\n\nangular.module('portainer.docker').controller('CreateNetworkController', [\n '$q',\n '$scope',\n '$state',\n 'PluginService',\n 'Notifications',\n 'NetworkService',\n 'LabelHelper',\n 'Authentication',\n 'ResourceControlService',\n 'FormValidator',\n 'HttpRequestHelper',\n function ($q, $scope, $state, PluginService, Notifications, NetworkService, LabelHelper, Authentication, ResourceControlService, FormValidator, HttpRequestHelper) {\n $scope.formValues = {\n DriverOptions: [],\n IPV4: {\n Subnet: '',\n Gateway: '',\n IPRange: '',\n AuxiliaryAddresses: [],\n },\n IPV6: {\n Subnet: '',\n Gateway: '',\n IPRange: '',\n AuxiliaryAddresses: [],\n },\n Labels: [],\n AccessControlData: new AccessControlFormData(),\n NodeName: null,\n Macvlan: new MacvlanFormData(),\n };\n\n $scope.state = {\n formValidationError: '',\n actionInProgress: false,\n };\n\n $scope.availableNetworkDrivers = [];\n\n $scope.config = {\n Driver: 'bridge',\n CheckDuplicate: true,\n Internal: false,\n Attachable: false,\n EnableIPv6: false,\n // Force IPAM Driver to 'default', should not be required.\n // See: https://github.com/docker/docker/issues/25735\n IPAM: {\n Driver: 'default',\n Config: [],\n },\n Labels: {},\n };\n\n $scope.addDriverOption = function () {\n $scope.formValues.DriverOptions.push({\n name: '',\n value: '',\n });\n };\n\n $scope.removeDriverOption = function (index) {\n $scope.formValues.DriverOptions.splice(index, 1);\n };\n\n $scope.addLabel = function () {\n $scope.formValues.Labels.push({\n key: '',\n value: '',\n });\n };\n\n $scope.removeLabel = function (index) {\n $scope.formValues.Labels.splice(index, 1);\n };\n\n $scope.addIPV4AuxAddress = function () {\n $scope.formValues.IPV4.AuxiliaryAddresses.push('');\n };\n\n $scope.addIPV6AuxAddress = function () {\n $scope.formValues.IPV6.AuxiliaryAddresses.push('');\n };\n\n $scope.removeIPV4AuxAddress = function (index) {\n $scope.formValues.IPV4.AuxiliaryAddresses.splice(index, 1);\n $scope.state.IPV4AuxiliaryAddressesError.splice(index, 1);\n };\n\n $scope.removeIPV6AuxAddress = function (index) {\n $scope.formValues.IPV6.AuxiliaryAddresses.splice(index, 1);\n $scope.state.IPV6AuxiliaryAddressesError.splice(index, 1);\n };\n\n function checkAuxiliaryAddress(excludedIP, gateway) {\n const split = _.split(excludedIP, '=');\n\n if (split.length === 2) {\n return split[1] === gateway;\n }\n return excludedIP === gateway;\n }\n\n $scope.checkIPV4AuxiliaryAddress = function (index) {\n $scope.state.IPV4AuxiliaryAddressesError[index] = checkAuxiliaryAddress($scope.formValues.IPV4.AuxiliaryAddresses[index], $scope.formValues.IPV4.Gateway);\n };\n\n $scope.checkIPV6AuxiliaryAddress = function (index) {\n $scope.state.IPV6AuxiliaryAddressesError[index] = checkAuxiliaryAddress($scope.formValues.IPV6.AuxiliaryAddresses[index], $scope.formValues.IPV6.Gateway);\n };\n\n $scope.isValid = function () {\n const validIPV4 = !_.reduce($scope.state.IPV4AuxiliaryAddressesError, (acc, item) => acc || item, false);\n const validIPV6 = !_.reduce($scope.state.IPV6AuxiliaryAddressesError, (acc, item) => acc || item, false);\n return validIPV4 && validIPV6;\n };\n\n function prepareAuxiliaryAddresses(ipamConfig, ipFormValues) {\n ipamConfig.AuxiliaryAddresses = {};\n _.forEach(ipFormValues.AuxiliaryAddresses, (auxAddress, index) => {\n const split = _.split(auxAddress, '=');\n if (split.length === 2) {\n ipamConfig.AuxiliaryAddresses[split[0]] = split[1];\n } else {\n ipamConfig.AuxiliaryAddresses['device' + index] = auxAddress;\n }\n });\n }\n\n function prepareIPAMConfiguration(config) {\n if ($scope.formValues.IPV4.Subnet) {\n let ipamConfig = {};\n ipamConfig.Subnet = $scope.formValues.IPV4.Subnet;\n if ($scope.formValues.IPV4.Gateway) {\n ipamConfig.Gateway = $scope.formValues.IPV4.Gateway;\n }\n if ($scope.formValues.IPV4.IPRange) {\n ipamConfig.IPRange = $scope.formValues.IPV4.IPRange;\n }\n if ($scope.formValues.IPV4.AuxiliaryAddresses.length) {\n prepareAuxiliaryAddresses(ipamConfig, $scope.formValues.IPV4);\n }\n config.IPAM.Config.push(ipamConfig);\n }\n if ($scope.formValues.IPV6.Subnet) {\n let ipamConfig = {};\n ipamConfig.Subnet = $scope.formValues.IPV6.Subnet;\n if ($scope.formValues.IPV6.Gateway) {\n ipamConfig.Gateway = $scope.formValues.IPV6.Gateway;\n }\n if ($scope.formValues.IPV6.IPRange) {\n ipamConfig.IPRange = $scope.formValues.IPV6.IPRange;\n }\n if ($scope.formValues.IPV6.AuxiliaryAddresses.length) {\n prepareAuxiliaryAddresses(ipamConfig, $scope.formValues.IPV6);\n }\n config.EnableIPv6 = true;\n config.IPAM.Config.push(ipamConfig);\n }\n }\n\n function prepareDriverOptions(config) {\n var options = {};\n $scope.formValues.DriverOptions.forEach(function (option) {\n options[option.name] = option.value;\n });\n config.Options = options;\n }\n\n function prepareLabelsConfig(config) {\n config.Labels = LabelHelper.fromKeyValueToLabelHash($scope.formValues.Labels);\n }\n\n function prepareConfiguration() {\n var config = angular.copy($scope.config);\n prepareIPAMConfiguration(config);\n prepareDriverOptions(config);\n prepareLabelsConfig(config);\n return config;\n }\n\n function modifyNetworkConfigurationForMacvlanConfigOnly(config) {\n config.Internal = null;\n config.Attachable = null;\n config.ConfigOnly = true;\n config.Options.parent = $scope.formValues.Macvlan.ParentNetworkCard;\n }\n\n function modifyNetworkConfigurationForMacvlanConfigFrom(config, selectedNetworkConfig) {\n config.ConfigFrom = {\n Network: selectedNetworkConfig.Name,\n };\n if ($scope.applicationState.endpoint.mode.provider === 'DOCKER_SWARM_MODE') {\n config.Scope = 'swarm';\n } else {\n config.Scope = 'local';\n }\n }\n\n function validateForm(accessControlData, isAdmin) {\n $scope.state.formValidationError = '';\n var error = '';\n error = FormValidator.validateAccessControl(accessControlData, isAdmin);\n\n if (error) {\n $scope.state.formValidationError = error;\n return false;\n }\n return true;\n }\n\n function createNetwork(context) {\n HttpRequestHelper.setPortainerAgentTargetHeader(context.nodeName);\n HttpRequestHelper.setPortainerAgentManagerOperation(context.managerOperation);\n\n $scope.state.actionInProgress = true;\n NetworkService.create(context.networkConfiguration)\n .then(function success(data) {\n const userId = context.userDetails.ID;\n const accessControlData = context.accessControlData;\n const resourceControl = data.Portainer.ResourceControl;\n return ResourceControlService.applyResourceControl(userId, accessControlData, resourceControl);\n })\n .then(function success() {\n Notifications.success('Network successfully created');\n if (context.reload) {\n $state.go(\n 'docker.networks',\n {},\n {\n reload: true,\n }\n );\n }\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'An error occured during network creation');\n })\n .finally(function final() {\n $scope.state.actionInProgress = false;\n });\n }\n\n $scope.create = function () {\n var networkConfiguration = prepareConfiguration();\n var accessControlData = $scope.formValues.AccessControlData;\n var userDetails = Authentication.getUserDetails();\n var isAdmin = Authentication.isAdmin();\n\n if (!validateForm(accessControlData, isAdmin)) {\n return;\n }\n\n var creationContext = {\n nodeName: $scope.formValues.NodeName,\n managerOperation: false,\n networkConfiguration: networkConfiguration,\n userDetails: userDetails,\n accessControlData: accessControlData,\n reload: true,\n };\n\n if ($scope.applicationState.endpoint.mode.agentProxy && $scope.applicationState.endpoint.mode.provider === 'DOCKER_SWARM_MODE' && $scope.config.Driver === 'overlay') {\n creationContext.managerOperation = true;\n }\n\n if ($scope.config.Driver === 'macvlan') {\n if ($scope.formValues.Macvlan.Scope === 'local') {\n modifyNetworkConfigurationForMacvlanConfigOnly(networkConfiguration);\n } else if ($scope.formValues.Macvlan.Scope === 'swarm') {\n var selectedNetworkConfig = $scope.formValues.Macvlan.SelectedNetworkConfig;\n modifyNetworkConfigurationForMacvlanConfigFrom(networkConfiguration, selectedNetworkConfig);\n creationContext.nodeName = selectedNetworkConfig.NodeName;\n }\n }\n\n if (\n $scope.config.Driver === 'macvlan' &&\n $scope.formValues.Macvlan.Scope === 'local' &&\n $scope.applicationState.endpoint.mode.agentProxy &&\n $scope.applicationState.endpoint.mode.provider === 'DOCKER_SWARM_MODE'\n ) {\n var selectedNodes = $scope.formValues.Macvlan.DatatableState.selectedItems;\n selectedNodes.forEach(function (node, idx) {\n creationContext.nodeName = node.Hostname;\n creationContext.reload = idx === selectedNodes.length - 1 ? true : false;\n createNetwork(creationContext);\n });\n } else {\n createNetwork(creationContext);\n }\n };\n\n function initView() {\n var apiVersion = $scope.applicationState.endpoint.apiVersion;\n $scope.state.IPV4AuxiliaryAddressesError = [];\n $scope.state.IPV6AuxiliaryAddressesError = [];\n\n PluginService.networkPlugins(apiVersion < 1.25)\n .then(function success(data) {\n $scope.availableNetworkDrivers = data;\n $scope.availableNetworkDrivers = _.filter($scope.availableNetworkDrivers, (driver) => driver !== 'host' && driver !== 'null');\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve network drivers');\n });\n }\n\n initView();\n },\n]);\n","import DockerNetworkHelper from 'Docker/helpers/networkHelper';\n\nangular.module('portainer.docker').controller('NetworkController', [\n '$scope',\n '$state',\n '$transition$',\n '$filter',\n 'NetworkService',\n 'Container',\n 'Notifications',\n 'HttpRequestHelper',\n 'NetworkHelper',\n function ($scope, $state, $transition$, $filter, NetworkService, Container, Notifications, HttpRequestHelper, NetworkHelper) {\n $scope.removeNetwork = function removeNetwork() {\n NetworkService.remove($transition$.params().id, $transition$.params().id)\n .then(function success() {\n Notifications.success('Network removed', $transition$.params().id);\n $state.go('docker.networks', {});\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to remove network');\n });\n };\n\n $scope.containerLeaveNetwork = function containerLeaveNetwork(network, container) {\n HttpRequestHelper.setPortainerAgentTargetHeader(container.NodeName);\n NetworkService.disconnectContainer($transition$.params().id, container.Id, false)\n .then(function success() {\n Notifications.success('Container left network', $transition$.params().id);\n $state.go('docker.networks.network', { id: network.Id }, { reload: true });\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to disconnect container from network');\n });\n };\n\n $scope.isSystemNetwork = function () {\n return $scope.network && NetworkHelper.isSystemNetwork($scope.network);\n };\n\n $scope.allowRemove = function () {\n return !$scope.isSystemNetwork();\n };\n\n function filterContainersInNetwork(network, containers) {\n var containersInNetwork = [];\n containers.forEach(function (container) {\n var containerInNetwork = network.Containers[container.Id];\n if (containerInNetwork) {\n containerInNetwork.Id = container.Id;\n // Name is not available in Docker 1.9\n if (!containerInNetwork.Name) {\n containerInNetwork.Name = $filter('trimcontainername')(container.Names[0]);\n }\n containersInNetwork.push(containerInNetwork);\n }\n });\n $scope.containersInNetwork = containersInNetwork;\n }\n\n function getContainersInNetwork(network) {\n var apiVersion = $scope.applicationState.endpoint.apiVersion;\n if (network.Containers) {\n if (apiVersion < 1.24) {\n Container.query(\n {},\n function success(data) {\n var containersInNetwork = data.filter(function filter(container) {\n if (container.HostConfig.NetworkMode === network.Name) {\n return container;\n }\n });\n filterContainersInNetwork(network, containersInNetwork);\n },\n function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve containers in network');\n }\n );\n } else {\n Container.query(\n {\n filters: { network: [$transition$.params().id] },\n },\n function success(data) {\n filterContainersInNetwork(network, data);\n },\n function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve containers in network');\n }\n );\n }\n }\n }\n\n function initView() {\n var nodeName = $transition$.params().nodeName;\n HttpRequestHelper.setPortainerAgentTargetHeader(nodeName);\n $scope.nodeName = nodeName;\n NetworkService.network($transition$.params().id)\n .then(function success(data) {\n $scope.network = data;\n getContainersInNetwork(data);\n $scope.network.IPAM.IPV4Configs = DockerNetworkHelper.getIPV4Configs($scope.network.IPAM.Config);\n $scope.network.IPAM.IPV6Configs = DockerNetworkHelper.getIPV6Configs($scope.network.IPAM.Config);\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve network info');\n });\n }\n\n initView();\n },\n]);\n","import _ from 'lodash-es';\nimport DockerNetworkHelper from 'Docker/helpers/networkHelper';\n\nangular.module('portainer.docker').controller('NetworksController', [\n '$q',\n '$scope',\n '$state',\n 'NetworkService',\n 'Notifications',\n 'HttpRequestHelper',\n 'EndpointProvider',\n 'AgentService',\n function ($q, $scope, $state, NetworkService, Notifications, HttpRequestHelper, EndpointProvider, AgentService) {\n $scope.removeAction = function (selectedItems) {\n var actionCount = selectedItems.length;\n angular.forEach(selectedItems, function (network) {\n HttpRequestHelper.setPortainerAgentTargetHeader(network.NodeName);\n NetworkService.remove(network.Id)\n .then(function success() {\n Notifications.success('Network successfully removed', network.Name);\n var index = $scope.networks.indexOf(network);\n $scope.networks.splice(index, 1);\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to remove network');\n })\n .finally(function final() {\n --actionCount;\n if (actionCount === 0) {\n $state.reload();\n }\n });\n });\n };\n\n $scope.offlineMode = false;\n\n $scope.getNetworks = getNetworks;\n\n function groupSwarmNetworksManagerNodesFirst(networks, agents) {\n const getRole = (item) => _.find(agents, (agent) => agent.NodeName === item.NodeName).NodeRole;\n\n const nonSwarmNetworks = _.remove(networks, (item) => item.Scope !== 'swarm');\n const grouped = _.toArray(_.groupBy(networks, (item) => item.Id));\n const sorted = _.map(grouped, (arr) => _.sortBy(arr, (item) => getRole(item)));\n const arr = _.map(sorted, (a) => {\n const item = a[0];\n for (let i = 1; i < a.length; i++) {\n item.Subs.push(a[i]);\n }\n return item;\n });\n const res = _.concat(arr, ...nonSwarmNetworks);\n return res;\n }\n\n function getNetworks() {\n const req = {\n networks: NetworkService.networks(true, true, true),\n };\n\n if ($scope.applicationState.endpoint.mode.agentProxy && $scope.applicationState.endpoint.mode.provider === 'DOCKER_SWARM_MODE') {\n req.agents = AgentService.agents();\n }\n\n $q.all(req)\n .then((data) => {\n $scope.offlineMode = EndpointProvider.offlineMode();\n const networks = _.forEach(data.networks, (item) => (item.Subs = []));\n if ($scope.applicationState.endpoint.mode.agentProxy && $scope.applicationState.endpoint.mode.provider === 'DOCKER_SWARM_MODE') {\n $scope.networks = groupSwarmNetworksManagerNodesFirst(data.networks, data.agents);\n } else {\n $scope.networks = networks;\n }\n\n _.forEach($scope.networks, (network) => {\n network.IPAM.IPV4Configs = DockerNetworkHelper.getIPV4Configs(network.IPAM.Config);\n network.IPAM.IPV6Configs = DockerNetworkHelper.getIPV6Configs(network.IPAM.Config);\n });\n })\n .catch((err) => {\n $scope.networks = [];\n Notifications.error('Failure', err, 'Unable to retrieve networks');\n });\n }\n\n function initView() {\n getNetworks();\n }\n\n initView();\n },\n]);\n","angular.module('portainer.docker').controller('NodeBrowserController', [\n '$stateParams',\n 'NodeService',\n 'HttpRequestHelper',\n 'Notifications',\n function NodeBrowserController($stateParams, NodeService, HttpRequestHelper, Notifications) {\n var ctrl = this;\n ctrl.$onInit = $onInit;\n\n function $onInit() {\n ctrl.nodeId = $stateParams.id;\n\n NodeService.node(ctrl.nodeId)\n .then(function onNodeLoaded(node) {\n HttpRequestHelper.setPortainerAgentTargetHeader(node.Hostname);\n ctrl.node = node;\n })\n .catch(function onError(err) {\n Notifications.error('Unable to retrieve host information', err);\n });\n }\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./node-browser.html');\n\nangular.module('portainer.docker').component('nodeBrowserView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'NodeBrowserController',\n});\n","var path = 'app/docker/views/nodes/node-browser/node-browser.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Node Browser\\\"></rd-header-title>\\n <rd-header-content>\\n <a ui-sref=\\\"docker.swarm\\\">Swarm</a> > <a ui-sref=\\\"docker.nodes.node({ id: $ctrl.nodeId })\\\">{{ $ctrl.node.Hostname }}</a> > browse\\n </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <host-browser ng-if=\\\"$ctrl.node\\\"></host-browser>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","angular.module('portainer.docker').controller('NodeDetailsViewController', [\n '$q',\n '$stateParams',\n 'NodeService',\n 'StateManager',\n 'AgentService',\n 'ContainerService',\n 'Authentication',\n function NodeDetailsViewController($q, $stateParams, NodeService, StateManager, AgentService, ContainerService, Authentication) {\n var ctrl = this;\n\n ctrl.$onInit = initView;\n\n ctrl.state = {\n isAgent: false,\n isAdmin: false,\n };\n\n function initView() {\n var applicationState = StateManager.getState();\n ctrl.state.isAgent = applicationState.endpoint.mode.agentProxy;\n ctrl.state.isAdmin = Authentication.isAdmin();\n ctrl.state.enableHostManagementFeatures = ctrl.endpoint.SecuritySettings.enableHostManagementFeatures;\n\n var fetchJobs = ctrl.state.isAdmin && ctrl.state.isAgent;\n\n var nodeId = $stateParams.id;\n $q.all({\n node: NodeService.node(nodeId),\n jobs: fetchJobs ? ContainerService.containers(true, { label: ['io.portainer.job.endpoint'] }) : [],\n }).then(function (data) {\n var node = data.node;\n ctrl.originalNode = node;\n ctrl.hostDetails = buildHostDetails(node);\n ctrl.engineDetails = buildEngineDetails(node);\n ctrl.nodeDetails = buildNodeDetails(node);\n ctrl.jobs = data.jobs;\n if (ctrl.state.isAgent) {\n var agentApiVersion = applicationState.endpoint.agentApiVersion;\n ctrl.state.agentApiVersion = agentApiVersion;\n if (agentApiVersion < 2) {\n return;\n }\n\n AgentService.hostInfo(node.Hostname).then(function onHostInfoLoad(agentHostInfo) {\n ctrl.devices = agentHostInfo.PCIDevices;\n ctrl.disks = agentHostInfo.PhysicalDisks;\n });\n }\n });\n }\n\n function buildHostDetails(node) {\n return {\n os: {\n arch: node.PlatformArchitecture,\n type: node.PlatformOS,\n },\n name: node.Hostname,\n totalCPU: node.CPUs / 1e9,\n totalMemory: node.Memory,\n };\n }\n\n function buildEngineDetails(node) {\n return {\n releaseVersion: node.EngineVersion,\n volumePlugins: transformPlugins(node.Plugins, 'Volume'),\n networkPlugins: transformPlugins(node.Plugins, 'Network'),\n engineLabels: node.EngineLabels,\n };\n }\n\n function buildNodeDetails(node) {\n return {\n name: node.Name,\n role: node.Role,\n managerAddress: node.ManagerAddr,\n availability: node.Availability,\n status: node.Status,\n nodeLabels: node.Labels,\n };\n }\n\n function transformPlugins(pluginsList, type) {\n return pluginsList\n .filter(function (plugin) {\n return plugin.Type === type;\n })\n .map(function (plugin) {\n return plugin.Name;\n });\n }\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./node-details-view.html');\n\nangular.module('portainer.docker').component('nodeDetailsView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'NodeDetailsViewController',\n bindings: {\n endpoint: '<',\n },\n});\n","var path = 'app/docker/views/nodes/node-details/node-details-view.html';\nvar html = \"<host-overview\\n agent-api-version=\\\"$ctrl.state.agentApiVersion\\\"\\n is-agent=\\\"$ctrl.state.isAgent\\\"\\n host-details=\\\"$ctrl.hostDetails\\\"\\n engine-details=\\\"$ctrl.engineDetails\\\"\\n disks=\\\"$ctrl.disks\\\"\\n devices=\\\"$ctrl.devices\\\"\\n refresh-url=\\\"docker.nodes.node\\\"\\n browse-url=\\\"docker.nodes.node.browse\\\"\\n is-job-enabled=\\\"$ctrl.state.isAdmin && $ctrl.state.isAgent\\\"\\n host-features-enabled=\\\"$ctrl.state.enableHostManagementFeatures\\\"\\n job-url=\\\"docker.nodes.node.job\\\"\\n jobs=\\\"$ctrl.jobs\\\"\\n>\\n <swarm-node-details-panel details=\\\"$ctrl.nodeDetails\\\" original-node=\\\"$ctrl.originalNode\\\"></swarm-node-details-panel>\\n</host-overview>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./registryAccess.html');\n\nangular.module('portainer.docker').component('dockerRegistryAccessView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'DockerRegistryAccessController',\n bindings: {\n endpoint: '<',\n },\n});\n","var path = 'app/docker/views/registries/access/registryAccess.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Registry access\\\"></rd-header-title>\\n <rd-header-content> <a ui-sref=\\\"docker.registries\\\">Registries</a> > {{ $ctrl.registry.Name }} > Access management </rd-header-content>\\n</rd-header>\\n\\n<registry-details registry=\\\"$ctrl.registry\\\" ng-if=\\\"$ctrl.registry\\\"></registry-details>\\n\\n<por-access-management\\n ng-if=\\\"$ctrl.registry && $ctrl.endpointGroup\\\"\\n access-controlled-entity=\\\"$ctrl.registryEndpointAccesses\\\"\\n entity-type=\\\"registry\\\"\\n action-in-progress=\\\"$ctrl.state.actionInProgress\\\"\\n update-access=\\\"$ctrl.updateAccess\\\"\\n filter-users=\\\"$ctrl.filterUsers\\\"\\n>\\n</por-access-management>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import { TeamAccessViewModel, UserAccessViewModel } from 'Portainer/models/access';\n\nclass DockerRegistryAccessController {\n /* @ngInject */\n constructor($async, $state, Notifications, EndpointService, GroupService) {\n this.$async = $async;\n this.$state = $state;\n this.Notifications = Notifications;\n this.EndpointService = EndpointService;\n this.GroupService = GroupService;\n\n this.updateAccess = this.updateAccess.bind(this);\n this.filterUsers = this.filterUsers.bind(this);\n }\n\n updateAccess() {\n return this.$async(async () => {\n this.state.actionInProgress = true;\n try {\n await this.EndpointService.updateRegistryAccess(this.state.endpointId, this.state.registryId, this.registryEndpointAccesses);\n this.Notifications.success('Access successfully updated');\n this.$state.reload();\n } catch (err) {\n this.state.actionInProgress = false;\n this.Notifications.error('Failure', err, 'Unable to update accesses');\n }\n });\n }\n\n filterUsers(users) {\n const endpointUsers = this.endpoint.UserAccessPolicies;\n const endpointTeams = this.endpoint.TeamAccessPolicies;\n\n const endpointGroupUsers = this.endpointGroup.UserAccessPolicies;\n const endpointGroupTeams = this.endpointGroup.TeamAccessPolicies;\n\n return users.filter((userOrTeam) => {\n const userRole = userOrTeam instanceof UserAccessViewModel && (endpointUsers[userOrTeam.Id] || endpointGroupUsers[userOrTeam.Id]);\n const teamRole = userOrTeam instanceof TeamAccessViewModel && (endpointTeams[userOrTeam.Id] || endpointGroupTeams[userOrTeam.Id]);\n\n return userRole || teamRole;\n });\n }\n\n $onInit() {\n return this.$async(async () => {\n try {\n this.state = {\n viewReady: false,\n actionInProgress: false,\n endpointId: this.$state.params.endpointId,\n registryId: this.$state.params.id,\n };\n this.registry = await this.EndpointService.registry(this.state.endpointId, this.state.registryId);\n this.registryEndpointAccesses = this.registry.RegistryAccesses[this.state.endpointId] || {};\n this.endpointGroup = await this.GroupService.group(this.endpoint.GroupId);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve registry details');\n } finally {\n this.state.viewReady = true;\n }\n });\n }\n}\n\nexport default DockerRegistryAccessController;\nangular.module('portainer.docker').controller('DockerRegistryAccessController', DockerRegistryAccessController);\n","import { AccessControlFormData } from '../../../../portainer/components/accessControlForm/porAccessControlFormModel';\n\nangular.module('portainer.docker').controller('CreateSecretController', [\n '$scope',\n '$state',\n 'Notifications',\n 'SecretService',\n 'LabelHelper',\n 'Authentication',\n 'ResourceControlService',\n 'FormValidator',\n function ($scope, $state, Notifications, SecretService, LabelHelper, Authentication, ResourceControlService, FormValidator) {\n $scope.formValues = {\n Name: '',\n Data: '',\n Labels: [],\n encodeSecret: true,\n AccessControlData: new AccessControlFormData(),\n };\n\n $scope.state = {\n formValidationError: '',\n actionInProgress: false,\n };\n\n $scope.addLabel = function () {\n $scope.formValues.Labels.push({ key: '', value: '' });\n };\n\n $scope.removeLabel = function (index) {\n $scope.formValues.Labels.splice(index, 1);\n };\n\n function prepareLabelsConfig(config) {\n config.Labels = LabelHelper.fromKeyValueToLabelHash($scope.formValues.Labels);\n }\n\n function prepareSecretData(config) {\n if ($scope.formValues.encodeSecret) {\n config.Data = btoa(unescape(encodeURIComponent($scope.formValues.Data)));\n } else {\n config.Data = $scope.formValues.Data;\n }\n }\n\n function prepareConfiguration() {\n var config = {};\n config.Name = $scope.formValues.Name;\n prepareSecretData(config);\n prepareLabelsConfig(config);\n return config;\n }\n\n function validateForm(accessControlData, isAdmin) {\n $scope.state.formValidationError = '';\n var error = '';\n error = FormValidator.validateAccessControl(accessControlData, isAdmin);\n\n if (error) {\n $scope.state.formValidationError = error;\n return false;\n }\n return true;\n }\n\n $scope.create = function () {\n const accessControlData = $scope.formValues.AccessControlData;\n const userDetails = Authentication.getUserDetails();\n const isAdmin = Authentication.isAdmin();\n\n if (!validateForm(accessControlData, isAdmin)) {\n return;\n }\n\n $scope.state.actionInProgress = true;\n var secretConfiguration = prepareConfiguration();\n SecretService.create(secretConfiguration)\n .then(function success(data) {\n const userId = userDetails.ID;\n const resourceControl = data.Portainer.ResourceControl;\n return ResourceControlService.applyResourceControl(userId, accessControlData, resourceControl);\n })\n .then(function success() {\n Notifications.success('Secret successfully created');\n $state.go('docker.secrets', {}, { reload: true });\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to create secret');\n })\n .finally(function final() {\n $scope.state.actionInProgress = false;\n });\n };\n },\n]);\n","angular.module('portainer.docker').controller('SecretController', [\n '$scope',\n '$transition$',\n '$state',\n 'SecretService',\n 'Notifications',\n function ($scope, $transition$, $state, SecretService, Notifications) {\n $scope.removeSecret = function removeSecret(secretId) {\n SecretService.remove(secretId)\n .then(function success() {\n Notifications.success('Secret successfully removed');\n $state.go('docker.secrets', {});\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to remove secret');\n });\n };\n\n function initView() {\n SecretService.secret($transition$.params().id)\n .then(function success(data) {\n $scope.secret = data;\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve secret details');\n });\n }\n\n initView();\n },\n]);\n","angular.module('portainer.docker').controller('SecretsController', [\n '$scope',\n '$state',\n 'SecretService',\n 'Notifications',\n function ($scope, $state, SecretService, Notifications) {\n $scope.removeAction = function (selectedItems) {\n var actionCount = selectedItems.length;\n angular.forEach(selectedItems, function (secret) {\n SecretService.remove(secret.Id)\n .then(function success() {\n Notifications.success('Secret successfully removed', secret.Name);\n var index = $scope.secrets.indexOf(secret);\n $scope.secrets.splice(index, 1);\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to remove secret');\n })\n .finally(function final() {\n --actionCount;\n if (actionCount === 0) {\n $state.reload();\n }\n });\n });\n };\n\n $scope.getSecrets = getSecrets;\n\n function getSecrets() {\n SecretService.secrets()\n .then(function success(data) {\n $scope.secrets = data;\n })\n .catch(function error(err) {\n $scope.secrets = [];\n Notifications.error('Failure', err, 'Unable to retrieve secrets');\n });\n }\n\n function initView() {\n getSecrets();\n }\n\n initView();\n },\n]);\n","import _ from 'lodash-es';\n\nimport { PorImageRegistryModel } from 'Docker/models/porImageRegistry';\nimport * as envVarsUtils from '@/portainer/helpers/env-vars';\nimport { AccessControlFormData } from '../../../../portainer/components/accessControlForm/porAccessControlFormModel';\n\nrequire('./includes/update-restart.html');\nrequire('./includes/secret.html');\nrequire('./includes/config.html');\nrequire('./includes/resources-placement.html');\n\nangular.module('portainer.docker').controller('CreateServiceController', [\n '$q',\n '$scope',\n '$state',\n '$timeout',\n 'Service',\n 'ServiceHelper',\n 'ConfigService',\n 'ConfigHelper',\n 'SecretHelper',\n 'SecretService',\n 'VolumeService',\n 'NetworkService',\n 'ImageHelper',\n 'LabelHelper',\n 'Authentication',\n 'ResourceControlService',\n 'Notifications',\n 'FormValidator',\n 'PluginService',\n 'RegistryService',\n 'HttpRequestHelper',\n 'NodeService',\n 'WebhookService',\n 'endpoint',\n function (\n $q,\n $scope,\n $state,\n $timeout,\n Service,\n ServiceHelper,\n ConfigService,\n ConfigHelper,\n SecretHelper,\n SecretService,\n VolumeService,\n NetworkService,\n ImageHelper,\n LabelHelper,\n Authentication,\n ResourceControlService,\n Notifications,\n FormValidator,\n PluginService,\n RegistryService,\n HttpRequestHelper,\n NodeService,\n WebhookService,\n endpoint\n ) {\n $scope.endpoint = endpoint;\n\n $scope.formValues = {\n Name: '',\n RegistryModel: new PorImageRegistryModel(),\n Mode: 'replicated',\n Replicas: 1,\n Command: '',\n EntryPoint: '',\n WorkingDir: '',\n User: '',\n Env: [],\n Labels: [],\n ContainerLabels: [],\n Volumes: [],\n Network: '',\n ExtraNetworks: [],\n HostsEntries: [],\n Ports: [],\n Parallelism: 1,\n PlacementConstraints: [],\n PlacementPreferences: [],\n UpdateDelay: '0s',\n UpdateOrder: 'stop-first',\n FailureAction: 'pause',\n Secrets: [],\n Configs: [],\n AccessControlData: new AccessControlFormData(),\n CpuLimit: 0,\n CpuReservation: 0,\n MemoryLimit: 0,\n MemoryReservation: 0,\n MemoryLimitUnit: 'MB',\n MemoryReservationUnit: 'MB',\n RestartCondition: 'any',\n RestartDelay: '5s',\n RestartMaxAttempts: 0,\n RestartWindow: '0s',\n LogDriverName: '',\n LogDriverOpts: [],\n Webhook: false,\n };\n\n $scope.state = {\n formValidationError: '',\n actionInProgress: false,\n pullImageValidity: false,\n };\n\n $scope.allowBindMounts = false;\n\n $scope.handleEnvVarChange = handleEnvVarChange;\n function handleEnvVarChange(value) {\n $scope.formValues.Env = value;\n }\n\n $scope.refreshSlider = function () {\n $timeout(function () {\n $scope.$broadcast('rzSliderForceRender');\n });\n };\n\n $scope.setPullImageValidity = setPullImageValidity;\n function setPullImageValidity(validity) {\n $scope.state.pullImageValidity = validity;\n }\n\n $scope.addPortBinding = function () {\n $scope.formValues.Ports.push({ PublishedPort: '', TargetPort: '', Protocol: 'tcp', PublishMode: 'ingress' });\n };\n\n $scope.removePortBinding = function (index) {\n $scope.formValues.Ports.splice(index, 1);\n };\n\n $scope.addExtraNetwork = function () {\n $scope.formValues.ExtraNetworks.push({ Name: '' });\n };\n\n $scope.removeExtraNetwork = function (index) {\n $scope.formValues.ExtraNetworks.splice(index, 1);\n };\n\n $scope.addHostsEntry = function () {\n $scope.formValues.HostsEntries.push({});\n };\n\n $scope.removeHostsEntry = function (index) {\n $scope.formValues.HostsEntries.splice(index, 1);\n };\n\n $scope.addVolume = function () {\n $scope.formValues.Volumes.push({ Source: null, Target: '', ReadOnly: false, Type: 'volume' });\n };\n\n $scope.removeVolume = function (index) {\n $scope.formValues.Volumes.splice(index, 1);\n };\n\n $scope.addConfig = function () {\n $scope.formValues.Configs.push({});\n };\n\n $scope.removeConfig = function (index) {\n $scope.formValues.Configs.splice(index, 1);\n };\n\n $scope.addSecret = function () {\n $scope.formValues.Secrets.push({ overrideTarget: false });\n };\n\n $scope.removeSecret = function (index) {\n $scope.formValues.Secrets.splice(index, 1);\n };\n\n $scope.addPlacementConstraint = function () {\n $scope.formValues.PlacementConstraints.push({ key: '', operator: '==', value: '' });\n };\n\n $scope.removePlacementConstraint = function (index) {\n $scope.formValues.PlacementConstraints.splice(index, 1);\n };\n\n $scope.addPlacementPreference = function () {\n $scope.formValues.PlacementPreferences.push({ strategy: 'spread', value: '' });\n };\n\n $scope.removePlacementPreference = function (index) {\n $scope.formValues.PlacementPreferences.splice(index, 1);\n };\n\n $scope.addLabel = function () {\n $scope.formValues.Labels.push({ key: '', value: '' });\n };\n\n $scope.removeLabel = function (index) {\n $scope.formValues.Labels.splice(index, 1);\n };\n\n $scope.addContainerLabel = function () {\n $scope.formValues.ContainerLabels.push({ key: '', value: '' });\n };\n\n $scope.removeContainerLabel = function (index) {\n $scope.formValues.ContainerLabels.splice(index, 1);\n };\n\n $scope.addLogDriverOpt = function () {\n $scope.formValues.LogDriverOpts.push({ name: '', value: '' });\n };\n\n $scope.removeLogDriverOpt = function (index) {\n $scope.formValues.LogDriverOpts.splice(index, 1);\n };\n\n function prepareImageConfig(config, input) {\n var imageConfig = ImageHelper.createImageConfigForContainer(input.RegistryModel);\n config.TaskTemplate.ContainerSpec.Image = imageConfig.fromImage;\n }\n\n function preparePortsConfig(config, input) {\n let ports = [];\n input.Ports.forEach(function (binding) {\n const port = {\n Protocol: binding.Protocol,\n PublishMode: binding.PublishMode,\n };\n if (binding.TargetPort) {\n port.TargetPort = +binding.TargetPort;\n if (binding.PublishedPort) {\n port.PublishedPort = +binding.PublishedPort;\n }\n ports.push(port);\n }\n });\n config.EndpointSpec.Ports = ports;\n }\n\n function prepareSchedulingConfig(config, input) {\n if (input.Mode === 'replicated') {\n config.Mode.Replicated = {\n Replicas: input.Replicas,\n };\n } else {\n config.Mode.Global = {};\n }\n }\n\n function commandToArray(cmd) {\n var tokens = [].concat\n .apply(\n [],\n cmd.split(\"'\").map(function (v, i) {\n return i % 2 ? v : v.split(' ');\n })\n )\n .filter(Boolean);\n return tokens;\n }\n\n function prepareCommandConfig(config, input) {\n if (input.EntryPoint) {\n config.TaskTemplate.ContainerSpec.Command = commandToArray(input.EntryPoint);\n }\n if (input.Command) {\n config.TaskTemplate.ContainerSpec.Args = commandToArray(input.Command);\n }\n if (input.User) {\n config.TaskTemplate.ContainerSpec.User = input.User;\n }\n if (input.WorkingDir) {\n config.TaskTemplate.ContainerSpec.Dir = input.WorkingDir;\n }\n }\n\n function prepareEnvConfig(config, input) {\n config.TaskTemplate.ContainerSpec.Env = envVarsUtils.convertToArrayOfStrings(input.Env);\n }\n\n function prepareLabelsConfig(config, input) {\n config.Labels = LabelHelper.fromKeyValueToLabelHash(input.Labels);\n config.TaskTemplate.ContainerSpec.Labels = LabelHelper.fromKeyValueToLabelHash(input.ContainerLabels);\n }\n\n function createMountObjectFromVolume(volumeObject, target, readonly) {\n return {\n Target: target,\n Source: volumeObject.Id,\n Type: 'volume',\n ReadOnly: readonly,\n VolumeOptions: {\n Labels: volumeObject.Labels,\n DriverConfig: {\n Name: volumeObject.Driver,\n Options: volumeObject.Options,\n },\n },\n };\n }\n\n function prepareVolumes(config, input) {\n input.Volumes.forEach(function (volume) {\n if (volume.Source && volume.Target) {\n if (volume.Type !== 'volume') {\n config.TaskTemplate.ContainerSpec.Mounts.push(volume);\n } else {\n var volumeObject = volume.Source;\n var mount = createMountObjectFromVolume(volumeObject, volume.Target, volume.ReadOnly);\n config.TaskTemplate.ContainerSpec.Mounts.push(mount);\n }\n }\n });\n }\n\n function prepareNetworks(config, input) {\n var networks = [];\n if (input.Network) {\n networks.push({ Target: input.Network });\n }\n input.ExtraNetworks.forEach(function (network) {\n networks.push({ Target: network.Name });\n });\n config.Networks = _.uniqWith(networks, _.isEqual);\n }\n\n function prepareHostsEntries(config, input) {\n var hostsEntries = [];\n if (input.HostsEntries) {\n input.HostsEntries.forEach(function (host_ip) {\n if (host_ip.value && host_ip.value.indexOf(':') && host_ip.value.split(':').length === 2) {\n var keyVal = host_ip.value.split(':');\n // Hosts file format, IP_address canonical_hostname\n hostsEntries.push(keyVal[1] + ' ' + keyVal[0]);\n }\n });\n if (hostsEntries.length > 0) {\n config.TaskTemplate.ContainerSpec.Hosts = hostsEntries;\n }\n }\n }\n\n function prepareUpdateConfig(config, input) {\n config.UpdateConfig = {\n Parallelism: input.Parallelism || 0,\n Delay: ServiceHelper.translateHumanDurationToNanos(input.UpdateDelay) || 0,\n FailureAction: input.FailureAction,\n Order: input.UpdateOrder,\n };\n }\n\n function prepareRestartPolicy(config, input) {\n config.TaskTemplate.RestartPolicy = {\n Condition: input.RestartCondition || 'any',\n Delay: ServiceHelper.translateHumanDurationToNanos(input.RestartDelay) || 5000000000,\n MaxAttempts: input.RestartMaxAttempts || 0,\n Window: ServiceHelper.translateHumanDurationToNanos(input.RestartWindow) || 0,\n };\n }\n\n function preparePlacementConfig(config, input) {\n config.TaskTemplate.Placement.Constraints = ServiceHelper.translateKeyValueToPlacementConstraints(input.PlacementConstraints);\n config.TaskTemplate.Placement.Preferences = ServiceHelper.translateKeyValueToPlacementPreferences(input.PlacementPreferences);\n }\n\n function prepareConfigConfig(config, input) {\n if (input.Configs) {\n var configs = [];\n angular.forEach(input.Configs, function (config) {\n if (config.model) {\n var s = ConfigHelper.configConfig(config.model);\n s.File.Name = config.FileName || s.File.Name;\n configs.push(s);\n }\n });\n config.TaskTemplate.ContainerSpec.Configs = configs;\n }\n }\n\n function prepareSecretConfig(config, input) {\n if (input.Secrets) {\n var secrets = [];\n angular.forEach(input.Secrets, function (secret) {\n if (secret.model) {\n var s = SecretHelper.secretConfig(secret.model);\n s.File.Name = s.SecretName;\n if (secret.overrideTarget && secret.target && secret.target !== '') {\n s.File.Name = secret.target;\n }\n secrets.push(s);\n }\n });\n config.TaskTemplate.ContainerSpec.Secrets = secrets;\n }\n }\n\n function prepareResourcesCpuConfig(config, input) {\n // CPU Limit\n if (input.CpuLimit > 0) {\n config.TaskTemplate.Resources.Limits.NanoCPUs = input.CpuLimit * 1000000000;\n }\n // CPU Reservation\n if (input.CpuReservation > 0) {\n config.TaskTemplate.Resources.Reservations.NanoCPUs = input.CpuReservation * 1000000000;\n }\n }\n\n function prepareResourcesMemoryConfig(config, input) {\n // Memory Limit - Round to 0.125\n var memoryLimit = (Math.round(input.MemoryLimit * 8) / 8).toFixed(3);\n memoryLimit *= 1024 * 1024;\n if (input.MemoryLimitUnit === 'GB') {\n memoryLimit *= 1024;\n }\n if (memoryLimit > 0) {\n config.TaskTemplate.Resources.Limits.MemoryBytes = memoryLimit;\n }\n // Memory Resevation - Round to 0.125\n var memoryReservation = (Math.round(input.MemoryReservation * 8) / 8).toFixed(3);\n memoryReservation *= 1024 * 1024;\n if (input.MemoryReservationUnit === 'GB') {\n memoryReservation *= 1024;\n }\n if (memoryReservation > 0) {\n config.TaskTemplate.Resources.Reservations.MemoryBytes = memoryReservation;\n }\n }\n\n function prepareLogDriverConfig(config, input) {\n var logOpts = {};\n if (input.LogDriverName) {\n config.TaskTemplate.LogDriver = { Name: input.LogDriverName };\n if (input.LogDriverName !== 'none') {\n input.LogDriverOpts.forEach(function (opt) {\n if (opt.name) {\n logOpts[opt.name] = opt.value;\n }\n });\n if (Object.keys(logOpts).length !== 0 && logOpts.constructor === Object) {\n config.TaskTemplate.LogDriver.Options = logOpts;\n }\n }\n }\n }\n\n function prepareConfiguration() {\n var input = $scope.formValues;\n var config = {\n Name: input.Name,\n TaskTemplate: {\n ContainerSpec: {\n Mounts: [],\n },\n Placement: {},\n Resources: {\n Limits: {},\n Reservations: {},\n },\n },\n Mode: {},\n EndpointSpec: {},\n };\n prepareSchedulingConfig(config, input);\n prepareImageConfig(config, input);\n preparePortsConfig(config, input);\n prepareCommandConfig(config, input);\n prepareEnvConfig(config, input);\n prepareLabelsConfig(config, input);\n prepareVolumes(config, input);\n prepareNetworks(config, input);\n prepareHostsEntries(config, input);\n prepareUpdateConfig(config, input);\n prepareConfigConfig(config, input);\n prepareSecretConfig(config, input);\n preparePlacementConfig(config, input);\n prepareResourcesCpuConfig(config, input);\n prepareResourcesMemoryConfig(config, input);\n prepareRestartPolicy(config, input);\n prepareLogDriverConfig(config, input);\n return config;\n }\n\n function createNewService(config, accessControlData) {\n const registryModel = $scope.formValues.RegistryModel;\n var authenticationDetails = registryModel.Registry.Authentication ? RegistryService.encodedCredentials(registryModel.Registry) : '';\n HttpRequestHelper.setRegistryAuthenticationHeader(authenticationDetails);\n\n Service.create(config)\n .$promise.then(function success(data) {\n const serviceId = data.ID;\n const resourceControl = data.Portainer.ResourceControl;\n const userId = Authentication.getUserDetails().ID;\n const rcPromise = ResourceControlService.applyResourceControl(userId, accessControlData, resourceControl);\n const registryID = $scope.formValues.RegistryModel.Registry.Id;\n const webhookPromise = $q.when(endpoint.Type !== 4 && $scope.formValues.Webhook && WebhookService.createServiceWebhook(serviceId, endpoint.Id, registryID));\n return $q.all([rcPromise, webhookPromise]);\n })\n .then(function success() {\n Notifications.success('Service successfully created');\n $state.go('docker.services', {}, { reload: true });\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to create service');\n })\n .finally(function final() {\n $scope.state.actionInProgress = false;\n });\n }\n\n function validateForm(accessControlData, isAdmin) {\n $scope.state.formValidationError = '';\n var error = '';\n error = FormValidator.validateAccessControl(accessControlData, isAdmin);\n\n if (error) {\n $scope.state.formValidationError = error;\n return false;\n }\n return true;\n }\n\n $scope.volumesAreValid = volumesAreValid;\n function volumesAreValid() {\n const volumes = $scope.formValues.Volumes;\n return volumes.every((volume) => volume.Target && volume.Source);\n }\n\n $scope.create = function createService() {\n var accessControlData = $scope.formValues.AccessControlData;\n\n if (!validateForm(accessControlData, $scope.isAdmin)) {\n return;\n }\n\n $scope.state.actionInProgress = true;\n var config = prepareConfiguration();\n createNewService(config, accessControlData);\n };\n\n function initSlidersMaxValuesBasedOnNodeData(nodes) {\n var maxCpus = 0;\n var maxMemory = 0;\n for (var n in nodes) {\n if (nodes[n].CPUs && nodes[n].CPUs > maxCpus) {\n maxCpus = nodes[n].CPUs;\n }\n if (nodes[n].Memory && nodes[n].Memory > maxMemory) {\n maxMemory = nodes[n].Memory;\n }\n }\n if (maxCpus > 0) {\n $scope.state.sliderMaxCpu = maxCpus / 1000000000;\n } else {\n $scope.state.sliderMaxCpu = 32;\n }\n if (maxMemory > 0) {\n $scope.state.sliderMaxMemory = Math.floor(maxMemory / 1000 / 1000);\n } else {\n $scope.state.sliderMaxMemory = 32768;\n }\n }\n\n function initView() {\n var apiVersion = $scope.applicationState.endpoint.apiVersion;\n\n $q.all({\n volumes: VolumeService.volumes(),\n networks: NetworkService.networks(true, true, false),\n secrets: apiVersion >= 1.25 ? SecretService.secrets() : [],\n configs: apiVersion >= 1.3 ? ConfigService.configs() : [],\n nodes: NodeService.nodes(),\n availableLoggingDrivers: PluginService.loggingPlugins(apiVersion < 1.25),\n allowBindMounts: checkIfAllowedBindMounts(),\n })\n .then(function success(data) {\n $scope.availableVolumes = data.volumes;\n $scope.availableNetworks = data.networks;\n $scope.availableSecrets = data.secrets;\n $scope.availableConfigs = data.configs;\n $scope.availableLoggingDrivers = data.availableLoggingDrivers;\n initSlidersMaxValuesBasedOnNodeData(data.nodes);\n $scope.isAdmin = Authentication.isAdmin();\n $scope.allowBindMounts = data.allowBindMounts;\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to initialize view');\n });\n }\n\n initView();\n\n async function checkIfAllowedBindMounts() {\n const isAdmin = Authentication.isAdmin();\n\n const { allowBindMountsForRegularUsers } = endpoint.SecuritySettings;\n\n return isAdmin || allowBindMountsForRegularUsers;\n }\n },\n]);\n","var path = 'app/docker/views/services/create/includes/update-restart.html';\nvar html = \"<form class=\\\"form-horizontal\\\" style=\\\"margin-top: 15px;\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Update config\\n </div>\\n <!-- parallelism-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"parallelism\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Update parallelism</label>\\n <div class=\\\"col-sm-4 col-lg-3\\\">\\n <input type=\\\"number\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.Parallelism\\\" id=\\\"parallelism\\\" placeholder=\\\"e.g. 1\\\" />\\n </div>\\n <div class=\\\"col-sm-5\\\">\\n <p class=\\\"small text-muted\\\">\\n Maximum number of tasks to be updated simultaneously (0 to update all at once).\\n </p>\\n </div>\\n </div>\\n <!-- !parallelism-input -->\\n <!-- delay-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"update-delay\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Update delay\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"Supported format examples: 1h, 5m, 10s, 1000ms, 15us, 60ns.\\\"></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-4 col-lg-3\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.UpdateDelay\\\" id=\\\"update-delay\\\" placeholder=\\\"e.g. 1m\\\" ng-pattern=\\\"/^([0-9]+)(h|m|s|ms|us|ns)$/i\\\" />\\n </div>\\n <div class=\\\"col-sm-5\\\">\\n <p class=\\\"small text-muted\\\">\\n Amount of time between updates expressed by a number followed by unit (ns|us|ms|s|m|h). Default value is 0s, 0 seconds.\\n </p>\\n </div>\\n </div>\\n <!-- !delay-input -->\\n <!-- failureAction-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"failure-action\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Update failure action</label>\\n <div class=\\\"col-sm-4 col-lg-3\\\">\\n <div class=\\\"btn-group btn-group-sm\\\">\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"formValues.FailureAction\\\" uib-btn-radio=\\\"'continue'\\\">Continue</label>\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"formValues.FailureAction\\\" uib-btn-radio=\\\"'pause'\\\">Pause</label>\\n </div>\\n </div>\\n <div class=\\\"col-sm-5\\\">\\n <p class=\\\"small text-muted\\\">\\n Action taken on failure to start after update.\\n </p>\\n </div>\\n </div>\\n <!-- !failureAction-input -->\\n <!-- order-input -->\\n <div class=\\\"form-group\\\" ng-if=\\\"applicationState.endpoint.apiVersion >= 1.29\\\">\\n <label for=\\\"update-order\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Update order</label>\\n <div class=\\\"col-sm-4 col-lg-3\\\">\\n <div class=\\\"btn-group btn-group-sm\\\">\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"formValues.UpdateOrder\\\" uib-btn-radio=\\\"'start-first'\\\">start-first</label>\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"formValues.UpdateOrder\\\" uib-btn-radio=\\\"'stop-first'\\\">stop-first</label>\\n </div>\\n </div>\\n <div class=\\\"col-sm-5\\\">\\n <p class=\\\"small text-muted\\\">\\n Operation order on failure.\\n </p>\\n </div>\\n </div>\\n <!-- !order-input -->\\n\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Restart policy\\n </div>\\n <!-- restartCondition-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"restart-condition\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Restart condition</label>\\n <div class=\\\"col-sm-4 col-lg-3\\\">\\n <div class=\\\"btn-group btn-group-sm\\\">\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"formValues.RestartCondition\\\" uib-btn-radio=\\\"'none'\\\">None</label>\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"formValues.RestartCondition\\\" uib-btn-radio=\\\"'on-failure'\\\">On-failure</label>\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"formValues.RestartCondition\\\" uib-btn-radio=\\\"'any'\\\">Any</label>\\n </div>\\n </div>\\n <div class=\\\"col-sm-5\\\">\\n <p class=\\\"small text-muted\\\">\\n Restart when condition is met (default condition \\\"any\\\").\\n </p>\\n </div>\\n </div>\\n <!-- !restartCondition-input -->\\n <!-- restartDelay-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"restart-delay\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Restart delay\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"Supported format examples: 1h, 5m, 10s, 1000ms, 15us, 60ns.\\\"></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-4 col-lg-3\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.RestartDelay\\\" id=\\\"restart-delay\\\" placeholder=\\\"e.g. 1m\\\" ng-pattern=\\\"/^([0-9]+)(h|m|s|ms|us|ns)$/i\\\" />\\n </div>\\n <div class=\\\"col-sm-5\\\">\\n <p class=\\\"small text-muted\\\">\\n Delay between restart attempts expressed by a number followed by unit (ns|us|ms|s|m|h). Default value is 5s, 5 seconds.\\n </p>\\n </div>\\n </div>\\n <!-- !restartDelay-input -->\\n <!-- restartMaxAttempts-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"restart-max-attempts\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Restart max attempts</label>\\n <div class=\\\"col-sm-4 col-lg-3\\\">\\n <input type=\\\"number\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.RestartMaxAttempts\\\" id=\\\"restart-max-attempts\\\" placeholder=\\\"e.g. 0\\\" />\\n </div>\\n <div class=\\\"col-sm-5\\\">\\n <p class=\\\"small text-muted\\\">\\n Maximum attempts to restart a given task before giving up (default value is 0, which means unlimited).\\n </p>\\n </div>\\n </div>\\n <!-- !restartMaxAttempts-input -->\\n <!-- restartWindow-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"restart-window\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Restart window\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"Supported format examples: 1h, 5m, 10s, 1000ms, 15us, 60ns.\\\"></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-4 col-lg-3\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.RestartWindow\\\" id=\\\"restart-window\\\" placeholder=\\\"e.g. 1m\\\" ng-pattern=\\\"/^([0-9]+)(h|m|s|ms|us|ns)$/i\\\" />\\n </div>\\n <div class=\\\"col-sm-5\\\">\\n <p class=\\\"small text-muted\\\">\\n Time window to evaluate restart attempts expressed by a number followed by unit (ns|us|ms|s|m|h). Default value is 0 seconds, which is unbounded.\\n </p>\\n </div>\\n </div>\\n <!-- !restartWindow-input -->\\n</form>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/services/create/includes/secret.html';\nvar html = \"<form class=\\\"form-horizontal\\\" style=\\\"margin-top: 15px;\\\">\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12 small text-muted\\\">\\n By default, secrets will be available under <code>/run/secrets/$SECRET_NAME</code> in containers (Linux) or\\n <code>C:\\\\ProgramData\\\\Docker\\\\secrets\\\\$SECRET_NAME</code> (Windows).</div\\n >\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 5px;\\\">\\n <label class=\\\"control-label text-left\\\">Secrets</label>\\n <span class=\\\"label label-default interactive\\\" style=\\\"margin-left: 10px;\\\" ng-click=\\\"addSecret()\\\"> <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add a secret </span>\\n </div>\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\">\\n <div ng-repeat=\\\"secret in formValues.Secrets track by $index\\\" style=\\\"margin-top: 4px;\\\">\\n <div class=\\\"input-group col-sm-4 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">secret</span>\\n <select class=\\\"form-control\\\" ng-model=\\\"secret.model\\\" ng-options=\\\"secret.Name for secret in availableSecrets | orderBy: 'Name'\\\">\\n <option value=\\\"\\\" selected=\\\"selected\\\">Select a secret</option>\\n </select>\\n </div>\\n <div class=\\\"input-group col-sm-4 input-group-sm\\\" ng-if=\\\"applicationState.endpoint.apiVersion >= 1.3 && secret.overrideTarget\\\">\\n <span class=\\\"input-group-addon\\\">target</span>\\n <input class=\\\"form-control\\\" ng-model=\\\"secret.target\\\" placeholder=\\\"/path/in/container\\\" />\\n </div>\\n <div class=\\\"input-group col-sm-3 input-group-sm\\\">\\n <div class=\\\"btn-group btn-group-sm\\\" ng-if=\\\"applicationState.endpoint.apiVersion >= 1.3\\\">\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"secret.overrideTarget\\\" uib-btn-radio=\\\"false\\\">Default location</label>\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"secret.overrideTarget\\\" uib-btn-radio=\\\"true\\\">Override</label>\\n </div>\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removeSecret($index)\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n </div>\\n </div>\\n</form>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/services/create/includes/config.html';\nvar html = \"<form class=\\\"form-horizontal\\\" style=\\\"margin-top: 15px;\\\">\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 5px;\\\">\\n <label class=\\\"control-label text-left\\\">Configs</label>\\n <span class=\\\"label label-default interactive\\\" style=\\\"margin-left: 10px;\\\" ng-click=\\\"addConfig()\\\"> <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add a config </span>\\n </div>\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\">\\n <div ng-repeat=\\\"config in formValues.Configs\\\" style=\\\"margin-top: 2px;\\\">\\n <div class=\\\"input-group col-sm-4 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">config</span>\\n <select class=\\\"form-control\\\" ng-model=\\\"config.model\\\" ng-options=\\\"config.Name for config in availableConfigs | orderBy: 'Name'\\\">\\n <option value=\\\"\\\" selected=\\\"selected\\\">Select a config</option>\\n </select>\\n </div>\\n <div class=\\\"input-group col-sm-4 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">Path in container</span>\\n <input class=\\\"form-control\\\" ng-model=\\\"config.FileName\\\" placeholder=\\\"e.g. /path/in/container\\\" />\\n </div>\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removeConfig($index)\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n </div>\\n</form>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/services/create/includes/resources-placement.html';\nvar html = \"<form class=\\\"form-horizontal\\\" style=\\\"margin-top: 15px;\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Resources\\n </div>\\n <!-- memory-reservation-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"memory-reservation\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\" style=\\\"margin-top: 20px;\\\">\\n Memory reservation\\n </label>\\n <div class=\\\"col-sm-3\\\">\\n <slider model=\\\"formValues.MemoryReservation\\\" floor=\\\"0\\\" ceil=\\\"state.sliderMaxMemory\\\" step=\\\"256\\\" ng-if=\\\"state.sliderMaxMemory\\\"></slider>\\n </div>\\n <div class=\\\"col-sm-2\\\">\\n <input type=\\\"number\\\" min=\\\"0\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.MemoryReservation\\\" />\\n </div>\\n <div class=\\\"col-sm-4\\\">\\n <p class=\\\"small text-muted\\\" style=\\\"margin-top: 7px;\\\">\\n Minimum memory available on a node to run a task (<b>MB</b>)\\n </p>\\n </div>\\n </div>\\n <!-- !memory-reservation-input -->\\n <!-- memory-limit-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"memory-limit\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\" style=\\\"margin-top: 20px;\\\">\\n Memory limit\\n </label>\\n <div class=\\\"col-sm-3\\\">\\n <slider model=\\\"formValues.MemoryLimit\\\" floor=\\\"0\\\" ceil=\\\"state.sliderMaxMemory\\\" step=\\\"256\\\" ng-if=\\\"state.sliderMaxMemory\\\"></slider>\\n </div>\\n <div class=\\\"col-sm-2\\\">\\n <input type=\\\"number\\\" min=\\\"0\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.MemoryLimit\\\" />\\n </div>\\n <div class=\\\"col-sm-4\\\" style=\\\"margin-top: 7px;\\\">\\n <p class=\\\"small text-muted\\\">\\n Maximum memory usage per task (<b>MB</b>)\\n </p>\\n </div>\\n </div>\\n <!-- !memory-limit-input -->\\n <!-- cpu-reservation-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"cpu-reservation\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\" style=\\\"margin-top: 20px;\\\">\\n CPU reservation\\n </label>\\n <div class=\\\"col-sm-5\\\">\\n <slider model=\\\"formValues.CpuReservation\\\" floor=\\\"0\\\" ceil=\\\"state.sliderMaxCpu\\\" step=\\\"0.25\\\" precision=\\\"2\\\" ng-if=\\\"state.sliderMaxCpu\\\"></slider>\\n </div>\\n <div class=\\\"col-sm-4\\\" style=\\\"margin-top: 20px;\\\">\\n <p class=\\\"small text-muted\\\">\\n Minimum CPU available on a node to run a task\\n </p>\\n </div>\\n </div>\\n <!-- !cpu-reservation-input -->\\n <!-- cpu-limit-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"cpu-limit\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\" style=\\\"margin-top: 20px;\\\">\\n CPU limit\\n </label>\\n <div class=\\\"col-sm-5\\\">\\n <slider model=\\\"formValues.CpuLimit\\\" floor=\\\"0\\\" ceil=\\\"state.sliderMaxCpu\\\" step=\\\"0.25\\\" precision=\\\"2\\\" ng-if=\\\"state.sliderMaxCpu\\\"></slider>\\n </div>\\n <div class=\\\"col-sm-4\\\" style=\\\"margin-top: 20px;\\\">\\n <p class=\\\"small text-muted\\\">\\n Maximum CPU usage per task\\n </p>\\n </div>\\n </div>\\n <!-- !cpu-limit-input -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Placement\\n </div>\\n <!-- placement-constraints -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 5px;\\\">\\n <label class=\\\"control-label text-left\\\">Placement constraints</label>\\n <span class=\\\"label label-default interactive\\\" style=\\\"margin-left: 10px;\\\" ng-click=\\\"addPlacementConstraint()\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> placement constraint\\n </span>\\n </div>\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\">\\n <div ng-repeat=\\\"constraint in formValues.PlacementConstraints\\\" style=\\\"margin-top: 2px;\\\">\\n <div class=\\\"input-group col-sm-4 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">name</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"constraint.key\\\" placeholder=\\\"e.g. node.role\\\" />\\n </div>\\n <div class=\\\"input-group col-sm-1 input-group-sm\\\">\\n <select name=\\\"constraintOperator\\\" class=\\\"form-control\\\" ng-model=\\\"constraint.operator\\\">\\n <option value=\\\"==\\\">==</option>\\n <option value=\\\"!=\\\">!=</option>\\n </select>\\n </div>\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">value</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"constraint.value\\\" placeholder=\\\"e.g. manager\\\" />\\n </div>\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removePlacementConstraint($index)\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n </div>\\n <!-- !placement-constraints -->\\n <!-- placement-preferences -->\\n <div class=\\\"form-group\\\" ng-if=\\\"applicationState.endpoint.apiVersion >= 1.3\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 5px;\\\">\\n <label class=\\\"control-label text-left\\\">Placement preferences</label>\\n <span class=\\\"label label-default interactive\\\" style=\\\"margin-left: 10px;\\\" ng-click=\\\"addPlacementPreference()\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> placement preference\\n </span>\\n </div>\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\">\\n <div ng-repeat=\\\"preference in formValues.PlacementPreferences\\\" style=\\\"margin-top: 2px;\\\">\\n <div class=\\\"input-group col-sm-4 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">strategy</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"preference.strategy\\\" placeholder=\\\"e.g. spread\\\" />\\n </div>\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">value</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"preference.value\\\" placeholder=\\\"e.g. node.labels.datacenter\\\" />\\n </div>\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removePlacementPreference($index)\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n </div>\\n <!-- !placement-preferences -->\\n</form>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","require('./includes/configs.html');\nrequire('./includes/constraints.html');\nrequire('./includes/container-specs.html');\nrequire('./includes/containerlabels.html');\nrequire('./includes/environmentvariables.html');\nrequire('./includes/hosts.html');\nrequire('./includes/image.html');\nrequire('./includes/logging.html');\nrequire('./includes/mounts.html');\nrequire('./includes/networks.html');\nrequire('./includes/placementPreferences.html');\nrequire('./includes/ports.html');\nrequire('./includes/resources.html');\nrequire('./includes/restart.html');\nrequire('./includes/secrets.html');\nrequire('./includes/servicelabels.html');\nrequire('./includes/tasks.html');\nrequire('./includes/updateconfig.html');\n\nimport _ from 'lodash-es';\n\nimport { PorImageRegistryModel } from 'Docker/models/porImageRegistry';\nimport * as envVarsUtils from '@/portainer/helpers/env-vars';\n\nangular.module('portainer.docker').controller('ServiceController', [\n '$q',\n '$scope',\n '$transition$',\n '$state',\n '$location',\n '$timeout',\n '$anchorScroll',\n 'ServiceService',\n 'ConfigService',\n 'ConfigHelper',\n 'SecretService',\n 'ImageService',\n 'SecretHelper',\n 'ServiceHelper',\n 'LabelHelper',\n 'TaskService',\n 'NodeService',\n 'ContainerService',\n 'TaskHelper',\n 'Notifications',\n 'ModalService',\n 'PluginService',\n 'Authentication',\n 'VolumeService',\n 'ImageHelper',\n 'WebhookService',\n 'clipboard',\n 'WebhookHelper',\n 'NetworkService',\n 'RegistryService',\n 'endpoint',\n function (\n $q,\n $scope,\n $transition$,\n $state,\n $location,\n $timeout,\n $anchorScroll,\n ServiceService,\n ConfigService,\n ConfigHelper,\n SecretService,\n ImageService,\n SecretHelper,\n ServiceHelper,\n LabelHelper,\n TaskService,\n NodeService,\n ContainerService,\n TaskHelper,\n Notifications,\n ModalService,\n PluginService,\n Authentication,\n VolumeService,\n ImageHelper,\n WebhookService,\n clipboard,\n WebhookHelper,\n NetworkService,\n RegistryService,\n endpoint\n ) {\n $scope.endpoint = endpoint;\n\n $scope.state = {\n updateInProgress: false,\n deletionInProgress: false,\n rollbackInProgress: false,\n };\n\n $scope.formValues = {\n RegistryModel: new PorImageRegistryModel(),\n };\n\n $scope.tasks = [];\n $scope.availableImages = [];\n\n $scope.lastVersion = 0;\n\n var originalService = {};\n var previousServiceValues = [];\n\n $scope.goToItem = function (hash) {\n if ($location.hash() !== hash) {\n $location.hash(hash);\n } else {\n $anchorScroll();\n }\n };\n\n $scope.addEnvironmentVariable = function addEnvironmentVariable(service) {\n service.EnvironmentVariables.push({ name: '', value: '' });\n updateServiceArray(service, 'EnvironmentVariables', service.EnvironmentVariables);\n };\n\n $scope.onChangeEnvVars = onChangeEnvVars;\n\n function onChangeEnvVars(env) {\n const service = $scope.service;\n\n const orgEnv = service.EnvironmentVariables;\n service.EnvironmentVariables = env.map((v) => {\n const orgVar = orgEnv.find(({ name }) => v.name === name);\n const added = orgVar && orgVar.added;\n return { ...v, added };\n });\n\n updateServiceArray(service, 'EnvironmentVariables', service.EnvironmentVariables);\n }\n\n $scope.addConfig = function addConfig(service, config) {\n if (\n config &&\n service.ServiceConfigs.filter(function (serviceConfig) {\n return serviceConfig.Id === config.Id;\n }).length === 0\n ) {\n service.ServiceConfigs.push({ Id: config.Id, Name: config.Name, FileName: config.Name, Uid: '0', Gid: '0', Mode: 292 });\n updateServiceArray(service, 'ServiceConfigs', service.ServiceConfigs);\n }\n };\n $scope.removeConfig = function removeSecret(service, index) {\n var removedElement = service.ServiceConfigs.splice(index, 1);\n if (removedElement !== null) {\n updateServiceArray(service, 'ServiceConfigs', service.ServiceConfigs);\n }\n };\n $scope.updateConfig = function updateConfig(service) {\n updateServiceArray(service, 'ServiceConfigs', service.ServiceConfigs);\n };\n $scope.addSecret = function addSecret(service, newSecret) {\n if (newSecret.secret) {\n var filename = newSecret.secret.Name;\n if (newSecret.override) {\n filename = newSecret.target;\n }\n if (\n service.ServiceSecrets.filter(function (serviceSecret) {\n return serviceSecret.Id === newSecret.secret.Id && serviceSecret.FileName === filename;\n }).length === 0\n ) {\n service.ServiceSecrets.push({ Id: newSecret.secret.Id, Name: newSecret.secret.Name, FileName: filename, Uid: '0', Gid: '0', Mode: 444 });\n updateServiceArray(service, 'ServiceSecrets', service.ServiceSecrets);\n }\n }\n };\n $scope.removeSecret = function removeSecret(service, index) {\n var removedElement = service.ServiceSecrets.splice(index, 1);\n if (removedElement !== null) {\n updateServiceArray(service, 'ServiceSecrets', service.ServiceSecrets);\n }\n };\n $scope.addLabel = function addLabel(service) {\n service.ServiceLabels.push({ key: '', value: '', originalValue: '' });\n updateServiceArray(service, 'ServiceLabels', service.ServiceLabels);\n };\n $scope.removeLabel = function removeLabel(service, index) {\n var removedElement = service.ServiceLabels.splice(index, 1);\n if (removedElement !== null) {\n updateServiceArray(service, 'ServiceLabels', service.ServiceLabels);\n }\n };\n $scope.updateLabel = function updateLabel(service, label) {\n if (label.value !== label.originalValue || label.key !== label.originalKey) {\n updateServiceArray(service, 'ServiceLabels', service.ServiceLabels);\n }\n };\n $scope.addContainerLabel = function addContainerLabel(service) {\n service.ServiceContainerLabels.push({ key: '', value: '', originalValue: '' });\n updateServiceArray(service, 'ServiceContainerLabels', service.ServiceContainerLabels);\n };\n $scope.removeContainerLabel = function removeLabel(service, index) {\n var removedElement = service.ServiceContainerLabels.splice(index, 1);\n if (removedElement !== null) {\n updateServiceArray(service, 'ServiceContainerLabels', service.ServiceContainerLabels);\n }\n };\n $scope.updateContainerLabel = function updateLabel(service, label) {\n if (label.value !== label.originalValue || label.key !== label.originalKey) {\n updateServiceArray(service, 'ServiceContainerLabels', service.ServiceContainerLabels);\n }\n };\n $scope.addMount = function addMount(service) {\n service.ServiceMounts.push({ Type: 'volume', Source: null, Target: '', ReadOnly: false });\n updateServiceArray(service, 'ServiceMounts', service.ServiceMounts);\n };\n $scope.removeMount = function removeMount(service, index) {\n var removedElement = service.ServiceMounts.splice(index, 1);\n if (removedElement !== null) {\n updateServiceArray(service, 'ServiceMounts', service.ServiceMounts);\n }\n };\n\n $scope.onChangeMountType = function onChangeMountType(service, mount) {\n mount.Source = null;\n $scope.updateMount(service, mount);\n };\n\n $scope.updateMount = function updateMount(service) {\n updateServiceArray(service, 'ServiceMounts', service.ServiceMounts);\n };\n\n $scope.addNetwork = function addNetwork(service) {\n if (!service.Networks) {\n service.Networks = [];\n }\n service.Networks.push({ Editable: true });\n };\n\n $scope.removeNetwork = function removeNetwork(service, index) {\n var removedElement = service.Networks.splice(index, 1);\n if (removedElement && removedElement.length && removedElement[0].Id) {\n updateServiceArray(service, 'Networks', service.Networks);\n }\n };\n\n $scope.updateNetwork = function updateNetwork(service) {\n updateServiceArray(service, 'Networks', service.Networks);\n };\n\n $scope.addPlacementConstraint = function addPlacementConstraint(service) {\n service.ServiceConstraints.push({ key: '', operator: '==', value: '' });\n updateServiceArray(service, 'ServiceConstraints', service.ServiceConstraints);\n };\n $scope.removePlacementConstraint = function removePlacementConstraint(service, index) {\n var removedElement = service.ServiceConstraints.splice(index, 1);\n if (removedElement !== null) {\n updateServiceArray(service, 'ServiceConstraints', service.ServiceConstraints);\n }\n };\n $scope.updatePlacementConstraint = function (service) {\n updateServiceArray(service, 'ServiceConstraints', service.ServiceConstraints);\n };\n\n $scope.addPlacementPreference = function (service) {\n service.ServicePreferences.push({ strategy: 'spread', value: '' });\n updateServiceArray(service, 'ServicePreferences', service.ServicePreferences);\n };\n $scope.removePlacementPreference = function (service, index) {\n var removedElement = service.ServicePreferences.splice(index, 1);\n if (removedElement !== null) {\n updateServiceArray(service, 'ServicePreferences', service.ServicePreferences);\n }\n };\n $scope.updatePlacementPreference = function (service) {\n updateServiceArray(service, 'ServicePreferences', service.ServicePreferences);\n };\n\n $scope.addPublishedPort = function addPublishedPort(service) {\n if (!service.Ports) {\n service.Ports = [];\n }\n service.Ports.push({ PublishedPort: '', TargetPort: '', Protocol: 'tcp', PublishMode: 'ingress' });\n };\n $scope.updatePublishedPort = function updatePublishedPort(service) {\n updateServiceArray(service, 'Ports', service.Ports);\n };\n $scope.removePortPublishedBinding = function removePortPublishedBinding(service, index) {\n var removedElement = service.Ports.splice(index, 1);\n if (removedElement !== null) {\n updateServiceArray(service, 'Ports', service.Ports);\n }\n };\n\n $scope.addLogDriverOpt = function addLogDriverOpt(service) {\n service.LogDriverOpts.push({ key: '', value: '', originalValue: '' });\n updateServiceArray(service, 'LogDriverOpts', service.LogDriverOpts);\n };\n $scope.removeLogDriverOpt = function removeLogDriverOpt(service, index) {\n var removedElement = service.LogDriverOpts.splice(index, 1);\n if (removedElement !== null) {\n updateServiceArray(service, 'LogDriverOpts', service.LogDriverOpts);\n }\n };\n $scope.updateLogDriverOpt = function updateLogDriverOpt(service, variable) {\n if (variable.value !== variable.originalValue || variable.key !== variable.originalKey) {\n updateServiceArray(service, 'LogDriverOpts', service.LogDriverOpts);\n }\n };\n $scope.updateLogDriverName = function updateLogDriverName(service) {\n updateServiceArray(service, 'LogDriverName', service.LogDriverName);\n };\n\n $scope.addHostsEntry = function (service) {\n if (!service.Hosts) {\n service.Hosts = [];\n }\n service.Hosts.push({ hostname: '', ip: '' });\n };\n $scope.removeHostsEntry = function (service, index) {\n var removedElement = service.Hosts.splice(index, 1);\n if (removedElement !== null) {\n updateServiceArray(service, 'Hosts', service.Hosts);\n }\n };\n $scope.updateHostsEntry = function (service) {\n updateServiceArray(service, 'Hosts', service.Hosts);\n };\n\n $scope.updateWebhook = function updateWebhook(service) {\n if ($scope.WebhookExists) {\n WebhookService.deleteWebhook($scope.webhookID)\n .then(function success() {\n $scope.webhookURL = null;\n $scope.webhookID = null;\n $scope.WebhookExists = false;\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to delete webhook');\n });\n } else {\n WebhookService.createServiceWebhook(service.Id, endpoint.Id, $scope.initialRegistryID)\n .then(function success(data) {\n $scope.WebhookExists = true;\n $scope.webhookID = data.Id;\n $scope.webhookURL = WebhookHelper.returnWebhookUrl(data.Token);\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to create webhook');\n });\n }\n };\n\n $scope.updateWebhookRegistryId = function () {\n const newRegistryID = _.get($scope.formValues.RegistryModel, 'Registry.Id', 0);\n const registryChanged = $scope.initialRegistryID != newRegistryID;\n\n if ($scope.WebhookExists && registryChanged) {\n WebhookService.updateServiceWebhook($scope.webhookID, newRegistryID)\n .then(function success() {})\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to update webhook');\n });\n }\n };\n\n $scope.copyWebhook = function copyWebhook() {\n clipboard.copyText($scope.webhookURL);\n $('#copyNotification').show();\n $('#copyNotification').fadeOut(2000);\n };\n\n $scope.cancelChanges = async function cancelChanges(service, keys) {\n if (keys) {\n // clean out the keys only from the list of modified keys\n for (const key of keys) {\n if (key === 'Image') {\n $scope.formValues.RegistryModel = await RegistryService.retrievePorRegistryModelFromRepository(originalService.Image, endpoint.Id);\n } else {\n var index = previousServiceValues.indexOf(key);\n if (index >= 0) {\n previousServiceValues.splice(index, 1);\n }\n }\n }\n } else {\n // clean out all changes\n $scope.formValues.RegistryModel = await RegistryService.retrievePorRegistryModelFromRepository(originalService.Image, endpoint.Id);\n keys = Object.keys(service);\n previousServiceValues = [];\n }\n keys.forEach(function (attribute) {\n service[attribute] = originalService[attribute]; // reset service values\n });\n service.hasChanges = false;\n };\n\n $scope.hasChanges = function (service, elements) {\n var hasChanges = false;\n elements.forEach(function (key) {\n if (key === 'Image') {\n const originalImage = service ? service.Model.Spec.TaskTemplate.ContainerSpec.Image : null;\n const currentImage = ImageHelper.createImageConfigForContainer($scope.formValues.RegistryModel).fromImage;\n hasChanges = hasChanges || originalImage !== currentImage;\n } else {\n hasChanges = hasChanges || previousServiceValues.indexOf(key) >= 0;\n }\n });\n return hasChanges;\n };\n\n $scope.mountsAreValid = mountsAreValid;\n function mountsAreValid() {\n const mounts = $scope.service.ServiceMounts;\n return mounts.every((mount) => mount.Source && mount.Target);\n }\n\n function buildChanges(service) {\n var config = ServiceHelper.serviceToConfig(service.Model);\n config.Name = service.Name;\n config.Labels = LabelHelper.fromKeyValueToLabelHash(service.ServiceLabels);\n config.TaskTemplate.ContainerSpec.Env = envVarsUtils.convertToArrayOfStrings(service.EnvironmentVariables);\n config.TaskTemplate.ContainerSpec.Labels = LabelHelper.fromKeyValueToLabelHash(service.ServiceContainerLabels);\n\n if ($scope.hasChanges(service, ['Image'])) {\n const image = ImageHelper.createImageConfigForContainer($scope.formValues.RegistryModel);\n config.TaskTemplate.ContainerSpec.Image = image.fromImage;\n } else {\n config.TaskTemplate.ContainerSpec.Image = service.Image;\n }\n\n if ($scope.hasChanges(service, ['Networks'])) {\n config.Networks = _.map(\n _.filter(service.Networks, (item) => item.Id && item.Editable),\n (item) => ({ Target: item.Id })\n );\n config.TaskTemplate.Networks = config.Networks;\n }\n\n config.TaskTemplate.ContainerSpec.Secrets = service.ServiceSecrets ? service.ServiceSecrets.map(SecretHelper.secretConfig) : [];\n config.TaskTemplate.ContainerSpec.Configs = service.ServiceConfigs ? service.ServiceConfigs.map(ConfigHelper.configConfig) : [];\n config.TaskTemplate.ContainerSpec.Hosts = service.Hosts ? ServiceHelper.translateHostnameIPToHostsEntries(service.Hosts) : [];\n\n if (service.Mode === 'replicated') {\n config.Mode.Replicated.Replicas = service.Replicas;\n }\n config.TaskTemplate.ContainerSpec.Mounts = service.ServiceMounts;\n if (typeof config.TaskTemplate.Placement === 'undefined') {\n config.TaskTemplate.Placement = {};\n }\n config.TaskTemplate.Placement.Constraints = ServiceHelper.translateKeyValueToPlacementConstraints(service.ServiceConstraints);\n config.TaskTemplate.Placement.Preferences = ServiceHelper.translateKeyValueToPlacementPreferences(service.ServicePreferences);\n\n if ($scope.hasChanges(service, ['LimitNanoCPUs', 'LimitMemoryBytes', 'ReservationNanoCPUs', 'ReservationMemoryBytes'])) {\n // Round memory values to 0.125 and convert MB to B\n var memoryLimit = (Math.round(service.LimitMemoryBytes * 8) / 8).toFixed(3);\n memoryLimit *= 1024 * 1024;\n var memoryReservation = (Math.round(service.ReservationMemoryBytes * 8) / 8).toFixed(3);\n memoryReservation *= 1024 * 1024;\n config.TaskTemplate.Resources = {\n Limits: {\n NanoCPUs: service.LimitNanoCPUs * 1000000000,\n MemoryBytes: memoryLimit,\n },\n Reservations: {\n NanoCPUs: service.ReservationNanoCPUs * 1000000000,\n MemoryBytes: memoryReservation,\n },\n };\n }\n\n if ($scope.hasChanges(service, ['UpdateFailureAction', 'UpdateDelay', 'UpdateParallelism', 'UpdateOrder'])) {\n config.UpdateConfig = {\n Parallelism: service.UpdateParallelism,\n Delay: ServiceHelper.translateHumanDurationToNanos(service.UpdateDelay) || 0,\n FailureAction: service.UpdateFailureAction,\n Order: service.UpdateOrder,\n };\n }\n\n if ($scope.hasChanges(service, ['RestartCondition', 'RestartDelay', 'RestartMaxAttempts', 'RestartWindow'])) {\n config.TaskTemplate.RestartPolicy = {\n Condition: service.RestartCondition,\n Delay: ServiceHelper.translateHumanDurationToNanos(service.RestartDelay) || 5000000000,\n MaxAttempts: service.RestartMaxAttempts,\n Window: ServiceHelper.translateHumanDurationToNanos(service.RestartWindow) || 0,\n };\n }\n\n config.TaskTemplate.LogDriver = null;\n if (service.LogDriverName) {\n config.TaskTemplate.LogDriver = { Name: service.LogDriverName };\n if (service.LogDriverName !== 'none') {\n var logOpts = ServiceHelper.translateKeyValueToLogDriverOpts(service.LogDriverOpts);\n if (Object.keys(logOpts).length !== 0 && logOpts.constructor === Object) {\n config.TaskTemplate.LogDriver.Options = logOpts;\n }\n }\n }\n\n if (service.Ports) {\n service.Ports.forEach(function (binding) {\n if (binding.PublishedPort === null || binding.PublishedPort === '') {\n delete binding.PublishedPort;\n }\n });\n }\n\n config.EndpointSpec = {\n Mode: (config.EndpointSpec && config.EndpointSpec.Mode) || 'vip',\n Ports: service.Ports,\n };\n return service, config;\n }\n\n function rollbackService(service) {\n $scope.state.rollbackInProgress = true;\n let config = {};\n service, (config = buildChanges(service));\n ServiceService.update(service, config, 'previous')\n .then(function (data) {\n if (data.message && data.message.match(/^rpc error:/)) {\n Notifications.error('Failure', data, 'Error');\n } else {\n Notifications.success('Success', 'Service successfully rolled back');\n $scope.cancelChanges({});\n initView();\n }\n })\n .catch(function (e) {\n if (e.data.message && e.data.message.includes('does not have a previous spec')) {\n Notifications.error('Failure', { message: 'No previous config to rollback to.' });\n } else {\n Notifications.error('Failure', e, 'Unable to rollback service');\n }\n })\n .finally(function () {\n $scope.state.rollbackInProgress = false;\n });\n }\n\n $scope.rollbackService = function (service) {\n ModalService.confirm({\n title: 'Rollback service',\n message: 'Are you sure you want to rollback?',\n buttons: {\n confirm: {\n label: 'Yes',\n className: 'btn-danger',\n },\n },\n callback: function onConfirm(confirmed) {\n if (!confirmed) {\n return;\n }\n rollbackService(service);\n },\n });\n };\n\n $scope.setPullImageValidity = setPullImageValidity;\n function setPullImageValidity(validity) {\n $scope.state.pullImageValidity = validity;\n }\n\n $scope.updateService = function updateService(service) {\n let config = {};\n service, (config = buildChanges(service));\n ServiceService.update(service, config).then(\n function (data) {\n if (data.message && data.message.match(/^rpc error:/)) {\n Notifications.error('Failure', data, 'Error');\n } else {\n Notifications.success('Service successfully updated', 'Service updated');\n $scope.updateWebhookRegistryId();\n }\n $scope.cancelChanges({});\n initView();\n },\n function (e) {\n Notifications.error('Failure', e, 'Unable to update service');\n }\n );\n };\n\n $scope.removeService = function () {\n ModalService.confirmDeletion('Do you want to remove this service? All the containers associated to this service will be removed too.', function onConfirm(confirmed) {\n if (!confirmed) {\n return;\n }\n removeService();\n });\n };\n\n function removeService() {\n $scope.state.deletionInProgress = true;\n ServiceService.remove($scope.service)\n .then(function success() {\n return $q.when($scope.webhookID && WebhookService.deleteWebhook($scope.webhookID));\n })\n .then(function success() {\n Notifications.success('Service successfully deleted');\n $state.go('docker.services', {});\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to remove service');\n })\n .finally(function final() {\n $scope.state.deletionInProgress = false;\n });\n }\n\n $scope.forceUpdateService = function (service) {\n ModalService.confirmServiceForceUpdate('Do you want to force an update of the service? All the tasks associated to the service will be recreated.', function (result) {\n if (!result) {\n return;\n }\n var pullImage = false;\n if (result[0]) {\n pullImage = true;\n }\n forceUpdateService(service, pullImage);\n });\n };\n\n function forceUpdateService(service, pullImage) {\n var config = ServiceHelper.serviceToConfig(service.Model);\n if (pullImage) {\n config.TaskTemplate.ContainerSpec.Image = ImageHelper.removeDigestFromRepository(config.TaskTemplate.ContainerSpec.Image);\n }\n\n // As explained in https://github.com/docker/swarmkit/issues/2364 ForceUpdate can accept a random\n // value or an increment of the counter value to force an update.\n config.TaskTemplate.ForceUpdate++;\n $scope.state.updateInProgress = true;\n ServiceService.update(service, config)\n .then(function success() {\n Notifications.success('Service successfully updated', service.Name);\n $scope.cancelChanges({});\n initView();\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to force update service', service.Name);\n })\n .finally(function final() {\n $scope.state.updateInProgress = false;\n });\n }\n\n function translateServiceArrays(service) {\n service.ServiceSecrets = service.Secrets ? service.Secrets.map(SecretHelper.flattenSecret) : [];\n service.ServiceConfigs = service.Configs ? service.Configs.map(ConfigHelper.flattenConfig) : [];\n service.EnvironmentVariables = envVarsUtils\n .parseArrayOfStrings(service.Env)\n .map((v) => ({ ...v, added: true }))\n .sort((v1, v2) => (v1.name > v2.name ? 1 : -1));\n service.LogDriverOpts = ServiceHelper.translateLogDriverOptsToKeyValue(service.LogDriverOpts);\n service.ServiceLabels = LabelHelper.fromLabelHashToKeyValue(service.Labels);\n service.ServiceContainerLabels = LabelHelper.fromLabelHashToKeyValue(service.ContainerLabels);\n service.ServiceMounts = angular.copy(service.Mounts);\n service.ServiceConstraints = ServiceHelper.translateConstraintsToKeyValue(service.Constraints);\n service.ServicePreferences = ServiceHelper.translatePreferencesToKeyValue(service.Preferences);\n service.Hosts = ServiceHelper.translateHostsEntriesToHostnameIP(service.Hosts);\n }\n\n function transformResources(service) {\n service.LimitNanoCPUs = service.LimitNanoCPUs / 1000000000 || 0;\n service.ReservationNanoCPUs = service.ReservationNanoCPUs / 1000000000 || 0;\n service.LimitMemoryBytes = service.LimitMemoryBytes / 1024 / 1024 || 0;\n service.ReservationMemoryBytes = service.ReservationMemoryBytes / 1024 / 1024 || 0;\n }\n\n function transformDurations(service) {\n service.RestartDelay = ServiceHelper.translateNanosToHumanDuration(service.RestartDelay) || '5s';\n service.RestartWindow = ServiceHelper.translateNanosToHumanDuration(service.RestartWindow) || '0s';\n service.UpdateDelay = ServiceHelper.translateNanosToHumanDuration(service.UpdateDelay) || '0s';\n service.StopGracePeriod = service.StopGracePeriod ? ServiceHelper.translateNanosToHumanDuration(service.StopGracePeriod) : '';\n }\n\n function initView() {\n var apiVersion = $scope.applicationState.endpoint.apiVersion;\n var agentProxy = $scope.applicationState.endpoint.mode.agentProxy;\n\n var service = null;\n ServiceService.service($transition$.params().id)\n .then(function success(data) {\n service = data;\n $scope.isUpdating = $scope.lastVersion >= service.Version;\n if (!$scope.isUpdating) {\n $scope.lastVersion = service.Version;\n }\n\n transformResources(service);\n translateServiceArrays(service);\n transformDurations(service);\n $scope.service = service;\n originalService = angular.copy(service);\n\n return $q.all({\n volumes: VolumeService.volumes(),\n tasks: TaskService.tasks({ service: [service.Name] }),\n containers: agentProxy ? ContainerService.containers() : [],\n nodes: NodeService.nodes(),\n secrets: apiVersion >= 1.25 ? SecretService.secrets() : [],\n configs: apiVersion >= 1.3 ? ConfigService.configs() : [],\n availableImages: ImageService.images(),\n availableLoggingDrivers: PluginService.loggingPlugins(apiVersion < 1.25),\n availableNetworks: NetworkService.networks(true, true, apiVersion >= 1.25),\n webhooks: WebhookService.webhooks(service.Id, endpoint.Id),\n });\n })\n .then(async function success(data) {\n $scope.nodes = data.nodes;\n $scope.configs = data.configs;\n $scope.secrets = data.secrets;\n $scope.availableImages = ImageService.getUniqueTagListFromImages(data.availableImages);\n $scope.availableLoggingDrivers = data.availableLoggingDrivers;\n $scope.availableVolumes = data.volumes;\n $scope.allowBindMounts = endpoint.SecuritySettings.allowBindMountsForRegularUsers;\n $scope.isAdmin = Authentication.isAdmin();\n $scope.availableNetworks = data.availableNetworks;\n $scope.swarmNetworks = _.filter($scope.availableNetworks, (network) => network.Scope === 'swarm');\n\n const serviceNetworks = _.uniqBy(_.concat($scope.service.Model.Spec.Networks || [], $scope.service.Model.Spec.TaskTemplate.Networks || []), 'Target');\n const networks = _.filter(\n _.map(serviceNetworks, ({ Target }) => _.find(data.availableNetworks, { Id: Target })),\n Boolean\n );\n\n if (_.some($scope.service.Ports, (port) => port.PublishMode === 'ingress')) {\n const ingressNetwork = _.find($scope.availableNetworks, (network) => network.Ingress);\n if (ingressNetwork) {\n networks.unshift(ingressNetwork);\n }\n }\n\n $scope.service.Networks = await Promise.all(\n _.map(networks, async (item) => {\n let addr = '';\n if (item.IPAM.Config.length) {\n addr = item.IPAM.Config[0].Subnet;\n } else {\n const network = await NetworkService.network(item.Id);\n addr = (network && network.IPAM && network.IPAM.Config && network.IPAM.Config.length && network.IPAM.Config[0].Subnet) || '';\n }\n return { Id: item.Id, Name: item.Name, Addr: addr, Editable: !item.Ingress };\n })\n );\n\n originalService.Networks = angular.copy($scope.service.Networks);\n\n if (data.webhooks.length > 0) {\n var webhook = data.webhooks[0];\n $scope.WebhookExists = true;\n $scope.webhookID = webhook.Id;\n $scope.webhookURL = WebhookHelper.returnWebhookUrl(webhook.Token);\n }\n\n var tasks = data.tasks;\n\n if (agentProxy) {\n var containers = data.containers;\n for (var i = 0; i < tasks.length; i++) {\n var task = tasks[i];\n TaskHelper.associateContainerToTask(task, containers);\n }\n }\n\n ServiceHelper.associateTasksToService(service, tasks);\n\n $scope.tasks = data.tasks;\n\n // Set max cpu value\n var maxCpus = 0;\n for (var n in data.nodes) {\n if (data.nodes[n].CPUs && data.nodes[n].CPUs > maxCpus) {\n maxCpus = data.nodes[n].CPUs;\n }\n }\n if (maxCpus > 0) {\n $scope.state.sliderMaxCpu = maxCpus / 1000000000;\n } else {\n $scope.state.sliderMaxCpu = 32;\n }\n\n const image = $scope.service.Model.Spec.TaskTemplate.ContainerSpec.Image;\n RegistryService.retrievePorRegistryModelFromRepository(image, endpoint.Id).then((model) => {\n $scope.formValues.RegistryModel = model;\n $scope.initialRegistryID = _.get(model, 'Registry.Id', 0);\n });\n\n // Default values\n $scope.state.addSecret = { override: false };\n\n $timeout(function () {\n $anchorScroll();\n });\n })\n .catch(function error(err) {\n $scope.secrets = [];\n $scope.configs = [];\n Notifications.error('Failure', err, 'Unable to retrieve service details');\n });\n }\n\n $scope.updateServiceAttribute = updateServiceAttribute;\n function updateServiceAttribute(service, name) {\n if (service[name] !== originalService[name] || !(name in originalService)) {\n service.hasChanges = true;\n }\n previousServiceValues.push(name);\n }\n\n $scope.filterNetworks = filterNetworks;\n function filterNetworks(networks, current) {\n return networks.filter((network) => !network.Ingress && (network.Id === current.Id || $scope.service.Networks.every((serviceNetwork) => network.Id !== serviceNetwork.Id)));\n }\n\n function updateServiceArray(service, name) {\n previousServiceValues.push(name);\n service.hasChanges = true;\n }\n\n initView();\n },\n]);\n","var path = 'app/docker/views/services/edit/includes/configs.html';\nvar html = \"<form ng-if=\\\"applicationState.endpoint.apiVersion >= 1.3\\\" id=\\\"service-configs\\\" ng-submit=\\\"updateService(service)\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-tasks\\\" title-text=\\\"Configs\\\"> </rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"form-inline\\\" style=\\\"padding: 10px;\\\" authorization=\\\"DockerServiceUpdate\\\">\\n Add a config:\\n <select class=\\\"form-control\\\" ng-options=\\\"config.Name for config in configs | orderBy: 'Name'\\\" ng-model=\\\"newConfig\\\">\\n <option selected disabled hidden value=\\\"\\\">Select a config</option>\\n </select>\\n <a class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"addConfig(service, newConfig)\\\"> <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add config </a>\\n </div>\\n <table class=\\\"table\\\" style=\\\"margin-top: 5px;\\\">\\n <thead>\\n <tr>\\n <th>Name</th>\\n <th>Path in container</th>\\n <th>UID</th>\\n <th>GID</th>\\n <th>Mode</th>\\n <th></th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr ng-repeat=\\\"config in service.ServiceConfigs\\\">\\n <td\\n ><a ui-sref=\\\"docker.configs.config({id: config.Id})\\\">{{ config.Name }}</a></td\\n >\\n <td>\\n <input\\n class=\\\"form-control\\\"\\n ng-model=\\\"config.FileName\\\"\\n ng-change=\\\"updateConfig(service)\\\"\\n placeholder=\\\"e.g. /path/in/container\\\"\\n required\\n disable-authorization=\\\"DockerServiceUpdate\\\"\\n />\\n </td>\\n <td>{{ config.Uid }}</td>\\n <td>{{ config.Gid }}</td>\\n <td>{{ config.Mode }}</td>\\n <td authorization=\\\"DockerServiceUpdate\\\">\\n <button class=\\\"btn btn-xs btn-danger pull-right\\\" type=\\\"button\\\" ng-click=\\\"removeConfig(service, $index)\\\" ng-disabled=\\\"isUpdating\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i> Remove config\\n </button>\\n </td>\\n </tr>\\n <tr ng-if=\\\"service.ServiceConfigs.length === 0\\\">\\n <td colspan=\\\"6\\\" class=\\\"text-center text-muted\\\">No configs associated to this service.</td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n <rd-widget-footer authorization=\\\"DockerServiceUpdate\\\">\\n <div class=\\\"btn-toolbar\\\" role=\\\"toolbar\\\">\\n <div class=\\\"btn-group\\\" role=\\\"group\\\">\\n <button type=\\\"submit\\\" class=\\\"btn btn-primary btn-sm\\\" ng-disabled=\\\"!hasChanges(service, ['ServiceConfigs'])\\\">Apply changes</button>\\n <button type=\\\"button\\\" class=\\\"btn btn-default btn-sm dropdown-toggle\\\" data-toggle=\\\"dropdown\\\" aria-haspopup=\\\"true\\\" aria-expanded=\\\"false\\\">\\n <span class=\\\"caret\\\"></span>\\n </button>\\n <ul class=\\\"dropdown-menu\\\">\\n <li><a ng-click=\\\"cancelChanges(service, ['ServiceConfigs'])\\\">Reset changes</a></li>\\n <li><a ng-click=\\\"cancelChanges(service)\\\">Reset all changes</a></li>\\n </ul>\\n </div>\\n </div>\\n </rd-widget-footer>\\n </rd-widget>\\n</form>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/services/edit/includes/constraints.html';\nvar html = \"<div ng-if=\\\"service.ServiceConstraints\\\" id=\\\"service-placement-constraints\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-tasks\\\" title-text=\\\"Placement constraints\\\">\\n <div class=\\\"nopadding\\\" authorization=\\\"DockerServiceUpdate\\\">\\n <a class=\\\"btn btn-default btn-sm pull-right\\\" ng-click=\\\"isUpdating || addPlacementConstraint(service)\\\" ng-disabled=\\\"isUpdating\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> placement constraint\\n </a>\\n </div>\\n </rd-widget-header>\\n <rd-widget-body ng-if=\\\"service.ServiceConstraints.length === 0\\\">\\n <p>There are no placement constraints for this service.</p>\\n </rd-widget-body>\\n <rd-widget-body ng-if=\\\"service.ServiceConstraints.length > 0\\\" classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <thead>\\n <tr>\\n <th>Name</th>\\n <th>Operator</th>\\n <th>Value</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr ng-repeat=\\\"constraint in service.ServiceConstraints\\\">\\n <td>\\n <div class=\\\"input-group input-group-sm\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"constraint.key\\\"\\n placeholder=\\\"e.g. node.role\\\"\\n ng-change=\\\"updatePlacementConstraint(service, constraint)\\\"\\n ng-disabled=\\\"isUpdating\\\"\\n disable-authorization=\\\"DockerServiceUpdate\\\"\\n />\\n </div>\\n </td>\\n <td>\\n <div class=\\\"input-group input-group-sm\\\">\\n <select\\n name=\\\"constraintOperator\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"constraint.operator\\\"\\n ng-change=\\\"updatePlacementConstraint(service, constraint)\\\"\\n ng-disabled=\\\"isUpdating\\\"\\n disable-authorization=\\\"DockerServiceUpdate\\\"\\n >\\n <option value=\\\"==\\\">==</option>\\n <option value=\\\"!=\\\">!=</option>\\n </select>\\n </div>\\n </td>\\n <td>\\n <div class=\\\"input-group input-group-sm\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"constraint.value\\\"\\n placeholder=\\\"e.g. manager\\\"\\n ng-change=\\\"updatePlacementConstraint(service, constraint)\\\"\\n ng-disabled=\\\"isUpdating\\\"\\n disable-authorization=\\\"DockerServiceUpdate\\\"\\n />\\n <span class=\\\"input-group-btn\\\" authorization=\\\"DockerServiceUpdate\\\">\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removePlacementConstraint(service, $index)\\\" ng-disabled=\\\"isUpdating\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </span>\\n </div>\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n <rd-widget-footer authorization=\\\"DockerServiceUpdate\\\">\\n <div class=\\\"btn-toolbar\\\" role=\\\"toolbar\\\">\\n <div class=\\\"btn-group\\\" role=\\\"group\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-primary btn-sm\\\" ng-disabled=\\\"!hasChanges(service, ['ServiceConstraints'])\\\" ng-click=\\\"updateService(service)\\\">Apply changes</button>\\n <button type=\\\"button\\\" class=\\\"btn btn-default btn-sm dropdown-toggle\\\" data-toggle=\\\"dropdown\\\" aria-haspopup=\\\"true\\\" aria-expanded=\\\"false\\\">\\n <span class=\\\"caret\\\"></span>\\n </button>\\n <ul class=\\\"dropdown-menu\\\">\\n <li><a ng-click=\\\"cancelChanges(service, ['ServiceConstraints'])\\\">Reset changes</a></li>\\n <li><a ng-click=\\\"cancelChanges(service)\\\">Reset all changes</a></li>\\n </ul>\\n </div>\\n </div>\\n </rd-widget-footer>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/services/edit/includes/container-specs.html';\nvar html = \"<div>\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-list-alt\\\" title-text=\\\"Container spec\\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr>\\n <td>CMD</td>\\n <td\\n ><code ng-if=\\\"service.Command\\\">{{ service.Command | command }}</code></td\\n >\\n <td>\\n <p class=\\\"small text-muted\\\" style=\\\"margin-top: 10px;\\\">\\n Command to execute.\\n </p>\\n </td>\\n </tr>\\n <tr>\\n <td>Args</td>\\n <td\\n ><code ng-if=\\\"service.Arguments\\\">{{ service.Arguments }}</code></td\\n >\\n <td>\\n <p class=\\\"small text-muted\\\" style=\\\"margin-top: 10px;\\\">\\n Arguments passed to command in container.\\n </p>\\n </td>\\n </tr>\\n <tr>\\n <td>User</td>\\n <td>{{ service.User }}</td>\\n <td>\\n <p class=\\\"small text-muted\\\" style=\\\"margin-top: 10px;\\\">\\n Username or UID.\\n </p>\\n </td>\\n </tr>\\n <tr>\\n <td>Working directory</td>\\n <td>{{ service.Dir }}</td>\\n <td>\\n <p class=\\\"small text-muted\\\" style=\\\"margin-top: 10px;\\\">\\n Working directory inside the container.\\n </p>\\n </td>\\n </tr>\\n <tr>\\n <td>Stop grace period</td>\\n <td>{{ service.StopGracePeriod }}</td>\\n <td>\\n <p class=\\\"small text-muted\\\" style=\\\"margin-top: 10px;\\\">\\n Time to wait before force killing a container (default none).\\n </p>\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/services/edit/includes/containerlabels.html';\nvar html = \"<div id=\\\"service-container-labels\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-tasks\\\" title-text=\\\"Container labels\\\">\\n <div class=\\\"nopadding\\\" authorization=\\\"DockerServiceUpdate\\\">\\n <a class=\\\"btn btn-default btn-sm pull-right\\\" ng-click=\\\"isUpdating ||addContainerLabel(service)\\\" ng-disabled=\\\"isUpdating\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> container label\\n </a>\\n </div>\\n </rd-widget-header>\\n <rd-widget-body ng-if=\\\"service.ServiceContainerLabels.length === 0\\\">\\n <p>There are no container labels for this service.</p>\\n </rd-widget-body>\\n <rd-widget-body ng-if=\\\"service.ServiceContainerLabels.length > 0\\\" classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <thead>\\n <tr>\\n <th>Label</th>\\n <th>Value</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr ng-repeat=\\\"label in service.ServiceContainerLabels\\\">\\n <td>\\n <div class=\\\"input-group input-group-sm\\\">\\n <span class=\\\"input-group-addon fit-text-size\\\">name</span>\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"label.key\\\"\\n placeholder=\\\"e.g. com.example.foo\\\"\\n ng-change=\\\"updateContainerLabel(service, label)\\\"\\n ng-disabled=\\\"isUpdating\\\"\\n disable-authorization=\\\"DockerServiceUpdate\\\"\\n />\\n </div>\\n </td>\\n <td>\\n <div class=\\\"input-group input-group-sm\\\">\\n <span class=\\\"input-group-addon fit-text-size\\\">value</span>\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"label.value\\\"\\n placeholder=\\\"e.g. bar\\\"\\n ng-change=\\\"updateContainerLabel(service, label)\\\"\\n ng-disabled=\\\"isUpdating\\\"\\n disable-authorization=\\\"DockerServiceUpdate\\\"\\n />\\n <span class=\\\"input-group-btn\\\" authorization=\\\"DockerServiceUpdate\\\">\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removeContainerLabel(service, $index)\\\" ng-disabled=\\\"isUpdating\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </span>\\n </div>\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n <rd-widget-footer authorization=\\\"DockerServiceUpdate\\\">\\n <div class=\\\"btn-toolbar\\\" role=\\\"toolbar\\\">\\n <div class=\\\"btn-group\\\" role=\\\"group\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-primary btn-sm\\\" ng-disabled=\\\"!hasChanges(service, ['ServiceContainerLabels'])\\\" ng-click=\\\"updateService(service)\\\"\\n >Apply changes</button\\n >\\n <button type=\\\"button\\\" class=\\\"btn btn-default btn-sm dropdown-toggle\\\" data-toggle=\\\"dropdown\\\" aria-haspopup=\\\"true\\\" aria-expanded=\\\"false\\\">\\n <span class=\\\"caret\\\"></span>\\n </button>\\n <ul class=\\\"dropdown-menu\\\">\\n <li><a ng-click=\\\"cancelChanges(service, ['ServiceContainerLabels'])\\\">Reset changes</a></li>\\n <li><a ng-click=\\\"cancelChanges(service)\\\">Reset all changes</a></li>\\n </ul>\\n </div>\\n </div>\\n </rd-widget-footer>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/services/edit/includes/environmentvariables.html';\nvar html = \"<ng-form ng-if=\\\"service.EnvironmentVariables\\\" id=\\\"service-env-variables\\\" name=\\\"serviceEnvForm\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-tasks\\\" title-text=\\\"Environment variables\\\">\\n <div class=\\\"nopadding\\\" authorization=\\\"DockerServiceUpdate\\\">\\n <a class=\\\"btn btn-default btn-sm pull-right\\\" ng-click=\\\"isUpdating || addEnvironmentVariable(service)\\\" ng-disabled=\\\"isUpdating\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> environment variable\\n </a>\\n </div>\\n </rd-widget-header>\\n <rd-widget-body ng-if=\\\"service.EnvironmentVariables.length === 0\\\">\\n <p>There are no environment variables for this service.</p>\\n </rd-widget-body>\\n <rd-widget-body ng-if=\\\"service.EnvironmentVariables.length > 0\\\">\\n <environment-variables-panel is-name-disabled=\\\"true\\\" ng-model=\\\"service.EnvironmentVariables\\\" on-change=\\\"(onChangeEnvVars)\\\"></environment-variables-panel>\\n </rd-widget-body>\\n <rd-widget-footer authorization=\\\"DockerServiceUpdate\\\">\\n <div class=\\\"btn-toolbar\\\" role=\\\"toolbar\\\">\\n <div class=\\\"btn-group\\\" role=\\\"group\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"!hasChanges(service, ['EnvironmentVariables']) || serviceEnvForm.$invalid\\\"\\n ng-click=\\\"updateService(service)\\\"\\n >\\n Apply changes\\n </button>\\n <button type=\\\"button\\\" class=\\\"btn btn-default btn-sm dropdown-toggle\\\" data-toggle=\\\"dropdown\\\" aria-haspopup=\\\"true\\\" aria-expanded=\\\"false\\\">\\n <span class=\\\"caret\\\"></span>\\n </button>\\n <ul class=\\\"dropdown-menu\\\">\\n <li><a ng-click=\\\"cancelChanges(service, ['EnvironmentVariables'])\\\">Reset changes</a></li>\\n <li><a ng-click=\\\"cancelChanges(service)\\\">Reset all changes</a></li>\\n </ul>\\n </div>\\n </div>\\n </rd-widget-footer>\\n </rd-widget>\\n</ng-form>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/services/edit/includes/hosts.html';\nvar html = \"<div>\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-tasks\\\" title-text=\\\"Hosts file entries\\\">\\n <div class=\\\"nopadding\\\" authorization=\\\"DockerServiceUpdate\\\">\\n <a class=\\\"btn btn-default btn-sm pull-right\\\" ng-click=\\\"isUpdating ||addHostsEntry(service)\\\" ng-disabled=\\\"isUpdating\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add host entry\\n </a>\\n </div>\\n </rd-widget-header>\\n <rd-widget-body ng-if=\\\"!service.Hosts || service.Hosts.length === 0\\\">\\n <p>The Hosts file has no extra entries.</p>\\n </rd-widget-body>\\n <rd-widget-body ng-if=\\\"service.Hosts.length > 0\\\" classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <thead>\\n <tr>\\n <th>Hostname</th>\\n <th>IP</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr ng-repeat=\\\"entry in service.Hosts\\\">\\n <td>\\n <div class=\\\"input-group input-group-sm\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"entry.hostname\\\"\\n placeholder=\\\"e.g. example.com\\\"\\n ng-change=\\\"updateHostsEntry(service, entry)\\\"\\n ng-disabled=\\\"isUpdating\\\"\\n disable-authorization=\\\"DockerServiceUpdate\\\"\\n />\\n </div>\\n </td>\\n <td>\\n <div class=\\\"input-group input-group-sm\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"entry.ip\\\"\\n placeholder=\\\"e.g. 10.0.1.1\\\"\\n ng-change=\\\"updateHostsEntry(service, entry)\\\"\\n ng-disabled=\\\"isUpdating\\\"\\n disable-authorization=\\\"DockerServiceUpdate\\\"\\n />\\n <span class=\\\"input-group-btn\\\" authorization=\\\"DockerServiceUpdate\\\">\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removeHostsEntry(service, $index)\\\" ng-disabled=\\\"isUpdating\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </span>\\n </div>\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n <rd-widget-footer authorization=\\\"DockerServiceUpdate\\\">\\n <div class=\\\"btn-toolbar\\\" role=\\\"toolbar\\\">\\n <div class=\\\"btn-group\\\" role=\\\"group\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-primary btn-sm\\\" ng-disabled=\\\"!hasChanges(service, ['Hosts'])\\\" ng-click=\\\"updateService(service)\\\">Apply changes</button>\\n <button type=\\\"button\\\" class=\\\"btn btn-default btn-sm dropdown-toggle\\\" data-toggle=\\\"dropdown\\\" aria-haspopup=\\\"true\\\" aria-expanded=\\\"false\\\">\\n <span class=\\\"caret\\\"></span>\\n </button>\\n <ul class=\\\"dropdown-menu\\\">\\n <li><a ng-click=\\\"cancelChanges(service, ['Hosts'])\\\">Reset changes</a></li>\\n <li><a ng-click=\\\"cancelChanges(service)\\\">Reset all changes</a></li>\\n </ul>\\n </div>\\n </div>\\n </rd-widget-footer>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/services/edit/includes/image.html';\nvar html = \"<div id=\\\"service-container-image\\\" authorization=\\\"DockerServiceUpdate\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-clone\\\" title-text=\\\"Change container image\\\"> </rd-widget-header>\\n <rd-widget-body ng-if=\\\"!isUpdating\\\">\\n <form class=\\\"form-horizontal\\\">\\n <por-image-registry\\n model=\\\"formValues.RegistryModel\\\"\\n auto-complete=\\\"true\\\"\\n label-class=\\\"col-sm-1\\\"\\n input-class=\\\"col-sm-11\\\"\\n endpoint=\\\"endpoint\\\"\\n is-admin=\\\"isAdmin\\\"\\n check-rate-limits=\\\"true\\\"\\n set-validity=\\\"setPullImageValidity\\\"\\n >\\n </por-image-registry>\\n </form>\\n </rd-widget-body>\\n <rd-widget-body ng-if=\\\"isUpdating\\\">\\n <p>Image modification is disabled while service is updating.</p>\\n </rd-widget-body>\\n <rd-widget-footer authorization=\\\"DockerServiceUpdate\\\">\\n <div class=\\\"btn-toolbar\\\" role=\\\"toolbar\\\">\\n <div class=\\\"btn-group\\\" role=\\\"group\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-primary btn-sm\\\" ng-disabled=\\\"!hasChanges(service, ['Image'])\\\" ng-click=\\\"updateService(service)\\\">Apply changes</button>\\n <button type=\\\"button\\\" class=\\\"btn btn-default btn-sm dropdown-toggle\\\" data-toggle=\\\"dropdown\\\" aria-haspopup=\\\"true\\\" aria-expanded=\\\"false\\\">\\n <span class=\\\"caret\\\"></span>\\n </button>\\n <ul class=\\\"dropdown-menu\\\">\\n <li><a ng-click=\\\"cancelChanges(service, ['Image'])\\\">Reset changes</a></li>\\n <li><a ng-click=\\\"cancelChanges(service)\\\">Reset all changes</a></li>\\n </ul>\\n </div>\\n </div>\\n </rd-widget-footer>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/services/edit/includes/logging.html';\nvar html = \"<div id=\\\"service-logging-driver\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-tasks\\\" title-text=\\\"Logging driver\\\"> </rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"form-inline\\\" style=\\\"padding: 10px;\\\" authorization=\\\"DockerServiceUpdate\\\">\\n Driver:\\n <select class=\\\"form-control\\\" ng-model=\\\"service.LogDriverName\\\" ng-change=\\\"updateLogDriverName(service)\\\" ng-disabled=\\\"isUpdating\\\">\\n <option selected value=\\\"\\\">Default logging driver</option>\\n <option ng-repeat=\\\"driver in availableLoggingDrivers\\\" ng-value=\\\"driver\\\">{{ driver }}</option>\\n <option value=\\\"none\\\">none</option>\\n </select>\\n <a class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"!service.LogDriverName || service.LogDriverName === 'none' || addLogDriverOpt(service)\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add logging driver option\\n </a>\\n </div>\\n <table class=\\\"table\\\">\\n <thead>\\n <tr>\\n <th>Option</th>\\n <th>Value</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr ng-repeat=\\\"option in service.LogDriverOpts\\\">\\n <td>\\n <div class=\\\"input-group input-group-sm\\\">\\n <span class=\\\"input-group-addon fit-text-size\\\">name</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"option.key\\\" ng-disabled=\\\"option.added || isUpdating\\\" placeholder=\\\"e.g. FOO\\\" />\\n </div>\\n </td>\\n <td>\\n <div class=\\\"input-group input-group-sm\\\">\\n <span class=\\\"input-group-addon fit-text-size\\\">value</span>\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"option.value\\\"\\n ng-change=\\\"updateLogDriverOpt(service, option)\\\"\\n placeholder=\\\"e.g. bar\\\"\\n ng-disabled=\\\"isUpdating\\\"\\n disable-authorization=\\\"DockerServiceUpdate\\\"\\n />\\n <span class=\\\"input-group-btn\\\" authorization=\\\"DockerServiceUpdate\\\">\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removeLogDriverOpt(service, $index)\\\" ng-disabled=\\\"isUpdating\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </span>\\n </div>\\n </td>\\n </tr>\\n <tr ng-if=\\\"service.LogDriverOpts.length === 0\\\">\\n <td colspan=\\\"6\\\" class=\\\"text-center text-muted\\\">No options associated to this logging driver.</td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n <rd-widget-footer authorization=\\\"DockerServiceUpdate\\\">\\n <div class=\\\"btn-toolbar\\\" role=\\\"toolbar\\\">\\n <div class=\\\"btn-group\\\" role=\\\"group\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-primary btn-sm\\\" ng-disabled=\\\"!hasChanges(service, ['LogDriverName', 'LogDriverOpts'])\\\" ng-click=\\\"updateService(service)\\\"\\n >Apply changes</button\\n >\\n <button type=\\\"button\\\" class=\\\"btn btn-default btn-sm dropdown-toggle\\\" data-toggle=\\\"dropdown\\\" aria-haspopup=\\\"true\\\" aria-expanded=\\\"false\\\">\\n <span class=\\\"caret\\\"></span>\\n </button>\\n <ul class=\\\"dropdown-menu\\\">\\n <li><a ng-click=\\\"cancelChanges(service, ['LogDriverName', 'LogDriverOpts'])\\\">Reset changes</a></li>\\n <li><a ng-click=\\\"cancelChanges(service)\\\">Reset all changes</a></li>\\n </ul>\\n </div>\\n </div>\\n </rd-widget-footer>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/services/edit/includes/mounts.html';\nvar html = \"<div ng-if=\\\"service.ServiceMounts\\\" id=\\\"service-mounts\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-tasks\\\" title-text=\\\"Mounts\\\">\\n <div class=\\\"nopadding\\\" authorization=\\\"DockerServiceUpdate\\\">\\n <a class=\\\"btn btn-default btn-sm pull-right\\\" ng-click=\\\"isUpdating ||addMount(service)\\\" ng-disabled=\\\"isUpdating\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> mount\\n </a>\\n </div>\\n </rd-widget-header>\\n <rd-widget-body ng-if=\\\"service.ServiceMounts.length === 0\\\">\\n <p>There are no mounts for this service.</p>\\n </rd-widget-body>\\n <rd-widget-body ng-if=\\\"service.ServiceMounts.length > 0\\\" classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <thead>\\n <tr>\\n <th ng-if=\\\"isAdmin || allowBindMounts\\\">Type</th>\\n <th>Source</th>\\n <th>Target</th>\\n <th authorization=\\\"DockerServiceUpdate\\\">Read only</th>\\n <th authorization=\\\"DockerServiceUpdate\\\">Actions</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr ng-repeat=\\\"mount in service.ServiceMounts\\\">\\n <td ng-if=\\\"isAdmin || allowBindMounts\\\">\\n <select\\n name=\\\"mountType\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"mount.Type\\\"\\n ng-change=\\\"onChangeMountType(service, mount)\\\"\\n ng-disabled=\\\"isUpdating\\\"\\n disable-authorization=\\\"DockerServiceUpdate\\\"\\n >\\n <option value=\\\"volume\\\">Volume</option>\\n <option value=\\\"bind\\\">Bind</option>\\n </select>\\n </td>\\n <td>\\n <select\\n class=\\\"form-control\\\"\\n ng-model=\\\"mount.Source\\\"\\n ng-options=\\\"vol.Id as ((vol.Id|truncate:30) + ' - ' + (vol.Driver|truncate:30)) for vol in availableVolumes\\\"\\n ng-if=\\\"mount.Type === 'volume'\\\"\\n ng-change=\\\"updateMount(service, mount)\\\"\\n disable-authorization=\\\"DockerServiceUpdate\\\"\\n >\\n <option selected disabled hidden value=\\\"\\\">Select a volume</option>\\n </select>\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n name=\\\"\\\"\\n ng-model=\\\"mount.Source\\\"\\n placeholder=\\\"e.g. /tmp/portainer/data\\\"\\n ng-change=\\\"updateMount(service, mount)\\\"\\n ng-disabled=\\\"isUpdating || (!isAdmin && !allowBindMounts && mount.Type === 'bind')\\\"\\n ng-if=\\\"mount.Type === 'bind'\\\"\\n />\\n <div class=\\\"col-sm-12 small text-warning\\\" ng-show=\\\"!mount.Source\\\"> <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Source is required. </div>\\n </td>\\n <td>\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"mount.Target\\\"\\n placeholder=\\\"e.g. /tmp/portainer/data\\\"\\n ng-change=\\\"updateMount(service, mount)\\\"\\n ng-disabled=\\\"isUpdating\\\"\\n disable-authorization=\\\"DockerServiceUpdate\\\"\\n />\\n <div class=\\\"col-sm-12 small text-warning\\\" ng-show=\\\"!mount.Target\\\"> <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Target is required. </div>\\n </td>\\n <td authorization=\\\"DockerServiceUpdate\\\">\\n <input type=\\\"checkbox\\\" class=\\\"form-control\\\" ng-model=\\\"mount.ReadOnly\\\" ng-change=\\\"updateMount(service, mount)\\\" ng-disabled=\\\"isUpdating\\\" />\\n </td>\\n <td authorization=\\\"DockerServiceUpdate\\\">\\n <span class=\\\"input-group-btn\\\">\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removeMount(service, $index)\\\" ng-disabled=\\\"isUpdating\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </span>\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n <rd-widget-footer authorization=\\\"DockerServiceUpdate\\\">\\n <div class=\\\"btn-toolbar\\\" role=\\\"toolbar\\\">\\n <div class=\\\"btn-group\\\" role=\\\"group\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-primary btn-sm\\\" ng-disabled=\\\"!mountsAreValid() || !hasChanges(service, ['ServiceMounts'])\\\" ng-click=\\\"updateService(service)\\\">\\n Apply changes\\n </button>\\n <button type=\\\"button\\\" class=\\\"btn btn-default btn-sm dropdown-toggle\\\" data-toggle=\\\"dropdown\\\" aria-haspopup=\\\"true\\\" aria-expanded=\\\"false\\\">\\n <span class=\\\"caret\\\"></span>\\n </button>\\n <ul class=\\\"dropdown-menu\\\">\\n <li><a ng-click=\\\"cancelChanges(service, ['ServiceMounts'])\\\">Reset changes</a></li>\\n <li><a ng-click=\\\"cancelChanges(service)\\\">Reset all changes</a></li>\\n </ul>\\n </div>\\n </div>\\n </rd-widget-footer>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/services/edit/includes/networks.html';\nvar html = \"<div id=\\\"service-network-specs\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-tasks\\\" title-text=\\\"Networks\\\">\\n <div class=\\\"nopadding\\\" authorization=\\\"DockerServiceUpdate\\\">\\n <a class=\\\"btn btn-default btn-sm pull-right\\\" ng-click=\\\"isUpdating || addNetwork(service)\\\" ng-disabled=\\\"isUpdating\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> network\\n </a>\\n </div>\\n </rd-widget-header>\\n <rd-widget-body ng-if=\\\"!service.Networks || service.Networks.length === 0\\\">\\n <p>This service is not connected to any networks.</p>\\n </rd-widget-body>\\n <rd-widget-body ng-if=\\\"service.Networks && service.Networks.length > 0\\\" classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <thead>\\n <tr>\\n <th>Name</th>\\n <th>ID</th>\\n <th>IP address</th>\\n <th>Actions</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr ng-repeat=\\\"network in service.Networks\\\">\\n <td>\\n <select\\n ng-if=\\\"network.Editable\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"network.Id\\\"\\n ng-change=\\\"updateNetwork(service)\\\"\\n ng-options=\\\"net.Id as net.Name for net in filterNetworks(swarmNetworks, network)\\\"\\n disable-authorization=\\\"DockerServiceUpdate\\\"\\n style=\\\"width: initial; min-width: 50%;\\\"\\n >\\n <option disabled value=\\\"\\\" selected>Select a network</option>\\n </select>\\n <span ng-if=\\\"!network.Editable\\\">{{ network.Name }}</span>\\n </td>\\n <td>\\n <a ui-sref=\\\"docker.networks.network({id: network.Id})\\\">{{ network.Id }}</a>\\n </td>\\n <td>\\n {{ network.Addr }}\\n </td>\\n <td ng-if=\\\"network.Editable\\\" authorization=\\\"DockerServiceUpdate\\\">\\n <span class=\\\"input-group-btn\\\">\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removeNetwork(service, $index)\\\" ng-disabled=\\\"isUpdating\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </span>\\n </td>\\n <td ng-if=\\\"!network.Editable\\\"></td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n <rd-widget-footer authorization=\\\"DockerServiceUpdate\\\">\\n <div class=\\\"btn-toolbar\\\" role=\\\"toolbar\\\">\\n <div class=\\\"btn-group\\\" role=\\\"group\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-primary btn-sm\\\" ng-disabled=\\\"isUpdating || !hasChanges(service, ['Networks'])\\\" ng-click=\\\"updateService(service)\\\">\\n Apply changes\\n </button>\\n <button type=\\\"button\\\" class=\\\"btn btn-default btn-sm dropdown-toggle\\\" data-toggle=\\\"dropdown\\\" aria-haspopup=\\\"true\\\" aria-expanded=\\\"false\\\">\\n <span class=\\\"caret\\\"></span>\\n </button>\\n <ul class=\\\"dropdown-menu\\\">\\n <li><a ng-click=\\\"cancelChanges(service, ['Networks'])\\\">Reset changes</a></li>\\n <li><a ng-click=\\\"cancelChanges(service)\\\">Reset all changes</a></li>\\n </ul>\\n </div>\\n </div>\\n </rd-widget-footer>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/services/edit/includes/placementPreferences.html';\nvar html = \"<div ng-if=\\\"service.ServicePreferences\\\" id=\\\"service-placement-preferences\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-tasks\\\" title-text=\\\"Placement preferences\\\">\\n <div class=\\\"nopadding\\\" authorization=\\\"DockerServiceUpdate\\\">\\n <a class=\\\"btn btn-default btn-sm pull-right\\\" ng-click=\\\"isUpdating || addPlacementPreference(service)\\\" ng-disabled=\\\"isUpdating\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> placement preference\\n </a>\\n </div>\\n </rd-widget-header>\\n <rd-widget-body ng-if=\\\"service.ServicePreferences.length === 0\\\">\\n <p>There are no placement preferences for this service.</p>\\n </rd-widget-body>\\n <rd-widget-body ng-if=\\\"service.ServicePreferences.length > 0\\\" classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <thead>\\n <tr>\\n <th>Strategy</th>\\n <th>Value</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr ng-repeat=\\\"preference in service.ServicePreferences\\\">\\n <td>\\n <div class=\\\"input-group input-group-sm\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"preference.strategy\\\"\\n placeholder=\\\"e.g. node.role\\\"\\n ng-change=\\\"updatePlacementPreference(service, preference)\\\"\\n ng-disabled=\\\"isUpdating\\\"\\n disable-authorization=\\\"DockerServiceUpdate\\\"\\n />\\n </div>\\n </td>\\n <td>\\n <div class=\\\"input-group input-group-sm\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"preference.value\\\"\\n placeholder=\\\"e.g. manager\\\"\\n ng-change=\\\"updatePlacementPreference(service, preference)\\\"\\n ng-disabled=\\\"isUpdating\\\"\\n disable-authorization=\\\"DockerServiceUpdate\\\"\\n />\\n <span class=\\\"input-group-btn\\\" authorization=\\\"DockerServiceUpdate\\\">\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removePlacementPreference(service, $index)\\\" ng-disabled=\\\"isUpdating\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </span>\\n </div>\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n <rd-widget-footer authorization=\\\"DockerServiceUpdate\\\">\\n <div class=\\\"btn-toolbar\\\" role=\\\"toolbar\\\">\\n <div class=\\\"btn-group\\\" role=\\\"group\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-primary btn-sm\\\" ng-disabled=\\\"!hasChanges(service, ['ServicePreferences'])\\\" ng-click=\\\"updateService(service)\\\">Apply changes</button>\\n <button type=\\\"button\\\" class=\\\"btn btn-default btn-sm dropdown-toggle\\\" data-toggle=\\\"dropdown\\\" aria-haspopup=\\\"true\\\" aria-expanded=\\\"false\\\">\\n <span class=\\\"caret\\\"></span>\\n </button>\\n <ul class=\\\"dropdown-menu\\\">\\n <li><a ng-click=\\\"cancelChanges(service, ['ServicePreferences'])\\\">Reset changes</a></li>\\n <li><a ng-click=\\\"cancelChanges(service)\\\">Reset all changes</a></li>\\n </ul>\\n </div>\\n </div>\\n </rd-widget-footer>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/services/edit/includes/ports.html';\nvar html = \"<div>\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-tasks\\\" title-text=\\\"Published ports\\\">\\n <div class=\\\"nopadding\\\" authorization=\\\"DockerServiceUpdate\\\">\\n <a class=\\\"btn btn-default btn-sm pull-right\\\" ng-click=\\\"isUpdating ||addPublishedPort(service)\\\" ng-disabled=\\\"isUpdating\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> port mapping\\n </a>\\n </div>\\n </rd-widget-header>\\n <rd-widget-body ng-if=\\\"!service.Ports || service.Ports.length === 0\\\">\\n <p>This service has no ports published.</p>\\n </rd-widget-body>\\n <rd-widget-body ng-if=\\\"service.Ports && service.Ports.length > 0\\\" classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <thead>\\n <tr>\\n <th>Host port</th>\\n <th>Container port</th>\\n <th>Protocol</th>\\n <th>Publish mode</th>\\n <th authorization=\\\"DockerServiceUpdate\\\">Actions</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr ng-repeat=\\\"portBinding in service.Ports\\\">\\n <td>\\n <div class=\\\"input-group input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">host</span>\\n <input\\n type=\\\"number\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"portBinding.PublishedPort\\\"\\n placeholder=\\\"e.g. 8080\\\"\\n ng-change=\\\"updatePublishedPort(service, mapping)\\\"\\n ng-disabled=\\\"isUpdating\\\"\\n disable-authorization=\\\"DockerServiceUpdate\\\"\\n />\\n </div>\\n </td>\\n <td>\\n <div class=\\\"input-group input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">container</span>\\n <input\\n type=\\\"number\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"portBinding.TargetPort\\\"\\n placeholder=\\\"e.g. 80\\\"\\n ng-change=\\\"updatePublishedPort(service, mapping)\\\"\\n ng-disabled=\\\"isUpdating\\\"\\n disable-authorization=\\\"DockerServiceUpdate\\\"\\n />\\n </div>\\n </td>\\n <td>\\n <div class=\\\"input-group input-group-sm\\\">\\n <select\\n class=\\\"selectpicker form-control\\\"\\n ng-model=\\\"portBinding.Protocol\\\"\\n ng-change=\\\"updatePublishedPort(service, mapping)\\\"\\n ng-disabled=\\\"isUpdating\\\"\\n disable-authorization=\\\"DockerServiceUpdate\\\"\\n >\\n <option value=\\\"tcp\\\">tcp</option>\\n <option value=\\\"udp\\\">udp</option>\\n </select>\\n </div>\\n </td>\\n <td>\\n <div class=\\\"input-group input-group-sm\\\">\\n <select\\n class=\\\"selectpicker form-control\\\"\\n ng-model=\\\"portBinding.PublishMode\\\"\\n ng-change=\\\"updatePublishedPort(service, mapping)\\\"\\n ng-disabled=\\\"isUpdating\\\"\\n disable-authorization=\\\"DockerServiceUpdate\\\"\\n >\\n <option value=\\\"ingress\\\">ingress</option>\\n <option value=\\\"host\\\">host</option>\\n </select>\\n </div>\\n </td>\\n <td authorization=\\\"DockerServiceUpdate\\\">\\n <span class=\\\"input-group-btn\\\">\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removePortPublishedBinding(service, $index)\\\" ng-disabled=\\\"isUpdating\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </span>\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n <rd-widget-footer authorization=\\\"DockerServiceUpdate\\\">\\n <div class=\\\"btn-toolbar\\\" role=\\\"toolbar\\\">\\n <div class=\\\"btn-group\\\" role=\\\"group\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-primary btn-sm\\\" ng-disabled=\\\"!hasChanges(service, ['Ports'])\\\" ng-click=\\\"updateService(service)\\\">Apply changes</button>\\n <button type=\\\"button\\\" class=\\\"btn btn-default btn-sm dropdown-toggle\\\" data-toggle=\\\"dropdown\\\" aria-haspopup=\\\"true\\\" aria-expanded=\\\"false\\\">\\n <span class=\\\"caret\\\"></span>\\n </button>\\n <ul class=\\\"dropdown-menu\\\">\\n <li><a ng-click=\\\"cancelChanges(service, ['Ports'])\\\">Reset changes</a></li>\\n <li><a ng-click=\\\"cancelChanges(service)\\\">Reset all changes</a></li>\\n </ul>\\n </div>\\n </div>\\n </rd-widget-footer>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/services/edit/includes/resources.html';\nvar html = \"<div id=\\\"service-resources\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-list-alt\\\" title-text=\\\"Resource limits and reservations\\\"> </rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr>\\n <td style=\\\"vertical-align: middle;\\\">\\n Memory reservation (MB)\\n </td>\\n <td>\\n <input\\n class=\\\"input-sm\\\"\\n type=\\\"number\\\"\\n step=\\\"0.125\\\"\\n min=\\\"0\\\"\\n ng-model=\\\"service.ReservationMemoryBytes\\\"\\n ng-change=\\\"updateServiceAttribute(service, 'ReservationMemoryBytes')\\\"\\n disable-authorization=\\\"DockerServiceUpdate\\\"\\n />\\n </td>\\n <td style=\\\"vertical-align: middle;\\\">\\n <p class=\\\"small text-muted\\\">\\n Minimum memory available on a node to run a task (set to 0 for unlimited)\\n </p>\\n </td>\\n </tr>\\n <tr>\\n <td style=\\\"vertical-align: middle;\\\">\\n Memory limit (MB)\\n </td>\\n <td>\\n <input\\n class=\\\"input-sm\\\"\\n type=\\\"number\\\"\\n step=\\\"0.125\\\"\\n min=\\\"0\\\"\\n ng-model=\\\"service.LimitMemoryBytes\\\"\\n ng-change=\\\"updateServiceAttribute(service, 'LimitMemoryBytes')\\\"\\n disable-authorization=\\\"DockerServiceUpdate\\\"\\n />\\n </td>\\n <td style=\\\"vertical-align: middle;\\\">\\n <p class=\\\"small text-muted\\\">\\n Maximum memory usage per task (set to 0 for unlimited)\\n </p>\\n </td>\\n </tr>\\n <tr>\\n <td style=\\\"vertical-align: middle;\\\">\\n <div>\\n CPU reservation\\n </div>\\n </td>\\n <td>\\n <slider\\n model=\\\"service.ReservationNanoCPUs\\\"\\n floor=\\\"0\\\"\\n ceil=\\\"state.sliderMaxCpu\\\"\\n step=\\\"0.25\\\"\\n precision=\\\"2\\\"\\n ng-if=\\\"service && state.sliderMaxCpu\\\"\\n on-change=\\\"updateServiceAttribute(service, 'ReservationNanoCPUs')\\\"\\n disable-authorization=\\\"DockerServiceUpdate\\\"\\n ></slider>\\n </td>\\n <td style=\\\"vertical-align: middle;\\\">\\n <p class=\\\"small text-muted\\\">\\n Minimum CPU available on a node to run a task\\n </p>\\n </td>\\n </tr>\\n <tr>\\n <td style=\\\"vertical-align: middle;\\\">\\n <div>\\n CPU limit\\n </div>\\n </td>\\n <td>\\n <slider\\n model=\\\"service.LimitNanoCPUs\\\"\\n floor=\\\"0\\\"\\n ceil=\\\"state.sliderMaxCpu\\\"\\n step=\\\"0.25\\\"\\n precision=\\\"2\\\"\\n ng-if=\\\"service && state.sliderMaxCpu\\\"\\n on-change=\\\"updateServiceAttribute(service, 'LimitNanoCPUs')\\\"\\n disable-authorization=\\\"DockerServiceUpdate\\\"\\n ></slider>\\n </td>\\n <td style=\\\"vertical-align: middle;\\\">\\n <p class=\\\"small text-muted\\\">\\n Maximum CPU usage per task\\n </p>\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n <rd-widget-footer authorization=\\\"DockerServiceUpdate\\\">\\n <div class=\\\"btn-toolbar\\\" role=\\\"toolbar\\\">\\n <div class=\\\"btn-group\\\" role=\\\"group\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"!hasChanges(service, ['LimitNanoCPUs', 'LimitMemoryBytes', 'ReservationNanoCPUs', 'ReservationMemoryBytes'])\\\"\\n ng-click=\\\"updateService(service)\\\"\\n >Apply changes</button\\n >\\n <button type=\\\"button\\\" class=\\\"btn btn-default btn-sm dropdown-toggle\\\" data-toggle=\\\"dropdown\\\" aria-haspopup=\\\"true\\\" aria-expanded=\\\"false\\\">\\n <span class=\\\"caret\\\"></span>\\n </button>\\n <ul class=\\\"dropdown-menu\\\">\\n <li><a ng-click=\\\"cancelChanges(service, ['LimitNanoCPUs', 'LimitMemoryBytes', 'ReservationNanoCPUs', 'ReservationMemoryBytes'])\\\">Reset changes</a></li>\\n <li><a ng-click=\\\"cancelChanges(service)\\\">Reset all changes</a></li>\\n </ul>\\n </div>\\n </div>\\n </rd-widget-footer>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/services/edit/includes/restart.html';\nvar html = \"<div id=\\\"service-restart-policy\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-list-alt\\\" title-text=\\\"Restart policy\\\"> </rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr>\\n <td>Restart condition</td>\\n <td>\\n <div class=\\\"input-group input-group-sm\\\">\\n <select\\n class=\\\"selectpicker form-control\\\"\\n ng-model=\\\"service.RestartCondition\\\"\\n ng-change=\\\"updateServiceAttribute(service, 'RestartCondition')\\\"\\n disable-authorization=\\\"DockerServiceUpdate\\\"\\n >\\n <option value=\\\"none\\\">None</option>\\n <option value=\\\"on-failure\\\">On failure</option>\\n <option value=\\\"any\\\">Any</option>\\n </select>\\n </div>\\n </td>\\n <td>\\n <p class=\\\"small text-muted\\\" style=\\\"margin-top: 10px;\\\">\\n Condition for restart.\\n </p>\\n </td>\\n </tr>\\n <tr>\\n <td>Restart delay</td>\\n <td>\\n <input\\n class=\\\"input-sm\\\"\\n type=\\\"text\\\"\\n ng-model=\\\"service.RestartDelay\\\"\\n ng-change=\\\"updateServiceAttribute(service, 'RestartDelay')\\\"\\n ng-pattern=\\\"/^([0-9]+)(h|m|s|ms|us|ns)$/i\\\"\\n disable-authorization=\\\"DockerServiceUpdate\\\"\\n />\\n </td>\\n <td>\\n <p class=\\\"small text-muted\\\" style=\\\"margin-top: 10px;\\\">\\n Delay between restart attempts expressed by a number followed by unit (ns|us|ms|s|m|h). Default value is 5s, 5 seconds.\\n </p>\\n </td>\\n </tr>\\n <tr>\\n <td>Restart max attempts</td>\\n <td>\\n <input\\n class=\\\"input-sm\\\"\\n type=\\\"number\\\"\\n ng-model=\\\"service.RestartMaxAttempts\\\"\\n ng-change=\\\"updateServiceAttribute(service, 'RestartMaxAttempts')\\\"\\n disable-authorization=\\\"DockerServiceUpdate\\\"\\n />\\n </td>\\n <td>\\n <p class=\\\"small text-muted\\\" style=\\\"margin-top: 10px;\\\">\\n Maximum attempts to restart a given task before giving up (default value is 0, which means unlimited).\\n </p>\\n </td>\\n </tr>\\n <tr>\\n <td>Restart window</td>\\n <td>\\n <input\\n class=\\\"input-sm\\\"\\n type=\\\"text\\\"\\n ng-model=\\\"service.RestartWindow\\\"\\n ng-change=\\\"updateServiceAttribute(service, 'RestartWindow')\\\"\\n ng-pattern=\\\"/^([0-9]+)(h|m|s|ms|us|ns)$/i\\\"\\n disable-authorization=\\\"DockerServiceUpdate\\\"\\n />\\n </td>\\n <td>\\n <p class=\\\"small text-muted\\\" style=\\\"margin-top: 10px;\\\">\\n Time window to evaluate restart attempts expressed by a number followed by unit (ns|us|ms|s|m|h). Default value is 0 seconds, which is unbounded.\\n </p>\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n <rd-widget-footer authorization=\\\"DockerServiceUpdate\\\">\\n <div class=\\\"btn-toolbar\\\" role=\\\"toolbar\\\">\\n <div class=\\\"btn-group\\\" role=\\\"group\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"!hasChanges(service, ['RestartCondition', 'RestartDelay', 'RestartMaxAttempts', 'RestartWindow'])\\\"\\n ng-click=\\\"updateService(service)\\\"\\n >Apply changes</button\\n >\\n <button type=\\\"button\\\" class=\\\"btn btn-default btn-sm dropdown-toggle\\\" data-toggle=\\\"dropdown\\\" aria-haspopup=\\\"true\\\" aria-expanded=\\\"false\\\">\\n <span class=\\\"caret\\\"></span>\\n </button>\\n <ul class=\\\"dropdown-menu\\\">\\n <li><a ng-click=\\\"cancelChanges(service, ['RestartCondition', 'RestartDelay', 'RestartMaxAttempts', 'RestartWindow'])\\\">Reset changes</a></li>\\n <li><a ng-click=\\\"cancelChanges(service)\\\">Reset all changes</a></li>\\n </ul>\\n </div>\\n </div>\\n </rd-widget-footer>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/services/edit/includes/secrets.html';\nvar html = \"<div ng-if=\\\"applicationState.endpoint.apiVersion >= 1.25\\\" id=\\\"service-secrets\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-tasks\\\" title-text=\\\"Secrets\\\"> </rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"form-inline\\\" style=\\\"padding: 10px;\\\" authorization=\\\"DockerServiceUpdate\\\">\\n Add a secret:\\n <select class=\\\"form-control\\\" ng-options=\\\"secret.Name for secret in secrets | orderBy: 'Name'\\\" ng-model=\\\"state.addSecret.secret\\\">\\n <option selected disabled hidden value=\\\"\\\">Select a secret</option>\\n </select>\\n <div class=\\\"form-group\\\" ng-if=\\\"applicationState.endpoint.apiVersion >= 1.3 && state.addSecret.override\\\">\\n Target:\\n <input class=\\\"form-control\\\" ng-model=\\\"state.addSecret.target\\\" placeholder=\\\"/path/in/container\\\" />\\n </div>\\n <div class=\\\"btn-group btn-group-sm\\\" ng-if=\\\"applicationState.endpoint.apiVersion >= 1.3\\\">\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"state.addSecret.override\\\" uib-btn-radio=\\\"false\\\">Default location</label>\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"state.addSecret.override\\\" uib-btn-radio=\\\"true\\\">Override</label>\\n </div>\\n <a class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"addSecret(service, state.addSecret)\\\"> <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add secret </a>\\n </div>\\n <table class=\\\"table\\\" style=\\\"margin-top: 5px;\\\">\\n <thead>\\n <tr>\\n <th>Name</th>\\n <th>File name</th>\\n <th>UID</th>\\n <th>GID</th>\\n <th>Mode</th>\\n <th></th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr ng-repeat=\\\"secret in service.ServiceSecrets\\\">\\n <td\\n ><a ui-sref=\\\"docker.secrets.secret({id: secret.Id})\\\">{{ secret.Name }}</a></td\\n >\\n <td>{{ secret.FileName }}</td>\\n <td>{{ secret.Uid }}</td>\\n <td>{{ secret.Gid }}</td>\\n <td>{{ secret.Mode }}</td>\\n <td authorization=\\\"DockerServiceUpdate\\\">\\n <button class=\\\"btn btn-xs btn-danger pull-right\\\" type=\\\"button\\\" ng-click=\\\"removeSecret(service, $index)\\\" ng-disabled=\\\"isUpdating\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i> Remove secret\\n </button>\\n </td>\\n </tr>\\n <tr ng-if=\\\"service.ServiceSecrets.length === 0\\\">\\n <td colspan=\\\"6\\\" class=\\\"text-center text-muted\\\">No secrets associated to this service.</td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n <rd-widget-footer authorization=\\\"DockerServiceUpdate\\\">\\n <div class=\\\"btn-toolbar\\\" role=\\\"toolbar\\\">\\n <div class=\\\"btn-group\\\" role=\\\"group\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-primary btn-sm\\\" ng-disabled=\\\"!hasChanges(service, ['ServiceSecrets'])\\\" ng-click=\\\"updateService(service)\\\">Apply changes</button>\\n <button type=\\\"button\\\" class=\\\"btn btn-default btn-sm dropdown-toggle\\\" data-toggle=\\\"dropdown\\\" aria-haspopup=\\\"true\\\" aria-expanded=\\\"false\\\">\\n <span class=\\\"caret\\\"></span>\\n </button>\\n <ul class=\\\"dropdown-menu\\\">\\n <li><a ng-click=\\\"cancelChanges(service, ['ServiceSecrets'])\\\">Reset changes</a></li>\\n <li><a ng-click=\\\"cancelChanges(service)\\\">Reset all changes</a></li>\\n </ul>\\n </div>\\n </div>\\n </rd-widget-footer>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/services/edit/includes/servicelabels.html';\nvar html = \"<div id=\\\"service-labels\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-tasks\\\" title-text=\\\"Service labels\\\">\\n <div class=\\\"nopadding\\\" authorization=\\\"DockerServiceUpdate\\\">\\n <a class=\\\"btn btn-default btn-sm pull-right\\\" ng-click=\\\"isUpdating || addLabel(service)\\\" ng-disabled=\\\"isUpdating\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> label\\n </a>\\n </div>\\n </rd-widget-header>\\n <rd-widget-body ng-if=\\\"service.ServiceLabels.length === 0\\\">\\n <p>There are no labels for this service.</p>\\n </rd-widget-body>\\n <rd-widget-body classes=\\\"no-padding\\\" ng-if=\\\"service.ServiceLabels.length > 0\\\">\\n <table class=\\\"table\\\">\\n <thead>\\n <tr>\\n <th>\\n Label\\n </th>\\n <th>\\n Value\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr ng-repeat=\\\"label in service.ServiceLabels\\\">\\n <td>\\n <div class=\\\"input-group input-group-sm\\\">\\n <span class=\\\"input-group-addon fit-text-size\\\">name</span>\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"label.key\\\"\\n placeholder=\\\"e.g. com.example.foo\\\"\\n ng-change=\\\"updateLabel(service, label)\\\"\\n ng-disabled=\\\"isUpdating\\\"\\n disable-authorization=\\\"DockerServiceUpdate\\\"\\n />\\n </div>\\n </td>\\n <td>\\n <div class=\\\"input-group input-group-sm\\\">\\n <span class=\\\"input-group-addon fit-text-size\\\">value</span>\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"label.value\\\"\\n placeholder=\\\"e.g. bar\\\"\\n ng-change=\\\"updateLabel(service, label)\\\"\\n ng-disabled=\\\"isUpdating\\\"\\n disable-authorization=\\\"DockerServiceUpdate\\\"\\n />\\n <span class=\\\"input-group-btn\\\" authorization=\\\"DockerServiceUpdate\\\">\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removeLabel(service, $index)\\\" ng-disabled=\\\"isUpdating\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </span>\\n </div>\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n <rd-widget-footer authorization=\\\"DockerServiceUpdate\\\">\\n <div class=\\\"btn-toolbar\\\" role=\\\"toolbar\\\">\\n <div class=\\\"btn-group\\\" role=\\\"group\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-primary btn-sm\\\" ng-disabled=\\\"!hasChanges(service, ['ServiceLabels'])\\\" ng-click=\\\"updateService(service)\\\">Apply changes</button>\\n <button type=\\\"button\\\" class=\\\"btn btn-default btn-sm dropdown-toggle\\\" data-toggle=\\\"dropdown\\\" aria-haspopup=\\\"true\\\" aria-expanded=\\\"false\\\">\\n <span class=\\\"caret\\\"></span>\\n </button>\\n <ul class=\\\"dropdown-menu\\\">\\n <li><a ng-click=\\\"cancelChanges(service, ['ServiceLabels'])\\\">Reset changes</a></li>\\n <li><a ng-click=\\\"cancelChanges(service)\\\">Reset all changes</a></li>\\n </ul>\\n </div>\\n </div>\\n </rd-widget-footer>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/services/edit/includes/tasks.html';\nvar html = \"<div ng-if=\\\"tasks.length > 0 && nodes\\\" id=\\\"service-tasks\\\">\\n <tasks-datatable\\n title-text=\\\"Tasks\\\"\\n title-icon=\\\"fa-tasks\\\"\\n dataset=\\\"tasks\\\"\\n table-key=\\\"service-tasks\\\"\\n order-by=\\\"Updated\\\"\\n reverse-order=\\\"true\\\"\\n nodes=\\\"nodes\\\"\\n show-slot-column=\\\"service.Mode !== 'global'\\\"\\n show-logs-button=\\\"applicationState.endpoint.apiVersion >= 1.30\\\"\\n agent-proxy=\\\"applicationState.endpoint.mode.agentProxy\\\"\\n ></tasks-datatable>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/docker/views/services/edit/includes/updateconfig.html';\nvar html = \"<div id=\\\"service-update-config\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-list-alt\\\" title-text=\\\"Update configuration\\\"> </rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr>\\n <td>Update Parallelism</td>\\n <td>\\n <input\\n class=\\\"input-sm\\\"\\n type=\\\"number\\\"\\n ng-model=\\\"service.UpdateParallelism\\\"\\n ng-change=\\\"updateServiceAttribute(service, 'UpdateParallelism')\\\"\\n disable-authorization=\\\"DockerServiceUpdate\\\"\\n />\\n </td>\\n <td>\\n <p class=\\\"small text-muted\\\" style=\\\"margin-top: 10px;\\\">\\n Maximum number of tasks to be updated simultaneously (0 to update all at once).\\n </p>\\n </td>\\n </tr>\\n <tr>\\n <td>Update Delay</td>\\n <td>\\n <input\\n class=\\\"input-sm\\\"\\n type=\\\"text\\\"\\n ng-model=\\\"service.UpdateDelay\\\"\\n ng-change=\\\"updateServiceAttribute(service, 'UpdateDelay')\\\"\\n ng-pattern=\\\"/^([0-9]+)(h|m|s|ms|us|ns)$/i\\\"\\n disable-authorization=\\\"DockerServiceUpdate\\\"\\n />\\n </td>\\n <td>\\n <p class=\\\"small text-muted\\\" style=\\\"margin-top: 10px;\\\">\\n Amount of time between updates expressed by a number followed by unit (ns|us|ms|s|m|h). Example: 1m.\\n </p>\\n </td>\\n </tr>\\n <tr>\\n <td>Update Failure Action</td>\\n <td>\\n <div class=\\\"form-group\\\">\\n <label class=\\\"radio-inline\\\">\\n <input\\n type=\\\"radio\\\"\\n name=\\\"failure_action\\\"\\n ng-model=\\\"service.UpdateFailureAction\\\"\\n value=\\\"continue\\\"\\n ng-change=\\\"updateServiceAttribute(service, 'UpdateFailureAction')\\\"\\n disable-authorization=\\\"DockerServiceUpdate\\\"\\n />\\n Continue\\n </label>\\n <label class=\\\"radio-inline\\\">\\n <input\\n type=\\\"radio\\\"\\n name=\\\"failure_action\\\"\\n ng-model=\\\"service.UpdateFailureAction\\\"\\n value=\\\"pause\\\"\\n ng-change=\\\"updateServiceAttribute(service, 'UpdateFailureAction')\\\"\\n disable-authorization=\\\"DockerServiceUpdate\\\"\\n />\\n Pause\\n </label>\\n </div>\\n </td>\\n <td>\\n <p class=\\\"small text-muted\\\" style=\\\"margin-top: 10px;\\\">\\n Action taken on failure to start after update.\\n </p>\\n </td>\\n </tr>\\n <tr ng-if=\\\"applicationState.endpoint.apiVersion >= 1.29\\\">\\n <td>Order</td>\\n <td>\\n <div class=\\\"form-group\\\">\\n <label class=\\\"radio-inline\\\">\\n <input\\n type=\\\"radio\\\"\\n name=\\\"updateconfig_order\\\"\\n ng-model=\\\"service.UpdateOrder\\\"\\n value=\\\"start-first\\\"\\n ng-change=\\\"updateServiceAttribute(service, 'UpdateOrder')\\\"\\n disable-authorization=\\\"DockerServiceUpdate\\\"\\n />\\n start-first\\n </label>\\n <label class=\\\"radio-inline\\\">\\n <input\\n type=\\\"radio\\\"\\n name=\\\"updateconfig_order\\\"\\n ng-model=\\\"service.UpdateOrder\\\"\\n value=\\\"stop-first\\\"\\n ng-change=\\\"updateServiceAttribute(service, 'UpdateOrder')\\\"\\n disable-authorization=\\\"DockerServiceUpdate\\\"\\n />\\n stop-first\\n </label>\\n </div>\\n </td>\\n <td>\\n <p class=\\\"small text-muted\\\" style=\\\"margin-top: 10px;\\\">\\n Operation order on failure.\\n </p>\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n <rd-widget-footer authorization=\\\"DockerServiceUpdate\\\">\\n <div class=\\\"btn-toolbar\\\" role=\\\"toolbar\\\">\\n <div class=\\\"btn-group\\\" role=\\\"group\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"!hasChanges(service, ['UpdateFailureAction', 'UpdateDelay', 'UpdateParallelism', 'UpdateOrder'])\\\"\\n ng-click=\\\"updateService(service)\\\"\\n >Apply changes</button\\n >\\n <button type=\\\"button\\\" class=\\\"btn btn-default btn-sm dropdown-toggle\\\" data-toggle=\\\"dropdown\\\" aria-haspopup=\\\"true\\\" aria-expanded=\\\"false\\\">\\n <span class=\\\"caret\\\"></span>\\n </button>\\n <ul class=\\\"dropdown-menu\\\">\\n <li><a ng-click=\\\"cancelChanges(service, ['UpdateFailureAction', 'UpdateDelay', 'UpdateParallelism', 'UpdateOrder'])\\\">Reset changes</a></li>\\n <li><a ng-click=\\\"cancelChanges(service)\\\">Reset all changes</a></li>\\n </ul>\\n </div>\\n </div>\\n </rd-widget-footer>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import moment from 'moment';\n\nangular.module('portainer.docker').controller('ServiceLogsController', [\n '$scope',\n '$transition$',\n '$interval',\n 'ServiceService',\n 'Notifications',\n function ($scope, $transition$, $interval, ServiceService, Notifications) {\n $scope.state = {\n refreshRate: 3,\n lineCount: 100,\n sinceTimestamp: '',\n displayTimestamps: false,\n };\n\n $scope.changeLogCollection = function (logCollectionStatus) {\n if (!logCollectionStatus) {\n stopRepeater();\n } else {\n setUpdateRepeater();\n }\n };\n\n $scope.$on('$destroy', function () {\n stopRepeater();\n });\n\n function stopRepeater() {\n var repeater = $scope.repeater;\n if (angular.isDefined(repeater)) {\n $interval.cancel(repeater);\n repeater = null;\n }\n }\n\n function setUpdateRepeater() {\n var refreshRate = $scope.state.refreshRate;\n $scope.repeater = $interval(function () {\n ServiceService.logs($transition$.params().id, 1, 1, $scope.state.displayTimestamps ? 1 : 0, moment($scope.state.sinceTimestamp).unix(), $scope.state.lineCount)\n .then(function success(data) {\n $scope.logs = data;\n })\n .catch(function error(err) {\n stopRepeater();\n Notifications.error('Failure', err, 'Unable to retrieve service logs');\n });\n }, refreshRate * 1000);\n }\n\n function startLogPolling() {\n ServiceService.logs($transition$.params().id, 1, 1, $scope.state.displayTimestamps ? 1 : 0, moment($scope.state.sinceTimestamp).unix(), $scope.state.lineCount)\n .then(function success(data) {\n $scope.logs = data;\n setUpdateRepeater();\n })\n .catch(function error(err) {\n stopRepeater();\n Notifications.error('Failure', err, 'Unable to retrieve service logs');\n });\n }\n\n function initView() {\n ServiceService.service($transition$.params().id)\n .then(function success(data) {\n $scope.service = data;\n startLogPolling();\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve service information');\n });\n }\n\n initView();\n },\n]);\n","angular.module('portainer.docker').controller('ServicesController', [\n '$q',\n '$scope',\n 'ServiceService',\n 'ServiceHelper',\n 'Notifications',\n 'TaskService',\n 'TaskHelper',\n 'NodeService',\n 'ContainerService',\n function ($q, $scope, ServiceService, ServiceHelper, Notifications, TaskService, TaskHelper, NodeService, ContainerService) {\n $scope.getServices = getServices;\n function getServices() {\n var agentProxy = $scope.applicationState.endpoint.mode.agentProxy;\n\n return $q\n .all({\n services: ServiceService.services(),\n tasks: TaskService.tasks(),\n containers: agentProxy ? ContainerService.containers(1) : [],\n nodes: NodeService.nodes(),\n })\n .then(function success(data) {\n var services = data.services;\n var tasks = data.tasks;\n\n if (agentProxy) {\n var containers = data.containers;\n for (var j = 0; j < tasks.length; j++) {\n var task = tasks[j];\n TaskHelper.associateContainerToTask(task, containers);\n }\n }\n\n for (var i = 0; i < services.length; i++) {\n var service = services[i];\n ServiceHelper.associateTasksToService(service, tasks);\n }\n\n $scope.nodes = data.nodes;\n $scope.tasks = tasks;\n $scope.services = services;\n })\n .catch(function error(err) {\n $scope.services = [];\n Notifications.error('Failure', err, 'Unable to retrieve services');\n });\n }\n\n function initView() {\n getServices();\n }\n\n initView();\n },\n]);\n","angular.module('portainer.docker').controller('SwarmController', [\n '$q',\n '$scope',\n 'SystemService',\n 'NodeService',\n 'Notifications',\n 'StateManager',\n 'Authentication',\n function ($q, $scope, SystemService, NodeService, Notifications, StateManager, Authentication) {\n $scope.info = {};\n $scope.docker = {};\n $scope.swarm = {};\n $scope.totalCPU = 0;\n $scope.totalMemory = 0;\n\n function extractSwarmInfo(info) {\n // Swarm info is available in SystemStatus object\n var systemStatus = info.SystemStatus;\n // Swarm strategy\n $scope.swarm[systemStatus[1][0]] = systemStatus[1][1];\n // Swarm filters\n $scope.swarm[systemStatus[2][0]] = systemStatus[2][1];\n // Swarm node count\n var nodes = systemStatus[0][1] === 'primary' ? systemStatus[3][1] : systemStatus[4][1];\n var node_count = parseInt(nodes, 10);\n $scope.swarm[systemStatus[3][0]] = node_count;\n\n $scope.swarm.Status = [];\n extractNodesInfo(systemStatus, node_count);\n }\n\n function extractNodesInfo(info, node_count) {\n // First information for node1 available at element #4 of SystemStatus if connected to a primary\n // If connected to a replica, information for node1 is available at element #5\n // The next 10 elements are information related to the node\n var node_offset = info[0][1] === 'primary' ? 4 : 5;\n for (let i = 0; i < node_count; i++) {\n extractNodeInfo(info, node_offset);\n node_offset += 9;\n }\n }\n\n function extractNodeInfo(info, offset) {\n var node = {};\n node.name = info[offset][0];\n node.ip = info[offset][1];\n node.Id = info[offset + 1][1];\n node.status = info[offset + 2][1];\n node.containers = info[offset + 3][1];\n node.cpu = info[offset + 4][1].split('/')[1];\n node.memory = info[offset + 5][1].split('/')[1];\n node.labels = info[offset + 6][1];\n node.version = info[offset + 8][1];\n $scope.swarm.Status.push(node);\n }\n\n function processTotalCPUAndMemory(nodes) {\n var CPU = 0,\n memory = 0;\n angular.forEach(nodes, function (node) {\n CPU += node.CPUs;\n memory += node.Memory;\n });\n $scope.totalCPU = CPU / 1000000000;\n $scope.totalMemory = memory;\n }\n\n $scope.getNodes = getNodes;\n function getNodes() {\n var provider = $scope.applicationState.endpoint.mode.provider;\n if (provider === 'DOCKER_SWARM_MODE') {\n NodeService.nodes()\n .then(function (data) {\n var nodes = data;\n processTotalCPUAndMemory(nodes);\n $scope.nodes = nodes;\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve cluster details');\n });\n }\n }\n\n function initView() {\n $scope.isAdmin = Authentication.isAdmin();\n\n var provider = $scope.applicationState.endpoint.mode.provider;\n $q.all({\n version: SystemService.version(),\n info: SystemService.info(),\n })\n .then(function success(data) {\n $scope.docker = data.version;\n $scope.info = data.info;\n if (provider === 'DOCKER_SWARM_MODE') {\n getNodes();\n } else {\n extractSwarmInfo(data.info);\n }\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve cluster details');\n });\n }\n\n initView();\n },\n]);\n","angular.module('portainer.docker').controller('SwarmVisualizerController', [\n '$q',\n '$scope',\n '$document',\n '$interval',\n 'NodeService',\n 'ServiceService',\n 'TaskService',\n 'Notifications',\n 'LocalStorage',\n function ($q, $scope, $document, $interval, NodeService, ServiceService, TaskService, Notifications, LocalStorage) {\n $scope.state = {\n ShowInformationPanel: true,\n DisplayOnlyRunningTasks: false,\n DisplayNodeLabels: false,\n refreshRate: '5',\n };\n\n $scope.$on('$destroy', function () {\n stopRepeater();\n });\n\n $scope.changeShowInformationPanel = function (value) {\n $scope.state.ShowInformationPanel = value;\n LocalStorage.storeSwarmVisualizerSettings('show_info_panel', value);\n };\n\n $scope.changeDisplayOnlyRunningTasks = function () {\n var value = $scope.state.DisplayOnlyRunningTasks;\n LocalStorage.storeSwarmVisualizerSettings('display_only_running_tasks', value);\n };\n\n $scope.changeDisplayNodeLabels = function () {\n var value = $scope.state.DisplayNodeLabels;\n LocalStorage.storeSwarmVisualizerSettings('display_node_labels', value);\n };\n\n $scope.changeUpdateRepeater = function () {\n stopRepeater();\n setUpdateRepeater();\n $('#refreshRateChange').show();\n $('#refreshRateChange').fadeOut(1500);\n LocalStorage.storeSwarmVisualizerSettings('refresh_rate', $scope.state.refreshRate);\n };\n\n function stopRepeater() {\n var repeater = $scope.repeater;\n if (angular.isDefined(repeater)) {\n $interval.cancel(repeater);\n repeater = null;\n }\n }\n\n function setUpdateRepeater() {\n var refreshRate = $scope.state.refreshRate;\n $scope.repeater = $interval(function () {\n $q.all({\n nodes: NodeService.nodes(),\n services: ServiceService.services(),\n tasks: TaskService.tasks(),\n })\n .then(function success(data) {\n var nodes = data.nodes;\n $scope.nodes = nodes;\n var services = data.services;\n $scope.services = services;\n var tasks = data.tasks;\n $scope.tasks = tasks;\n prepareVisualizerData(nodes, services, tasks);\n })\n .catch(function error(err) {\n stopRepeater();\n Notifications.error('Failure', err, 'Unable to retrieve cluster information');\n });\n }, refreshRate * 1000);\n }\n\n function assignServiceInfo(services, tasks) {\n for (var i = 0; i < services.length; i++) {\n var service = services[i];\n\n for (var j = 0; j < tasks.length; j++) {\n var task = tasks[j];\n\n if (task.ServiceId === service.Id) {\n task.ServiceName = service.Name;\n }\n }\n }\n }\n\n function assignTasksToNode(nodes, tasks) {\n for (var i = 0; i < nodes.length; i++) {\n var node = nodes[i];\n node.Tasks = [];\n\n for (var j = 0; j < tasks.length; j++) {\n var task = tasks[j];\n\n if (task.NodeId === node.Id) {\n node.Tasks.push(task);\n }\n }\n }\n }\n\n function prepareVisualizerData(nodes, services, tasks) {\n var visualizerData = {};\n\n assignServiceInfo(services, tasks);\n assignTasksToNode(nodes, tasks);\n\n visualizerData.nodes = nodes;\n $scope.visualizerData = visualizerData;\n }\n\n function loadState() {\n var showInfoPanel = LocalStorage.getSwarmVisualizerSettings('show_info_panel');\n if (showInfoPanel !== undefined && showInfoPanel !== null) $scope.state.ShowInformationPanel = showInfoPanel;\n\n var displayOnlyRunningTasks = LocalStorage.getSwarmVisualizerSettings('display_only_running_tasks');\n if (displayOnlyRunningTasks !== undefined && displayOnlyRunningTasks !== null) $scope.state.DisplayOnlyRunningTasks = displayOnlyRunningTasks;\n\n var displayNodeLabels = LocalStorage.getSwarmVisualizerSettings('display_node_labels');\n if (displayNodeLabels !== undefined && displayNodeLabels !== null) $scope.state.DisplayNodeLabels = displayNodeLabels;\n\n var refreshRate = LocalStorage.getSwarmVisualizerSettings('refresh_rate');\n if (refreshRate !== undefined && refreshRate !== null) $scope.state.refreshRate = refreshRate;\n }\n\n function initView() {\n $q.all({\n nodes: NodeService.nodes(),\n services: ServiceService.services(),\n tasks: TaskService.tasks(),\n })\n .then(function success(data) {\n var nodes = data.nodes;\n $scope.nodes = nodes;\n var services = data.services;\n $scope.services = services;\n var tasks = data.tasks;\n $scope.tasks = tasks;\n prepareVisualizerData(nodes, services, tasks);\n setUpdateRepeater();\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to initialize cluster visualizer');\n });\n\n loadState();\n }\n\n initView();\n },\n]);\n","angular.module('portainer.docker').controller('TaskController', [\n '$scope',\n '$transition$',\n 'TaskService',\n 'ServiceService',\n 'Notifications',\n function ($scope, $transition$, TaskService, ServiceService, Notifications) {\n function initView() {\n TaskService.task($transition$.params().id)\n .then(function success(data) {\n var task = data;\n $scope.task = task;\n return ServiceService.service(task.ServiceId);\n })\n .then(function success(data) {\n var service = data;\n $scope.service = service;\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve task details');\n });\n }\n\n initView();\n },\n]);\n","import moment from 'moment';\n\nangular.module('portainer.docker').controller('TaskLogsController', [\n '$scope',\n '$transition$',\n '$interval',\n 'TaskService',\n 'ServiceService',\n 'Notifications',\n function ($scope, $transition$, $interval, TaskService, ServiceService, Notifications) {\n $scope.state = {\n refreshRate: 3,\n lineCount: 100,\n sinceTimestamp: '',\n displayTimestamps: false,\n };\n\n $scope.changeLogCollection = function (logCollectionStatus) {\n if (!logCollectionStatus) {\n stopRepeater();\n } else {\n setUpdateRepeater();\n }\n };\n\n $scope.$on('$destroy', function () {\n stopRepeater();\n });\n\n function stopRepeater() {\n var repeater = $scope.repeater;\n if (angular.isDefined(repeater)) {\n $interval.cancel(repeater);\n repeater = null;\n }\n }\n\n function setUpdateRepeater() {\n var refreshRate = $scope.state.refreshRate;\n $scope.repeater = $interval(function () {\n TaskService.logs($transition$.params().id, 1, 1, $scope.state.displayTimestamps ? 1 : 0, moment($scope.state.sinceTimestamp).unix(), $scope.state.lineCount)\n .then(function success(data) {\n $scope.logs = data;\n })\n .catch(function error(err) {\n stopRepeater();\n Notifications.error('Failure', err, 'Unable to retrieve task logs');\n });\n }, refreshRate * 1000);\n }\n\n function startLogPolling() {\n TaskService.logs($transition$.params().id, 1, 1, $scope.state.displayTimestamps ? 1 : 0, moment($scope.state.sinceTimestamp).unix(), $scope.state.lineCount)\n .then(function success(data) {\n $scope.logs = data;\n setUpdateRepeater();\n })\n .catch(function error(err) {\n stopRepeater();\n Notifications.error('Failure', err, 'Unable to retrieve task logs');\n });\n }\n\n function initView() {\n TaskService.task($transition$.params().id)\n .then(function success(data) {\n var task = data;\n $scope.task = task;\n return ServiceService.service(task.ServiceId);\n })\n .then(function success(data) {\n var service = data;\n $scope.service = service;\n startLogPolling();\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve task details');\n });\n }\n\n initView();\n },\n]);\n","angular.module('portainer.docker').controller('BrowseVolumeController', [\n '$scope',\n '$transition$',\n 'StateManager',\n function ($scope, $transition$, StateManager) {\n function initView() {\n $scope.volumeId = $transition$.params().id;\n $scope.nodeName = $transition$.params().nodeName;\n $scope.agentApiVersion = StateManager.getAgentApiVersion();\n }\n\n initView();\n },\n]);\n","import { AccessControlFormData } from '../../../../portainer/components/accessControlForm/porAccessControlFormModel';\nimport { VolumesNFSFormData } from '../../../components/volumesNFSForm/volumesNFSFormModel';\nimport { VolumesCIFSFormData } from '../../../components/volumesCIFSForm/volumesCifsFormModel';\n\nangular.module('portainer.docker').controller('CreateVolumeController', [\n '$q',\n '$scope',\n '$state',\n 'VolumeService',\n 'PluginService',\n 'ResourceControlService',\n 'Authentication',\n 'Notifications',\n 'FormValidator',\n 'HttpRequestHelper',\n function ($q, $scope, $state, VolumeService, PluginService, ResourceControlService, Authentication, Notifications, FormValidator, HttpRequestHelper) {\n $scope.formValues = {\n Driver: 'local',\n DriverOptions: [],\n AccessControlData: new AccessControlFormData(),\n NodeName: null,\n NFSData: new VolumesNFSFormData(),\n CIFSData: new VolumesCIFSFormData(),\n };\n\n $scope.state = {\n formValidationError: '',\n actionInProgress: false,\n };\n\n $scope.availableVolumeDrivers = [];\n\n $scope.addDriverOption = function () {\n $scope.formValues.DriverOptions.push({ name: '', value: '' });\n };\n\n $scope.removeDriverOption = function (index) {\n $scope.formValues.DriverOptions.splice(index, 1);\n };\n\n function validateForm(accessControlData, isAdmin) {\n $scope.state.formValidationError = '';\n var error = '';\n error = FormValidator.validateAccessControl(accessControlData, isAdmin);\n\n if (error) {\n $scope.state.formValidationError = error;\n return false;\n }\n return true;\n }\n\n function prepareCIFSConfiguration(driverOptions) {\n const data = $scope.formValues.CIFSData;\n\n driverOptions.push({ name: 'type', value: 'cifs' });\n\n let share = data.share.replace('\\\\', '/');\n if (share[0] !== '/') {\n share = '/' + share;\n }\n const device = '//' + data.serverAddress + share;\n driverOptions.push({ name: 'device', value: device });\n\n const versionNumber = data.versionsNumber[data.versions.indexOf(data.version)];\n const options = 'username=' + data.username + ',password=' + data.password + ',vers=' + versionNumber;\n driverOptions.push({ name: 'o', value: options });\n }\n\n function prepareNFSConfiguration(driverOptions) {\n var data = $scope.formValues.NFSData;\n\n driverOptions.push({ name: 'type', value: 'nfs' });\n\n var options = 'addr=' + data.serverAddress + ',' + data.options;\n if (data.version === 'NFS4') {\n options = options + ',nfsvers=4';\n }\n driverOptions.push({ name: 'o', value: options });\n\n var mountPoint = data.mountPoint[0] === ':' ? data.mountPoint : ':' + data.mountPoint;\n driverOptions.push({ name: 'device', value: mountPoint });\n }\n\n $scope.create = function () {\n var name = $scope.formValues.Name;\n var driver = $scope.formValues.Driver;\n var driverOptions = $scope.formValues.DriverOptions;\n var storidgeProfile = $scope.formValues.StoridgeProfile;\n\n if (driver === 'cio:latest' && storidgeProfile) {\n driverOptions.push({ name: 'profile', value: storidgeProfile.Name });\n }\n\n if ($scope.formValues.NFSData.useNFS) {\n prepareNFSConfiguration(driverOptions);\n }\n\n if ($scope.formValues.CIFSData.useCIFS) {\n prepareCIFSConfiguration(driverOptions);\n }\n\n var volumeConfiguration = VolumeService.createVolumeConfiguration(name, driver, driverOptions);\n var accessControlData = $scope.formValues.AccessControlData;\n var userDetails = Authentication.getUserDetails();\n var isAdmin = Authentication.isAdmin();\n\n if (!validateForm(accessControlData, isAdmin)) {\n return;\n }\n\n var nodeName = $scope.formValues.NodeName;\n HttpRequestHelper.setPortainerAgentTargetHeader(nodeName);\n\n $scope.state.actionInProgress = true;\n VolumeService.createVolume(volumeConfiguration)\n .then(function success(data) {\n const userId = userDetails.ID;\n const resourceControl = data.ResourceControl;\n return ResourceControlService.applyResourceControl(userId, accessControlData, resourceControl);\n })\n .then(function success() {\n Notifications.success('Volume successfully created');\n $state.go('docker.volumes', {}, { reload: true });\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'An error occured during volume creation');\n })\n .finally(function final() {\n $scope.state.actionInProgress = false;\n });\n };\n\n function initView() {\n var apiVersion = $scope.applicationState.endpoint.apiVersion;\n\n PluginService.volumePlugins(apiVersion < 1.25)\n .then(function success(data) {\n $scope.availableVolumeDrivers = data;\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve volume drivers');\n });\n }\n\n initView();\n },\n]);\n","angular.module('portainer.docker').controller('VolumeController', [\n '$scope',\n '$state',\n '$transition$',\n '$q',\n 'ModalService',\n 'VolumeService',\n 'ContainerService',\n 'Notifications',\n 'HttpRequestHelper',\n 'StoridgeVolumeService',\n 'StoridgeSnapshotService',\n function ($scope, $state, $transition$, $q, ModalService, VolumeService, ContainerService, Notifications, HttpRequestHelper, StoridgeVolumeService, StoridgeSnapshotService) {\n $scope.storidgeSnapshots = [];\n $scope.storidgeVolume = {};\n\n $scope.removeSnapshot = function (selectedItems) {\n ModalService.confirm({\n title: 'Are you sure?',\n message: 'Do you want really want to remove this snapshot?',\n buttons: {\n confirm: {\n label: 'Remove',\n className: 'btn-danger',\n },\n },\n callback: function onConfirm(confirmed) {\n if (!confirmed) {\n return;\n }\n var actionCount = selectedItems.length;\n angular.forEach(selectedItems, function (item) {\n StoridgeSnapshotService.remove(item.Id)\n .then(function success() {\n Notifications.success('Snapshot successfully removed', item.Id);\n var index = $scope.storidgeSnapshots.indexOf(item);\n $scope.storidgeSnapshots.splice(index, 1);\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to remove snapshot');\n })\n .finally(function final() {\n --actionCount;\n if (actionCount === 0) {\n $state.reload();\n }\n });\n });\n },\n });\n };\n\n $scope.removeVolume = function removeVolume() {\n ModalService.confirmDeletion('Do you want to remove this volume?', (confirmed) => {\n if (confirmed) {\n VolumeService.remove($scope.volume)\n .then(function success() {\n Notifications.success('Volume successfully removed', $transition$.params().id);\n $state.go('docker.volumes', {});\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to remove volume');\n });\n }\n });\n };\n\n function getVolumeDataFromContainer(container, volumeId) {\n return container.Mounts.find(function (volume) {\n return volume.Name === volumeId;\n });\n }\n\n function initView() {\n HttpRequestHelper.setPortainerAgentTargetHeader($transition$.params().nodeName);\n\n VolumeService.volume($transition$.params().id)\n .then(function success(data) {\n var volume = data;\n $scope.volume = volume;\n var containerFilter = { volume: [volume.Id] };\n\n $scope.isCioDriver = volume.Driver.includes('cio');\n if ($scope.isCioDriver) {\n return $q.all({\n containers: ContainerService.containers(1, containerFilter),\n storidgeVolume: StoridgeVolumeService.volume($transition$.params().id),\n });\n } else {\n return ContainerService.containers(1, containerFilter);\n }\n })\n .then(function success(data) {\n var dataContainers = $scope.isCioDriver ? data.containers : data;\n\n var containers = dataContainers.map(function (container) {\n container.volumeData = getVolumeDataFromContainer(container, $scope.volume.Id);\n return container;\n });\n $scope.containersUsingVolume = containers;\n\n if ($scope.isCioDriver) {\n $scope.storidgeVolume = data.storidgeVolume;\n if ($scope.storidgeVolume.SnapshotEnabled) {\n return StoridgeSnapshotService.snapshots(data.storidgeVolume.Vdisk);\n }\n }\n })\n .then(function success(data) {\n $scope.storidgeSnapshots = data;\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve volume details');\n });\n }\n\n initView();\n },\n]);\n","angular.module('portainer.docker').controller('VolumesController', [\n '$q',\n '$scope',\n '$state',\n 'VolumeService',\n 'ServiceService',\n 'VolumeHelper',\n 'Notifications',\n 'HttpRequestHelper',\n 'EndpointProvider',\n 'Authentication',\n 'ModalService',\n 'endpoint',\n function ($q, $scope, $state, VolumeService, ServiceService, VolumeHelper, Notifications, HttpRequestHelper, EndpointProvider, Authentication, ModalService, endpoint) {\n $scope.removeAction = function (selectedItems) {\n ModalService.confirmDeletion('Do you want to remove the selected volume(s)?', (confirmed) => {\n if (confirmed) {\n var actionCount = selectedItems.length;\n angular.forEach(selectedItems, function (volume) {\n HttpRequestHelper.setPortainerAgentTargetHeader(volume.NodeName);\n VolumeService.remove(volume)\n .then(function success() {\n Notifications.success('Volume successfully removed', volume.Id);\n var index = $scope.volumes.indexOf(volume);\n $scope.volumes.splice(index, 1);\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to remove volume');\n })\n .finally(function final() {\n --actionCount;\n if (actionCount === 0) {\n $state.reload();\n }\n });\n });\n }\n });\n };\n\n $scope.offlineMode = false;\n\n $scope.getVolumes = getVolumes;\n function getVolumes() {\n var endpointProvider = $scope.applicationState.endpoint.mode.provider;\n var endpointRole = $scope.applicationState.endpoint.mode.role;\n\n $q.all({\n attached: VolumeService.volumes({ filters: { dangling: ['false'] } }),\n dangling: VolumeService.volumes({ filters: { dangling: ['true'] } }),\n services: endpointProvider === 'DOCKER_SWARM_MODE' && endpointRole === 'MANAGER' ? ServiceService.services() : [],\n })\n .then(function success(data) {\n var services = data.services;\n $scope.offlineMode = EndpointProvider.offlineMode();\n $scope.volumes = data.attached\n .map(function (volume) {\n volume.dangling = false;\n return volume;\n })\n .concat(\n data.dangling.map(function (volume) {\n volume.dangling = true;\n if (VolumeHelper.isVolumeUsedByAService(volume, services)) {\n volume.dangling = false;\n }\n return volume;\n })\n );\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve volumes');\n });\n }\n\n function initView() {\n getVolumes();\n\n $scope.showBrowseAction = $scope.applicationState.endpoint.mode.agentProxy && (Authentication.isAdmin() || endpoint.SecuritySettings.allowVolumeBrowserForRegularUsers);\n }\n\n initView();\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./associatedEndpointsDatatable.html');\n\nimport angular from 'angular';\n\nimport { AssociatedEndpointsDatatableController } from './associatedEndpointsDatatableController';\n\nangular.module('portainer.edge').component('associatedEndpointsDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: AssociatedEndpointsDatatableController,\n bindings: {\n titleText: '@',\n titleIcon: '@',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n retrievePage: '<',\n updateKey: '<',\n },\n});\n","var path = 'app/edge/components/associated-endpoints-datatable/associatedEndpointsDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n auto-focus\\n placeholder=\\\"Search...\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Name')\\\">\\n Name\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('GroupName')\\\">\\n Group\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'GroupName' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'GroupName' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in $ctrl.state.filteredDataSet | itemsPerPage: $ctrl.state.paginatedItemLimit\\\"\\n total-items=\\\"$ctrl.state.totalFilteredDataSet\\\"\\n ng-class=\\\"{ active: item.Checked }\\\"\\n >\\n <td>\\n <span>{{ item.Name }}</span>\\n </td>\\n\\n <td>{{ item.GroupName }}</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.loading\\\">\\n <td colspan=\\\"5\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.state.loading && $ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"5\\\" class=\\\"text-center text-muted\\\">No environment available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"!$ctrl.state.loading\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\" on-page-change=\\\"$ctrl.onPageChange(newPageNumber, oldPageNumber)\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./edgeGroupsSelector.html');\n\nimport angular from 'angular';\n\nangular.module('portainer.edge').component('edgeGroupsSelector', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n model: '<',\n items: '<',\n onChange: '<',\n },\n});\n","var path = 'app/edge/components/edge-groups-selector/edgeGroupsSelector.html';\nvar html = \"<!-- on-select/on-remove are called with model because ui-select uses 2-way-binding -->\\n<ui-select\\n multiple\\n ng-model=\\\"$ctrl.model\\\"\\n close-on-select=\\\"false\\\"\\n on-select=\\\"$ctrl.onChange($ctrl.model)\\\"\\n on-remove=\\\"$ctrl.onChange($ctrl.model)\\\"\\n data-cy=\\\"edgeGroupCreate-edgeGroupsSelector\\\"\\n>\\n <ui-select-match placeholder=\\\"Select one or multiple group(s)\\\">\\n <span>\\n {{ $item.Name }}\\n </span>\\n </ui-select-match>\\n <ui-select-choices repeat=\\\"item.Id as item in $ctrl.items | filter: { Name: $select.search }\\\">\\n <span>\\n {{ item.Name }}\\n </span>\\n </ui-select-choices>\\n</ui-select>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./edgeJobForm.html');\n\nimport angular from 'angular';\n\nimport { EdgeJobFormController } from './edgeJobFormController';\n\nangular.module('portainer.edge').component('edgeJobForm', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: EdgeJobFormController,\n bindings: {\n model: '=',\n groups: '<',\n tags: '<',\n addLabelAction: '<',\n removeLabelAction: '<',\n formAction: '<',\n formActionLabel: '@',\n actionInProgress: '<',\n isEditorDirty: '=',\n },\n});\n","var path = 'app/edge/components/edge-job-form/edgeJobForm.html';\nvar html = \"<form class=\\\"form-horizontal\\\" name=\\\"edgeJobForm\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Edge job configuration\\n </div>\\n <!-- name-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"edgejob_name\\\" class=\\\"col-sm-1 control-label text-left\\\">Name</label>\\n <div class=\\\"col-sm-11\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"$ctrl.model.Name\\\"\\n ng-pattern=\\\"/^[a-zA-Z0-9][a-zA-Z0-9_.-]+$/\\\"\\n id=\\\"edgejob_name\\\"\\n name=\\\"edgejob_name\\\"\\n placeholder=\\\"backup-app-prod\\\"\\n required\\n auto-focus\\n />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"edgeJobForm.edgejob_name.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"edgeJobForm.edgejob_name.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n <p ng-message=\\\"pattern\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Allowed characters are: [a-zA-Z0-9_.-]</p>\\n </div>\\n </div>\\n </div>\\n <!-- !name-input -->\\n <!-- cron-input -->\\n <!-- edge-job-method-select -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Edge job configuration\\n </div>\\n <div class=\\\"form-group\\\"></div>\\n <div class=\\\"form-group\\\" style=\\\"margin-bottom: 0;\\\">\\n <div class=\\\"boxselector_wrapper\\\">\\n <div>\\n <input type=\\\"radio\\\" id=\\\"config_basic\\\" ng-model=\\\"$ctrl.formValues.cronMethod\\\" value=\\\"basic\\\" />\\n <label for=\\\"config_basic\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-calendar-alt\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Basic configuration\\n </div>\\n <p>Select date from calendar</p>\\n </label>\\n </div>\\n <div>\\n <input type=\\\"radio\\\" id=\\\"config_advanced\\\" ng-model=\\\"$ctrl.formValues.cronMethod\\\" value=\\\"advanced\\\" />\\n <label for=\\\"config_advanced\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-edit\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Advanced configuration\\n </div>\\n <p>Write your own cron rule</p>\\n </label>\\n </div>\\n </div>\\n </div>\\n <!-- !edge-job-method-select -->\\n <!-- basic-edge-job -->\\n <div ng-if=\\\"$ctrl.formValues.cronMethod === 'basic'\\\">\\n <div class=\\\"form-group\\\">\\n <label for=\\\"recurring\\\" class=\\\"col-sm-2 control-label text-left\\\">Recurring Edge job</label>\\n <div class=\\\"col-sm-10\\\">\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\"> <input type=\\\"checkbox\\\" name=\\\"recurring\\\" ng-model=\\\"$ctrl.model.Recurring\\\" /><i></i> </label>\\n </div>\\n </div>\\n <!-- not-recurring -->\\n <div ng-if=\\\"!$ctrl.model.Recurring\\\">\\n <div class=\\\"form-group\\\">\\n <label for=\\\"edgejob_cron\\\" class=\\\"col-sm-2 control-label text-left\\\">Schedule date</label>\\n <div class=\\\"col-sm-10\\\">\\n <input class=\\\"form-control\\\" moment-picker ng-model=\\\"$ctrl.formValues.datetime\\\" format=\\\"YYYY-MM-DD HH:mm\\\" />\\n </div>\\n <div class=\\\"col-sm-12 small text-muted\\\" style=\\\"margin-top: 10px;\\\">\\n Time should be set according to the chosen environments' timezone.\\n </div>\\n <div ng-show=\\\"edgeJobForm.datepicker.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"edgeJobForm.datepicker.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n </div>\\n </div>\\n <!-- !not-recurring -->\\n <!-- recurring -->\\n <div ng-if=\\\"$ctrl.model.Recurring\\\">\\n <div class=\\\"form-group\\\">\\n <label for=\\\"edgejob_value\\\" class=\\\"col-sm-2 control-label text-left\\\">Edge job time</label>\\n <div class=\\\"col-sm-10\\\">\\n <select\\n id=\\\"edgejob_value\\\"\\n name=\\\"edgejob_value\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"$ctrl.formValues.scheduleValue\\\"\\n ng-options=\\\"value.displayed for value in $ctrl.scheduleValues\\\"\\n required\\n ></select>\\n </div>\\n <div ng-show=\\\"edgeJobForm.edgejob_value.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"edgeJobForm.edgejob_value.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n </div>\\n </div>\\n <!-- !recurring -->\\n </div>\\n <!-- !basic-edge-job -->\\n <!-- advanced-schedule -->\\n <div ng-if=\\\"$ctrl.formValues.cronMethod === 'advanced'\\\">\\n <div class=\\\"form-group\\\">\\n <label for=\\\"edgejob_cron\\\" class=\\\"col-sm-2 control-label text-left\\\">Cron rule</label>\\n <div class=\\\"col-sm-10\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"$ctrl.model.CronExpression\\\"\\n id=\\\"edgejob_cron\\\"\\n name=\\\"edgejob_cron\\\"\\n placeholder=\\\"0 2 * * *\\\"\\n required\\n ng-pattern=\\\"$ctrl.cronRegex\\\"\\n />\\n </div>\\n <div class=\\\"col-sm-12 small text-muted\\\" style=\\\"margin-top: 10px;\\\">\\n Time should be set according to the chosen environments' timezone.\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"edgeJobForm.edgejob_cron.$invalid && edgeJobForm.edgejob_cron.$dirty\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"edgeJobForm.edgejob_cron.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n <p ng-message=\\\"pattern\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field format is invalid.</p>\\n </div>\\n </div>\\n </div>\\n </div>\\n <!-- !advanced-schedule -->\\n\\n <!-- execution-method -->\\n <div ng-if=\\\"!$ctrl.model.Id\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Job content\\n </div>\\n <div class=\\\"form-group\\\"></div>\\n <div class=\\\"form-group\\\" style=\\\"margin-bottom: 0;\\\">\\n <div class=\\\"boxselector_wrapper\\\">\\n <div>\\n <input type=\\\"radio\\\" id=\\\"method_editor\\\" ng-model=\\\"$ctrl.formValues.method\\\" value=\\\"editor\\\" />\\n <label for=\\\"method_editor\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-edit\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Web editor\\n </div>\\n <p>Use our Web editor</p>\\n </label>\\n </div>\\n <div>\\n <input type=\\\"radio\\\" id=\\\"method_upload\\\" ng-model=\\\"$ctrl.formValues.method\\\" value=\\\"upload\\\" />\\n <label for=\\\"method_upload\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-upload\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Upload\\n </div>\\n <p>Upload from your computer</p>\\n </label>\\n </div>\\n </div>\\n </div>\\n </div>\\n <!-- !execution-method -->\\n <!-- web-editor -->\\n <div ng-show=\\\"$ctrl.formValues.method === 'editor'\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Web editor\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <code-editor\\n identifier=\\\"execute-edge-job-editor\\\"\\n placeholder=\\\"# Define or paste the content of your script file here\\\"\\n on-change=\\\"($ctrl.editorUpdate)\\\"\\n value=\\\"$ctrl.model.FileContent\\\"\\n ></code-editor>\\n </div>\\n </div>\\n </div>\\n <!-- !web-editor -->\\n <!-- upload -->\\n <div ng-show=\\\"$ctrl.formValues.method === 'upload'\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Upload\\n </div>\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n You can upload a script file from your computer.\\n </span>\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ngf-select ng-model=\\\"$ctrl.model.File\\\">Select file</button>\\n <span style=\\\"margin-left: 5px;\\\">\\n {{ $ctrl.model.File.name }}\\n <i class=\\\"fa fa-times red-icon\\\" ng-if=\\\"!$ctrl.model.File\\\" aria-hidden=\\\"true\\\"></i>\\n </span>\\n </div>\\n </div>\\n </div>\\n <!-- !upload -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Target environments\\n </div>\\n <!-- node-selection -->\\n <associated-endpoints-selector\\n endpoint-ids=\\\"$ctrl.model.Endpoints\\\"\\n tags=\\\"$ctrl.tags\\\"\\n groups=\\\"$ctrl.groups\\\"\\n has-backend-pagination=\\\"true\\\"\\n on-associate=\\\"($ctrl.associateEndpoint)\\\"\\n on-dissociate=\\\"($ctrl.dissociateEndpoint)\\\"\\n ></associated-endpoints-selector>\\n <!-- !node-selection -->\\n <!-- actions -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"$ctrl.actionInProgress || !edgeJobForm.$valid\\n || $ctrl.model.Endpoints.length === 0\\n || ($ctrl.formValues.method === 'upload' && !$ctrl.model.File)\\n || ($ctrl.formValues.method === 'editor' && !$ctrl.model.FileContent)\\n \\\"\\n ng-click=\\\"$ctrl.action()\\\"\\n button-spinner=\\\"$ctrl.actionInProgress\\\"\\n >\\n <span ng-hide=\\\"$ctrl.actionInProgress\\\">{{ $ctrl.formActionLabel }}</span>\\n <span ng-show=\\\"$ctrl.actionInProgress\\\">In progress...</span>\\n </button>\\n <span class=\\\"text-danger\\\" ng-if=\\\"$ctrl.state.formValidationError\\\" style=\\\"margin-left: 5px;\\\">\\n {{ $ctrl.state.formValidationError }}\\n </span>\\n </div>\\n </div>\\n <!-- !actions -->\\n</form>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/edge/components/edge-job-results-datatable/edgeJobResultsDatatable.html';\nvar html = \"<div class=\\\"datatable edge-job-results-datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\">\\n <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n {{ $ctrl.titleText }}\\n </div>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input type=\\\"text\\\" class=\\\"searchInput\\\" ng-model=\\\"$ctrl.state.textFilter\\\" placeholder=\\\"Search...\\\" auto-focus ng-model-options=\\\"{ debounce: 300 }\\\" />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover table-filters nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Endpoint')\\\">\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Endpoint' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Endpoint' && $ctrl.state.reverseOrder\\\"></i>\\n Environment\\n </a>\\n </th>\\n <th>\\n Actions\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter: $ctrl.applyFilters | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit))\\\"\\n >\\n <td>\\n {{ item.Endpoint.Name }}\\n </td>\\n <td>\\n <button ng-if=\\\"item.LogsStatus === 0 || item.LogsStatus === 1\\\" class=\\\"btn btn-sm btn-primary\\\" ng-click=\\\"$ctrl.collectLogs(item.EndpointId)\\\">\\n Retrieve logs\\n </button>\\n <button ng-if=\\\"item.LogsStatus === 3\\\" class=\\\"btn btn-sm btn-primary\\\" ng-click=\\\"$ctrl.onDownloadLogsClick(item.EndpointId)\\\">\\n Download logs\\n </button>\\n <button ng-if=\\\"item.LogsStatus === 3\\\" class=\\\"btn btn-sm btn-primary\\\" ng-click=\\\"$ctrl.onClearLogsClick(item.EndpointId)\\\">\\n Clear logs\\n </button>\\n <span ng-if=\\\"item.LogsStatus === 2\\\">\\n Logs marked for collection, please wait until the logs are available.\\n </span>\\n </td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"9\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"9\\\" class=\\\"text-center text-muted\\\">No result available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./edgeJobsDatatable.html');\n\nimport angular from 'angular';\n\nangular.module('portainer.edge').component('edgeJobsDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'GenericDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n removeAction: '<',\n },\n});\n","var path = 'app/edge/components/edge-jobs-datatable/edgeJobsDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n </div>\\n <div class=\\\"actionBar\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-danger\\\" ng-disabled=\\\"$ctrl.state.selectedItemCount === 0\\\" ng-click=\\\"$ctrl.removeAction($ctrl.state.selectedItems)\\\">\\n <i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Remove\\n </button>\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ui-sref=\\\"edge.jobs.new\\\"> <i class=\\\"fa fa-plus space-right\\\" aria-hidden=\\\"true\\\"></i>Add Edge job </button>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input type=\\\"text\\\" class=\\\"searchInput\\\" ng-model=\\\"$ctrl.state.textFilter\\\" placeholder=\\\"Search...\\\" auto-focus ng-model-options=\\\"{ debounce: 300 }\\\" />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th>\\n <span class=\\\"md-checkbox\\\">\\n <input id=\\\"select_all\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.state.selectAll\\\" ng-change=\\\"$ctrl.selectAll()\\\" />\\n <label for=\\\"select_all\\\"></label>\\n </span>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Name')\\\">\\n Name\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('CronExpression')\\\">\\n Cron expression\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'CronExpression' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'CronExpression' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Created')\\\">\\n Created\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Created' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Created' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit))\\\"\\n ng-class=\\\"{ active: item.Checked }\\\"\\n >\\n <td>\\n <span class=\\\"md-checkbox\\\">\\n <input id=\\\"select_{{ $index }}\\\" type=\\\"checkbox\\\" ng-model=\\\"item.Checked\\\" ng-click=\\\"$ctrl.selectItem(item, $event)\\\" />\\n <label for=\\\"select_{{ $index }}\\\"></label>\\n </span>\\n <a ui-sref=\\\"edge.jobs.job({id: item.Id})\\\">{{ item.Name }}</a>\\n </td>\\n <td>\\n {{ item.CronExpression }}\\n </td>\\n <td>{{ item.Created | getisodatefromtimestamp }}</td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"3\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"3\\\" class=\\\"text-center text-muted\\\">No Edge job available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./edge-stack-deployment-type-selector.html');\n\nimport angular from 'angular';\nimport controller from './edge-stack-deployment-type-selector.controller.js';\n\nexport const edgeStackDeploymentTypeSelector = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n\n bindings: {\n value: '<',\n onChange: '<',\n hasDockerEndpoint: '<',\n },\n};\n\nangular.module('portainer.edge').component('edgeStackDeploymentTypeSelector', edgeStackDeploymentTypeSelector);\n","var path = 'app/edge/components/edge-stack-deployment-type-selector/edge-stack-deployment-type-selector.html';\nvar html = \"<div class=\\\"col-sm-12 form-section-title\\\">\\n Deployment type\\n</div>\\n<box-selector radio-name=\\\"deploymentType\\\" ng-model=\\\"$ctrl.value\\\" options=\\\"$ctrl.deploymentOptions\\\" on-change=\\\"($ctrl.onChange)\\\"></box-selector>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./edgeStackEndpointsDatatable.html');\n\nimport angular from 'angular';\n\nimport { EdgeStackEndpointsDatatableController } from './edgeStackEndpointsDatatableController';\n\nangular.module('portainer.edge').component('edgeStackEndpointsDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: EdgeStackEndpointsDatatableController,\n bindings: {\n titleText: '@',\n titleIcon: '@',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n retrievePage: '<',\n },\n});\n","var path = 'app/edge/components/edge-stack-endpoints-datatable/edgeStackEndpointsDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n auto-focus\\n placeholder=\\\"Search...\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Name')\\\">\\n Name\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Status')\\\">\\n Status\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Status' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Status' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Error')\\\">\\n Error\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Error' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Error' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in $ctrl.state.filteredDataSet | itemsPerPage: $ctrl.state.paginatedItemLimit\\\"\\n total-items=\\\"$ctrl.state.totalFilteredDataSet\\\"\\n ng-class=\\\"{ active: item.Checked }\\\"\\n >\\n <td>{{ item.Name }}</td>\\n <td>{{ $ctrl.statusMap[item.Status.Type] || 'Pending' }}</td>\\n <td>{{ item.Status.Error ? item.Status.Error : '-' }}</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.loading\\\">\\n <td colspan=\\\"5\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.state.loading && $ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"5\\\" class=\\\"text-center text-muted\\\">No environment available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"!$ctrl.state.loading\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\" on-page-change=\\\"$ctrl.onPageChange(newPageNumber, oldPageNumber)\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/edge/components/edge-stack-status/edgeStackStatus.html';\nvar html = \"<span class=\\\"status\\\" title=\\\"Acknowledged environments\\\"><i class=\\\"acknowledged icon\\\"></i>{{ $ctrl.status.acknowledged || 0 }}</span>\\n<span class=\\\"status\\\" title=\\\"Successful environments\\\"><i class=\\\"ok icon\\\"></i>{{ $ctrl.status.ok || 0 }}</span>\\n<span class=\\\"status\\\" title=\\\"Failed environments\\\"><i class=\\\"error icon\\\"></i>{{ $ctrl.status.error || 0 }}</span>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./edgeStacksDatatable.html');\n\nimport angular from 'angular';\n\nangular.module('portainer.edge').component('edgeStacksDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'GenericDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n removeAction: '<',\n refreshCallback: '<',\n },\n});\n","var path = 'app/edge/components/edge-stacks-datatable/edgeStacksDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\">\\n <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Edge Stacks\\n </div>\\n <div class=\\\"settings\\\" data-cy=\\\"edgeStack-stackTableSettings\\\">\\n <span class=\\\"setting\\\" ng-class=\\\"{ 'setting-active': $ctrl.settings.open }\\\" uib-dropdown dropdown-append-to-body auto-close=\\\"disabled\\\" is-open=\\\"$ctrl.settings.open\\\">\\n <span uib-dropdown-toggle> <i class=\\\"fa fa-cog\\\" aria-hidden=\\\"true\\\"></i> Settings </span>\\n <div class=\\\"dropdown-menu dropdown-menu-right\\\" uib-dropdown-menu>\\n <div class=\\\"tableMenu\\\">\\n <div class=\\\"menuHeader\\\">\\n Table settings\\n </div>\\n <div class=\\\"menuContent\\\">\\n <div>\\n <div class=\\\"md-checkbox\\\">\\n <input\\n id=\\\"setting_auto_refresh\\\"\\n type=\\\"checkbox\\\"\\n ng-model=\\\"$ctrl.settings.repeater.autoRefresh\\\"\\n ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\"\\n data-cy=\\\"edgeStack-autoRefreshCheckbox\\\"\\n />\\n <label for=\\\"setting_auto_refresh\\\">Auto refresh</label>\\n </div>\\n <div ng-if=\\\"$ctrl.settings.repeater.autoRefresh\\\">\\n <label for=\\\"settings_refresh_rate\\\">\\n Refresh rate\\n </label>\\n <select id=\\\"settings_refresh_rate\\\" ng-model=\\\"$ctrl.settings.repeater.refreshRate\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" class=\\\"small-select\\\">\\n <option value=\\\"10\\\">10s</option>\\n <option value=\\\"30\\\">30s</option>\\n <option value=\\\"60\\\">1min</option>\\n <option value=\\\"120\\\">2min</option>\\n <option value=\\\"300\\\">5min</option>\\n </select>\\n <span>\\n <i id=\\\"refreshRateChange\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-top: 7px; display: none;\\\"></i>\\n </span>\\n </div>\\n </div>\\n </div>\\n <div>\\n <a type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"$ctrl.settings.open = false;\\\">\\n Close\\n </a>\\n </div>\\n </div>\\n </div>\\n </span>\\n </div>\\n </div>\\n <div class=\\\"actionBar\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-danger\\\"\\n ng-disabled=\\\"$ctrl.state.selectedItemCount === 0\\\"\\n ng-click=\\\"$ctrl.removeAction($ctrl.state.selectedItems)\\\"\\n data-cy=\\\"edgeStack-removeStackButton\\\"\\n >\\n <i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Remove\\n </button>\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ui-sref=\\\"edge.stacks.new\\\" data-cy=\\\"edgeStack-addStackButton\\\">\\n <i class=\\\"fa fa-plus space-right\\\" aria-hidden=\\\"true\\\"></i>Add stack\\n </button>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n auto-focus\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\" data-cy=\\\"edgeStack-stackTable\\\">\\n <thead>\\n <tr>\\n <th>\\n <span class=\\\"md-checkbox\\\" ng-if=\\\"!$ctrl.offlineMode\\\">\\n <input id=\\\"select_all\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.state.selectAll\\\" ng-change=\\\"$ctrl.selectAll()\\\" data-cy=\\\"edgeStack-selectAllCheckbox\\\" />\\n <label for=\\\"select_all\\\"></label>\\n </span>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Name')\\\">\\n Name\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n Status\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('CreationDate')\\\">\\n Creation Date\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'CreationDate' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'CreationDate' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit))\\\"\\n ng-class=\\\"{ active: item.Checked }\\\"\\n >\\n <td>\\n <span class=\\\"md-checkbox\\\">\\n <input id=\\\"select_{{ $index }}\\\" type=\\\"checkbox\\\" ng-model=\\\"item.Checked\\\" ng-click=\\\"$ctrl.selectItem(item, $event)\\\" ng-disabled=\\\"!$ctrl.allowSelection(item)\\\" />\\n <label for=\\\"select_{{ $index }}\\\"></label>\\n </span>\\n <a ui-sref=\\\"edge.stacks.edit({ stackId: item.Id })\\\">\\n {{ item.Name }}\\n </a>\\n </td>\\n <td><edge-stack-status stack-status=\\\"item.Status\\\"></edge-stack-status></td>\\n <td>{{ item.CreationDate | getisodatefromtimestamp }}</td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\" data-cy=\\\"edgeStack-loadingRow\\\">\\n <td colspan=\\\"4\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\" data-cy=\\\"edgeStack-noStackRow\\\">\\n <td colspan=\\\"4\\\" class=\\\"text-center text-muted\\\">\\n No stack available.\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./editEdgeStackForm.html');\n\nimport angular from 'angular';\n\nimport { EditEdgeStackFormController } from './editEdgeStackFormController';\n\nangular.module('portainer.edge').component('editEdgeStackForm', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: EditEdgeStackFormController,\n bindings: {\n model: '<',\n actionInProgress: '<',\n submitAction: '<',\n edgeGroups: '<',\n isEditorDirty: '=',\n },\n});\n","var path = 'app/edge/components/edit-edge-stack-form/editEdgeStackForm.html';\nvar html = \"<form class=\\\"form-horizontal\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Edge Groups\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <edge-groups-selector model=\\\"$ctrl.model.EdgeGroups\\\" items=\\\"$ctrl.edgeGroups\\\" on-change=\\\"($ctrl.onChangeGroups)\\\"></edge-groups-selector>\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\" ng-if=\\\"!$ctrl.validateEndpointsForDeployment()\\\">\\n <div class=\\\"col-sm-12\\\">\\n <div class=\\\"small text-muted space-right text-warning\\\">\\n <i class=\\\"fa fa-exclamation-triangle orange-icon\\\" aria-hidden=\\\"true\\\"></i>\\n One or more of the selected Edge group contains Edge Docker endpoints that cannot be used with a Kubernetes Edge stack.\\n </div>\\n </div>\\n </div>\\n\\n <edge-stack-deployment-type-selector\\n value=\\\"$ctrl.model.DeploymentType\\\"\\n has-docker-endpoint=\\\"$ctrl.hasDockerEndpoint\\\"\\n on-change=\\\"($ctrl.onChangeDeploymentType)\\\"\\n ></edge-stack-deployment-type-selector>\\n\\n <div class=\\\"form-group\\\" ng-if=\\\"$ctrl.model.DeploymentType === 0 && $ctrl.hasKubeEndpoint()\\\">\\n <div class=\\\"col-sm-12\\\">\\n <div class=\\\"small text-muted space-right\\\">\\n <i class=\\\"fa fa-exclamation-triangle orange-icon\\\" aria-hidden=\\\"true\\\"></i>\\n Portainer uses <a href=\\\"https://kompose.io/\\\" target=\\\"_blank\\\">Kompose</a> to convert your Compose manifest to a Kubernetes compliant manifest. Be wary that not all the\\n Compose format options are supported by Kompose at the moment.\\n </div>\\n </div>\\n </div>\\n\\n <web-editor-form\\n ng-if=\\\"$ctrl.model.DeploymentType === 0\\\"\\n value=\\\"$ctrl.model.StackFileContent\\\"\\n yml=\\\"true\\\"\\n identifier=\\\"compose-editor\\\"\\n placeholder=\\\"# Define or paste the content of your docker-compose file here\\\"\\n on-change=\\\"($ctrl.onChangeComposeConfig)\\\"\\n >\\n <editor-description>\\n <div>\\n You can get more information about Compose file format in the\\n <a href=\\\"https://docs.docker.com/compose/compose-file/\\\" target=\\\"_blank\\\">\\n official documentation\\n </a>\\n .\\n </div>\\n </editor-description>\\n </web-editor-form>\\n\\n <web-editor-form\\n ng-if=\\\"$ctrl.model.DeploymentType === 1\\\"\\n value=\\\"$ctrl.model.StackFileContent\\\"\\n yml=\\\"true\\\"\\n identifier=\\\"kube-manifest-editor\\\"\\n placeholder=\\\"# Define or paste the content of your manifest here\\\"\\n on-change=\\\"($ctrl.onChangeKubeManifest)\\\"\\n >\\n <editor-description>\\n <p>\\n You can get more information about Kubernetes file format in the\\n <a href=\\\"https://kubernetes.io/docs/concepts/overview/working-with-objects/kubernetes-objects/\\\" target=\\\"_blank\\\">official documentation</a>.\\n </p>\\n </editor-description>\\n </web-editor-form>\\n\\n <!-- actions -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"$ctrl.actionInProgress || !$ctrl.isFormValid()\\\"\\n ng-click=\\\"$ctrl.submitAction()\\\"\\n button-spinner=\\\"$ctrl.actionInProgress\\\"\\n >\\n <span ng-hide=\\\"$ctrl.actionInProgress\\\">Update the stack</span>\\n <span ng-show=\\\"$ctrl.actionInProgress\\\">Update in progress...</span>\\n </button>\\n </div>\\n </div>\\n <!-- !actions -->\\n</form>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./groupForm.html');\n\nimport angular from 'angular';\n\nimport { EdgeGroupFormController } from './groupFormController';\n\nangular.module('portainer.edge').component('edgeGroupForm', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: EdgeGroupFormController,\n bindings: {\n model: '<',\n groups: '<',\n tags: '<',\n formActionLabel: '@',\n formAction: '<',\n actionInProgress: '<',\n loaded: '<',\n pageType: '@',\n },\n});\n","var path = 'app/edge/components/group-form/groupForm.html';\nvar html = \"<form class=\\\"form-horizontal\\\" name=\\\"EdgeGroupForm\\\" ng-submit=\\\"$ctrl.formAction()\\\">\\n <div class=\\\"form-group\\\">\\n <label for=\\\"group_name\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Name\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"group_name\\\" name=\\\"group_name\\\" ng-model=\\\"$ctrl.model.Name\\\" required auto-focus data-cy=\\\"edgeGroupCreate-groupNameInput\\\" />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"EdgeGroupForm.group_name.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"EdgeGroupForm.group_name.$error\\\">\\n <p ng-message=\\\"required\\\">\\n <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i>\\n This field is required.\\n </p>\\n </div>\\n </div>\\n </div>\\n\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Group type\\n </div>\\n <div class=\\\"form-group col-sm-12\\\">\\n <div class=\\\"boxselector_wrapper\\\">\\n <div class=\\\"boxselector\\\">\\n <input type=\\\"radio\\\" id=\\\"static-group\\\" ng-model=\\\"$ctrl.model.Dynamic\\\" ng-value=\\\"false\\\" ng-checked=\\\"!$ctrl.model.Dynamic\\\" />\\n <label for=\\\"static-group\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-list-ol\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Static\\n </div>\\n <p>Manually select Edge environments</p>\\n </label>\\n </div>\\n <div class=\\\"boxselector\\\">\\n <input type=\\\"radio\\\" id=\\\"dynamic-group\\\" ng-model=\\\"$ctrl.model.Dynamic\\\" ng-value=\\\"true\\\" ng-checked=\\\"$ctrl.model.Dynamic\\\" />\\n <label for=\\\"dynamic-group\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-tags\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Dynamic\\n </div>\\n <p>Automatically associate environments via tags</p>\\n </label>\\n </div>\\n </div>\\n </div>\\n\\n <!-- StaticGroup -->\\n <div ng-if=\\\"!$ctrl.model.Dynamic\\\">\\n <div ng-if=\\\"!$ctrl.noEndpoints\\\">\\n <!-- environments -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Associated environments\\n </div>\\n <div class=\\\"form-group\\\">\\n <associated-endpoints-selector\\n endpoint-ids=\\\"$ctrl.model.Endpoints\\\"\\n tags=\\\"$ctrl.tags\\\"\\n groups=\\\"$ctrl.groups\\\"\\n has-backend-pagination=\\\"true\\\"\\n on-associate=\\\"($ctrl.associateEndpoint)\\\"\\n on-dissociate=\\\"($ctrl.dissociateEndpoint)\\\"\\n ></associated-endpoints-selector>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-if=\\\"$ctrl.noEndpoints\\\">\\n <div class=\\\"col-sm-12 small text-muted\\\">\\n No Edge environments are available. Head over to the <a ui-sref=\\\"portainer.endpoints\\\">Environments view</a> to add environments.\\n </div>\\n </div>\\n </div>\\n <!-- !StaticGroup -->\\n\\n <!-- DynamicGroup -->\\n <div ng-if=\\\"$ctrl.model.Dynamic\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Tags\\n </div>\\n <div ng-if=\\\"$ctrl.tags.length\\\" class=\\\"form-group col-sm-12\\\">\\n <div class=\\\"boxselector_wrapper\\\">\\n <div class=\\\"boxselector\\\">\\n <input type=\\\"radio\\\" id=\\\"or-selector\\\" ng-model=\\\"$ctrl.model.PartialMatch\\\" ng-value=\\\"true\\\" ng-checked=\\\"$ctrl.model.PartialMatch\\\" />\\n <label for=\\\"or-selector\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-tag\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Partial match\\n </div>\\n <p>Associate any environment matching at least one of the selected tags</p>\\n </label>\\n </div>\\n <div class=\\\"boxselector\\\">\\n <input type=\\\"radio\\\" id=\\\"and-selector\\\" ng-model=\\\"$ctrl.model.PartialMatch\\\" ng-value=\\\"false\\\" ng-checked=\\\"!$ctrl.model.PartialMatch\\\" />\\n <label for=\\\"and-selector\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-tag\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Full match\\n </div>\\n <p>Associate any environment matching all of the selected tags</p>\\n </label>\\n </div>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\">\\n <tag-selector ng-if=\\\"$ctrl.tags.length\\\" tags=\\\"$ctrl.tags\\\" model=\\\"$ctrl.model.TagIds\\\"></tag-selector>\\n <div ng-if=\\\"$ctrl.tags && !$ctrl.tags.length\\\" class=\\\"col-sm-12 small text-muted\\\">\\n No tags available. Head over to the <a ui-sref=\\\"portainer.tags\\\">Tags view</a> to add tags\\n </div>\\n </div>\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Associated environments by tags\\n </div>\\n <div class=\\\"col-sm-12 form-group\\\">\\n <group-association-table\\n loaded=\\\"$ctrl.loaded\\\"\\n page-type=\\\"$ctrl.pageType\\\"\\n table-type=\\\"associated\\\"\\n retrieve-page=\\\"$ctrl.getDynamicEndpoints\\\"\\n dataset=\\\"$ctrl.endpoints.value\\\"\\n pagination-state=\\\"$ctrl.endpoints.state\\\"\\n empty-dataset-message=\\\"No associated endpoint\\\"\\n tags=\\\"$ctrl.tags\\\"\\n show-tags=\\\"true\\\"\\n groups=\\\"$ctrl.groups\\\"\\n show-groups=\\\"true\\\"\\n has-backend-pagination=\\\"true\\\"\\n ></group-association-table>\\n </div>\\n </div>\\n <!-- !DynamicGroup -->\\n\\n <!-- actions -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"submit\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"$ctrl.actionInProgress || !EdgeGroupForm.$valid || (!$ctrl.model.Dynamic && !$ctrl.model.Endpoints.length) || ($ctrl.model.Dynamic && !$ctrl.model.TagIds.length)\\\"\\n button-spinner=\\\"$ctrl.actionInProgress\\\"\\n data-cy=\\\"edgeGroupCreate-addGroupButton\\\"\\n >\\n <span ng-hide=\\\"$ctrl.actionInProgress\\\">{{ $ctrl.formActionLabel }}</span>\\n <span ng-show=\\\"$ctrl.actionInProgress\\\">In progress...</span>\\n </button>\\n </div>\\n </div>\\n</form>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./groupsDatatable.html');\n\nimport angular from 'angular';\n\nimport { EdgeGroupsDatatableController } from './groupsDatatableController';\n\nangular.module('portainer.edge').component('edgeGroupsDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: EdgeGroupsDatatableController,\n bindings: {\n dataset: '<',\n titleIcon: '@',\n tableKey: '@',\n orderBy: '@',\n removeAction: '<',\n updateAction: '<',\n reverseOrder: '<',\n },\n});\n","var path = 'app/edge/components/groups-datatable/groupsDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"{{ $ctrl.titleIcon }}\\\" title-text=\\\"Edge Groups\\\"> </rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"actionBar\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-danger\\\"\\n ng-disabled=\\\"$ctrl.state.selectedItemCount === 0\\\"\\n ng-click=\\\"$ctrl.removeAction($ctrl.state.selectedItems)\\\"\\n data-cy=\\\"edgeGroup-removeEdgeGroupButton\\\"\\n >\\n <i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Remove\\n </button>\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ui-sref=\\\"edge.groups.new\\\" data-cy=\\\"edgeGroup-addEdgeGroupButton\\\">\\n <i class=\\\"fa fa-plus space-right\\\" aria-hidden=\\\"true\\\"></i>Add Edge group\\n </button>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n data-cy=\\\"edgeGroup-searchInput\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\" data-cy=\\\"edgeGroup-edgeGroupTable\\\">\\n <thead>\\n <tr>\\n <th>\\n <span class=\\\"md-checkbox\\\">\\n <input id=\\\"select_all\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.state.selectAll\\\" ng-change=\\\"$ctrl.selectAll()\\\" data-cy=\\\"edgeGroup-selectAllCheckbox\\\" />\\n <label for=\\\"select_all\\\"></label>\\n </span>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Name')\\\">\\n Name\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Endpoints.length')\\\">\\n Environments Count\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Endpoints.length' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Endpoints.length' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Dynamic')\\\">\\n Group Type\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Dynamic' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Dynamic' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit)) track by $index\\\"\\n ng-class=\\\"{ active: item.Checked }\\\"\\n >\\n <td>\\n <span class=\\\"md-checkbox\\\">\\n <input id=\\\"select_{{ $index }}\\\" type=\\\"checkbox\\\" ng-model=\\\"item.Checked\\\" ng-disabled=\\\"item.HasEdgeStack\\\" ng-click=\\\"$ctrl.selectItem(item, $event)\\\" />\\n <label for=\\\"select_{{ $index }}\\\"></label>\\n </span>\\n <a ui-sref=\\\"edge.groups.edit({groupId: item.Id})\\\">{{ item.Name }}</a>\\n <span ng-if=\\\"item.HasEdgeStack\\\" class=\\\"label label-info image-tag space-left\\\">in use</span>\\n </td>\\n <td>{{ item.Endpoints.length }}</td>\\n <td>{{ item.Dynamic ? 'Dynamic' : 'Static' }}</td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"4\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"4\\\" class=\\\"text-center text-muted\\\">\\n No Edge group available.\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import angular from 'angular';\n\nangular.module('portainer.edge').factory('EdgeGroups', function EdgeGroupsFactory($resource, API_ENDPOINT_EDGE_GROUPS) {\n return $resource(\n API_ENDPOINT_EDGE_GROUPS + '/:id/:action',\n {},\n {\n create: { method: 'POST', ignoreLoadingBar: true },\n query: { method: 'GET', isArray: true },\n get: { method: 'GET', params: { id: '@id' } },\n update: { method: 'PUT', params: { id: '@Id' } },\n remove: { method: 'DELETE', params: { id: '@id' } },\n }\n );\n});\n","angular.module('portainer.edge').factory('EdgeJobResults', EdgeJobResultsFactory);\n\nfunction EdgeJobResultsFactory($resource, API_ENDPOINT_EDGE_JOBS) {\n return $resource(\n API_ENDPOINT_EDGE_JOBS + '/:id/tasks/:taskId/:action',\n {},\n {\n query: { method: 'GET', isArray: true, params: { id: '@id' } },\n logFile: { method: 'GET', params: { id: '@id', taskId: '@taskId', action: 'logs' } },\n clearLogs: { method: 'DELETE', params: { id: '@id', taskId: '@taskId', action: 'logs' } },\n collectLogs: { method: 'POST', params: { id: '@id', taskId: '@taskId', action: 'logs' } },\n }\n );\n}\n","angular.module('portainer.edge').factory('EdgeJobs', EdgeJobsFactory);\n\nfunction EdgeJobsFactory($resource, API_ENDPOINT_EDGE_JOBS) {\n return $resource(\n API_ENDPOINT_EDGE_JOBS + '/:id/:action',\n {},\n {\n create: { method: 'POST' },\n query: { method: 'GET', isArray: true },\n get: { method: 'GET', params: { id: '@id' } },\n update: { method: 'PUT', params: { id: '@id' } },\n remove: { method: 'DELETE', params: { id: '@id' } },\n file: { method: 'GET', params: { id: '@id', action: 'file' } },\n tasks: { method: 'GET', isArray: true, params: { id: '@id', action: 'tasks' } },\n }\n );\n}\n","import angular from 'angular';\n\nangular.module('portainer.edge').factory('EdgeStacks', function EdgeStacksFactory($resource, API_ENDPOINT_EDGE_STACKS) {\n return $resource(\n API_ENDPOINT_EDGE_STACKS + '/:id/:action',\n {},\n {\n create: { method: 'POST', ignoreLoadingBar: true },\n query: { method: 'GET', isArray: true },\n get: { method: 'GET', params: { id: '@id' } },\n update: { method: 'PUT', params: { id: '@id' } },\n remove: { method: 'DELETE', params: { id: '@id' } },\n file: { method: 'GET', params: { id: '@id', action: 'file' } },\n }\n );\n});\n","import angular from 'angular';\n\nangular.module('portainer.edge').factory('EdgeTemplates', function EdgeStacksFactory($resource, API_ENDPOINT_EDGE_TEMPLATES) {\n return $resource(\n API_ENDPOINT_EDGE_TEMPLATES,\n {},\n {\n query: { method: 'GET', isArray: true },\n }\n );\n});\n","import angular from 'angular';\n\nangular.module('portainer.edge').factory('EdgeGroupService', function EdgeGroupServiceFactory(EdgeGroups) {\n var service = {};\n\n service.group = function group(groupId) {\n return EdgeGroups.get({ id: groupId }).$promise;\n };\n\n service.groups = function groups() {\n return EdgeGroups.query({}).$promise;\n };\n\n service.remove = function remove(groupId) {\n return EdgeGroups.remove({ id: groupId }).$promise;\n };\n\n service.create = function create(group) {\n return EdgeGroups.create(group).$promise;\n };\n\n service.update = function update(group) {\n return EdgeGroups.update(group).$promise;\n };\n\n return service;\n});\n","import angular from 'angular';\n\nimport { ScheduleCreateRequest, ScheduleUpdateRequest } from 'Portainer/models/schedule';\n\nfunction EdgeJobService(EdgeJobs, EdgeJobResults, FileUploadService) {\n var service = {};\n\n service.edgeJob = edgeJob;\n async function edgeJob(edgeJobId) {\n try {\n return await EdgeJobs.get({ id: edgeJobId }).$promise;\n } catch (err) {\n throw { msg: 'Unable to retrieve edgeJob', err: err };\n }\n }\n\n service.edgeJobs = edgeJobs;\n async function edgeJobs() {\n try {\n return await EdgeJobs.query().$promise;\n } catch (err) {\n throw { msg: 'Unable to retrieve edgeJobs', err: err };\n }\n }\n\n service.jobResults = jobResults;\n async function jobResults(edgeJobId) {\n try {\n return await EdgeJobResults.query({ id: edgeJobId }).$promise;\n } catch (err) {\n throw { msg: 'Unable to retrieve results associated to the edgeJob', err: err };\n }\n }\n\n service.logFile = logFile;\n function logFile(id, taskId) {\n return EdgeJobResults.logFile({ id, taskId }).$promise;\n }\n\n service.collectLogs = collectLogs;\n function collectLogs(id, taskId) {\n return EdgeJobResults.collectLogs({ id, taskId }).$promise;\n }\n\n service.clearLogs = clearLogs;\n function clearLogs(id, taskId) {\n return EdgeJobResults.clearLogs({ id, taskId }).$promise;\n }\n\n service.createEdgeJobFromFileContent = function (model) {\n var payload = new ScheduleCreateRequest(model);\n return EdgeJobs.create({ method: 'string' }, payload).$promise;\n };\n\n service.createEdgeJobFromFileUpload = function (model) {\n var payload = new ScheduleCreateRequest(model);\n return FileUploadService.createSchedule(payload);\n };\n\n service.updateEdgeJob = function (model) {\n var payload = new ScheduleUpdateRequest(model);\n return EdgeJobs.update(payload).$promise;\n };\n\n service.remove = function (edgeJobId) {\n return EdgeJobs.remove({ id: edgeJobId }).$promise;\n };\n\n service.getScriptFile = function (edgeJobId) {\n return EdgeJobs.file({ id: edgeJobId }).$promise;\n };\n\n return service;\n}\n\nangular.module('portainer.edge').factory('EdgeJobService', EdgeJobService);\n","import angular from 'angular';\n\nangular.module('portainer.edge').factory('EdgeStackService', function EdgeStackServiceFactory(EdgeStacks, FileUploadService) {\n var service = {};\n\n service.stack = function stack(id) {\n return EdgeStacks.get({ id }).$promise;\n };\n\n service.stacks = function stacks() {\n return EdgeStacks.query({}).$promise;\n };\n\n service.remove = function remove(id) {\n return EdgeStacks.remove({ id }).$promise;\n };\n\n service.stackFile = async function stackFile(id) {\n try {\n const { StackFileContent } = await EdgeStacks.file({ id }).$promise;\n return StackFileContent;\n } catch (err) {\n throw { msg: 'Unable to retrieve stack content', err };\n }\n };\n\n service.updateStack = async function updateStack(id, stack) {\n return EdgeStacks.update({ id }, stack).$promise;\n };\n\n service.createStackFromFileContent = async function createStackFromFileContent(payload) {\n try {\n return await EdgeStacks.create({ method: 'string' }, payload).$promise;\n } catch (err) {\n throw { msg: 'Unable to create the stack', err };\n }\n };\n\n service.createStackFromFileUpload = async function createStackFromFileUpload(payload, file) {\n try {\n return await FileUploadService.createEdgeStack(payload, file);\n } catch (err) {\n throw { msg: 'Unable to create the stack', err };\n }\n };\n\n service.createStackFromGitRepository = async function createStackFromGitRepository(payload, repositoryOptions) {\n try {\n return await EdgeStacks.create(\n { method: 'repository' },\n {\n ...payload,\n RepositoryURL: repositoryOptions.RepositoryURL,\n RepositoryReferenceName: repositoryOptions.RepositoryReferenceName,\n FilePathInRepository: repositoryOptions.FilePathInRepository,\n RepositoryAuthentication: repositoryOptions.RepositoryAuthentication,\n RepositoryUsername: repositoryOptions.RepositoryUsername,\n RepositoryPassword: repositoryOptions.RepositoryPassword,\n }\n ).$promise;\n } catch (err) {\n throw { msg: 'Unable to create the stack', err };\n }\n };\n\n service.update = function update(stack) {\n return EdgeStacks.update(stack).$promise;\n };\n\n return service;\n});\n","import angular from 'angular';\n\nclass EdgeTemplateService {\n /* @ngInject */\n constructor(EdgeTemplates) {\n this.EdgeTemplates = EdgeTemplates;\n }\n\n edgeTemplates() {\n return this.EdgeTemplates.query().$promise;\n }\n\n async edgeTemplate(template) {\n const response = await fetch(template.stackFile);\n if (!response.ok) {\n throw new Error(response.statusText);\n }\n\n return response.text();\n }\n}\n\nangular.module('portainer.edge').service('EdgeTemplateService', EdgeTemplateService);\n","const autoNgTemplateLoaderTemplate1 = require('./createEdgeGroupView.html');\n\nimport angular from 'angular';\n\nimport { CreateEdgeGroupController } from './createEdgeGroupViewController';\n\nangular.module('portainer.edge').component('createEdgeGroupView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: CreateEdgeGroupController,\n});\n","var path = 'app/edge/views/edge-groups/createEdgeGroupView/createEdgeGroupView.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Create edge group\\\"></rd-header-title>\\n <rd-header-content> <a ui-sref=\\\"edge.groups\\\">Edge groups</a> > Add edge group </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <edge-group-form\\n loaded=\\\"$ctrl.state.loaded\\\"\\n page-type=\\\"create\\\"\\n form-action-label=\\\"Add edge group\\\"\\n form-action=\\\"$ctrl.createGroup\\\"\\n groups=\\\"$ctrl.endpointGroups\\\"\\n tags=\\\"$ctrl.tags\\\"\\n model=\\\"$ctrl.model\\\"\\n on-change-tags=\\\"($ctrl.onChangeTags)\\\"\\n ></edge-group-form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./edgeGroupsView.html');\n\nimport angular from 'angular';\n\nimport { EdgeGroupsController } from './edgeGroupsViewController';\n\nangular.module('portainer.edge').component('edgeGroupsView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: EdgeGroupsController,\n});\n","var path = 'app/edge/views/edge-groups/edgeGroupsView/edgeGroupsView.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Edge Groups\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"Refresh\\\" ui-sref=\\\"edge.groups\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content>Edge Groups</rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <edge-groups-datatable title-icon=\\\"fa-object-group\\\" table-key=\\\"EdgeGroups\\\" order-by=\\\"Name\\\" dataset=\\\"$ctrl.items\\\" remove-action=\\\"$ctrl.removeAction\\\"></edge-groups-datatable>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./editEdgeGroupView.html');\n\nimport angular from 'angular';\n\nimport { EditEdgeGroupController } from './editEdgeGroupViewController';\n\nangular.module('portainer.edge').component('editEdgeGroupView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: EditEdgeGroupController,\n});\n","var path = 'app/edge/views/edge-groups/editEdgeGroupView/editEdgeGroupView.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Edit edge group\\\"></rd-header-title>\\n <rd-header-content> <a ui-sref=\\\"edge.groups\\\">Edge Groups</a> > {{ $ctrl.model.Name }} </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\" ng-if=\\\"$ctrl.model\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <edge-group-form\\n loaded=\\\"$ctrl.state.loaded\\\"\\n page-type=\\\"edit\\\"\\n form-action-label=\\\"Save edge group\\\"\\n form-action=\\\"$ctrl.updateGroup\\\"\\n endpoints=\\\"$ctrl.endpoints\\\"\\n groups=\\\"$ctrl.endpointGroups\\\"\\n tags=\\\"$ctrl.tags\\\"\\n model=\\\"$ctrl.model\\\"\\n ></edge-group-form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./createEdgeJobView.html');\n\nimport angular from 'angular';\nimport { CreateEdgeJobViewController } from './createEdgeJobViewController';\n\nangular.module('portainer.edge').component('createEdgeJobView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: CreateEdgeJobViewController,\n});\n","var path = 'app/edge/views/edge-jobs/createEdgeJobView/createEdgeJobView.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Create Edge job\\\"></rd-header-title>\\n <rd-header-content> <a ui-sref=\\\"edge.jobs\\\">Edge Jobs</a> > Create Edge job </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <edge-job-form\\n model=\\\"$ctrl.model\\\"\\n groups=\\\"$ctrl.groups\\\"\\n tags=\\\"$ctrl.tags\\\"\\n form-action=\\\"$ctrl.create\\\"\\n form-action-label=\\\"Create edge job\\\"\\n action-in-progress=\\\"$ctrl.state.actionInProgress\\\"\\n is-editor-dirty=\\\"$ctrl.state.isEditorDirty\\\"\\n ></edge-job-form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./edgeJob.html');\n\nimport angular from 'angular';\nimport { EdgeJobController } from './edgeJobController';\n\nangular.module('portainer.edge').component('edgeJobView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: EdgeJobController,\n});\n","var path = 'app/edge/views/edge-jobs/edgeJob/edgeJob.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Edge job details\\\">\\n <a data-toggle=\\\"tooltip\\\" title-text=\\\"Refresh\\\" ui-sref=\\\"edge.jobs.job({id: $ctrl.edgeJob.Id, tab: $ctrl.state.activeTab})\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content> <a ui-sref=\\\"edge.jobs\\\">Edge jobs</a> > {{ ::$ctrl.edgeJob.Name }} </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <uib-tabset active=\\\"$ctrl.state.activeTab\\\">\\n <uib-tab index=\\\"0\\\" select=\\\"$ctrl.showEditor()\\\">\\n <uib-tab-heading> <i class=\\\"fa fa-wrench\\\" aria-hidden=\\\"true\\\"></i> Configuration </uib-tab-heading>\\n\\n <edge-job-form\\n ng-if=\\\"$ctrl.edgeJob && $ctrl.state.showEditorTab\\\"\\n model=\\\"$ctrl.edgeJob\\\"\\n endpoints=\\\"endpoints\\\"\\n groups=\\\"$ctrl.groups\\\"\\n tags=\\\"$ctrl.tags\\\"\\n form-action=\\\"$ctrl.update\\\"\\n form-action-label=\\\"Update Edge job\\\"\\n action-in-progress=\\\"$ctrl.state.actionInProgress\\\"\\n is-editor-dirty=\\\"$ctrl.state.isEditorDirty\\\"\\n ></edge-job-form>\\n </uib-tab>\\n\\n <uib-tab index=\\\"1\\\">\\n <uib-tab-heading> <i class=\\\"fa fa-tasks\\\" aria-hidden=\\\"true\\\"></i> Results </uib-tab-heading>\\n\\n <edge-job-results-datatable\\n style=\\\"display: block; margin-top: 10px;\\\"\\n ng-if=\\\"$ctrl.results\\\"\\n title-text=\\\"Results\\\"\\n title-icon=\\\"fa-tasks\\\"\\n dataset=\\\"$ctrl.results\\\"\\n table-key=\\\"edge-job-results\\\"\\n order-by=\\\"Status\\\"\\n reverse-order=\\\"true\\\"\\n refresh-callback=\\\"$ctrl.refresh\\\"\\n on-download-logs-click=\\\"($ctrl.downloadLogs)\\\"\\n on-collect-logs-click=\\\"($ctrl.collectLogs)\\\"\\n on-clear-logs-click=\\\"($ctrl.clearLogs)\\\"\\n ></edge-job-results-datatable>\\n </uib-tab>\\n </uib-tabset>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./edgeJobsView.html');\n\nimport angular from 'angular';\nimport { EdgeJobsViewController } from './edgeJobsViewController';\n\nangular.module('portainer.edge').component('edgeJobsView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: EdgeJobsViewController,\n});\n","var path = 'app/edge/views/edge-jobs/edgeJobsView/edgeJobsView.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Edge Jobs\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"Refresh\\\" ui-sref=\\\"edge.jobs\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content>Edge Jobs</rd-header-content>\\n</rd-header>\\n\\n<beta-panel></beta-panel>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <edge-jobs-datatable\\n title-text=\\\"Edge jobs\\\"\\n title-icon=\\\"fa-clock\\\"\\n dataset=\\\"$ctrl.edgeJobs\\\"\\n table-key=\\\"edgeJobs\\\"\\n order-by=\\\"Name\\\"\\n remove-action=\\\"$ctrl.removeAction\\\"\\n ></edge-jobs-datatable>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./edgeStacksView.html');\n\nimport angular from 'angular';\n\nimport { EdgeStacksViewController } from './edgeStacksViewController';\n\nangular.module('portainer.edge').component('edgeStacksView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: EdgeStacksViewController,\n});\n","var path = 'app/edge/views/edge-stacks/edgeStacksView/edgeStacksView.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Edge Stacks list\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"Refresh\\\" ui-sref=\\\"edge.stacks\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content>Edge Stacks</rd-header-content>\\n</rd-header>\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <edge-stacks-datatable\\n title-text=\\\"Edge Stacks\\\"\\n title-icon=\\\"fa-th-list\\\"\\n dataset=\\\"$ctrl.stacks\\\"\\n table-key=\\\"edgeStacks\\\"\\n order-by=\\\"Name\\\"\\n remove-action=\\\"$ctrl.removeAction\\\"\\n refresh-callback=\\\"$ctrl.getStacks\\\"\\n ></edge-stacks-datatable>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./editEdgeStackView.html');\n\nimport angular from 'angular';\n\nimport { EditEdgeStackViewController } from './editEdgeStackViewController';\n\nangular.module('portainer.edge').component('editEdgeStackView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: EditEdgeStackViewController,\n});\n","var path = 'app/edge/views/edge-stacks/editEdgeStackView/editEdgeStackView.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Edit Edge stack\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"Refresh\\\" ui-sref=\\\"edge.stacks.edit({stackId:$ctrl.stack.Id, tab: $ctrl.state.activeTab})\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content> <a ui-sref=\\\"edge.stacks\\\">Edge Stacks</a> > {{ $ctrl.stack.Name }} </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\" ng-if=\\\"$ctrl.stack\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <uib-tabset active=\\\"$ctrl.state.activeTab\\\" justified=\\\"true\\\" type=\\\"pills\\\">\\n <uib-tab index=\\\"0\\\" classes=\\\"btn-sm\\\">\\n <uib-tab-heading> <i class=\\\"fa fa-layer-group space-right\\\" aria-hidden=\\\"true\\\"></i> Stack</uib-tab-heading>\\n\\n <div style=\\\"padding: 20px;\\\">\\n <edit-edge-stack-form\\n edge-groups=\\\"$ctrl.edgeGroups\\\"\\n model=\\\"$ctrl.formValues\\\"\\n action-in-progress=\\\"$ctrl.state.actionInProgress\\\"\\n submit-action=\\\"$ctrl.deployStack\\\"\\n is-editor-dirty=\\\"$ctrl.state.isEditorDirty\\\"\\n ></edit-edge-stack-form>\\n </div>\\n </uib-tab>\\n <uib-tab index=\\\"1\\\" classes=\\\"btn-sm\\\">\\n <uib-tab-heading> <i class=\\\"fa fa-plug space-right\\\" aria-hidden=\\\"true\\\"></i> Environments</uib-tab-heading>\\n\\n <div style=\\\"margin-top: 25px;\\\">\\n <edge-stack-endpoints-datatable\\n title-text=\\\"Environments Status\\\"\\n dataset=\\\"$ctrl.endpoints\\\"\\n title-icon=\\\"fa-plug\\\"\\n table-key=\\\"edgeStackEndpoints\\\"\\n order-by=\\\"Name\\\"\\n retrieve-page=\\\"$ctrl.getPaginatedEndpoints\\\"\\n >\\n </edge-stack-endpoints-datatable>\\n </div>\\n </uib-tab>\\n </uib-tabset>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","angular.module('portainer.integrations', ['portainer.integrations.storidge']);\n","const autoNgTemplateLoaderTemplate1 = require('./views/profiles/profiles.html');\nconst autoNgTemplateLoaderTemplate2 = require('./views/profiles/edit/profile.html');\nconst autoNgTemplateLoaderTemplate3 = require('./views/drives/drives.html');\nconst autoNgTemplateLoaderTemplate4 = require('./views/drives/inspect/drive.html');\nconst autoNgTemplateLoaderTemplate5 = require('./views/snapshots/inspect/snapshot.html');\nconst autoNgTemplateLoaderTemplate6 = require('./views/profiles/create/createprofile.html');\nconst autoNgTemplateLoaderTemplate7 = require('./views/cluster/cluster.html');\nconst autoNgTemplateLoaderTemplate8 = require('./views/nodes/inspect/node.html');\nconst autoNgTemplateLoaderTemplate9 = require('./views/monitor/monitor.html');\n\n// TODO: legacy extension management\n\nangular.module('portainer.integrations.storidge', []).config([\n '$stateRegistryProvider',\n function ($stateRegistryProvider) {\n 'use strict';\n\n var storidge = {\n name: 'storidge',\n parent: 'root',\n abstract: true,\n url: '/storidge',\n };\n\n var profiles = {\n name: 'storidge.profiles',\n url: '/profiles',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'StoridgeProfilesController',\n },\n },\n };\n\n var profile = {\n name: 'storidge.profiles.profile',\n url: '/:id',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate2,\n controller: 'StoridgeProfileController',\n },\n },\n };\n\n var drives = {\n name: 'storidge.drives',\n url: '/drives',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate3,\n controller: 'StoridgeDrivesController',\n },\n },\n };\n\n var drive = {\n name: 'storidge.drives.drive',\n url: '/:id',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate4,\n controller: 'StoridgeDriveController',\n },\n },\n };\n\n var snapshot = {\n name: 'docker.volumes.volume.snapshot',\n url: '/:snapshotId',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate5,\n controller: 'StoridgeSnapshotController',\n },\n },\n };\n\n var profileCreation = {\n name: 'storidge.profiles.new',\n url: '/new',\n params: {\n profileName: '',\n },\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate6,\n controller: 'StoridgeCreateProfileController',\n },\n },\n };\n\n var cluster = {\n name: 'storidge.cluster',\n url: '/cluster',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate7,\n controller: 'StoridgeClusterController',\n },\n },\n };\n\n var node = {\n name: 'storidge.cluster.node',\n url: '/:name',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate8,\n controller: 'StoridgeNodeController',\n },\n },\n };\n\n var monitor = {\n name: 'storidge.monitor',\n url: '/events',\n views: {\n 'content@': {\n templateUrl: autoNgTemplateLoaderTemplate9,\n controller: 'StoridgeMonitorController',\n },\n },\n };\n\n $stateRegistryProvider.register(storidge);\n $stateRegistryProvider.register(drives);\n $stateRegistryProvider.register(drive);\n $stateRegistryProvider.register(snapshot);\n $stateRegistryProvider.register(profiles);\n $stateRegistryProvider.register(profile);\n $stateRegistryProvider.register(profileCreation);\n $stateRegistryProvider.register(cluster);\n $stateRegistryProvider.register(node);\n $stateRegistryProvider.register(monitor);\n },\n]);\n","var path = 'app/integrations/storidge/views/profiles/profiles.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Storidge profiles\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"Refresh\\\" ui-sref=\\\"storidge.profiles\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content> <a ui-sref=\\\"storidge.cluster\\\">Storidge</a> > <a ui-sref=\\\"storidge.profiles\\\">Profiles</a> </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-md-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-plus\\\" title-text=\\\"Add a profile\\\"> </rd-widget-header>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\">\\n <!-- name-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"profile_name\\\" class=\\\"col-sm-1 control-label text-left\\\">Name</label>\\n <div class=\\\"col-sm-11\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"formValues.Name\\\" id=\\\"profile_name\\\" placeholder=\\\"e.g. myProfile\\\" />\\n </div>\\n </div>\\n <!-- !name-input -->\\n <!-- tag-note -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <span class=\\\"small text-muted\\\">Note: The profile will be created using the default properties.</span>\\n </div>\\n </div>\\n <!-- !tag-note -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-click=\\\"create()\\\"\\n ng-disabled=\\\"state.actionInProgress || !formValues.Name\\\"\\n button-spinner=\\\"state.actionInProgress\\\"\\n >\\n <span ng-hide=\\\"state.actionInProgress\\\">Create the profile</span>\\n <span ng-show=\\\"state.actionInProgress\\\">Creating profile...</span>\\n </button>\\n <button type=\\\"button\\\" class=\\\"btn btn-primary btn-sm\\\" ng-disabled=\\\"!formValues.Name\\\" ui-sref=\\\"storidge.profiles.new({ profileName: formValues.Name })\\\"\\n >Modify defaults...</button\\n >\\n </div>\\n </div>\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <storidge-profiles-datatable\\n title-text=\\\"Profiles\\\"\\n title-icon=\\\"fa-sticky-note\\\"\\n dataset=\\\"profiles\\\"\\n table-key=\\\"storidge_profiles\\\"\\n order-by=\\\"Name\\\"\\n remove-action=\\\"removeAction\\\"\\n ></storidge-profiles-datatable>\\n </div>\\n</div>\\n\\n<!-- <div class=\\\"row\\\">\\n <div class=\\\"col-md-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-sticky-note\\\" title-text=\\\"Profiles\\\">\\n <div class=\\\"pull-right\\\">\\n Items per page:\\n <select ng-model=\\\"state.pagination_count\\\" ng-change=\\\"changePaginationCount()\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </div>\\n </rd-widget-header>\\n <rd-widget-taskbar classes=\\\"col-md-12\\\">\\n <div class=\\\"pull-left\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-danger\\\" ng-click=\\\"removeProfiles()\\\" ng-disabled=\\\"!state.selectedItemCount\\\"><i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Remove</button>\\n </div>\\n <div class=\\\"pull-right\\\">\\n <input type=\\\"text\\\" id=\\\"filter\\\" ng-model=\\\"state.filter\\\" placeholder=\\\"Filter...\\\" class=\\\"form-control input-sm\\\" />\\n </div>\\n </rd-widget-taskbar>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover\\\">\\n <thead>\\n <tr>\\n <th>\\n <input type=\\\"checkbox\\\" ng-model=\\\"allSelected\\\" ng-change=\\\"selectItems(allSelected)\\\" />\\n </th>\\n <th>\\n <a ng-click=\\\"order('Name')\\\">\\n Name\\n <span ng-show=\\\"sortType == 'Name' && !sortReverse\\\" class=\\\"glyphicon glyphicon-chevron-down\\\"></span>\\n <span ng-show=\\\"sortType == 'Name' && sortReverse\\\" class=\\\"glyphicon glyphicon-chevron-up\\\"></span>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr dir-paginate=\\\"profile in (state.filteredProfiles = (profiles | filter:state.filter | orderBy:sortType:sortReverse | itemsPerPage: state.pagination_count))\\\">\\n <td><input type=\\\"checkbox\\\" ng-model=\\\"profile.Checked\\\" ng-change=\\\"selectItem(profile)\\\" /></td>\\n <td>\\n <a ui-sref=\\\"storidge.profiles.profile({id: profile.Name})\\\">{{ profile.Name }}</a>\\n </td>\\n </tr>\\n <tr ng-if=\\\"!profiles\\\">\\n <td colspan=\\\"3\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"state.filteredProfiles.length == 0\\\">\\n <td colspan=\\\"3\\\" class=\\\"text-center text-muted\\\">No profiles available.</td>\\n </tr>\\n </tbody>\\n </table>\\n <div ng-if=\\\"profiles\\\" class=\\\"pull-left pagination-controls\\\">\\n <dir-pagination-controls></dir-pagination-controls>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div> -->\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/integrations/storidge/views/profiles/edit/profile.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Profile details\\\"></rd-header-title>\\n <rd-header-content> <a ui-sref=\\\"storidge.cluster\\\">Storidge</a> > <a ui-sref=\\\"storidge.profiles\\\">Profiles</a> > {{ profile.Name }} </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\" ng-if=\\\"profile\\\">\\n <div class=\\\"col-md-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\" name=\\\"storidgeUpdateProfileForm\\\">\\n <!-- name-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"profile_name\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Name</label>\\n <div class=\\\"col-sm-10 col-lg-11\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"profile.Name\\\" name=\\\"profile_name\\\" disabled />\\n </div>\\n </div>\\n <!-- !name-input -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Profile configuration\\n </div>\\n <!-- directory -->\\n <div class=\\\"form-group\\\" ng-class=\\\"{ 'has-error': storidgeUpdateProfileForm.profile_directory.$invalid }\\\">\\n <label for=\\\"profile_directory\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Directory</label>\\n <div class=\\\"col-sm-10 col-lg-11\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"profile.Directory\\\" name=\\\"profile_directory\\\" placeholder=\\\"e.g. /cio/myProfile\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"storidgeUpdateProfileForm.profile_directory.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"storidgeUpdateProfileForm.profile_directory.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !directory -->\\n <!-- capacity -->\\n <div class=\\\"form-group\\\" ng-class=\\\"{ 'has-error': storidgeUpdateProfileForm.profile_capacity.$invalid }\\\">\\n <label for=\\\"profile_capacity\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Capacity</label>\\n <div class=\\\"col-sm-10 col-lg-11\\\">\\n <input type=\\\"number\\\" class=\\\"form-control\\\" ng-model=\\\"profile.Capacity\\\" name=\\\"profile_capacity\\\" ng-min=\\\"1\\\" ng-max=\\\"64000\\\" placeholder=\\\"2\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"storidgeUpdateProfileForm.profile_capacity.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"storidgeUpdateProfileForm.profile_capacity.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n <p ng-message=\\\"min\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Minimum value for capacity: 1.</p>\\n <p ng-message=\\\"max\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Maximum value for capacity: 64000.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !capacity -->\\n <!-- redundancy -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"profile_redundancy\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Redundancy</label>\\n <div class=\\\"col-sm-10 col-lg-11\\\">\\n <select name=\\\"profile_redundancy\\\" ng-model=\\\"profile.Redundancy\\\" ng-options=\\\"+(opt.value) as opt.label for opt in RedundancyOptions\\\" class=\\\"form-control\\\"> </select>\\n </div>\\n </div>\\n <!-- !redudancy -->\\n <!-- provisioning -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"profile_provisioning\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Provisioning</label>\\n <div class=\\\"col-sm-10 col-lg-11\\\">\\n <select name=\\\"profile_provisioning\\\" ng-model=\\\"profile.Provisioning\\\" class=\\\"form-control\\\">\\n <option value=\\\"thin\\\">Thin</option>\\n <option value=\\\"thick\\\">Thick</option>\\n </select>\\n </div>\\n </div>\\n <!-- !provisioning -->\\n <!-- type -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"profile_type\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Type</label>\\n <div class=\\\"col-sm-10 col-lg-11\\\">\\n <select name=\\\"profile_type\\\" ng-model=\\\"profile.Type\\\" class=\\\"form-control\\\">\\n <option value=\\\"ssd\\\">SSD</option>\\n <option value=\\\"hdd\\\">HDD</option>\\n </select>\\n </div>\\n </div>\\n <!-- !type -->\\n <!-- Filesystem -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"profile_filesystem\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Filesystem</label>\\n <div class=\\\"col-sm-10 col-lg-11\\\">\\n <select name=\\\"profile_filesystem\\\" ng-model=\\\"profile.Filesystem\\\" class=\\\"form-control\\\">\\n <option value=\\\"btrfs\\\">btrfs</option>\\n <option value=\\\"ext4\\\">ext4</option>\\n <option value=\\\"xfs\\\">xfs</option>\\n </select>\\n </div>\\n </div>\\n <!-- !Filesystem -->\\n <!-- snapshotEnabled -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"profile_snapshotEnabled\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">\\n Enable snapshots\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\"> <input name=\\\"profile_snapshotEnabled\\\" type=\\\"checkbox\\\" ng-model=\\\"profile.SnapshotEnabled\\\" /><i></i> </label>\\n </div>\\n <!-- !snapshotEnabled -->\\n <!-- snapshotMax -->\\n <div class=\\\"form-group\\\" ng-if=\\\"profile.SnapshotEnabled\\\">\\n <label for=\\\"profile_snapshotMax\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\" style=\\\"margin-top: 20px;\\\">\\n Snapshot max\\n </label>\\n <div class=\\\"col-sm-4\\\">\\n <slider model=\\\"profile.SnapshotMax\\\" floor=\\\"1\\\" ceil=\\\"100\\\" step=\\\"1\\\"></slider>\\n </div>\\n <div class=\\\"col-sm-2\\\">\\n <input type=\\\"number\\\" min=\\\"1\\\" class=\\\"form-control\\\" ng-model=\\\"profile.SnapshotMax\\\" id=\\\"profile_snapshotMax\\\" />\\n </div>\\n <div class=\\\"col-sm-4\\\">\\n <p class=\\\"small text-muted\\\" style=\\\"margin-top: 7px;\\\">\\n Snapshot max (<b>count</b>)\\n </p>\\n </div>\\n </div>\\n <!-- !snapshotMax -->\\n <!-- snapshotEnabled -->\\n <div class=\\\"form-group\\\" ng-if=\\\"profile.SnapshotEnabled\\\">\\n <label for=\\\"profile_recurringSnapshotEnabled\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">\\n Enable periodic snapshots\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\">\\n <input name=\\\"profile_recurringSnapshotEnabled\\\" type=\\\"checkbox\\\" ng-model=\\\"state.RecurringSnapshotEnabled\\\" /><i></i>\\n </label>\\n </div>\\n <!-- !snapshotEnabled -->\\n <!-- snapshotInterval -->\\n <div class=\\\"form-group\\\" ng-if=\\\"profile.SnapshotEnabled && state.RecurringSnapshotEnabled\\\">\\n <label for=\\\"profile_snapshotInterval\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\" style=\\\"margin-top: 20px;\\\">\\n Snapshot interval\\n </label>\\n <div class=\\\"col-sm-4\\\">\\n <slider model=\\\"profile.SnapshotInterval\\\" floor=\\\"1\\\" ceil=\\\"2880\\\" step=\\\"1\\\"></slider>\\n </div>\\n <div class=\\\"col-sm-2\\\">\\n <input type=\\\"number\\\" min=\\\"1\\\" class=\\\"form-control\\\" ng-model=\\\"profile.SnapshotInterval\\\" id=\\\"profile_snapshotInterval\\\" />\\n </div>\\n <div class=\\\"col-sm-4\\\">\\n <p class=\\\"small text-muted\\\" style=\\\"margin-top: 7px;\\\">\\n Snapshot interval (<b>minutes</b>)\\n </p>\\n </div>\\n </div>\\n <!-- !snapshotInterval -->\\n <!-- encryptionEnabled -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"profile_encryptionEnabled\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">\\n Enable encryption\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\"> <input name=\\\"profile_encryptionEnabled\\\" type=\\\"checkbox\\\" ng-model=\\\"profile.EncryptionEnabled\\\" /><i></i> </label>\\n </div>\\n <!-- !encryptionEnabled -->\\n <!-- interfaceType -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"profile_interfaceType\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Interface type</label>\\n <div class=\\\"col-sm-10 col-lg-11\\\">\\n <select name=\\\"profile_interfaceType\\\" ng-model=\\\"profile.InterfaceType\\\" class=\\\"form-control\\\">\\n <option value=\\\"\\\"></option>\\n <option value=\\\"nfs\\\">nfs</option>\\n </select>\\n </div>\\n </div>\\n <!-- !interfaceType -->\\n <!-- interfaceDriver -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"profile_interfaceDriver\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Network driver</label>\\n <div class=\\\"col-sm-10 col-lg-11\\\">\\n <select name=\\\"profile_interfaceDriver\\\" ng-model=\\\"profile.InterfaceDriver\\\" class=\\\"form-control\\\">\\n <option value=\\\"\\\"></option>\\n <option value=\\\"macvlan\\\">macvlan</option>\\n <option value=\\\"overlay\\\">overlay</option>\\n </select>\\n </div>\\n </div>\\n <!-- !interfaceDriver -->\\n <!-- interfaceNetwork -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"profile_interfaceNetwork\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Network name</label>\\n <div class=\\\"col-sm-10 col-lg-11\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"profile.InterfaceNetwork\\\" name=\\\"profile_interfaceNetwork\\\" pattern=\\\"[a-zA-Z0-9]+\\\" />\\n </div>\\n </div>\\n <!-- !interfaceNetwork -->\\n <!-- interfaceConf -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"profile_interfaceConf\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Interface conf</label>\\n <div class=\\\"col-sm-10 col-lg-11\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"profile.InterfaceConf\\\" name=\\\"profile_interfaceConf\\\" />\\n </div>\\n </div>\\n <!-- !interfaceConf -->\\n <!-- labels -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 5px;\\\">\\n <label class=\\\"control-label text-left\\\">Labels</label>\\n <span class=\\\"label label-default interactive\\\" style=\\\"margin-left: 10px;\\\" ng-click=\\\"addLabel()\\\"> <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add label </span>\\n </div>\\n <!-- labels-input-list -->\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\">\\n <div ng-repeat=\\\"label in formValues.Labels\\\" style=\\\"margin-top: 2px;\\\">\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">name</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"label.name\\\" placeholder=\\\"e.g. com.example.foo\\\" />\\n </div>\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">value</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"label.value\\\" placeholder=\\\"e.g. bar\\\" />\\n </div>\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removeLabel($index)\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n <!-- !labels-input-list -->\\n </div>\\n <!-- !labels -->\\n <!-- iops -->\\n <div ng-if=\\\"!state.LimitBandwidth || state.NoLimit\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n IOPS\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label for=\\\"permissions\\\" class=\\\"control-label text-left\\\">\\n Limit IOPS\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\">\\n <input type=\\\"checkbox\\\" ng-model=\\\"state.LimitIOPS\\\" ng-change=\\\"state.NoLimit = (!state.LimitBandwidth && !state.LimitIOPS)\\\" /><i></i>\\n </label>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-if=\\\"state.LimitIOPS\\\">\\n <label for=\\\"min_iops\\\" class=\\\"col-sm-1 control-label text-left\\\">Min</label>\\n <div class=\\\"col-sm-5\\\" ng-class=\\\"{ 'has-error': storidgeUpdateProfileForm.min_iops.$invalid }\\\">\\n <input type=\\\"number\\\" class=\\\"form-control\\\" ng-model=\\\"profile.MinIOPS\\\" name=\\\"min_iops\\\" ng-min=\\\"30\\\" ng-max=\\\"999999\\\" placeholder=\\\"100\\\" required />\\n </div>\\n <label for=\\\"max_iops\\\" class=\\\"col-sm-1 control-label text-left\\\">Max</label>\\n <div class=\\\"col-sm-5\\\" ng-class=\\\"{ 'has-error': storidgeUpdateProfileForm.max_iops.$invalid }\\\">\\n <input type=\\\"number\\\" class=\\\"form-control\\\" ng-model=\\\"profile.MaxIOPS\\\" name=\\\"max_iops\\\" ng-min=\\\"30\\\" ng-max=\\\"999999\\\" placeholder=\\\"2000\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"storidgeUpdateProfileForm.min_iops.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"storidgeUpdateProfileForm.min_iops.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> A value is required for Min IOPS.</p>\\n <p ng-message=\\\"min\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Minimum value for Min IOPS: 30.</p>\\n <p ng-message=\\\"max\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Maximum value for Min IOPS: 999999.</p>\\n </div>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"storidgeUpdateProfileForm.max_iops.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"storidgeUpdateProfileForm.max_iops.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> A value is required for Max IOPS.</p>\\n <p ng-message=\\\"min\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Minimum value for Max IOPS: 30.</p>\\n <p ng-message=\\\"max\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Maximum value for Max IOPS: 999999.</p>\\n </div>\\n </div>\\n </div>\\n </div>\\n <!-- !iops -->\\n <!-- bandwidth -->\\n <div ng-if=\\\"!state.LimitIOPS || state.NoLimit\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Bandwidth\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label for=\\\"permissions\\\" class=\\\"control-label text-left\\\">\\n Limit bandwidth\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\">\\n <input type=\\\"checkbox\\\" ng-model=\\\"state.LimitBandwidth\\\" ng-change=\\\"state.NoLimit = (!state.LimitBandwidth && !state.LimitIOPS)\\\" /><i></i>\\n </label>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-if=\\\"state.LimitBandwidth\\\">\\n <label for=\\\"min_bandwidth\\\" class=\\\"col-sm-1 control-label text-left\\\">Min</label>\\n <div class=\\\"col-sm-5\\\" ng-class=\\\"{ 'has-error': storidgeUpdateProfileForm.min_bandwidth.$invalid }\\\">\\n <input type=\\\"number\\\" class=\\\"form-control\\\" ng-model=\\\"profile.MinBandwidth\\\" name=\\\"min_bandwidth\\\" ng-min=\\\"1\\\" ng-max=\\\"5000\\\" placeholder=\\\"1\\\" required />\\n </div>\\n <label for=\\\"max_bandwidth\\\" class=\\\"col-sm-1 control-label text-left\\\">Max</label>\\n <div class=\\\"col-sm-5\\\" ng-class=\\\"{ 'has-error': storidgeUpdateProfileForm.max_bandwidth.$invalid }\\\">\\n <input type=\\\"number\\\" class=\\\"form-control\\\" ng-model=\\\"profile.MaxBandwidth\\\" name=\\\"max_bandwidth\\\" ng-min=\\\"1\\\" ng-max=\\\"5000\\\" placeholder=\\\"100\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"storidgeUpdateProfileForm.min_bandwidth.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"storidgeUpdateProfileForm.min_bandwidth.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> A value is required for Min bandwidth.</p>\\n <p ng-message=\\\"min\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Minimum value for Min bandwidth: 1.</p>\\n <p ng-message=\\\"max\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Maximum value for Min bandwidth: 5000.</p>\\n </div>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"storidgeUpdateProfileForm.max_bandwidth.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"storidgeUpdateProfileForm.max_bandwidth.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> A value is required for Max bandwidth.</p>\\n <p ng-message=\\\"min\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Minimum value for Max bandwidth: 1.</p>\\n <p ng-message=\\\"max\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Maximum value for Max bandwidth: 5000.</p>\\n </div>\\n </div>\\n </div>\\n </div>\\n <!-- !bandwidth -->\\n <!-- actions -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-click=\\\"update()\\\"\\n ng-disabled=\\\"state.updateInProgress || !storidgeUpdateProfileForm.$valid\\\"\\n button-spinner=\\\"state.updateInProgress\\\"\\n >\\n <span ng-hide=\\\"state.updateInProgress\\\">Update the profile</span>\\n <span ng-show=\\\"state.updateInProgress\\\">Updating profile...</span>\\n </button>\\n <button type=\\\"button\\\" class=\\\"btn btn-danger btn-sm\\\" ng-click=\\\"delete()\\\" ng-disabled=\\\"state.deleteInProgress\\\" button-spinner=\\\"state.deleteInProgress\\\">\\n <span ng-hide=\\\"state.deleteInProgress\\\">Delete the profile</span>\\n <span ng-show=\\\"state.deleteInProgress\\\">Deleting profile...</span>\\n </button>\\n </div>\\n </div>\\n <!-- !actions -->\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/integrations/storidge/views/drives/drives.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Storidge drives\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"Refresh\\\" ui-sref=\\\"storidge.drives\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content> <a ui-sref=\\\"storidge.cluster\\\">Storidge</a> > <a ui-sref=\\\"storidge.drives\\\">Drives</a> </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <storidge-drives-datatable\\n title-text=\\\"Drives\\\"\\n title-icon=\\\"fa-hdd\\\"\\n dataset=\\\"drives\\\"\\n table-key=\\\"storidge_drives\\\"\\n order-by=\\\"Id\\\"\\n rescan-action=\\\"rescanAction\\\"\\n add-action=\\\"addAction\\\"\\n action-in-progress=\\\"state.actionInProgress\\\"\\n addition-in-progress=\\\"state.additionInProgress\\\"\\n ></storidge-drives-datatable>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/integrations/storidge/views/drives/inspect/drive.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Drive details\\\"></rd-header-title>\\n <rd-header-content>\\n <a ui-sref=\\\"storidge.cluster\\\">Storidge</a> > <a ui-sref=\\\"storidge.drives\\\">Drives</a> > <a ui-sref=\\\"storidge.drives.drive({id: drive.Id})\\\">{{ drive.Id }}</a>\\n </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-hdd\\\" title-text=\\\"Drive details \\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr>\\n <td>ID</td>\\n <td>\\n {{ drive.Id }}\\n <button class=\\\"btn btn-xs btn-danger\\\" ng-click=\\\"removeDrive()\\\" ng-if=\\\"drive.Status === 'faulty'\\\" button-spinner=\\\"actionInProgress\\\" ng-disabled=\\\"actionInProgress\\\">\\n <span ng-hide=\\\"actionInProgress\\\"><i class=\\\"fa fa-trash space-right\\\" aria-hidden=\\\"true\\\"></i>Remove from storage pool</span>\\n <span ng-show=\\\"actionInProgress\\\">Removal in progress...</span>\\n </button>\\n </td>\\n </tr>\\n <tr>\\n <td>Node</td>\\n <td>{{ drive.Node }}</td>\\n </tr>\\n <tr>\\n <td>Device</td>\\n <td>{{ drive.Device }}</td>\\n </tr>\\n <tr>\\n <td>Size</td>\\n <td>{{ drive.Size }}</td>\\n </tr>\\n <tr>\\n <td>Use</td>\\n <td>{{ drive.Use }}</td>\\n </tr>\\n <tr>\\n <td>Type</td>\\n <td>{{ drive.Type }}</td>\\n </tr>\\n <tr>\\n <td>Status</td>\\n <td>\\n <span class=\\\"label label-{{ drive.Status | drivestatusbadge }}\\\">{{ drive.Status | capitalize }}</span>\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/integrations/storidge/views/snapshots/inspect/snapshot.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Snasphot details\\\"></rd-header-title>\\n <rd-header-content>\\n <a ui-sref=\\\"docker.volumes\\\">Volumes</a> > <a ui-sref=\\\"docker.volumes.volume({id: volumeId})\\\">{{ volumeId }}</a> > Snapshots >\\n <a ui-sref=\\\"docker.volumes.volume.snapshot({id: snapshot.Id})\\\">{{ snapshot.Id }}</a>\\n </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-hdd\\\" title-text=\\\"Snapshot details \\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr>\\n <td>ID</td>\\n <td>\\n {{ snapshot.Id }}\\n <button class=\\\"btn btn-xs btn-danger\\\" ng-click=\\\"removeSnapshot()\\\"> <i class=\\\"fa fa-trash space-right\\\" aria-hidden=\\\"true\\\"></i>Remove snapshot </button>\\n </td>\\n </tr>\\n <tr>\\n <td>Date</td>\\n <td>{{ snapshot.Date }}</td>\\n </tr>\\n <tr>\\n <td>Description</td>\\n <td>{{ snapshot.Description }}</td>\\n </tr>\\n <tr>\\n <td>SourceID</td>\\n <td>{{ snapshot.SourceID }}</td>\\n </tr>\\n <tr>\\n <td>Type</td>\\n <td>{{ snapshot.Type }}</td>\\n </tr>\\n <tr>\\n <td>Directory</td>\\n <td>{{ snapshot.Directory }}</td>\\n </tr>\\n <tr>\\n <td>Source</td>\\n <td>{{ snapshot.Source }}</td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/integrations/storidge/views/profiles/create/createprofile.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Create profile\\\"></rd-header-title>\\n <rd-header-content> <a ui-sref=\\\"storidge.cluster\\\">Storidge</a> > <a ui-sref=\\\"storidge.profiles\\\">Profiles</a> > Add profile </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-md-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\" name=\\\"storidgeCreateProfileForm\\\">\\n <!-- name-input -->\\n <div class=\\\"form-group\\\" ng-class=\\\"{ 'has-error': storidgeCreateProfileForm.profile_name.$invalid }\\\">\\n <label for=\\\"profile_name\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Name</label>\\n <div class=\\\"col-sm-10 col-lg-11\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"model.Name\\\" name=\\\"profile_name\\\" placeholder=\\\"e.g. myProfile\\\" ng-change=\\\"updatedName()\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"storidgeCreateProfileForm.profile_name.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"storidgeCreateProfileForm.profile_name.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !name-input -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Profile configuration\\n </div>\\n <!-- directory -->\\n <div class=\\\"form-group\\\" ng-class=\\\"{ 'has-error': storidgeCreateProfileForm.profile_directory.$invalid }\\\">\\n <label for=\\\"profile_directory\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Directory</label>\\n <div class=\\\"col-sm-10 col-lg-11\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"model.Directory\\\"\\n name=\\\"profile_directory\\\"\\n placeholder=\\\"e.g. /cio/myProfile\\\"\\n ng-change=\\\"updatedDirectory()\\\"\\n required\\n />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"storidgeCreateProfileForm.profile_directory.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"storidgeCreateProfileForm.profile_directory.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !directory -->\\n <!-- capacity -->\\n <div class=\\\"form-group\\\" ng-class=\\\"{ 'has-error': storidgeCreateProfileForm.profile_capacity.$invalid }\\\">\\n <label for=\\\"profile_capacity\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Capacity</label>\\n <div class=\\\"col-sm-10 col-lg-11\\\">\\n <input type=\\\"number\\\" class=\\\"form-control\\\" ng-model=\\\"model.Capacity\\\" name=\\\"profile_capacity\\\" ng-min=\\\"1\\\" ng-max=\\\"64000\\\" placeholder=\\\"2\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"storidgeCreateProfileForm.profile_capacity.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"storidgeCreateProfileForm.profile_capacity.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n <p ng-message=\\\"min\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Minimum value for capacity: 1.</p>\\n <p ng-message=\\\"max\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Maximum value for capacity: 64000.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !capacity -->\\n <!-- redundancy -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"profile_redundancy\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Redundancy</label>\\n <div class=\\\"col-sm-10 col-lg-11\\\">\\n <select name=\\\"profile_redundancy\\\" ng-model=\\\"model.Redundancy\\\" ng-options=\\\"+(opt.value) as opt.label for opt in RedundancyOptions\\\" class=\\\"form-control\\\"> </select>\\n </div>\\n </div>\\n <!-- !redudancy -->\\n <!-- provisioning -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"profile_provisioning\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Provisioning</label>\\n <div class=\\\"col-sm-10 col-lg-11\\\">\\n <select name=\\\"profile_provisioning\\\" ng-model=\\\"model.Provisioning\\\" class=\\\"form-control\\\">\\n <option value=\\\"thin\\\">Thin</option>\\n <option value=\\\"thick\\\">Thick</option>\\n </select>\\n </div>\\n </div>\\n <!-- !provisioning -->\\n <!-- type -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"profile_type\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Type</label>\\n <div class=\\\"col-sm-10 col-lg-11\\\">\\n <select name=\\\"profile_type\\\" ng-model=\\\"model.Type\\\" class=\\\"form-control\\\">\\n <option value=\\\"ssd\\\">SSD</option>\\n <option value=\\\"hdd\\\">HDD</option>\\n </select>\\n </div>\\n </div>\\n <!-- !type -->\\n <!-- Filesystem -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"profile_filesystem\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Filesystem</label>\\n <div class=\\\"col-sm-10 col-lg-11\\\">\\n <select name=\\\"profile_filesystem\\\" ng-model=\\\"model.Filesystem\\\" class=\\\"form-control\\\">\\n <option value=\\\"btrfs\\\">btrfs</option>\\n <option value=\\\"ext4\\\">ext4</option>\\n <option value=\\\"xfs\\\">xfs</option>\\n </select>\\n </div>\\n </div>\\n <!-- !Filesystem -->\\n <!-- snapshotEnabled -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"profile_snapshotEnabled\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">\\n Enable snapshots\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\"> <input name=\\\"profile_snapshotEnabled\\\" type=\\\"checkbox\\\" ng-model=\\\"model.SnapshotEnabled\\\" /><i></i> </label>\\n </div>\\n <!-- !snapshotEnabled -->\\n <!-- snapshotMax -->\\n <div class=\\\"form-group\\\" ng-if=\\\"model.SnapshotEnabled\\\">\\n <label for=\\\"profile_snapshotMax\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\" style=\\\"margin-top: 20px;\\\">\\n Snapshot max\\n </label>\\n <div class=\\\"col-sm-4\\\">\\n <slider model=\\\"model.SnapshotMax\\\" floor=\\\"1\\\" ceil=\\\"100\\\" step=\\\"1\\\"></slider>\\n </div>\\n <div class=\\\"col-sm-2\\\">\\n <input type=\\\"number\\\" min=\\\"1\\\" class=\\\"form-control\\\" ng-model=\\\"model.SnapshotMax\\\" id=\\\"profile_snapshotMax\\\" />\\n </div>\\n <div class=\\\"col-sm-4\\\">\\n <p class=\\\"small text-muted\\\" style=\\\"margin-top: 7px;\\\">\\n Snapshot max (<b>count</b>)\\n </p>\\n </div>\\n </div>\\n <!-- !snapshotMax -->\\n <!-- snapshotEnabled -->\\n <div class=\\\"form-group\\\" ng-if=\\\"model.SnapshotEnabled\\\">\\n <label for=\\\"profile_recurringSnapshotEnabled\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">\\n Enable periodic snapshots\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\">\\n <input name=\\\"profile_recurringSnapshotEnabled\\\" type=\\\"checkbox\\\" ng-model=\\\"state.RecurringSnapshotEnabled\\\" /><i></i>\\n </label>\\n </div>\\n <!-- !snapshotEnabled -->\\n <!-- snapshotInterval -->\\n <div class=\\\"form-group\\\" ng-if=\\\"model.SnapshotEnabled && state.RecurringSnapshotEnabled\\\">\\n <label for=\\\"profile_snapshotInterval\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\" style=\\\"margin-top: 20px;\\\">\\n Snapshot interval\\n </label>\\n <div class=\\\"col-sm-4\\\">\\n <slider model=\\\"model.SnapshotInterval\\\" floor=\\\"1\\\" ceil=\\\"2880\\\" step=\\\"1\\\"></slider>\\n </div>\\n <div class=\\\"col-sm-2\\\">\\n <input type=\\\"number\\\" min=\\\"1\\\" class=\\\"form-control\\\" ng-model=\\\"model.SnapshotInterval\\\" id=\\\"profile_snapshotInterval\\\" />\\n </div>\\n <div class=\\\"col-sm-4\\\">\\n <p class=\\\"small text-muted\\\" style=\\\"margin-top: 7px;\\\">\\n Snapshot interval (<b>minutes</b>)\\n </p>\\n </div>\\n </div>\\n <!-- !snapshotInterval -->\\n <!-- encryptionEnabled -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"profile_encryptionEnabled\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">\\n Enable encryption\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\"> <input name=\\\"profile_encryptionEnabled\\\" type=\\\"checkbox\\\" ng-model=\\\"model.EncryptionEnabled\\\" /><i></i> </label>\\n </div>\\n <!-- !encryptionEnabled -->\\n <!-- interfaceType -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"profile_interfaceType\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Interface type</label>\\n <div class=\\\"col-sm-10 col-lg-11\\\">\\n <select name=\\\"profile_interfaceType\\\" ng-model=\\\"model.InterfaceType\\\" class=\\\"form-control\\\">\\n <option value=\\\"\\\"></option>\\n <option value=\\\"nfs\\\">nfs</option>\\n </select>\\n </div>\\n </div>\\n <!-- !interfaceType -->\\n <!-- interfaceDriver -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"profile_interfaceDriver\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Network driver</label>\\n <div class=\\\"col-sm-10 col-lg-11\\\">\\n <select name=\\\"profile_interfaceDriver\\\" ng-model=\\\"model.InterfaceDriver\\\" class=\\\"form-control\\\">\\n <option value=\\\"\\\"></option>\\n <option value=\\\"macvlan\\\">macvlan</option>\\n <option value=\\\"overlay\\\">overlay</option>\\n </select>\\n </div>\\n </div>\\n <!-- !interfaceDriver -->\\n <!-- interfaceNetwork -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"profile_interfaceNetwork\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Network name</label>\\n <div class=\\\"col-sm-10 col-lg-11\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"model.InterfaceNetwork\\\" name=\\\"profile_interfaceNetwork\\\" pattern=\\\"[a-zA-Z0-9]+\\\" />\\n </div>\\n </div>\\n <!-- !interfaceNetwork -->\\n <!-- interfaceConf -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"profile_interfaceConf\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Interface conf</label>\\n <div class=\\\"col-sm-10 col-lg-11\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"model.InterfaceConf\\\" name=\\\"profile_interfaceConf\\\" />\\n </div>\\n </div>\\n <!-- !interfaceConf -->\\n <!-- labels -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 5px;\\\">\\n <label class=\\\"control-label text-left\\\">Labels</label>\\n <span class=\\\"label label-default interactive\\\" style=\\\"margin-left: 10px;\\\" ng-click=\\\"addLabel()\\\"> <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add label </span>\\n </div>\\n <!-- labels-input-list -->\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\">\\n <div ng-repeat=\\\"label in formValues.Labels\\\" style=\\\"margin-top: 2px;\\\">\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">name</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"label.name\\\" placeholder=\\\"e.g. com.example.foo\\\" />\\n </div>\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">value</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"label.value\\\" placeholder=\\\"e.g. bar\\\" />\\n </div>\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"removeLabel($index)\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n <!-- !labels-input-list -->\\n </div>\\n <!-- !labels -->\\n <!-- iops -->\\n <div ng-if=\\\"!state.LimitBandwidth || state.NoLimit\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n IOPS\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-md-1 col-sm-2\\\">\\n <label for=\\\"permissions\\\" class=\\\"control-label text-left\\\">\\n Limit IOPS\\n </label>\\n </div>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\">\\n <input type=\\\"checkbox\\\" ng-model=\\\"state.LimitIOPS\\\" ng-change=\\\"state.NoLimit = (!state.LimitBandwidth && !state.LimitIOPS)\\\" /><i></i>\\n </label>\\n </div>\\n <div class=\\\"form-group\\\" ng-if=\\\"state.LimitIOPS\\\">\\n <label for=\\\"min_iops\\\" class=\\\"col-sm-1 control-label text-left\\\">Min</label>\\n <div class=\\\"col-sm-5\\\" ng-class=\\\"{ 'has-error': storidgeCreateProfileForm.min_iops.$invalid }\\\">\\n <input type=\\\"number\\\" class=\\\"form-control\\\" ng-model=\\\"model.MinIOPS\\\" name=\\\"min_iops\\\" ng-min=\\\"30\\\" ng-max=\\\"999999\\\" placeholder=\\\"100\\\" required />\\n </div>\\n <label for=\\\"max_iops\\\" class=\\\"col-sm-1 control-label text-left\\\">Max</label>\\n <div class=\\\"col-sm-5\\\" ng-class=\\\"{ 'has-error': storidgeCreateProfileForm.max_iops.$invalid }\\\">\\n <input type=\\\"number\\\" class=\\\"form-control\\\" ng-model=\\\"model.MaxIOPS\\\" name=\\\"max_iops\\\" ng-min=\\\"30\\\" ng-max=\\\"999999\\\" placeholder=\\\"2000\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"storidgeCreateProfileForm.min_iops.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"storidgeCreateProfileForm.min_iops.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> A value is required for Min IOPS.</p>\\n <p ng-message=\\\"min\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Minimum value for Min IOPS: 30.</p>\\n <p ng-message=\\\"max\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Maximum value for Min IOPS: 999999.</p>\\n </div>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"storidgeCreateProfileForm.max_iops.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"storidgeCreateProfileForm.max_iops.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> A value is required for Max IOPS.</p>\\n <p ng-message=\\\"min\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Minimum value for Max IOPS: 30.</p>\\n <p ng-message=\\\"max\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Maximum value for Max IOPS: 999999.</p>\\n </div>\\n </div>\\n </div>\\n </div>\\n <!-- !iops -->\\n <!-- bandwidth -->\\n <div ng-if=\\\"!state.LimitIOPS || state.NoLimit\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Bandwidth\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-md-1 col-sm-2\\\">\\n <label for=\\\"permissions\\\" class=\\\"control-label text-left\\\">\\n Limit bandwidth\\n </label>\\n </div>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\">\\n <input type=\\\"checkbox\\\" ng-model=\\\"state.LimitBandwidth\\\" ng-change=\\\"state.NoLimit = (!state.LimitBandwidth && !state.LimitIOPS)\\\" /><i></i>\\n </label>\\n </div>\\n <div class=\\\"form-group\\\" ng-if=\\\"state.LimitBandwidth\\\">\\n <label for=\\\"min_bandwidth\\\" class=\\\"col-sm-1 control-label text-left\\\">Min</label>\\n <div class=\\\"col-sm-5\\\" ng-class=\\\"{ 'has-error': storidgeCreateProfileForm.min_bandwidth.$invalid }\\\">\\n <input type=\\\"number\\\" class=\\\"form-control\\\" ng-model=\\\"model.MinBandwidth\\\" name=\\\"min_bandwidth\\\" ng-min=\\\"1\\\" ng-max=\\\"5000\\\" placeholder=\\\"1\\\" required />\\n </div>\\n <label for=\\\"max_bandwidth\\\" class=\\\"col-sm-1 control-label text-left\\\">Max</label>\\n <div class=\\\"col-sm-5\\\" ng-class=\\\"{ 'has-error': storidgeCreateProfileForm.max_bandwidth.$invalid }\\\">\\n <input type=\\\"number\\\" class=\\\"form-control\\\" ng-model=\\\"model.MaxBandwidth\\\" name=\\\"max_bandwidth\\\" ng-min=\\\"1\\\" ng-max=\\\"5000\\\" placeholder=\\\"100\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"storidgeCreateProfileForm.min_bandwidth.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"storidgeCreateProfileForm.min_bandwidth.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> A value is required for Min bandwidth.</p>\\n <p ng-message=\\\"min\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Minimum value for Min bandwidth: 1.</p>\\n <p ng-message=\\\"max\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Maximum value for Min bandwidth: 5000.</p>\\n </div>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"storidgeCreateProfileForm.max_bandwidth.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"storidgeCreateProfileForm.max_bandwidth.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> A value is required for Max bandwidth.</p>\\n <p ng-message=\\\"min\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Minimum value for Max bandwidth: 1.</p>\\n <p ng-message=\\\"max\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Maximum value for Max bandwidth: 5000.</p>\\n </div>\\n </div>\\n </div>\\n </div>\\n <!-- !bandwidth -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-click=\\\"create()\\\"\\n ng-disabled=\\\"state.actionInProgress || !storidgeCreateProfileForm.$valid\\\"\\n button-spinner=\\\"state.actionInProgress\\\"\\n >\\n <span ng-hide=\\\"state.actionInProgress\\\">Create the profile</span>\\n <span ng-show=\\\"state.actionInProgress\\\">Creating profile...</span>\\n </button>\\n </div>\\n </div>\\n <!-- !actions -->\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/integrations/storidge/views/cluster/cluster.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Storidge cluster\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"Refresh\\\" ui-sref=\\\"storidge.cluster\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content>\\n <a ui-sref=\\\"storidge.cluster\\\">Storidge</a>\\n </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-bolt\\\" title-text=\\\"Cluster details\\\"></rd-widget-header>\\n <rd-widget-body>\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr>\\n <td>Domain</td>\\n <td>{{ clusterInfo.Domain }}</td>\\n </tr>\\n <tr>\\n <td>Condition</td>\\n <td\\n ><i class=\\\"fa fa-heartbeat space-right {{ clusterInfo.Condition | storidgeClusterConditionBadge }}\\\"></i>\\n {{ clusterInfo.Condition }}\\n </td>\\n </tr>\\n <tr>\\n <td>Version</td>\\n <td>{{ clusterVersion }}</td>\\n </tr>\\n </tbody>\\n </table>\\n <form class=\\\"form-horizontal\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-danger btn-sm\\\" ng-click=\\\"shutdownCluster()\\\" ng-disabled=\\\"state.shutdownInProgress\\\" button-spinner=\\\"state.shutdownInProgress\\\">\\n <span ng-hide=\\\"state.shutdownInProgress\\\"><i class=\\\"fa fa-power-off space-right\\\" aria-hidden=\\\"true\\\"></i> Shutdown the cluster</span>\\n <span ng-show=\\\"state.shutdownInProgress\\\">Shutting down cluster...</span>\\n </button>\\n <button type=\\\"button\\\" class=\\\"btn btn-danger btn-sm\\\" ng-click=\\\"rebootCluster()\\\" ng-disabled=\\\"state.rebootInProgress\\\" button-spinner=\\\"state.shutdownInProgress\\\">\\n <span ng-hide=\\\"state.rebootInProgress\\\"><i class=\\\"fa fa-sync space-right\\\" aria-hidden=\\\"true\\\"></i> Reboot the cluster</span>\\n <span ng-show=\\\"state.rebootInProgress\\\">Rebooting cluster...</span>\\n </button>\\n </div>\\n </div>\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <storidge-nodes-datatable title-text=\\\"Storage nodes\\\" title-icon=\\\"fa-object-group\\\" dataset=\\\"clusterNodes\\\" table-key=\\\"storidge_nodes\\\" order-by=\\\"Name\\\"></storidge-nodes-datatable>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/integrations/storidge/views/nodes/inspect/node.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Node details\\\"></rd-header-title>\\n <rd-header-content>\\n <a ui-sref=\\\"storidge.cluster\\\">Storidge</a> > <a ui-sref=\\\"storidge.cluster.node({id: node.Name})\\\">{{ node.Name }}</a>\\n </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-object-group\\\" title-text=\\\"Node details\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-danger\\\" ng-disabled=\\\"(node.Status | lowercase) !== 'normal'\\\" ng-click=\\\"removeNodeAction()\\\">\\n <i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Remove node\\n </button>\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ng-disabled=\\\"(node.Status | lowercase) !== 'normal'\\\" ng-click=\\\"cordonNodeAction()\\\">\\n <i class=\\\"fas fa-wrench space-right\\\" aria-hidden=\\\"true\\\"></i>Enter maintenance mode\\n </button>\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ng-disabled=\\\"(node.Status | lowercase) !== 'cordoned'\\\" ng-click=\\\"uncordonNodeAction()\\\">\\n <i class=\\\"fa fa-power-off space-right\\\" aria-hidden=\\\"true\\\"></i>Exit maintenance mode\\n </button>\\n </rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table description-table\\\">\\n <tbody>\\n <tr>\\n <td>Name</td>\\n <td>{{ node.Name }}</td>\\n </tr>\\n <tr>\\n <td>Domain</td>\\n <td>{{ node.Domain }}</td>\\n </tr>\\n <tr>\\n <td>Domain ID</td>\\n <td>{{ node.DomainID }}</td>\\n </tr>\\n <tr>\\n <td>Node status</td>\\n <td>\\n <i class=\\\"fa fa-heartbeat space-right {{ node.Status | storidgeNodeStatusBadge }}\\\"></i>\\n {{ node.Status }}\\n </td>\\n </tr>\\n <tr>\\n <td>Operating condition</td>\\n <td>\\n <i class=\\\"fa fa-heartbeat space-right {{ node.Condition | storidgeClusterConditionBadge }}\\\"></i>\\n {{ node.Condition }}\\n </td>\\n </tr>\\n <tr>\\n <td>Metadata version</td>\\n <td>{{ node.MetadataVersion }}</td>\\n </tr>\\n <tr>\\n <td>Nodes</td>\\n <td>{{ node.Nodes }}</td>\\n </tr>\\n <tr>\\n <td>HDDs</td>\\n <td>{{ node.Hdds }}</td>\\n </tr>\\n <tr>\\n <td>SSDs</td>\\n <td>{{ node.Ssds }}</td>\\n </tr>\\n <tr>\\n <td>VDisks</td>\\n <td>{{ node.Vdisks }}</td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-object-group\\\" title-text=\\\"Bandwidth details\\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table description-table\\\">\\n <tbody>\\n <tr>\\n <td>Free</td>\\n <td>{{ node.FreeBandwidth }}</td>\\n </tr>\\n <tr>\\n <td>Used</td>\\n <td>{{ node.UsedBandwidth }}</td>\\n </tr>\\n <tr>\\n <td>Provisioned</td>\\n <td>{{ node.ProvisionedBandwidth }}</td>\\n </tr>\\n <tr>\\n <td>Total</td>\\n <td>{{ node.TotalBandwidth }}</td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-object-group\\\" title-text=\\\"Capacity details\\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table description-table\\\">\\n <tbody>\\n <tr>\\n <td>Free</td>\\n <td>{{ node.FreeCapacity | bytes }}</td>\\n </tr>\\n <tr>\\n <td>Used</td>\\n <td>{{ node.UsedCapacity | bytes }}</td>\\n </tr>\\n <tr>\\n <td>Provisioned</td>\\n <td>{{ node.ProvisionedCapacity | bytes }}</td>\\n </tr>\\n <tr>\\n <td>Total</td>\\n <td>{{ node.TotalCapacity | bytes }}</td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-object-group\\\" title-text=\\\"IOPS details\\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table description-table\\\">\\n <tbody>\\n <tr>\\n <td>Free</td>\\n <td>{{ node.FreeIOPS }}</td>\\n </tr>\\n <tr>\\n <td>Used</td>\\n <td>{{ node.UsedIOPS }}</td>\\n </tr>\\n <tr>\\n <td>Provisioned</td>\\n <td>{{ node.ProvisionedIOPS }}</td>\\n </tr>\\n <tr>\\n <td>Total</td>\\n <td>{{ node.TotalIOPS }}</td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/integrations/storidge/views/monitor/monitor.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Storidge monitor\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"Refresh\\\" ui-sref=\\\"storidge.monitor\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content> <a ui-sref=\\\"storidge.cluster\\\">Storidge</a> > <a ui-sref=\\\"storidge.monitor\\\">Cluster monitoring</a> </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-md-4 col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-tachometer-alt\\\" title-text=\\\"Cluster capacity\\\"></rd-widget-header>\\n <rd-widget-body>\\n <div class=\\\"chart-container\\\" style=\\\"position: relative;\\\">\\n <canvas id=\\\"capacityChart\\\" width=\\\"770\\\" height=\\\"400\\\"></canvas>\\n </div>\\n <div style=\\\"margin-top: 10px;\\\" ng-if=\\\"info\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr>\\n <td>Capacity available</td>\\n <td>{{ ((info.FreeCapacity * 100) / info.TotalCapacity).toFixed(1) }}%</td>\\n </tr>\\n <tr>\\n <td>Provisioned capacity</td>\\n <td>\\n {{ info.ProvisionedCapacity | humansize }}\\n <span ng-if=\\\"+info.ProvisionedCapacity >= +info.TotalCapacity\\\">\\n <i class=\\\"fa fa-exclamation-triangle red-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-left: 2px;\\\"></i>\\n </span>\\n </td>\\n </tr>\\n <tr>\\n <td>Total capacity</td>\\n <td>{{ info.TotalCapacity | humansize }}</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n <div class=\\\"col-md-4 col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-chart-area\\\" title-text=\\\"IOPS usage\\\"></rd-widget-header>\\n <rd-widget-body>\\n <div class=\\\"chart-container\\\" style=\\\"position: relative;\\\">\\n <canvas id=\\\"iopsChart\\\" width=\\\"770\\\" height=\\\"400\\\"></canvas>\\n </div>\\n <div style=\\\"margin-top: 10px;\\\" ng-if=\\\"info\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr>\\n <td>IOPS available</td>\\n <td>{{ ((info.FreeIOPS * 100) / info.TotalIOPS).toFixed(1) }}%</td>\\n </tr>\\n <tr>\\n <td>Provisioned IOPS</td>\\n <td>\\n {{ info.ProvisionedIOPS | number }}\\n <span ng-if=\\\"+info.ProvisionedIOPS >= +info.TotalIOPS\\\">\\n <i class=\\\"fa fa-exclamation-triangle red-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-left: 2px;\\\"></i>\\n </span>\\n </td>\\n </tr>\\n <tr>\\n <td>Total IOPS</td>\\n <td>{{ info.TotalIOPS | number }}</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n <div class=\\\"col-md-4 col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-chart-area\\\" title-text=\\\"Bandwith usage\\\"></rd-widget-header>\\n <rd-widget-body>\\n <div class=\\\"chart-container\\\" style=\\\"position: relative;\\\">\\n <canvas id=\\\"bandwithChart\\\" width=\\\"770\\\" height=\\\"400\\\"></canvas>\\n </div>\\n <div style=\\\"margin-top: 10px;\\\" ng-if=\\\"info\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr>\\n <td>Bandwidth available</td>\\n <td>{{ ((info.FreeBandwidth * 100) / info.TotalBandwidth).toFixed(1) }}%</td>\\n </tr>\\n <tr>\\n <td>Provisioned bandwidth</td>\\n <td>\\n {{ info.ProvisionedBandwidth | humansize }}\\n <span ng-if=\\\"+info.ProvisionedBandwidth >= +info.TotalBandwidth\\\">\\n <i class=\\\"fa fa-exclamation-triangle red-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-left: 2px;\\\"></i>\\n </span>\\n </td>\\n </tr>\\n <tr>\\n <td>Total bandwidth</td>\\n <td>{{ info.TotalBandwidth | humansize }} /s</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <storidge-cluster-events-datatable\\n title-text=\\\"Cluster events\\\"\\n title-icon=\\\"fa-history\\\"\\n dataset=\\\"events\\\"\\n table-key=\\\"storidge_cluster_events\\\"\\n order-by=\\\"Time\\\"\\n reverse-order=\\\"true\\\"\\n ></storidge-cluster-events-datatable>\\n </div>\\n</div>\\n\\n<!-- <div class=\\\"row\\\">\\n <div class=\\\"col-md-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-history\\\" title-text=\\\"Cluster events\\\">\\n <div class=\\\"pull-right\\\">\\n Items per page:\\n <select ng-model=\\\"state.pagination_count\\\" ng-change=\\\"changePaginationCount()\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </div>\\n </rd-widget-header>\\n <rd-widget-taskbar classes=\\\"col-lg-12\\\">\\n <div class=\\\"pull-right\\\">\\n <input type=\\\"text\\\" id=\\\"filter\\\" ng-model=\\\"state.filter\\\" placeholder=\\\"Filter...\\\" class=\\\"form-control input-sm\\\" />\\n </div>\\n </rd-widget-taskbar>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover\\\">\\n <thead>\\n <tr>\\n <th>\\n <a ng-click=\\\"order('Time')\\\">\\n Date\\n <span ng-show=\\\"sortType == 'Time' && !sortReverse\\\" class=\\\"glyphicon glyphicon-chevron-down\\\"></span>\\n <span ng-show=\\\"sortType == 'Time' && sortReverse\\\" class=\\\"glyphicon glyphicon-chevron-up\\\"></span>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"order('Category')\\\">\\n Category\\n <span ng-show=\\\"sortType == 'Category' && !sortReverse\\\" class=\\\"glyphicon glyphicon-chevron-down\\\"></span>\\n <span ng-show=\\\"sortType == 'Category' && sortReverse\\\" class=\\\"glyphicon glyphicon-chevron-up\\\"></span>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"order('Module')\\\">\\n Module\\n <span ng-show=\\\"sortType == 'Module' && !sortReverse\\\" class=\\\"glyphicon glyphicon-chevron-down\\\"></span>\\n <span ng-show=\\\"sortType == 'Module' && sortReverse\\\" class=\\\"glyphicon glyphicon-chevron-up\\\"></span>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"order('Content')\\\">\\n Content\\n <span ng-show=\\\"sortType == 'Content' && !sortReverse\\\" class=\\\"glyphicon glyphicon-chevron-down\\\"></span>\\n <span ng-show=\\\"sortType == 'Content' && sortReverse\\\" class=\\\"glyphicon glyphicon-chevron-up\\\"></span>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr dir-paginate=\\\"event in (events | filter:state.filter | orderBy:sortType:sortReverse | itemsPerPage: state.pagination_count)\\\">\\n <td>{{ event.Time }}</td>\\n <td>{{ event.Category }}</td>\\n <td>{{ event.Module }}</td>\\n <td>{{ event.Content }}</td>\\n </tr>\\n <tr ng-if=\\\"!events\\\">\\n <td colspan=\\\"4\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"events.length === 0\\\">\\n <td colspan=\\\"4\\\" class=\\\"text-center text-muted\\\">No events available.</td>\\n </tr>\\n </tbody>\\n </table>\\n <div ng-if=\\\"events\\\" class=\\\"pull-left pagination-controls\\\">\\n <dir-pagination-controls></dir-pagination-controls>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div> -->\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./storidgeClusterEventsDatatable.html');\n\nangular.module('portainer.integrations.storidge').component('storidgeClusterEventsDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'GenericDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n },\n});\n","var path = 'app/integrations/storidge/components/cluster-events-datatable/storidgeClusterEventsDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n auto-focus\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover\\\">\\n <thead>\\n <tr>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Time')\\\">\\n Date\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Time' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Time' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Category')\\\">\\n Category\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Category' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Category' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Module')\\\">\\n Module\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Module' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Module' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Content')\\\">\\n Content\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Content' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Content' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit))\\\"\\n ng-class=\\\"{ active: item.Checked }\\\"\\n >\\n <td>{{ item.Time }}</td>\\n <td>{{ item.Category }}</td>\\n <td>{{ item.Module }}</td>\\n <td>{{ item.Content }}</td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"4\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"4\\\" class=\\\"text-center text-muted\\\">No events available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./storidgeDrivesDatatable.html');\n\nangular.module('portainer.integrations.storidge').component('storidgeDrivesDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'StoridgeDrivesDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n removeAction: '<',\n addAction: '<',\n rescanAction: '<',\n actionInProgress: '<',\n additionInProgress: '<',\n },\n});\n","var path = 'app/integrations/storidge/components/drives-datatable/storidgeDrivesDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n </div>\\n <div class=\\\"actionBar\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ng-click=\\\"$ctrl.rescanAction()\\\"> <i class=\\\"fa fa-sync space-right\\\" aria-hidden=\\\"true\\\"></i>Rescan drives </button>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n auto-focus\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover\\\">\\n <thead>\\n <tr>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Id')\\\">\\n Id\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Id' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Id' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Node')\\\">\\n Node\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Node' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Node' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Device')\\\">\\n Device\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Device' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Device' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Size')\\\">\\n Size\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Size' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Size' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Use')\\\">\\n Use\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Use' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Use' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Type')\\\">\\n Type\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Type' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Type' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Status')\\\">\\n Status\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Status' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Status' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n Actions\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit))\\\"\\n ng-class=\\\"{ active: item.Checked }\\\"\\n >\\n <td>\\n <a ui-sref=\\\"storidge.drives.drive({id: item.Id})\\\"> {{ item.Id }}</a>\\n </td>\\n <td>{{ item.Node }}</td>\\n <td>{{ item.Device }}</td>\\n <td>{{ item.Size }}</td>\\n <td>{{ item.Use }}</td>\\n <td>{{ item.Type }}</td>\\n <td>\\n <span class=\\\"label label-{{ item.Status | drivestatusbadge }}\\\">{{ item.Status | capitalize }}</span>\\n </td>\\n <td>\\n <button\\n ng-if=\\\"item.Status === 'available'\\\"\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-primary btn-datatable\\\"\\n ng-click=\\\"$ctrl.addAction(item, $index)\\\"\\n button-spinner=\\\"$ctrl.additionInProgress[$index]\\\"\\n ng-disabled=\\\"$ctrl.actionInProgress\\\"\\n >\\n <span ng-hide=\\\"$ctrl.additionInProgress[$index]\\\"><i class=\\\"fa fa-plus space-right\\\" aria-hidden=\\\"true\\\"></i>Add to storage pool</span>\\n <span ng-show=\\\"$ctrl.additionInProgress[$index]\\\">Addition in progress...</span>\\n </button>\\n </td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"7\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td class=\\\"text-center text-muted\\\">No drives available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","angular.module('portainer.docker').controller('StoridgeDrivesDatatableController', [\n '$scope',\n '$controller',\n 'DatatableService',\n function ($scope, $controller, DatatableService) {\n angular.extend(this, $controller('GenericDatatableController', { $scope: $scope }));\n\n this.allowSelection = function (item) {\n return item.Status !== 'normal';\n };\n\n this.$onInit = function () {\n this.setDefaults();\n this.prepareTableFromDataset();\n\n this.state.orderBy = this.orderBy;\n var storedOrder = DatatableService.getDataTableOrder(this.tableKey);\n if (storedOrder !== null) {\n this.state.reverseOrder = storedOrder.reverse;\n this.state.orderBy = storedOrder.orderBy;\n }\n\n var textFilter = DatatableService.getDataTableTextFilters(this.tableKey);\n if (textFilter !== null) {\n this.state.textFilter = textFilter;\n this.onTextFilterChange();\n }\n\n var storedFilters = DatatableService.getDataTableFilters(this.tableKey);\n if (storedFilters !== null) {\n this.filters = storedFilters;\n }\n if (this.filters && this.filters.state) {\n this.filters.state.open = false;\n }\n\n var storedSettings = DatatableService.getDataTableSettings(this.tableKey);\n if (storedSettings !== null) {\n this.settings = storedSettings;\n this.settings.open = false;\n }\n this.onSettingsRepeaterChange();\n };\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./storidgeNodesDatatable.html');\n\nangular.module('portainer.integrations.storidge').component('storidgeNodesDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'StoridgeNodesDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n },\n});\n","var path = 'app/integrations/storidge/components/nodes-datatable/storidgeNodesDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n </div>\\n <div class=\\\"actionBar\\\">\\n <div class=\\\"row\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ng-click=\\\"$ctrl.addNodeAction()\\\"> <i class=\\\"fa fa-plus space-right\\\" aria-hidden=\\\"true\\\"></i>Add node </button>\\n <div style=\\\"margin-bottom: 0px;\\\">\\n <span ng-if=\\\"$ctrl.addInfo\\\" class=\\\"text-muted small\\\">\\n To add a node to this cluster, run the following command on your new node\\n <code>\\n {{ $ctrl.addInfo }}\\n </code>\\n <span class=\\\"btn btn-primary btn-sm space-left\\\" ng-click=\\\"$ctrl.copyAddNodeCommand()\\\"><i class=\\\"fa fa-copy space-right\\\" aria-hidden=\\\"true\\\"></i>Copy</span>\\n <span>\\n <i id=\\\"copyNotification\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-left: 7px; display: none;\\\"></i>\\n </span>\\n </span>\\n </div>\\n </div>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n auto-focus\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover\\\">\\n <thead>\\n <tr>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Name')\\\">\\n Name\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('IP')\\\">\\n IP Address\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'IP' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'IP' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Role')\\\">\\n Role\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Role' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Role' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Status')\\\">\\n Status\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Status' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Status' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit))\\\"\\n ng-class=\\\"{ active: item.Checked }\\\"\\n >\\n <td>\\n <a ui-sref=\\\"storidge.cluster.node({name: item.Name})\\\"> {{ item.Name }}</a>\\n </td>\\n <td>{{ item.IP }}</td>\\n <td>{{ item.Role }}</td>\\n <td>\\n <i class=\\\"fa fa-heartbeat space-right {{ item.Status | storidgeNodeStatusBadge }}\\\"></i>\\n {{ item.Status }}\\n </td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"4\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"4\\\" class=\\\"text-center text-muted\\\">No nodes available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","angular.module('portainer.integrations.storidge').controller('StoridgeNodesDatatableController', [\n '$scope',\n '$controller',\n 'clipboard',\n 'Notifications',\n 'StoridgeNodeService',\n 'DatatableService',\n function ($scope, $controller, clipboard, Notifications, StoridgeNodeService, DatatableService) {\n angular.extend(this, $controller('GenericDatatableController', { $scope: $scope }));\n\n var ctrl = this;\n\n this.addNodeAction = function () {\n StoridgeNodeService.add()\n .then(function sucess(data) {\n ctrl.addInfo = data.content;\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve the \"add node\" command');\n });\n };\n\n this.copyAddNodeCommand = function () {\n clipboard.copyText(ctrl.addInfo);\n $('#copyNotification').show();\n $('#copyNotification').fadeOut(2000);\n };\n\n this.$onInit = function () {\n this.setDefaults();\n this.prepareTableFromDataset();\n\n this.state.orderBy = this.orderBy;\n var storedOrder = DatatableService.getDataTableOrder(this.tableKey);\n if (storedOrder !== null) {\n this.state.reverseOrder = storedOrder.reverse;\n this.state.orderBy = storedOrder.orderBy;\n }\n\n var textFilter = DatatableService.getDataTableTextFilters(this.tableKey);\n if (textFilter !== null) {\n this.state.textFilter = textFilter;\n this.onTextFilterChange();\n }\n\n var storedFilters = DatatableService.getDataTableFilters(this.tableKey);\n if (storedFilters !== null) {\n this.filters = storedFilters;\n }\n if (this.filters && this.filters.state) {\n this.filters.state.open = false;\n }\n\n var storedSettings = DatatableService.getDataTableSettings(this.tableKey);\n if (storedSettings !== null) {\n this.settings = storedSettings;\n this.settings.open = false;\n }\n this.onSettingsRepeaterChange();\n };\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./storidgeProfileSelector.html');\n\nangular.module('portainer.integrations.storidge').component('storidgeProfileSelector', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'StoridgeProfileSelectorController',\n bindings: {\n storidgeProfile: '=',\n },\n});\n","var path = 'app/integrations/storidge/components/profileSelector/storidgeProfileSelector.html';\nvar html = \"<div class=\\\"form-group\\\">\\n <label for=\\\"storidge_profile\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Profile</label>\\n <div class=\\\"col-sm-10 col-lg-11\\\">\\n <select id=\\\"storidge_profile\\\" ng-model=\\\"$ctrl.storidgeProfile\\\" ng-options=\\\"profile.Name for profile in $ctrl.profiles\\\" class=\\\"form-control\\\">\\n <option selected disabled hidden value=\\\"\\\">Select a profile</option>\\n </select>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","angular.module('portainer.integrations.storidge').controller('StoridgeProfileSelectorController', [\n 'StoridgeProfileService',\n 'Notifications',\n function (StoridgeProfileService, Notifications) {\n var ctrl = this;\n\n this.$onInit = $onInit;\n function $onInit() {\n StoridgeProfileService.profiles()\n .then(function success(data) {\n ctrl.profiles = data;\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve Storidge profiles');\n });\n }\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./storidgeProfilesDatatable.html');\n\nangular.module('portainer.integrations.storidge').component('storidgeProfilesDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'GenericDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n removeAction: '<',\n },\n});\n","var path = 'app/integrations/storidge/components/profiles-datatable/storidgeProfilesDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n </div>\\n <div class=\\\"actionBar\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-danger\\\" ng-disabled=\\\"$ctrl.state.selectedItemCount === 0\\\" ng-click=\\\"$ctrl.removeAction($ctrl.state.selectedItems)\\\">\\n <i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Remove\\n </button>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n auto-focus\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover\\\">\\n <thead>\\n <tr>\\n <th>\\n <span class=\\\"md-checkbox\\\">\\n <input id=\\\"select_all\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.state.selectAll\\\" ng-change=\\\"$ctrl.selectAll()\\\" />\\n <label for=\\\"select_all\\\"></label>\\n </span>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Name')\\\">\\n Name\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit))\\\"\\n ng-class=\\\"{ active: item.Checked }\\\"\\n >\\n <td>\\n <span class=\\\"md-checkbox\\\">\\n <input id=\\\"select_{{ $index }}\\\" type=\\\"checkbox\\\" ng-model=\\\"item.Checked\\\" ng-click=\\\"$ctrl.selectItem(item, $event)\\\" />\\n <label for=\\\"select_{{ $index }}\\\"></label>\\n </span>\\n <a ui-sref=\\\"storidge.profiles.profile({id: item.Name})\\\">{{ item.Name }}</a>\\n </td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td class=\\\"text-center text-muted\\\">No profile available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./storidgeSnapshotCreation.html');\n\nangular.module('portainer.docker').component('storidgeSnapshotCreation', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'StoridgeSnapshotCreationController',\n bindings: {\n volumeId: '<',\n },\n});\n","var path = 'app/integrations/storidge/components/snapshot-creation/storidgeSnapshotCreation.html';\nvar html = \"<rd-widget>\\n <rd-widget-header icon=\\\"fa-plus\\\" title-text=\\\"Create snapshot\\\"> </rd-widget-header>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\">\\n <div class=\\\"form-group\\\">\\n <label for=\\\"description\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Description</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"description\\\" ng-model=\\\"$ctrl.formValues.Description\\\" />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"$ctrl.state.actionInProgress\\\"\\n ng-click=\\\"$ctrl.createSnapshot()\\\"\\n button-spinner=\\\"$ctrl.state.actionInProgress\\\"\\n >\\n <span ng-hide=\\\"$ctrl.state.actionInProgress\\\">Create snapshot</span>\\n <span ng-show=\\\"$ctrl.state.actionInProgress\\\">Creating snapshot...</span>\\n </button>\\n </div>\\n </div>\\n </form>\\n </rd-widget-body>\\n</rd-widget>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","angular.module('portainer.docker').controller('StoridgeSnapshotCreationController', [\n 'StoridgeSnapshotService',\n 'Notifications',\n '$state',\n function (StoridgeSnapshotService, Notifications, $state) {\n var ctrl = this;\n\n this.formValues = {};\n this.state = {\n actionInProgress: false,\n };\n\n this.createSnapshot = function () {\n ctrl.state.actionInProgress = true;\n StoridgeSnapshotService.create(ctrl.volumeId, ctrl.formValues.Description)\n .then(function success() {\n Notifications.success('Success', 'Snapshot successfully created');\n $state.reload();\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to create snapshot');\n })\n .finally(function final() {\n ctrl.state.actionInProgress = false;\n });\n };\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./storidgeSnapshotsDatatable.html');\n\nangular.module('portainer.integrations.storidge').component('storidgeSnapshotsDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'GenericDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n removeAction: '<',\n },\n});\n","var path = 'app/integrations/storidge/components/snapshots-datatable/storidgeSnapshotsDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n </div>\\n <div class=\\\"actionBar\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-danger\\\" ng-disabled=\\\"$ctrl.state.selectedItemCount === 0\\\" ng-click=\\\"$ctrl.removeAction($ctrl.state.selectedItems)\\\">\\n <i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Remove\\n </button>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover\\\">\\n <thead>\\n <tr>\\n <th>\\n <span class=\\\"md-checkbox\\\">\\n <input id=\\\"select_all\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.state.selectAll\\\" ng-change=\\\"$ctrl.selectAll()\\\" />\\n <label for=\\\"select_all\\\"></label>\\n </span>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Id')\\\">\\n Id\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Id' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Id' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Date')\\\">\\n Date\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Date' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Date' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Description')\\\">\\n Description\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Description' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Description' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit))\\\"\\n ng-class=\\\"{ active: item.Checked }\\\"\\n >\\n <td>\\n <span class=\\\"md-checkbox\\\">\\n <input id=\\\"select_{{ $index }}\\\" type=\\\"checkbox\\\" ng-model=\\\"item.Checked\\\" ng-click=\\\"$ctrl.selectItem(item, $event)\\\" ng-disabled=\\\"item.Status === 'normal'\\\" />\\n <label for=\\\"select_{{ $index }}\\\"></label>\\n </span>\\n <a ui-sref=\\\"docker.volumes.volume.snapshot({snapshotId: item.Id})\\\"> {{ item.Id }}</a>\\n </td>\\n <td>{{ item.Date }}</td>\\n <td>{{ item.Description }}</td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"7\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"3\\\" class=\\\"text-center text-muted\\\">No snapshots available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./volumeStoridgeInfo.html');\n\nangular.module('portainer.docker').component('volumeStoridgeInfo', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'VolumeStoridgeInfoController',\n bindings: {\n volume: '<',\n },\n});\n","var path = 'app/integrations/storidge/components/volume-storidge-info/volumeStoridgeInfo.html';\nvar html = \"<rd-widget>\\n <rd-widget-header icon=\\\"fa-cube\\\" title-text=\\\"Storidge details\\\">\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-primary btn-sm\\\" ng-click=\\\"$ctrl.updateVolume()\\\" ng-if=\\\"!$ctrl.state.updateInProgress\\\">\\n <span>Update the volume</span>\\n </button>\\n <button type=\\\"button\\\" class=\\\"btn btn-primary btn-sm\\\" ng-click=\\\"$ctrl.confirmUpdate()\\\" ng-if=\\\"$ctrl.state.updateInProgress\\\" button-spinner=\\\"$ctrl.state.isUpdating\\\">\\n <span ng-hide=\\\"$ctrl.state.isUpdating\\\">Confirm</span>\\n <span ng-show=\\\"$ctrl.state.isUpdating\\\">Updating the volume...</span>\\n </button>\\n <button type=\\\"button\\\" class=\\\"btn btn-danger btn-sm\\\" ng-click=\\\"$ctrl.cancelUpdate()\\\" ng-if=\\\"$ctrl.state.updateInProgress\\\" ng-disabled=\\\"$ctrl.state.isUpdating\\\">\\n <span>Cancel</span>\\n </button>\\n </div>\\n </div>\\n </rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\" ng-if=\\\"!$ctrl.state.updateInProgress\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr>\\n <td>Name</td>\\n <td>{{ $ctrl.volume.Name }}</td>\\n </tr>\\n <tr>\\n <td>UUID</td>\\n <td>{{ $ctrl.volume.Uuid }}</td>\\n </tr>\\n <tr>\\n <td>Node</td>\\n <td>{{ $ctrl.volume.Node }}</td>\\n </tr>\\n <tr>\\n <td>Node ID</td>\\n <td>{{ $ctrl.volume.NodeID }}</td>\\n </tr>\\n <tr>\\n <td>Directory</td>\\n <td>{{ $ctrl.volume.Directory }}</td>\\n </tr>\\n <tr>\\n <td>Capacity</td>\\n <td>{{ $ctrl.volume.Capacity }}</td>\\n </tr>\\n <tr>\\n <td>Allocated</td>\\n <td>{{ $ctrl.volume.Allocated }}</td>\\n </tr>\\n <tr>\\n <td>IOPS Min</td>\\n <td>{{ $ctrl.volume.IOPSMin }}</td>\\n </tr>\\n <tr>\\n <td>IOPS Max</td>\\n <td>{{ $ctrl.volume.IOPSMax }}</td>\\n </tr>\\n <tr>\\n <td>Bandwidth Min</td>\\n <td>{{ $ctrl.volume.BandwidthMin }}</td>\\n </tr>\\n <tr>\\n <td>Bandwidth Max</td>\\n <td>{{ $ctrl.volume.BandwidthMax }}</td>\\n </tr>\\n <tr>\\n <td>Local Drive Only</td>\\n <td>{{ $ctrl.volume.LocalDriveOnly }}</td>\\n </tr>\\n <tr>\\n <td>Provisioning</td>\\n <td>{{ $ctrl.volume.Provisioning }}</td>\\n </tr>\\n <tr>\\n <td>Redundancy</td>\\n <td>{{ $ctrl.volume.Redundancy }}</td>\\n </tr>\\n <tr>\\n <td>Vdisk</td>\\n <td>{{ $ctrl.volume.Vdisk }}</td>\\n </tr>\\n <tr>\\n <td>IP</td>\\n <td>{{ $ctrl.volume.IP }}</td>\\n </tr>\\n <tr>\\n <td>Drive Type</td>\\n <td>{{ $ctrl.volume.DriveType }}</td>\\n </tr>\\n <tr>\\n <td>Encryption</td>\\n <td>{{ $ctrl.volume.Encryption }}</td>\\n </tr>\\n <tr>\\n <td>Snapshot Enabled</td>\\n <td>{{ $ctrl.volume.SnapshotEnabled }}</td>\\n </tr>\\n <tr>\\n <td>Snapshot Interval</td>\\n <td>{{ $ctrl.volume.SnapshotInterval }} minute(s)</td>\\n </tr>\\n <tr>\\n <td>Max Snapshots</td>\\n <td>{{ $ctrl.volume.SnapshotMax }}</td>\\n </tr>\\n <tr>\\n <td>Filesystem</td>\\n <td>{{ $ctrl.volume.Filesystem }}</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.volume.Labels\\\">\\n <td>Labels</td>\\n <td>\\n <table class=\\\"table table-bordered table-condensed\\\">\\n <tr ng-repeat=\\\"var in $ctrl.volume.Labels\\\">\\n <td>{{ var|key: '=' }}</td>\\n <td>{{ var|value: '=' }}</td>\\n </tr>\\n </table>\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n <rd-widget-body ng-if=\\\"$ctrl.state.updateInProgress\\\">\\n <form class=\\\"form-horizontal\\\" name=\\\"storidgeUpdateVolumeForm\\\">\\n <!-- Node -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"volume_node\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Node</label>\\n <div class=\\\"col-sm-10 col-lg-11\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"$ctrl.formValues.Node\\\" name=\\\"volume_node\\\" placeholder=\\\"2\\\" />\\n </div>\\n </div>\\n <!-- !Node -->\\n <!-- Capacity -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"volume_capacity\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Capacity</label>\\n <div class=\\\"col-sm-10 col-lg-11\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"$ctrl.formValues.Capacity\\\" name=\\\"volume_capacity\\\" placeholder=\\\"2\\\" />\\n </div>\\n </div>\\n <!-- !Capacity -->\\n <!-- IOPS -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"min_iops\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Min IOPS</label>\\n <div class=\\\"col-sm-10 col-lg-11\\\">\\n <input type=\\\"number\\\" class=\\\"form-control\\\" ng-model=\\\"$ctrl.formValues.IOPSMin\\\" name=\\\"min_iops\\\" placeholder=\\\"100\\\" />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\">\\n <label for=\\\"max_iops\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Max IOPS</label>\\n <div class=\\\"col-sm-10 col-lg-11\\\">\\n <input type=\\\"number\\\" class=\\\"form-control\\\" ng-model=\\\"$ctrl.formValues.IOPSMax\\\" name=\\\"max_iops\\\" placeholder=\\\"2000\\\" />\\n </div>\\n </div>\\n <!-- !IOPS -->\\n <!-- Bandwidth -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"min_bandwidth\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Min Bandwidth</label>\\n <div class=\\\"col-sm-10 col-lg-11\\\">\\n <input type=\\\"number\\\" class=\\\"form-control\\\" ng-model=\\\"$ctrl.formValues.BandwidthMin\\\" name=\\\"min_bandwidth\\\" placeholder=\\\"100\\\" />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\">\\n <label for=\\\"max_bandwidth\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Max Bandwidth</label>\\n <div class=\\\"col-sm-10 col-lg-11\\\">\\n <input type=\\\"number\\\" class=\\\"form-control\\\" ng-model=\\\"$ctrl.formValues.BandwidthMax\\\" name=\\\"max_bandwidth\\\" placeholder=\\\"2000\\\" />\\n </div>\\n </div>\\n <!-- !Bandwidth -->\\n <!-- labels -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 5px;\\\">\\n <label class=\\\"control-label text-left\\\">Labels</label>\\n <span class=\\\"label label-default interactive\\\" style=\\\"margin-left: 10px;\\\" ng-click=\\\"$ctrl.addLabel()\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add label\\n </span>\\n </div>\\n <!-- labels-input-list -->\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\">\\n <div ng-repeat=\\\"label in $ctrl.formValues.Labels\\\" style=\\\"margin-top: 2px;\\\">\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">name</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"label.name\\\" placeholder=\\\"e.g. com.example.foo\\\" />\\n </div>\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">value</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"label.value\\\" placeholder=\\\"e.g. bar\\\" />\\n </div>\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"$ctrl.removeLabel($index)\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n <!-- !labels-input-list -->\\n </div>\\n <!-- !labels -->\\n </form>\\n </rd-widget-body>\\n</rd-widget>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","angular.module('portainer.docker').controller('VolumeStoridgeInfoController', [\n '$state',\n 'StoridgeVolumeService',\n 'Notifications',\n function ($state, StoridgeVolumeService, Notifications) {\n var ctrl = this;\n\n this.state = {\n updateInProgress: false,\n isUpdating: false,\n };\n\n this.addLabel = function () {\n this.formValues.Labels.push({ name: '', value: '' });\n };\n\n this.removeLabel = function (index) {\n this.formValues.Labels.splice(index, 1);\n };\n\n this.initLabels = function () {\n var labels = this.volume.Labels;\n if (labels) {\n this.formValues.Labels = Object.keys(labels).map(function (key) {\n return { name: key, value: labels[key] };\n });\n }\n };\n\n this.updateVolume = function () {\n this.state.updateInProgress = true;\n this.formValues = {\n IOPSMin: this.volume.IOPSMin,\n IOPSMax: this.volume.IOPSMax,\n Node: this.volume.Node,\n Capacity: this.volume.Capacity,\n BandwidthMin: this.volume.BandwidthMin,\n BandwidthMax: this.volume.BandwidthMax,\n Labels: [],\n };\n this.initLabels();\n };\n\n this.cancelUpdate = function () {\n this.state.updateInProgress = false;\n this.formValues = {};\n };\n\n this.prepareLabels = function (volume) {\n var labels = {};\n this.formValues.Labels.forEach(function (label) {\n if (label.name && label.value) {\n labels[label.name] = label.value;\n }\n });\n volume.Labels = labels;\n };\n\n this.prepareVolume = function () {\n var volume = angular.copy(this.formValues);\n var data = this.volume;\n\n if (volume.Node === data.Node || !volume.Node) {\n delete volume.Node;\n }\n if (volume.Capacity === data.Capacity || !volume.Capacity) {\n delete volume.Capacity;\n }\n if (volume.IOPSMin === data.IOPSMin || !volume.IOPSMin) {\n delete volume.IOPSMin;\n } else {\n volume.IOPSMin = volume.IOPSMin.toString();\n }\n if (volume.IOPSMax === data.IOPSMax || !volume.IOPSMax) {\n delete volume.IOPSMax;\n } else {\n volume.IOPSMax = volume.IOPSMax.toString();\n }\n if (volume.BandwidthMin === data.BandwidthMin || !volume.BandwidthMin) {\n delete volume.BandwidthMin;\n }\n if (volume.BandwidthMax === data.BandwidthMax || !volume.BandwidthMax) {\n delete volume.BandwidthMax;\n }\n this.prepareLabels(volume);\n return volume;\n };\n\n this.confirmUpdate = function () {\n this.state.isUpdating = true;\n\n var volume = this.prepareVolume();\n volume.Name = this.volume.Name;\n StoridgeVolumeService.update(volume)\n .then(function success() {\n Notifications.success('Volume successfully updated');\n $state.reload();\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to update volume');\n ctrl.state.isUpdating = false;\n });\n };\n },\n]);\n","import _ from 'lodash-es';\n\nangular\n .module('portainer.integrations.storidge')\n .filter('drivestatusbadge', function () {\n 'use strict';\n return function (text) {\n var status = text ? _.toLower(text) : '';\n if (status === 'available') {\n return 'info';\n } else if (status === 'faulty') {\n return 'danger';\n }\n return 'success';\n };\n })\n .filter('storidgeNodeStatusBadge', function () {\n 'use strict';\n return function (text) {\n var status = text ? _.toLower(text) : '';\n if (status === 'cordoned' || status === 'maintenance') {\n return 'orange-icon';\n } else if (status === 'leaving' || status === 'failed') {\n return 'red-icon';\n }\n return 'green-icon';\n };\n })\n .filter('storidgeClusterConditionBadge', function () {\n 'use strict';\n return function (text) {\n var status = text ? _.toLower(text) : '';\n if (status === 'alert') {\n return 'red-icon';\n } else if (status === 'warning') {\n return 'orange-icon';\n }\n return 'green-icon';\n };\n })\n .filter('bytes', function () {\n return function (bytes, precision) {\n bytes = parseFloat(bytes);\n if (isNaN(bytes) || !isFinite(bytes)) return '-';\n if (!precision) precision = 1;\n var units = ['B', 'kB', 'MB', 'GB', 'TB', 'PB'];\n var number = Math.floor(Math.log(bytes) / Math.log(1024));\n if (bytes === 0) {\n return '0 B';\n }\n return (bytes / Math.pow(1024, Math.floor(number))).toFixed(precision) + ' ' + units[number];\n };\n });\n","angular.module('portainer.integrations.storidge').factory('Storidge', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n 'EndpointProvider',\n function StoridgeFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider) {\n 'use strict';\n return $resource(\n API_ENDPOINT_ENDPOINTS + '/:endpointId/storidge/:resource/:id/:action',\n {\n endpointId: EndpointProvider.endpointID,\n },\n {\n rebootCluster: { method: 'POST', params: { resource: 'clusters', action: 'reboot' } },\n shutdownCluster: { method: 'POST', params: { resource: 'clusters', action: 'shutdown' } },\n queryEvents: { method: 'GET', params: { resource: 'clusters', action: 'events' }, ignoreLoadingBar: true, isArray: true },\n getVersion: { method: 'GET', params: { resource: 'clusters', action: 'version' } },\n getInfo: { method: 'GET', params: { resource: 'clusters', action: 'info' }, ignoreLoadingBar: true },\n\n queryNodes: { method: 'GET', params: { resource: 'nodes' } },\n getNode: { method: 'GET', params: { resource: 'nodes', id: '@id' } },\n addNode: { method: 'POST', params: { resource: 'nodes' } },\n removeNode: { method: 'DELETE', params: { resource: 'nodes', id: '@id' } },\n cordonNode: { method: 'POST', params: { resource: 'nodes', action: 'cordon', id: '@id' } },\n uncordonNode: { method: 'POST', params: { resource: 'nodes', action: 'uncordon', id: '@id' } },\n\n queryProfiles: { method: 'GET', params: { resource: 'profiles' } },\n getProfile: { method: 'GET', params: { resource: 'profiles' } },\n createProfile: { method: 'POST', params: { resource: 'profiles' } },\n updateProfile: { method: 'PUT', params: { resource: 'profiles', id: '@name' } },\n deleteProfile: { method: 'DELETE', params: { resource: 'profiles' } },\n\n queryDrives: { method: 'GET', params: { resource: 'drives' } },\n getDrive: { method: 'GET', params: { resource: 'drives', id: '@id' } },\n addDrive: { method: 'POST', params: { resource: 'drives' } },\n removeDrive: { method: 'DELETE', params: { resource: 'drives', id: '@id' } },\n rescanDrives: { method: 'POST', params: { resource: 'drives', action: 'rescan' } },\n\n queryVolumes: { method: 'GET', params: { resource: 'volumes' } },\n createVolume: { method: 'POST', params: { resource: 'volumes' } },\n getVolume: { method: 'GET', params: { resource: 'volumes', id: '@id' } },\n updateVolume: { method: 'POST', params: { resource: 'volumes', id: '@name' } },\n removeVolume: { method: 'DELETE', params: { resource: 'volumes', id: '@id' } },\n\n querySnapshots: { method: 'GET', params: { resource: 'volumes', id: '@id', action: 'snapshots' } },\n createSnapshot: { method: 'POST', params: { resource: 'volumes', id: '@id', action: 'snapshot' } },\n getSnapshot: { method: 'GET', params: { resource: 'snapshots', id: '@id' } },\n removeSnapshot: { method: 'DELETE', params: { resource: 'snapshots', id: '@id' } },\n }\n );\n },\n]);\n","import Chart from 'chart.js';\nimport filesize from 'filesize';\n\nangular.module('portainer.integrations.storidge').factory('StoridgeChartService', [\n function StoridgeChartService() {\n 'use strict';\n\n // Max. number of items to display on a chart\n var CHART_LIMIT = 600;\n\n var service = {};\n\n service.CreateCapacityChart = function (context) {\n return new Chart(context, {\n type: 'doughnut',\n data: {\n datasets: [\n {\n data: [],\n backgroundColor: ['rgba(171, 213, 255, 0.7)', 'rgba(229, 57, 53, 0.7)'],\n },\n ],\n labels: [],\n },\n options: {\n tooltips: {\n callbacks: {\n label: function (tooltipItem, data) {\n var dataset = data.datasets[tooltipItem.datasetIndex];\n var label = data.labels[tooltipItem.index];\n var value = dataset.data[tooltipItem.index];\n return label + ': ' + filesize(value, { base: 10, round: 1 });\n },\n },\n },\n animation: {\n duration: 0,\n },\n responsiveAnimationDuration: 0,\n responsive: true,\n hover: {\n animationDuration: 0,\n },\n },\n });\n };\n\n service.CreateIOPSChart = function (context) {\n return new Chart(context, {\n type: 'line',\n data: {\n labels: [],\n datasets: [\n {\n label: 'IOPS',\n data: [],\n fill: true,\n backgroundColor: 'rgba(151,187,205,0.4)',\n borderColor: 'rgba(151,187,205,0.6)',\n pointBackgroundColor: 'rgba(151,187,205,1)',\n pointBorderColor: 'rgba(151,187,205,1)',\n pointRadius: 2,\n borderWidth: 2,\n },\n ],\n },\n options: {\n animation: {\n duration: 0,\n },\n responsiveAnimationDuration: 0,\n responsive: true,\n tooltips: {\n mode: 'index',\n intersect: false,\n position: 'nearest',\n },\n hover: {\n animationDuration: 0,\n },\n scales: {\n yAxes: [\n {\n ticks: {\n beginAtZero: true,\n },\n },\n ],\n },\n },\n });\n };\n\n service.CreateBandwidthChart = function (context) {\n return new Chart(context, {\n type: 'line',\n data: {\n labels: [],\n datasets: [\n {\n label: 'Bandwidth',\n data: [],\n fill: true,\n backgroundColor: 'rgba(151,187,205,0.4)',\n borderColor: 'rgba(151,187,205,0.6)',\n pointBackgroundColor: 'rgba(151,187,205,1)',\n pointBorderColor: 'rgba(151,187,205,1)',\n pointRadius: 2,\n borderWidth: 2,\n },\n ],\n },\n options: {\n animation: {\n duration: 0,\n },\n responsiveAnimationDuration: 0,\n responsive: true,\n tooltips: {\n mode: 'index',\n intersect: false,\n position: 'nearest',\n callbacks: {\n label: function (tooltipItem, data) {\n var datasetLabel = data.datasets[tooltipItem.datasetIndex].label;\n return bytePerSecBasedTooltipLabel(datasetLabel, tooltipItem.yLabel);\n },\n },\n },\n hover: {\n animationDuration: 0,\n },\n scales: {\n yAxes: [\n {\n ticks: {\n beginAtZero: true,\n callback: bytePerSecBasedAxisLabel,\n },\n },\n ],\n },\n },\n });\n };\n\n service.UpdateChart = function (label, value, chart) {\n chart.data.labels.push(label);\n chart.data.datasets[0].data.push(value);\n\n if (chart.data.datasets[0].data.length > CHART_LIMIT) {\n chart.data.labels.pop();\n chart.data.datasets[0].data.pop();\n }\n\n chart.update(0);\n };\n\n service.UpdatePieChart = function (label, value, chart) {\n var idx = chart.data.labels.indexOf(label);\n if (idx > -1) {\n chart.data.datasets[0].data[idx] = value;\n } else {\n chart.data.labels.push(label);\n chart.data.datasets[0].data.push(value);\n }\n\n chart.update(0);\n };\n\n function bytePerSecBasedTooltipLabel(label, value) {\n var processedValue = 0;\n if (value > 5) {\n processedValue = filesize(value, { base: 10, round: 1 });\n } else {\n processedValue = value.toFixed(1) + 'B';\n }\n return label + ': ' + processedValue + '/s';\n }\n\n function bytePerSecBasedAxisLabel(value) {\n if (value > 5) {\n return filesize(value, { base: 10, round: 1 });\n }\n return value.toFixed(1) + 'B/s';\n }\n\n return service;\n },\n]);\n","import { StoridgeInfoModel } from '../models/info';\nimport { StoridgeEventModel } from '../models/events';\n\nangular.module('portainer.integrations.storidge').factory('StoridgeClusterService', [\n '$q',\n 'Storidge',\n function StoridgeClusterServiceFactory($q, Storidge) {\n 'use strict';\n var service = {};\n\n service.reboot = function () {\n return Storidge.rebootCluster().$promise;\n };\n\n service.shutdown = function () {\n return Storidge.shutdownCluster().$promise;\n };\n\n service.info = function () {\n var deferred = $q.defer();\n\n Storidge.getInfo()\n .$promise.then(function success(data) {\n var info = new StoridgeInfoModel(data);\n deferred.resolve(info);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve Storidge information', err: err });\n });\n\n return deferred.promise;\n };\n\n service.version = function () {\n var deferred = $q.defer();\n\n Storidge.getVersion()\n .$promise.then(function success(data) {\n var version = data.version;\n deferred.resolve(version);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve Storidge version', err: err });\n });\n\n return deferred.promise;\n };\n\n service.events = function () {\n var deferred = $q.defer();\n\n Storidge.queryEvents()\n .$promise.then(function success(data) {\n var events = data.map(function (item) {\n return new StoridgeEventModel(item);\n });\n deferred.resolve(events);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve Storidge events', err: err });\n });\n\n return deferred.promise;\n };\n\n return service;\n },\n]);\n","import { StoridgeDriveModel } from '../models/drive';\n\nangular.module('portainer.integrations.storidge').factory('StoridgeDriveService', [\n '$q',\n 'Storidge',\n function StoridgeDriveServiceFactory($q, Storidge) {\n 'use strict';\n var service = {};\n\n service.drives = function () {\n var deferred = $q.defer();\n\n Storidge.queryDrives()\n .$promise.then(function success(data) {\n var driveData = data.drives;\n var drives = driveData.map(function (drive) {\n return new StoridgeDriveModel(drive);\n });\n\n deferred.resolve(drives);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve Storidge drives', err: err });\n });\n\n return deferred.promise;\n };\n\n service.drive = function (id) {\n var deferred = $q.defer();\n\n Storidge.getDrive({ id: id })\n .$promise.then(function success(data) {\n var drive = new StoridgeDriveModel(data);\n Storidge.getNode({ id: data.nodeid }).$promise.then(function (data) {\n drive.Node = data.name;\n deferred.resolve(drive);\n });\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve Storidge drive', err: err });\n });\n\n return deferred.promise;\n };\n\n service.add = function (device, node) {\n var deferred = $q.defer();\n\n Storidge.addDrive({ device: device, node: node })\n .$promise.then(function success() {\n deferred.resolve();\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to add Storidge drive', err: err });\n });\n\n return deferred.promise;\n };\n\n service.remove = function (id) {\n var deferred = $q.defer();\n\n Storidge.removeDrive({ id: id })\n .$promise.then(function success() {\n deferred.resolve();\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to remove Storidge drive', err: err });\n });\n\n return deferred.promise;\n };\n\n service.rescan = function () {\n return Storidge.rescanDrives().$promise;\n };\n\n return service;\n },\n]);\n","import { StoridgeNodeModel, StoridgeNodeDetailedModel } from '../models/node';\n\nangular.module('portainer.integrations.storidge').factory('StoridgeNodeService', [\n '$q',\n 'Storidge',\n function StoridgeNodeServiceFactory($q, Storidge) {\n 'use strict';\n var service = {};\n\n service.nodes = function () {\n var deferred = $q.defer();\n\n Storidge.queryNodes()\n .$promise.then(function success(data) {\n var nodeData = data.nodes;\n var nodes = [];\n\n for (var key in nodeData) {\n if (Object.prototype.hasOwnProperty.call(nodeData, key)) {\n nodes.push(new StoridgeNodeModel(key, nodeData[key]));\n }\n }\n\n deferred.resolve(nodes);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve Storidge nodes', err: err });\n });\n\n return deferred.promise;\n };\n\n service.node = function (id) {\n var deferred = $q.defer();\n\n Storidge.getNode({ id: id })\n .$promise.then(function success(data) {\n var node = new StoridgeNodeDetailedModel(data.name, data.properties);\n deferred.resolve(node);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve Storidge node', err: err });\n });\n\n return deferred.promise;\n };\n\n service.add = function () {\n return Storidge.addNode().$promise;\n };\n\n service.cordon = function (id) {\n return Storidge.cordonNode({ id: id }).$promise;\n };\n\n service.uncordon = function (id) {\n return Storidge.uncordonNode({ id: id }).$promise;\n };\n\n service.remove = function (id) {\n return Storidge.removeNode({ id: id }).$promise;\n };\n\n return service;\n },\n]);\n","import { StoridgeCreateProfileRequest, StoridgeProfileListModel, StoridgeProfileModel } from '../models/profile';\n\nangular.module('portainer.integrations.storidge').factory('StoridgeProfileService', [\n '$q',\n 'Storidge',\n function StoridgeProfileServiceFactory($q, Storidge) {\n 'use strict';\n var service = {};\n\n service.create = function (model) {\n var payload = new StoridgeCreateProfileRequest(model);\n return Storidge.createProfile(payload).$promise;\n };\n\n service.update = function (model) {\n var payload = new StoridgeCreateProfileRequest(model);\n return Storidge.updateProfile(payload).$promise;\n };\n\n service.delete = function (profileName) {\n return Storidge.deleteProfile({ id: profileName }).$promise;\n };\n\n service.profile = function (profileName) {\n var deferred = $q.defer();\n\n Storidge.getProfile({ id: profileName })\n .$promise.then(function success(data) {\n var profile = new StoridgeProfileModel(profileName, data);\n deferred.resolve(profile);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve Storidge profile details', err: err });\n });\n\n return deferred.promise;\n };\n\n service.profiles = function () {\n var deferred = $q.defer();\n\n Storidge.queryProfiles()\n .$promise.then(function success(data) {\n var profiles = data.profiles.map(function (item) {\n return new StoridgeProfileListModel(item);\n });\n deferred.resolve(profiles);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve Storidge profiles', err: err });\n });\n\n return deferred.promise;\n };\n\n return service;\n },\n]);\n","import { StoridgeSnapshotModel } from '../models/snapshot';\n\nangular.module('portainer.integrations.storidge').factory('StoridgeSnapshotService', [\n '$q',\n 'Storidge',\n function StoridgeSnapshotServiceFactory($q, Storidge) {\n 'use strict';\n var service = {};\n\n service.snapshots = snapshots;\n service.snapshot = snapshot;\n service.create = create;\n service.remove = remove;\n\n function snapshots(volumeId) {\n var deferred = $q.defer();\n\n Storidge.querySnapshots({ id: volumeId })\n .$promise.then(function success(data) {\n var snapshotsData = data.snapshots;\n let snapshotsArray = [];\n for (const key in snapshotsData) {\n if (Object.prototype.hasOwnProperty.call(snapshotsData, key)) {\n snapshotsArray.push(snapshotsData[key]);\n }\n }\n var snapshots = snapshotsArray.map(function (snapshot) {\n return new StoridgeSnapshotModel(snapshot);\n });\n deferred.resolve(snapshots);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve Storidge snapshots', err: err });\n });\n\n return deferred.promise;\n }\n\n function snapshot(id) {\n var deferred = $q.defer();\n\n Storidge.getSnapshot({ id: id })\n .$promise.then(function success(data) {\n var snapshot = new StoridgeSnapshotModel(data.snapshot);\n deferred.resolve(snapshot);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve Storidge snapshot', err: err });\n });\n\n return deferred.promise;\n }\n\n function create(volumeId, description) {\n var deferred = $q.defer();\n Storidge.createSnapshot({ id: volumeId, opts: { description: description } })\n .$promise.then(function success(data) {\n deferred.resolve(data);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to create Storidge volume snapshot', err: err });\n });\n\n return deferred.promise;\n }\n\n function remove(id) {\n var deferred = $q.defer();\n\n Storidge.removeSnapshot({ id: id })\n .$promise.then(function success() {\n deferred.resolve();\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to remove Storidge volume snapshot', err: err });\n });\n\n return deferred.promise;\n }\n\n return service;\n },\n]);\n","import { StoridgeVolumeModel, StoridgeVolumeUpdateModel } from '../models/volume';\n\nangular.module('portainer.integrations.storidge').factory('StoridgeVolumeService', [\n '$q',\n 'Storidge',\n function StoridgeVolumeServiceFactory($q, Storidge) {\n 'use strict';\n var service = {};\n\n service.volume = function (id) {\n var deferred = $q.defer();\n\n Storidge.getVolume({ id: id })\n .$promise.then(function success(data) {\n var volume = new StoridgeVolumeModel(data);\n deferred.resolve(volume);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve Storidge volume', err: err });\n });\n\n return deferred.promise;\n };\n\n service.update = function (data) {\n var deferred = $q.defer();\n var volume = new StoridgeVolumeUpdateModel(data);\n Storidge.updateVolume(volume)\n .$promise.then(function success(data) {\n deferred.resolve(data);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to update Storidge volume', err: err });\n });\n\n return deferred.promise;\n };\n\n return service;\n },\n]);\n","angular.module('portainer.integrations.storidge').controller('StoridgeClusterController', [\n '$q',\n '$scope',\n '$state',\n 'Notifications',\n 'StoridgeClusterService',\n 'StoridgeNodeService',\n 'ModalService',\n function ($q, $scope, $state, Notifications, StoridgeClusterService, StoridgeNodeService, ModalService) {\n $scope.state = {\n shutdownInProgress: false,\n rebootInProgress: false,\n };\n\n $scope.rebootCluster = function () {\n ModalService.confirm({\n title: 'Are you sure?',\n message: 'All the nodes in the cluster will reboot during the process. Do you want to reboot the Storidge cluster?',\n buttons: {\n confirm: {\n label: 'Reboot',\n className: 'btn-danger',\n },\n },\n callback: function onConfirm(confirmed) {\n if (!confirmed) {\n return;\n }\n rebootCluster();\n },\n });\n };\n\n function rebootCluster() {\n $scope.state.rebootInProgress = true;\n StoridgeClusterService.reboot().finally(function final() {\n $scope.state.rebootInProgress = false;\n Notifications.success('Cluster successfully rebooted');\n $state.reload();\n });\n }\n\n $scope.shutdownCluster = function () {\n ModalService.confirm({\n title: 'Are you sure?',\n message: 'All the nodes in the cluster will shutdown. Do you want to shutdown the Storidge cluster?',\n buttons: {\n confirm: {\n label: 'Shutdown',\n className: 'btn-danger',\n },\n },\n callback: function onConfirm(confirmed) {\n if (!confirmed) {\n return;\n }\n shutdownCluster();\n },\n });\n };\n\n function shutdownCluster() {\n $scope.state.shutdownInProgress = true;\n StoridgeClusterService.shutdown().finally(function final() {\n $scope.state.shutdownInProgress = false;\n Notifications.success('Cluster successfully shutdown');\n $state.go('docker.dashboard');\n });\n }\n\n function initView() {\n $q.all({\n info: StoridgeClusterService.info(),\n version: StoridgeClusterService.version(),\n nodes: StoridgeNodeService.nodes(),\n })\n .then(function success(data) {\n $scope.clusterInfo = data.info;\n $scope.clusterVersion = data.version;\n $scope.clusterNodes = data.nodes;\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve cluster information');\n });\n }\n\n initView();\n },\n]);\n","angular.module('portainer.integrations.storidge').controller('StoridgeDrivesController', [\n '$scope',\n '$state',\n 'Notifications',\n 'StoridgeDriveService',\n function ($scope, $state, Notifications, StoridgeDriveService) {\n $scope.state = {\n additionInProgress: [],\n actionInProgress: false,\n };\n\n $scope.addAction = function (drive, idx) {\n $scope.state.additionInProgress[idx] = true;\n $scope.state.actionInProgress = true;\n StoridgeDriveService.add(drive.Device, drive.Node)\n .then(function success() {\n Notifications.success('Drive ' + drive.Device + ' successfully added on node ' + drive.Node);\n $state.reload();\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to add drive');\n })\n .finally(function final() {\n $scope.state.additionInProgress[idx] = false;\n $scope.state.actionInProgress = false;\n });\n };\n\n $scope.rescanAction = function () {\n StoridgeDriveService.rescan()\n .then(function sucess() {\n $state.reload();\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to scan drives');\n });\n };\n\n function initView() {\n StoridgeDriveService.drives()\n .then(function success(data) {\n $scope.drives = data;\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve drives');\n });\n }\n\n initView();\n },\n]);\n","angular.module('portainer.integrations.storidge').controller('StoridgeDriveController', [\n '$scope',\n '$state',\n '$transition$',\n 'Notifications',\n 'ModalService',\n 'StoridgeDriveService',\n function ($scope, $state, $transition$, Notifications, ModalService, StoridgeDriveService) {\n $scope.actionInProgress = false;\n\n $scope.removeDrive = function () {\n ModalService.confirm({\n title: 'Are you sure?',\n message: 'Do you want really want to remove this drive from the storage pool?',\n buttons: {\n confirm: {\n label: 'Remove',\n className: 'btn-danger',\n },\n },\n callback: function onConfirm(confirmed) {\n if (!confirmed) {\n return;\n }\n $scope.actionInProgress = true;\n StoridgeDriveService.remove($scope.drive.Id)\n .then(function () {\n Notifications.success('Success', 'Drive removed from storage pool');\n $state.go('storidge.drives', {}, { reload: true });\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to remove drive from storage pool');\n })\n .finally(function final() {\n $scope.actionInProgress = false;\n });\n },\n });\n };\n\n function initView() {\n $scope.id = $transition$.params().id;\n\n StoridgeDriveService.drive($scope.id)\n .then(function success(data) {\n $scope.drive = data;\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve drive details');\n });\n }\n\n initView();\n },\n]);\n","import moment from 'moment';\n\nangular.module('portainer.integrations.storidge').controller('StoridgeMonitorController', [\n '$q',\n '$scope',\n '$interval',\n '$document',\n 'Notifications',\n 'StoridgeClusterService',\n 'StoridgeChartService',\n function ($q, $scope, $interval, $document, Notifications, StoridgeClusterService, StoridgeChartService) {\n $scope.$on('$destroy', function () {\n stopRepeater();\n });\n\n function stopRepeater() {\n var repeater = $scope.repeater;\n if (angular.isDefined(repeater)) {\n $interval.cancel(repeater);\n repeater = null;\n }\n }\n\n function updateIOPSChart(info, chart) {\n var usedIOPS = info.UsedIOPS;\n var label = moment(new Date()).format('HH:mm:ss');\n\n StoridgeChartService.UpdateChart(label, usedIOPS, chart);\n }\n\n function updateBandwithChart(info, chart) {\n var usedBandwidth = info.UsedBandwidth;\n var label = moment(new Date()).format('HH:mm:ss');\n\n StoridgeChartService.UpdateChart(label, usedBandwidth, chart);\n }\n\n function updateCapacityChart(info, chart) {\n var usedCapacity = info.UsedCapacity;\n var freeCapacity = info.FreeCapacity;\n\n StoridgeChartService.UpdatePieChart('Free', freeCapacity, chart);\n StoridgeChartService.UpdatePieChart('Used', usedCapacity, chart);\n }\n\n function setUpdateRepeater(iopsChart, bandwidthChart, capacityChart) {\n var refreshRate = 5000;\n $scope.repeater = $interval(function () {\n $q.all({\n events: StoridgeClusterService.events(),\n info: StoridgeClusterService.info(),\n })\n .then(function success(data) {\n $scope.events = data.events;\n var info = data.info;\n $scope.info = info;\n updateIOPSChart(info, iopsChart);\n updateBandwithChart(info, bandwidthChart);\n updateCapacityChart(info, capacityChart);\n })\n .catch(function error(err) {\n stopRepeater();\n Notifications.error('Failure', err, 'Unable to retrieve cluster information');\n });\n }, refreshRate);\n }\n\n function startViewUpdate(iopsChart, bandwidthChart, capacityChart) {\n $q.all({\n events: StoridgeClusterService.events(),\n info: StoridgeClusterService.info(),\n })\n .then(function success(data) {\n $scope.events = data.events;\n var info = data.info;\n $scope.info = info;\n updateIOPSChart(info, iopsChart);\n updateBandwithChart(info, bandwidthChart);\n updateCapacityChart(info, capacityChart);\n setUpdateRepeater(iopsChart, bandwidthChart, capacityChart);\n })\n .catch(function error(err) {\n stopRepeater();\n Notifications.error('Failure', err, 'Unable to retrieve cluster information');\n });\n }\n\n function initCharts() {\n var iopsChartCtx = $('#iopsChart');\n var iopsChart = StoridgeChartService.CreateIOPSChart(iopsChartCtx);\n\n var bandwidthChartCtx = $('#bandwithChart');\n var bandwidthChart = StoridgeChartService.CreateBandwidthChart(bandwidthChartCtx);\n\n var capacityChartCtx = $('#capacityChart');\n var capacityChart = StoridgeChartService.CreateCapacityChart(capacityChartCtx);\n\n startViewUpdate(iopsChart, bandwidthChart, capacityChart);\n }\n\n function initView() {\n $document.ready(function () {\n initCharts();\n });\n }\n\n initView();\n },\n]);\n","angular.module('portainer.integrations.storidge').controller('StoridgeNodeController', [\n '$scope',\n '$state',\n '$transition$',\n 'Notifications',\n 'StoridgeNodeService',\n 'ModalService',\n function ($scope, $state, $transition$, Notifications, StoridgeNodeService, ModalService) {\n $scope.removeNodeAction = function (selectedItems) {\n ModalService.confirm({\n title: 'Are you sure?',\n message: 'Do you want really want to remove the node from the cluster?',\n buttons: {\n confirm: {\n label: 'Remove',\n className: 'btn-danger',\n },\n },\n callback: function onConfirm(confirmed) {\n if (!confirmed) {\n return;\n }\n remove(selectedItems);\n },\n });\n };\n\n function remove() {\n StoridgeNodeService.remove($scope.node.Name)\n .then(function success() {\n Notifications.success('Node successfully removed', $scope.node.Name);\n $state.go('storidge.cluster');\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to remove node');\n });\n }\n\n $scope.cordonNodeAction = function (selectedItems) {\n ModalService.confirm({\n title: 'Are you sure?',\n message: 'Do you want really want to put the node in maintenance mode?',\n buttons: {\n confirm: {\n label: 'Enter maintenance',\n className: 'btn-danger',\n },\n },\n callback: function onConfirm(confirmed) {\n if (!confirmed) {\n return;\n }\n cordonNode(selectedItems);\n },\n });\n };\n\n function cordonNode() {\n StoridgeNodeService.cordon($scope.node.Name)\n .then(function success() {\n Notifications.success('Node successfully put in maintenance');\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to put node in maintenance mode');\n })\n .finally(function final() {\n $state.reload();\n });\n }\n\n $scope.uncordonNodeAction = function (selectedItems) {\n ModalService.confirm({\n title: 'Are you sure?',\n message: 'Do you want really want to bring the nodes out of maintenance mode?',\n buttons: {\n confirm: {\n label: 'Exit maintenance',\n className: 'btn-danger',\n },\n },\n callback: function onConfirm(confirmed) {\n if (!confirmed) {\n return;\n }\n uncordonNode(selectedItems);\n },\n });\n };\n\n function uncordonNode() {\n StoridgeNodeService.uncordon($scope.node.Name)\n .then(function success() {\n Notifications.success('Node successfully bringed back');\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to put node out of maintenance mode');\n })\n .finally(function final() {\n $state.reload();\n });\n }\n\n function initView() {\n $scope.name = $transition$.params().name;\n\n StoridgeNodeService.node($scope.name)\n .then(function success(data) {\n $scope.node = data;\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve node details');\n });\n }\n\n initView();\n },\n]);\n","import _ from 'lodash-es';\nimport { StoridgeProfileDefaultModel } from '../../../models/profile';\n\nangular.module('portainer.integrations.storidge').controller('StoridgeCreateProfileController', [\n '$scope',\n '$state',\n '$transition$',\n 'Notifications',\n 'StoridgeProfileService',\n function ($scope, $state, $transition$, Notifications, StoridgeProfileService) {\n $scope.formValues = {\n Labels: [],\n };\n\n $scope.state = {\n NoLimit: true,\n LimitIOPS: false,\n LimitBandwidth: false,\n ManualInputDirectory: false,\n actionInProgress: false,\n };\n\n $scope.RedundancyOptions = [\n { value: 2, label: '2-copy' },\n { value: 3, label: '3-copy' },\n ];\n\n $scope.addLabel = function () {\n $scope.formValues.Labels.push({ name: '', value: '' });\n };\n\n $scope.removeLabel = function (index) {\n $scope.formValues.Labels.splice(index, 1);\n };\n\n function prepareLabels(profile) {\n var labels = {};\n $scope.formValues.Labels.forEach(function (label) {\n if (label.name && label.value) {\n labels[label.name] = label.value;\n }\n });\n profile.Labels = labels;\n }\n\n $scope.create = function () {\n var profile = $scope.model;\n\n if (!$scope.state.LimitIOPS) {\n delete profile.MinIOPS;\n delete profile.MaxIOPS;\n }\n\n if (!$scope.state.LimitBandwidth) {\n delete profile.MinBandwidth;\n delete profile.MaxBandwidth;\n }\n\n if (profile.SnapshotEnabled) {\n if (!profile.SnapshotMax || profile.SnapshotMax <= 0) {\n profile.SnapshotMax = 1;\n }\n if (!$scope.state.RecurringSnapshotEnabled) {\n delete profile.SnapshotInterval;\n }\n if ($scope.state.RecurringSnapshotEnabled && (!profile.SnapshotInterval || profile.SnapshotInterval <= 0)) {\n profile.SnapshotInterval = 1440;\n }\n } else {\n delete profile.SnapshotMax;\n delete profile.SnapshotInterval;\n }\n\n prepareLabels(profile);\n\n $scope.state.actionInProgress = true;\n StoridgeProfileService.create(profile)\n .then(function success() {\n Notifications.success('Profile successfully created');\n $state.go('storidge.profiles');\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to create profile');\n })\n .finally(function final() {\n $scope.state.actionInProgress = false;\n });\n };\n\n $scope.updatedName = function () {\n if (!$scope.state.ManualInputDirectory) {\n var profile = $scope.model;\n profile.Directory = '/cio/' + (profile.Name ? _.toLower(profile.Name) : '');\n }\n };\n\n $scope.updatedDirectory = function () {\n if (!$scope.state.ManualInputDirectory) {\n $scope.state.ManualInputDirectory = true;\n }\n };\n\n function initView() {\n var profile = new StoridgeProfileDefaultModel();\n profile.Name = $transition$.params().profileName;\n profile.Directory = profile.Directory + _.toLower(profile.Name);\n $scope.model = profile;\n }\n\n initView();\n },\n]);\n","angular.module('portainer.integrations.storidge').controller('StoridgeProfileController', [\n '$scope',\n '$state',\n '$transition$',\n 'Notifications',\n 'StoridgeProfileService',\n 'ModalService',\n function ($scope, $state, $transition$, Notifications, StoridgeProfileService, ModalService) {\n $scope.formValues = {\n Labels: [],\n };\n\n $scope.state = {\n NoLimit: false,\n LimitIOPS: false,\n LimitBandwidth: false,\n updateInProgress: false,\n deleteInProgress: false,\n RecurringSnapshotEnabled: false,\n };\n\n $scope.addLabel = function () {\n $scope.formValues.Labels.push({ name: '', value: '' });\n };\n\n $scope.removeLabel = function (index) {\n $scope.formValues.Labels.splice(index, 1);\n };\n\n function prepareLabels(profile) {\n var labels = {};\n $scope.formValues.Labels.forEach(function (label) {\n if (label.name && label.value) {\n labels[label.name] = label.value;\n }\n });\n profile.Labels = labels;\n }\n\n function initLabels(labels) {\n $scope.formValues.Labels = Object.keys(labels).map(function (key) {\n return { name: key, value: labels[key] };\n });\n }\n\n $scope.RedundancyOptions = [\n { value: 2, label: '2-copy' },\n { value: 3, label: '3-copy' },\n ];\n\n $scope.update = function () {\n var profile = $scope.profile;\n\n if (!$scope.state.LimitIOPS) {\n delete profile.MinIOPS;\n delete profile.MaxIOPS;\n }\n\n if (!$scope.state.LimitBandwidth) {\n delete profile.MinBandwidth;\n delete profile.MaxBandwidth;\n }\n\n if (profile.SnapshotEnabled) {\n if (!profile.SnapshotMax || profile.SnapshotMax <= 0) {\n profile.SnapshotMax = 1;\n }\n if (!$scope.state.RecurringSnapshotEnabled) {\n delete profile.SnapshotInterval;\n }\n if ($scope.state.RecurringSnapshotEnabled && (!profile.SnapshotInterval || profile.SnapshotInterval <= 0)) {\n profile.SnapshotInterval = 1440;\n }\n } else {\n delete profile.SnapshotMax;\n delete profile.SnapshotInterval;\n }\n\n prepareLabels(profile);\n\n $scope.state.updateInProgress = true;\n StoridgeProfileService.update(profile)\n .then(function success() {\n Notifications.success('Profile successfully updated');\n $state.go('storidge.profiles');\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to update profile');\n })\n .finally(function final() {\n $scope.state.updateInProgress = false;\n });\n };\n\n $scope.delete = function () {\n ModalService.confirmDeletion('Do you want to remove this profile?', function onConfirm(confirmed) {\n if (!confirmed) {\n return;\n }\n deleteProfile();\n });\n };\n\n function deleteProfile() {\n var profile = $scope.profile;\n\n $scope.state.deleteInProgress = true;\n StoridgeProfileService.delete(profile.Name)\n .then(function success() {\n Notifications.success('Profile successfully deleted');\n $state.go('storidge.profiles');\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to delete profile');\n })\n .finally(function final() {\n $scope.state.deleteInProgress = false;\n });\n }\n\n function initView() {\n StoridgeProfileService.profile($transition$.params().id)\n .then(function success(data) {\n var profile = data;\n if ((profile.MinIOPS && profile.MinIOPS !== 0) || (profile.MaxIOPS && profile.MaxIOPS !== 0)) {\n $scope.state.LimitIOPS = true;\n } else if ((profile.MinBandwidth && profile.MinBandwidth !== 0) || (profile.MaxBandwidth && profile.MaxBandwidth !== 0)) {\n $scope.state.LimitBandwidth = true;\n } else {\n $scope.state.NoLimit = true;\n }\n if (profile.SnapshotEnabled && profile.SnapshotInterval !== 0) {\n $scope.state.RecurringSnapshotEnabled = true;\n }\n initLabels(profile.Labels);\n $scope.profile = profile;\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve profile details');\n });\n }\n\n initView();\n },\n]);\n","import _ from 'lodash-es';\nimport { StoridgeProfileDefaultModel } from '../../models/profile';\n\nangular.module('portainer.integrations.storidge').controller('StoridgeProfilesController', [\n '$q',\n '$scope',\n '$state',\n 'Notifications',\n 'StoridgeProfileService',\n function ($q, $scope, $state, Notifications, StoridgeProfileService) {\n $scope.state = {\n actionInProgress: false,\n };\n\n $scope.formValues = {\n Name: '',\n };\n\n $scope.removeAction = function (selectedItems) {\n var actionCount = selectedItems.length;\n angular.forEach(selectedItems, function (profile) {\n StoridgeProfileService.delete(profile.Name)\n .then(function success() {\n Notifications.success('Profile successfully removed', profile.Name);\n var index = $scope.profiles.indexOf(profile);\n $scope.profiles.splice(index, 1);\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to remove profile');\n })\n .finally(function final() {\n --actionCount;\n if (actionCount === 0) {\n $state.reload();\n }\n });\n });\n };\n\n $scope.create = function () {\n var model = new StoridgeProfileDefaultModel();\n model.Labels = {};\n model.Name = $scope.formValues.Name;\n model.Directory = model.Directory + _.toLower(model.Name);\n delete model.MinBandwidth;\n delete model.MaxBandwidth;\n delete model.MinIOPS;\n delete model.MaxIOPS;\n\n $scope.state.actionInProgress = true;\n StoridgeProfileService.create(model)\n .then(function success() {\n Notifications.success('Profile successfully created');\n $state.reload();\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to create profile');\n })\n .finally(function final() {\n $scope.state.actionInProgress = false;\n });\n };\n\n function initView() {\n StoridgeProfileService.profiles()\n .then(function success(data) {\n $scope.profiles = data;\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve profiles');\n });\n }\n\n initView();\n },\n]);\n","angular.module('portainer.integrations.storidge').controller('StoridgeSnapshotController', [\n '$scope',\n '$state',\n '$transition$',\n 'Notifications',\n 'ModalService',\n 'StoridgeSnapshotService',\n function ($scope, $state, $transition$, Notifications, ModalService, StoridgeSnapshotService) {\n $scope.removeSnapshot = function () {\n ModalService.confirm({\n title: 'Are you sure?',\n message: 'Do you want really want to remove this snapshot?',\n buttons: {\n confirm: {\n label: 'Remove',\n className: 'btn-danger',\n },\n },\n callback: function onConfirm(confirmed) {\n if (!confirmed) {\n return;\n }\n StoridgeSnapshotService.remove($scope.snapshot.Id)\n .then(function () {\n Notifications.success('Success', 'Snapshot removed');\n $state.go('portainer.volumes.volume', { id: $scope.volumeId });\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to remove snapshot');\n });\n },\n });\n };\n\n function initView() {\n $scope.volumeId = $transition$.params().id;\n $scope.snapshotId = $transition$.params().snapshotId;\n\n StoridgeSnapshotService.snapshot($scope.snapshotId)\n .then(function success(data) {\n $scope.snapshot = data;\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve snapshot details');\n });\n }\n\n initView();\n },\n]);\n","import registriesModule from './registries';\nimport customTemplateModule from './custom-templates';\n\nangular.module('portainer.kubernetes', ['portainer.app', registriesModule, customTemplateModule]).config([\n '$stateRegistryProvider',\n function ($stateRegistryProvider) {\n 'use strict';\n\n const kubernetes = {\n name: 'kubernetes',\n url: '/kubernetes',\n parent: 'endpoint',\n abstract: true,\n\n onEnter: /* @ngInject */ function onEnter($async, $state, endpoint, EndpointProvider, KubernetesHealthService, KubernetesNamespaceService, Notifications, StateManager) {\n return $async(async () => {\n if (![5, 6, 7].includes(endpoint.Type)) {\n $state.go('portainer.home');\n return;\n }\n try {\n if (endpoint.Type === 7) {\n //edge\n try {\n await KubernetesHealthService.ping(endpoint.Id);\n endpoint.Status = 1;\n } catch (e) {\n endpoint.Status = 2;\n }\n }\n\n EndpointProvider.setEndpointID(endpoint.Id);\n await StateManager.updateEndpointState(endpoint, []);\n\n if (endpoint.Type === 7 && endpoint.Status === 2) {\n throw new Error('Unable to contact Edge agent, please ensure that the agent is properly running on the remote environment.');\n }\n\n await KubernetesNamespaceService.get();\n } catch (e) {\n Notifications.error('Failed loading environment', e);\n $state.go('portainer.home', {}, { reload: true });\n }\n });\n },\n };\n\n const helmApplication = {\n name: 'kubernetes.helm',\n url: '/helm/:namespace/:name',\n views: {\n 'content@': {\n component: 'kubernetesHelmApplicationView',\n },\n },\n };\n\n const helmTemplates = {\n name: 'kubernetes.templates.helm',\n url: '/helm',\n views: {\n 'content@': {\n component: 'helmTemplatesView',\n },\n },\n };\n\n const applications = {\n name: 'kubernetes.applications',\n url: '/applications',\n views: {\n 'content@': {\n component: 'kubernetesApplicationsView',\n },\n },\n };\n\n const applicationCreation = {\n name: 'kubernetes.applications.new',\n url: '/new',\n views: {\n 'content@': {\n component: 'kubernetesCreateApplicationView',\n },\n },\n };\n\n const application = {\n name: 'kubernetes.applications.application',\n url: '/:namespace/:name',\n views: {\n 'content@': {\n component: 'kubernetesApplicationView',\n },\n },\n };\n\n const applicationEdit = {\n name: 'kubernetes.applications.application.edit',\n url: '/edit',\n views: {\n 'content@': {\n component: 'kubernetesCreateApplicationView',\n },\n },\n };\n\n const applicationConsole = {\n name: 'kubernetes.applications.application.console',\n url: '/:pod/:container/console',\n views: {\n 'content@': {\n component: 'kubernetesApplicationConsoleView',\n },\n },\n };\n\n const applicationLogs = {\n name: 'kubernetes.applications.application.logs',\n url: '/:pod/:container/logs',\n views: {\n 'content@': {\n component: 'kubernetesApplicationLogsView',\n },\n },\n };\n\n const applicationStats = {\n name: 'kubernetes.applications.application.stats',\n url: '/:pod/:container/stats',\n views: {\n 'content@': {\n component: 'kubernetesApplicationStatsView',\n },\n },\n };\n\n const stacks = {\n name: 'kubernetes.stacks',\n url: '/stacks',\n abstract: true,\n };\n\n const stack = {\n name: 'kubernetes.stacks.stack',\n url: '/:namespace/:name',\n abstract: true,\n };\n\n const stackLogs = {\n name: 'kubernetes.stacks.stack.logs',\n url: '/logs',\n views: {\n 'content@': {\n component: 'kubernetesStackLogsView',\n },\n },\n };\n\n const configurations = {\n name: 'kubernetes.configurations',\n url: '/configurations',\n views: {\n 'content@': {\n component: 'kubernetesConfigurationsView',\n },\n },\n };\n\n const configurationCreation = {\n name: 'kubernetes.configurations.new',\n url: '/new',\n views: {\n 'content@': {\n component: 'kubernetesCreateConfigurationView',\n },\n },\n };\n\n const configuration = {\n name: 'kubernetes.configurations.configuration',\n url: '/:namespace/:name',\n views: {\n 'content@': {\n component: 'kubernetesConfigurationView',\n },\n },\n };\n\n const cluster = {\n name: 'kubernetes.cluster',\n url: '/cluster',\n views: {\n 'content@': {\n component: 'kubernetesClusterView',\n },\n },\n };\n\n const node = {\n name: 'kubernetes.cluster.node',\n url: '/:name',\n views: {\n 'content@': {\n component: 'kubernetesNodeView',\n },\n },\n };\n\n const nodeStats = {\n name: 'kubernetes.cluster.node.stats',\n url: '/stats',\n views: {\n 'content@': {\n component: 'kubernetesNodeStatsView',\n },\n },\n };\n\n const dashboard = {\n name: 'kubernetes.dashboard',\n url: '/dashboard',\n views: {\n 'content@': {\n component: 'kubernetesDashboardView',\n },\n },\n };\n\n const deploy = {\n name: 'kubernetes.deploy',\n url: '/deploy?templateId',\n views: {\n 'content@': {\n component: 'kubernetesDeployView',\n },\n },\n params: {\n templateId: '',\n },\n };\n\n const resourcePools = {\n name: 'kubernetes.resourcePools',\n url: '/pools',\n views: {\n 'content@': {\n component: 'kubernetesResourcePoolsView',\n },\n },\n };\n\n const resourcePoolCreation = {\n name: 'kubernetes.resourcePools.new',\n url: '/new',\n views: {\n 'content@': {\n component: 'kubernetesCreateResourcePoolView',\n },\n },\n };\n\n const resourcePool = {\n name: 'kubernetes.resourcePools.resourcePool',\n url: '/:id',\n views: {\n 'content@': {\n component: 'kubernetesResourcePoolView',\n },\n },\n };\n\n const resourcePoolAccess = {\n name: 'kubernetes.resourcePools.resourcePool.access',\n url: '/access',\n views: {\n 'content@': {\n component: 'kubernetesResourcePoolAccessView',\n },\n },\n };\n\n const volumes = {\n name: 'kubernetes.volumes',\n url: '/volumes',\n views: {\n 'content@': {\n component: 'kubernetesVolumesView',\n },\n },\n };\n\n const volume = {\n name: 'kubernetes.volumes.volume',\n url: '/:namespace/:name',\n views: {\n 'content@': {\n component: 'kubernetesVolumeView',\n },\n },\n };\n\n const registries = {\n name: 'kubernetes.registries',\n url: '/registries',\n views: {\n 'content@': {\n component: 'endpointRegistriesView',\n },\n },\n };\n\n const registriesAccess = {\n name: 'kubernetes.registries.access',\n url: '/:id/access',\n views: {\n 'content@': {\n component: 'kubernetesRegistryAccessView',\n },\n },\n };\n\n $stateRegistryProvider.register(kubernetes);\n $stateRegistryProvider.register(helmApplication);\n $stateRegistryProvider.register(helmTemplates);\n $stateRegistryProvider.register(applications);\n $stateRegistryProvider.register(applicationCreation);\n $stateRegistryProvider.register(application);\n $stateRegistryProvider.register(applicationEdit);\n $stateRegistryProvider.register(applicationConsole);\n $stateRegistryProvider.register(applicationLogs);\n $stateRegistryProvider.register(applicationStats);\n $stateRegistryProvider.register(stacks);\n $stateRegistryProvider.register(stack);\n $stateRegistryProvider.register(stackLogs);\n $stateRegistryProvider.register(configurations);\n $stateRegistryProvider.register(configurationCreation);\n $stateRegistryProvider.register(configuration);\n $stateRegistryProvider.register(cluster);\n $stateRegistryProvider.register(dashboard);\n $stateRegistryProvider.register(deploy);\n $stateRegistryProvider.register(node);\n $stateRegistryProvider.register(nodeStats);\n $stateRegistryProvider.register(resourcePools);\n $stateRegistryProvider.register(resourcePoolCreation);\n $stateRegistryProvider.register(resourcePool);\n $stateRegistryProvider.register(resourcePoolAccess);\n $stateRegistryProvider.register(volumes);\n $stateRegistryProvider.register(volume);\n $stateRegistryProvider.register(registries);\n $stateRegistryProvider.register(registriesAccess);\n },\n]);\n","var path = 'app/kubernetes/registries/kube-registry-access-view/kube-registry-access-view.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Registry access\\\"></rd-header-title>\\n <rd-header-content> <a ui-sref=\\\"kubernetes.registries\\\">Registries</a> > {{ $ctrl.registry.Name }} > Access management </rd-header-content>\\n</rd-header>\\n\\n<registry-details registry=\\\"$ctrl.registry\\\" ng-if=\\\"$ctrl.registry\\\"></registry-details>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-user-lock\\\" title-text=\\\"Create access\\\"></rd-widget-header>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\">\\n <div class=\\\"form-group\\\">\\n <label class=\\\"col-sm-3 col-lg-2 control-label text-left\\\" style=\\\"padding-top: 0;\\\">\\n Select namespaces\\n </label>\\n <div class=\\\"col-sm-9 col-lg-4\\\" style=\\\"margin-bottom: 15px;\\\">\\n <span class=\\\"small text-muted\\\" ng-if=\\\"!$ctrl.resourcePools.length\\\">\\n No namespaces available.\\n </span>\\n <span\\n isteven-multi-select\\n ng-if=\\\"$ctrl.resourcePools.length\\\"\\n input-model=\\\"$ctrl.resourcePools\\\"\\n output-model=\\\"$ctrl.selectedResourcePools\\\"\\n button-label=\\\"name\\\"\\n item-label=\\\"name\\\"\\n tick-property=\\\"ticked\\\"\\n helper-elements=\\\"filter\\\"\\n search-property=\\\"name\\\"\\n translation=\\\"{nothingSelected: 'Select one or more namespaces', search: 'Search...'}\\\"\\n >\\n </span>\\n </div>\\n <div class=\\\"col-sm-12 small text-muted\\\">\\n <i class=\\\"fa fa-exclamation-circle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Note: adding this registry will expose the registry credentials to all users of this namespace\\n </div>\\n </div>\\n\\n <!-- actions -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"submit\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"$ctrl.selectedResourcePools.length === 0 || $ctrl.state.actionInProgress\\\"\\n ng-click=\\\"$ctrl.submit()\\\"\\n button-spinner=\\\"$ctrl.state.actionInProgress\\\"\\n >\\n <span ng-hide=\\\"$ctrl.state.actionInProgress\\\"><i class=\\\"fa fa-plus\\\" aria-hidden=\\\"true\\\"></i> Create access</span>\\n <span ng-show=\\\"$ctrl.state.actionInProgress\\\">Creating access...</span>\\n </button>\\n </div>\\n </div>\\n <!-- !actions -->\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <strings-datatable\\n title-text=\\\"Access\\\"\\n title-icon=\\\"fa-user-lock\\\"\\n table-key=\\\"access_registry_resourcepools\\\"\\n dataset=\\\"$ctrl.savedResourcePools\\\"\\n empty-dataset-message=\\\"No namespace has been authorized yet.\\\"\\n on-remove=\\\"($ctrl.handleRemove)\\\"\\n column-header=\\\"Namespace\\\"\\n >\\n </strings-datatable>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/kubernetes/custom-templates/kube-custom-templates-view/kube-custom-templates-view.html';\nvar html = \"<kubernetes-view-header title=\\\"Custom Templates\\\" state=\\\"kubernetes.templates.custom\\\" view-ready=\\\"true\\\">\\n Custom Templates\\n</kubernetes-view-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <custom-templates-list\\n ng-if=\\\"$ctrl.templates\\\"\\n title-text=\\\"Templates\\\"\\n title-icon=\\\"fa-rocket\\\"\\n templates=\\\"$ctrl.templates\\\"\\n table-key=\\\"customTemplates\\\"\\n is-edit-allowed=\\\"$ctrl.isEditAllowed\\\"\\n on-select-click=\\\"($ctrl.selectTemplate)\\\"\\n on-delete-click=\\\"($ctrl.confirmDelete)\\\"\\n create-path=\\\"kubernetes.templates.custom.new\\\"\\n edit-path=\\\"kubernetes.templates.custom.edit\\\"\\n ></custom-templates-list>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/kubernetes/custom-templates/kube-edit-custom-template-view/kube-edit-custom-template-view.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Edit Custom Template\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"Refresh\\\" ui-sref=\\\"kubernetes.templates.custom.edit({id:$ctrl.formValues.Id})\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content> <a ui-sref=\\\"kubernetes.templates.custom\\\">Custom templates</a> > {{ $ctrl.formValues.Title }} </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\" ng-if=\\\"$ctrl.formValues\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\" name=\\\"$ctrl.form\\\">\\n <custom-template-common-fields form-values=\\\"$ctrl.formValues\\\"></custom-template-common-fields>\\n\\n <web-editor-form\\n identifier=\\\"template-editor\\\"\\n value=\\\"$ctrl.formValues.FileContent\\\"\\n on-change=\\\"($ctrl.onChangeFileContent)\\\"\\n ng-required=\\\"true\\\"\\n yml=\\\"true\\\"\\n placeholder=\\\"# Define or paste the content of your manifest file here\\\"\\n >\\n <editor-description>\\n <p>Templates allow deploying any kind of Kubernetes resource (Deployment, Secret, ConfigMap...)</p>\\n <p>\\n You can get more information about Kubernetes file format in the\\n <a href=\\\"https://kubernetes.io/docs/concepts/overview/working-with-objects/kubernetes-objects/\\\" target=\\\"_blank\\\">official documentation</a>.\\n </p>\\n </editor-description>\\n </web-editor-form>\\n\\n <por-access-control-form form-data=\\\"$ctrl.formValues.AccessControlData\\\" resource-control=\\\"$ctrl.formValues.ResourceControl\\\"></por-access-control-form>\\n\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"$ctrl.actionInProgress || $ctrl.form.$invalid || !$ctrl.formValues.Title || !$ctrl.formValues.FileContent\\\"\\n ng-click=\\\"$ctrl.submitAction()\\\"\\n button-spinner=\\\"$ctrl.actionInProgress\\\"\\n >\\n <span ng-hide=\\\"$ctrl.actionInProgress\\\">Update the template</span>\\n <span ng-show=\\\"$ctrl.actionInProgress\\\">Update in progress...</span>\\n </button>\\n <span class=\\\"text-danger\\\" ng-if=\\\"$ctrl.state.formValidationError\\\" style=\\\"margin-left: 5px;\\\">\\n {{ $ctrl.state.formValidationError }}\\n </span>\\n </div>\\n </div>\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/kubernetes/custom-templates/kube-create-custom-template-view/kube-create-custom-template-view.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Create Custom template\\\"></rd-header-title>\\n <rd-header-content> <a ui-sref=\\\"kubernetes.templates.custom\\\">Custom Templates</a> > Create Custom template </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\" name=\\\"$ctrl.form\\\">\\n <custom-template-common-fields form-values=\\\"$ctrl.formValues\\\"></custom-template-common-fields>\\n\\n <!-- build-method -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Build method\\n </div>\\n <box-selector radio-name=\\\"method\\\" ng-model=\\\"$ctrl.state.method\\\" options=\\\"$ctrl.methodOptions\\\" on-change=\\\"($ctrl.onChangeMethod)\\\"></box-selector>\\n\\n <web-editor-form\\n ng-if=\\\"$ctrl.state.method === 'editor'\\\"\\n identifier=\\\"template-creation-editor\\\"\\n value=\\\"$ctrl.formValues.FileContent\\\"\\n on-change=\\\"($ctrl.onChangeFileContent)\\\"\\n ng-required=\\\"true\\\"\\n yml=\\\"true\\\"\\n placeholder=\\\"# Define or paste the content of your manifest file here\\\"\\n >\\n <editor-description>\\n <p>Templates allow deploying any kind of Kubernetes resource (Deployment, Secret, ConfigMap...)</p>\\n <p>\\n You can get more information about Kubernetes file format in the\\n <a href=\\\"https://kubernetes.io/docs/concepts/overview/working-with-objects/kubernetes-objects/\\\" target=\\\"_blank\\\">official documentation</a>.\\n </p>\\n </editor-description>\\n </web-editor-form>\\n\\n <file-upload-form ng-if=\\\"$ctrl.state.method === 'upload'\\\" file=\\\"$ctrl.formValues.File\\\" on-change=\\\"($ctrl.onChangeFile)\\\" ng-required=\\\"true\\\">\\n <file-upload-description>\\n You can upload a Manifest file from your computer.\\n </file-upload-description>\\n </file-upload-form>\\n\\n <por-access-control-form form-data=\\\"$ctrl.formValues.AccessControlData\\\"></por-access-control-form>\\n\\n <!-- actions -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"$ctrl.state.actionInProgress || $ctrl.form.$invalid || ($ctrl.state.method === 'editor' && !$ctrl.formValues.FileContent)\\\"\\n ng-click=\\\"$ctrl.createCustomTemplate()\\\"\\n button-spinner=\\\"$ctrl.state.actionInProgress\\\"\\n >\\n <span ng-hide=\\\"$ctrl.state.actionInProgress\\\">Create custom template</span>\\n <span ng-show=\\\"$ctrl.state.actionInProgress\\\">Creation in progress...</span>\\n </button>\\n <span class=\\\"text-danger\\\" ng-if=\\\"$ctrl.state.formValidationError\\\" style=\\\"margin-left: 5px;\\\">\\n {{ $ctrl.state.formValidationError }}\\n </span>\\n </div>\\n </div>\\n <!-- !actions -->\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/components/box-selector/box-selector.html';\nvar html = \"<div class=\\\"form-group\\\"></div>\\n\\n<div class=\\\"form-group\\\">\\n <div class=\\\"boxselector_wrapper\\\">\\n <box-selector-item\\n ng-repeat=\\\"option in $ctrl.options\\\"\\n radio-name=\\\"{{ $ctrl.radioName }}\\\"\\n option=\\\"option\\\"\\n on-change=\\\"($ctrl.change)\\\"\\n is-checked=\\\"$ctrl.isChecked\\\"\\n disabled=\\\"option.disabled()\\\"\\n tooltip=\\\"option.tooltip()\\\"\\n ></box-selector-item>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./containersDatatable.html');\n\nangular.module('portainer.kubernetes').component('kubernetesContainersDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'GenericDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n refreshCallback: '<',\n isPod: '<',\n useServerMetrics: '<',\n },\n});\n","var path = 'app/kubernetes/components/datatables/application/containers-datatable/containersDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n <div ng-if=\\\"$ctrl.refreshCallback\\\" class=\\\"settings\\\">\\n <span class=\\\"setting\\\" ng-class=\\\"{ 'setting-active': $ctrl.settings.open }\\\" uib-dropdown dropdown-append-to-body auto-close=\\\"disabled\\\" is-open=\\\"$ctrl.settings.open\\\">\\n <span uib-dropdown-toggle><i class=\\\"fa fa-cog\\\" aria-hidden=\\\"true\\\"></i> Table settings</span>\\n <div class=\\\"dropdown-menu dropdown-menu-right\\\" uib-dropdown-menu>\\n <div class=\\\"tableMenu\\\">\\n <div class=\\\"menuHeader\\\">\\n Table settings\\n </div>\\n <div class=\\\"menuContent\\\">\\n <div>\\n <div class=\\\"md-checkbox\\\">\\n <input id=\\\"setting_auto_refresh\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.settings.repeater.autoRefresh\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" />\\n <label for=\\\"setting_auto_refresh\\\">Auto refresh</label>\\n </div>\\n <div ng-if=\\\"$ctrl.settings.repeater.autoRefresh\\\">\\n <label for=\\\"settings_refresh_rate\\\">\\n Refresh rate\\n </label>\\n <select id=\\\"settings_refresh_rate\\\" ng-model=\\\"$ctrl.settings.repeater.refreshRate\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" class=\\\"small-select\\\">\\n <option value=\\\"10\\\">10s</option>\\n <option value=\\\"30\\\">30s</option>\\n <option value=\\\"60\\\">1min</option>\\n <option value=\\\"120\\\">2min</option>\\n <option value=\\\"300\\\">5min</option>\\n </select>\\n <span>\\n <i id=\\\"refreshRateChange\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-top: 7px; display: none;\\\"></i>\\n </span>\\n </div>\\n </div>\\n </div>\\n <div>\\n <a type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"$ctrl.settings.open = false;\\\">Close</a>\\n </div>\\n </div>\\n </div>\\n </span>\\n </div>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\" data-cy=\\\"k8sAppDetail-containerTable\\\">\\n <thead>\\n <tr>\\n <th ng-if=\\\"!$ctrl.isPod\\\">\\n <a ng-click=\\\"$ctrl.changeOrderBy('PodName')\\\">\\n Pod\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'PodName' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'PodName' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Name')\\\">\\n Name\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Image')\\\">\\n Image\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Image' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Image' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('ImagePullPolicy')\\\">\\n Image Pull Policy\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'ImagePullPolicy' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'ImagePullPolicy' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Status')\\\">\\n Status\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Status' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Status' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Node')\\\">\\n Node\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Node' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Node' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('IP')\\\">\\n Pod IP\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'IP' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'IP' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('CreationDate')\\\">\\n Creation date\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'CreationDate' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'CreationDate' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>Actions</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit: $ctrl.tableKey))\\\"\\n pagination-id=\\\"$ctrl.tableKey\\\"\\n >\\n <td ng-if=\\\"!$ctrl.isPod\\\">{{ item.PodName }}</td>\\n <td>{{ item.Name }}</td>\\n <td title=\\\"{{ item.Image }}\\\">{{ item.Image | truncate: 64 }}</td>\\n <td>{{ item.ImagePullPolicy }}</td>\\n <td\\n ><span class=\\\"label label-{{ item.Status | kubernetesPodStatusColor }}\\\">{{ item.Status }}</span></td\\n >\\n <td>\\n <span ng-if=\\\"item.Node\\\">\\n <a ui-sref=\\\"kubernetes.cluster.node({ name: item.Node })\\\">\\n {{ item.Node }}\\n </a>\\n </span>\\n <span ng-if=\\\"!item.Node\\\">-</span>\\n </td>\\n <td>{{ item.PodIP }}</td>\\n <td>{{ item.CreationDate | getisodate }}</td>\\n <td>\\n <a\\n ng-if=\\\"item.Status === 'Running' && $ctrl.useServerMetrics\\\"\\n ui-sref=\\\"kubernetes.applications.application.stats({ pod: item.PodName, container: item.Name })\\\"\\n style=\\\"margin-right: 10px;\\\"\\n >\\n <i class=\\\"fa fa-chart-area\\\" aria-hidden=\\\"true\\\"></i> Stats\\n </a>\\n <a ui-sref=\\\"kubernetes.applications.application.logs({ pod: item.PodName, container: item.Name })\\\"> <i class=\\\"fa fa-file-alt\\\" aria-hidden=\\\"true\\\"></i> Logs </a>\\n <a ng-if=\\\"item.Status === 'Running'\\\" ui-sref=\\\"kubernetes.applications.application.console({ pod: item.PodName, container: item.Name })\\\" style=\\\"margin-left: 10px;\\\">\\n <i class=\\\"fa fa-terminal\\\" aria-hidden=\\\"true\\\"></i> Console\\n </a>\\n </td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"7\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"7\\\" class=\\\"text-center text-muted\\\">No pod available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\" pagination-id=\\\"$ctrl.tableKey\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./applications-datatable-details.html');\n\nimport angular from 'angular';\nimport controller from './applications-datatable-details.controller';\n\nangular.module('portainer.kubernetes').component('kubernetesApplicationsDatatableDetails', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n configurations: '<',\n },\n});\n","var path = 'app/kubernetes/components/datatables/applications-datatable-details/applications-datatable-details.html';\nvar html = \"<div class=\\\"col-xs-12 form-section-title\\\">\\n Secrets\\n</div>\\n<table style=\\\"width: 50%;\\\">\\n <tbody>\\n <tr>\\n <td>\\n <sensitive-details ng-repeat=\\\"secret in $ctrl.state.secrets\\\" key=\\\"{{ secret.key }}\\\" value=\\\"{{ secret.value }}\\\"> </sensitive-details>\\n </td>\\n </tr>\\n </tbody>\\n</table>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/kubernetes/components/datatables/applications-datatable-url/applications-datatable-url.html';\nvar html = \"<div class=\\\"published-url-container\\\">\\n <div class=\\\"text-muted\\\">\\n Published URL\\n </div>\\n <a ng-href=\\\"{{ $ctrl.publishedUrl }}\\\" target=\\\"_blank\\\" class=\\\"publish-url-link\\\"> <i class=\\\"fa fa-external-link-alt\\\" aria-hidden=\\\"true\\\"></i> {{ $ctrl.publishedUrl }} </a>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/kubernetes/components/datatables/applications-datatable/applicationsDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div ng-if=\\\"$ctrl.isPrimary\\\" class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n <span class=\\\"small text-muted\\\" style=\\\"float: left; margin-top: 5px;\\\" ng-if=\\\"$ctrl.isAdmin && !$ctrl.settings.showSystem\\\">\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n System resources are hidden, this can be changed in the table settings.\\n </span>\\n <div class=\\\"settings\\\" data-cy=\\\"k8sApp-tableSettings\\\">\\n <span class=\\\"setting\\\" ng-class=\\\"{ 'setting-active': $ctrl.settings.open }\\\" uib-dropdown dropdown-append-to-body auto-close=\\\"disabled\\\" is-open=\\\"$ctrl.settings.open\\\">\\n <span uib-dropdown-toggle><i class=\\\"fa fa-cog\\\" aria-hidden=\\\"true\\\"></i> Table settings</span>\\n <div class=\\\"dropdown-menu dropdown-menu-right\\\" uib-dropdown-menu>\\n <div class=\\\"tableMenu\\\">\\n <div class=\\\"menuHeader\\\">\\n Table settings\\n </div>\\n <div class=\\\"menuContent\\\">\\n <div>\\n <div class=\\\"md-checkbox\\\" ng-if=\\\"$ctrl.isAdmin\\\">\\n <input id=\\\"applications_setting_show_system\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.settings.showSystem\\\" ng-change=\\\"$ctrl.onSettingsShowSystemChange()\\\" />\\n <label for=\\\"applications_setting_show_system\\\">Show system resources</label>\\n </div>\\n <div class=\\\"md-checkbox\\\">\\n <input\\n id=\\\"setting_auto_refresh\\\"\\n type=\\\"checkbox\\\"\\n ng-model=\\\"$ctrl.settings.repeater.autoRefresh\\\"\\n ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\"\\n data-cy=\\\"k8sApp-autoRefreshCheckbox\\\"\\n />\\n <label for=\\\"setting_auto_refresh\\\">Auto refresh</label>\\n </div>\\n <div ng-if=\\\"$ctrl.settings.repeater.autoRefresh\\\">\\n <label for=\\\"settings_refresh_rate\\\">\\n Refresh rate\\n </label>\\n <select\\n id=\\\"settings_refresh_rate\\\"\\n ng-model=\\\"$ctrl.settings.repeater.refreshRate\\\"\\n ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\"\\n class=\\\"small-select\\\"\\n data-cy=\\\"k8sApp-refreshRateDropdown\\\"\\n >\\n <option value=\\\"10\\\">10s</option>\\n <option value=\\\"30\\\">30s</option>\\n <option value=\\\"60\\\">1min</option>\\n <option value=\\\"120\\\">2min</option>\\n <option value=\\\"300\\\">5min</option>\\n </select>\\n <span>\\n <i id=\\\"refreshRateChange\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-top: 7px; display: none;\\\"></i>\\n </span>\\n </div>\\n </div>\\n </div>\\n <div>\\n <a type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"$ctrl.settings.open = false;\\\" data-cy=\\\"k8sApp-tableSettingsCloseButton\\\">Close</a>\\n </div>\\n </div>\\n </div>\\n </span>\\n </div>\\n </div>\\n <div ng-if=\\\"$ctrl.isPrimary\\\" class=\\\"actionBar\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-danger\\\"\\n ng-disabled=\\\"$ctrl.state.selectedItemCount === 0\\\"\\n ng-click=\\\"$ctrl.removeAction($ctrl.state.selectedItems)\\\"\\n data-cy=\\\"k8sApp-removeAppButton\\\"\\n >\\n <i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Remove\\n </button>\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ui-sref=\\\"kubernetes.applications.new\\\" data-cy=\\\"k8sApp-addApplicationButton\\\">\\n <i class=\\\"fa fa-plus space-right\\\" aria-hidden=\\\"true\\\"></i>Add application with form\\n </button>\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ui-sref=\\\"kubernetes.deploy\\\" data-cy=\\\"k8sApp-deployFromManifestButton\\\">\\n <i class=\\\"fa fa-plus space-right\\\" aria-hidden=\\\"true\\\"></i>Create from manifest\\n </button>\\n </div>\\n <div ng-if=\\\"$ctrl.isPrimary\\\" class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n auto-focus\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n data-cy=\\\"k8sApp-searchApplicationsInput\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\" data-cy=\\\"k8sApp-appTable\\\">\\n <thead ng-class=\\\"{ 'secondary-heading': !$ctrl.isPrimary }\\\">\\n <tr>\\n <th class=\\\"datatable-wide\\\">\\n <span ng-if=\\\"$ctrl.isPrimary\\\">\\n <span class=\\\"md-checkbox\\\">\\n <input id=\\\"select_all\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.state.selectAll\\\" ng-change=\\\"$ctrl.selectAll()\\\" data-cy=\\\"k8sApp-selectAllCheckbox\\\" />\\n <label for=\\\"select_all\\\"></label>\\n </span>\\n <a ng-click=\\\"$ctrl.expandAll()\\\">\\n <i ng-class=\\\"{ 'fas fa-angle-down': $ctrl.state.expandAll, 'fas fa-angle-right': !$ctrl.state.expandAll }\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </span>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Name')\\\">\\n Name\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('StackName')\\\">\\n Stack\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'StackName' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'StackName' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('ResourcePool')\\\">\\n Namespace\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'ResourcePool' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'ResourcePool' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Image')\\\">\\n Image\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Image' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Image' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th uib-dropdown dropdown-append-to-body auto-close=\\\"disabled\\\" is-open=\\\"$ctrl.filters.state.open\\\">\\n <a ng-click=\\\"$ctrl.changeOrderBy('ApplicationType')\\\">\\n Application Type\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'ApplicationType' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'ApplicationType' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n <div>\\n <span uib-dropdown-toggle class=\\\"table-filter\\\" ng-if=\\\"!$ctrl.filters.state.enabled\\\">Filter <i class=\\\"fa fa-filter\\\" aria-hidden=\\\"true\\\"></i></span>\\n <span uib-dropdown-toggle class=\\\"table-filter filter-active\\\" ng-if=\\\"$ctrl.filters.state.enabled\\\">Filter <i class=\\\"fa fa-check\\\" aria-hidden=\\\"true\\\"></i></span>\\n </div>\\n <div class=\\\"dropdown-menu\\\" uib-dropdown-menu>\\n <div class=\\\"tableMenu\\\">\\n <div class=\\\"menuHeader\\\">\\n Filter by application type\\n </div>\\n <div class=\\\"menuContent\\\">\\n <div class=\\\"md-checkbox\\\" ng-repeat=\\\"filter in $ctrl.filters.state.values track by $index\\\">\\n <input id=\\\"filter_state_{{ $index }}\\\" type=\\\"checkbox\\\" ng-model=\\\"filter.display\\\" ng-change=\\\"$ctrl.onStateFilterChange()\\\" />\\n <label for=\\\"filter_state_{{ $index }}\\\">{{ filter.type | kubernetesApplicationTypeText }}</label>\\n </div>\\n </div>\\n <div>\\n <a type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"$ctrl.filters.state.open = false;\\\">Close</a>\\n </div>\\n </div>\\n </div>\\n </th>\\n <th>\\n Status\\n </th>\\n <th>\\n Publishing mode\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('CreationDate')\\\">\\n Created\\n <i class=\\\"fa fa-sort-numeric-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'CreationDate' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-numeric-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'CreationDate' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n ng-click=\\\"$ctrl.expandItem(item, !$ctrl.isItemExpanded(item))\\\"\\n dir-paginate-start=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.applyFilters | filter:$ctrl.state.textFilter | filter:$ctrl.isDisplayed | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit: $ctrl.tableKey))\\\"\\n ng-class=\\\"{ active: item.Checked, interactive: $ctrl.isExpandable(item), 'secondary-body': !$ctrl.isPrimary }\\\"\\n pagination-id=\\\"$ctrl.tableKey\\\"\\n >\\n <td>\\n <span ng-if=\\\"$ctrl.isPrimary\\\" class=\\\"md-checkbox\\\">\\n <input\\n id=\\\"select_{{ $index }}\\\"\\n type=\\\"checkbox\\\"\\n ng-model=\\\"item.Checked\\\"\\n ng-click=\\\"$ctrl.selectItem(item, $event); $event.stopPropagation()\\\"\\n ng-disabled=\\\"$ctrl.isSystemNamespace(item)\\\"\\n />\\n <label for=\\\"select_{{ $index }}\\\"></label>\\n </span>\\n <a ng-if=\\\"$ctrl.isExpandable(item)\\\">\\n <i ng-class=\\\"{ 'fas fa-angle-down': $ctrl.isItemExpanded(item), 'fas fa-angle-right': !$ctrl.isItemExpanded(item) }\\\" class=\\\"space-right\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </td>\\n <td>\\n <a ng-if=\\\"item.KubernetesApplications\\\" ui-sref=\\\"kubernetes.helm({ name: item.Name, namespace: item.ResourcePool })\\\" ng-click=\\\"$event.stopPropagation()\\\"\\n >{{ item.Name }}\\n </a>\\n <a\\n ng-if=\\\"!item.KubernetesApplications\\\"\\n ui-sref=\\\"kubernetes.applications.application({ name: item.Name, namespace: item.ResourcePool })\\\"\\n ng-click=\\\"$event.stopPropagation()\\\"\\n >{{ item.Name }}\\n </a>\\n <span class=\\\"label label-info image-tag label-margins\\\" ng-if=\\\"$ctrl.isSystemNamespace(item)\\\">system</span>\\n <span class=\\\"label label-primary image-tag label-margins\\\" ng-if=\\\"!$ctrl.isSystemNamespace(item) && $ctrl.isExternalApplication(item)\\\">external</span>\\n </td>\\n <td>{{ item.StackName || '-' }}</td>\\n <td>\\n <a ui-sref=\\\"kubernetes.resourcePools.resourcePool({ id: item.ResourcePool })\\\" ng-click=\\\"$event.stopPropagation()\\\">{{ item.ResourcePool }}</a>\\n </td>\\n <td title=\\\"{{ item.Image }}\\\"\\n >{{ item.Image | truncate: 64 }} <span ng-if=\\\"item.Containers.length > 1\\\">+ {{ item.Containers.length - 1 }}</span></td\\n >\\n <td>{{ item.ApplicationType | kubernetesApplicationTypeText }}</td>\\n <td ng-if=\\\"item.ApplicationType !== $ctrl.KubernetesApplicationTypes.POD\\\">\\n <status-indicator ok=\\\"(item.TotalPodsCount > 0 && item.TotalPodsCount === item.RunningPodsCount) || item.Status === 'Ready'\\\"></status-indicator>\\n <span ng-if=\\\"item.DeploymentType === $ctrl.KubernetesApplicationDeploymentTypes.REPLICATED\\\">Replicated</span>\\n <span ng-if=\\\"item.DeploymentType === $ctrl.KubernetesApplicationDeploymentTypes.GLOBAL\\\">Global</span>\\n <span ng-if=\\\"item.RunningPodsCount >= 0 && item.TotalPodsCount >= 0\\\">\\n <code>{{ item.RunningPodsCount }}</code> / <code>{{ item.TotalPodsCount }}</code>\\n </span>\\n <span ng-if=\\\"item.KubernetesApplications\\\">{{ item.Status }}</span>\\n </td>\\n <td ng-if=\\\"item.ApplicationType === $ctrl.KubernetesApplicationTypes.POD\\\">\\n {{ item.Pods[0].Status }}\\n </td>\\n <td>\\n <span ng-if=\\\"item.PublishedPorts.length\\\">\\n <span>\\n <a ng-click=\\\"$ctrl.onPublishingModeClick(item); $event.stopPropagation()\\\">\\n <i class=\\\"fa {{ item.ServiceType | kubernetesApplicationServiceTypeIcon }}\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"> </i>\\n {{ item.ServiceType | kubernetesApplicationServiceTypeText }}\\n </a>\\n </span>\\n </span>\\n <span ng-if=\\\"item.PublishedPorts.length === 0\\\">-</span>\\n </td>\\n <td>{{ item.CreationDate | getisodate }} {{ item.ApplicationOwner ? 'by ' + item.ApplicationOwner : '' }}</td>\\n </tr>\\n <tr dir-paginate-end ng-show=\\\"$ctrl.isExpandable(item) && $ctrl.isItemExpanded(item)\\\" ng-class=\\\"{ 'secondary-body': $ctrl.isPrimary && !item.KubernetesApplications }\\\">\\n <td></td>\\n <td colspan=\\\"8\\\" class=\\\"datatable-padding-vertical\\\">\\n <span ng-if=\\\"item.KubernetesApplications\\\">\\n <kubernetes-applications-datatable\\n dataset=\\\"item.KubernetesApplications\\\"\\n table-key=\\\"{{ item.Id }}_table\\\"\\n settings-key=\\\"{{ $ctrl.tableKey }}\\\"\\n order-by=\\\"Name\\\"\\n remove-action=\\\"$ctrl.removeAction\\\"\\n refresh-callback=\\\"$ctrl.refreshCallback\\\"\\n on-publishing-mode-click=\\\"($ctrl.onPublishingModeClick)\\\"\\n is-primary=\\\"false\\\"\\n >\\n </kubernetes-applications-datatable>\\n </span>\\n <span ng-if=\\\"!item.KubernetesApplications\\\">\\n <kubernetes-applications-datatable-url\\n ng-if=\\\"$ctrl.getPublishedUrl(item)\\\"\\n published-url=\\\"{{ $ctrl.getPublishedUrl(item) }}\\\"\\n ></kubernetes-applications-datatable-url>\\n <kubernetes-applications-datatable-details\\n ng-if=\\\"$ctrl.hasConfigurationSecrets(item)\\\"\\n configurations=\\\"item.Configurations\\\"\\n ></kubernetes-applications-datatable-details>\\n </span>\\n </td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"8\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"8\\\" class=\\\"text-center text-muted\\\">No application available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div ng-if=\\\"$ctrl.isPrimary\\\" class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\" pagination-id=\\\"$ctrl.tableKey\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import _ from 'lodash-es';\nimport { KubernetesApplicationDeploymentTypes, KubernetesApplicationTypes } from 'Kubernetes/models/application/models';\nimport KubernetesApplicationHelper from 'Kubernetes/helpers/application';\nimport KubernetesNamespaceHelper from 'Kubernetes/helpers/namespaceHelper';\nimport { KubernetesConfigurationTypes } from 'Kubernetes/models/configuration/models';\n\nangular.module('portainer.docker').controller('KubernetesApplicationsDatatableController', [\n '$scope',\n '$controller',\n 'DatatableService',\n 'Authentication',\n function ($scope, $controller, DatatableService, Authentication) {\n angular.extend(this, $controller('GenericDatatableController', { $scope: $scope }));\n\n const ctrl = this;\n\n this.settings = Object.assign(this.settings, {\n showSystem: false,\n });\n\n this.state = Object.assign(this.state, {\n expandAll: false,\n expandedItems: [],\n });\n\n this.filters = {\n state: {\n open: false,\n enabled: false,\n values: [],\n },\n };\n\n this.expandAll = function () {\n this.state.expandAll = !this.state.expandAll;\n this.state.filteredDataSet.forEach((item) => this.expandItem(item, this.state.expandAll));\n };\n\n this.isItemExpanded = function (item) {\n return this.state.expandedItems.includes(item.Id);\n };\n\n this.isExpandable = function (item) {\n return item.KubernetesApplications || this.hasConfigurationSecrets(item) || !!this.getPublishedUrl(item).length;\n };\n\n this.expandItem = function (item, expanded) {\n // collapse item\n if (!expanded) {\n this.state.expandedItems = this.state.expandedItems.filter((id) => id !== item.Id);\n // expanded item\n } else if (expanded && !this.state.expandedItems.includes(item.Id)) {\n this.state.expandedItems = [...this.state.expandedItems, item.Id];\n }\n DatatableService.setDataTableExpandedItems(this.tableKey, this.state.expandedItems);\n };\n\n this.expandItems = function (storedExpandedItems) {\n this.state.expandedItems = storedExpandedItems;\n if (this.state.expandedItems.length === this.dataset.length) {\n this.state.expandAll = true;\n }\n };\n\n this.onDataRefresh = function () {\n const storedExpandedItems = DatatableService.getDataTableExpandedItems(this.tableKey);\n if (storedExpandedItems !== null) {\n this.expandItems(storedExpandedItems);\n }\n };\n\n this.onSettingsShowSystemChange = function () {\n DatatableService.setDataTableSettings(this.tableKey, this.settings);\n };\n\n this.isExternalApplication = function (item) {\n return KubernetesApplicationHelper.isExternalApplication(item);\n };\n\n this.isSystemNamespace = function (item) {\n // if all charts in a helm app/release are in the system namespace\n if (item.KubernetesApplications && item.KubernetesApplications.length > 0) {\n return item.KubernetesApplications.some((app) => KubernetesNamespaceHelper.isSystemNamespace(app.ResourcePool));\n }\n return KubernetesNamespaceHelper.isSystemNamespace(item.ResourcePool);\n };\n\n this.isDisplayed = function (item) {\n return !ctrl.isSystemNamespace(item) || ctrl.settings.showSystem;\n };\n\n this.getPublishedUrl = function (item) {\n // Map all ingress rules in published ports to their respective URLs\n const ingressUrls = item.PublishedPorts.flatMap((pp) => pp.IngressRules)\n .filter(({ Host, IP }) => Host || IP)\n .map(({ Host, IP, Port, Path }) => {\n let scheme = Port === 443 ? 'https' : 'http';\n let urlPort = Port === 80 || Port === 443 ? '' : `:${Port}`;\n return `${scheme}://${Host || IP}${urlPort}${Path}`;\n });\n\n // Map all load balancer service ports to ip address\n let loadBalancerURLs = [];\n if (item.LoadBalancerIPAddress) {\n loadBalancerURLs = item.PublishedPorts.map((pp) => `http://${item.LoadBalancerIPAddress}:${pp.Port}`);\n }\n\n // combine ingress urls\n const publishedUrls = [...ingressUrls, ...loadBalancerURLs];\n\n // Return the first URL - priority given to ingress urls, then services (load balancers)\n return publishedUrls.length > 0 ? publishedUrls[0] : '';\n };\n\n this.hasConfigurationSecrets = function (item) {\n return item.Configurations && item.Configurations.some((config) => config.Data && config.Type === KubernetesConfigurationTypes.SECRET);\n };\n\n /**\n * Do not allow applications in system namespaces to be selected\n */\n this.allowSelection = function (item) {\n return !this.isSystemNamespace(item);\n };\n\n this.applyFilters = function (item) {\n return ctrl.filters.state.values.some((filter) => item.ApplicationType === filter.type && filter.display);\n };\n\n this.onStateFilterChange = function () {\n this.filters.state.enabled = this.filters.state.values.some((filter) => !filter.display);\n };\n\n this.prepareTableFromDataset = function () {\n const availableTypeFilters = this.dataset.map((item) => ({ type: item.ApplicationType, display: true }));\n this.filters.state.values = _.uniqBy(availableTypeFilters, 'type');\n };\n\n this.$onInit = function () {\n this.isAdmin = Authentication.isAdmin();\n this.KubernetesApplicationDeploymentTypes = KubernetesApplicationDeploymentTypes;\n this.KubernetesApplicationTypes = KubernetesApplicationTypes;\n this.setDefaults();\n this.prepareTableFromDataset();\n\n this.state.orderBy = this.orderBy;\n const storedOrder = DatatableService.getDataTableOrder(this.tableKey);\n if (storedOrder !== null) {\n this.state.reverseOrder = storedOrder.reverse;\n this.state.orderBy = storedOrder.orderBy;\n }\n\n const textFilter = DatatableService.getDataTableTextFilters(this.tableKey);\n if (textFilter !== null) {\n this.state.textFilter = textFilter;\n this.onTextFilterChange();\n }\n\n const storedFilters = DatatableService.getDataTableFilters(this.tableKey);\n if (storedFilters !== null) {\n this.filters = storedFilters;\n }\n if (this.filters && this.filters.state) {\n this.filters.state.open = false;\n }\n\n const storedExpandedItems = DatatableService.getDataTableExpandedItems(this.tableKey);\n if (storedExpandedItems !== null) {\n this.expandItems(storedExpandedItems);\n }\n\n const storedSettings = DatatableService.getDataTableSettings(this.settingsKey);\n if (storedSettings !== null) {\n this.settings = storedSettings;\n this.settings.open = false;\n }\n this.onSettingsRepeaterChange();\n };\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./applicationsPortsDatatable.html');\n\nangular.module('portainer.kubernetes').component('kubernetesApplicationsPortsDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'KubernetesApplicationsPortsDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n refreshCallback: '<',\n },\n});\n","var path = 'app/kubernetes/components/datatables/applications-ports-datatable/applicationsPortsDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n <span class=\\\"small text-muted\\\" style=\\\"float: left; margin-top: 5px;\\\" ng-if=\\\"$ctrl.isAdmin && !$ctrl.settings.showSystem\\\">\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n System resources are hidden, this can be changed in the table settings.\\n </span>\\n <div class=\\\"settings\\\">\\n <span class=\\\"setting\\\" ng-class=\\\"{ 'setting-active': $ctrl.settings.open }\\\" uib-dropdown dropdown-append-to-body auto-close=\\\"disabled\\\" is-open=\\\"$ctrl.settings.open\\\">\\n <span uib-dropdown-toggle><i class=\\\"fa fa-cog\\\" aria-hidden=\\\"true\\\"></i> Table settings</span>\\n <div class=\\\"dropdown-menu dropdown-menu-right\\\" uib-dropdown-menu>\\n <div class=\\\"tableMenu\\\">\\n <div class=\\\"menuHeader\\\">\\n Table settings\\n </div>\\n <div class=\\\"menuContent\\\">\\n <div>\\n <div class=\\\"md-checkbox\\\" ng-if=\\\"$ctrl.isAdmin\\\">\\n <input id=\\\"ports_setting_show_system\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.settings.showSystem\\\" ng-change=\\\"$ctrl.onSettingsShowSystemChange()\\\" />\\n <label for=\\\"ports_setting_show_system\\\">Show system resources</label>\\n </div>\\n <div class=\\\"md-checkbox\\\">\\n <input id=\\\"setting_auto_refresh\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.settings.repeater.autoRefresh\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" />\\n <label for=\\\"setting_auto_refresh\\\">Auto refresh</label>\\n </div>\\n <div ng-if=\\\"$ctrl.settings.repeater.autoRefresh\\\">\\n <label for=\\\"settings_refresh_rate\\\">\\n Refresh rate\\n </label>\\n <select id=\\\"settings_refresh_rate\\\" ng-model=\\\"$ctrl.settings.repeater.refreshRate\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" class=\\\"small-select\\\">\\n <option value=\\\"10\\\">10s</option>\\n <option value=\\\"30\\\">30s</option>\\n <option value=\\\"60\\\">1min</option>\\n <option value=\\\"120\\\">2min</option>\\n <option value=\\\"300\\\">5min</option>\\n </select>\\n <span>\\n <i id=\\\"refreshRateChange\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-top: 7px; display: none;\\\"></i>\\n </span>\\n </div>\\n </div>\\n </div>\\n <div>\\n <a type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"$ctrl.settings.open = false;\\\">Close</a>\\n </div>\\n </div>\\n </div>\\n </span>\\n </div>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n auto-focus\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th>\\n <a ng-click=\\\"$ctrl.expandAll()\\\" ng-if=\\\"$ctrl.hasExpandableItems()\\\">\\n <i ng-class=\\\"{ 'fas fa-angle-down': $ctrl.state.expandAll, 'fas fa-angle-right': !$ctrl.state.expandAll }\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Name')\\\">\\n Application\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n Publishing mode\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('TargetPort')\\\">\\n Exposed port\\n <i class=\\\"fa fa-sort-numeric-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'TargetPort' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-numeric-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'TargetPort' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Port')\\\">\\n Container port\\n <i class=\\\"fa fa-sort-numeric-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Port' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-numeric-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Port' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n HTTP route\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <!-- main rows -->\\n <!-- dir-paginate-start track by $index -->\\n <tr\\n dir-paginate-start=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | filter: $ctrl.isDisplayed | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit: $ctrl.tableKey))\\\"\\n ng-class=\\\"{ active: item.Checked, 'datatable-highlighted': item.Highlighted }\\\"\\n ng-click=\\\"$ctrl.expandItem(item, !item.Expanded)\\\"\\n pagination-id=\\\"$ctrl.tableKey\\\"\\n >\\n <!-- expandable -->\\n <td>\\n <a ng-if=\\\"$ctrl.itemCanExpand(item)\\\">\\n <i ng-class=\\\"{ 'fas fa-angle-down': item.Expanded, 'fas fa-angle-right': !item.Expanded }\\\" class=\\\"space-right\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </td>\\n <!-- Application -->\\n <td>\\n <a ui-sref=\\\"kubernetes.applications.application({ name: item.Name, namespace: item.ResourcePool })\\\">{{ item.Name }}</a>\\n <span class=\\\"label label-info image-tag label-margins\\\" ng-if=\\\"$ctrl.isSystemNamespace(item)\\\">system</span>\\n <span class=\\\"label label-primary image-tag label-margins\\\" ng-if=\\\"!$ctrl.isSystemNamespace(item) && $ctrl.isExternalApplication(item)\\\">external</span>\\n </td>\\n <!-- Publishing mode -->\\n <td>\\n <!-- LB -->\\n <span ng-if=\\\"item.ServiceType === $ctrl.KubernetesServiceTypes.LOAD_BALANCER\\\">\\n <span> <i class=\\\"fa fa-project-diagram\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> LoadBalancer </span>\\n <span class=\\\"text-muted small\\\" style=\\\"margin-left: 5px;\\\">\\n <span ng-if=\\\"item.LoadBalancerIPAddress\\\">{{ item.LoadBalancerIPAddress }}</span>\\n <span ng-if=\\\"!item.LoadBalancerIPAddress\\\">pending</span>\\n </span>\\n </span>\\n <!-- Internal -->\\n <span ng-if=\\\"item.ServiceType === $ctrl.KubernetesServiceTypes.CLUSTER_IP\\\">\\n <i class=\\\"fa fa-list-alt\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> ClusterIP\\n </span>\\n <!-- Cluster -->\\n <span ng-if=\\\"item.ServiceType === $ctrl.KubernetesServiceTypes.NODE_PORT\\\"> <i class=\\\"fa fa-list\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> NodePort </span>\\n </td>\\n <!-- Exposed port -->\\n <td>\\n <span ng-if=\\\"!$ctrl.itemCanExpand(item)\\\">\\n {{ item.Ports[0].Port }}\\n <a ng-if=\\\"item.LoadBalancerIPAddress\\\" ng-href=\\\"http://{{ item.LoadBalancerIPAddress }}:{{ item.Ports[0].Port }}\\\" target=\\\"_blank\\\" style=\\\"margin-left: 5px;\\\">\\n <i class=\\\"fa fa-external-link-alt\\\" aria-hidden=\\\"true\\\"></i> access\\n </a>\\n </span>\\n </td>\\n <!-- Container port -->\\n <td>\\n <span ng-if=\\\"!$ctrl.itemCanExpand(item)\\\"> {{ item.Ports[0].TargetPort }}/{{ item.Ports[0].Protocol }} </span>\\n </td>\\n <!-- HTTP route -->\\n <td>\\n <span ng-if=\\\"!$ctrl.itemCanExpand(item)\\\">\\n <span ng-if=\\\"!$ctrl.portHasIngressRules(item.Ports[0])\\\">-</span>\\n <span ng-if=\\\"$ctrl.portHasIngressRules(item.Ports[0])\\\">\\n <span\\n ng-if=\\\"!$ctrl.ruleCanBeDisplayed(item.Ports[0].IngressRules[0])\\\"\\n class=\\\"text-muted\\\"\\n tooltip-append-to-body=\\\"true\\\"\\n tooltip-placement=\\\"bottom\\\"\\n tooltip-class=\\\"portainer-tooltip\\\"\\n uib-tooltip=\\\"Ingress controller IP address not available yet\\\"\\n style=\\\"cursor: pointer;\\\"\\n >pending\\n </span>\\n <span ng-if=\\\"$ctrl.ruleCanBeDisplayed(item.Ports[0].IngressRules[0])\\\">\\n <a ng-href=\\\"{{ $ctrl.buildIngressRuleURL(item.Ports[0].IngressRules[0]) }}\\\" target=\\\"_blank\\\">\\n {{ $ctrl.buildIngressRuleURL(item.Ports[0].IngressRules[0]) | stripprotocol }}\\n </a>\\n </span>\\n </span>\\n </span>\\n </td>\\n </tr>\\n <!-- sub rows -->\\n <tr ng-show=\\\"item.Expanded\\\" ng-repeat-start=\\\"port in item.Ports\\\" ng-class=\\\"{ 'datatable-highlighted': item.Highlighted, 'datatable-unhighlighted': !item.Highlighted }\\\">\\n <td ng-if=\\\"!$ctrl.portHasIngressRules(port)\\\"></td>\\n <td ng-if=\\\"!$ctrl.portHasIngressRules(port)\\\">-</td>\\n <td ng-if=\\\"!$ctrl.portHasIngressRules(port)\\\">-</td>\\n <td ng-if=\\\"!$ctrl.portHasIngressRules(port)\\\">\\n {{ port.Port }}\\n <a ng-if=\\\"item.LoadBalancerIPAddress\\\" ng-href=\\\"http://{{ item.LoadBalancerIPAddress }}:{{ port.Port }}\\\" target=\\\"_blank\\\" style=\\\"margin-left: 5px;\\\">\\n <i class=\\\"fa fa-external-link-alt\\\" aria-hidden=\\\"true\\\"></i> access\\n </a>\\n </td>\\n <td ng-if=\\\"!$ctrl.portHasIngressRules(port)\\\">{{ port.TargetPort }}/{{ port.Protocol }}</td>\\n <td ng-if=\\\"!$ctrl.portHasIngressRules(port)\\\">-</td>\\n </tr>\\n <tr\\n ng-show=\\\"item.Expanded\\\"\\n ng-repeat-end\\n ng-repeat=\\\"rule in port.IngressRules\\\"\\n ng-class=\\\"{ 'datatable-highlighted': item.Highlighted, 'datatable-unhighlighted': !item.Highlighted }\\\"\\n >\\n <td></td>\\n <td>-</td>\\n <td>-</td>\\n <td>\\n {{ port.Port }}\\n <a ng-if=\\\"item.LoadBalancerIPAddress\\\" ng-href=\\\"http://{{ item.LoadBalancerIPAddress }}:{{ port.Port }}\\\" target=\\\"_blank\\\" style=\\\"margin-left: 5px;\\\">\\n <i class=\\\"fa fa-external-link-alt\\\" aria-hidden=\\\"true\\\"></i> access\\n </a>\\n </td>\\n <td>{{ port.TargetPort }}/{{ port.Protocol }}</td>\\n <td>\\n <span\\n ng-if=\\\"!$ctrl.ruleCanBeDisplayed(rule)\\\"\\n class=\\\"text-muted\\\"\\n tooltip-append-to-body=\\\"true\\\"\\n tooltip-placement=\\\"bottom\\\"\\n tooltip-class=\\\"portainer-tooltip\\\"\\n uib-tooltip=\\\"Ingress controller IP address not available yet\\\"\\n style=\\\"cursor: pointer;\\\"\\n >pending\\n </span>\\n <span ng-if=\\\"$ctrl.ruleCanBeDisplayed(rule)\\\">\\n <a ng-href=\\\"{{ $ctrl.buildIngressRuleURL(rule) }}\\\" target=\\\"_blank\\\">\\n {{ $ctrl.buildIngressRuleURL(rule) | stripprotocol }}\\n </a>\\n </span>\\n </td>\\n </tr>\\n <tr dir-paginate-end></tr>\\n <!-- no dataset -->\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"6\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <!-- no values in filtered dataset -->\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"6\\\" class=\\\"text-center text-muted\\\">No application port mapping available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\" pagination-id=\\\"$ctrl.tableKey\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import _ from 'lodash-es';\nimport { KubernetesApplicationDeploymentTypes } from 'Kubernetes/models/application/models';\nimport KubernetesApplicationHelper from 'Kubernetes/helpers/application';\nimport KubernetesNamespaceHelper from 'Kubernetes/helpers/namespaceHelper';\nimport { KubernetesServiceTypes } from 'Kubernetes/models/service/models';\n\nangular.module('portainer.docker').controller('KubernetesApplicationsPortsDatatableController', [\n '$scope',\n '$controller',\n 'DatatableService',\n 'Authentication',\n function ($scope, $controller, DatatableService, Authentication) {\n angular.extend(this, $controller('GenericDatatableController', { $scope: $scope }));\n this.state = Object.assign(this.state, {\n expandedItems: [],\n expandAll: false,\n });\n\n var ctrl = this;\n this.KubernetesServiceTypes = KubernetesServiceTypes;\n\n this.settings = Object.assign(this.settings, {\n showSystem: false,\n });\n\n this.onSettingsShowSystemChange = function () {\n DatatableService.setDataTableSettings(this.tableKey, this.settings);\n };\n\n this.isExternalApplication = function (item) {\n return KubernetesApplicationHelper.isExternalApplication(item);\n };\n\n this.isSystemNamespace = function (item) {\n return KubernetesNamespaceHelper.isSystemNamespace(item.ResourcePool);\n };\n\n this.isDisplayed = function (item) {\n return !ctrl.isSystemNamespace(item) || ctrl.settings.showSystem;\n };\n\n this.expandItem = function (item, expanded) {\n if (!this.itemCanExpand(item)) {\n return;\n }\n\n item.Expanded = expanded;\n if (!expanded) {\n item.Highlighted = false;\n }\n };\n\n this.itemCanExpand = function (item) {\n return item.Ports.length > 1 || item.Ports[0].IngressRules.length > 1;\n };\n\n this.buildIngressRuleURL = function (rule) {\n const hostname = rule.Host ? rule.Host : rule.IP;\n return 'http://' + hostname + rule.Path;\n };\n\n this.portHasIngressRules = function (port) {\n return port.IngressRules.length > 0;\n };\n\n this.ruleCanBeDisplayed = function (rule) {\n return !rule.Host && !rule.IP ? false : true;\n };\n\n this.hasExpandableItems = function () {\n return _.filter(this.state.filteredDataSet, (item) => this.itemCanExpand(item)).length;\n };\n\n this.expandAll = function () {\n this.state.expandAll = !this.state.expandAll;\n _.forEach(this.state.filteredDataSet, (item) => {\n if (this.itemCanExpand(item)) {\n this.expandItem(item, this.state.expandAll);\n }\n });\n };\n\n this.$onInit = function () {\n this.isAdmin = Authentication.isAdmin();\n this.KubernetesApplicationDeploymentTypes = KubernetesApplicationDeploymentTypes;\n this.setDefaults();\n this.prepareTableFromDataset();\n\n this.state.orderBy = this.orderBy;\n var storedOrder = DatatableService.getDataTableOrder(this.tableKey);\n if (storedOrder !== null) {\n this.state.reverseOrder = storedOrder.reverse;\n this.state.orderBy = storedOrder.orderBy;\n }\n\n var textFilter = DatatableService.getDataTableTextFilters(this.tableKey);\n if (textFilter !== null) {\n this.state.textFilter = textFilter;\n this.onTextFilterChange();\n }\n\n var storedFilters = DatatableService.getDataTableFilters(this.tableKey);\n if (storedFilters !== null) {\n this.filters = storedFilters;\n }\n if (this.filters && this.filters.state) {\n this.filters.state.open = false;\n }\n\n var storedSettings = DatatableService.getDataTableSettings(this.tableKey);\n if (storedSettings !== null) {\n this.settings = storedSettings;\n this.settings.open = false;\n }\n this.onSettingsRepeaterChange();\n };\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./applicationsStacksDatatable.html');\n\nangular.module('portainer.kubernetes').component('kubernetesApplicationsStacksDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'KubernetesApplicationsStacksDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n refreshCallback: '<',\n removeAction: '<',\n },\n});\n","var path = 'app/kubernetes/components/datatables/applications-stacks-datatable/applicationsStacksDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n <span class=\\\"small text-muted\\\" style=\\\"float: left; margin-top: 5px;\\\" ng-if=\\\"$ctrl.isAdmin && !$ctrl.settings.showSystem\\\">\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n System resources are hidden, this can be changed in the table settings.\\n </span>\\n <div class=\\\"settings\\\">\\n <span class=\\\"setting\\\" ng-class=\\\"{ 'setting-active': $ctrl.settings.open }\\\" uib-dropdown dropdown-append-to-body auto-close=\\\"disabled\\\" is-open=\\\"$ctrl.settings.open\\\">\\n <span uib-dropdown-toggle><i class=\\\"fa fa-cog\\\" aria-hidden=\\\"true\\\"></i> Table settings</span>\\n <div class=\\\"dropdown-menu dropdown-menu-right\\\" uib-dropdown-menu>\\n <div class=\\\"tableMenu\\\">\\n <div class=\\\"menuHeader\\\">\\n Table settings\\n </div>\\n <div class=\\\"menuContent\\\">\\n <div>\\n <div class=\\\"md-checkbox\\\" ng-if=\\\"$ctrl.isAdmin\\\">\\n <input id=\\\"stacks_setting_show_system\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.settings.showSystem\\\" ng-change=\\\"$ctrl.onSettingsShowSystemChange()\\\" />\\n <label for=\\\"stacks_setting_show_system\\\">Show system resources</label>\\n </div>\\n <div class=\\\"md-checkbox\\\">\\n <input id=\\\"setting_auto_refresh\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.settings.repeater.autoRefresh\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" />\\n <label for=\\\"setting_auto_refresh\\\">Auto refresh</label>\\n </div>\\n <div ng-if=\\\"$ctrl.settings.repeater.autoRefresh\\\">\\n <label for=\\\"settings_refresh_rate\\\">\\n Refresh rate\\n </label>\\n <select id=\\\"settings_refresh_rate\\\" ng-model=\\\"$ctrl.settings.repeater.refreshRate\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" class=\\\"small-select\\\">\\n <option value=\\\"10\\\">10s</option>\\n <option value=\\\"30\\\">30s</option>\\n <option value=\\\"60\\\">1min</option>\\n <option value=\\\"120\\\">2min</option>\\n <option value=\\\"300\\\">5min</option>\\n </select>\\n <span>\\n <i id=\\\"refreshRateChange\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-top: 7px; display: none;\\\"></i>\\n </span>\\n </div>\\n </div>\\n </div>\\n <div>\\n <a type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"$ctrl.settings.open = false;\\\">Close</a>\\n </div>\\n </div>\\n </div>\\n </span>\\n </div>\\n </div>\\n <div class=\\\"actionBar\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-danger\\\" ng-disabled=\\\"$ctrl.state.selectedItemCount === 0\\\" ng-click=\\\"$ctrl.removeAction($ctrl.state.selectedItems)\\\">\\n <i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Remove\\n </button>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n auto-focus\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th style=\\\"width: 55px;\\\">\\n <span class=\\\"md-checkbox\\\">\\n <input id=\\\"select_all\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.state.selectAll\\\" ng-change=\\\"$ctrl.selectAll()\\\" />\\n <label for=\\\"select_all\\\"></label>\\n </span>\\n <a ng-click=\\\"$ctrl.expandAll()\\\" ng-if=\\\"$ctrl.hasExpandableItems()\\\">\\n <i ng-class=\\\"{ 'fas fa-angle-down': $ctrl.state.expandAll, 'fas fa-angle-right': !$ctrl.state.expandAll }\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Name')\\\">\\n Stack\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('ResourcePool')\\\">\\n Namespace\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'ResourcePool' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'ResourcePool' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Applications.length')\\\">\\n Applications\\n <i class=\\\"fa fa-sort-numeric-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Applications.length' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-numeric-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Applications.length' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n Actions\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate-start=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | filter: $ctrl.isDisplayed | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit: $ctrl.tableKey))\\\"\\n ng-class=\\\"{ active: item.Checked, 'datatable-highlighted': item.Highlighted }\\\"\\n ng-click=\\\"$ctrl.expandItem(item, !item.Expanded)\\\"\\n pagination-id=\\\"$ctrl.tableKey\\\"\\n >\\n <td>\\n <span class=\\\"md-checkbox\\\">\\n <input\\n id=\\\"select_{{ $index }}\\\"\\n type=\\\"checkbox\\\"\\n ng-model=\\\"item.Checked\\\"\\n ng-click=\\\"$ctrl.selectItem(item, $event); $event.stopPropagation();\\\"\\n ng-disabled=\\\"!$ctrl.allowSelection(item)\\\"\\n />\\n <label for=\\\"select_{{ $index }}\\\"></label>\\n </span>\\n <a ng-if=\\\"$ctrl.itemCanExpand(item)\\\">\\n <i ng-class=\\\"{ 'fas fa-angle-down': item.Expanded, 'fas fa-angle-right': !item.Expanded }\\\" class=\\\"space-right\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </td>\\n <td>\\n {{ item.Name }}\\n </td>\\n <td>\\n <a ui-sref=\\\"kubernetes.resourcePools.resourcePool({ id: item.ResourcePool })\\\" ng-click=\\\"$event.stopPropagation();\\\">{{ item.ResourcePool }}</a>\\n <span class=\\\"label label-info image-tag label-margins\\\" ng-if=\\\"$ctrl.isSystemNamespace(item.ResourcePool)\\\">system</span>\\n </td>\\n <td>{{ item.Applications.length }}</td>\\n <td>\\n <a ui-sref=\\\"kubernetes.stacks.stack.logs({ namespace: item.ResourcePool, name: item.Name })\\\"> <i class=\\\"fa fa-file-alt\\\" aria-hidden=\\\"true\\\"></i> Logs </a>\\n </td>\\n </tr>\\n <tr\\n dir-paginate-end\\n ng-show=\\\"item.Expanded\\\"\\n ng-repeat=\\\"app in item.Applications\\\"\\n ng-class=\\\"{ 'datatable-highlighted': item.Highlighted, 'datatable-unhighlighted': !item.Highlighted }\\\"\\n >\\n <td></td>\\n <td colspan=\\\"4\\\">\\n <a ui-sref=\\\"kubernetes.applications.application({ name: app.Name, namespace: app.ResourcePool })\\\">{{ app.Name }}</a>\\n <span style=\\\"margin-left: 5px;\\\" class=\\\"label label-primary image-tag\\\" ng-if=\\\"!$ctrl.isSystemNamespace(app.ResourcePool) && $ctrl.isExternalApplication(app)\\\"\\n >external</span\\n >\\n </td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"5\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"5\\\" class=\\\"text-center text-muted\\\">No stack available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\" pagination-id=\\\"$ctrl.tableKey\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import _ from 'lodash-es';\nimport { KubernetesApplicationDeploymentTypes } from 'Kubernetes/models/application/models';\nimport KubernetesApplicationHelper from 'Kubernetes/helpers/application';\nimport KubernetesNamespaceHelper from 'Kubernetes/helpers/namespaceHelper';\n\nangular.module('portainer.kubernetes').controller('KubernetesApplicationsStacksDatatableController', [\n '$scope',\n '$controller',\n 'DatatableService',\n 'Authentication',\n function ($scope, $controller, DatatableService, Authentication) {\n angular.extend(this, $controller('GenericDatatableController', { $scope: $scope }));\n this.state = Object.assign(this.state, {\n expandedItems: [],\n expandAll: false,\n });\n\n var ctrl = this;\n\n this.settings = Object.assign(this.settings, {\n showSystem: false,\n });\n\n this.onSettingsShowSystemChange = function () {\n DatatableService.setDataTableSettings(this.tableKey, this.settings);\n };\n\n this.isExternalApplication = function (item) {\n return KubernetesApplicationHelper.isExternalApplication(item);\n };\n\n /**\n * Do not allow applications in system namespaces to be selected\n */\n this.allowSelection = function (item) {\n return !this.isSystemNamespace(item.ResourcePool);\n };\n\n /**\n * @param {String} namespace Namespace (string name)\n * @returns Boolean\n */\n this.isSystemNamespace = function (namespace) {\n return KubernetesNamespaceHelper.isSystemNamespace(namespace);\n };\n\n this.isDisplayed = function (item) {\n return !ctrl.isSystemNamespace(item.ResourcePool) || ctrl.settings.showSystem;\n };\n\n this.expandItem = function (item, expanded) {\n if (!this.itemCanExpand(item)) {\n return;\n }\n\n item.Expanded = expanded;\n if (!expanded) {\n item.Highlighted = false;\n }\n };\n\n this.itemCanExpand = function (item) {\n return item.Applications.length > 0;\n };\n\n this.hasExpandableItems = function () {\n return _.filter(this.state.filteredDataSet, (item) => this.itemCanExpand(item)).length;\n };\n\n this.expandAll = function () {\n this.state.expandAll = !this.state.expandAll;\n _.forEach(this.state.filteredDataSet, (item) => {\n if (this.itemCanExpand(item)) {\n this.expandItem(item, this.state.expandAll);\n }\n });\n };\n\n this.$onInit = function () {\n this.isAdmin = Authentication.isAdmin();\n this.KubernetesApplicationDeploymentTypes = KubernetesApplicationDeploymentTypes;\n this.setDefaults();\n this.prepareTableFromDataset();\n\n this.state.orderBy = this.orderBy;\n var storedOrder = DatatableService.getDataTableOrder(this.tableKey);\n if (storedOrder !== null) {\n this.state.reverseOrder = storedOrder.reverse;\n this.state.orderBy = storedOrder.orderBy;\n }\n\n var textFilter = DatatableService.getDataTableTextFilters(this.tableKey);\n if (textFilter !== null) {\n this.state.textFilter = textFilter;\n this.onTextFilterChange();\n }\n\n var storedFilters = DatatableService.getDataTableFilters(this.tableKey);\n if (storedFilters !== null) {\n this.filters = storedFilters;\n }\n if (this.filters && this.filters.state) {\n this.filters.state.open = false;\n }\n\n var storedSettings = DatatableService.getDataTableSettings(this.tableKey);\n if (storedSettings !== null) {\n this.settings = storedSettings;\n this.settings.open = false;\n }\n this.onSettingsRepeaterChange();\n };\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./configurationsDatatable.html');\n\nangular.module('portainer.kubernetes').component('kubernetesConfigurationsDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'KubernetesConfigurationsDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n refreshCallback: '<',\n removeAction: '<',\n },\n});\n","var path = 'app/kubernetes/components/datatables/configurations-datatable/configurationsDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n <span class=\\\"small text-muted\\\" style=\\\"float: left; margin-top: 5px;\\\" ng-if=\\\"$ctrl.isAdmin && !$ctrl.settings.showSystem\\\">\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n System resources are hidden, this can be changed in the table settings.\\n </span>\\n <div class=\\\"settings\\\">\\n <span class=\\\"setting\\\" ng-class=\\\"{ 'setting-active': $ctrl.settings.open }\\\" uib-dropdown dropdown-append-to-body auto-close=\\\"disabled\\\" is-open=\\\"$ctrl.settings.open\\\">\\n <span uib-dropdown-toggle data-cy=\\\"k8sConfig-configSettingsButton\\\"><i class=\\\"fa fa-cog\\\" aria-hidden=\\\"true\\\"></i> Table settings</span>\\n <div class=\\\"dropdown-menu dropdown-menu-right\\\" uib-dropdown-menu>\\n <div class=\\\"tableMenu\\\">\\n <div class=\\\"menuHeader\\\">\\n Table settings\\n </div>\\n <div class=\\\"menuContent\\\">\\n <div>\\n <div class=\\\"md-checkbox\\\" ng-if=\\\"$ctrl.isAdmin\\\">\\n <input\\n id=\\\"setting_show_system\\\"\\n type=\\\"checkbox\\\"\\n ng-model=\\\"$ctrl.settings.showSystem\\\"\\n ng-change=\\\"$ctrl.onSettingsShowSystemChange()\\\"\\n data-cy=\\\"k8sConfig-systemResourceCheckbox\\\"\\n />\\n <label for=\\\"setting_show_system\\\">Show system resources</label>\\n </div>\\n <div class=\\\"md-checkbox\\\">\\n <input id=\\\"setting_auto_refresh\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.settings.repeater.autoRefresh\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" />\\n <label for=\\\"setting_auto_refresh\\\">Auto refresh</label>\\n </div>\\n <div ng-if=\\\"$ctrl.settings.repeater.autoRefresh\\\">\\n <label for=\\\"settings_refresh_rate\\\">\\n Refresh rate\\n </label>\\n <select id=\\\"settings_refresh_rate\\\" ng-model=\\\"$ctrl.settings.repeater.refreshRate\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" class=\\\"small-select\\\">\\n <option value=\\\"10\\\">10s</option>\\n <option value=\\\"30\\\">30s</option>\\n <option value=\\\"60\\\">1min</option>\\n <option value=\\\"120\\\">2min</option>\\n <option value=\\\"300\\\">5min</option>\\n </select>\\n <span>\\n <i id=\\\"refreshRateChange\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-top: 7px; display: none;\\\"></i>\\n </span>\\n </div>\\n </div>\\n </div>\\n <div>\\n <a type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"$ctrl.settings.open = false;\\\" data-cy=\\\"k8sConfig-closeSettingsButton\\\">Close</a>\\n </div>\\n </div>\\n </div>\\n </span>\\n </div>\\n </div>\\n <div class=\\\"actionBar\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-danger\\\"\\n ng-disabled=\\\"$ctrl.state.selectedItemCount === 0\\\"\\n ng-click=\\\"$ctrl.removeAction($ctrl.state.selectedItems)\\\"\\n data-cy=\\\"k8sConfig-removeConfigButton\\\"\\n >\\n <i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Remove\\n </button>\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ui-sref=\\\"kubernetes.configurations.new\\\" data-cy=\\\"k8sConfig-addConfigWithFormButton\\\">\\n <i class=\\\"fa fa-plus space-right\\\" aria-hidden=\\\"true\\\"></i>Add with form\\n </button>\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ui-sref=\\\"kubernetes.deploy\\\" data-cy=\\\"k8sConfig-deployFromManifestButton\\\">\\n <i class=\\\"fa fa-plus space-right\\\" aria-hidden=\\\"true\\\"></i>Create from manifest\\n </button>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n auto-focus\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n data-cy=\\\"k8sConfig-searchInput\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\" data-cy=\\\"k8sConfig-tableSettingsButtonconfigsTable\\\">\\n <thead>\\n <tr>\\n <th>\\n <span class=\\\"md-checkbox\\\">\\n <input id=\\\"select_all\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.state.selectAll\\\" ng-change=\\\"$ctrl.selectAll()\\\" />\\n <label for=\\\"select_all\\\"></label>\\n </span>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Name')\\\">\\n Name\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Namespace')\\\">\\n Namespace\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Namespace' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Namespace' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Type')\\\">\\n Type\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Type' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Type' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('CreationDate')\\\">\\n Created\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'CreationDate' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'CreationDate' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | filter:$ctrl.isDisplayed | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit))\\\"\\n >\\n <td>\\n <span class=\\\"md-checkbox\\\">\\n <input id=\\\"select_{{ $index }}\\\" type=\\\"checkbox\\\" ng-model=\\\"item.Checked\\\" ng-click=\\\"$ctrl.selectItem(item, $event)\\\" ng-disabled=\\\"!$ctrl.allowSelection(item)\\\" />\\n <label for=\\\"select_{{ $index }}\\\"></label>\\n </span>\\n <a ui-sref=\\\"kubernetes.configurations.configuration({ name: item.Name, namespace: item.Namespace })\\\">{{ item.Name }}</a>\\n <span class=\\\"label label-primary image-tag label-margins\\\" ng-if=\\\"!$ctrl.isSystemConfig(item) && $ctrl.isExternalConfiguration(item)\\\">external</span>\\n <span class=\\\"label label-warning image-tag label-margins\\\" ng-if=\\\"!item.Used && !$ctrl.isSystemNamespace(item) && !$ctrl.isSystemConfig(item)\\\">unused</span>\\n <span class=\\\"label label-info image-tag label-margins\\\" ng-if=\\\"$ctrl.isSystemConfig(item)\\\">system</span>\\n </td>\\n <td>\\n <a ui-sref=\\\"kubernetes.resourcePools.resourcePool({ id: item.Namespace })\\\">{{ item.Namespace }}</a>\\n </td>\\n <td>{{ item.Type | kubernetesConfigurationTypeText }}</td>\\n <td>{{ item.CreationDate | getisodate }} {{ item.ConfigurationOwner ? 'by ' + item.ConfigurationOwner : '' }}</td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"4\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"4\\\" class=\\\"text-center text-muted\\\">No configuration available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"k8sConfig-paginationDropdown\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import KubernetesConfigurationHelper from 'Kubernetes/helpers/configurationHelper';\nimport KubernetesNamespaceHelper from 'Kubernetes/helpers/namespaceHelper';\n\nangular.module('portainer.docker').controller('KubernetesConfigurationsDatatableController', [\n '$scope',\n '$controller',\n 'DatatableService',\n 'Authentication',\n function ($scope, $controller, DatatableService, Authentication) {\n angular.extend(this, $controller('GenericDatatableController', { $scope: $scope }));\n\n const ctrl = this;\n\n this.settings = Object.assign(this.settings, {\n showSystem: false,\n });\n\n this.onSettingsShowSystemChange = function () {\n DatatableService.setDataTableSettings(this.tableKey, this.settings);\n };\n\n this.isSystemNamespace = function (item) {\n return KubernetesNamespaceHelper.isSystemNamespace(item.Namespace);\n };\n\n this.isSystemToken = function (item) {\n return KubernetesConfigurationHelper.isSystemToken(item);\n };\n\n this.isSystemConfig = function (item) {\n return ctrl.isSystemNamespace(item) || ctrl.isSystemToken(item) || item.IsRegistrySecret;\n };\n\n this.isExternalConfiguration = function (item) {\n return KubernetesConfigurationHelper.isExternalConfiguration(item);\n };\n\n this.isDisplayed = function (item) {\n return !ctrl.isSystemConfig(item) || (ctrl.settings.showSystem && ctrl.isAdmin);\n };\n\n /**\n * Do not allow configurations in system namespaces to be selected\n */\n this.allowSelection = function (item) {\n return !this.isSystemConfig(item) && !item.Used;\n };\n\n this.$onInit = function () {\n this.isAdmin = Authentication.isAdmin();\n this.setDefaults();\n this.prepareTableFromDataset();\n\n this.state.orderBy = this.orderBy;\n var storedOrder = DatatableService.getDataTableOrder(this.tableKey);\n if (storedOrder !== null) {\n this.state.reverseOrder = storedOrder.reverse;\n this.state.orderBy = storedOrder.orderBy;\n }\n\n var textFilter = DatatableService.getDataTableTextFilters(this.tableKey);\n if (textFilter !== null) {\n this.state.textFilter = textFilter;\n this.onTextFilterChange();\n }\n\n var storedFilters = DatatableService.getDataTableFilters(this.tableKey);\n if (storedFilters !== null) {\n this.filters = storedFilters;\n }\n if (this.filters && this.filters.state) {\n this.filters.state.open = false;\n }\n\n var storedSettings = DatatableService.getDataTableSettings(this.tableKey);\n if (storedSettings !== null) {\n this.settings = storedSettings;\n this.settings.open = false;\n }\n this.onSettingsRepeaterChange();\n };\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./eventsDatatable.html');\n\nangular.module('portainer.kubernetes').component('kubernetesEventsDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'GenericDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n loading: '<',\n refreshCallback: '<',\n },\n});\n","var path = 'app/kubernetes/components/datatables/events-datatable/eventsDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n <div class=\\\"settings\\\">\\n <span class=\\\"setting\\\" ng-class=\\\"{ 'setting-active': $ctrl.settings.open }\\\" uib-dropdown dropdown-append-to-body auto-close=\\\"disabled\\\" is-open=\\\"$ctrl.settings.open\\\">\\n <span uib-dropdown-toggle><i class=\\\"fa fa-cog\\\" aria-hidden=\\\"true\\\"></i> Table settings</span>\\n <div class=\\\"dropdown-menu dropdown-menu-right\\\" uib-dropdown-menu>\\n <div class=\\\"tableMenu\\\">\\n <div class=\\\"menuHeader\\\">\\n Table settings\\n </div>\\n <div class=\\\"menuContent\\\">\\n <div>\\n <div class=\\\"md-checkbox\\\">\\n <input id=\\\"setting_auto_refresh\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.settings.repeater.autoRefresh\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" />\\n <label for=\\\"setting_auto_refresh\\\">Auto refresh</label>\\n </div>\\n <div ng-if=\\\"$ctrl.settings.repeater.autoRefresh\\\">\\n <label for=\\\"settings_refresh_rate\\\">\\n Refresh rate\\n </label>\\n <select id=\\\"settings_refresh_rate\\\" ng-model=\\\"$ctrl.settings.repeater.refreshRate\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" class=\\\"small-select\\\">\\n <option value=\\\"10\\\">10s</option>\\n <option value=\\\"30\\\">30s</option>\\n <option value=\\\"60\\\">1min</option>\\n <option value=\\\"120\\\">2min</option>\\n <option value=\\\"300\\\">5min</option>\\n </select>\\n <span>\\n <i id=\\\"refreshRateChange\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-top: 7px; display: none;\\\"></i>\\n </span>\\n </div>\\n </div>\\n </div>\\n <div>\\n <a type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"$ctrl.settings.open = false;\\\">Close</a>\\n </div>\\n </div>\\n </div>\\n </span>\\n </div>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n auto-focus\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n data-cy=\\\"k8sConfigDetail-eventsTableSearchInput\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\" data-cy=\\\"k8sConfigDetail-eventsTable\\\">\\n <thead>\\n <tr>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Date')\\\">\\n Date\\n <i class=\\\"fa fa-sort-numeric-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Date' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-numeric-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Date' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Involved.kind')\\\">\\n Kind\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Involved.kind' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Involved.kind' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Type')\\\">\\n Type\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Type' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Type' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Message')\\\">\\n Message\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Message' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Message' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit: $ctrl.tableKey))\\\"\\n pagination-id=\\\"$ctrl.tableKey\\\"\\n >\\n <td>{{ item.Date | getisodate }}</td>\\n <td>{{ item.Involved.kind }}</td>\\n <td\\n ><span class=\\\"label label-{{ item.Type | kubernetesEventTypeColor }}\\\">{{ item.Type }}</span></td\\n >\\n <td>{{ item.Message }}</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.loading\\\">\\n <td colspan=\\\"4\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.loading && (!$ctrl.dataset || $ctrl.state.filteredDataSet.length === 0)\\\">\\n <td colspan=\\\"4\\\" class=\\\"text-center text-muted\\\">No event available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select\\n class=\\\"form-control\\\"\\n ng-model=\\\"$ctrl.state.paginatedItemLimit\\\"\\n ng-change=\\\"$ctrl.changePaginationLimit()\\\"\\n data-cy=\\\"k8sConfigDetail-eventsTablePaginationDropdown\\\"\\n >\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\" pagination-id=\\\"$ctrl.tableKey\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./integratedApplicationsDatatable.html');\n\nangular.module('portainer.kubernetes').component('kubernetesIntegratedApplicationsDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'GenericDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n refreshCallback: '<',\n },\n});\n","var path = 'app/kubernetes/components/datatables/integrated-applications-datatable/integratedApplicationsDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\">\\n <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n {{ $ctrl.titleText }}\\n </div>\\n <div ng-if=\\\"$ctrl.refreshCallback\\\" class=\\\"settings\\\">\\n <span class=\\\"setting\\\" ng-class=\\\"{ 'setting-active': $ctrl.settings.open }\\\" uib-dropdown dropdown-append-to-body auto-close=\\\"disabled\\\" is-open=\\\"$ctrl.settings.open\\\">\\n <span uib-dropdown-toggle> <i class=\\\"fa fa-cog\\\" aria-hidden=\\\"true\\\"></i> Table settings </span>\\n <div class=\\\"dropdown-menu dropdown-menu-right\\\" uib-dropdown-menu>\\n <div class=\\\"tableMenu\\\">\\n <div class=\\\"menuHeader\\\">\\n Table settings\\n </div>\\n <div class=\\\"menuContent\\\">\\n <div>\\n <div class=\\\"md-checkbox\\\">\\n <input id=\\\"setting_auto_refresh\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.settings.repeater.autoRefresh\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" />\\n <label for=\\\"setting_auto_refresh\\\">Auto refresh</label>\\n </div>\\n <div ng-if=\\\"$ctrl.settings.repeater.autoRefresh\\\">\\n <label for=\\\"settings_refresh_rate\\\">\\n Refresh rate\\n </label>\\n <select id=\\\"settings_refresh_rate\\\" ng-model=\\\"$ctrl.settings.repeater.refreshRate\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" class=\\\"small-select\\\">\\n <option value=\\\"10\\\">10s</option>\\n <option value=\\\"30\\\">30s</option>\\n <option value=\\\"60\\\">1min</option>\\n <option value=\\\"120\\\">2min</option>\\n <option value=\\\"300\\\">5min</option>\\n </select>\\n <span>\\n <i id=\\\"refreshRateChange\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-top: 7px; display: none;\\\"></i>\\n </span>\\n </div>\\n </div>\\n </div>\\n <div>\\n <a type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"$ctrl.settings.open = false;\\\">Close</a>\\n </div>\\n </div>\\n </div>\\n </span>\\n </div>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n auto-focus\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Name')\\\">\\n Name\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('StackName')\\\">\\n Stack\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'StackName' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'StackName' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Image')\\\">\\n Image\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Image' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Image' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit))\\\"\\n >\\n <td\\n ><a ui-sref=\\\"kubernetes.applications.application({ name: item.Name, namespace: item.ResourcePool })\\\">{{ item.Name }}</a></td\\n >\\n <td>{{ item.StackName || '-' }}</td>\\n <td title=\\\"{{ item.Image }}\\\">{{ item.Image | truncate: 64 }}</td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"3\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"3\\\" class=\\\"text-center text-muted\\\">No application available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./nodeApplicationsDatatable.html');\n\nangular.module('portainer.kubernetes').component('kubernetesNodeApplicationsDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'KubernetesNodeApplicationsDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n refreshCallback: '<',\n },\n});\n","var path = 'app/kubernetes/components/datatables/node-applications-datatable/nodeApplicationsDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\">\\n <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n {{ $ctrl.titleText }}\\n </div>\\n <div class=\\\"settings\\\">\\n <span class=\\\"setting\\\" ng-class=\\\"{ 'setting-active': $ctrl.settings.open }\\\" uib-dropdown dropdown-append-to-body auto-close=\\\"disabled\\\" is-open=\\\"$ctrl.settings.open\\\">\\n <span uib-dropdown-toggle> <i class=\\\"fa fa-cog\\\" aria-hidden=\\\"true\\\"></i> Table settings </span>\\n <div class=\\\"dropdown-menu dropdown-menu-right\\\" uib-dropdown-menu>\\n <div class=\\\"tableMenu\\\">\\n <div class=\\\"menuHeader\\\">\\n Table settings\\n </div>\\n <div class=\\\"menuContent\\\">\\n <div>\\n <div class=\\\"md-checkbox\\\">\\n <input id=\\\"setting_auto_refresh\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.settings.repeater.autoRefresh\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" />\\n <label for=\\\"setting_auto_refresh\\\">Auto refresh</label>\\n </div>\\n <div ng-if=\\\"$ctrl.settings.repeater.autoRefresh\\\">\\n <label for=\\\"settings_refresh_rate\\\">\\n Refresh rate\\n </label>\\n <select id=\\\"settings_refresh_rate\\\" ng-model=\\\"$ctrl.settings.repeater.refreshRate\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" class=\\\"small-select\\\">\\n <option value=\\\"10\\\">10s</option>\\n <option value=\\\"30\\\">30s</option>\\n <option value=\\\"60\\\">1min</option>\\n <option value=\\\"120\\\">2min</option>\\n <option value=\\\"300\\\">5min</option>\\n </select>\\n <span>\\n <i id=\\\"refreshRateChange\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-top: 7px; display: none;\\\"></i>\\n </span>\\n </div>\\n </div>\\n </div>\\n <div>\\n <a type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"$ctrl.settings.open = false;\\\">Close</a>\\n </div>\\n </div>\\n </div>\\n </span>\\n </div>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n auto-focus\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Name')\\\">\\n Name\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('StackName')\\\">\\n Stack\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'StackName' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'StackName' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('ResourcePool')\\\">\\n Namespace\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'ResourcePool' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'ResourcePool' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Image')\\\">\\n Image\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Image' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Image' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('CPU')\\\">\\n CPU reservation\\n <i class=\\\"fa fa-sort-numeric-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'CPU' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-numeric-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'CPU' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Memory')\\\">\\n Memory reservation\\n <i class=\\\"fa fa-sort-numeric-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Memory' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-numeric-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Memory' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit))\\\"\\n >\\n <td>\\n <a ui-sref=\\\"kubernetes.applications.application({ name: item.Name, namespace: item.ResourcePool })\\\">{{ item.Name }}</a>\\n <span style=\\\"margin-left: 5px;\\\" class=\\\"label label-info image-tag\\\" ng-if=\\\"$ctrl.isSystemNamespace(item)\\\">system</span>\\n <span style=\\\"margin-left: 5px;\\\" class=\\\"label label-primary image-tag\\\" ng-if=\\\"!$ctrl.isSystemNamespace(item) && $ctrl.isExternalApplication(item)\\\">external</span>\\n </td>\\n <td>{{ item.StackName || '-' }}</td>\\n <td>\\n <a ui-sref=\\\"kubernetes.resourcePools.resourcePool({ id: item.ResourcePool })\\\">{{ item.ResourcePool }}</a>\\n </td>\\n <td title=\\\"{{ item.Image }}\\\"\\n >{{ item.Image | truncate: 64 }} <span ng-if=\\\"item.Containers.length > 1\\\">+ {{ item.Containers.length - 1 }}</span></td\\n >\\n <td>{{ item.CPU | kubernetesApplicationCPUValue }}</td>\\n <td>{{ item.Memory | humansize }}</td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"6\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"6\\\" class=\\\"text-center text-muted\\\">No stack available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import { KubernetesApplicationDeploymentTypes } from 'Kubernetes/models/application/models';\nimport KubernetesApplicationHelper from 'Kubernetes/helpers/application';\nimport KubernetesNamespaceHelper from 'Kubernetes/helpers/namespaceHelper';\n\nangular.module('portainer.docker').controller('KubernetesNodeApplicationsDatatableController', [\n '$scope',\n '$controller',\n 'DatatableService',\n function ($scope, $controller, DatatableService) {\n angular.extend(this, $controller('GenericDatatableController', { $scope: $scope }));\n\n this.isSystemNamespace = function (item) {\n return KubernetesNamespaceHelper.isSystemNamespace(item.ResourcePool);\n };\n\n this.isExternalApplication = function (item) {\n return KubernetesApplicationHelper.isExternalApplication(item);\n };\n\n this.$onInit = function () {\n this.KubernetesApplicationDeploymentTypes = KubernetesApplicationDeploymentTypes;\n this.setDefaults();\n this.prepareTableFromDataset();\n\n this.state.orderBy = this.orderBy;\n var storedOrder = DatatableService.getDataTableOrder(this.tableKey);\n if (storedOrder !== null) {\n this.state.reverseOrder = storedOrder.reverse;\n this.state.orderBy = storedOrder.orderBy;\n }\n\n var textFilter = DatatableService.getDataTableTextFilters(this.tableKey);\n if (textFilter !== null) {\n this.state.textFilter = textFilter;\n this.onTextFilterChange();\n }\n\n var storedFilters = DatatableService.getDataTableFilters(this.tableKey);\n if (storedFilters !== null) {\n this.filters = storedFilters;\n }\n if (this.filters && this.filters.state) {\n this.filters.state.open = false;\n }\n\n var storedSettings = DatatableService.getDataTableSettings(this.tableKey);\n if (storedSettings !== null) {\n this.settings = storedSettings;\n this.settings.open = false;\n }\n this.onSettingsRepeaterChange();\n };\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./nodesDatatable.html');\n\nangular.module('portainer.kubernetes').component('kubernetesNodesDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'GenericDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n refreshCallback: '<',\n isAdmin: '<',\n useServerMetrics: '<',\n },\n});\n","var path = 'app/kubernetes/components/datatables/nodes-datatable/nodesDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n <div class=\\\"settings\\\">\\n <span class=\\\"setting\\\" ng-class=\\\"{ 'setting-active': $ctrl.settings.open }\\\" uib-dropdown dropdown-append-to-body auto-close=\\\"disabled\\\" is-open=\\\"$ctrl.settings.open\\\">\\n <span uib-dropdown-toggle><i class=\\\"fa fa-cog\\\" aria-hidden=\\\"true\\\"></i> Table settings</span>\\n <div class=\\\"dropdown-menu dropdown-menu-right\\\" uib-dropdown-menu>\\n <div class=\\\"tableMenu\\\">\\n <div class=\\\"menuHeader\\\">\\n Table settings\\n </div>\\n <div class=\\\"menuContent\\\">\\n <div>\\n <div class=\\\"md-checkbox\\\">\\n <input id=\\\"setting_auto_refresh\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.settings.repeater.autoRefresh\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" />\\n <label for=\\\"setting_auto_refresh\\\">Auto refresh</label>\\n </div>\\n <div ng-if=\\\"$ctrl.settings.repeater.autoRefresh\\\">\\n <label for=\\\"settings_refresh_rate\\\">\\n Refresh rate\\n </label>\\n <select id=\\\"settings_refresh_rate\\\" ng-model=\\\"$ctrl.settings.repeater.refreshRate\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" class=\\\"small-select\\\">\\n <option value=\\\"10\\\">10s</option>\\n <option value=\\\"30\\\">30s</option>\\n <option value=\\\"60\\\">1min</option>\\n <option value=\\\"120\\\">2min</option>\\n <option value=\\\"300\\\">5min</option>\\n </select>\\n <span>\\n <i id=\\\"refreshRateChange\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-top: 7px; display: none;\\\"></i>\\n </span>\\n </div>\\n </div>\\n </div>\\n <div>\\n <a type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"$ctrl.settings.open = false;\\\">Close</a>\\n </div>\\n </div>\\n </div>\\n </span>\\n </div>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n auto-focus\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Name')\\\">\\n Name\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Role')\\\">\\n Role\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Role' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Role' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Status')\\\">\\n Status\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Status' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Status' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('CPU')\\\">\\n CPU\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'CPU' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'CPU' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Memory')\\\">\\n Memory\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Memory' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Memory' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Version')\\\">\\n Version\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Version' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Version' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('IPAddress')\\\">\\n IP Address\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'IPAddress' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'IPAddress' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th ng-if=\\\"$ctrl.useServerMetrics\\\">\\n Actions\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit))\\\"\\n >\\n <td ng-if=\\\"$ctrl.isAdmin\\\">\\n <a ui-sref=\\\"kubernetes.cluster.node({ name: item.Name })\\\">\\n {{ item.Name }}\\n </a>\\n <span class=\\\"label label-primary image-tag\\\" style=\\\"margin-left: 5px;\\\" ng-if=\\\"item.Api\\\">api</span>\\n </td>\\n <td ng-if=\\\"!$ctrl.isAdmin\\\"> {{ item.Name }}</td>\\n <td>{{ item.Role }}</td>\\n <td\\n ><span class=\\\"label label-{{ item.Status | kubernetesNodeStatusColor }}\\\">{{ item.Status }}</span></td\\n >\\n <td>{{ item.CPU }}</td>\\n <td>{{ item.Memory | humansize }}</td>\\n <td>{{ item.Version }}</td>\\n <td>{{ item.IPAddress }}</td>\\n <td ng-if=\\\"$ctrl.useServerMetrics\\\">\\n <a ui-sref=\\\"kubernetes.cluster.node.stats({ name: item.Name })\\\" style=\\\"cursor: pointer;\\\"> <i class=\\\"fa fa-chart-area\\\" aria-hidden=\\\"true\\\"></i> Stats </a>\\n </td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"7\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"7\\\" class=\\\"text-center text-muted\\\">No node available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./resourcePoolApplicationsDatatable.html');\n\nangular.module('portainer.kubernetes').component('kubernetesResourcePoolApplicationsDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'KubernetesResourcePoolApplicationsDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n refreshCallback: '<',\n },\n});\n","var path = 'app/kubernetes/components/datatables/resource-pool-applications-datatable/resourcePoolApplicationsDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\">\\n <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n {{ $ctrl.titleText }}\\n </div>\\n <div ng-if=\\\"$ctrl.refreshCallback\\\" class=\\\"settings\\\">\\n <span class=\\\"setting\\\" ng-class=\\\"{ 'setting-active': $ctrl.settings.open }\\\" uib-dropdown dropdown-append-to-body auto-close=\\\"disabled\\\" is-open=\\\"$ctrl.settings.open\\\">\\n <span uib-dropdown-toggle> <i class=\\\"fa fa-cog\\\" aria-hidden=\\\"true\\\"></i> Table settings </span>\\n <div class=\\\"dropdown-menu dropdown-menu-right\\\" uib-dropdown-menu>\\n <div class=\\\"tableMenu\\\">\\n <div class=\\\"menuHeader\\\">\\n Table settings\\n </div>\\n <div class=\\\"menuContent\\\">\\n <div>\\n <div class=\\\"md-checkbox\\\">\\n <input id=\\\"setting_auto_refresh\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.settings.repeater.autoRefresh\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" />\\n <label for=\\\"setting_auto_refresh\\\">Auto refresh</label>\\n </div>\\n <div ng-if=\\\"$ctrl.settings.repeater.autoRefresh\\\">\\n <label for=\\\"settings_refresh_rate\\\">\\n Refresh rate\\n </label>\\n <select id=\\\"settings_refresh_rate\\\" ng-model=\\\"$ctrl.settings.repeater.refreshRate\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" class=\\\"small-select\\\">\\n <option value=\\\"10\\\">10s</option>\\n <option value=\\\"30\\\">30s</option>\\n <option value=\\\"60\\\">1min</option>\\n <option value=\\\"120\\\">2min</option>\\n <option value=\\\"300\\\">5min</option>\\n </select>\\n <span>\\n <i id=\\\"refreshRateChange\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-top: 7px; display: none;\\\"></i>\\n </span>\\n </div>\\n </div>\\n </div>\\n <div>\\n <a type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"$ctrl.settings.open = false;\\\">Close</a>\\n </div>\\n </div>\\n </div>\\n </span>\\n </div>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n auto-focus\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Name')\\\">\\n Name\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('StackName')\\\">\\n Stack\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'StackName' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'StackName' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Image')\\\">\\n Image\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Image' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Image' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('CPU')\\\">\\n CPU reservation\\n <i class=\\\"fa fa-sort-numeric-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'CPU' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-numeric-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'CPU' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Memory')\\\">\\n Memory reservation\\n <i class=\\\"fa fa-sort-numeric-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Memory' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-numeric-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Memory' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit))\\\"\\n >\\n <td>\\n <a ui-sref=\\\"kubernetes.applications.application({ name: item.Name, namespace: item.ResourcePool })\\\">{{ item.Name }}</a>\\n <span style=\\\"margin-left: 5px;\\\" class=\\\"label label-primary image-tag\\\" ng-if=\\\"$ctrl.isExternalApplication(item)\\\">external</span>\\n </td>\\n <td>{{ item.StackName || '-' }}</td>\\n <td title=\\\"{{ item.Image }}\\\"\\n >{{ item.Image | truncate: 64 }} <span ng-if=\\\"item.Containers.length > 1\\\">+ {{ item.Containers.length - 1 }}</span></td\\n >\\n <td>{{ item.CPU | kubernetesApplicationCPUValue }}</td>\\n <td>{{ item.Memory | humansize }}</td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"5\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"5\\\" class=\\\"text-center text-muted\\\">No application available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import KubernetesApplicationHelper from 'Kubernetes/helpers/application';\n\nangular.module('portainer.docker').controller('KubernetesResourcePoolApplicationsDatatableController', [\n '$scope',\n '$controller',\n 'DatatableService',\n function ($scope, $controller, DatatableService) {\n angular.extend(this, $controller('GenericDatatableController', { $scope: $scope }));\n\n this.isExternalApplication = function (item) {\n return KubernetesApplicationHelper.isExternalApplication(item);\n };\n\n this.$onInit = function () {\n this.setDefaults();\n this.prepareTableFromDataset();\n\n this.state.orderBy = this.orderBy;\n var storedOrder = DatatableService.getDataTableOrder(this.tableKey);\n if (storedOrder !== null) {\n this.state.reverseOrder = storedOrder.reverse;\n this.state.orderBy = storedOrder.orderBy;\n }\n\n var textFilter = DatatableService.getDataTableTextFilters(this.tableKey);\n if (textFilter !== null) {\n this.state.textFilter = textFilter;\n this.onTextFilterChange();\n }\n\n var storedFilters = DatatableService.getDataTableFilters(this.tableKey);\n if (storedFilters !== null) {\n this.filters = storedFilters;\n }\n if (this.filters && this.filters.state) {\n this.filters.state.open = false;\n }\n\n var storedSettings = DatatableService.getDataTableSettings(this.tableKey);\n if (storedSettings !== null) {\n this.settings = storedSettings;\n this.settings.open = false;\n }\n this.onSettingsRepeaterChange();\n };\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./resourcePoolsDatatable.html');\n\nangular.module('portainer.kubernetes').component('kubernetesResourcePoolsDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'KubernetesResourcePoolsDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n removeAction: '<',\n refreshCallback: '<',\n endpoint: '<',\n },\n});\n","var path = 'app/kubernetes/components/datatables/resource-pools-datatable/resourcePoolsDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n <span class=\\\"small text-muted\\\" style=\\\"float: left; margin-top: 5px;\\\" ng-if=\\\"$ctrl.isAdmin && !$ctrl.settings.showSystem\\\">\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n System resources are hidden, this can be changed in the table settings.\\n </span>\\n <div class=\\\"settings\\\">\\n <span class=\\\"setting\\\" ng-class=\\\"{ 'setting-active': $ctrl.settings.open }\\\" uib-dropdown dropdown-append-to-body auto-close=\\\"disabled\\\" is-open=\\\"$ctrl.settings.open\\\">\\n <span uib-dropdown-toggle><i class=\\\"fa fa-cog\\\" aria-hidden=\\\"true\\\"></i> Table settings</span>\\n <div class=\\\"dropdown-menu dropdown-menu-right\\\" uib-dropdown-menu>\\n <div class=\\\"tableMenu\\\">\\n <div class=\\\"menuHeader\\\">\\n Table settings\\n </div>\\n <div class=\\\"menuContent\\\">\\n <div>\\n <div class=\\\"md-checkbox\\\" ng-if=\\\"$ctrl.isAdmin\\\">\\n <input id=\\\"setting_show_system\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.settings.showSystem\\\" ng-change=\\\"$ctrl.onSettingsShowSystemChange()\\\" />\\n <label for=\\\"setting_show_system\\\">Show system resources</label>\\n </div>\\n <div class=\\\"md-checkbox\\\">\\n <input id=\\\"setting_auto_refresh\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.settings.repeater.autoRefresh\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" />\\n <label for=\\\"setting_auto_refresh\\\">Auto refresh</label>\\n </div>\\n <div ng-if=\\\"$ctrl.settings.repeater.autoRefresh\\\">\\n <label for=\\\"settings_refresh_rate\\\">\\n Refresh rate\\n </label>\\n <select id=\\\"settings_refresh_rate\\\" ng-model=\\\"$ctrl.settings.repeater.refreshRate\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" class=\\\"small-select\\\">\\n <option value=\\\"10\\\">10s</option>\\n <option value=\\\"30\\\">30s</option>\\n <option value=\\\"60\\\">1min</option>\\n <option value=\\\"120\\\">2min</option>\\n <option value=\\\"300\\\">5min</option>\\n </select>\\n <span>\\n <i id=\\\"refreshRateChange\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-top: 7px; display: none;\\\"></i>\\n </span>\\n </div>\\n </div>\\n </div>\\n <div>\\n <a type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"$ctrl.settings.open = false;\\\">Close</a>\\n </div>\\n </div>\\n </div>\\n </span>\\n </div>\\n </div>\\n <div ng-if=\\\"$ctrl.isAdmin\\\" class=\\\"actionBar\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-danger\\\"\\n ng-disabled=\\\"$ctrl.state.selectedItemCount === 0\\\"\\n ng-click=\\\"$ctrl.removeAction($ctrl.state.selectedItems)\\\"\\n data-cy=\\\"k8sNamespace-removeNamespaceButton\\\"\\n >\\n <i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Remove\\n </button>\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ui-sref=\\\"kubernetes.resourcePools.new\\\" data-cy=\\\"k8sNamespace-addNamespaceWithFormButton\\\">\\n <i class=\\\"fa fa-plus space-right\\\" aria-hidden=\\\"true\\\"></i>Add namespace with form\\n </button>\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ui-sref=\\\"kubernetes.deploy\\\" data-cy=\\\"k8sNamespace-deployFromManifestButton\\\">\\n <i class=\\\"fa fa-plus space-right\\\" aria-hidden=\\\"true\\\"></i>Create from manifest\\n </button>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n auto-focus\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n data-cy=\\\"k8sNamespace-namespaceSearchInput\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th>\\n <span ng-if=\\\"$ctrl.isAdmin\\\" class=\\\"md-checkbox\\\">\\n <input id=\\\"select_all\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.state.selectAll\\\" ng-change=\\\"$ctrl.selectAll()\\\" />\\n <label for=\\\"select_all\\\"></label>\\n </span>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Namespace.Name')\\\">\\n Name\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Namespace.Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Namespace.Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Namespace.Status')\\\">\\n Status\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Namespace.Status' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Namespace.Status' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Quota')\\\">\\n Quota\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Quota' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Quota' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('CreationDate')\\\">\\n Created\\n <i class=\\\"fa fa-sort-numeric-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'CreationDate' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-numeric-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'CreationDate' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th ng-if=\\\"$ctrl.isAdmin\\\">\\n Actions\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | filter:$ctrl.isDisplayed | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit))\\\"\\n ng-class=\\\"{ active: item.Checked }\\\"\\n >\\n <td>\\n <span ng-if=\\\"$ctrl.isAdmin\\\" class=\\\"md-checkbox\\\">\\n <input id=\\\"select_{{ $index }}\\\" type=\\\"checkbox\\\" ng-model=\\\"item.Checked\\\" ng-click=\\\"$ctrl.selectItem(item, $event)\\\" ng-disabled=\\\"$ctrl.disableRemove(item)\\\" />\\n <label for=\\\"select_{{ $index }}\\\"></label>\\n </span>\\n <a ui-sref=\\\"kubernetes.resourcePools.resourcePool({ id: item.Namespace.Name })\\\">{{ item.Namespace.Name }}</a>\\n <span style=\\\"margin-left: 5px;\\\" class=\\\"label label-info image-tag\\\" ng-if=\\\"$ctrl.isSystemNamespace(item)\\\">system</span>\\n </td>\\n <td>\\n <span class=\\\"label label-{{ $ctrl.namespaceStatusColor(item.Namespace.Status) }}\\\">{{ item.Namespace.Status }}</span>\\n </td>\\n <td> <i class=\\\"fa {{ item.Quota ? 'fa-toggle-on' : 'fa-toggle-off' }}\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ item.Quota ? 'Yes' : 'No' }} </td>\\n <td>{{ item.Namespace.CreationDate | getisodate }} {{ item.Namespace.ResourcePoolOwner ? 'by ' + item.Namespace.ResourcePoolOwner : '' }}</td>\\n <td ng-if=\\\"$ctrl.isAdmin\\\">\\n <a ng-if=\\\"$ctrl.canManageAccess(item)\\\" ui-sref=\\\"kubernetes.resourcePools.resourcePool.access({id: item.Namespace.Name})\\\">\\n <i class=\\\"fa fa-users\\\" aria-hidden=\\\"true\\\"></i> Manage access\\n </a>\\n <span ng-if=\\\"!$ctrl.canManageAccess(item)\\\">-</span>\\n </td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"4\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"4\\\" class=\\\"text-center text-muted\\\">No namespace available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import KubernetesNamespaceHelper from 'Kubernetes/helpers/namespaceHelper';\n\nangular.module('portainer.docker').controller('KubernetesResourcePoolsDatatableController', [\n '$scope',\n '$controller',\n 'Authentication',\n 'DatatableService',\n function ($scope, $controller, Authentication, DatatableService) {\n angular.extend(this, $controller('GenericDatatableController', { $scope: $scope }));\n\n var ctrl = this;\n\n this.settings = Object.assign(this.settings, {\n showSystem: false,\n });\n\n this.onSettingsShowSystemChange = function () {\n DatatableService.setDataTableSettings(this.tableKey, this.settings);\n };\n\n this.canManageAccess = function (item) {\n if (!this.endpoint.Kubernetes.Configuration.RestrictDefaultNamespace) {\n return !KubernetesNamespaceHelper.isDefaultNamespace(item.Namespace.Name) && !this.isSystemNamespace(item);\n } else {\n return !this.isSystemNamespace(item);\n }\n };\n\n this.disableRemove = function (item) {\n return this.isSystemNamespace(item) || KubernetesNamespaceHelper.isDefaultNamespace(item.Namespace.Name);\n };\n\n this.isSystemNamespace = function (item) {\n return KubernetesNamespaceHelper.isSystemNamespace(item.Namespace.Name);\n };\n\n this.isDisplayed = function (item) {\n return !ctrl.isSystemNamespace(item) || (ctrl.settings.showSystem && ctrl.isAdmin);\n };\n\n this.namespaceStatusColor = function (status) {\n switch (status.toLowerCase()) {\n case 'active':\n return 'success';\n case 'terminating':\n return 'danger';\n default:\n return 'primary';\n }\n };\n\n /**\n * Do not allow system namespaces to be selected\n */\n this.allowSelection = function (item) {\n return !this.disableRemove(item);\n };\n\n this.$onInit = function () {\n this.isAdmin = Authentication.isAdmin();\n this.setDefaults();\n this.prepareTableFromDataset();\n\n this.state.orderBy = this.orderBy;\n var storedOrder = DatatableService.getDataTableOrder(this.tableKey);\n if (storedOrder !== null) {\n this.state.reverseOrder = storedOrder.reverse;\n this.state.orderBy = storedOrder.orderBy;\n }\n\n var textFilter = DatatableService.getDataTableTextFilters(this.tableKey);\n if (textFilter !== null) {\n this.state.textFilter = textFilter;\n this.onTextFilterChange();\n }\n\n var storedFilters = DatatableService.getDataTableFilters(this.tableKey);\n if (storedFilters !== null) {\n this.filters = storedFilters;\n }\n if (this.filters && this.filters.state) {\n this.filters.state.open = false;\n }\n\n var storedSettings = DatatableService.getDataTableSettings(this.tableKey);\n if (storedSettings !== null) {\n this.settings = storedSettings;\n this.settings.open = false;\n }\n this.onSettingsRepeaterChange();\n };\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./volumesDatatable.html');\n\nangular.module('portainer.kubernetes').component('kubernetesVolumesDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'KubernetesVolumesDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n removeAction: '<',\n refreshCallback: '<',\n },\n});\n","var path = 'app/kubernetes/components/datatables/volumes-datatable/volumesDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n <span class=\\\"small text-muted\\\" style=\\\"float: left; margin-top: 5px;\\\" ng-if=\\\"$ctrl.isAdmin && !$ctrl.settings.showSystem\\\">\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n System resources are hidden, this can be changed in the table settings.\\n </span>\\n <div class=\\\"settings\\\">\\n <span class=\\\"setting\\\" ng-class=\\\"{ 'setting-active': $ctrl.settings.open }\\\" uib-dropdown dropdown-append-to-body auto-close=\\\"disabled\\\" is-open=\\\"$ctrl.settings.open\\\">\\n <span uib-dropdown-toggle><i class=\\\"fa fa-cog\\\" aria-hidden=\\\"true\\\"></i> Table settings</span>\\n <div class=\\\"dropdown-menu dropdown-menu-right\\\" uib-dropdown-menu>\\n <div class=\\\"tableMenu\\\">\\n <div class=\\\"menuHeader\\\">\\n Table settings\\n </div>\\n <div class=\\\"menuContent\\\">\\n <div>\\n <div class=\\\"md-checkbox\\\" ng-if=\\\"$ctrl.isAdmin\\\">\\n <input id=\\\"setting_show_system\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.settings.showSystem\\\" ng-change=\\\"$ctrl.onSettingsShowSystemChange()\\\" />\\n <label for=\\\"setting_show_system\\\">Show system resources</label>\\n </div>\\n <div class=\\\"md-checkbox\\\">\\n <input id=\\\"setting_auto_refresh\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.settings.repeater.autoRefresh\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" />\\n <label for=\\\"setting_auto_refresh\\\">Auto refresh</label>\\n </div>\\n <div ng-if=\\\"$ctrl.settings.repeater.autoRefresh\\\">\\n <label for=\\\"settings_refresh_rate\\\">\\n Refresh rate\\n </label>\\n <select id=\\\"settings_refresh_rate\\\" ng-model=\\\"$ctrl.settings.repeater.refreshRate\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" class=\\\"small-select\\\">\\n <option value=\\\"10\\\">10s</option>\\n <option value=\\\"30\\\">30s</option>\\n <option value=\\\"60\\\">1min</option>\\n <option value=\\\"120\\\">2min</option>\\n <option value=\\\"300\\\">5min</option>\\n </select>\\n <span>\\n <i id=\\\"refreshRateChange\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-top: 7px; display: none;\\\"></i>\\n </span>\\n </div>\\n </div>\\n </div>\\n <div>\\n <a type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"$ctrl.settings.open = false;\\\">Close</a>\\n </div>\\n </div>\\n </div>\\n </span>\\n </div>\\n </div>\\n <div class=\\\"actionBar\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-danger\\\" ng-disabled=\\\"$ctrl.state.selectedItemCount === 0\\\" ng-click=\\\"$ctrl.removeAction($ctrl.state.selectedItems)\\\">\\n <i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Remove\\n </button>\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ui-sref=\\\"kubernetes.deploy\\\" data-cy=\\\"k8sVolume-deployFromManifestButton\\\">\\n <i class=\\\"fa fa-plus space-right\\\" aria-hidden=\\\"true\\\"></i>Create from manifest\\n </button>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n auto-focus\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th>\\n <span class=\\\"md-checkbox\\\">\\n <input id=\\\"select_all\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.state.selectAll\\\" ng-change=\\\"$ctrl.selectAll()\\\" />\\n <label for=\\\"select_all\\\"></label>\\n </span>\\n <a ng-click=\\\"$ctrl.changeOrderBy('PersistentVolumeClaim.Name')\\\">\\n Name\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'PersistentVolumeClaim.Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'PersistentVolumeClaim.Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('ResourcePool.Namespace.Name')\\\">\\n Namespace\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'ResourcePool.Namespace.Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'ResourcePool.Namespace.Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('PersistentVolumeClaim.Applications[0].Name')\\\">\\n Used by\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'PersistentVolumeClaim.Applications[0].Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'PersistentVolumeClaim.Applications[0].Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('PersistentVolumeClaim.StorageClass.Name')\\\">\\n Storage\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'PersistentVolumeClaim.StorageClass.Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'PersistentVolumeClaim.StorageClass.Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('PersistentVolumeClaim.Storage')\\\">\\n Size\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'PersistentVolumeClaim.Storage' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'PersistentVolumeClaim.Storage' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('PersistentVolumeClaim.CreationDate')\\\">\\n Created\\n <i class=\\\"fa fa-sort-numeric-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'PersistentVolumeClaim.CreationDate' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-numeric-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'PersistentVolumeClaim.CreationDate' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | filter:$ctrl.isDisplayed | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit))\\\"\\n ng-class=\\\"{ active: item.Checked }\\\"\\n >\\n <td>\\n <span class=\\\"md-checkbox\\\">\\n <input id=\\\"select_{{ $index }}\\\" type=\\\"checkbox\\\" ng-model=\\\"item.Checked\\\" ng-click=\\\"$ctrl.selectItem(item, $event)\\\" ng-disabled=\\\"$ctrl.disableRemove(item)\\\" />\\n <label for=\\\"select_{{ $index }}\\\"></label>\\n </span>\\n <a ui-sref=\\\"kubernetes.volumes.volume({ namespace: item.ResourcePool.Namespace.Name, name: item.PersistentVolumeClaim.Name })\\\">{{\\n item.PersistentVolumeClaim.Name\\n }}</a>\\n <span class=\\\"label label-info image-tag label-margins\\\" ng-if=\\\"$ctrl.isSystemNamespace(item)\\\">system</span>\\n <span class=\\\"label label-primary image-tag label-margins\\\" ng-if=\\\"!$ctrl.isSystemNamespace(item) && $ctrl.isExternalVolume(item)\\\">external</span>\\n <span class=\\\"label label-warning image-tag label-margins\\\" ng-if=\\\"!$ctrl.isSystemNamespace(item) && !$ctrl.isUsed(item)\\\">unused</span>\\n </td>\\n <td>\\n <a ui-sref=\\\"kubernetes.resourcePools.resourcePool({ id: item.ResourcePool.Namespace.Name })\\\">{{ item.ResourcePool.Namespace.Name }}</a>\\n </td>\\n <td>\\n <a\\n ng-if=\\\"item.Applications.length\\\"\\n ui-sref=\\\"kubernetes.applications.application({ name: item.Applications[0].Name, namespace: item.ResourcePool.Namespace.Name })\\\"\\n >{{ item.Applications[0].Name }}</a\\n >\\n <span ng-if=\\\"item.Applications.length > 1\\\"> + {{ item.Applications.length - 1 }}</span>\\n <span ng-if=\\\"!item.Applications.length\\\">-</span>\\n </td>\\n <td>\\n {{ item.PersistentVolumeClaim.StorageClass.Name }}\\n </td>\\n <td>\\n {{ item.PersistentVolumeClaim.Storage }}\\n </td>\\n <td>\\n {{ item.PersistentVolumeClaim.CreationDate | getisodate }}\\n {{ item.PersistentVolumeClaim.ApplicationOwner ? 'by ' + item.PersistentVolumeClaim.ApplicationOwner : '' }}\\n </td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"6\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"6\\\" class=\\\"text-center text-muted\\\">No volume available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import angular from 'angular';\nimport KubernetesVolumeHelper from 'Kubernetes/helpers/volumeHelper';\nimport KubernetesNamespaceHelper from 'Kubernetes/helpers/namespaceHelper';\n\n// TODO: review - refactor to use `extends GenericDatatableController`\nclass KubernetesVolumesDatatableController {\n /* @ngInject */\n constructor($async, $controller, Authentication, DatatableService) {\n this.$async = $async;\n this.$controller = $controller;\n this.Authentication = Authentication;\n this.DatatableService = DatatableService;\n\n this.onInit = this.onInit.bind(this);\n this.allowSelection = this.allowSelection.bind(this);\n this.isDisplayed = this.isDisplayed.bind(this);\n }\n\n onSettingsShowSystemChange() {\n this.DatatableService.setDataTableSettings(this.tableKey, this.settings);\n }\n\n disableRemove(item) {\n return this.isSystemNamespace(item) || this.isUsed(item);\n }\n\n isUsed(item) {\n return KubernetesVolumeHelper.isUsed(item);\n }\n\n isSystemNamespace(item) {\n return KubernetesNamespaceHelper.isSystemNamespace(item.ResourcePool.Namespace.Name);\n }\n\n isDisplayed(item) {\n return !this.isSystemNamespace(item) || this.settings.showSystem;\n }\n\n isExternalVolume(item) {\n return KubernetesVolumeHelper.isExternalVolume(item);\n }\n\n allowSelection(item) {\n return !this.disableRemove(item);\n }\n\n async onInit() {\n this.setDefaults();\n this.prepareTableFromDataset();\n this.isAdmin = this.Authentication.isAdmin();\n this.settings.showSystem = false;\n\n this.state.orderBy = this.orderBy;\n var storedOrder = this.DatatableService.getDataTableOrder(this.tableKey);\n if (storedOrder !== null) {\n this.state.reverseOrder = storedOrder.reverse;\n this.state.orderBy = storedOrder.orderBy;\n }\n\n var textFilter = this.DatatableService.getDataTableTextFilters(this.tableKey);\n if (textFilter !== null) {\n this.state.textFilter = textFilter;\n this.onTextFilterChange();\n }\n\n var storedFilters = this.DatatableService.getDataTableFilters(this.tableKey);\n if (storedFilters !== null) {\n this.filters = storedFilters;\n }\n if (this.filters && this.filters.state) {\n this.filters.state.open = false;\n }\n\n var storedSettings = this.DatatableService.getDataTableSettings(this.tableKey);\n if (storedSettings !== null) {\n this.settings = storedSettings;\n this.settings.open = false;\n }\n this.onSettingsRepeaterChange();\n }\n\n $onInit() {\n const ctrl = angular.extend({}, this.$controller('GenericDatatableController'), this);\n angular.extend(this, ctrl);\n return this.$async(this.onInit);\n }\n}\n\nexport default KubernetesVolumesDatatableController;\nangular.module('portainer.kubernetes').controller('KubernetesVolumesDatatableController', KubernetesVolumesDatatableController);\n","const autoNgTemplateLoaderTemplate1 = require('./helm-add-repository.html');\n\nimport angular from 'angular';\nimport controller from './helm-add-repository.controller';\n\nangular.module('portainer.kubernetes').component('helmAddRepository', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n repos: '<',\n endpoint: '<',\n },\n});\n","var path = 'app/kubernetes/components/helm/helm-templates/helm-add-repository/helm-add-repository.html';\nvar html = \"<rd-widget>\\n <rd-widget-header icon=\\\"fa-dharmachakra\\\" title-text=\\\"Additional repositories\\\"></rd-widget-header>\\n <rd-widget-body>\\n <div class=\\\"actionBar\\\">\\n <form class=\\\"form-horizontal\\\" name=\\\"addUserHelmRepoForm\\\">\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n Add a Helm repository. All Helm charts in the repository will be added to the list.\\n </span>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <input\\n type=\\\"url\\\"\\n name=\\\"repo\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"$ctrl.state.repository\\\"\\n placeholder=\\\"https://charts.bitnami.com/bitnami\\\"\\n ng-pattern=\\\"/^https?:///\\\"\\n required\\n />\\n </div>\\n </div>\\n\\n <div class=\\\"form-group nomargin\\\" ng-show=\\\"addUserHelmRepoForm.repo.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"addUserHelmRepoForm.repo.$error\\\">\\n <p ng-message=\\\"pattern\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> A valid URL beginning with http(s) is required.</p>\\n </div>\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\" ng-show=\\\"$ctrl.doesRepoExist()\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div> <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Helm repo already exists. </div>\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-default nomargin\\\"\\n ng-click=\\\"$ctrl.addRepository()\\\"\\n ng-disabled=\\\"$ctrl.state.isAddingRepo || addUserHelmRepoForm.repo.$invalid || $ctrl.doesRepoExist()\\\"\\n analytics-on\\n analytics-category=\\\"kubernetes\\\"\\n analytics-event=\\\"kubernetes-helm-add-repository\\\"\\n >\\n Add repository\\n </button>\\n </div>\\n </div>\\n </form>\\n </div>\\n </rd-widget-body>\\n</rd-widget>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/kubernetes/components/helm/helm-templates/helm-templates-list/helm-templates-list-item/helm-templates-list-item.html';\nvar html = \"<!-- helm chart -->\\n<div ng-class=\\\"{ 'blocklist-item--selected': $ctrl.model.Selected }\\\" class=\\\"blocklist-item template-item\\\" ng-click=\\\"$ctrl.onSelect($ctrl.model)\\\">\\n <div class=\\\"blocklist-item-box\\\">\\n <!-- helmchart-image -->\\n <span ng-if=\\\"$ctrl.model.icon\\\">\\n <img class=\\\"blocklist-item-logo\\\" ng-src=\\\"{{ $ctrl.model.icon }}\\\" />\\n </span>\\n <span class=\\\"blocklist-item-logo\\\" ng-if=\\\"!$ctrl.model.icon\\\">\\n <i class=\\\"fa fa-dharmachakra fa-4x blue-icon\\\" aria-hidden=\\\"true\\\"></i>\\n </span>\\n <!-- !helmchart-image -->\\n <!-- helmchart-details -->\\n <div class=\\\"col-sm-12 helm-template-item-details\\\">\\n <!-- blocklist-item-line1 -->\\n <div class=\\\"blocklist-item-line\\\">\\n <span>\\n <span class=\\\"blocklist-item-title\\\">\\n {{ $ctrl.model.name }}\\n </span>\\n <span class=\\\"space-left blocklist-item-subtitle\\\">\\n <span>\\n <i class=\\\"fa fa-dharmachakra\\\" aria-hidden=\\\"true\\\"></i>\\n </span>\\n <span>\\n Helm\\n </span>\\n </span>\\n </span>\\n </div>\\n <!-- !blocklist-item-line1 -->\\n <span class=\\\"blocklist-item-actions\\\" ng-transclude=\\\"actions\\\"></span>\\n <!-- blocklist-item-line2 -->\\n <div class=\\\"blocklist-item-line helm-template-item-details-sub\\\">\\n <span class=\\\"blocklist-item-desc\\\">\\n {{ $ctrl.model.description }}\\n </span>\\n <span class=\\\"small text-muted\\\" ng-if=\\\"$ctrl.model.annotations.category\\\">\\n {{ $ctrl.model.annotations.category }}\\n </span>\\n </div>\\n <!-- !blocklist-item-line2 -->\\n </div>\\n <!-- !helmchart-details -->\\n </div>\\n <!-- !helm chart -->\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./helm-templates-list.html');\n\nimport angular from 'angular';\nimport controller from './helm-templates-list.controller';\n\nangular.module('portainer.kubernetes').component('helmTemplatesList', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n loading: '<',\n titleText: '@',\n titleIcon: '@',\n charts: '<',\n tableKey: '@',\n selectAction: '<',\n },\n});\n","var path = 'app/kubernetes/components/helm/helm-templates/helm-templates-list/helm-templates-list.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n </div>\\n\\n <div class=\\\"actionBar\\\">\\n <div>\\n <span style=\\\"width: 25%;\\\">\\n <ui-select ng-model=\\\"$ctrl.state.selectedCategory\\\" theme=\\\"bootstrap\\\">\\n <ui-select-match placeholder=\\\"Select a category\\\">\\n <a class=\\\"btn btn-xs btn-link pull-right\\\" ng-click=\\\"$ctrl.clearCategory()\\\"><i class=\\\"glyphicon glyphicon-remove\\\"></i></a>\\n <span>{{ $select.selected }}</span>\\n </ui-select-match>\\n <ui-select-choices repeat=\\\"category in ($ctrl.state.categories | filter: $select.search)\\\">\\n <span>{{ category }}</span>\\n </ui-select-choices>\\n </ui-select>\\n </span>\\n </div>\\n </div>\\n\\n <div class=\\\"searchBar\\\" style=\\\"border-top: 2px solid #f6f6f6;\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n auto-focus\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n\\n <div class=\\\"blocklist\\\">\\n <helm-templates-list-item\\n ng-repeat=\\\"chart in $ctrl.charts | filter:$ctrl.state.textFilter | filter: $ctrl.state.selectedCategory \\\"\\n model=\\\"chart\\\"\\n type-label=\\\"helm\\\"\\n on-select=\\\"($ctrl.selectAction)\\\"\\n >\\n </helm-templates-list-item>\\n <div ng-if=\\\"$ctrl.loading\\\" class=\\\"text-center text-muted\\\">\\n Loading...\\n <div class=\\\"text-center text-muted\\\">\\n Initial download of Helm Charts can take a few minutes\\n </div>\\n </div>\\n <div ng-if=\\\"!$ctrl.loading && $ctrl.charts.length === 0\\\" class=\\\"text-center text-muted\\\">\\n No helm charts available.\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./helm-templates.html');\n\nimport angular from 'angular';\nimport controller from './helm-templates.controller';\n\nangular.module('portainer.kubernetes').component('helmTemplatesView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n endpoint: '<',\n },\n});\n","var path = 'app/kubernetes/components/helm/helm-templates/helm-templates.html';\nvar html = \"<kubernetes-view-header id=\\\"view-top\\\" title=\\\"Helm\\\" state=\\\"kubernetes.templates.helm\\\" view-ready=\\\"true\\\">\\n Charts\\n</kubernetes-view-header>\\n\\n<information-panel title-text=\\\"Information\\\" ng-if=\\\"!$ctrl.state.chart\\\">\\n <span class=\\\"small text-muted\\\">\\n <p>\\n <i class=\\\"fa fa-exclamation-circle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n This is a first version for Helm charts, for more information see this <a href=\\\"https://www.portainer.io/blog/portainer-now-with-helm-support\\\" target=\\\"_blank\\\">blog post</a>.\\n </p>\\n <p ng-if=\\\"$ctrl.state.globalRepository === ''\\\">\\n <i class=\\\"fa fa-exclamation-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n <span>The Global Helm Repository is not configured.</span>\\n <a ng-if=\\\"$ctrl.state.isAdmin\\\" ui-sref=\\\"portainer.settings\\\">Configure Global Helm Repository in Settings</a>\\n </p>\\n </span>\\n</information-panel>\\n\\n<div class=\\\"row\\\">\\n <!-- helmchart-form -->\\n <div class=\\\"col-sm-12\\\" ng-if=\\\"$ctrl.state.chart\\\">\\n <rd-widget>\\n <rd-widget-custom-header icon=\\\"$ctrl.state.chart.icon\\\" title-text=\\\"$ctrl.state.chart.name\\\"></rd-widget-custom-header>\\n <rd-widget-body classes=\\\"padding\\\">\\n <form class=\\\"form-horizontal\\\" name=\\\"$ctrl.helmTemplateCreationForm\\\">\\n <!-- description -->\\n <div>\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Description\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <div class=\\\"template-note\\\" ng-bind-html=\\\"$ctrl.state.chart.description\\\"></div>\\n </div>\\n </div>\\n </div>\\n <!-- !description -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Configuration\\n </div>\\n <!-- namespace-input -->\\n <div class=\\\"form-group\\\" ng-if=\\\"$ctrl.state.resourcePool\\\">\\n <label for=\\\"resource-pool-selector\\\" class=\\\"col-sm-2 control-label text-left\\\">Namespace</label>\\n <div class=\\\"col-sm-10\\\">\\n <select\\n class=\\\"form-control\\\"\\n id=\\\"resource-pool-selector\\\"\\n ng-model=\\\"$ctrl.state.resourcePool\\\"\\n ng-options=\\\"resourcePool.Namespace.Name for resourcePool in $ctrl.state.resourcePools\\\"\\n ng-change=\\\"\\\"\\n ng-disabled=\\\"$ctrl.state.isEdit\\\"\\n ></select>\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\" ng-if=\\\"!$ctrl.state.resourcePool\\\">\\n <div class=\\\"col-sm-12 small text-muted\\\">\\n <i class=\\\"fa fa-exclamation-circle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n You do not have access to any namespace. Contact your administrator to get access to a namespace.\\n </div>\\n </div>\\n <!-- !namespace-input -->\\n <!-- name-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"release_name\\\" class=\\\"col-sm-2 control-label text-left\\\">Name</label>\\n <div class=\\\"col-sm-10\\\">\\n <input\\n type=\\\"text\\\"\\n name=\\\"release_name\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"$ctrl.state.appName\\\"\\n placeholder=\\\"e.g. my-app\\\"\\n required\\n ng-pattern=\\\"/^[a-z]([-a-z0-9]*[a-z0-9])?$/\\\"\\n />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"$ctrl.helmTemplateCreationForm.release_name.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"$ctrl.helmTemplateCreationForm.release_name.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n <p ng-message=\\\"pattern\\\">\\n <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field must consist of lower case alphanumeric characters or '-', start with an alphabetic\\n character, and end with an alphanumeric character (e.g. 'my-name', or 'abc-123').\\n </p>\\n </div>\\n </div>\\n </div>\\n <!-- !name-input -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <a class=\\\"small interactive\\\" ng-if=\\\"!$ctrl.state.showCustomValues && !$ctrl.state.loadingValues\\\" ng-click=\\\"$ctrl.state.showCustomValues = true;\\\">\\n <i class=\\\"fa fa-plus space-right\\\" aria-hidden=\\\"true\\\"></i> Show custom values\\n </a>\\n <span class=\\\"small interactive\\\" ng-if=\\\"$ctrl.state.loadingValues\\\"> <i class=\\\"fa fa-sync-alt space-right\\\" aria-hidden=\\\"true\\\"></i> Loading values.yaml... </span>\\n <a class=\\\"small interactive\\\" ng-if=\\\"$ctrl.state.showCustomValues\\\" ng-click=\\\"$ctrl.state.showCustomValues = false;\\\">\\n <i class=\\\"fa fa-minus space-right\\\" aria-hidden=\\\"true\\\"></i> Hide custom values\\n </a>\\n </div>\\n </div>\\n <!-- values override -->\\n <div ng-if=\\\"$ctrl.state.showCustomValues\\\">\\n <!-- web-editor -->\\n <div>\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Web editor\\n </div>\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n You can get more information about Helm values file format in the\\n <a href=\\\"https://helm.sh/docs/chart_template_guide/values_files/\\\" target=\\\"_blank\\\">official documentation</a>.\\n </span>\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <code-editor\\n identifier=\\\"helm-app-creation-editor\\\"\\n placeholder=\\\"# Define or paste the content of your values yaml file here\\\"\\n yml=\\\"true\\\"\\n on-change=\\\"($ctrl.editorUpdate)\\\"\\n value=\\\"$ctrl.state.values\\\"\\n ></code-editor>\\n </div>\\n </div>\\n </div>\\n <!-- !web-editor -->\\n </div>\\n <!-- !values override -->\\n <!-- helm actions -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"!($ctrl.state.appName && $ctrl.state.resourcePool && !$ctrl.state.loadingValues && !$ctrl.state.actionInProgress)\\\"\\n ng-click=\\\"$ctrl.installHelmchart()\\\"\\n button-spinner=\\\"$ctrl.state.actionInProgress\\\"\\n >\\n <span ng-hide=\\\"$ctrl.state.actionInProgress\\\">Install</span>\\n <span ng-hide=\\\"!$ctrl.state.actionInProgress\\\">Helm installing in progress</span>\\n </button>\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-default\\\" ng-click=\\\"$ctrl.state.chart = null\\\">Hide</button>\\n </div>\\n </div>\\n <!-- !helm actions -->\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n <!-- helmchart-form -->\\n</div>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <helm-add-repository repos=\\\"$ctrl.state.repos\\\"></helm-add-repository>\\n </div>\\n</div>\\n\\n<!-- Helm Charts Component -->\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <helm-templates-list\\n title-text=\\\"Charts\\\"\\n title-icon=\\\"fa-rocket\\\"\\n charts=\\\"$ctrl.state.charts\\\"\\n table-key=\\\"$ctrl.state.charts\\\"\\n select-action=\\\"$ctrl.selectHelmChart\\\"\\n loading=\\\"$ctrl.state.chartsLoading || $ctrl.state.resourcePoolsLoading\\\"\\n >\\n </helm-templates-list>\\n </div>\\n</div>\\n<!-- !Helm Charts Component -->\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/kubernetes/components/kubectl-shell/kubectl-shell.html';\nvar html = \"<button\\n type=\\\"button\\\"\\n class=\\\"btn btn-xs btn-primary\\\"\\n ng-click=\\\"$ctrl.connectConsole()\\\"\\n ng-disabled=\\\"$ctrl.state.shell.connected\\\"\\n data-cy=\\\"k8sSidebar-shellButton\\\"\\n analytics-on\\n analytics-category=\\\"kubernetes\\\"\\n analytics-event=\\\"kubernetes-kubectl-shell\\\"\\n>\\n <i class=\\\"fa fa-terminal space-right\\\"></i> kubectl shell\\n</button>\\n\\n<div ng-if=\\\"$ctrl.state.shell.connected\\\" class=\\\"{{ $ctrl.state.css }}-kubectl-shell\\\">\\n <div class=\\\"shell-container\\\">\\n <div class=\\\"shell-item\\\"><i class=\\\"fas fa-terminal\\\" style=\\\"margin-right: 5px;\\\"></i>kubectl shell</div>\\n <div class=\\\"shell-item-right\\\">\\n <i class=\\\"fas fa-redo-alt\\\" ng-click=\\\"$ctrl.screenClear();\\\" data-cy=\\\"k8sShell-refreshButton\\\"></i>\\n <i\\n class=\\\"fas {{ $ctrl.state.icon }}\\\"\\n ng-click=\\\"$ctrl.miniRestore();\\\"\\n data-cy=\\\"{{ $ctrl.state.icon === '.fa-window-minimize' ? 'k8sShell-restore' : 'k8sShell-minimise' }}\\\"\\n ></i>\\n <i class=\\\"fas fa-times\\\" ng-click=\\\"$ctrl.disconnect()\\\" data-cy=\\\"k8sShell-closeButton\\\"></i>\\n </div>\\n </div>\\n <div>\\n <div class=\\\"nopadding\\\">\\n <div>\\n <div id=\\\"terminal-container\\\" class=\\\"terminal-container\\\">\\n <div style=\\\"position: fixed; color: #fff;\\\">Loading Terminal...</div>\\n </div>\\n </div>\\n </div>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./kubernetesConfigurationData.html');\n\nangular.module('portainer.kubernetes').component('kubernetesConfigurationData', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'KubernetesConfigurationDataController',\n bindings: {\n formValues: '=',\n isValid: '=',\n isCreation: '=',\n isEditorDirty: '=',\n },\n});\n","var path = 'app/kubernetes/components/kubernetes-configuration-data/kubernetesConfigurationData.html';\nvar html = \"<ng-form name=\\\"kubernetesConfigurationDataCreationForm\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\" style=\\\"margin-top: 10px;\\\">\\n Data\\n </div>\\n\\n <div class=\\\"form-group\\\" ng-if=\\\"$ctrl.isCreation\\\">\\n <div class=\\\"col-sm-12\\\">\\n <p>\\n <a class=\\\"small interactive\\\" ng-if=\\\"$ctrl.formValues.IsSimple\\\" ng-click=\\\"$ctrl.showAdvancedMode()\\\">\\n <i class=\\\"fa fa-list-ol space-right\\\" aria-hidden=\\\"true\\\"></i> Advanced mode\\n </a>\\n <a class=\\\"small interactive\\\" ng-if=\\\"!$ctrl.formValues.IsSimple\\\" ng-click=\\\"$ctrl.showSimpleMode()\\\">\\n <i class=\\\"fa fa-edit space-right\\\" aria-hidden=\\\"true\\\"></i> Simple mode\\n </a>\\n </p>\\n </div>\\n <div class=\\\"col-sm-12 small text-muted\\\" ng-if=\\\"$ctrl.formValues.IsSimple\\\">\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Switch to advanced mode to copy and paste multiple key/values\\n </div>\\n <div class=\\\"col-sm-12 small text-muted\\\" ng-if=\\\"!$ctrl.formValues.IsSimple\\\">\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Generate a configuration entry per line, use YAML format\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\" ng-if=\\\"$ctrl.formValues.IsSimple\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-default\\\" style=\\\"margin-left: 0;\\\" ng-click=\\\"$ctrl.addEntry()\\\" data-cy=\\\"k8sConfigCreate-createEntryButton\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> Create entry\\n </button>\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-default\\\" ngf-select=\\\"$ctrl.addEntryFromFile($file)\\\" style=\\\"margin-left: 0;\\\" data-cy=\\\"k8sConfigCreate-createConfigsFromFileButton\\\">\\n <i class=\\\"fa fa-file-upload\\\" aria-hidden=\\\"true\\\"></i> Create key/value from file\\n </button>\\n </div>\\n </div>\\n\\n <div ng-repeat=\\\"(index, entry) in $ctrl.formValues.Data\\\" ng-if=\\\"$ctrl.formValues.IsSimple\\\">\\n <div class=\\\"form-group\\\">\\n <label for=\\\"configuration_data_key_{{ index }}\\\" class=\\\"col-sm-1 control-label text-left\\\">Key</label>\\n <div class=\\\"col-sm-11\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n id=\\\"configuration_data_key_{{ index }}\\\"\\n name=\\\"configuration_data_key_{{ index }}\\\"\\n ng-model=\\\"$ctrl.formValues.Data[index].Key\\\"\\n ng-disabled=\\\"entry.Used\\\"\\n required\\n ng-change=\\\"$ctrl.onChangeKey(entry)\\\"\\n />\\n </div>\\n <div\\n class=\\\"col-sm-11 small text-warning\\\"\\n style=\\\"margin-top: 5px;\\\"\\n ng-show=\\\"\\n kubernetesConfigurationDataCreationForm['configuration_data_key_' + index].$invalid ||\\n (!entry.Used && $ctrl.state.duplicateKeys[index] !== undefined) ||\\n $ctrl.state.invalidKeys[index]\\n \\\"\\n >\\n <ng-messages for=\\\"kubernetesConfigurationDataCreationForm['configuration_data_key_' + index].$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </ng-messages>\\n <p ng-if=\\\"$ctrl.state.duplicateKeys[index] !== undefined\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This key is already defined.</p>\\n <p ng-if=\\\"$ctrl.state.invalidKeys[index]\\\"\\n ><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This key is invalid. A valid key must consist of alphanumeric characters, '-', '_' or '.'</p\\n >\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\" ng-if=\\\"$ctrl.formValues.IsSimple && !entry.IsBinary\\\">\\n <label for=\\\"configuration_data_value_{{ index }}\\\" class=\\\"col-sm-1 control-label text-left\\\">Value</label>\\n <div class=\\\"col-sm-11\\\">\\n <textarea\\n class=\\\"form-control\\\"\\n rows=\\\"5\\\"\\n id=\\\"configuration_data_value_{{ index }}\\\"\\n name=\\\"configuration_data_value_{{ index }}\\\"\\n ng-model=\\\"$ctrl.formValues.Data[index].Value\\\"\\n required\\n ></textarea>\\n </div>\\n <div class=\\\"col-sm-11 small text-warning\\\" style=\\\"margin-top: 5px;\\\" ng-show=\\\"kubernetesConfigurationDataCreationForm['configuration_data_value_' + index].$invalid\\\">\\n <ng-messages for=\\\"kubernetesConfigurationDataCreationForm['configuration_data_value_' + index].$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </ng-messages>\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\" ng-if=\\\"$ctrl.formValues.IsSimple && entry.IsBinary\\\">\\n <label for=\\\"configuration_data_value_{{ index }}\\\" class=\\\"col-sm-1 control-label text-left\\\">Value</label>\\n <div class=\\\"col-sm-11 control-label small text-muted text-left\\\"\\n >Binary data <portainer-tooltip position=\\\"bottom\\\" message=\\\"This key holds binary data and cannot be displayed.\\\"></portainer-tooltip\\n ></div>\\n </div>\\n\\n <div class=\\\"form-group\\\" ng-if=\\\"$ctrl.formValues.IsSimple\\\">\\n <div class=\\\"col-sm-1\\\"></div>\\n <div class=\\\"col-sm-11\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-danger space-right\\\"\\n style=\\\"margin-left: 0;\\\"\\n ng-disabled=\\\"entry.Used\\\"\\n ng-click=\\\"$ctrl.removeEntry(index, entry)\\\"\\n data-cy=\\\"k8sConfigDetail-removeEntryButton{{ index }}\\\"\\n >\\n <i class=\\\"fa fa-trash-alt\\\" aria-hidden=\\\"true\\\"></i> Remove entry\\n </button>\\n <span class=\\\"small text-muted\\\" ng-if=\\\"entry.Used\\\">\\n <i class=\\\"fa fa-info-circle blue-icon space-right\\\" aria-hidden=\\\"true\\\"></i>\\n This key is currently used by one or more applications\\n </span>\\n </div>\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\" ng-if=\\\"!$ctrl.formValues.IsSimple\\\">\\n <input type=\\\"text\\\" ng-model=\\\"$ctrl.formValues.DataYaml\\\" required style=\\\"display: none;\\\" />\\n <code-editor identifier=\\\"kubernetes-configuration-editor\\\" value=\\\"$ctrl.formValues.DataYaml\\\" read-only=\\\"false\\\" yml=\\\"true\\\" on-change=\\\"($ctrl.editorUpdate)\\\"></code-editor>\\n </div>\\n</ng-form>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import angular from 'angular';\nimport _ from 'lodash-es';\nimport chardet from 'chardet';\nimport { Base64 } from 'js-base64';\nimport KubernetesFormValidationHelper from 'Kubernetes/helpers/formValidationHelper';\nimport KubernetesConfigurationHelper from 'Kubernetes/helpers/configurationHelper';\nimport { KubernetesConfigurationFormValuesEntry } from 'Kubernetes/models/configuration/formvalues';\n\nclass KubernetesConfigurationDataController {\n /* @ngInject */\n constructor($async) {\n this.$async = $async;\n\n this.editorUpdate = this.editorUpdate.bind(this);\n this.editorUpdateAsync = this.editorUpdateAsync.bind(this);\n this.onFileLoad = this.onFileLoad.bind(this);\n this.onFileLoadAsync = this.onFileLoadAsync.bind(this);\n this.showSimpleMode = this.showSimpleMode.bind(this);\n this.showAdvancedMode = this.showAdvancedMode.bind(this);\n }\n\n onChangeKey(entry) {\n if (entry && entry.Used) {\n return;\n }\n\n this.state.duplicateKeys = KubernetesFormValidationHelper.getDuplicates(_.map(this.formValues.Data, (data) => data.Key));\n this.state.invalidKeys = KubernetesFormValidationHelper.getInvalidKeys(_.map(this.formValues.Data, (data) => data.Key));\n this.isValid = Object.keys(this.state.duplicateKeys).length === 0 && Object.keys(this.state.invalidKeys).length === 0;\n }\n\n addEntry() {\n this.formValues.Data.push(new KubernetesConfigurationFormValuesEntry());\n }\n\n removeEntry(index, entry) {\n if (entry.Used) {\n return;\n }\n\n this.formValues.Data.splice(index, 1);\n this.onChangeKey();\n }\n\n async editorUpdateAsync(cm) {\n if (this.formValues.DataYaml !== cm.getValue()) {\n this.formValues.DataYaml = cm.getValue();\n this.isEditorDirty = true;\n }\n }\n\n editorUpdate(cm) {\n return this.$async(this.editorUpdateAsync, cm);\n }\n\n async onFileLoadAsync(event) {\n const entry = new KubernetesConfigurationFormValuesEntry();\n const encoding = chardet.detect(Buffer.from(event.target.result));\n const decoder = new TextDecoder(encoding);\n\n entry.Key = event.target.fileName;\n entry.IsBinary = KubernetesConfigurationHelper.isBinary(encoding);\n\n if (!entry.IsBinary) {\n entry.Value = decoder.decode(event.target.result);\n } else {\n const stringValue = decoder.decode(event.target.result);\n entry.Value = Base64.encode(stringValue);\n }\n\n this.formValues.Data.push(entry);\n this.onChangeKey();\n }\n\n onFileLoad(event) {\n return this.$async(this.onFileLoadAsync, event);\n }\n\n addEntryFromFile(file) {\n if (file) {\n const temporaryFileReader = new FileReader();\n temporaryFileReader.fileName = file.name;\n temporaryFileReader.onload = this.onFileLoad;\n temporaryFileReader.readAsArrayBuffer(file);\n }\n }\n\n showSimpleMode() {\n this.formValues.IsSimple = true;\n this.formValues.Data = KubernetesConfigurationHelper.parseYaml(this.formValues);\n this.onChangeKey();\n }\n\n showAdvancedMode() {\n this.formValues.IsSimple = false;\n this.formValues.DataYaml = KubernetesConfigurationHelper.parseData(this.formValues);\n }\n\n $onInit() {\n this.state = {\n duplicateKeys: [],\n invalidKeys: {},\n };\n }\n}\n\nexport default KubernetesConfigurationDataController;\nangular.module('portainer.kubernetes').controller('KubernetesConfigurationDataController', KubernetesConfigurationDataController);\n","const autoNgTemplateLoaderTemplate1 = require('./kubernetes-sidebar.html');\n\nimport angular from 'angular';\n\nangular.module('portainer.kubernetes').component('kubernetesSidebar', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n endpointId: '<',\n isSidebarOpen: '<',\n adminAccess: '<',\n },\n});\n","var path = 'app/kubernetes/components/kubernetes-sidebar/kubernetes-sidebar.html';\nvar html = \"<sidebar-menu-item\\n path=\\\"kubernetes.dashboard\\\"\\n path-params=\\\"{ endpointId: $ctrl.endpointId }\\\"\\n icon-class=\\\"fa-tachometer-alt fa-fw\\\"\\n class-name=\\\"sidebar-list\\\"\\n data-cy=\\\"k8sSidebar-dashboard\\\"\\n>\\n Dashboard\\n</sidebar-menu-item>\\n\\n<sidebar-menu-item\\n path=\\\"kubernetes.templates.custom\\\"\\n path-params=\\\"{ endpointId: $ctrl.endpointId }\\\"\\n icon-class=\\\"fa-rocket fa-fw\\\"\\n class-name=\\\"sidebar-list\\\"\\n data-cy=\\\"k8sSidebar-customTemplates\\\"\\n>\\n Custom Templates\\n</sidebar-menu-item>\\n\\n<sidebar-menu-item\\n path=\\\"kubernetes.resourcePools\\\"\\n path-params=\\\"{ endpointId: $ctrl.endpointId }\\\"\\n icon-class=\\\"fa-layer-group fa-fw\\\"\\n class-name=\\\"sidebar-list\\\"\\n data-cy=\\\"k8sSidebar-namespaces\\\"\\n>\\n Namespaces\\n</sidebar-menu-item>\\n\\n<sidebar-menu-item\\n path=\\\"kubernetes.templates.helm\\\"\\n path-params=\\\"{ endpointId: $ctrl.endpointId }\\\"\\n icon-class=\\\"fa-dharmachakra fa-fw\\\"\\n class-name=\\\"sidebar-list\\\"\\n data-cy=\\\"k8sSidebar-helm\\\"\\n>\\n Helm\\n</sidebar-menu-item>\\n\\n<sidebar-menu-item\\n path=\\\"kubernetes.applications\\\"\\n path-params=\\\"{ endpointId: $ctrl.endpointId }\\\"\\n icon-class=\\\"fa-laptop-code fa-fw\\\"\\n class-name=\\\"sidebar-list\\\"\\n data-cy=\\\"k8sSidebar-applications\\\"\\n>\\n Applications\\n</sidebar-menu-item>\\n\\n<sidebar-menu-item\\n path=\\\"kubernetes.configurations\\\"\\n path-params=\\\"{ endpointId: $ctrl.endpointId }\\\"\\n icon-class=\\\"fa-file-code fa-fw\\\"\\n class-name=\\\"sidebar-list\\\"\\n data-cy=\\\"k8sSidebar-configurations\\\"\\n>\\n ConfigMaps & Secrets\\n</sidebar-menu-item>\\n\\n<sidebar-menu-item path=\\\"kubernetes.volumes\\\" path-params=\\\"{ endpointId: $ctrl.endpointId }\\\" icon-class=\\\"fa-database fa-fw\\\" class-name=\\\"sidebar-list\\\" data-cy=\\\"k8sSidebar-volumes\\\">\\n Volumes\\n</sidebar-menu-item>\\n\\n<sidebar-menu\\n icon-class=\\\"fa-server fa-fw\\\"\\n label=\\\"Cluster\\\"\\n path=\\\"kubernetes.cluster\\\"\\n path-params=\\\"{ endpointId: $ctrl.endpointId }\\\"\\n is-sidebar-open=\\\"$ctrl.isSidebarOpen\\\"\\n children-paths=\\\"['kubernetes.cluster', 'portainer.k8sendpoint.kubernetesConfig', 'kubernetes.registries', 'kubernetes.registries.access']\\\"\\n>\\n <div ng-if=\\\"$ctrl.adminAccess\\\">\\n <sidebar-menu-item\\n authorization=\\\"K8sClusterSetupRW\\\"\\n path=\\\"portainer.k8sendpoint.kubernetesConfig\\\"\\n path-params=\\\"{ id: $ctrl.endpointId }\\\"\\n class-name=\\\"sidebar-sublist\\\"\\n data-cy=\\\"k8sSidebar-setup\\\"\\n >\\n Setup\\n </sidebar-menu-item>\\n\\n <sidebar-menu-item\\n authorization=\\\"PortainerRegistryList\\\"\\n path=\\\"kubernetes.registries\\\"\\n path-params=\\\"{ endpointId: $ctrl.endpointId }\\\"\\n class-name=\\\"sidebar-sublist\\\"\\n data-cy=\\\"k8sSidebar-registries\\\"\\n >\\n Registries\\n </sidebar-menu-item>\\n </div>\\n</sidebar-menu>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./resourceReservation.html');\n\nangular.module('portainer.kubernetes').component('kubernetesResourceReservation', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'KubernetesResourceReservationController',\n bindings: {\n description: '@',\n cpuReservation: '<',\n cpuUsage: '<',\n cpuLimit: '<',\n memoryReservation: '<',\n memoryUsage: '<',\n memoryLimit: '<',\n displayUsage: '<',\n },\n});\n","var path = 'app/kubernetes/components/resource-reservation/resourceReservation.html';\nvar html = \"<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Resource reservation\\n </div>\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n <p>\\n {{ $ctrl.description }}\\n </p>\\n </span>\\n </div>\\n <div class=\\\"form-group\\\" ng-if=\\\"$ctrl.memoryLimit !== 0\\\">\\n <label for=\\\"memory-reservation\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Memory reservation\\n </label>\\n <div class=\\\"col-sm-9\\\" style=\\\"margin-top: 4px;\\\">\\n <uib-progressbar\\n animate=\\\"false\\\"\\n value=\\\"$ctrl.memoryReservationPercent\\\"\\n type=\\\"{{ $ctrl.memoryReservationPercent | kubernetesUsageLevelInfo }}\\\"\\n data-cy=\\\"k8sNamespaceDetail-memoryUsage\\\"\\n >\\n <b style=\\\"white-space: nowrap;\\\"> {{ $ctrl.memoryReservation }} / {{ $ctrl.memoryLimit }} MB - {{ $ctrl.memoryReservationPercent }}% </b>\\n </uib-progressbar>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-if=\\\"$ctrl.displayUsage && $ctrl.memoryLimit !== 0\\\">\\n <label for=\\\"memory-usage\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Memory used\\n </label>\\n <div class=\\\"col-sm-9\\\" style=\\\"margin-top: 4px;\\\">\\n <uib-progressbar animate=\\\"false\\\" value=\\\"$ctrl.memoryUsagePercent\\\" type=\\\"{{ $ctrl.memoryUsagePercent | kubernetesUsageLevelInfo }}\\\">\\n <b style=\\\"white-space: nowrap;\\\"> {{ $ctrl.memoryUsage }} / {{ $ctrl.memoryLimit }} MB - {{ $ctrl.memoryUsagePercent }}% </b>\\n </uib-progressbar>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-if=\\\"$ctrl.cpuLimit !== 0\\\">\\n <label for=\\\"cpu-reservation\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n CPU reservation\\n </label>\\n <div class=\\\"col-sm-9\\\" style=\\\"margin-top: 4px;\\\">\\n <uib-progressbar animate=\\\"false\\\" value=\\\"$ctrl.cpuReservationPercent\\\" type=\\\"{{ $ctrl.cpuReservationPercent | kubernetesUsageLevelInfo }}\\\">\\n <b style=\\\"white-space: nowrap;\\\"> {{ $ctrl.cpuReservation | kubernetesApplicationCPUValue }} / {{ $ctrl.cpuLimit }} - {{ $ctrl.cpuReservationPercent }}% </b>\\n </uib-progressbar>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-if=\\\"$ctrl.displayUsage && $ctrl.cpuLimit !== 0\\\">\\n <label for=\\\"cpu-usage\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n CPU used\\n </label>\\n <div class=\\\"col-sm-9\\\" style=\\\"margin-top: 4px;\\\">\\n <uib-progressbar animate=\\\"false\\\" value=\\\"$ctrl.cpuUsagePercent\\\" type=\\\"{{ $ctrl.cpuUsagePercent | kubernetesUsageLevelInfo }}\\\">\\n <b style=\\\"white-space: nowrap;\\\"> {{ $ctrl.cpuUsage | kubernetesApplicationCPUValue }} / {{ $ctrl.cpuLimit }} - {{ $ctrl.cpuUsagePercent }}% </b>\\n </uib-progressbar>\\n </div>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import angular from 'angular';\n\nclass KubernetesResourceReservationController {\n usageValues() {\n if (this.cpuLimit) {\n this.cpuReservationPercent = Math.round((this.cpuReservation / this.cpuLimit) * 100);\n }\n if (this.memoryLimit) {\n this.memoryReservationPercent = Math.round((this.memoryReservation / this.memoryLimit) * 100);\n }\n\n if (this.displayUsage && this.cpuLimit && this.memoryLimit) {\n this.cpuUsagePercent = Math.round((this.cpuUsage / this.cpuLimit) * 100);\n this.memoryUsagePercent = Math.round((this.memoryUsage / this.memoryLimit) * 100);\n }\n }\n\n $onInit() {\n this.usageValues();\n }\n\n $onChanges() {\n this.usageValues();\n }\n}\n\nexport default KubernetesResourceReservationController;\nangular.module('portainer.kubernetes').controller('KubernetesResourceReservationController', KubernetesResourceReservationController);\n","const autoNgTemplateLoaderTemplate1 = require('./viewHeader.html');\n\nangular.module('portainer.kubernetes').component('kubernetesViewHeader', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n transclude: true,\n bindings: {\n viewReady: '<',\n title: '@',\n state: '@',\n },\n});\n","var path = 'app/kubernetes/components/view-header/viewHeader.html';\nvar html = \"<rd-header ng-if=\\\"$ctrl.viewReady\\\">\\n <rd-header-title title-text=\\\"{{ $ctrl.title }}\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"refresh the view\\\" ui-sref=\\\"{{ $ctrl.state }}\\\" ui-sref-opts=\\\"{reload: $ctrl.state}\\\" ng-if=\\\"$ctrl.viewReady\\\">\\n <i class=\\\"fa fa-sm fa-sync\\\" aria-hidden=\\\"true\\\" data-cy=\\\"component-refreshTableButton\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content>\\n <ng-transclude></ng-transclude>\\n </rd-header-content>\\n</rd-header>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./viewLoading.html');\n\nangular.module('portainer.kubernetes').component('kubernetesViewLoading', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n viewReady: '<',\n },\n});\n","var path = 'app/kubernetes/components/view-loading/viewLoading.html';\nvar html = \"<div class=\\\"loading-view-area\\\" ng-if=\\\"!$ctrl.viewReady\\\">\\n <div class=\\\"sk-fold sk-center\\\">\\n <div class=\\\"sk-fold-cube\\\"></div>\\n <div class=\\\"sk-fold-cube\\\"></div>\\n <div class=\\\"sk-fold-cube\\\"></div>\\n <div class=\\\"sk-fold-cube\\\"></div>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./yamlInspector.html');\n\nangular.module('portainer.kubernetes').component('kubernetesYamlInspector', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'KubernetesYamlInspectorController',\n bindings: {\n key: '@',\n data: '<',\n },\n});\n","var path = 'app/kubernetes/components/yaml-inspector/yamlInspector.html';\nvar html = \"<div>\\n <code-editor identifier=\\\"application-details-yaml\\\" read-only=\\\"true\\\" value=\\\"$ctrl.data\\\"></code-editor>\\n <div style=\\\"margin: 15px;\\\">\\n <span class=\\\"btn btn-primary btn-sm\\\" ng-click=\\\"$ctrl.copyYAML()\\\"><i class=\\\"fa fa-copy space-right\\\" aria-hidden=\\\"true\\\"></i>Copy to clipboard</span>\\n <span class=\\\"btn btn-primary btn-sm space-left\\\" ng-click=\\\"$ctrl.toggleYAMLInspectorExpansion()\\\">\\n <i class=\\\"fa fa-{{ $ctrl.expanded ? 'minus' : 'plus' }} space-right\\\" aria-hidden=\\\"true\\\"></i>{{ $ctrl.expanded ? 'Collapse' : 'Expand' }}</span>\\n <span id=\\\"copyNotificationYAML\\\" style=\\\"margin-left: 7px; display: none; color: #23ae89;\\\" class=\\\"small\\\"> <i class=\\\"fa fa-check\\\" aria-hidden=\\\"true\\\"></i> copied </span>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import angular from 'angular';\n\nclass KubernetesYamlInspectorController {\n /* @ngInject */\n\n constructor(clipboard) {\n this.clipboard = clipboard;\n this.expanded = false;\n }\n\n copyYAML() {\n this.clipboard.copyText(this.data);\n $('#copyNotificationYAML').show().fadeOut(2500);\n }\n\n toggleYAMLInspectorExpansion() {\n let selector = 'kubernetes-yaml-inspector code-editor > div.CodeMirror';\n let height = this.expanded ? '500px' : '80vh';\n $(selector).css({ height: height });\n this.expanded = !this.expanded;\n }\n}\n\nexport default KubernetesYamlInspectorController;\nangular.module('portainer.kubernetes').controller('KubernetesYamlInspectorController', KubernetesYamlInspectorController);\n","angular.module('portainer.kubernetes').factory('KubernetesEndpoints', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n 'EndpointProvider',\n function KubernetesEndpointsFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider) {\n 'use strict';\n return function (namespace) {\n const url = API_ENDPOINT_ENDPOINTS + '/:endpointId/kubernetes/api/v1' + (namespace ? '/namespaces/:namespace' : '') + '/endpoints/:id';\n return $resource(\n url,\n {\n endpointId: EndpointProvider.endpointID,\n namespace: namespace,\n },\n {\n get: {\n method: 'GET',\n ignoreLoadingBar: true,\n },\n }\n );\n };\n },\n]);\n","import _ from 'lodash-es';\nimport angular from 'angular';\nimport PortainerError from 'Portainer/error';\nimport KubernetesEndpointConverter from 'Kubernetes/endpoint/converter';\n\nclass KubernetesEndpointService {\n /* @ngInject */\n constructor($async, KubernetesEndpoints) {\n this.$async = $async;\n this.KubernetesEndpoints = KubernetesEndpoints;\n\n this.getAllAsync = this.getAllAsync.bind(this);\n }\n\n /**\n * GET\n */\n async getAllAsync(namespace) {\n try {\n const data = await this.KubernetesEndpoints(namespace).get().$promise;\n return _.map(data.items, (item) => KubernetesEndpointConverter.apiToEndpoint(item));\n } catch (err) {\n throw new PortainerError('Unable to retrieve environments', err);\n }\n }\n\n get(namespace) {\n return this.$async(this.getAllAsync, namespace);\n }\n}\n\nexport default KubernetesEndpointService;\nangular.module('portainer.kubernetes').service('KubernetesEndpointService', KubernetesEndpointService);\n","import _ from 'lodash-es';\nimport { KubernetesApplicationDataAccessPolicies } from 'Kubernetes/models/application/models';\nimport { KubernetesApplicationTypes, KubernetesApplicationTypeStrings } from 'Kubernetes/models/application/models';\nimport { KubernetesPodNodeAffinityNodeSelectorRequirementOperators } from 'Kubernetes/pod/models';\n\nangular\n .module('portainer.kubernetes')\n .filter('kubernetesApplicationServiceTypeIcon', function () {\n 'use strict';\n return function (text) {\n var status = _.toLower(text);\n switch (status) {\n case 'loadbalancer':\n return 'fa-project-diagram';\n case 'clusterip':\n return 'fa-list-alt';\n case 'nodeport':\n return 'fa-list';\n }\n };\n })\n .filter('kubernetesApplicationServiceTypeText', function () {\n 'use strict';\n return function (text) {\n var status = _.toLower(text);\n switch (status) {\n case 'loadbalancer':\n return 'LoadBalancer';\n case 'clusterip':\n return 'ClusterIP';\n case 'nodeport':\n return 'NodePort';\n }\n };\n })\n .filter('kubernetesApplicationTypeText', function () {\n 'use strict';\n return function (type) {\n switch (type) {\n case KubernetesApplicationTypes.DEPLOYMENT:\n return KubernetesApplicationTypeStrings.DEPLOYMENT;\n case KubernetesApplicationTypes.DAEMONSET:\n return KubernetesApplicationTypeStrings.DAEMONSET;\n case KubernetesApplicationTypes.STATEFULSET:\n return KubernetesApplicationTypeStrings.STATEFULSET;\n case KubernetesApplicationTypes.POD:\n return KubernetesApplicationTypeStrings.POD;\n case KubernetesApplicationTypes.HELM:\n return KubernetesApplicationTypeStrings.HELM;\n default:\n return '-';\n }\n };\n })\n .filter('kubernetesApplicationCPUValue', function () {\n 'use strict';\n return function (value) {\n return _.round(value, 2);\n };\n })\n .filter('kubernetesApplicationDataAccessPolicyIcon', function () {\n 'use strict';\n return function (value) {\n switch (value) {\n case KubernetesApplicationDataAccessPolicies.ISOLATED:\n return 'fa-cubes';\n case KubernetesApplicationDataAccessPolicies.SHARED:\n return 'fa-cube';\n }\n };\n })\n .filter('kubernetesApplicationDataAccessPolicyText', function () {\n 'use strict';\n return function (value) {\n switch (value) {\n case KubernetesApplicationDataAccessPolicies.ISOLATED:\n return 'Isolated';\n case KubernetesApplicationDataAccessPolicies.SHARED:\n return 'Shared';\n }\n };\n })\n .filter('kubernetesApplicationDataAccessPolicyTooltip', function () {\n 'use strict';\n return function (value) {\n switch (value) {\n case KubernetesApplicationDataAccessPolicies.ISOLATED:\n return 'All the instances of this application are using their own data.';\n case KubernetesApplicationDataAccessPolicies.SHARED:\n return 'All the instances of this application are sharing the same data.';\n }\n };\n })\n .filter('kubernetesApplicationConstraintNodeAffinityValue', function () {\n 'use strict';\n return function (values, operator) {\n if (operator === KubernetesPodNodeAffinityNodeSelectorRequirementOperators.IN || operator === KubernetesPodNodeAffinityNodeSelectorRequirementOperators.NOT_IN) {\n return values;\n } else if (\n operator === KubernetesPodNodeAffinityNodeSelectorRequirementOperators.EXISTS ||\n operator === KubernetesPodNodeAffinityNodeSelectorRequirementOperators.DOES_NOT_EXIST\n ) {\n return '';\n } else if (\n operator === KubernetesPodNodeAffinityNodeSelectorRequirementOperators.GREATER_THAN ||\n operator === KubernetesPodNodeAffinityNodeSelectorRequirementOperators.LOWER_THAN\n ) {\n return values[0];\n }\n return '';\n };\n })\n .filter('kubernetesNodeLabelHumanReadbleText', function () {\n 'use strict';\n return function (text) {\n const values = {\n 'kubernetes.io/os': 'Operating system',\n 'kubernetes.io/arch': 'Architecture',\n 'kubernetes.io/hostname': 'Node',\n };\n return values[text] || text;\n };\n })\n .filter('kubernetesApplicationIngressEmptyHostname', function () {\n 'use strict';\n return function (value) {\n if (value === '') {\n return '<use IP>';\n } else {\n return value;\n }\n };\n });\n","import { KubernetesConfigurationTypes } from 'Kubernetes/models/configuration/models';\n\nangular.module('portainer.kubernetes').filter('kubernetesConfigurationTypeText', function () {\n 'use strict';\n return function (type) {\n switch (type) {\n case KubernetesConfigurationTypes.SECRET:\n return 'Secret';\n case KubernetesConfigurationTypes.CONFIGMAP:\n return 'ConfigMap';\n }\n };\n});\n","import _ from 'lodash-es';\n\nangular.module('portainer.kubernetes').filter('kubernetesEventTypeColor', function () {\n 'use strict';\n return function (text) {\n var status = _.toLower(text);\n switch (status) {\n case 'normal':\n return 'info';\n case 'warning':\n return 'warning';\n default:\n return 'danger';\n }\n };\n});\n","angular.module('portainer.kubernetes').filter('kubernetesUsageLevelInfo', function () {\n return function (usage) {\n if (usage >= 80) {\n return 'danger';\n } else if (usage > 50 && usage < 80) {\n return 'warning';\n } else {\n return 'success';\n }\n };\n});\n","import angular from 'angular';\n\nangular.module('portainer.kubernetes').factory('HelmFactory', HelmFactory);\n\n/* @ngInject */\nfunction HelmFactory($resource, API_ENDPOINT_ENDPOINTS) {\n const helmUrl = API_ENDPOINT_ENDPOINTS + '/:endpointId/kubernetes/helm';\n const templatesUrl = '/api/templates/helm';\n\n return $resource(\n helmUrl,\n {},\n {\n templates: {\n url: templatesUrl,\n method: 'GET',\n params: { repo: '@repo' },\n cache: true,\n },\n show: {\n url: `${templatesUrl}/:type`,\n method: 'GET',\n params: { repo: '@repo', chart: '@chart' },\n transformResponse: function (data) {\n return { values: data };\n },\n },\n getHelmRepositories: {\n method: 'GET',\n url: `${helmUrl}/repositories`,\n },\n addHelmRepository: {\n method: 'POST',\n url: `${helmUrl}/repositories`,\n },\n list: {\n method: 'GET',\n isArray: true,\n params: { namespace: '@namespace', selector: '@selector', filter: '@filter', output: '@output' },\n },\n install: { method: 'POST' },\n uninstall: {\n url: `${helmUrl}/:release`,\n method: 'DELETE',\n params: { namespace: '@namespace' },\n },\n }\n );\n}\n","import angular from 'angular';\nimport PortainerError from 'Portainer/error';\n\nangular.module('portainer.kubernetes').factory('HelmService', HelmService);\n\n/* @ngInject */\nexport function HelmService(HelmFactory) {\n return {\n search,\n values,\n getHelmRepositories,\n addHelmRepository,\n install,\n uninstall,\n listReleases,\n };\n\n /**\n * @description: Searches for all helm charts in a helm repo\n * @param {string} repo - repo url to search charts for\n * @returns {Promise} - Resolves with `index.yaml` of helm charts for a repo\n * @throws {PortainerError} - Rejects with error if searching for the `index.yaml` fails\n */\n async function search(repo) {\n try {\n return await HelmFactory.templates({ repo }).$promise;\n } catch (err) {\n throw new PortainerError('Unable to retrieve helm charts', err);\n }\n }\n\n /**\n * @description: Show values helm of a helm chart, this basically runs `helm show values`\n * @param {string} repo - repo url to search charts values for\n * @param {string} chart - chart within the repo to retrieve default values\n * @returns {Promise} - Resolves with `values.yaml` of helm chart values for a repo\n * @throws {PortainerError} - Rejects with error if helm show fails\n */\n async function values(repo, chart) {\n try {\n return await HelmFactory.show({ repo, chart, type: 'values' }).$promise;\n } catch (err) {\n throw new PortainerError('Unable to retrieve values from chart', err);\n }\n }\n\n /**\n * @description: Get a list of all the helm repositories available for the current user\n * @returns {Promise} - Resolves with an object containing list of user helm repos and default/global settings helm repo\n * @throws {PortainerError} - Rejects with error if helm show fails\n */\n async function getHelmRepositories(endpointId) {\n return await HelmFactory.getHelmRepositories({ endpointId }).$promise;\n }\n\n /**\n * @description: Adds a helm repo for the calling user\n * @param {Object} payload - helm repo url to add for the user\n * @returns {Promise} - Resolves with `values.yaml` of helm chart values for a repo\n * @throws {PortainerError} - Rejects with error if helm show fails\n */\n async function addHelmRepository(endpointId, payload) {\n return await HelmFactory.addHelmRepository({ endpointId }, payload).$promise;\n }\n\n /**\n * @description: Installs a helm chart, this basically runs `helm install`\n * @returns {Promise} - Resolves with `values.yaml` of helm chart values for a repo\n * @throws {PortainerError} - Rejects with error if helm show fails\n */\n async function install(endpointId, payload) {\n return await HelmFactory.install({ endpointId }, payload).$promise;\n }\n\n /**\n * @description: Uninstall a helm chart, this basically runs `helm uninstall`\n * @param {Object} options - Options object, release `Name` is the only required option\n * @throws {PortainerError} - Rejects with error if helm show fails\n */\n async function uninstall(endpointId, { Name, ResourcePool }) {\n try {\n await HelmFactory.uninstall({ endpointId, release: Name, namespace: ResourcePool }).$promise;\n } catch (err) {\n throw new PortainerError('Unable to delete release', err);\n }\n }\n\n /**\n * @description: List all helm releases based on passed in options, this basically runs `helm list`\n * @param {Object} options - Supported CLI flags to pass to Helm (binary) - flags to `helm list`\n * @returns {Promise} - Resolves with list of helm releases\n * @throws {PortainerError} - Rejects with error if helm list fails\n */\n async function listReleases(endpointId, { namespace, selector, filter, output }) {\n try {\n const releases = await HelmFactory.list({ endpointId, selector, namespace, filter, output }).$promise;\n return releases;\n } catch (err) {\n throw new PortainerError('Unable to retrieve release list', err);\n }\n }\n}\n","import KubernetesStackHelper from './stackHelper';\n\ndescribe('stacksFromApplications', () => {\n const { stacksFromApplications } = KubernetesStackHelper;\n test('should return an empty array when passed an empty array', () => {\n expect(stacksFromApplications([])).toHaveLength(0);\n });\n\n test('should return an empty array when passed a list of applications without stacks', () => {\n expect(stacksFromApplications([{ StackName: '' }, { StackName: '' }, { StackName: '' }, { StackName: '' }])).toHaveLength(0);\n });\n});\n","import { rawResponse } from 'Kubernetes/rest/response/transform';\n\nangular.module('portainer.kubernetes').factory('KubernetesHorizontalPodAutoScalers', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n 'EndpointProvider',\n function KubernetesHorizontalPodAutoScalersFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider) {\n 'use strict';\n return function (namespace) {\n const url = API_ENDPOINT_ENDPOINTS + '/:endpointId/kubernetes/apis/autoscaling/v1' + (namespace ? '/namespaces/:namespace' : '') + '/horizontalpodautoscalers/:id/:action';\n return $resource(\n url,\n {\n endpointId: EndpointProvider.endpointID,\n namespace: namespace,\n },\n {\n get: {\n method: 'GET',\n ignoreLoadingBar: true,\n },\n getYaml: {\n method: 'GET',\n headers: {\n Accept: 'application/yaml',\n },\n transformResponse: rawResponse,\n ignoreLoadingBar: true,\n },\n create: { method: 'POST' },\n update: { method: 'PUT' },\n patch: {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json-patch+json',\n },\n },\n rollback: {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json-patch+json',\n },\n },\n delete: { method: 'DELETE' },\n }\n );\n };\n },\n]);\n","import angular from 'angular';\nimport _ from 'lodash-es';\nimport PortainerError from 'Portainer/error';\nimport { KubernetesCommonParams } from 'Kubernetes/models/common/params';\nimport { KubernetesHorizontalPodAutoScalerConverter } from './converter';\n\nclass KubernetesHorizontalPodAutoScalerService {\n /* @ngInject */\n constructor($async, KubernetesHorizontalPodAutoScalers) {\n this.$async = $async;\n this.KubernetesHorizontalPodAutoScalers = KubernetesHorizontalPodAutoScalers;\n\n this.getAsync = this.getAsync.bind(this);\n this.getAllAsync = this.getAllAsync.bind(this);\n this.createAsync = this.createAsync.bind(this);\n this.patchAsync = this.patchAsync.bind(this);\n // this.rollbackAsync = this.rollbackAsync.bind(this);\n this.deleteAsync = this.deleteAsync.bind(this);\n }\n\n /**\n * GET\n */\n async getAsync(namespace, name) {\n try {\n const params = new KubernetesCommonParams();\n params.id = name;\n const [raw, yaml] = await Promise.all([\n this.KubernetesHorizontalPodAutoScalers(namespace).get(params).$promise,\n this.KubernetesHorizontalPodAutoScalers(namespace).getYaml(params).$promise,\n ]);\n const res = KubernetesHorizontalPodAutoScalerConverter.apiToModel(raw, yaml);\n return res;\n } catch (err) {\n throw new PortainerError('Unable to retrieve HorizontalPodAutoScaler', err);\n }\n }\n\n async getAllAsync(namespace) {\n try {\n const data = await this.KubernetesHorizontalPodAutoScalers(namespace).get().$promise;\n const res = _.map(data.items, (item) => KubernetesHorizontalPodAutoScalerConverter.apiToModel(item));\n return res;\n } catch (err) {\n throw new PortainerError('Unable to retrieve HorizontalPodAutoScalers', err);\n }\n }\n\n get(namespace, name) {\n if (name) {\n return this.$async(this.getAsync, namespace, name);\n }\n return this.$async(this.getAllAsync, namespace);\n }\n\n /**\n * CREATE\n */\n async createAsync(horizontalPodAutoScaler) {\n try {\n const params = {};\n const payload = KubernetesHorizontalPodAutoScalerConverter.createPayload(horizontalPodAutoScaler);\n const namespace = payload.metadata.namespace;\n const data = await this.KubernetesHorizontalPodAutoScalers(namespace).create(params, payload).$promise;\n return data;\n } catch (err) {\n throw new PortainerError('Unable to create horizontalPodAutoScaler', err);\n }\n }\n\n create(horizontalPodAutoScaler) {\n return this.$async(this.createAsync, horizontalPodAutoScaler);\n }\n\n /**\n * PATCH\n */\n async patchAsync(oldHorizontalPodAutoScaler, newHorizontalPodAutoScaler) {\n try {\n const params = new KubernetesCommonParams();\n params.id = newHorizontalPodAutoScaler.Name;\n const namespace = newHorizontalPodAutoScaler.Namespace;\n const payload = KubernetesHorizontalPodAutoScalerConverter.patchPayload(oldHorizontalPodAutoScaler, newHorizontalPodAutoScaler);\n if (!payload.length) {\n return;\n }\n const data = await this.KubernetesHorizontalPodAutoScalers(namespace).patch(params, payload).$promise;\n return data;\n } catch (err) {\n throw new PortainerError('Unable to patch horizontalPodAutoScaler', err);\n }\n }\n\n patch(oldHorizontalPodAutoScaler, newHorizontalPodAutoScaler) {\n return this.$async(this.patchAsync, oldHorizontalPodAutoScaler, newHorizontalPodAutoScaler);\n }\n\n /**\n * DELETE\n */\n async deleteAsync(horizontalPodAutoScaler) {\n try {\n const params = new KubernetesCommonParams();\n params.id = horizontalPodAutoScaler.Name;\n const namespace = horizontalPodAutoScaler.Namespace;\n await this.KubernetesHorizontalPodAutoScalers(namespace).delete(params).$promise;\n } catch (err) {\n throw new PortainerError('Unable to remove horizontalPodAutoScaler', err);\n }\n }\n\n delete(horizontalPodAutoScaler) {\n return this.$async(this.deleteAsync, horizontalPodAutoScaler);\n }\n\n // /**\n // * ROLLBACK\n // */\n // async rollbackAsync(namespace, name, payload) {\n // try {\n // const params = new KubernetesCommonParams();\n // params.id = name;\n // await this.KubernetesHorizontalPodAutoScalers(namespace).rollback(params, payload).$promise;\n // } catch (err) {\n // throw new PortainerError('Unable to rollback horizontalPodAutoScaler', err);\n // }\n // }\n\n // rollback(namespace, name, payload) {\n // return this.$async(this.rollbackAsync, namespace, name, payload);\n // }\n}\n\nexport default KubernetesHorizontalPodAutoScalerService;\nangular.module('portainer.kubernetes').service('KubernetesHorizontalPodAutoScalerService', KubernetesHorizontalPodAutoScalerService);\n","import { rawResponse } from 'Kubernetes/rest/response/transform';\n\nangular.module('portainer.kubernetes').factory('KubernetesIngresses', factory);\n\nfunction factory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider) {\n 'use strict';\n return function (namespace) {\n const url = `${API_ENDPOINT_ENDPOINTS}/:endpointId/kubernetes/apis/networking.k8s.io/v1${namespace ? '/namespaces/:namespace' : ''}/ingresses/:id/:action`;\n return $resource(\n url,\n {\n endpointId: EndpointProvider.endpointID,\n namespace: namespace,\n },\n {\n get: {\n method: 'GET',\n ignoreLoadingBar: true,\n },\n getYaml: {\n method: 'GET',\n headers: {\n Accept: 'application/yaml',\n },\n transformResponse: rawResponse,\n ignoreLoadingBar: true,\n },\n create: { method: 'POST' },\n update: { method: 'PUT' },\n patch: {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json-patch+json',\n },\n },\n rollback: {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json-patch+json',\n },\n },\n delete: { method: 'DELETE' },\n }\n );\n };\n}\n","import _ from 'lodash-es';\nimport angular from 'angular';\nimport PortainerError from 'Portainer/error';\nimport { KubernetesCommonParams } from 'Kubernetes/models/common/params';\nimport { KubernetesIngressConverter } from './converter';\n\n/* @ngInject */\nexport function KubernetesIngressService($async, KubernetesIngresses) {\n return {\n get,\n create,\n patch,\n delete: _delete,\n };\n\n async function getOne(namespace, name) {\n try {\n const params = new KubernetesCommonParams();\n params.id = name;\n const [raw, yaml] = await Promise.all([KubernetesIngresses(namespace).get(params).$promise, KubernetesIngresses(namespace).getYaml(params).$promise]);\n const res = {\n Raw: KubernetesIngressConverter.apiToModel(raw),\n Yaml: yaml.data,\n };\n return res;\n } catch (err) {\n throw new PortainerError('Unable to retrieve Ingress', err);\n }\n }\n\n async function getAll(namespace) {\n try {\n const data = await KubernetesIngresses(namespace).get().$promise;\n const res = _.reduce(data.items, (arr, item) => _.concat(arr, KubernetesIngressConverter.apiToModel(item)), []);\n return res;\n } catch (err) {\n throw new PortainerError('Unable to retrieve Ingresses', err);\n }\n }\n\n function get(namespace, name) {\n if (name) {\n return $async(getOne, namespace, name);\n }\n return $async(getAll, namespace);\n }\n\n function create(ingress) {\n return $async(async () => {\n try {\n const params = {};\n const payload = KubernetesIngressConverter.createPayload(ingress);\n const namespace = payload.metadata.namespace;\n const data = await KubernetesIngresses(namespace).create(params, payload).$promise;\n return data;\n } catch (err) {\n throw new PortainerError('Unable to create ingress', err);\n }\n });\n }\n\n function patch(oldIngress, newIngress) {\n return $async(async () => {\n try {\n const params = new KubernetesCommonParams();\n params.id = newIngress.Name;\n const namespace = newIngress.Namespace;\n const payload = KubernetesIngressConverter.patchPayload(oldIngress, newIngress);\n if (!payload.length) {\n return;\n }\n const data = await KubernetesIngresses(namespace).patch(params, payload).$promise;\n return data;\n } catch (err) {\n throw new PortainerError('Unable to patch ingress', err);\n }\n });\n }\n\n function _delete(namespace, ingressClassName) {\n return $async(async () => {\n try {\n const params = new KubernetesCommonParams();\n params.id = ingressClassName;\n await KubernetesIngresses(namespace).delete(params).$promise;\n } catch (err) {\n throw new PortainerError('Unable to delete ingress', err);\n }\n });\n }\n}\n\nangular.module('portainer.kubernetes').service('KubernetesIngressService', KubernetesIngressService);\n","import angular from 'angular';\nimport PortainerError from 'Portainer/error';\nimport { KubernetesCommonParams } from 'Kubernetes/models/common/params';\n\nclass KubernetesMetricsService {\n /* @ngInject */\n constructor($async, KubernetesMetrics) {\n this.$async = $async;\n this.KubernetesMetrics = KubernetesMetrics;\n\n this.capabilitiesAsync = this.capabilitiesAsync.bind(this);\n\n this.getPodAsync = this.getPodAsync.bind(this);\n this.getNodeAsync = this.getNodeAsync.bind(this);\n\n this.getPodsAsync = this.getPodsAsync.bind(this);\n this.getNodesAsync = this.getNodesAsync.bind(this);\n }\n\n /**\n * GET\n */\n async capabilitiesAsync(endpointID) {\n try {\n await this.KubernetesMetrics().capabilities({ endpointId: endpointID }).$promise;\n } catch (err) {\n throw new PortainerError('Unable to retrieve metrics', err);\n }\n }\n\n capabilities(endpointID) {\n return this.$async(this.capabilitiesAsync, endpointID);\n }\n\n /**\n * Stats of Node\n *\n * @param {string} nodeName\n */\n async getNodeAsync(nodeName) {\n try {\n const params = new KubernetesCommonParams();\n params.id = nodeName;\n const data = await this.KubernetesMetrics().getNode(params).$promise;\n return data;\n } catch (err) {\n throw new PortainerError('Unable to retrieve node stats', err);\n }\n }\n\n getNode(nodeName) {\n return this.$async(this.getNodeAsync, nodeName);\n }\n\n /**\n * Stats\n *\n * @param {string} namespace\n * @param {string} podName\n */\n async getPodAsync(namespace, podName) {\n try {\n const params = new KubernetesCommonParams();\n params.id = podName;\n const data = await this.KubernetesMetrics(namespace).getPod(params).$promise;\n return data;\n } catch (err) {\n throw new PortainerError('Unable to retrieve pod stats', err);\n }\n }\n\n getPod(namespace, podName) {\n return this.$async(this.getPodAsync, namespace, podName);\n }\n\n /**\n * Stats of Nodes in cluster\n *\n * @param {string} endpointID\n */\n async getNodesAsync(endpointID) {\n try {\n const data = await this.KubernetesMetrics().getNodes({ endpointId: endpointID }).$promise;\n return data;\n } catch (err) {\n throw new PortainerError('Unable to retrieve nodes stats', err);\n }\n }\n\n getNodes(endpointID) {\n return this.$async(this.getNodesAsync, endpointID);\n }\n\n /**\n * Stats of Pods in a namespace\n *\n * @param {string} namespace\n */\n async getPodsAsync(namespace) {\n try {\n const data = await this.KubernetesMetrics(namespace).getPods().$promise;\n return data;\n } catch (err) {\n throw new PortainerError('Unable to retrieve pod stats', err);\n }\n }\n\n getPods(namespace) {\n return this.$async(this.getPodsAsync, namespace);\n }\n}\n\nexport default KubernetesMetricsService;\nangular.module('portainer.kubernetes').service('KubernetesMetricsService', KubernetesMetricsService);\n","angular.module('portainer.kubernetes').factory('KubernetesMetrics', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n 'EndpointProvider',\n function KubernetesMetrics($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider) {\n 'use strict';\n return function (namespace) {\n const url = API_ENDPOINT_ENDPOINTS + '/:endpointId/kubernetes/apis/metrics.k8s.io/v1beta1';\n const podUrl = `${url}${namespace ? '/namespaces/:namespace' : ''}/pods/:id`;\n\n return $resource(\n url,\n {\n endpointId: EndpointProvider.endpointID,\n namespace: namespace,\n },\n {\n capabilities: { method: 'GET' },\n getPod: {\n method: 'GET',\n url: podUrl,\n },\n getNode: {\n method: 'GET',\n url: `${url}/nodes/:id`,\n },\n getPods: {\n method: 'GET',\n url: `${url}/namespaces/:namespace/pods`,\n },\n getNodes: {\n method: 'GET',\n url: `${url}/nodes`,\n },\n }\n );\n };\n },\n]);\n","import _ from 'lodash-es';\n\nangular\n .module('portainer.kubernetes')\n .filter('kubernetesNodeStatusColor', function () {\n 'use strict';\n return function (text) {\n var status = _.toLower(text);\n switch (status) {\n case 'ready':\n return 'success';\n case 'warning':\n return 'warning';\n default:\n return 'danger';\n }\n };\n })\n .filter('kubernetesNodeConditionsMessage', function () {\n 'use strict';\n return function (conditions) {\n if (conditions.MemoryPressure) {\n return 'Node memory is running low';\n }\n if (conditions.PIDPressure) {\n return 'Too many processes running on the node';\n }\n if (conditions.DiskPressure) {\n return 'Node disk capacity is running low';\n }\n if (conditions.NetworkUnavailable) {\n return 'Incorrect node network configuration';\n }\n };\n });\n","import { rawResponse } from 'Kubernetes/rest/response/transform';\n\nangular.module('portainer.kubernetes').factory('KubernetesNodes', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n 'EndpointProvider',\n function KubernetesNodesFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider) {\n 'use strict';\n return function () {\n const url = API_ENDPOINT_ENDPOINTS + '/:endpointId/kubernetes/api/v1/nodes/:id/:action';\n return $resource(\n url,\n {\n endpointId: EndpointProvider.endpointID,\n },\n {\n get: {\n method: 'GET',\n ignoreLoadingBar: true,\n },\n getYaml: {\n method: 'GET',\n headers: {\n Accept: 'application/yaml',\n },\n transformResponse: rawResponse,\n ignoreLoadingBar: true,\n },\n create: { method: 'POST' },\n update: { method: 'PUT' },\n patch: {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json-patch+json',\n },\n },\n delete: { method: 'DELETE' },\n }\n );\n };\n },\n]);\n","import angular from 'angular';\nimport _ from 'lodash-es';\n\nimport PortainerError from 'Portainer/error';\nimport KubernetesNodeConverter from 'Kubernetes/node/converter';\nimport { KubernetesCommonParams } from 'Kubernetes/models/common/params';\n\nclass KubernetesNodeService {\n /* @ngInject */\n constructor($async, KubernetesNodes) {\n this.$async = $async;\n this.KubernetesNodes = KubernetesNodes;\n\n this.getAsync = this.getAsync.bind(this);\n this.getAllAsync = this.getAllAsync.bind(this);\n this.patchAsync = this.patchAsync.bind(this);\n }\n\n /**\n * GET\n */\n async getAsync(name) {\n try {\n const params = new KubernetesCommonParams();\n params.id = name;\n const [details, yaml] = await Promise.all([this.KubernetesNodes().get(params).$promise, this.KubernetesNodes().getYaml(params).$promise]);\n return KubernetesNodeConverter.apiToNodeDetails(details, yaml);\n } catch (err) {\n // changing the structure of error message to fix [object, Object] issue\n const errData = err.data;\n throw new PortainerError('Unable to retrieve node details', errData);\n }\n }\n\n async getAllAsync() {\n try {\n const data = await this.KubernetesNodes().get().$promise;\n return _.map(data.items, (item) => KubernetesNodeConverter.apiToNode(item));\n } catch (err) {\n throw { msg: 'Unable to retrieve nodes', err: err };\n }\n }\n\n get(name) {\n if (name) {\n return this.$async(this.getAsync, name);\n }\n return this.$async(this.getAllAsync);\n }\n\n /**\n * PATCH\n */\n\n async patchAsync(node, nodeFormValues) {\n try {\n const params = new KubernetesCommonParams();\n params.id = node.Name;\n const newNode = KubernetesNodeConverter.formValuesToNode(node, nodeFormValues);\n const payload = KubernetesNodeConverter.patchPayload(node, newNode);\n const data = await this.KubernetesNodes().patch(params, payload).$promise;\n const patchedNode = KubernetesNodeConverter.apiToNodeDetails(data);\n return patchedNode;\n } catch (err) {\n throw { msg: 'Unable to patch node', err: err };\n }\n }\n\n patch(node, nodeFormValues) {\n return this.$async(this.patchAsync, node, nodeFormValues);\n }\n}\n\nexport default KubernetesNodeService;\nangular.module('portainer.kubernetes').service('KubernetesNodeService', KubernetesNodeService);\n","import _ from 'lodash-es';\n\nangular\n .module('portainer.kubernetes')\n .filter('kubernetesPodStatusColor', function () {\n 'use strict';\n return function (text) {\n var status = _.toLower(text);\n switch (status) {\n case 'running':\n return 'success';\n case 'waiting':\n return 'warning';\n case 'terminated':\n return 'info';\n default:\n return 'danger';\n }\n };\n })\n .filter('kubernetesPodConditionStatusBadge', function () {\n 'use strict';\n return function (status, type) {\n switch (type) {\n case 'Unschedulable':\n switch (status) {\n case 'True':\n return 'fa-exclamation-triangle red-icon';\n case 'False':\n return 'fa-check green-icon';\n case 'Unknown':\n return 'fa-exclamation-circle orange-icon';\n }\n break;\n case 'PodScheduled':\n case 'Ready':\n case 'Initialized':\n case 'ContainersReady':\n switch (status) {\n case 'True':\n return 'fa-check green-icon';\n case 'False':\n return 'fa-exclamation-triangle red-icon';\n case 'Unknown':\n return 'fa-exclamation-circle orange-icon';\n }\n break;\n default:\n return 'fa-question-circle red-icon';\n }\n };\n })\n .filter('kubernetesPodConditionStatusText', function () {\n 'use strict';\n return function (status, type) {\n switch (type) {\n case 'Unschedulable':\n switch (status) {\n case 'True':\n return 'Alert';\n case 'False':\n return 'OK';\n case 'Unknown':\n return 'Warning';\n }\n break;\n case 'PodScheduled':\n case 'Ready':\n case 'Initialized':\n case 'ContainersReady':\n switch (status) {\n case 'True':\n return 'Ok';\n case 'False':\n return 'Alert';\n case 'Unknown':\n return 'Warning';\n }\n break;\n default:\n return 'Unknown';\n }\n };\n });\n","import angular from 'angular';\nimport PortainerError from 'Portainer/error';\n\nimport { KubernetesCommonParams } from 'Kubernetes/models/common/params';\nimport KubernetesPodConverter from 'Kubernetes/pod/converter';\n\nclass KubernetesPodService {\n /* @ngInject */\n constructor($async, KubernetesPods) {\n this.$async = $async;\n this.KubernetesPods = KubernetesPods;\n\n this.getAsync = this.getAsync.bind(this);\n this.getAllAsync = this.getAllAsync.bind(this);\n this.logsAsync = this.logsAsync.bind(this);\n this.deleteAsync = this.deleteAsync.bind(this);\n this.patchAsync = this.patchAsync.bind(this);\n this.evictionAsync = this.evictionAsync.bind(this);\n }\n\n async getAsync(namespace, name) {\n try {\n const params = new KubernetesCommonParams();\n params.id = name;\n const [raw, yaml] = await Promise.all([this.KubernetesPods(namespace).get(params).$promise, this.KubernetesPods(namespace).getYaml(params).$promise]);\n const res = {\n Raw: raw,\n Yaml: yaml.data,\n };\n return res;\n } catch (err) {\n throw new PortainerError('Unable to retrieve pod', err);\n }\n }\n\n /**\n * GET ALL\n */\n async getAllAsync(namespace) {\n try {\n const data = await this.KubernetesPods(namespace).get().$promise;\n return data.items;\n } catch (err) {\n throw new PortainerError('Unable to retrieve pods', err);\n }\n }\n\n get(namespace, name) {\n if (name) {\n return this.$async(this.getAsync, namespace, name);\n }\n return this.$async(this.getAllAsync, namespace);\n }\n\n /**\n * Logs\n *\n * @param {string} namespace\n * @param {string} podName\n * @param {string} containerName\n */\n async logsAsync(namespace, podName, containerName) {\n try {\n const params = new KubernetesCommonParams();\n params.id = podName;\n if (containerName) {\n params.container = containerName;\n }\n const data = await this.KubernetesPods(namespace).logs(params).$promise;\n return data.logs.length === 0 ? [] : data.logs.split('\\n');\n } catch (err) {\n throw new PortainerError('Unable to retrieve pod logs', err);\n }\n }\n\n logs(namespace, podName, containerName) {\n return this.$async(this.logsAsync, namespace, podName, containerName);\n }\n\n /**\n * PATCH\n */\n async patchAsync(oldPod, newPod) {\n try {\n const params = new KubernetesCommonParams();\n params.id = newPod.Name;\n const namespace = newPod.Namespace;\n const payload = KubernetesPodConverter.patchPayload(oldPod, newPod);\n if (!payload.length) {\n return;\n }\n const data = await this.KubernetesPods(namespace).patch(params, payload).$promise;\n return data;\n } catch (err) {\n throw new PortainerError('Unable to patch pod', err);\n }\n }\n\n patch(oldPod, newPod) {\n return this.$async(this.patchAsync, oldPod, newPod);\n }\n\n /**\n * DELETE\n */\n async deleteAsync(pod) {\n try {\n const params = new KubernetesCommonParams();\n params.id = pod.Name;\n const namespace = pod.Namespace;\n await this.KubernetesPods(namespace).delete(params).$promise;\n } catch (err) {\n throw new PortainerError('Unable to remove pod', err);\n }\n }\n\n delete(pod) {\n return this.$async(this.deleteAsync, pod);\n }\n\n /**\n * EVICT\n */\n async evictionAsync(pod) {\n try {\n const params = new KubernetesCommonParams();\n params.id = pod.Name;\n params.action = 'eviction';\n const namespace = pod.Namespace;\n const podEvictionPayload = KubernetesPodConverter.evictionPayload(pod);\n await this.KubernetesPods(namespace).evict(params, podEvictionPayload).$promise;\n } catch (err) {\n throw new PortainerError('Unable to evict pod', err);\n }\n }\n\n eviction(pod) {\n return this.$async(this.evictionAsync, pod);\n }\n}\n\nexport default KubernetesPodService;\nangular.module('portainer.kubernetes').service('KubernetesPodService', KubernetesPodService);\n","import { rawResponse } from 'Kubernetes/rest/response/transform';\n\nangular.module('portainer.kubernetes').factory('KubernetesConfigMaps', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n 'EndpointProvider',\n function KubernetesConfigMapsFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider) {\n 'use strict';\n return function (namespace) {\n const url = API_ENDPOINT_ENDPOINTS + '/:endpointId/kubernetes/api/v1' + (namespace ? '/namespaces/:namespace' : '') + '/configmaps/:id/:action';\n return $resource(\n url,\n {\n endpointId: EndpointProvider.endpointID,\n namespace: namespace,\n },\n {\n get: {\n method: 'GET',\n ignoreLoadingBar: true,\n },\n getYaml: {\n method: 'GET',\n headers: {\n Accept: 'application/yaml',\n },\n transformResponse: rawResponse,\n ignoreLoadingBar: true,\n },\n create: { method: 'POST' },\n update: { method: 'PUT' },\n delete: { method: 'DELETE' },\n }\n );\n };\n },\n]);\n","import { rawResponse } from 'Kubernetes/rest/response/transform';\n\nangular.module('portainer.kubernetes').factory('KubernetesControllerRevisions', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n 'EndpointProvider',\n function KubernetesControllerRevisionsFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider) {\n 'use strict';\n return function (namespace) {\n const url = API_ENDPOINT_ENDPOINTS + '/:endpointId/kubernetes/apis/apps/v1' + (namespace ? '/namespaces/:namespace' : '') + '/controllerrevisions/:id/:action';\n return $resource(\n url,\n {\n endpointId: EndpointProvider.endpointID,\n namespace: namespace,\n },\n {\n get: {\n method: 'GET',\n ignoreLoadingBar: true,\n },\n getYaml: {\n method: 'GET',\n headers: {\n Accept: 'application/yaml',\n },\n transformResponse: rawResponse,\n ignoreLoadingBar: true,\n },\n create: { method: 'POST' },\n update: { method: 'PUT' },\n patch: {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json-patch+json',\n },\n },\n delete: { method: 'DELETE' },\n }\n );\n };\n },\n]);\n","import { rawResponse } from 'Kubernetes/rest/response/transform';\n\nangular.module('portainer.kubernetes').factory('KubernetesDaemonSets', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n 'EndpointProvider',\n function KubernetesDaemonSetsFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider) {\n 'use strict';\n return function (namespace) {\n const url = API_ENDPOINT_ENDPOINTS + '/:endpointId/kubernetes/apis/apps/v1' + (namespace ? '/namespaces/:namespace' : '') + '/daemonsets/:id/:action';\n return $resource(\n url,\n {\n endpointId: EndpointProvider.endpointID,\n namespace: namespace,\n },\n {\n get: {\n method: 'GET',\n ignoreLoadingBar: true,\n },\n getYaml: {\n method: 'GET',\n headers: {\n Accept: 'application/yaml',\n },\n transformResponse: rawResponse,\n ignoreLoadingBar: true,\n },\n create: { method: 'POST' },\n update: { method: 'PUT' },\n patch: {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json-patch+json',\n },\n },\n rollback: {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/strategic-merge-patch+json',\n },\n },\n delete: { method: 'DELETE' },\n }\n );\n };\n },\n]);\n","import { rawResponse } from 'Kubernetes/rest/response/transform';\n\nangular.module('portainer.kubernetes').factory('KubernetesDeployments', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n 'EndpointProvider',\n function KubernetesDeploymentsFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider) {\n 'use strict';\n return function (namespace) {\n const url = API_ENDPOINT_ENDPOINTS + '/:endpointId/kubernetes/apis/apps/v1' + (namespace ? '/namespaces/:namespace' : '') + '/deployments/:id/:action';\n return $resource(\n url,\n {\n endpointId: EndpointProvider.endpointID,\n namespace: namespace,\n },\n {\n get: {\n method: 'GET',\n ignoreLoadingBar: true,\n },\n getYaml: {\n method: 'GET',\n headers: {\n Accept: 'application/yaml',\n },\n transformResponse: rawResponse,\n ignoreLoadingBar: true,\n },\n create: { method: 'POST' },\n update: { method: 'PUT' },\n patch: {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json-patch+json',\n },\n },\n rollback: {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json-patch+json',\n },\n },\n delete: { method: 'DELETE' },\n }\n );\n };\n },\n]);\n","angular.module('portainer.kubernetes').factory('KubernetesEndpoints', function KubernetesEndpointsFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider) {\n 'use strict';\n return function (namespace) {\n const url = API_ENDPOINT_ENDPOINTS + '/:endpointId/kubernetes/api/v1' + (namespace ? '/namespaces/:namespace' : '') + '/endpoints/:id';\n return $resource(\n url,\n {\n endpointId: EndpointProvider.endpointID,\n namespace: namespace,\n },\n {\n get: {\n method: 'GET',\n ignoreLoadingBar: true,\n },\n }\n );\n };\n});\n","import { rawResponse } from 'Kubernetes/rest/response/transform';\n\nangular.module('portainer.kubernetes').factory('KubernetesEvents', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n 'EndpointProvider',\n function KubernetesEventsFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider) {\n 'use strict';\n return function (namespace) {\n const url = API_ENDPOINT_ENDPOINTS + '/:endpointId/kubernetes/api/v1' + (namespace ? '/namespaces/:namespace' : '') + '/events/:id/:action';\n return $resource(\n url,\n {\n endpointId: EndpointProvider.endpointID,\n namespace: namespace,\n },\n {\n get: {\n method: 'GET',\n ignoreLoadingBar: true,\n },\n getYaml: {\n method: 'GET',\n headers: {\n Accept: 'application/yaml',\n },\n transformResponse: rawResponse,\n ignoreLoadingBar: true,\n },\n create: { method: 'POST' },\n update: { method: 'PUT' },\n delete: { method: 'DELETE' },\n }\n );\n };\n },\n]);\n","angular.module('portainer.kubernetes').factory('KubernetesHealth', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n function KubernetesHealthFactory($resource, API_ENDPOINT_ENDPOINTS) {\n 'use strict';\n return $resource(\n API_ENDPOINT_ENDPOINTS + '/:id/kubernetes/healthz',\n {},\n {\n ping: { method: 'GET', params: { id: 'id' } },\n }\n );\n },\n]);\n","import angular from 'angular';\n\nangular.module('portainer.kubernetes').factory('KubernetesConfig', KubernetesConfigFactory);\n\n/* @ngInject */\nfunction KubernetesConfigFactory($http, EndpointProvider, API_ENDPOINT_KUBERNETES) {\n return { get };\n\n async function get(environmentIDs) {\n return $http({\n method: 'GET',\n url: `${API_ENDPOINT_KUBERNETES}/config`,\n params: { ids: environmentIDs.map((x) => parseInt(x)) },\n responseType: 'blob',\n headers: {\n Accept: 'text/yaml',\n },\n });\n }\n}\n","import { rawResponse } from 'Kubernetes/rest/response/transform';\n\nangular.module('portainer.kubernetes').factory('KubernetesNamespaces', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n 'EndpointProvider',\n function KubernetesNamespacesFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider) {\n 'use strict';\n return function () {\n const url = API_ENDPOINT_ENDPOINTS + '/:endpointId/kubernetes/api/v1/namespaces/:id/:action';\n return $resource(\n url,\n {\n endpointId: EndpointProvider.endpointID,\n },\n {\n get: {\n method: 'GET',\n ignoreLoadingBar: true,\n },\n getYaml: {\n method: 'GET',\n headers: {\n Accept: 'application/yaml',\n },\n transformResponse: rawResponse,\n ignoreLoadingBar: true,\n },\n create: { method: 'POST' },\n update: { method: 'PUT' },\n delete: { method: 'DELETE' },\n status: {\n method: 'GET',\n params: { action: 'status' },\n ignoreLoadingBar: true,\n },\n }\n );\n };\n },\n]);\n","import angular from 'angular';\n\nangular.module('portainer.kubernetes').factory('KubernetesNodesLimits', KubernetesNodesLimitsFactory);\n\n/* @ngInject */\nfunction KubernetesNodesLimitsFactory($resource, API_ENDPOINT_KUBERNETES, EndpointProvider) {\n const url = API_ENDPOINT_KUBERNETES + '/:endpointId/nodes_limits';\n return $resource(\n url,\n {\n endpointId: EndpointProvider.endpointID,\n },\n {\n get: {\n method: 'GET',\n ignoreLoadingBar: true,\n transformResponse: (data) => ({ data: JSON.parse(data) }),\n },\n }\n );\n}\n","import { rawResponse } from 'Kubernetes/rest/response/transform';\n\nangular.module('portainer.kubernetes').factory('KubernetesPersistentVolumeClaims', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n 'EndpointProvider',\n function KubernetesPersistentVolumeClaimsFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider) {\n 'use strict';\n return function (namespace) {\n const url = API_ENDPOINT_ENDPOINTS + '/:endpointId/kubernetes/api/v1' + (namespace ? '/namespaces/:namespace' : '') + '/persistentvolumeclaims/:id/:action';\n return $resource(\n url,\n {\n endpointId: EndpointProvider.endpointID,\n namespace: namespace,\n },\n {\n get: {\n method: 'GET',\n ignoreLoadingBar: true,\n },\n getYaml: {\n method: 'GET',\n headers: {\n Accept: 'application/yaml',\n },\n transformResponse: rawResponse,\n ignoreLoadingBar: true,\n },\n create: { method: 'POST' },\n update: { method: 'PUT' },\n patch: {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json-patch+json',\n },\n },\n delete: { method: 'DELETE' },\n }\n );\n };\n },\n]);\n","import { rawResponse } from 'Kubernetes/rest/response/transform';\nimport { logsHandler } from 'Docker/rest/response/handlers';\n\nangular.module('portainer.kubernetes').factory('KubernetesPods', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n 'EndpointProvider',\n function KubernetesPodsFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider) {\n 'use strict';\n return function (namespace) {\n const url = API_ENDPOINT_ENDPOINTS + '/:endpointId/kubernetes/api/v1' + (namespace ? '/namespaces/:namespace' : '') + '/pods/:id/:action';\n return $resource(\n url,\n {\n endpointId: EndpointProvider.endpointID,\n namespace: namespace,\n },\n {\n get: {\n method: 'GET',\n ignoreLoadingBar: true,\n },\n getYaml: {\n method: 'GET',\n headers: {\n Accept: 'application/yaml',\n },\n transformResponse: rawResponse,\n ignoreLoadingBar: true,\n },\n create: { method: 'POST' },\n update: { method: 'PUT' },\n delete: { method: 'DELETE' },\n patch: {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json-patch+json',\n },\n },\n logs: {\n method: 'GET',\n params: { action: 'log' },\n transformResponse: logsHandler,\n },\n evict: { method: 'POST' },\n }\n );\n };\n },\n]);\n","angular.module('portainer.kubernetes').factory('KubernetesPortainerNamespaces', KubernetesPortainerNamespacesFactory);\n\nfunction KubernetesPortainerNamespacesFactory($resource) {\n const url = '/api/kubernetes/:endpointId/namespaces/:namespaceName/:action';\n return $resource(\n url,\n {},\n {\n toggleSystem: { method: 'PUT', params: { action: 'system' } },\n }\n );\n}\n","import { rawResponse } from 'Kubernetes/rest/response/transform';\n\nangular.module('portainer.kubernetes').factory('KubernetesReplicaSets', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n 'EndpointProvider',\n function KubernetesReplicaSetsFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider) {\n 'use strict';\n return function (namespace) {\n const url = API_ENDPOINT_ENDPOINTS + '/:endpointId/kubernetes/apis/apps/v1' + (namespace ? '/namespaces/:namespace' : '') + '/replicasets/:id/:action';\n return $resource(\n url,\n {\n endpointId: EndpointProvider.endpointID,\n namespace: namespace,\n },\n {\n get: {\n method: 'GET',\n ignoreLoadingBar: true,\n },\n getYaml: {\n method: 'GET',\n headers: {\n Accept: 'application/yaml',\n },\n transformResponse: rawResponse,\n ignoreLoadingBar: true,\n },\n create: { method: 'POST' },\n update: { method: 'PUT' },\n patch: {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json-patch+json',\n },\n },\n delete: { method: 'DELETE' },\n }\n );\n };\n },\n]);\n","import { rawResponse } from 'Kubernetes/rest/response/transform';\n\nangular.module('portainer.kubernetes').factory('KubernetesResourceQuotas', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n 'EndpointProvider',\n function KubernetesResourceQuotasFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider) {\n 'use strict';\n return function (namespace) {\n const url = API_ENDPOINT_ENDPOINTS + '/:endpointId/kubernetes/api/v1' + (namespace ? '/namespaces/:namespace' : '') + '/resourcequotas/:id/:action';\n return $resource(\n url,\n {\n endpointId: EndpointProvider.endpointID,\n namespace: namespace,\n },\n {\n get: {\n method: 'GET',\n ignoreLoadingBar: true,\n },\n getYaml: {\n method: 'GET',\n headers: {\n Accept: 'application/yaml',\n },\n transformResponse: rawResponse,\n ignoreLoadingBar: true,\n },\n create: { method: 'POST' },\n update: { method: 'PUT' },\n patch: {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json-patch+json',\n },\n },\n delete: { method: 'DELETE' },\n }\n );\n };\n },\n]);\n","import { rawResponse } from 'Kubernetes/rest/response/transform';\n\nangular.module('portainer.kubernetes').factory('KubernetesSecrets', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n 'EndpointProvider',\n function KubernetesSecretsFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider) {\n 'use strict';\n return function (namespace) {\n const url = API_ENDPOINT_ENDPOINTS + '/:endpointId/kubernetes/api/v1' + (namespace ? '/namespaces/:namespace' : '') + '/secrets/:id/:action';\n return $resource(\n url,\n {\n endpointId: EndpointProvider.endpointID,\n namespace: namespace,\n },\n {\n get: {\n method: 'GET',\n ignoreLoadingBar: true,\n },\n getYaml: {\n method: 'GET',\n headers: {\n Accept: 'application/yaml',\n },\n transformResponse: rawResponse,\n ignoreLoadingBar: true,\n },\n create: { method: 'POST' },\n update: { method: 'PUT' },\n delete: { method: 'DELETE' },\n }\n );\n };\n },\n]);\n","import { rawResponse } from 'Kubernetes/rest/response/transform';\n\nangular.module('portainer.kubernetes').factory('KubernetesServices', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n 'EndpointProvider',\n function KubernetesServicesFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider) {\n 'use strict';\n return function (namespace) {\n const url = API_ENDPOINT_ENDPOINTS + '/:endpointId/kubernetes/api/v1' + (namespace ? '/namespaces/:namespace' : '') + '/services/:id/:action';\n return $resource(\n url,\n {\n endpointId: EndpointProvider.endpointID,\n namespace: namespace,\n },\n {\n get: {\n method: 'GET',\n ignoreLoadingBar: true,\n },\n getYaml: {\n method: 'GET',\n headers: {\n Accept: 'application/yaml',\n },\n transformResponse: rawResponse,\n ignoreLoadingBar: true,\n },\n create: { method: 'POST' },\n update: { method: 'PUT' },\n patch: {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json-patch+json',\n },\n },\n delete: { method: 'DELETE' },\n }\n );\n };\n },\n]);\n","import { rawResponse } from 'Kubernetes/rest/response/transform';\n\nangular.module('portainer.kubernetes').factory('KubernetesStatefulSets', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n 'EndpointProvider',\n function KubernetesStatefulSetsFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider) {\n 'use strict';\n return function (namespace) {\n const url = API_ENDPOINT_ENDPOINTS + '/:endpointId/kubernetes/apis/apps/v1' + (namespace ? '/namespaces/:namespace' : '') + '/statefulsets/:id/:action';\n return $resource(\n url,\n {\n endpointId: EndpointProvider.endpointID,\n namespace: namespace,\n },\n {\n get: {\n method: 'GET',\n ignoreLoadingBar: true,\n },\n getYaml: {\n method: 'GET',\n headers: {\n Accept: 'application/yaml',\n },\n transformResponse: rawResponse,\n ignoreLoadingBar: true,\n },\n create: { method: 'POST' },\n update: { method: 'PUT' },\n patch: {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json-patch+json',\n },\n },\n rollback: {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/strategic-merge-patch+json',\n },\n },\n delete: { method: 'DELETE' },\n }\n );\n };\n },\n]);\n","import { rawResponse } from 'Kubernetes/rest/response/transform';\n\nangular.module('portainer.kubernetes').factory('KubernetesStorage', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n 'EndpointProvider',\n function KubernetesStorageFactory($resource, API_ENDPOINT_ENDPOINTS, EndpointProvider) {\n 'use strict';\n return function () {\n const url = API_ENDPOINT_ENDPOINTS + '/:endpointId/kubernetes/apis/storage.k8s.io/v1/storageclasses/:id/:action';\n return $resource(\n url,\n {\n endpointId: EndpointProvider.endpointID,\n },\n {\n get: {\n method: 'GET',\n ignoreLoadingBar: true,\n },\n getYaml: {\n method: 'GET',\n headers: {\n Accept: 'application/yaml',\n },\n transformResponse: rawResponse,\n ignoreLoadingBar: true,\n },\n create: { method: 'POST' },\n update: { method: 'PUT' },\n patch: {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json-patch+json',\n },\n },\n delete: { method: 'DELETE' },\n }\n );\n };\n },\n]);\n","import _ from 'lodash-es';\nimport angular from 'angular';\nimport PortainerError from 'Portainer/error';\n\nimport {\n KubernetesApplication,\n KubernetesApplicationDeploymentTypes,\n KubernetesApplicationPublishingTypes,\n KubernetesApplicationTypes,\n} from 'Kubernetes/models/application/models';\nimport KubernetesApplicationHelper from 'Kubernetes/helpers/application';\nimport KubernetesApplicationRollbackHelper from 'Kubernetes/helpers/application/rollback';\nimport KubernetesApplicationConverter from 'Kubernetes/converters/application';\nimport { KubernetesDeployment } from 'Kubernetes/models/deployment/models';\nimport { KubernetesStatefulSet } from 'Kubernetes/models/stateful-set/models';\nimport { KubernetesDaemonSet } from 'Kubernetes/models/daemon-set/models';\nimport KubernetesServiceHelper from 'Kubernetes/helpers/serviceHelper';\nimport { KubernetesHorizontalPodAutoScalerHelper } from 'Kubernetes/horizontal-pod-auto-scaler/helper';\nimport { KubernetesHorizontalPodAutoScalerConverter } from 'Kubernetes/horizontal-pod-auto-scaler/converter';\nimport { KubernetesIngressConverter } from 'Kubernetes/ingress/converter';\nimport KubernetesPodConverter from 'Kubernetes/pod/converter';\n\nclass KubernetesApplicationService {\n /* #region CONSTRUCTOR */\n /* @ngInject */\n constructor(\n $async,\n Authentication,\n KubernetesDeploymentService,\n KubernetesDaemonSetService,\n KubernetesStatefulSetService,\n KubernetesServiceService,\n KubernetesSecretService,\n KubernetesPersistentVolumeClaimService,\n KubernetesNamespaceService,\n KubernetesPodService,\n KubernetesHistoryService,\n KubernetesHorizontalPodAutoScalerService,\n KubernetesIngressService\n ) {\n this.$async = $async;\n this.Authentication = Authentication;\n this.KubernetesDeploymentService = KubernetesDeploymentService;\n this.KubernetesDaemonSetService = KubernetesDaemonSetService;\n this.KubernetesStatefulSetService = KubernetesStatefulSetService;\n this.KubernetesServiceService = KubernetesServiceService;\n this.KubernetesSecretService = KubernetesSecretService;\n this.KubernetesPersistentVolumeClaimService = KubernetesPersistentVolumeClaimService;\n this.KubernetesNamespaceService = KubernetesNamespaceService;\n this.KubernetesPodService = KubernetesPodService;\n this.KubernetesHistoryService = KubernetesHistoryService;\n this.KubernetesHorizontalPodAutoScalerService = KubernetesHorizontalPodAutoScalerService;\n this.KubernetesIngressService = KubernetesIngressService;\n\n this.getAsync = this.getAsync.bind(this);\n this.getAllAsync = this.getAllAsync.bind(this);\n this.createAsync = this.createAsync.bind(this);\n this.patchAsync = this.patchAsync.bind(this);\n this.patchPartialAsync = this.patchPartialAsync.bind(this);\n this.rollbackAsync = this.rollbackAsync.bind(this);\n this.deleteAsync = this.deleteAsync.bind(this);\n }\n /* #endregion */\n\n /* #region UTILS */\n _getApplicationApiService(app) {\n let apiService;\n if (app instanceof KubernetesDeployment || (app instanceof KubernetesApplication && app.ApplicationType === KubernetesApplicationTypes.DEPLOYMENT)) {\n apiService = this.KubernetesDeploymentService;\n } else if (app instanceof KubernetesDaemonSet || (app instanceof KubernetesApplication && app.ApplicationType === KubernetesApplicationTypes.DAEMONSET)) {\n apiService = this.KubernetesDaemonSetService;\n } else if (app instanceof KubernetesStatefulSet || (app instanceof KubernetesApplication && app.ApplicationType === KubernetesApplicationTypes.STATEFULSET)) {\n apiService = this.KubernetesStatefulSetService;\n } else if (app instanceof KubernetesApplication && app.ApplicationType === KubernetesApplicationTypes.POD) {\n apiService = this.KubernetesPodService;\n } else {\n throw new PortainerError('Unable to determine which association to use to retrieve API Service');\n }\n return apiService;\n }\n\n _generateIngressPatchPromises(oldIngresses, newIngresses) {\n return _.map(newIngresses, (newIng) => {\n const oldIng = _.find(oldIngresses, { Name: newIng.Name });\n return this.KubernetesIngressService.patch(oldIng, newIng);\n });\n }\n /* #endregion */\n\n /* #region GET */\n async getAsync(namespace, name) {\n const [deployment, daemonSet, statefulSet, pod, pods, autoScalers, ingresses] = await Promise.allSettled([\n this.KubernetesDeploymentService.get(namespace, name),\n this.KubernetesDaemonSetService.get(namespace, name),\n this.KubernetesStatefulSetService.get(namespace, name),\n this.KubernetesPodService.get(namespace, name),\n this.KubernetesPodService.get(namespace),\n this.KubernetesHorizontalPodAutoScalerService.get(namespace),\n this.KubernetesIngressService.get(namespace),\n ]);\n\n let rootItem;\n let converterFunc;\n if (deployment.status === 'fulfilled') {\n rootItem = deployment;\n converterFunc = KubernetesApplicationConverter.apiDeploymentToApplication;\n } else if (daemonSet.status === 'fulfilled') {\n rootItem = daemonSet;\n converterFunc = KubernetesApplicationConverter.apiDaemonSetToApplication;\n } else if (statefulSet.status === 'fulfilled') {\n rootItem = statefulSet;\n converterFunc = KubernetesApplicationConverter.apiStatefulSetToapplication;\n } else if (pod.status === 'fulfilled') {\n rootItem = pod;\n converterFunc = KubernetesApplicationConverter.apiPodToApplication;\n } else {\n throw new PortainerError('Unable to determine which association to use to convert application');\n }\n\n const services = await this.KubernetesServiceService.get(namespace);\n const boundService = KubernetesServiceHelper.findApplicationBoundService(services, rootItem.value.Raw);\n const service = boundService ? await this.KubernetesServiceService.get(namespace, boundService.metadata.name) : {};\n\n const application = converterFunc(rootItem.value.Raw, pods.value, service.Raw, ingresses.value);\n application.Yaml = rootItem.value.Yaml;\n application.Raw = rootItem.value.Raw;\n application.Pods = _.map(application.Pods, (item) => KubernetesPodConverter.apiToModel(item));\n application.Containers = KubernetesApplicationHelper.associateContainersAndApplication(application);\n\n const boundScaler = KubernetesHorizontalPodAutoScalerHelper.findApplicationBoundScaler(autoScalers.value, application);\n const scaler = boundScaler ? await this.KubernetesHorizontalPodAutoScalerService.get(namespace, boundScaler.Name) : undefined;\n application.AutoScaler = scaler;\n\n await this.KubernetesHistoryService.get(application);\n\n if (service.Yaml) {\n application.Yaml += '---\\n' + service.Yaml;\n }\n if (scaler && scaler.Yaml) {\n application.Yaml += '---\\n' + scaler.Yaml;\n }\n // TODO: refactor @LP\n // append ingress yaml ?\n return application;\n }\n\n async getAllAsync(namespace) {\n const namespaces = namespace ? [namespace] : _.map(await this.KubernetesNamespaceService.get(), 'Name');\n\n const convertToApplication = (item, converterFunc, services, pods, ingresses) => {\n const service = KubernetesServiceHelper.findApplicationBoundService(services, item);\n const application = converterFunc(item, pods, service, ingresses);\n application.Containers = KubernetesApplicationHelper.associateContainersAndApplication(application);\n return application;\n };\n\n const res = await Promise.all(\n _.map(namespaces, async (ns) => {\n const [deployments, daemonSets, statefulSets, services, pods, ingresses, autoScalers] = await Promise.all([\n this.KubernetesDeploymentService.get(ns),\n this.KubernetesDaemonSetService.get(ns),\n this.KubernetesStatefulSetService.get(ns),\n this.KubernetesServiceService.get(ns),\n this.KubernetesPodService.get(ns),\n this.KubernetesIngressService.get(ns),\n this.KubernetesHorizontalPodAutoScalerService.get(ns),\n ]);\n\n const deploymentApplications = _.map(deployments, (item) =>\n convertToApplication(item, KubernetesApplicationConverter.apiDeploymentToApplication, services, pods, ingresses)\n );\n const daemonSetApplications = _.map(daemonSets, (item) => convertToApplication(item, KubernetesApplicationConverter.apiDaemonSetToApplication, services, pods, ingresses));\n const statefulSetApplications = _.map(statefulSets, (item) =>\n convertToApplication(item, KubernetesApplicationConverter.apiStatefulSetToapplication, services, pods, ingresses)\n );\n\n const boundPods = _.concat(_.flatMap(deploymentApplications, 'Pods'), _.flatMap(daemonSetApplications, 'Pods'), _.flatMap(statefulSetApplications, 'Pods'));\n const unboundPods = _.without(pods, ...boundPods);\n const nakedPodsApplications = _.map(unboundPods, (item) => convertToApplication(item, KubernetesApplicationConverter.apiPodToApplication, services, pods, ingresses));\n\n const applications = _.concat(deploymentApplications, daemonSetApplications, statefulSetApplications, nakedPodsApplications);\n _.forEach(applications, (app) => {\n app.Pods = _.map(app.Pods, (item) => KubernetesPodConverter.apiToModel(item));\n });\n await Promise.all(\n _.forEach(applications, async (application) => {\n const boundScaler = KubernetesHorizontalPodAutoScalerHelper.findApplicationBoundScaler(autoScalers, application);\n const scaler = boundScaler ? await this.KubernetesHorizontalPodAutoScalerService.get(ns, boundScaler.Name) : undefined;\n application.AutoScaler = scaler;\n })\n );\n return applications;\n })\n );\n return _.flatten(res);\n }\n\n get(namespace, name) {\n if (name) {\n return this.$async(this.getAsync, namespace, name);\n }\n return this.$async(this.getAllAsync, namespace);\n }\n /* #endregion */\n\n /* #region CREATE */\n // TODO: review\n // resource creation flow\n // should we keep formValues > Resource_1 || Resource_2\n // or should we switch to formValues > Composite > Resource_1 || Resource_2\n /**\n * NOTE: Keep this method flow in sync with `getCreatedApplicationResources` method in the `applicationService` file\n * To synchronise with kubernetes resource creation summary output, any new resources created in this method should\n * also be displayed in the summary output (getCreatedApplicationResources)\n */\n async createAsync(formValues) {\n let [app, headlessService, service, claims] = KubernetesApplicationConverter.applicationFormValuesToApplication(formValues);\n\n if (service) {\n await this.KubernetesServiceService.create(service);\n if (formValues.PublishingType === KubernetesApplicationPublishingTypes.INGRESS) {\n const ingresses = KubernetesIngressConverter.applicationFormValuesToIngresses(formValues, service.Name);\n await Promise.all(this._generateIngressPatchPromises(formValues.OriginalIngresses, ingresses));\n }\n }\n\n const apiService = this._getApplicationApiService(app);\n\n if (app instanceof KubernetesStatefulSet) {\n app.VolumeClaims = claims;\n headlessService = await this.KubernetesServiceService.create(headlessService);\n app.ServiceName = headlessService.metadata.name;\n } else {\n const claimPromises = _.map(claims, (item) => {\n if (!item.PreviousName && !item.Id) {\n return this.KubernetesPersistentVolumeClaimService.create(item);\n }\n });\n await Promise.all(_.without(claimPromises, undefined));\n }\n\n if (formValues.AutoScaler.IsUsed && formValues.DeploymentType !== KubernetesApplicationDeploymentTypes.GLOBAL) {\n const kind = KubernetesHorizontalPodAutoScalerHelper.getApplicationTypeString(app);\n const autoScaler = KubernetesHorizontalPodAutoScalerConverter.applicationFormValuesToModel(formValues, kind);\n await this.KubernetesHorizontalPodAutoScalerService.create(autoScaler);\n }\n\n await apiService.create(app);\n }\n\n create(formValues) {\n return this.$async(this.createAsync, formValues);\n }\n /* #endregion */\n\n /* #region PATCH */\n // this function accepts KubernetesApplicationFormValues as parameters\n /**\n * NOTE: Keep this method flow in sync with `getUpdatedApplicationResources` method in the `applicationService` file\n * To synchronise with kubernetes resource creation, update and delete summary output, any new resources created\n * in this method should also be displayed in the summary output (getUpdatedApplicationResources)\n */\n async patchAsync(oldFormValues, newFormValues) {\n const [oldApp, oldHeadlessService, oldService, oldClaims] = KubernetesApplicationConverter.applicationFormValuesToApplication(oldFormValues);\n const [newApp, newHeadlessService, newService, newClaims] = KubernetesApplicationConverter.applicationFormValuesToApplication(newFormValues);\n const oldApiService = this._getApplicationApiService(oldApp);\n const newApiService = this._getApplicationApiService(newApp);\n\n if (oldApiService !== newApiService) {\n await this.delete(oldApp);\n if (oldService) {\n await this.KubernetesServiceService.delete(oldService);\n }\n return await this.create(newFormValues);\n }\n\n if (newApp instanceof KubernetesStatefulSet) {\n await this.KubernetesServiceService.patch(oldHeadlessService, newHeadlessService);\n } else {\n const claimPromises = _.map(newClaims, (newClaim) => {\n if (!newClaim.PreviousName && !newClaim.Id) {\n return this.KubernetesPersistentVolumeClaimService.create(newClaim);\n } else if (!newClaim.Id) {\n const oldClaim = _.find(oldClaims, { Name: newClaim.PreviousName });\n return this.KubernetesPersistentVolumeClaimService.patch(oldClaim, newClaim);\n }\n });\n await Promise.all(claimPromises);\n }\n\n await newApiService.patch(oldApp, newApp);\n\n if (oldService && newService) {\n await this.KubernetesServiceService.patch(oldService, newService);\n if (newFormValues.PublishingType === KubernetesApplicationPublishingTypes.INGRESS || oldFormValues.PublishingType === KubernetesApplicationPublishingTypes.INGRESS) {\n const oldIngresses = KubernetesIngressConverter.applicationFormValuesToIngresses(oldFormValues, oldService.Name);\n const newIngresses = KubernetesIngressConverter.applicationFormValuesToIngresses(newFormValues, newService.Name);\n await Promise.all(this._generateIngressPatchPromises(oldIngresses, newIngresses));\n }\n } else if (!oldService && newService) {\n await this.KubernetesServiceService.create(newService);\n if (newFormValues.PublishingType === KubernetesApplicationPublishingTypes.INGRESS) {\n const ingresses = KubernetesIngressConverter.applicationFormValuesToIngresses(newFormValues, newService.Name);\n await Promise.all(this._generateIngressPatchPromises(newFormValues.OriginalIngresses, ingresses));\n }\n } else if (oldService && !newService) {\n await this.KubernetesServiceService.delete(oldService);\n if (oldFormValues.PublishingType === KubernetesApplicationPublishingTypes.INGRESS) {\n const ingresses = KubernetesIngressConverter.applicationFormValuesToIngresses(newFormValues, oldService.Name);\n await Promise.all(this._generateIngressPatchPromises(oldFormValues.OriginalIngresses, ingresses));\n }\n }\n\n const newKind = KubernetesHorizontalPodAutoScalerHelper.getApplicationTypeString(newApp);\n const newAutoScaler = KubernetesHorizontalPodAutoScalerConverter.applicationFormValuesToModel(newFormValues, newKind);\n if (!oldFormValues.AutoScaler.IsUsed) {\n if (newFormValues.AutoScaler.IsUsed) {\n await this.KubernetesHorizontalPodAutoScalerService.create(newAutoScaler);\n }\n } else {\n const oldKind = KubernetesHorizontalPodAutoScalerHelper.getApplicationTypeString(oldApp);\n const oldAutoScaler = KubernetesHorizontalPodAutoScalerConverter.applicationFormValuesToModel(oldFormValues, oldKind);\n if (newFormValues.AutoScaler.IsUsed) {\n await this.KubernetesHorizontalPodAutoScalerService.patch(oldAutoScaler, newAutoScaler);\n } else {\n await this.KubernetesHorizontalPodAutoScalerService.delete(oldAutoScaler);\n }\n }\n }\n\n // this function accepts KubernetesApplication as parameters\n async patchPartialAsync(oldApp, newApp) {\n const oldAppPayload = {\n Name: oldApp.Name,\n Namespace: oldApp.ResourcePool,\n StackName: oldApp.StackName,\n Note: oldApp.Note,\n };\n const newAppPayload = {\n Name: newApp.Name,\n Namespace: newApp.ResourcePool,\n StackName: newApp.StackName,\n Note: newApp.Note,\n };\n const apiService = this._getApplicationApiService(oldApp);\n await apiService.patch(oldAppPayload, newAppPayload);\n }\n\n // accept either formValues or applications as parameters depending on partial value\n // true = KubernetesApplication\n // false = KubernetesApplicationFormValues\n //\n // e.g. signatures are\n //\n // patch(oldValues: KubernetesApplication, newValues: KubernetesApplication, partial: (undefined | false)): Promise<unknown>\n // patch(oldValues: KubernetesApplicationFormValues, newValues: KubernetesApplicationFormValues, partial: true): Promise<unknown>\n patch(oldValues, newValues, partial = false) {\n if (partial) {\n return this.$async(this.patchPartialAsync, oldValues, newValues);\n }\n return this.$async(this.patchAsync, oldValues, newValues);\n }\n /* #endregion */\n\n /* #region DELETE */\n async deleteAsync(application) {\n const payload = {\n Namespace: application.ResourcePool || application.Namespace,\n Name: application.Name,\n };\n const servicePayload = angular.copy(payload);\n servicePayload.Name = application.Name;\n\n const apiService = this._getApplicationApiService(application);\n await apiService.delete(payload);\n\n if (apiService === this.KubernetesStatefulSetService) {\n const headlessServicePayload = angular.copy(payload);\n headlessServicePayload.Name = application instanceof KubernetesStatefulSet ? application.ServiceName : application.HeadlessServiceName;\n await this.KubernetesServiceService.delete(headlessServicePayload);\n }\n\n if (application.ServiceType) {\n await this.KubernetesServiceService.delete(servicePayload);\n const isIngress = _.filter(application.PublishedPorts, (p) => p.IngressRules.length).length;\n if (isIngress) {\n const originalIngresses = await this.KubernetesIngressService.get(payload.Namespace);\n const formValues = {\n OriginalIngresses: originalIngresses,\n PublishedPorts: KubernetesApplicationHelper.generatePublishedPortsFormValuesFromPublishedPorts(application.ServiceType, application.PublishedPorts),\n };\n _.forEach(formValues.PublishedPorts, (p) => (p.NeedsDeletion = true));\n const ingresses = KubernetesIngressConverter.applicationFormValuesToIngresses(formValues, servicePayload.Name);\n await Promise.all(this._generateIngressPatchPromises(formValues.OriginalIngresses, ingresses));\n }\n }\n if (!_.isEmpty(application.AutoScaler)) {\n await this.KubernetesHorizontalPodAutoScalerService.delete(application.AutoScaler);\n }\n }\n\n delete(application) {\n return this.$async(this.deleteAsync, application);\n }\n /* #endregion */\n\n /* #region ROLLBACK */\n async rollbackAsync(application, targetRevision) {\n const payload = KubernetesApplicationRollbackHelper.getPatchPayload(application, targetRevision);\n const apiService = this._getApplicationApiService(application);\n await apiService.rollback(application.ResourcePool, application.Name, payload);\n }\n\n rollback(application, targetRevision) {\n return this.$async(this.rollbackAsync, application, targetRevision);\n }\n /* #endregion */\n}\n\nexport default KubernetesApplicationService;\nangular.module('portainer.kubernetes').service('KubernetesApplicationService', KubernetesApplicationService);\n","import angular from 'angular';\nimport _ from 'lodash-es';\nimport PortainerError from 'Portainer/error';\nimport KubernetesConfigMapConverter from 'Kubernetes/converters/configMap';\nimport { KubernetesCommonParams } from 'Kubernetes/models/common/params';\nimport { KubernetesPortainerAccessConfigMap } from 'Kubernetes/models/config-map/models';\n\nclass KubernetesConfigMapService {\n /* @ngInject */\n constructor($async, KubernetesConfigMaps) {\n this.$async = $async;\n this.KubernetesConfigMaps = KubernetesConfigMaps;\n\n this.getAsync = this.getAsync.bind(this);\n this.getAllAsync = this.getAllAsync.bind(this);\n this.createAsync = this.createAsync.bind(this);\n this.updateAsync = this.updateAsync.bind(this);\n this.deleteAsync = this.deleteAsync.bind(this);\n }\n\n getAccess(namespace, name) {\n return this.$async(async () => {\n try {\n const params = new KubernetesCommonParams();\n params.id = name;\n const raw = await this.KubernetesConfigMaps(namespace).get(params).$promise;\n return KubernetesConfigMapConverter.apiToPortainerAccessConfigMap(raw);\n } catch (err) {\n if (err.status === 404) {\n return new KubernetesPortainerAccessConfigMap();\n }\n throw new PortainerError('Unable to retrieve Portainer accesses', err);\n }\n });\n }\n\n createAccess(config) {\n return this.$async(async () => {\n try {\n const payload = KubernetesConfigMapConverter.createAccessPayload(config);\n const params = {};\n const namespace = payload.metadata.namespace;\n const data = await this.KubernetesConfigMaps(namespace).create(params, payload).$promise;\n return KubernetesConfigMapConverter.apiToPortainerAccessConfigMap(data);\n } catch (err) {\n throw new PortainerError('Unable to create Portainer accesses', err);\n }\n });\n }\n\n updateAccess(config) {\n return this.$async(async () => {\n try {\n if (!config.Id) {\n return await this.createAccess(config);\n }\n const payload = KubernetesConfigMapConverter.updateAccessPayload(config);\n const params = new KubernetesCommonParams();\n params.id = payload.metadata.name;\n const namespace = payload.metadata.namespace;\n const data = await this.KubernetesConfigMaps(namespace).update(params, payload).$promise;\n return KubernetesConfigMapConverter.apiToPortainerAccessConfigMap(data);\n } catch (err) {\n throw new PortainerError('Unable to update Portainer accesses', err);\n }\n });\n }\n\n /**\n * GET\n */\n async getAsync(namespace, name) {\n try {\n const params = new KubernetesCommonParams();\n params.id = name;\n const [rawPromise, yamlPromise] = await Promise.allSettled([\n this.KubernetesConfigMaps(namespace).get(params).$promise,\n this.KubernetesConfigMaps(namespace).getYaml(params).$promise,\n ]);\n\n if (_.get(rawPromise, 'reason.status') === 404 && _.get(yamlPromise, 'reason.status') === 404) {\n return KubernetesConfigMapConverter.defaultConfigMap(namespace, name);\n }\n\n // Saving binary data to 'data' field in configMap Object is not allowed by kubernetes and getYaml() may get\n // an error. We should keep binary data to 'binaryData' field instead of 'data'. Before that, we\n // use response from get() and ignore 500 error as a workaround.\n if (rawPromise.value) {\n return KubernetesConfigMapConverter.apiToConfigMap(rawPromise.value, yamlPromise.value);\n }\n\n throw new PortainerError('Unable to retrieve config map ', name);\n } catch (err) {\n if (err.status === 404) {\n return KubernetesConfigMapConverter.defaultConfigMap(namespace, name);\n }\n throw new PortainerError('Unable to retrieve config map', err);\n }\n }\n\n async getAllAsync(namespace) {\n try {\n const data = await this.KubernetesConfigMaps(namespace).get().$promise;\n return _.map(data.items, (item) => KubernetesConfigMapConverter.apiToConfigMap(item));\n } catch (err) {\n throw new PortainerError('Unable to retrieve config maps', err);\n }\n }\n\n get(namespace, name) {\n if (name) {\n return this.$async(this.getAsync, namespace, name);\n }\n return this.$async(this.getAllAsync, namespace);\n }\n\n /**\n * CREATE\n */\n async createAsync(config) {\n try {\n const payload = KubernetesConfigMapConverter.createPayload(config);\n const params = {};\n const namespace = payload.metadata.namespace;\n const data = await this.KubernetesConfigMaps(namespace).create(params, payload).$promise;\n return KubernetesConfigMapConverter.apiToConfigMap(data);\n } catch (err) {\n throw new PortainerError('Unable to create config map', err);\n }\n }\n\n create(config) {\n return this.$async(this.createAsync, config);\n }\n\n /**\n * UPDATE\n */\n async updateAsync(config) {\n try {\n if (!config.Id) {\n return await this.create(config);\n }\n const payload = KubernetesConfigMapConverter.updatePayload(config);\n const params = new KubernetesCommonParams();\n params.id = payload.metadata.name;\n const namespace = payload.metadata.namespace;\n const data = await this.KubernetesConfigMaps(namespace).update(params, payload).$promise;\n return KubernetesConfigMapConverter.apiToConfigMap(data);\n } catch (err) {\n throw new PortainerError('Unable to update config map', err);\n }\n }\n update(config) {\n return this.$async(this.updateAsync, config);\n }\n\n /**\n * DELETE\n */\n async deleteAsync(config) {\n try {\n const params = new KubernetesCommonParams();\n params.id = config.Name;\n const namespace = config.Namespace;\n await this.KubernetesConfigMaps(namespace).delete(params).$promise;\n } catch (err) {\n throw new PortainerError('Unable to delete config map', err);\n }\n }\n\n delete(config) {\n return this.$async(this.deleteAsync, config);\n }\n}\n\nexport default KubernetesConfigMapService;\nangular.module('portainer.kubernetes').service('KubernetesConfigMapService', KubernetesConfigMapService);\n","import angular from 'angular';\nimport _ from 'lodash-es';\nimport KubernetesConfigurationConverter from 'Kubernetes/converters/configuration';\nimport KubernetesConfigMapConverter from 'Kubernetes/converters/configMap';\nimport KubernetesSecretConverter from 'Kubernetes/converters/secret';\nimport { KubernetesConfigurationTypes } from 'Kubernetes/models/configuration/models';\nimport KubernetesCommonHelper from 'Kubernetes/helpers/commonHelper';\n\nclass KubernetesConfigurationService {\n /* @ngInject */\n constructor($async, Authentication, KubernetesNamespaceService, KubernetesConfigMapService, KubernetesSecretService) {\n this.$async = $async;\n this.Authentication = Authentication;\n this.KubernetesNamespaceService = KubernetesNamespaceService;\n this.KubernetesConfigMapService = KubernetesConfigMapService;\n this.KubernetesSecretService = KubernetesSecretService;\n\n this.getAsync = this.getAsync.bind(this);\n this.getAllAsync = this.getAllAsync.bind(this);\n this.createAsync = this.createAsync.bind(this);\n this.updateAsync = this.updateAsync.bind(this);\n this.deleteAsync = this.deleteAsync.bind(this);\n }\n\n /**\n * GET\n */\n async getAsync(namespace, name) {\n const [configMap, secret] = await Promise.allSettled([this.KubernetesConfigMapService.get(namespace, name), this.KubernetesSecretService.get(namespace, name)]);\n let configuration;\n if (secret.status === 'fulfilled') {\n configuration = KubernetesConfigurationConverter.secretToConfiguration(secret.value);\n return configuration;\n }\n configuration = KubernetesConfigurationConverter.configMapToConfiguration(configMap.value);\n return configuration;\n }\n\n async getAllAsync(namespace) {\n const namespaces = namespace ? [namespace] : _.map(await this.KubernetesNamespaceService.get(), 'Name');\n const res = await Promise.all(\n _.map(namespaces, async (ns) => {\n const [configMaps, secrets] = await Promise.all([this.KubernetesConfigMapService.get(ns), this.KubernetesSecretService.get(ns)]);\n const secretsConfigurations = _.map(secrets, (secret) => KubernetesConfigurationConverter.secretToConfiguration(secret));\n const configMapsConfigurations = _.map(configMaps, (configMap) => KubernetesConfigurationConverter.configMapToConfiguration(configMap));\n return _.concat(configMapsConfigurations, secretsConfigurations);\n })\n );\n return _.flatten(res);\n }\n\n get(namespace, name) {\n if (name) {\n return this.$async(this.getAsync, namespace, name);\n }\n return this.$async(this.getAllAsync, namespace);\n }\n\n /**\n * CREATE\n */\n async createAsync(formValues) {\n formValues.ConfigurationOwner = KubernetesCommonHelper.ownerToLabel(formValues.ConfigurationOwner);\n\n if (formValues.Type === KubernetesConfigurationTypes.CONFIGMAP) {\n const configMap = KubernetesConfigMapConverter.configurationFormValuesToConfigMap(formValues);\n await this.KubernetesConfigMapService.create(configMap);\n } else {\n const secret = KubernetesSecretConverter.configurationFormValuesToSecret(formValues);\n await this.KubernetesSecretService.create(secret);\n }\n }\n\n create(formValues) {\n return this.$async(this.createAsync, formValues);\n }\n\n /**\n * UPDATE\n */\n async updateAsync(formValues, configuration) {\n if (formValues.Type === KubernetesConfigurationTypes.CONFIGMAP) {\n const configMap = KubernetesConfigMapConverter.configurationFormValuesToConfigMap(formValues);\n configMap.ConfigurationOwner = configuration.ConfigurationOwner;\n await this.KubernetesConfigMapService.update(configMap);\n } else {\n const secret = KubernetesSecretConverter.configurationFormValuesToSecret(formValues);\n secret.ConfigurationOwner = configuration.ConfigurationOwner;\n await this.KubernetesSecretService.update(secret);\n }\n }\n\n update(formValues, configuration) {\n return this.$async(this.updateAsync, formValues, configuration);\n }\n\n /**\n * DELETE\n */\n async deleteAsync(config) {\n if (config.Type === KubernetesConfigurationTypes.CONFIGMAP) {\n await this.KubernetesConfigMapService.delete(config);\n } else {\n await this.KubernetesSecretService.delete(config);\n }\n }\n\n delete(config) {\n return this.$async(this.deleteAsync, config);\n }\n}\n\nexport default KubernetesConfigurationService;\nangular.module('portainer.kubernetes').service('KubernetesConfigurationService', KubernetesConfigurationService);\n","import angular from 'angular';\nimport PortainerError from 'Portainer/error';\n\nclass KubernetesControllerRevisionService {\n /* @ngInject */\n constructor($async, KubernetesControllerRevisions) {\n this.$async = $async;\n this.KubernetesControllerRevisions = KubernetesControllerRevisions;\n\n this.getAllAsync = this.getAllAsync.bind(this);\n }\n\n /**\n * GET\n */\n async getAllAsync(namespace) {\n try {\n const data = await this.KubernetesControllerRevisions(namespace).get().$promise;\n return data.items;\n } catch (err) {\n throw new PortainerError('Unable to retrieve ControllerRevisions', err);\n }\n }\n\n get(namespace) {\n return this.$async(this.getAllAsync, namespace);\n }\n}\n\nexport default KubernetesControllerRevisionService;\nangular.module('portainer.kubernetes').service('KubernetesControllerRevisionService', KubernetesControllerRevisionService);\n","import angular from 'angular';\nimport PortainerError from 'Portainer/error';\nimport { KubernetesCommonParams } from 'Kubernetes/models/common/params';\nimport KubernetesDaemonSetConverter from 'Kubernetes/converters/daemonSet';\n\nclass KubernetesDaemonSetService {\n /* @ngInject */\n constructor($async, KubernetesDaemonSets) {\n this.$async = $async;\n this.KubernetesDaemonSets = KubernetesDaemonSets;\n\n this.getAsync = this.getAsync.bind(this);\n this.getAllAsync = this.getAllAsync.bind(this);\n this.createAsync = this.createAsync.bind(this);\n this.patchAsync = this.patchAsync.bind(this);\n this.rollbackAsync = this.rollbackAsync.bind(this);\n this.deleteAsync = this.deleteAsync.bind(this);\n }\n\n /**\n * GET\n */\n async getAsync(namespace, name) {\n try {\n const params = new KubernetesCommonParams();\n params.id = name;\n const [raw, yaml] = await Promise.all([this.KubernetesDaemonSets(namespace).get(params).$promise, this.KubernetesDaemonSets(namespace).getYaml(params).$promise]);\n const res = {\n Raw: raw,\n Yaml: yaml.data,\n };\n return res;\n } catch (err) {\n throw new PortainerError('Unable to retrieve DaemonSet', err);\n }\n }\n\n async getAllAsync(namespace) {\n try {\n const data = await this.KubernetesDaemonSets(namespace).get().$promise;\n return data.items;\n } catch (err) {\n throw new PortainerError('Unable to retrieve DaemonSets', err);\n }\n }\n\n get(namespace, name) {\n if (name) {\n return this.$async(this.getAsync, namespace, name);\n }\n return this.$async(this.getAllAsync, namespace);\n }\n\n /**\n * CREATE\n */\n async createAsync(daemonSet) {\n try {\n const params = {};\n const payload = KubernetesDaemonSetConverter.createPayload(daemonSet);\n const namespace = payload.metadata.namespace;\n const data = await this.KubernetesDaemonSets(namespace).create(params, payload).$promise;\n return data;\n } catch (err) {\n throw new PortainerError('Unable to create daemonset', err);\n }\n }\n\n create(daemonSet) {\n return this.$async(this.createAsync, daemonSet);\n }\n\n /**\n * PATCH\n */\n async patchAsync(oldDaemonSet, newDaemonSet) {\n try {\n const params = new KubernetesCommonParams();\n params.id = newDaemonSet.Name;\n const namespace = newDaemonSet.Namespace;\n const payload = KubernetesDaemonSetConverter.patchPayload(oldDaemonSet, newDaemonSet);\n if (!payload.length) {\n return;\n }\n const data = await this.KubernetesDaemonSets(namespace).patch(params, payload).$promise;\n return data;\n } catch (err) {\n throw new PortainerError('Unable to patch daemonSet', err);\n }\n }\n\n patch(oldDaemonSet, newDaemonSet) {\n return this.$async(this.patchAsync, oldDaemonSet, newDaemonSet);\n }\n\n /**\n * DELETE\n */\n async deleteAsync(daemonSet) {\n try {\n const params = new KubernetesCommonParams();\n params.id = daemonSet.Name;\n const namespace = daemonSet.Namespace;\n await this.KubernetesDaemonSets(namespace).delete(params).$promise;\n } catch (err) {\n throw new PortainerError('Unable to remove daemonset', err);\n }\n }\n\n delete(daemonSet) {\n return this.$async(this.deleteAsync, daemonSet);\n }\n\n /**\n * ROLLBACK\n */\n async rollbackAsync(namespace, name, payload) {\n try {\n const params = new KubernetesCommonParams();\n params.id = name;\n await this.KubernetesDaemonSets(namespace).rollback(params, payload).$promise;\n } catch (err) {\n throw new PortainerError('Unable to rollback daemonset', err);\n }\n }\n\n rollback(namespace, name, payload) {\n return this.$async(this.rollbackAsync, namespace, name, payload);\n }\n}\n\nexport default KubernetesDaemonSetService;\nangular.module('portainer.kubernetes').service('KubernetesDaemonSetService', KubernetesDaemonSetService);\n","import angular from 'angular';\nimport PortainerError from 'Portainer/error';\nimport { KubernetesCommonParams } from 'Kubernetes/models/common/params';\nimport KubernetesDeploymentConverter from 'Kubernetes/converters/deployment';\n\nclass KubernetesDeploymentService {\n /* @ngInject */\n constructor($async, KubernetesDeployments) {\n this.$async = $async;\n this.KubernetesDeployments = KubernetesDeployments;\n\n this.getAsync = this.getAsync.bind(this);\n this.getAllAsync = this.getAllAsync.bind(this);\n this.createAsync = this.createAsync.bind(this);\n this.patchAsync = this.patchAsync.bind(this);\n this.rollbackAsync = this.rollbackAsync.bind(this);\n this.deleteAsync = this.deleteAsync.bind(this);\n }\n\n /**\n * GET\n */\n async getAsync(namespace, name) {\n try {\n const params = new KubernetesCommonParams();\n params.id = name;\n const [raw, yaml] = await Promise.all([this.KubernetesDeployments(namespace).get(params).$promise, this.KubernetesDeployments(namespace).getYaml(params).$promise]);\n const res = {\n Raw: raw,\n Yaml: yaml.data,\n };\n return res;\n } catch (err) {\n throw new PortainerError('Unable to retrieve Deployment', err);\n }\n }\n\n async getAllAsync(namespace) {\n try {\n const data = await this.KubernetesDeployments(namespace).get().$promise;\n return data.items;\n } catch (err) {\n throw new PortainerError('Unable to retrieve Deployments', err);\n }\n }\n\n get(namespace, name) {\n if (name) {\n return this.$async(this.getAsync, namespace, name);\n }\n return this.$async(this.getAllAsync, namespace);\n }\n\n /**\n * CREATE\n */\n async createAsync(deployment) {\n try {\n const params = {};\n const payload = KubernetesDeploymentConverter.createPayload(deployment);\n const namespace = payload.metadata.namespace;\n const data = await this.KubernetesDeployments(namespace).create(params, payload).$promise;\n return data;\n } catch (err) {\n throw new PortainerError('Unable to create deployment', err);\n }\n }\n\n create(deployment) {\n return this.$async(this.createAsync, deployment);\n }\n\n /**\n * PATCH\n */\n async patchAsync(oldDeployment, newDeployment) {\n try {\n const params = new KubernetesCommonParams();\n params.id = newDeployment.Name;\n const namespace = newDeployment.Namespace;\n const payload = KubernetesDeploymentConverter.patchPayload(oldDeployment, newDeployment);\n if (!payload.length) {\n return;\n }\n const data = await this.KubernetesDeployments(namespace).patch(params, payload).$promise;\n return data;\n } catch (err) {\n throw new PortainerError('Unable to patch deployment', err);\n }\n }\n\n patch(oldDeployment, newDeployment) {\n return this.$async(this.patchAsync, oldDeployment, newDeployment);\n }\n\n /**\n * DELETE\n */\n async deleteAsync(deployment) {\n try {\n const params = new KubernetesCommonParams();\n params.id = deployment.Name;\n const namespace = deployment.Namespace;\n await this.KubernetesDeployments(namespace).delete(params).$promise;\n } catch (err) {\n throw new PortainerError('Unable to remove deployment', err);\n }\n }\n\n delete(deployment) {\n return this.$async(this.deleteAsync, deployment);\n }\n\n /**\n * ROLLBACK\n */\n async rollbackAsync(namespace, name, payload) {\n try {\n const params = new KubernetesCommonParams();\n params.id = name;\n await this.KubernetesDeployments(namespace).rollback(params, payload).$promise;\n } catch (err) {\n throw new PortainerError('Unable to rollback deployment', err);\n }\n }\n\n rollback(namespace, name, payload) {\n return this.$async(this.rollbackAsync, namespace, name, payload);\n }\n}\n\nexport default KubernetesDeploymentService;\nangular.module('portainer.kubernetes').service('KubernetesDeploymentService', KubernetesDeploymentService);\n","import _ from 'lodash-es';\nimport angular from 'angular';\nimport PortainerError from 'Portainer/error';\nimport KubernetesEventConverter from 'Kubernetes/converters/event';\n\nclass KubernetesEventService {\n /* @ngInject */\n constructor($async, KubernetesEvents) {\n this.$async = $async;\n this.KubernetesEvents = KubernetesEvents;\n\n this.getAllAsync = this.getAllAsync.bind(this);\n }\n\n /**\n * GET\n */\n async getAllAsync(namespace) {\n try {\n const data = await this.KubernetesEvents(namespace).get().$promise;\n const res = _.map(data.items, (item) => KubernetesEventConverter.apiToEvent(item));\n return res;\n } catch (err) {\n throw new PortainerError('Unable to retrieve events', err);\n }\n }\n\n get(namespace) {\n return this.$async(this.getAllAsync, namespace);\n }\n}\n\nexport default KubernetesEventService;\nangular.module('portainer.kubernetes').service('KubernetesEventService', KubernetesEventService);\n","import angular from 'angular';\nimport PortainerError from 'Portainer/error';\n\nclass KubernetesHealthService {\n /* @ngInject */\n constructor($async, KubernetesHealth) {\n this.$async = $async;\n this.KubernetesHealth = KubernetesHealth;\n\n this.pingAsync = this.pingAsync.bind(this);\n }\n\n /**\n * PING\n */\n async pingAsync(endpointID) {\n try {\n return await this.KubernetesHealth.ping({ id: endpointID }).$promise;\n } catch (err) {\n throw new PortainerError('Unable to retrieve environment health', err);\n }\n }\n\n ping(endpointID) {\n return this.$async(this.pingAsync, endpointID);\n }\n}\n\nexport default KubernetesHealthService;\nangular.module('portainer.kubernetes').service('KubernetesHealthService', KubernetesHealthService);\n","import angular from 'angular';\nimport PortainerError from 'Portainer/error';\n\nimport KubernetesHistoryHelper from 'Kubernetes/helpers/history';\nimport { KubernetesApplicationTypes } from 'Kubernetes/models/application/models';\n\nclass KubernetesHistoryService {\n /* @ngInject */\n constructor($async, KubernetesReplicaSetService, KubernetesControllerRevisionService) {\n this.$async = $async;\n this.KubernetesReplicaSetService = KubernetesReplicaSetService;\n this.KubernetesControllerRevisionService = KubernetesControllerRevisionService;\n\n this.getAsync = this.getAsync.bind(this);\n }\n\n /**\n * GET\n */\n async getAsync(application) {\n try {\n const namespace = application.ResourcePool;\n let rawRevisions;\n\n switch (application.ApplicationType) {\n case KubernetesApplicationTypes.DEPLOYMENT:\n rawRevisions = await this.KubernetesReplicaSetService.get(namespace);\n break;\n case KubernetesApplicationTypes.DAEMONSET:\n rawRevisions = await this.KubernetesControllerRevisionService.get(namespace);\n break;\n case KubernetesApplicationTypes.STATEFULSET:\n rawRevisions = await this.KubernetesControllerRevisionService.get(namespace);\n break;\n case KubernetesApplicationTypes.POD:\n rawRevisions = [];\n break;\n default:\n throw new PortainerError('Unable to determine which association to use for history');\n }\n if (rawRevisions.length) {\n const [currentRevision, revisionsList] = KubernetesHistoryHelper.getRevisions(rawRevisions, application);\n application.CurrentRevision = currentRevision;\n application.Revisions = revisionsList;\n }\n return application;\n } catch (err) {\n throw new PortainerError('', err);\n }\n }\n\n get(application) {\n return this.$async(this.getAsync, application);\n }\n}\n\nexport default KubernetesHistoryService;\nangular.module('portainer.kubernetes').service('KubernetesHistoryService', KubernetesHistoryService);\n","import angular from 'angular';\n\nclass KubernetesConfigService {\n /* @ngInject */\n constructor(KubernetesConfig, FileSaver, SettingsService) {\n this.KubernetesConfig = KubernetesConfig;\n this.FileSaver = FileSaver;\n this.SettingsService = SettingsService;\n }\n\n async downloadKubeconfigFile(environmentIDs) {\n const response = await this.KubernetesConfig.get(environmentIDs);\n const headers = response.headers();\n const contentDispositionHeader = headers['content-disposition'];\n const filename = contentDispositionHeader.replace('attachment;', '').trim();\n return this.FileSaver.saveAs(response.data, filename);\n }\n\n async expiryMessage() {\n const settings = await this.SettingsService.publicSettings();\n const expiryDays = settings.KubeconfigExpiry;\n const prefix = 'Kubeconfig file will ';\n switch (expiryDays) {\n case '0':\n return prefix + 'not expire.';\n case '24h':\n return prefix + 'expire in 1 day.';\n case '168h':\n return prefix + 'expire in 7 days.';\n case '720h':\n return prefix + 'expire in 30 days.';\n case '8640h':\n return prefix + 'expire in 1 year.';\n }\n return '';\n }\n}\n\nexport default KubernetesConfigService;\nangular.module('portainer.kubernetes').service('KubernetesConfigService', KubernetesConfigService);\n","import _ from 'lodash-es';\n\nimport angular from 'angular';\nimport PortainerError from 'Portainer/error';\nimport { KubernetesCommonParams } from 'Kubernetes/models/common/params';\nimport KubernetesNamespaceConverter from 'Kubernetes/converters/namespace';\nimport { updateNamespaces } from 'Kubernetes/store/namespace';\nimport $allSettled from 'Portainer/services/allSettled';\n\nclass KubernetesNamespaceService {\n /* @ngInject */\n constructor($async, KubernetesNamespaces) {\n this.$async = $async;\n this.KubernetesNamespaces = KubernetesNamespaces;\n\n this.getAsync = this.getAsync.bind(this);\n this.getAllAsync = this.getAllAsync.bind(this);\n this.createAsync = this.createAsync.bind(this);\n this.deleteAsync = this.deleteAsync.bind(this);\n }\n\n /**\n * GET\n */\n async getAsync(name) {\n try {\n const params = new KubernetesCommonParams();\n params.id = name;\n await this.KubernetesNamespaces().status(params).$promise;\n const [raw, yaml] = await Promise.all([this.KubernetesNamespaces().get(params).$promise, this.KubernetesNamespaces().getYaml(params).$promise]);\n const ns = KubernetesNamespaceConverter.apiToNamespace(raw, yaml);\n updateNamespaces([ns]);\n return ns;\n } catch (err) {\n throw new PortainerError('Unable to retrieve namespace', err);\n }\n }\n\n async getAllAsync() {\n try {\n const data = await this.KubernetesNamespaces().get().$promise;\n const promises = _.map(data.items, (item) => this.KubernetesNamespaces().status({ id: item.metadata.name }).$promise);\n const namespaces = await $allSettled(promises);\n const allNamespaces = _.map(namespaces.fulfilled, (item) => {\n return KubernetesNamespaceConverter.apiToNamespace(item);\n });\n updateNamespaces(allNamespaces);\n return allNamespaces;\n } catch (err) {\n throw new PortainerError('Unable to retrieve namespaces', err);\n }\n }\n\n get(name) {\n if (name) {\n return this.$async(this.getAsync, name);\n }\n return this.$async(this.getAllAsync);\n }\n\n /**\n * CREATE\n */\n async createAsync(namespace) {\n try {\n const payload = KubernetesNamespaceConverter.createPayload(namespace);\n const params = {};\n const data = await this.KubernetesNamespaces().create(params, payload).$promise;\n return data;\n } catch (err) {\n throw new PortainerError('Unable to create namespace', err);\n }\n }\n\n create(namespace) {\n return this.$async(this.createAsync, namespace);\n }\n\n /**\n * DELETE\n */\n async deleteAsync(namespace) {\n try {\n const params = new KubernetesCommonParams();\n params.id = namespace.Name;\n await this.KubernetesNamespaces().delete(params).$promise;\n } catch (err) {\n throw new PortainerError('Unable to delete namespace', err);\n }\n }\n\n delete(namespace) {\n return this.$async(this.deleteAsync, namespace);\n }\n}\n\nexport default KubernetesNamespaceService;\nangular.module('portainer.kubernetes').service('KubernetesNamespaceService', KubernetesNamespaceService);\n","import angular from 'angular';\nimport PortainerError from 'Portainer/error';\nimport { KubernetesNodesLimits } from 'Kubernetes/models/nodes-limits/models';\n\nclass KubernetesNodesLimitsService {\n /* @ngInject */\n constructor(KubernetesNodesLimits) {\n this.KubernetesNodesLimits = KubernetesNodesLimits;\n }\n\n /**\n * GET\n */\n async get() {\n try {\n const nodesLimits = await this.KubernetesNodesLimits.get().$promise;\n return new KubernetesNodesLimits(nodesLimits.data);\n } catch (err) {\n throw new PortainerError('Unable to retrieve nodes limits', err);\n }\n }\n}\n\nexport default KubernetesNodesLimitsService;\nangular.module('portainer.kubernetes').service('KubernetesNodesLimitsService', KubernetesNodesLimitsService);\n","import angular from 'angular';\nimport _ from 'lodash-es';\nimport PortainerError from 'Portainer/error';\nimport KubernetesPersistentVolumeClaimConverter from 'Kubernetes/converters/persistentVolumeClaim';\nimport { KubernetesCommonParams } from 'Kubernetes/models/common/params';\n\nclass KubernetesPersistentVolumeClaimService {\n /* @ngInject */\n constructor($async, EndpointProvider, KubernetesPersistentVolumeClaims) {\n this.$async = $async;\n this.EndpointProvider = EndpointProvider;\n this.KubernetesPersistentVolumeClaims = KubernetesPersistentVolumeClaims;\n\n this.getAsync = this.getAsync.bind(this);\n this.getAllAsync = this.getAllAsync.bind(this);\n this.createAsync = this.createAsync.bind(this);\n this.patchAsync = this.patchAsync.bind(this);\n this.deleteAsync = this.deleteAsync.bind(this);\n }\n\n async getAsync(namespace, name) {\n try {\n const params = new KubernetesCommonParams();\n params.id = name;\n const [raw, yaml] = await Promise.all([\n this.KubernetesPersistentVolumeClaims(namespace).get(params).$promise,\n this.KubernetesPersistentVolumeClaims(namespace).getYaml(params).$promise,\n ]);\n const storageClasses = this.EndpointProvider.currentEndpoint().Kubernetes.Configuration.StorageClasses;\n return KubernetesPersistentVolumeClaimConverter.apiToPersistentVolumeClaim(raw, storageClasses, yaml);\n } catch (err) {\n throw new PortainerError('Unable to retrieve persistent volume claim', err);\n }\n }\n\n async getAllAsync(namespace) {\n try {\n const data = await this.KubernetesPersistentVolumeClaims(namespace).get().$promise;\n const storageClasses = this.EndpointProvider.currentEndpoint().Kubernetes.Configuration.StorageClasses;\n return _.map(data.items, (item) => KubernetesPersistentVolumeClaimConverter.apiToPersistentVolumeClaim(item, storageClasses));\n } catch (err) {\n throw new PortainerError('Unable to retrieve persistent volume claims', err);\n }\n }\n\n get(namespace, name) {\n if (name) {\n return this.$async(this.getAsync, namespace, name);\n }\n return this.$async(this.getAllAsync, namespace);\n }\n\n /**\n * CREATE\n */\n async createAsync(claim) {\n try {\n const params = {};\n const payload = KubernetesPersistentVolumeClaimConverter.createPayload(claim);\n const namespace = payload.metadata.namespace;\n const data = await this.KubernetesPersistentVolumeClaims(namespace).create(params, payload).$promise;\n return data;\n } catch (err) {\n throw new PortainerError('Unable to create persistent volume claim', err);\n }\n }\n\n create(claim) {\n return this.$async(this.createAsync, claim);\n }\n\n /**\n * PATCH\n */\n async patchAsync(oldPVC, newPVC) {\n try {\n const params = new KubernetesCommonParams();\n params.id = newPVC.Name;\n const namespace = newPVC.Namespace;\n const payload = KubernetesPersistentVolumeClaimConverter.patchPayload(oldPVC, newPVC);\n if (!payload.length) {\n return;\n }\n const data = await this.KubernetesPersistentVolumeClaims(namespace).patch(params, payload).$promise;\n return data;\n } catch (err) {\n throw new PortainerError('Unable to patch persistent volume claim', err);\n }\n }\n\n patch(oldPVC, newPVC) {\n return this.$async(this.patchAsync, oldPVC, newPVC);\n }\n\n /**\n * DELETE\n */\n async deleteAsync(pvc) {\n try {\n const params = new KubernetesCommonParams();\n params.id = pvc.Name;\n const namespace = pvc.Namespace;\n await this.KubernetesPersistentVolumeClaims(namespace).delete(params).$promise;\n } catch (err) {\n throw new PortainerError('Unable to delete persistent volume claim', err);\n }\n }\n\n delete(pvc) {\n return this.$async(this.deleteAsync, pvc);\n }\n}\n\nexport default KubernetesPersistentVolumeClaimService;\nangular.module('portainer.kubernetes').service('KubernetesPersistentVolumeClaimService', KubernetesPersistentVolumeClaimService);\n","import angular from 'angular';\nimport PortainerError from 'Portainer/error';\n\nclass KubernetesReplicaSetService {\n /* @ngInject */\n constructor($async, KubernetesReplicaSets) {\n this.$async = $async;\n this.KubernetesReplicaSets = KubernetesReplicaSets;\n\n this.getAllAsync = this.getAllAsync.bind(this);\n }\n\n /**\n * GET\n */\n async getAllAsync(namespace) {\n try {\n const data = await this.KubernetesReplicaSets(namespace).get().$promise;\n return data.items;\n } catch (err) {\n throw new PortainerError('Unable to retrieve ReplicaSets', err);\n }\n }\n\n get(namespace) {\n return this.$async(this.getAllAsync, namespace);\n }\n}\n\nexport default KubernetesReplicaSetService;\nangular.module('portainer.kubernetes').service('KubernetesReplicaSetService', KubernetesReplicaSetService);\n","import _ from 'lodash-es';\n\nimport angular from 'angular';\nimport KubernetesResourcePoolConverter from 'Kubernetes/converters/resourcePool';\nimport KubernetesResourceQuotaHelper from 'Kubernetes/helpers/resourceQuotaHelper';\n\n/* @ngInject */\nexport function KubernetesResourcePoolService(\n $async,\n EndpointService,\n KubernetesNamespaceService,\n KubernetesResourceQuotaService,\n KubernetesIngressService,\n KubernetesPortainerNamespaces\n) {\n return {\n get,\n create,\n patch,\n delete: _delete,\n toggleSystem,\n };\n\n async function getOne(name) {\n const namespace = await KubernetesNamespaceService.get(name);\n const [quotaAttempt] = await Promise.allSettled([KubernetesResourceQuotaService.get(name, KubernetesResourceQuotaHelper.generateResourceQuotaName(name))]);\n const pool = KubernetesResourcePoolConverter.apiToResourcePool(namespace);\n if (quotaAttempt.status === 'fulfilled') {\n pool.Quota = quotaAttempt.value;\n pool.Yaml += '---\\n' + quotaAttempt.value.Yaml;\n }\n return pool;\n }\n\n async function getAll() {\n const namespaces = await KubernetesNamespaceService.get();\n const pools = await Promise.all(\n _.map(namespaces, async (namespace) => {\n const name = namespace.Name;\n const [quotaAttempt] = await Promise.allSettled([KubernetesResourceQuotaService.get(name, KubernetesResourceQuotaHelper.generateResourceQuotaName(name))]);\n const pool = KubernetesResourcePoolConverter.apiToResourcePool(namespace);\n if (quotaAttempt.status === 'fulfilled') {\n pool.Quota = quotaAttempt.value;\n pool.Yaml += '---\\n' + quotaAttempt.value.Yaml;\n }\n return pool;\n })\n );\n return pools;\n }\n\n function get(name) {\n if (name) {\n return $async(getOne, name);\n }\n return $async(getAll);\n }\n\n function create(formValues) {\n return $async(async () => {\n const [namespace, quota, ingresses, registries] = KubernetesResourcePoolConverter.formValuesToResourcePool(formValues);\n await KubernetesNamespaceService.create(namespace);\n\n if (quota) {\n await KubernetesResourceQuotaService.create(quota);\n }\n const ingressPromises = _.map(ingresses, (i) => KubernetesIngressService.create(i));\n await Promise.all(ingressPromises);\n\n const endpointId = formValues.EndpointId;\n const registriesPromises = _.map(registries, (r) => EndpointService.updateRegistryAccess(endpointId, r.Id, r.RegistryAccesses[endpointId]));\n await Promise.all(registriesPromises);\n });\n }\n\n function patch(oldFormValues, newFormValues) {\n return $async(async () => {\n const [, oldQuota, oldIngresses, oldRegistries] = KubernetesResourcePoolConverter.formValuesToResourcePool(oldFormValues);\n const [, newQuota, newIngresses, newRegistries] = KubernetesResourcePoolConverter.formValuesToResourcePool(newFormValues);\n\n if (oldQuota && newQuota) {\n await KubernetesResourceQuotaService.patch(oldQuota, newQuota);\n } else if (!oldQuota && newQuota) {\n await KubernetesResourceQuotaService.create(newQuota);\n } else if (oldQuota && !newQuota) {\n await KubernetesResourceQuotaService.delete(oldQuota);\n }\n\n const create = _.filter(newIngresses, (ing) => !_.find(oldIngresses, { Name: ing.Name }));\n const del = _.filter(oldIngresses, (ing) => !_.find(newIngresses, { Name: ing.Name }));\n const patch = _.without(newIngresses, ...create);\n\n const createPromises = _.map(create, (i) => KubernetesIngressService.create(i));\n const delPromises = _.map(del, (i) => KubernetesIngressService.delete(i.Namespace, i.Name));\n const patchPromises = _.map(patch, (ing) => {\n const old = _.find(oldIngresses, { Name: ing.Name });\n ing.Paths = angular.copy(old.Paths);\n ing.PreviousHost = old.Host;\n return KubernetesIngressService.patch(old, ing);\n });\n\n const promises = _.flatten([createPromises, delPromises, patchPromises]);\n await Promise.all(promises);\n\n const endpointId = newFormValues.EndpointId;\n const keptRegistries = _.intersectionBy(oldRegistries, newRegistries, 'Id');\n const removedRegistries = _.without(oldRegistries, ...keptRegistries);\n\n const newRegistriesPromises = _.map(newRegistries, (r) => EndpointService.updateRegistryAccess(endpointId, r.Id, r.RegistryAccesses[endpointId]));\n const removedRegistriesPromises = _.map(removedRegistries, (r) => {\n _.pull(r.RegistryAccesses[endpointId].Namespaces, newFormValues.Name);\n return EndpointService.updateRegistryAccess(endpointId, r.Id, r.RegistryAccesses[endpointId]);\n });\n\n await Promise.all(_.concat(newRegistriesPromises, removedRegistriesPromises));\n });\n }\n\n function _delete(pool) {\n return $async(async () => {\n await KubernetesNamespaceService.delete(pool.Namespace);\n });\n }\n\n function toggleSystem(endpointId, namespaceName, system) {\n return KubernetesPortainerNamespaces.toggleSystem({ namespaceName, endpointId }, { system }).$promise;\n }\n}\n\nangular.module('portainer.kubernetes').service('KubernetesResourcePoolService', KubernetesResourcePoolService);\n","import _ from 'lodash-es';\n\nimport angular from 'angular';\nimport PortainerError from 'Portainer/error';\nimport { KubernetesCommonParams } from 'Kubernetes/models/common/params';\nimport KubernetesResourceQuotaConverter from 'Kubernetes/converters/resourceQuota';\n\n/* @ngInject */\nexport function KubernetesResourceQuotaService($async, KubernetesResourceQuotas) {\n return {\n get,\n create,\n patch,\n delete: _delete,\n };\n\n async function getOne(namespace, name) {\n try {\n const params = new KubernetesCommonParams();\n params.id = name;\n const [raw, yaml] = await Promise.all([KubernetesResourceQuotas(namespace).get(params).$promise, KubernetesResourceQuotas(namespace).getYaml(params).$promise]);\n return KubernetesResourceQuotaConverter.apiToResourceQuota(raw, yaml);\n } catch (err) {\n throw new PortainerError('Unable to retrieve resource quota', err);\n }\n }\n\n async function getAll(namespace) {\n try {\n const data = await KubernetesResourceQuotas(namespace).get().$promise;\n return _.map(data.items, (item) => KubernetesResourceQuotaConverter.apiToResourceQuota(item));\n } catch (err) {\n throw new PortainerError('Unable to retrieve resource quotas', err);\n }\n }\n\n function get(namespace, name) {\n if (name) {\n return $async(getOne, namespace, name);\n }\n return $async(getAll, namespace);\n }\n\n function create(quota) {\n return $async(async () => {\n try {\n const payload = KubernetesResourceQuotaConverter.createPayload(quota);\n const namespace = payload.metadata.namespace;\n const params = {};\n const data = await KubernetesResourceQuotas(namespace).create(params, payload).$promise;\n return KubernetesResourceQuotaConverter.apiToResourceQuota(data);\n } catch (err) {\n throw new PortainerError('Unable to create quota', err);\n }\n });\n }\n\n function patch(oldQuota, newQuota) {\n return $async(async () => {\n try {\n const params = new KubernetesCommonParams();\n params.id = newQuota.Name;\n const namespace = newQuota.Namespace;\n const payload = KubernetesResourceQuotaConverter.patchPayload(oldQuota, newQuota);\n if (!payload.length) {\n return;\n }\n const data = await KubernetesResourceQuotas(namespace).patch(params, payload).$promise;\n return data;\n } catch (err) {\n throw new PortainerError('Unable to update resource quota', err);\n }\n });\n }\n\n function _delete(quota) {\n return $async(async () => {\n try {\n const params = new KubernetesCommonParams();\n params.id = quota.Name;\n await KubernetesResourceQuotas(quota.Namespace).delete(params).$promise;\n } catch (err) {\n throw new PortainerError('Unable to delete quota', err);\n }\n });\n }\n}\n\nangular.module('portainer.kubernetes').service('KubernetesResourceQuotaService', KubernetesResourceQuotaService);\n","import angular from 'angular';\nimport _ from 'lodash-es';\nimport PortainerError from 'Portainer/error';\nimport KubernetesSecretConverter from 'Kubernetes/converters/secret';\nimport { KubernetesCommonParams } from 'Kubernetes/models/common/params';\n\nclass KubernetesSecretService {\n /* @ngInject */\n constructor($async, KubernetesSecrets) {\n this.$async = $async;\n this.KubernetesSecrets = KubernetesSecrets;\n\n this.getAsync = this.getAsync.bind(this);\n this.getAllAsync = this.getAllAsync.bind(this);\n this.createAsync = this.createAsync.bind(this);\n this.updateAsync = this.updateAsync.bind(this);\n this.deleteAsync = this.deleteAsync.bind(this);\n }\n\n /**\n * GET\n */\n async getAsync(namespace, name) {\n try {\n const params = new KubernetesCommonParams();\n params.id = name;\n const [raw, yaml] = await Promise.all([this.KubernetesSecrets(namespace).get(params).$promise, this.KubernetesSecrets(namespace).getYaml(params).$promise]);\n const secret = KubernetesSecretConverter.apiToSecret(raw, yaml);\n return secret;\n } catch (err) {\n throw new PortainerError('Unable to retrieve secret', err);\n }\n }\n\n async getAllAsync(namespace) {\n try {\n const data = await this.KubernetesSecrets(namespace).get().$promise;\n return _.map(data.items, (item) => KubernetesSecretConverter.apiToSecret(item));\n } catch (err) {\n throw new PortainerError('Unable to retrieve secrets', err);\n }\n }\n\n get(namespace, name) {\n if (name) {\n return this.$async(this.getAsync, namespace, name);\n }\n return this.$async(this.getAllAsync, namespace);\n }\n\n /**\n * CREATE\n */\n async createAsync(secret) {\n try {\n const payload = KubernetesSecretConverter.createPayload(secret);\n const namespace = payload.metadata.namespace;\n const params = {};\n const data = await this.KubernetesSecrets(namespace).create(params, payload).$promise;\n return data;\n } catch (err) {\n throw new PortainerError('Unable to create secret', err);\n }\n }\n\n create(secret) {\n return this.$async(this.createAsync, secret);\n }\n\n /**\n * UPDATE\n */\n async updateAsync(secret) {\n try {\n const payload = KubernetesSecretConverter.updatePayload(secret);\n const params = new KubernetesCommonParams();\n params.id = payload.metadata.name;\n const namespace = payload.metadata.namespace;\n const data = await this.KubernetesSecrets(namespace).update(params, payload).$promise;\n return KubernetesSecretConverter.apiToSecret(data);\n } catch (err) {\n throw new PortainerError('Unable to update secret', err);\n }\n }\n\n update(secret) {\n return this.$async(this.updateAsync, secret);\n }\n\n /**\n * DELETE\n */\n async deleteAsync(secret) {\n try {\n const params = new KubernetesCommonParams();\n params.id = secret.Name;\n const namespace = secret.Namespace;\n await this.KubernetesSecrets(namespace).delete(params).$promise;\n } catch (err) {\n throw new PortainerError('Unable to delete secret', err);\n }\n }\n\n delete(secret) {\n return this.$async(this.deleteAsync, secret);\n }\n}\n\nexport default KubernetesSecretService;\nangular.module('portainer.kubernetes').service('KubernetesSecretService', KubernetesSecretService);\n","import angular from 'angular';\nimport PortainerError from 'Portainer/error';\nimport { KubernetesCommonParams } from 'Kubernetes/models/common/params';\nimport KubernetesServiceConverter from 'Kubernetes/converters/service';\n\nclass KubernetesServiceService {\n /* @ngInject */\n constructor($async, KubernetesServices) {\n this.$async = $async;\n this.KubernetesServices = KubernetesServices;\n\n this.getAsync = this.getAsync.bind(this);\n this.getAllAsync = this.getAllAsync.bind(this);\n this.createAsync = this.createAsync.bind(this);\n this.patchAsync = this.patchAsync.bind(this);\n this.deleteAsync = this.deleteAsync.bind(this);\n }\n\n /**\n * GET\n */\n async getAsync(namespace, name) {\n try {\n const params = new KubernetesCommonParams();\n params.id = name;\n const [raw, yaml] = await Promise.all([this.KubernetesServices(namespace).get(params).$promise, this.KubernetesServices(namespace).getYaml(params).$promise]);\n const res = {\n Raw: raw,\n Yaml: yaml.data,\n };\n return res;\n } catch (err) {\n throw new PortainerError('Unable to retrieve service', err);\n }\n }\n\n async getAllAsync(namespace) {\n try {\n const data = await this.KubernetesServices(namespace).get().$promise;\n return data.items;\n } catch (err) {\n throw new PortainerError('Unable to retrieve services', err);\n }\n }\n\n get(namespace, name) {\n if (name) {\n return this.$async(this.getAsync, namespace, name);\n }\n return this.$async(this.getAllAsync, namespace);\n }\n\n /**\n * CREATE\n */\n async createAsync(service) {\n try {\n const params = {};\n const payload = KubernetesServiceConverter.createPayload(service);\n const namespace = payload.metadata.namespace;\n const data = await this.KubernetesServices(namespace).create(params, payload).$promise;\n return data;\n } catch (err) {\n throw new PortainerError('Unable to create service', err);\n }\n }\n\n create(service) {\n return this.$async(this.createAsync, service);\n }\n\n /**\n * PATCH\n */\n async patchAsync(oldService, newService) {\n try {\n const params = new KubernetesCommonParams();\n params.id = newService.Name;\n const namespace = newService.Namespace;\n const payload = KubernetesServiceConverter.patchPayload(oldService, newService);\n if (!payload.length) {\n return;\n }\n const data = await this.KubernetesServices(namespace).patch(params, payload).$promise;\n return data;\n } catch (err) {\n throw new PortainerError('Unable to patch service', err);\n }\n }\n\n patch(oldService, newService) {\n return this.$async(this.patchAsync, oldService, newService);\n }\n\n /**\n * DELETE\n */\n async deleteAsync(service) {\n try {\n const params = new KubernetesCommonParams();\n params.id = service.Name;\n const namespace = service.Namespace;\n await this.KubernetesServices(namespace).delete(params).$promise;\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error('unable to remove service', err);\n }\n }\n\n delete(service) {\n return this.$async(this.deleteAsync, service);\n }\n}\n\nexport default KubernetesServiceService;\nangular.module('portainer.kubernetes').service('KubernetesServiceService', KubernetesServiceService);\n","import _ from 'lodash-es';\nimport angular from 'angular';\n\nclass KubernetesStackService {\n /* @ngInject */\n constructor($async, KubernetesApplicationService) {\n this.$async = $async;\n this.KubernetesApplicationService = KubernetesApplicationService;\n\n this.getAllAsync = this.getAllAsync.bind(this);\n }\n\n /**\n * GET\n */\n async getAllAsync(namespace) {\n const applications = await this.KubernetesApplicationService.get(namespace);\n const stacks = _.map(applications, (item) => item.StackName);\n return _.uniq(_.without(stacks, '-', ''));\n }\n\n get(namespace) {\n return this.$async(this.getAllAsync, namespace);\n }\n}\n\nexport default KubernetesStackService;\nangular.module('portainer.kubernetes').service('KubernetesStackService', KubernetesStackService);\n","import angular from 'angular';\nimport PortainerError from 'Portainer/error';\nimport { KubernetesCommonParams } from 'Kubernetes/models/common/params';\nimport KubernetesStatefulSetConverter from 'Kubernetes/converters/statefulSet';\n\nclass KubernetesStatefulSetService {\n /* @ngInject */\n constructor($async, KubernetesStatefulSets, KubernetesServiceService) {\n this.$async = $async;\n this.KubernetesStatefulSets = KubernetesStatefulSets;\n this.KubernetesServiceService = KubernetesServiceService;\n\n this.getAsync = this.getAsync.bind(this);\n this.getAllAsync = this.getAllAsync.bind(this);\n this.createAsync = this.createAsync.bind(this);\n this.patchAsync = this.patchAsync.bind(this);\n this.rollbackAsync = this.rollbackAsync.bind(this);\n this.deleteAsync = this.deleteAsync.bind(this);\n }\n\n /**\n * GET\n */\n async getAsync(namespace, name) {\n try {\n const params = new KubernetesCommonParams();\n params.id = name;\n const [raw, yaml] = await Promise.all([this.KubernetesStatefulSets(namespace).get(params).$promise, this.KubernetesStatefulSets(namespace).getYaml(params).$promise]);\n const res = {\n Raw: raw,\n Yaml: yaml.data,\n };\n const headlessServiceName = raw.spec.serviceName;\n if (headlessServiceName) {\n try {\n const headlessService = await this.KubernetesServiceService.get(namespace, headlessServiceName);\n res.Yaml += '---\\n' + headlessService.Yaml;\n } catch (error) {\n // if has error means headless service does not exist\n // skip error as we don't care in this case\n }\n }\n return res;\n } catch (err) {\n throw new PortainerError('Unable to retrieve StatefulSet', err);\n }\n }\n\n async getAllAsync(namespace) {\n try {\n const data = await this.KubernetesStatefulSets(namespace).get().$promise;\n return data.items;\n } catch (err) {\n throw new PortainerError('Unable to retrieve StatefulSets', err);\n }\n }\n\n get(namespace, name) {\n if (name) {\n return this.$async(this.getAsync, namespace, name);\n }\n return this.$async(this.getAllAsync, namespace);\n }\n\n /**\n * CREATE\n */\n async createAsync(statefulSet) {\n try {\n const params = {};\n const payload = KubernetesStatefulSetConverter.createPayload(statefulSet);\n const namespace = payload.metadata.namespace;\n const data = await this.KubernetesStatefulSets(namespace).create(params, payload).$promise;\n return data;\n } catch (err) {\n throw new PortainerError('Unable to create statefulSet', err);\n }\n }\n\n create(statefulSet) {\n return this.$async(this.createAsync, statefulSet);\n }\n\n /**\n * PATCH\n */\n async patchAsync(oldStatefulSet, newStatefulSet) {\n try {\n const params = new KubernetesCommonParams();\n params.id = newStatefulSet.Name;\n const namespace = newStatefulSet.Namespace;\n const payload = KubernetesStatefulSetConverter.patchPayload(oldStatefulSet, newStatefulSet);\n if (!payload.length) {\n return;\n }\n\n const data = await this.KubernetesStatefulSets(namespace).patch(params, payload).$promise;\n return data;\n } catch (err) {\n throw new PortainerError('Unable to patch statefulSet', err);\n }\n }\n\n patch(oldStatefulSet, newStatefulSet) {\n return this.$async(this.patchAsync, oldStatefulSet, newStatefulSet);\n }\n\n /**\n * DELETE\n */\n async deleteAsync(statefulSet) {\n try {\n const params = new KubernetesCommonParams();\n params.id = statefulSet.Name;\n const namespace = statefulSet.Namespace;\n await this.KubernetesStatefulSets(namespace).delete(params).$promise;\n } catch (err) {\n throw new PortainerError('Unable to remove statefulSet', err);\n }\n }\n\n delete(statefulSet) {\n return this.$async(this.deleteAsync, statefulSet);\n }\n\n /**\n * ROLLBACK\n */\n async rollbackAsync(namespace, name, payload) {\n try {\n const params = new KubernetesCommonParams();\n params.id = name;\n await this.KubernetesStatefulSets(namespace).rollback(params, payload).$promise;\n } catch (err) {\n throw new PortainerError('Unable to rollback statefulSet', err);\n }\n }\n\n rollback(namespace, name, payload) {\n return this.$async(this.rollbackAsync, namespace, name, payload);\n }\n}\n\nexport default KubernetesStatefulSetService;\nangular.module('portainer.kubernetes').service('KubernetesStatefulSetService', KubernetesStatefulSetService);\n","import angular from 'angular';\nimport _ from 'lodash-es';\nimport PortainerError from 'Portainer/error';\nimport KubernetesStorageClassConverter from 'Kubernetes/converters/storageClass';\nimport { KubernetesCommonParams } from 'Kubernetes/models/common/params';\n\nclass KubernetesStorageService {\n /* @ngInject */\n constructor($async, KubernetesStorage) {\n this.$async = $async;\n this.KubernetesStorage = KubernetesStorage;\n\n this.getAsync = this.getAsync.bind(this);\n this.patchAsync = this.patchAsync.bind(this);\n }\n\n /**\n * GET\n */\n async getAsync(endpointId) {\n try {\n const params = {\n endpointId: endpointId,\n };\n const classes = await this.KubernetesStorage().get(params).$promise;\n const res = _.map(classes.items, (item) => KubernetesStorageClassConverter.apiToStorageClass(item));\n return res;\n } catch (err) {\n throw new PortainerError('Unable to retrieve storage classes', err);\n }\n }\n\n get(endpointId) {\n return this.$async(this.getAsync, endpointId);\n }\n\n /**\n * PATCH\n */\n async patchAsync(endpointId, oldStorageClass, newStorageClass) {\n try {\n const params = new KubernetesCommonParams();\n params.id = newStorageClass.Name;\n params.endpointId = endpointId;\n const payload = KubernetesStorageClassConverter.patchPayload(oldStorageClass, newStorageClass);\n await this.KubernetesStorage().patch(params, payload).$promise;\n } catch (err) {\n throw new PortainerError('Unable to patch storage class', err);\n }\n }\n\n patch(endpointId, oldStorageClass, newStorageClass) {\n return this.$async(this.patchAsync, endpointId, oldStorageClass, newStorageClass);\n }\n}\n\nexport default KubernetesStorageService;\nangular.module('portainer.kubernetes').service('KubernetesStorageService', KubernetesStorageService);\n","import angular from 'angular';\nimport _ from 'lodash-es';\n\nimport KubernetesVolumeConverter from 'Kubernetes/converters/volume';\n\nclass KubernetesVolumeService {\n /* @ngInject */\n constructor($async, KubernetesResourcePoolService, KubernetesApplicationService, KubernetesPersistentVolumeClaimService) {\n this.$async = $async;\n this.KubernetesResourcePoolService = KubernetesResourcePoolService;\n this.KubernetesApplicationService = KubernetesApplicationService;\n this.KubernetesPersistentVolumeClaimService = KubernetesPersistentVolumeClaimService;\n\n this.getAsync = this.getAsync.bind(this);\n this.getAllAsync = this.getAllAsync.bind(this);\n this.deleteAsync = this.deleteAsync.bind(this);\n }\n\n /**\n * GET\n */\n async getAsync(namespace, name) {\n const [pvc, pool] = await Promise.all([this.KubernetesPersistentVolumeClaimService.get(namespace, name), this.KubernetesResourcePoolService.get(namespace)]);\n return KubernetesVolumeConverter.pvcToVolume(pvc, pool);\n }\n\n async getAllAsync(namespace) {\n const data = await this.KubernetesResourcePoolService.get(namespace);\n const pools = data instanceof Array ? data : [data];\n const res = await Promise.all(\n _.map(pools, async (pool) => {\n const pvcs = await this.KubernetesPersistentVolumeClaimService.get(pool.Namespace.Name);\n return _.map(pvcs, (pvc) => KubernetesVolumeConverter.pvcToVolume(pvc, pool));\n })\n );\n return _.flatten(res);\n }\n\n get(namespace, name) {\n if (name) {\n return this.$async(this.getAsync, namespace, name);\n }\n return this.$async(this.getAllAsync, namespace);\n }\n\n /**\n * DELETE\n */\n async deleteAsync(volume) {\n await this.KubernetesPersistentVolumeClaimService.delete(volume.PersistentVolumeClaim);\n }\n\n delete(volume) {\n return this.$async(this.deleteAsync, volume);\n }\n}\n\nexport default KubernetesVolumeService;\nangular.module('portainer.kubernetes').service('KubernetesVolumeService', KubernetesVolumeService);\n","const autoNgTemplateLoaderTemplate1 = require('./applications.html');\n\nangular.module('portainer.kubernetes').component('kubernetesApplicationsView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'KubernetesApplicationsController',\n controllerAs: 'ctrl',\n bindings: {\n $transition$: '<',\n endpoint: '<',\n },\n});\n","var path = 'app/kubernetes/views/applications/applications.html';\nvar html = \"<kubernetes-view-header title=\\\"Application list\\\" state=\\\"kubernetes.applications\\\" view-ready=\\\"ctrl.state.viewReady\\\">\\n Applications\\n</kubernetes-view-header>\\n\\n<kubernetes-view-loading view-ready=\\\"ctrl.state.viewReady\\\"></kubernetes-view-loading>\\n\\n<div ng-if=\\\"ctrl.state.viewReady\\\">\\n <div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\" data-cy=\\\"k8sApp-appList\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <uib-tabset active=\\\"ctrl.state.activeTab\\\" justified=\\\"true\\\" type=\\\"pills\\\">\\n <uib-tab index=\\\"0\\\" classes=\\\"btn-sm\\\" select=\\\"ctrl.selectTab(0)\\\">\\n <uib-tab-heading> <i class=\\\"fa fa-laptop-code space-right\\\" aria-hidden=\\\"true\\\"></i> Applications </uib-tab-heading>\\n <kubernetes-applications-datatable\\n dataset=\\\"ctrl.state.applications\\\"\\n table-key=\\\"kubernetes.applications\\\"\\n settings-key=\\\"kubernetes.applications\\\"\\n order-by=\\\"Name\\\"\\n remove-action=\\\"ctrl.removeAction\\\"\\n refresh-callback=\\\"ctrl.getApplications\\\"\\n on-publishing-mode-click=\\\"(ctrl.onPublishingModeClick)\\\"\\n is-primary=\\\"true\\\"\\n >\\n </kubernetes-applications-datatable>\\n </uib-tab>\\n <uib-tab index=\\\"1\\\" classes=\\\"btn-sm\\\" select=\\\"ctrl.selectTab(1)\\\">\\n <uib-tab-heading> <i class=\\\"fa fa-exchange-alt space-right\\\" aria-hidden=\\\"true\\\"></i> Port mappings </uib-tab-heading>\\n <kubernetes-applications-ports-datatable dataset=\\\"ctrl.state.ports\\\" table-key=\\\"kubernetes.applications.ports\\\" order-by=\\\"Name\\\" refresh-callback=\\\"ctrl.getApplications\\\">\\n </kubernetes-applications-ports-datatable>\\n </uib-tab>\\n <uib-tab index=\\\"2\\\" classes=\\\"btn-sm\\\" select=\\\"ctrl.selectTab(2)\\\">\\n <uib-tab-heading> <i class=\\\"fa fa-th-list space-right\\\" aria-hidden=\\\"true\\\"></i> Stacks </uib-tab-heading>\\n <kubernetes-applications-stacks-datatable\\n dataset=\\\"ctrl.state.stacks\\\"\\n table-key=\\\"kubernetes.applications.stacks\\\"\\n order-by=\\\"Name\\\"\\n refresh-callback=\\\"ctrl.getApplications\\\"\\n remove-action=\\\"ctrl.removeStacksAction\\\"\\n >\\n </kubernetes-applications-stacks-datatable>\\n </uib-tab>\\n </uib-tabset>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import angular from 'angular';\nimport _ from 'lodash-es';\nimport KubernetesStackHelper from 'Kubernetes/helpers/stackHelper';\nimport KubernetesApplicationHelper from 'Kubernetes/helpers/application';\nimport KubernetesConfigurationHelper from 'Kubernetes/helpers/configurationHelper';\nimport { KubernetesApplicationTypes } from 'Kubernetes/models/application/models';\nimport { KubernetesPortainerApplicationStackNameLabel } from 'Kubernetes/models/application/models';\nclass KubernetesApplicationsController {\n /* @ngInject */\n constructor($async, $state, Notifications, KubernetesApplicationService, HelmService, KubernetesConfigurationService, Authentication, ModalService, LocalStorage, StackService) {\n this.$async = $async;\n this.$state = $state;\n this.Notifications = Notifications;\n this.KubernetesApplicationService = KubernetesApplicationService;\n this.HelmService = HelmService;\n this.KubernetesConfigurationService = KubernetesConfigurationService;\n this.Authentication = Authentication;\n this.ModalService = ModalService;\n this.LocalStorage = LocalStorage;\n this.StackService = StackService;\n\n this.onInit = this.onInit.bind(this);\n this.getApplications = this.getApplications.bind(this);\n this.getApplicationsAsync = this.getApplicationsAsync.bind(this);\n this.removeAction = this.removeAction.bind(this);\n this.removeActionAsync = this.removeActionAsync.bind(this);\n this.removeStacksAction = this.removeStacksAction.bind(this);\n this.removeStacksActionAsync = this.removeStacksActionAsync.bind(this);\n this.onPublishingModeClick = this.onPublishingModeClick.bind(this);\n }\n\n selectTab(index) {\n this.LocalStorage.storeActiveTab('applications', index);\n }\n\n async removeStacksActionAsync(selectedItems) {\n let actionCount = selectedItems.length;\n for (const stack of selectedItems) {\n try {\n const isAppFormCreated = stack.Applications.some((x) => !x.ApplicationKind);\n\n if (isAppFormCreated) {\n const promises = _.map(stack.Applications, (app) => this.KubernetesApplicationService.delete(app));\n await Promise.all(promises);\n } else {\n const application = stack.Applications.find((x) => x.StackId !== null);\n if (application && application.StackId) {\n await this.StackService.remove({ Id: application.StackId }, false, this.endpoint.Id);\n }\n }\n\n this.Notifications.success('Stack successfully removed', stack.Name);\n _.remove(this.state.stacks, { Name: stack.Name });\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to remove stack');\n } finally {\n --actionCount;\n if (actionCount === 0) {\n this.$state.reload(this.$state.current);\n }\n }\n }\n }\n\n removeStacksAction(selectedItems) {\n this.ModalService.confirmDeletion(\n 'Are you sure that you want to remove the selected stack(s) ? This will remove all the applications associated to the stack(s).',\n (confirmed) => {\n if (confirmed) {\n return this.$async(this.removeStacksActionAsync, selectedItems);\n }\n }\n );\n }\n\n async removeActionAsync(selectedItems) {\n let actionCount = selectedItems.length;\n for (const application of selectedItems) {\n try {\n if (application.ApplicationType === KubernetesApplicationTypes.HELM) {\n await this.HelmService.uninstall(this.endpoint.Id, application);\n } else {\n await this.KubernetesApplicationService.delete(application);\n\n if (application.Metadata.labels[KubernetesPortainerApplicationStackNameLabel]) {\n // Update applications in stack\n const stack = this.state.stacks.find((x) => x.Name === application.StackName);\n const index = stack.Applications.indexOf(application);\n stack.Applications.splice(index, 1);\n\n // remove stack if no app left in the stack\n if (stack.Applications.length === 0 && application.StackId) {\n await this.StackService.remove({ Id: application.StackId }, false, this.endpoint.Id);\n }\n }\n }\n this.Notifications.success('Application successfully removed', application.Name);\n const index = this.state.applications.indexOf(application);\n this.state.applications.splice(index, 1);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to remove application');\n } finally {\n --actionCount;\n if (actionCount === 0) {\n this.$state.reload(this.$state.current);\n }\n }\n }\n }\n\n removeAction(selectedItems) {\n this.ModalService.confirmDeletion('Do you want to remove the selected application(s)?', (confirmed) => {\n if (confirmed) {\n return this.$async(this.removeActionAsync, selectedItems);\n }\n });\n }\n\n onPublishingModeClick(application) {\n this.state.activeTab = 1;\n _.forEach(this.state.ports, (item) => {\n item.Expanded = false;\n item.Highlighted = false;\n if (item.Name === application.Name && item.Ports.length > 1) {\n item.Expanded = true;\n item.Highlighted = true;\n }\n });\n }\n\n async getApplicationsAsync() {\n try {\n const [applications, configurations] = await Promise.all([this.KubernetesApplicationService.get(), this.KubernetesConfigurationService.get()]);\n const configuredApplications = KubernetesConfigurationHelper.getApplicationConfigurations(applications, configurations);\n const { helmApplications, nonHelmApplications } = KubernetesApplicationHelper.getNestedApplications(configuredApplications);\n\n this.state.applications = [...helmApplications, ...nonHelmApplications];\n this.state.stacks = KubernetesStackHelper.stacksFromApplications(applications);\n this.state.ports = KubernetesApplicationHelper.portMappingsFromApplications(applications);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve applications');\n }\n }\n\n getApplications() {\n return this.$async(this.getApplicationsAsync);\n }\n\n async onInit() {\n this.state = {\n activeTab: this.LocalStorage.getActiveTab('applications'),\n currentName: this.$state.$current.name,\n isAdmin: this.Authentication.isAdmin(),\n viewReady: false,\n applications: [],\n stacks: [],\n ports: [],\n };\n await this.getApplications();\n\n this.state.viewReady = true;\n }\n\n $onInit() {\n return this.$async(this.onInit);\n }\n\n $onDestroy() {\n if (this.state.currentName !== this.$state.$current.name) {\n this.LocalStorage.storeActiveTab('applications', 0);\n }\n }\n}\n\nexport default KubernetesApplicationsController;\nangular.module('portainer.kubernetes').controller('KubernetesApplicationsController', KubernetesApplicationsController);\n","const autoNgTemplateLoaderTemplate1 = require('./console.html');\n\nangular.module('portainer.kubernetes').component('kubernetesApplicationConsoleView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'KubernetesApplicationConsoleController',\n controllerAs: 'ctrl',\n bindings: {\n $transition$: '<',\n },\n});\n","var path = 'app/kubernetes/views/applications/console/console.html';\nvar html = \"<kubernetes-view-header title=\\\"Application console\\\" state=\\\"kubernetes.applications.application.console\\\" view-ready=\\\"ctrl.state.viewReady\\\">\\n <a ui-sref=\\\"kubernetes.resourcePools\\\">Namespaces</a> >\\n <a ui-sref=\\\"kubernetes.resourcePools.resourcePool({ id: ctrl.application.ResourcePool })\\\">{{ ctrl.application.ResourcePool }}</a> >\\n <a ui-sref=\\\"kubernetes.applications\\\">Applications</a> >\\n <a ui-sref=\\\"kubernetes.applications.application({ name: ctrl.application.Name, namespace: ctrl.application.ResourcePool })\\\">{{ ctrl.application.Name }}</a> > Pods >\\n {{ ctrl.podName }} > Containers > {{ ctrl.containerName }} > Console\\n</kubernetes-view-header>\\n\\n<kubernetes-view-loading view-ready=\\\"ctrl.state.viewReady\\\"></kubernetes-view-loading>\\n\\n<div ng-if=\\\"ctrl.state.viewReady\\\">\\n <div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\" autocomplete=\\\"off\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Console\\n </div>\\n <!-- Command -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"console_command\\\" class=\\\"col-sm-1 control-label text-left\\\">Command</label>\\n <div class=\\\"col-sm-10 input-group\\\">\\n <span class=\\\"input-group-addon\\\">\\n <i class=\\\"fas fa-terminal\\\" aria-hidden=\\\"true\\\"></i>\\n </span>\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n placeholder=\\\"/bin/bash\\\"\\n ng-model=\\\"ctrl.state.command\\\"\\n name=\\\"console_command\\\"\\n uib-typeahead=\\\"command for command in ctrl.state.availableCommands | filter:$viewValue | limitTo:5\\\"\\n typeahead-show-hint=\\\"true\\\"\\n typeahead-min-length=\\\"0\\\"\\n auto-focus\\n />\\n </div>\\n </div>\\n <!-- !command -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n style=\\\"margin: 0;\\\"\\n ng-if=\\\"!ctrl.state.connected\\\"\\n ng-disabled=\\\"!ctrl.state.command || ctrl.state.connected\\\"\\n ng-click=\\\"ctrl.connectConsole()\\\"\\n button-spinner=\\\"ctrl.state.actionInProgress\\\"\\n >\\n <span ng-hide=\\\"ctrl.state.actionInProgress\\\">Connect</span>\\n <span ng-show=\\\"ctrl.state.actionInProgress\\\">Connection in progress...</span>\\n </button>\\n <button type=\\\"button\\\" class=\\\"btn btn-primary btn-sm\\\" style=\\\"margin: 0;\\\" ng-if=\\\"ctrl.state.connected\\\" ng-click=\\\"ctrl.disconnect()\\\">\\n Disconnect\\n </button>\\n </div>\\n </div>\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n </div>\\n\\n <div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <div id=\\\"terminal-container\\\" class=\\\"terminal-container\\\"></div>\\n </div>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import angular from 'angular';\nimport { Terminal } from 'xterm';\n\nclass KubernetesApplicationConsoleController {\n /* @ngInject */\n constructor($async, $state, Notifications, KubernetesApplicationService, EndpointProvider, LocalStorage) {\n this.$async = $async;\n this.$state = $state;\n this.Notifications = Notifications;\n this.KubernetesApplicationService = KubernetesApplicationService;\n this.EndpointProvider = EndpointProvider;\n this.LocalStorage = LocalStorage;\n\n this.onInit = this.onInit.bind(this);\n }\n\n disconnect() {\n this.state.socket.close();\n this.state.term.dispose();\n this.state.connected = false;\n }\n\n configureSocketAndTerminal(socket, term) {\n socket.onopen = function () {\n const terminal_container = document.getElementById('terminal-container');\n term.open(terminal_container);\n term.setOption('cursorBlink', true);\n term.focus();\n };\n\n term.on('data', function (data) {\n socket.send(data);\n });\n\n socket.onmessage = function (msg) {\n term.write(msg.data);\n };\n\n socket.onerror = function (err) {\n this.disconnect();\n this.Notifications.error('Failure', err, 'Websocket connection error');\n }.bind(this);\n\n this.state.socket.onclose = function () {\n this.disconnect();\n }.bind(this);\n\n this.state.connected = true;\n }\n\n connectConsole() {\n const params = {\n token: this.LocalStorage.getJWT(),\n endpointId: this.EndpointProvider.endpointID(),\n namespace: this.application.ResourcePool,\n podName: this.podName,\n containerName: this.containerName,\n command: this.state.command,\n };\n\n let url =\n window.location.href.split('#')[0] +\n 'api/websocket/pod?' +\n Object.keys(params)\n .map((k) => k + '=' + params[k])\n .join('&');\n if (url.indexOf('https') > -1) {\n url = url.replace('https://', 'wss://');\n } else {\n url = url.replace('http://', 'ws://');\n }\n\n this.state.socket = new WebSocket(url);\n this.state.term = new Terminal();\n\n this.configureSocketAndTerminal(this.state.socket, this.state.term);\n }\n\n async onInit() {\n const availableCommands = ['/bin/bash', '/bin/sh'];\n\n this.state = {\n actionInProgress: false,\n availableCommands: availableCommands,\n command: availableCommands[1],\n connected: false,\n socket: null,\n term: null,\n viewReady: false,\n };\n\n const podName = this.$transition$.params().pod;\n const applicationName = this.$transition$.params().name;\n const namespace = this.$transition$.params().namespace;\n const containerName = this.$transition$.params().container;\n\n this.podName = podName;\n this.containerName = containerName;\n\n try {\n this.application = await this.KubernetesApplicationService.get(namespace, applicationName);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve application logs');\n } finally {\n this.state.viewReady = true;\n }\n }\n\n $onInit() {\n return this.$async(this.onInit);\n }\n}\n\nexport default KubernetesApplicationConsoleController;\nangular.module('portainer.kubernetes').controller('KubernetesApplicationConsoleController', KubernetesApplicationConsoleController);\n","const autoNgTemplateLoaderTemplate1 = require('./createApplication.html');\n\nangular.module('portainer.kubernetes').component('kubernetesCreateApplicationView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'KubernetesCreateApplicationController',\n controllerAs: 'ctrl',\n bindings: {\n endpoint: '<',\n },\n});\n","var path = 'app/kubernetes/views/applications/create/createApplication.html';\nvar html = \"<kubernetes-view-header ng-if=\\\"!ctrl.state.isEdit\\\" title=\\\"Create application\\\" state=\\\"kubernetes.applications.new\\\" view-ready=\\\"ctrl.state.viewReady\\\">\\n <a ui-sref=\\\"kubernetes.applications\\\">Applications</a> > Create an application\\n</kubernetes-view-header>\\n<kubernetes-view-header ng-if=\\\"ctrl.state.isEdit\\\" title=\\\"Edit application\\\" state=\\\"kubernetes.applications.application.edit\\\" view-ready=\\\"ctrl.state.viewReady\\\">\\n <a ui-sref=\\\"kubernetes.resourcePools\\\">Namespaces</a> >\\n <a ui-sref=\\\"kubernetes.resourcePools.resourcePool({ id: ctrl.application.ResourcePool })\\\">{{ ctrl.application.ResourcePool }}</a> >\\n <a ui-sref=\\\"kubernetes.applications\\\">Applications</a> >\\n <a ui-sref=\\\"kubernetes.applications.application({ name: ctrl.application.Name, namespace: ctrl.application.ResourcePool })\\\">{{ ctrl.application.Name }}</a> > Edit\\n</kubernetes-view-header>\\n\\n<kubernetes-view-loading view-ready=\\\"ctrl.state.viewReady\\\"></kubernetes-view-loading>\\n\\n<div ng-if=\\\"ctrl.state.viewReady\\\">\\n <div class=\\\"row\\\">\\n <div class=\\\"col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\" name=\\\"kubernetesApplicationCreationForm\\\" autocomplete=\\\"off\\\">\\n <git-form-info-panel\\n ng-if=\\\"ctrl.state.appType == ctrl.KubernetesDeploymentTypes.GIT\\\"\\n class-name=\\\"text-muted\\\"\\n url=\\\"ctrl.stack.GitConfig.URL\\\"\\n config-file-path=\\\"ctrl.stack.GitConfig.ConfigFilePath\\\"\\n additional-files=\\\"ctrl.stack.AdditionalFiles\\\"\\n type=\\\"application\\\"\\n ></git-form-info-panel>\\n <div class=\\\"col-sm-12 form-section-title\\\" ng-if=\\\"ctrl.state.appType === ctrl.KubernetesDeploymentTypes.APPLICATION_FORM\\\">\\n Namespace\\n </div>\\n <!-- #region NAMESPACE -->\\n <div class=\\\"form-group\\\" ng-if=\\\"ctrl.formValues.ResourcePool\\\">\\n <label for=\\\"resource-pool-selector\\\" class=\\\"col-sm-1 control-label text-left\\\">Namespace</label>\\n <div class=\\\"col-sm-11\\\">\\n <select\\n class=\\\"form-control\\\"\\n id=\\\"resource-pool-selector\\\"\\n ng-model=\\\"ctrl.formValues.ResourcePool\\\"\\n ng-options=\\\"resourcePool.Namespace.Name for resourcePool in ctrl.resourcePools\\\"\\n ng-change=\\\"ctrl.onResourcePoolSelectionChange()\\\"\\n ng-disabled=\\\"ctrl.state.isEdit\\\"\\n data-cy=\\\"k8sAppCreate-nsSelect\\\"\\n ></select>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-if=\\\"ctrl.state.resourcePoolHasQuota && ctrl.resourceQuotaCapacityExceeded() && ctrl.formValues.ResourcePool\\\">\\n <div class=\\\"col-sm-12 small text-danger\\\">\\n <i class=\\\"fa fa-exclamation-circle red-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n This namespace has exhausted its resource capacity and you will not be able to deploy the application. Contact your administrator to expand the capacity of the\\n namespace.\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-if=\\\"!ctrl.formValues.ResourcePool\\\">\\n <div class=\\\"col-sm-12 small text-muted\\\">\\n <i class=\\\"fa fa-exclamation-circle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n You do not have access to any namespace. Contact your administrator to get access to a namespace.\\n </div>\\n </div>\\n <!-- #endregion -->\\n\\n <!-- #region Git repository -->\\n <kubernetes-redeploy-app-git-form\\n ng-if=\\\"ctrl.state.appType === ctrl.KubernetesDeploymentTypes.GIT\\\"\\n stack=\\\"ctrl.stack\\\"\\n namespace=\\\"ctrl.formValues.ResourcePool.Namespace.Name\\\"\\n ></kubernetes-redeploy-app-git-form>\\n <!-- #endregion -->\\n\\n <!-- #region web editor -->\\n <web-editor-form\\n ng-if=\\\"ctrl.state.appType === ctrl.KubernetesDeploymentTypes.CONTENT\\\"\\n value=\\\"ctrl.stackFileContent\\\"\\n yml=\\\"true\\\"\\n identifier=\\\"kubernetes-deploy-editor\\\"\\n placeholder=\\\"# Define or paste the content of your manifest file here\\\"\\n on-change=\\\"(ctrl.onChangeFileContent)\\\"\\n >\\n <editor-description>\\n <span class=\\\"text-muted small\\\" ng-show=\\\"ctrl.stack.IsComposeFormat\\\">\\n <p>\\n <i class=\\\"fa fa-exclamation-circle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Portainer uses <a href=\\\"https://kompose.io/\\\" target=\\\"_blank\\\">Kompose</a> to convert your Compose manifest to a Kubernetes compliant manifest. Be wary that not\\n all the Compose format options are supported by Kompose at the moment.\\n </p>\\n <p>\\n You can get more information about Compose file format in the\\n <a href=\\\"https://docs.docker.com/compose/compose-file/\\\" target=\\\"_blank\\\">official documentation</a>.\\n </p>\\n </span>\\n <span class=\\\"text-muted small\\\" ng-show=\\\"!ctrl.stack.IsComposeFormat\\\">\\n <p>\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n This feature allows you to deploy any kind of Kubernetes resource in this environment (Deployment, Secret, ConfigMap...).\\n </p>\\n <p>\\n You can get more information about Kubernetes file format in the\\n <a href=\\\"https://kubernetes.io/docs/concepts/overview/working-with-objects/kubernetes-objects/\\\" target=\\\"_blank\\\">official documentation</a>.\\n </p>\\n </span>\\n </editor-description>\\n </web-editor-form>\\n <!-- #endregion -->\\n <div ng-if=\\\"ctrl.state.appType === ctrl.KubernetesDeploymentTypes.APPLICATION_FORM\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Application\\n </div>\\n <!-- #region NAME FIELD -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"application_name\\\" class=\\\"col-sm-1 control-label text-left\\\">Name</label>\\n <div class=\\\"col-sm-11\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n name=\\\"application_name\\\"\\n ng-model=\\\"ctrl.formValues.Name\\\"\\n ng-change=\\\"ctrl.onChangeName()\\\"\\n placeholder=\\\"my-app\\\"\\n ng-pattern=\\\"/^[a-z]([-a-z0-9]*[a-z0-9])?$/\\\"\\n auto-focus\\n required\\n ng-disabled=\\\"ctrl.state.isEdit\\\"\\n data-cy=\\\"k8sAppCreate-applicationName\\\"\\n />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"kubernetesApplicationCreationForm.application_name.$invalid || ctrl.state.alreadyExists\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"kubernetesApplicationCreationForm.application_name.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n <p ng-message=\\\"pattern\\\"\\n ><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field must consist of lower case alphanumeric characters or '-', start with an alphabetic\\n character, and end with an alphanumeric character (e.g. 'my-name', or 'abc-123').</p\\n >\\n </div>\\n <p ng-if=\\\"ctrl.state.alreadyExists\\\"\\n ><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> An application with the same name already exists inside the selected namespace.</p\\n >\\n </div>\\n </div>\\n <!-- #endregion -->\\n\\n <!-- #region IMAGE FIELD -->\\n\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <por-image-registry\\n model=\\\"ctrl.formValues.ImageModel\\\"\\n ng-if=\\\"ctrl.formValues.ResourcePool\\\"\\n auto-complete=\\\"false\\\"\\n label-class=\\\"col-sm-1\\\"\\n input-class=\\\"col-sm-11\\\"\\n namespace=\\\"ctrl.formValues.ResourcePool.Namespace.Name\\\"\\n endpoint=\\\"ctrl.endpoint\\\"\\n is-admin=\\\"ctrl.isAdmin\\\"\\n check-rate-limits=\\\"true\\\"\\n set-validity=\\\"ctrl.setPullImageValidity\\\"\\n ></por-image-registry>\\n </div>\\n </div>\\n <div ng-if=\\\"ctrl.formValues.ResourcePool\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Stack\\n </div>\\n <!-- #region STACK -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12 small text-muted\\\">\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Portainer can automatically bundle multiple applications inside a stack. Enter a name of a new stack or select an existing stack in the list. Leave empty to use\\n the application name.\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <label for=\\\"stack_name\\\" class=\\\"col-sm-1 control-label text-left\\\">Stack</label>\\n <div class=\\\"col-sm-11\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n placeholder=\\\"myStack\\\"\\n ng-model=\\\"ctrl.formValues.StackName\\\"\\n name=\\\"stack_name\\\"\\n uib-typeahead=\\\"stack for stack in ctrl.stacks | filter:$viewValue | limitTo:7\\\"\\n typeahead-show-hint=\\\"true\\\"\\n typeahead-min-length=\\\"0\\\"\\n data-cy=\\\"k8sAppCreate-stackName\\\"\\n />\\n </div>\\n </div>\\n <!-- #endregion -->\\n\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Environment\\n </div>\\n <!-- #region ENVIRONMENT VARIABLES -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label class=\\\"control-label text-left\\\">Environment variables</label>\\n <span\\n ng-if=\\\"ctrl.formValues.Containers.length <= 1\\\"\\n class=\\\"label label-default interactive\\\"\\n style=\\\"margin-left: 10px;\\\"\\n ng-click=\\\"ctrl.addEnvironmentVariable()\\\"\\n data-cy=\\\"k8sAppCreate-addEnvVarButton\\\"\\n >\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add environment variable\\n </span>\\n </div>\\n\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\">\\n <div ng-repeat=\\\"envVar in ctrl.formValues.EnvironmentVariables | orderBy: 'NameIndex'\\\" style=\\\"margin-top: 2px;\\\">\\n <div style=\\\"margin-top: 2px;\\\">\\n <div class=\\\"col-sm-4 input-group input-group-sm\\\">\\n <div class=\\\"input-group col-sm-12 input-group-sm\\\" ng-class=\\\"{ striked: envVar.NeedsDeletion }\\\">\\n <span class=\\\"input-group-addon\\\">name</span>\\n <input\\n type=\\\"text\\\"\\n name=\\\"environment_variable_name_{{ $index }}\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"envVar.Name\\\"\\n ng-change=\\\"ctrl.onChangeEnvironmentName()\\\"\\n ng-pattern=\\\"/^[-._a-zA-Z][-._a-zA-Z0-9]*$/\\\"\\n placeholder=\\\"foo\\\"\\n ng-disabled=\\\"ctrl.formValues.Containers.length > 1\\\"\\n data-cy=\\\"k8sAppCreate-envVarName_{{ $index }}\\\"\\n required\\n />\\n </div>\\n </div>\\n\\n <div class=\\\"col-sm-4 input-group input-group-sm\\\" ng-class=\\\"{ striked: envVar.NeedsDeletion }\\\">\\n <span class=\\\"input-group-addon\\\">value</span>\\n <input\\n type=\\\"text\\\"\\n name=\\\"environment_variable_value_{{ $index }}\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"envVar.Value\\\"\\n placeholder=\\\"bar\\\"\\n ng-disabled=\\\"ctrl.formValues.Containers.length > 1\\\"\\n data-cy=\\\"k8sAppCreate-envVarValue_{{ $index }}\\\"\\n />\\n </div>\\n\\n <div class=\\\"col-sm-2 input-group input-group-sm\\\" ng-if=\\\"ctrl.formValues.Containers.length <= 1\\\">\\n <button ng-if=\\\"!envVar.NeedsDeletion\\\" class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"ctrl.removeEnvironmentVariable(envVar)\\\">\\n <i class=\\\"fa fa-trash-alt\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n <button\\n ng-if=\\\"envVar.NeedsDeletion\\\"\\n class=\\\"btn btn-sm btn-primary\\\"\\n type=\\\"button\\\"\\n ng-click=\\\"ctrl.restoreEnvironmentVariable(envVar)\\\"\\n data-cy=\\\"k8sAppCreate-removeEnvVarButton_{{ $index }}\\\"\\n >\\n <i class=\\\"fa fa-trash-restore\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n <div\\n ng-show=\\\"\\n kubernetesApplicationCreationForm['environment_variable_name_' + $index].$invalid || ctrl.state.duplicates.environmentVariables.refs[$index] !== undefined\\n \\\"\\n >\\n <div class=\\\"col-sm-4 input-group input-group-sm\\\">\\n <div\\n class=\\\"small text-warning\\\"\\n style=\\\"margin-top: 5px;\\\"\\n ng-show=\\\"\\n kubernetesApplicationCreationForm['environment_variable_name_' + $index].$invalid ||\\n ctrl.state.duplicates.environmentVariables.refs[$index] !== undefined\\n \\\"\\n >\\n <ng-messages for=\\\"kubernetesApplicationCreationForm['environment_variable_name_' + $index].$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Environment variable name is required.</p>\\n <p ng-message=\\\"pattern\\\"\\n ><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field must consist of alphabetic characters, digits, '_', '-', or '.', and must\\n not start with a digit (e.g. 'my.env-name', or 'MY_ENV.NAME', or 'MyEnvName1'.</p\\n >\\n </ng-messages>\\n <p ng-if=\\\"ctrl.state.duplicates.environmentVariables.refs[$index] !== undefined\\\"\\n ><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This environment variable is already defined.</p\\n >\\n </div>\\n </div>\\n <div class=\\\"col-sm-4 input-group input-group-sm\\\"></div>\\n <div class=\\\"col-sm-2 input-group input-group-sm\\\"></div>\\n </div>\\n </div>\\n </div>\\n </div>\\n <!-- #endregion -->\\n\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Configurations\\n </div>\\n <!-- #region CONFIGURATIONS -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label class=\\\"control-label text-left\\\">Configurations</label>\\n <span\\n class=\\\"label label-default interactive\\\"\\n style=\\\"margin-left: 10px;\\\"\\n ng-click=\\\"ctrl.addConfiguration()\\\"\\n ng-if=\\\"ctrl.formValues.Containers.length <= 1\\\"\\n data-cy=\\\"k8sAppCreate-addConfigButton\\\"\\n >\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add configuration\\n </span>\\n </div>\\n <div class=\\\"col-sm-12 small text-muted\\\" style=\\\"margin-top: 15px;\\\" ng-if=\\\"ctrl.formValues.Configurations.length\\\">\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Portainer will automatically expose all the keys of a configuration as environment variables. This behavior can be overriden to filesystem mounts for each key\\n via the override button.\\n </div>\\n </div>\\n\\n <!-- config-element -->\\n <div class=\\\"form-group\\\" ng-repeat=\\\"(index, config) in ctrl.formValues.Configurations\\\">\\n <label for=\\\"stack_name\\\" class=\\\"col-md-1 col-sm-2 control-label text-left\\\">Configuration</label>\\n <div class=\\\"col-sm-5\\\">\\n <select\\n class=\\\"form-control\\\"\\n ng-model=\\\"config.SelectedConfiguration\\\"\\n ng-options=\\\"c as c.Name for c in ctrl.configurations track by c.Name\\\"\\n ng-change=\\\"ctrl.resetConfiguration(index)\\\"\\n ng-disabled=\\\"ctrl.formValues.Containers.length > 1\\\"\\n data-cy=\\\"k8sAppCreate-addConfigSelect_{{ $index }}\\\"\\n ></select>\\n </div>\\n <div class=\\\"col-sm-6\\\" style=\\\"margin-top: 2px;\\\">\\n <button\\n class=\\\"btn btn-sm btn-primary\\\"\\n type=\\\"button\\\"\\n ng-if=\\\"!config.Overriden\\\"\\n ng-click=\\\"ctrl.overrideConfiguration(index)\\\"\\n ng-disabled=\\\"!config.SelectedConfiguration || ctrl.formValues.Containers.length > 1\\\"\\n data-cy=\\\"k8sAppCreate-configOverrideButton_{{ $index }}\\\"\\n >\\n <i class=\\\"fa fa-list\\\" aria-hidden=\\\"true\\\"></i> Override\\n </button>\\n <button\\n class=\\\"btn btn-sm btn-primary\\\"\\n type=\\\"button\\\"\\n ng-if=\\\"config.Overriden\\\"\\n ng-click=\\\"ctrl.resetConfiguration(index)\\\"\\n ng-disabled=\\\"ctrl.formValues.Containers.length > 1\\\"\\n data-cy=\\\"k8sAppCreate-configAutoButton_{{ $index }}\\\"\\n >\\n <i class=\\\"fa fa-undo\\\" aria-hidden=\\\"true\\\"></i> Auto\\n </button>\\n <button\\n class=\\\"btn btn-sm btn-danger\\\"\\n type=\\\"button\\\"\\n ng-click=\\\"ctrl.removeConfiguration(index)\\\"\\n ng-if=\\\"ctrl.formValues.Containers.length <= 1\\\"\\n data-cy=\\\"k8sAppCreate-configRemoveButton\\\"\\n >\\n <i class=\\\"fa fa-trash-alt\\\" aria-hidden=\\\"true\\\"></i> Remove\\n </button>\\n </div>\\n <!-- no-override -->\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 10px;\\\" ng-if=\\\"config.SelectedConfiguration && !config.Overriden\\\">\\n <div class=\\\"col-md-1 col-sm-2\\\"></div>\\n <div class=\\\"col-md-11 col-sm-10 small text-muted\\\" style=\\\"padding-left: 5px;\\\">\\n The following keys will be loaded from the <code>{{ config.SelectedConfiguration.Name }}</code> configuration as environment variables:\\n <span ng-repeat=\\\"(key, _) in config.SelectedConfiguration.Data\\\">\\n <code>{{ key }}</code\\n >{{ $last ? '' : ', ' }}\\n </span>\\n </div>\\n </div>\\n <!-- !no-override -->\\n\\n <!-- has-override -->\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\" ng-if=\\\"config.Overriden\\\">\\n <div ng-repeat=\\\"(keyIndex, overridenKey) in config.OverridenKeys\\\" style=\\\"margin-top: 2px;\\\">\\n <div style=\\\"margin-top: 2px;\\\">\\n <div class=\\\"col-sm-1 input-group input-group-sm\\\" style=\\\"margin-left: 3px;\\\"></div>\\n <div class=\\\"col-sm-3 input-group input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">configuration key</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-value=\\\"overridenKey.Key\\\" disabled />\\n </div>\\n\\n <div class=\\\"col-sm-3 input-group input-group-sm\\\" ng-if=\\\"overridenKey.Type === ctrl.ApplicationConfigurationFormValueOverridenKeyTypes.FILESYSTEM\\\">\\n <div class=\\\"col-sm-12 input-group input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">path on disk</span>\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"overridenKey.Path\\\"\\n placeholder=\\\"/etc/myapp/conf.d\\\"\\n name=\\\"overriden_key_path_{{ index }}_{{ keyIndex }}\\\"\\n ng-disabled=\\\"ctrl.formValues.Containers.length > 1\\\"\\n required\\n ng-change=\\\"ctrl.onChangeConfigurationPath()\\\"\\n data-cy=\\\"k8sAppCreate-pathOnDiskInput\\\"\\n />\\n </div>\\n </div>\\n\\n <div class=\\\"input-group col-sm-4 btn-group btn-group-sm\\\">\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"overridenKey.Type\\\" uib-btn-radio=\\\"ctrl.ApplicationConfigurationFormValueOverridenKeyTypes.ENVIRONMENT\\\">\\n <i class=\\\"fa fa-list\\\" aria-hidden=\\\"true\\\"></i> Environment\\n </label>\\n <label class=\\\"btn btn-primary\\\" ng-model=\\\"overridenKey.Type\\\" uib-btn-radio=\\\"ctrl.ApplicationConfigurationFormValueOverridenKeyTypes.FILESYSTEM\\\">\\n <i class=\\\"fa fa-file\\\" aria-hidden=\\\"true\\\"></i> Filesystem\\n </label>\\n </div>\\n </div>\\n\\n <div\\n ng-show=\\\"\\n kubernetesApplicationCreationForm['overriden_key_path_' + index + '_' + keyIndex].$invalid ||\\n ctrl.state.duplicates.configurationPaths.refs[index + '_' + keyIndex] !== undefined\\n \\\"\\n >\\n <div class=\\\"col-sm-1 input-group input-group-sm\\\" style=\\\"margin-left: 3px;\\\"></div>\\n <div class=\\\"col-sm-3 input-group input-group-sm\\\"></div>\\n <div class=\\\"col-sm-3 input-group input-group-sm\\\" ng-if=\\\"overridenKey.Type === ctrl.ApplicationConfigurationFormValueOverridenKeyTypes.FILESYSTEM\\\">\\n <div\\n class=\\\"small text-warning\\\"\\n style=\\\"margin-top: 5px;\\\"\\n ng-show=\\\"\\n kubernetesApplicationCreationForm['overriden_key_path_' + index + '_' + keyIndex].$invalid ||\\n ctrl.state.duplicates.configurationPaths.refs[index + '_' + keyIndex] !== undefined\\n \\\"\\n >\\n <ng-messages for=\\\"kubernetesApplicationCreationForm['overriden_key_path_' + index + '_' + keyIndex].$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Path is required.</p>\\n </ng-messages>\\n <p ng-if=\\\"ctrl.state.duplicates.configurationPaths.refs[index + '_' + keyIndex] !== undefined\\\"\\n ><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This path is already used.</p\\n >\\n </div>\\n </div>\\n <div class=\\\"col-sm-4 input-group input-group-sm\\\"></div>\\n </div>\\n </div>\\n </div>\\n <!-- !has-override -->\\n </div>\\n <!-- !config-element -->\\n <!-- #endregion -->\\n\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Persisting data\\n </div>\\n <!-- #region PERSISTED FOLDERS -->\\n <div class=\\\"form-group\\\" ng-if=\\\"!ctrl.storageClassAvailable()\\\">\\n <div class=\\\"col-sm-12 small text-muted\\\">\\n <i class=\\\"fa fa-exclamation-circle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n No storage option is available to persist data, contact your administrator to enable a storage option.\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\" ng-if=\\\"ctrl.storageClassAvailable()\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 5px;\\\">\\n <label class=\\\"control-label text-left\\\">Persisted folders</label>\\n <span\\n class=\\\"label label-default interactive\\\"\\n style=\\\"margin-left: 10px;\\\"\\n ng-click=\\\"ctrl.addPersistedFolder()\\\"\\n ng-if=\\\"ctrl.isAddPersistentFolderButtonShowed()\\\"\\n data-cy=\\\"k8sAppCreate-addPersistentFolderButton\\\"\\n >\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add persisted folder\\n </span>\\n </div>\\n\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\" ng-repeat=\\\"persistedFolder in ctrl.formValues.PersistedFolders\\\">\\n <div style=\\\"margin-top: 2px;\\\">\\n <div class=\\\"input-group col-sm-3 input-group-sm\\\" ng-class=\\\"{ striked: persistedFolder.NeedsDeletion }\\\">\\n <span class=\\\"input-group-addon\\\">path in container</span>\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n name=\\\"persisted_folder_path_{{ $index }}\\\"\\n ng-model=\\\"persistedFolder.ContainerPath\\\"\\n ng-change=\\\"ctrl.onChangePersistedFolderPath()\\\"\\n ng-disabled=\\\"ctrl.isEditAndExistingPersistedFolder($index) || ctrl.formValues.Containers.length > 1\\\"\\n placeholder=\\\"/data\\\"\\n required\\n data-cy=\\\"k8sAppCreate-containerPathInput_{{ $index }}\\\"\\n />\\n </div>\\n\\n <div class=\\\"input-group col-sm-2 input-group-sm\\\">\\n <span\\n class=\\\"btn-group btn-group-sm\\\"\\n ng-class=\\\"{ striked: persistedFolder.NeedsDeletion }\\\"\\n ng-if=\\\"\\n !ctrl.isEditAndExistingPersistedFolder($index) &&\\n ctrl.application.ApplicationType !== ctrl.ApplicationTypes.STATEFULSET &&\\n ctrl.formValues.Containers.length <= 1\\n \\\"\\n >\\n <label\\n class=\\\"btn btn-primary\\\"\\n ng-model=\\\"persistedFolder.UseNewVolume\\\"\\n uib-btn-radio=\\\"true\\\"\\n ng-change=\\\"ctrl.useNewVolume($index)\\\"\\n ng-disabled=\\\"ctrl.isNewVolumeButtonDisabled($index)\\\"\\n >New volume</label\\n >\\n <label\\n class=\\\"btn btn-primary\\\"\\n ng-model=\\\"persistedFolder.UseNewVolume\\\"\\n uib-btn-radio=\\\"false\\\"\\n ng-change=\\\"ctrl.useExistingVolume($index)\\\"\\n ng-disabled=\\\"ctrl.isExistingVolumeButtonDisabled()\\\"\\n >Existing volume</label\\n >\\n </span>\\n </div>\\n\\n <div class=\\\"input-group col-sm-3 input-group-sm\\\" ng-class=\\\"{ striked: persistedFolder.NeedsDeletion }\\\" ng-if=\\\"persistedFolder.UseNewVolume\\\">\\n <span class=\\\"input-group-addon\\\">requested size</span>\\n <input\\n type=\\\"number\\\"\\n class=\\\"form-control\\\"\\n name=\\\"persisted_folder_size_{{ $index }}\\\"\\n ng-model=\\\"persistedFolder.Size\\\"\\n placeholder=\\\"20\\\"\\n ng-min=\\\"0\\\"\\n required\\n ng-disabled=\\\"ctrl.isEditAndExistingPersistedFolder($index) || ctrl.formValues.Containers.length > 1\\\"\\n />\\n <span class=\\\"input-group-addon\\\" style=\\\"padding: 0;\\\">\\n <select\\n ng-model=\\\"persistedFolder.SizeUnit\\\"\\n ng-style=\\\"{ width: '100%', height: '100%', cursor: ctrl.isEditAndExistingPersistedFolder($index) ? 'not-allowed' : 'auto' }\\\"\\n ng-options=\\\"unit for unit in ctrl.state.availableSizeUnits\\\"\\n ng-disabled=\\\"ctrl.isEditAndExistingPersistedFolder($index) || ctrl.formValues.Containers.length > 1\\\"\\n ></select>\\n </span>\\n </div>\\n\\n <div class=\\\"input-group col-sm-2 input-group-sm\\\" ng-class=\\\"{ striked: persistedFolder.NeedsDeletion }\\\" ng-if=\\\"persistedFolder.UseNewVolume\\\">\\n <span class=\\\"input-group-addon\\\">storage</span>\\n <select\\n ng-if=\\\"ctrl.hasMultipleStorageClassesAvailable()\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"persistedFolder.StorageClass\\\"\\n ng-options=\\\"storageClass as storageClass.Name for storageClass in ctrl.storageClasses\\\"\\n ng-disabled=\\\"ctrl.state.isEdit || ctrl.formValues.Containers.length > 1\\\"\\n data-cy=\\\"k8sAppCreate-storageSelect_{{ $index }}\\\"\\n ></select>\\n <input\\n ng-if=\\\"!ctrl.hasMultipleStorageClassesAvailable()\\\"\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n disabled\\n ng-model=\\\"persistedFolder.StorageClass.Name\\\"\\n data-cy=\\\"k8sAppCreate-storageClassNameInput_{{ $index }}\\\"\\n />\\n </div>\\n\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\" ng-if=\\\"!persistedFolder.UseNewVolume\\\" ng-class=\\\"{ striked: persistedFolder.NeedsDeletion }\\\">\\n <span class=\\\"input-group-addon\\\">volume</span>\\n <select\\n class=\\\"form-control\\\"\\n name=\\\"existing_volumes_{{ $index }}\\\"\\n ng-model=\\\"ctrl.formValues.PersistedFolders[$index].ExistingVolume\\\"\\n ng-options=\\\"vol as vol.PersistentVolumeClaim.Name for vol in ctrl.availableVolumes\\\"\\n ng-change=\\\"ctrl.onChangeExistingVolumeSelection()\\\"\\n ng-disabled=\\\"ctrl.isEditAndExistingPersistedFolder($index) || ctrl.formValues.Containers.length > 1\\\"\\n required\\n >\\n <option selected disabled hidden value=\\\"\\\">Select a volume</option>\\n </select>\\n </div>\\n\\n <div class=\\\"input-group col-sm-1 input-group-sm\\\">\\n <div ng-if=\\\"!ctrl.isEditAndStatefulSet() && !ctrl.state.useExistingVolume[$index] && ctrl.formValues.Containers.length <= 1\\\">\\n <button\\n ng-if=\\\"!persistedFolder.NeedsDeletion\\\"\\n class=\\\"btn btn-sm btn-danger\\\"\\n type=\\\"button\\\"\\n ng-click=\\\"ctrl.removePersistedFolder($index)\\\"\\n data-cy=\\\"k8sAppCreate-rmPersistentFolderButton\\\"\\n >\\n <i class=\\\"fa fa-trash-alt\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n <button\\n ng-if=\\\"persistedFolder.NeedsDeletion\\\"\\n class=\\\"btn btn-sm btn-primary\\\"\\n type=\\\"button\\\"\\n ng-click=\\\"ctrl.restorePersistedFolder($index)\\\"\\n data-cy=\\\"k8sAppCreate-restorePersistentButton\\\"\\n >\\n <i class=\\\"fa fa-trash-restore\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n </div>\\n\\n <div\\n ng-show=\\\"\\n kubernetesApplicationCreationForm['persisted_folder_path_' + $index].$invalid ||\\n ctrl.state.duplicates.persistedFolders.refs[$index] !== undefined ||\\n kubernetesApplicationCreationForm['persisted_folder_size_' + $index].$invalid ||\\n kubernetesApplicationCreationForm['existing_volumes_' + $index].$invalid ||\\n ctrl.state.duplicates.existingVolumes.refs[$index] !== undefined\\n \\\"\\n >\\n <div class=\\\"input-group col-sm-3 input-group-sm\\\">\\n <div\\n class=\\\"small text-warning\\\"\\n style=\\\"margin-top: 5px;\\\"\\n ng-show=\\\"\\n kubernetesApplicationCreationForm['persisted_folder_path_' + $index].$invalid || ctrl.state.duplicates.persistedFolders.refs[$index] !== undefined\\n \\\"\\n >\\n <ng-messages for=\\\"kubernetesApplicationCreationForm['persisted_folder_path_' + $index].$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Path is required.</p>\\n </ng-messages>\\n <p ng-if=\\\"ctrl.state.duplicates.persistedFolders.refs[$index] !== undefined\\\"\\n ><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This path is already defined.</p\\n >\\n </div>\\n </div>\\n\\n <div class=\\\"input-group col-sm-2 input-group-sm\\\"></div>\\n\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <div class=\\\"small text-warning\\\" style=\\\"margin-top: 5px;\\\" ng-show=\\\"kubernetesApplicationCreationForm['persisted_folder_size_' + $index].$invalid\\\">\\n <ng-messages for=\\\"kubernetesApplicationCreationForm['persisted_folder_size_' + $index].$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Size is required.</p>\\n <p ng-message=\\\"min\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This value must be greater than zero.</p>\\n </ng-messages>\\n </div>\\n <div\\n class=\\\"small text-warning\\\"\\n ng-show=\\\"kubernetesApplicationCreationForm['existing_volumes_' + $index].$invalid || ctrl.state.duplicates.existingVolumes.refs[$index] !== undefined\\\"\\n >\\n <ng-messages for=\\\"kubernetesApplicationCreationForm['existing_volumes_' + $index].$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Volume is required.</p>\\n </ng-messages>\\n <p ng-if=\\\"ctrl.state.duplicates.existingVolumes.refs[$index] !== undefined\\\"\\n ><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This volume is already used.</p\\n >\\n </div>\\n </div>\\n\\n <div class=\\\"input-group col-sm-1 input-group-sm\\\"> </div>\\n </div>\\n </div>\\n </div>\\n <!-- #endregion -->\\n\\n <!-- #region DATA ACCESS POLICY -->\\n <div ng-if=\\\"ctrl.showDataAccessPolicySection()\\\">\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label class=\\\"control-label text-left\\\">Data access policy</label>\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12 small text-muted\\\">\\n Specify how the data will be used across instances.\\n </div>\\n </div>\\n\\n <!-- access policy options -->\\n <div class=\\\"form-group\\\" style=\\\"margin-bottom: 0;\\\">\\n <div class=\\\"boxselector_wrapper\\\">\\n <div\\n ng-if=\\\"\\n (!ctrl.state.isEdit && !ctrl.state.persistedFoldersUseExistingVolumes) ||\\n (ctrl.state.isEdit && ctrl.formValues.DataAccessPolicy === ctrl.ApplicationDataAccessPolicies.ISOLATED)\\n \\\"\\n >\\n <input\\n type=\\\"radio\\\"\\n id=\\\"data_access_isolated\\\"\\n ng-value=\\\"ctrl.ApplicationDataAccessPolicies.ISOLATED\\\"\\n ng-model=\\\"ctrl.formValues.DataAccessPolicy\\\"\\n ng-change=\\\"ctrl.resetDeploymentType()\\\"\\n />\\n <label for=\\\"data_access_isolated\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-cubes\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Isolated\\n </div>\\n <p>Application will be deployed as a StatefulSet with each instantiating their own data</p>\\n </label>\\n </div>\\n <div\\n style=\\\"color: #767676;\\\"\\n ng-if=\\\"\\n (ctrl.state.isEdit && ctrl.formValues.DataAccessPolicy === ctrl.ApplicationDataAccessPolicies.SHARED) || ctrl.state.persistedFoldersUseExistingVolumes\\n \\\"\\n >\\n <input type=\\\"radio\\\" id=\\\"data_access_isolated\\\" disabled />\\n <label\\n for=\\\"data_access_isolated\\\"\\n tooltip-append-to-body=\\\"true\\\"\\n tooltip-placement=\\\"bottom\\\"\\n tooltip-class=\\\"portainer-tooltip\\\"\\n uib-tooltip=\\\"Changing the data access policy is not allowed\\\"\\n style=\\\"cursor: pointer; border-color: #767676;\\\"\\n >\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-cubes\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Isolated\\n </div>\\n <p>Application will be deployed as a StatefulSet with each instantiating their own data</p>\\n </label>\\n </div>\\n <div ng-if=\\\"!ctrl.state.isEdit || (ctrl.state.isEdit && ctrl.formValues.DataAccessPolicy === ctrl.ApplicationDataAccessPolicies.SHARED)\\\">\\n <input\\n type=\\\"radio\\\"\\n id=\\\"data_access_shared\\\"\\n ng-value=\\\"ctrl.ApplicationDataAccessPolicies.SHARED\\\"\\n ng-model=\\\"ctrl.formValues.DataAccessPolicy\\\"\\n ng-change=\\\"ctrl.resetDeploymentType()\\\"\\n />\\n <label for=\\\"data_access_shared\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-cube\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Shared\\n </div>\\n <p>Application will be deployed as a Deployment with a shared storage access</p>\\n </label>\\n </div>\\n <div style=\\\"color: #767676;\\\" ng-if=\\\"ctrl.state.isEdit && ctrl.formValues.DataAccessPolicy === ctrl.ApplicationDataAccessPolicies.ISOLATED\\\">\\n <input type=\\\"radio\\\" id=\\\"data_access_shared\\\" disabled />\\n <label\\n for=\\\"data_access_shared\\\"\\n tooltip-append-to-body=\\\"true\\\"\\n tooltip-placement=\\\"bottom\\\"\\n tooltip-class=\\\"portainer-tooltip\\\"\\n uib-tooltip=\\\"Changing the data access policy is not allowed\\\"\\n style=\\\"cursor: pointer; border-color: #767676;\\\"\\n >\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-cube\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Shared\\n </div>\\n <p>Application will be deployed as a Deployment with a shared storage access</p>\\n </label>\\n </div>\\n </div>\\n </div>\\n <!-- !access policy options -->\\n </div>\\n <!-- #endregion -->\\n\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Resource reservations\\n </div>\\n <!-- #region RESOURCE RESERVATIONS -->\\n <div class=\\\"form-group\\\" ng-if=\\\"!ctrl.state.resourcePoolHasQuota\\\">\\n <div class=\\\"col-sm-12 small text-muted\\\">\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Resource reservations are applied per instance of the application.\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\" ng-if=\\\"ctrl.state.resourcePoolHasQuota && !ctrl.resourceQuotaCapacityExceeded()\\\">\\n <div class=\\\"col-sm-12 small text-muted\\\">\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n A resource quota is set on this namespace, you must specify resource reservations. Resource reservations are applied per instance of the application. Maximums\\n are inherited from the namespace quota.\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\" ng-if=\\\"ctrl.state.resourcePoolHasQuota && ctrl.resourceQuotaCapacityExceeded()\\\">\\n <div class=\\\"col-sm-12 small text-danger\\\">\\n <i class=\\\"fa fa-exclamation-circle red-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n This namespace has exhausted its resource capacity and you will not be able to deploy the application. Contact your administrator to expand the capacity of the\\n namespace.\\n </div>\\n </div>\\n\\n <!-- memory-limit-input -->\\n <div\\n class=\\\"form-group\\\"\\n ng-if=\\\"(!ctrl.state.resourcePoolHasQuota || (ctrl.state.resourcePoolHasQuota && !ctrl.resourceQuotaCapacityExceeded())) && ctrl.formValues.Containers.length <= 1\\\"\\n >\\n <label for=\\\"memory-limit\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\" style=\\\"margin-top: 20px;\\\">\\n Memory\\n <portainer-tooltip\\n position=\\\"bottom\\\"\\n message=\\\"An instance of this application will reserve this amount of memory. If the instance memory usage exceeds the reservation, it might be subject to OOM.\\\"\\n >\\n </portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-3\\\">\\n <slider model=\\\"ctrl.formValues.MemoryLimit\\\" floor=\\\"ctrl.state.sliders.memory.min\\\" ceil=\\\"ctrl.state.sliders.memory.max\\\" step=\\\"128\\\"></slider>\\n </div>\\n <div class=\\\"col-sm-2\\\">\\n <input\\n name=\\\"memory_limit\\\"\\n ng-model=\\\"ctrl.formValues.MemoryLimit\\\"\\n type=\\\"number\\\"\\n min=\\\"{{ ctrl.state.sliders.memory.min }}\\\"\\n max=\\\"{{ ctrl.state.sliders.memory.max }}\\\"\\n class=\\\"form-control\\\"\\n id=\\\"memory-limit\\\"\\n required\\n data-cy=\\\"k8sAppCreate-memoryLimit\\\"\\n />\\n </div>\\n <div class=\\\"col-sm-4\\\">\\n <p class=\\\"small text-muted\\\" style=\\\"margin-top: 7px;\\\">\\n Maximum memory usage (<b>MB</b>)\\n </p>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"kubernetesApplicationCreationForm.memory_limit.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"kubernetesApplicationCreationForm.memory_limit.$error\\\">\\n <p\\n ><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Value must be between {{ ctrl.state.sliders.memory.min }} and\\n {{ ctrl.state.sliders.memory.max }}\\n </p>\\n </div>\\n </div>\\n </div>\\n <!-- !memory-limit-input -->\\n <!-- cpu-limit-input -->\\n <div\\n class=\\\"form-group\\\"\\n ng-if=\\\"(!ctrl.state.resourcePoolHasQuota || (ctrl.state.resourcePoolHasQuota && !ctrl.resourceQuotaCapacityExceeded())) && ctrl.formValues.Containers.length <= 1\\\"\\n >\\n <label for=\\\"cpu-limit\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\" style=\\\"margin-top: 20px;\\\">\\n CPU\\n <portainer-tooltip\\n position=\\\"bottom\\\"\\n message=\\\"An instance of this application will reserve this amount of CPU. If the instance CPU usage exceeds the reservation, it might be subject to CPU throttling.\\\"\\n >\\n </portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-5\\\">\\n <slider model=\\\"ctrl.formValues.CpuLimit\\\" floor=\\\"ctrl.state.sliders.cpu.min\\\" ceil=\\\"ctrl.state.sliders.cpu.max\\\" step=\\\"0.10\\\" precision=\\\"2\\\"></slider>\\n </div>\\n <div class=\\\"col-sm-4\\\" style=\\\"margin-top: 20px;\\\">\\n <p class=\\\"small text-muted\\\">\\n Maximum CPU usage\\n </p>\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\" ng-if=\\\"ctrl.nodeLimitsOverflow()\\\">\\n <div class=\\\"col-sm-12 small text-danger\\\">\\n <i class=\\\"fa fa-exclamation-circle red-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n These reservations would exceed the resources currently available in the cluster.\\n </div>\\n </div>\\n <!-- !cpu-limit-input -->\\n <!-- #endregion -->\\n\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Deployment\\n </div>\\n <!-- #region DEPLOYMENT -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12 small text-muted\\\">\\n Select how you want to deploy your application inside the cluster.\\n </div>\\n </div>\\n\\n <!-- deployment options -->\\n <div class=\\\"form-group\\\" style=\\\"margin-bottom: 0;\\\">\\n <div class=\\\"boxselector_wrapper\\\">\\n <div>\\n <input\\n type=\\\"radio\\\"\\n id=\\\"deployment_replicated\\\"\\n ng-value=\\\"ctrl.ApplicationDeploymentTypes.REPLICATED\\\"\\n ng-model=\\\"ctrl.formValues.DeploymentType\\\"\\n data-cy=\\\"k8sAppCreate-replicatedDeploymentButton\\\"\\n />\\n <label for=\\\"deployment_replicated\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-cube\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Replicated\\n </div>\\n <p>Run one or multiple instances of this container</p>\\n </label>\\n </div>\\n <div style=\\\"color: #767676;\\\" ng-if=\\\"!ctrl.supportGlobalDeployment()\\\">\\n <input type=\\\"radio\\\" id=\\\"deployment_global\\\" disabled />\\n <label\\n for=\\\"deployment_global\\\"\\n tooltip-append-to-body=\\\"true\\\"\\n tooltip-placement=\\\"bottom\\\"\\n tooltip-class=\\\"portainer-tooltip\\\"\\n uib-tooltip=\\\"The storage or access policy used for persisted folders cannot be used with this option\\\"\\n style=\\\"cursor: pointer; border-color: #767676;\\\"\\n >\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-cubes\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Global\\n </div>\\n <p>Application will be deployed as a DaemonSet with an instance on each node of the cluster</p>\\n </label>\\n </div>\\n <div ng-if=\\\"ctrl.supportGlobalDeployment()\\\">\\n <input\\n type=\\\"radio\\\"\\n id=\\\"deployment_global\\\"\\n ng-value=\\\"ctrl.ApplicationDeploymentTypes.GLOBAL\\\"\\n ng-model=\\\"ctrl.formValues.DeploymentType\\\"\\n ng-click=\\\"ctrl.unselectAutoScaler()\\\"\\n data-cy=\\\"k8sAppCreate-globalDeployButton\\\"\\n />\\n <label for=\\\"deployment_global\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-cubes\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Global\\n </div>\\n <p>Application will be deployed as a DaemonSet with an instance on each node of the cluster</p>\\n </label>\\n </div>\\n </div>\\n </div>\\n <!-- !deployment options -->\\n\\n <!-- replica count -->\\n <div class=\\\"form-group form-inline\\\" ng-if=\\\"ctrl.formValues.DeploymentType === ctrl.ApplicationDeploymentTypes.REPLICATED\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label class=\\\"control-label text-left\\\">\\n Instance count\\n </label>\\n <input\\n type=\\\"number\\\"\\n name=\\\"replica_count\\\"\\n class=\\\"form-control\\\"\\n min=\\\"1\\\"\\n max=\\\"9999\\\"\\n placeholder=\\\"1\\\"\\n style=\\\"margin-left: 20px;\\\"\\n ng-model=\\\"ctrl.formValues.ReplicaCount\\\"\\n ng-disabled=\\\"!ctrl.supportScalableReplicaDeployment()\\\"\\n ng-change=\\\"ctrl.enforceReplicaCountMinimum()\\\"\\n required\\n data-cy=\\\"k8sAppCreate-replicaCountInput\\\"\\n />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-if=\\\"kubernetesApplicationCreationForm['replica_count'].$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <ng-messages for=\\\"kubernetesApplicationCreationForm['replica_count'].$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Instance count is required.</p>\\n <p ng-message=\\\"min\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Instance count must be greater than 0.</p>\\n </ng-messages>\\n </div>\\n </div>\\n <!-- !replica count -->\\n\\n <div\\n class=\\\"form-group\\\"\\n ng-if=\\\"!ctrl.resourceReservationsOverflow() && ctrl.formValues.ReplicaCount > 1 && (ctrl.formValues.CpuLimit !== 0 || ctrl.formValues.MemoryLimit !== 0)\\\"\\n >\\n <div class=\\\"col-sm-12 small text-muted\\\">\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n This application will reserve the following resources:\\n <b>{{ ctrl.formValues.CpuLimit * ctrl.formValues.ReplicaCount | kubernetesApplicationCPUValue }} CPU</b> and\\n <b>{{ ctrl.formValues.MemoryLimit * ctrl.formValues.ReplicaCount }} MB</b> of memory.\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\" ng-if=\\\"ctrl.resourceReservationsOverflow()\\\">\\n <div class=\\\"col-sm-12 small text-danger\\\">\\n <i class=\\\"fa fa-exclamation-circle red-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n This application would exceed available resources. Please review resource reservations or the instance count.\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\" ng-if=\\\"!ctrl.supportScalableReplicaDeployment()\\\">\\n <div class=\\\"col-sm-12 small text-muted\\\">\\n <i class=\\\"fa fa-exclamation-circle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n The following storage option(s) do not support concurrent access from multiples instances: <code>{{ ctrl.getNonScalableStorage() }}</code\\n >. You will not be able to scale that application.\\n </div>\\n </div>\\n <!-- #endregion -->\\n\\n <!-- #region AUTO SCALING -->\\n <div class=\\\"col-sm-12 form-section-title\\\" ng-if=\\\"ctrl.formValues.DeploymentType !== ctrl.ApplicationDeploymentTypes.GLOBAL\\\">\\n Auto-scaling\\n </div>\\n\\n <div class=\\\"form-group\\\" ng-if=\\\"ctrl.formValues.DeploymentType !== ctrl.ApplicationDeploymentTypes.GLOBAL && ctrl.state.useServerMetrics\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label for=\\\"enable_auto_scaling\\\" class=\\\"control-label text-left\\\">\\n Enable auto scaling for this application\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\">\\n <input\\n type=\\\"checkbox\\\"\\n class=\\\"form-control\\\"\\n name=\\\"enable_auto_scaling\\\"\\n ng-model=\\\"ctrl.formValues.AutoScaler.IsUsed\\\"\\n data-cy=\\\"k8sAppCreate-autoScaleCheckbox\\\"\\n />\\n <i></i>\\n </label>\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\" ng-if=\\\"ctrl.formValues.DeploymentType !== ctrl.ApplicationDeploymentTypes.GLOBAL && !ctrl.state.useServerMetrics\\\">\\n <div class=\\\"col-sm-12 small text-muted\\\">\\n <p ng-if=\\\"!ctrl.isAdmin\\\">\\n This feature is currently disabled and must be enabled by an administrator user.\\n </p>\\n <p ng-if=\\\"ctrl.isAdmin\\\">\\n Server metrics features must be enabled in the\\n <a ui-sref=\\\"portainer.k8sendpoint.kubernetesConfig({id: ctrl.endpoint.Id})\\\" class=\\\"ctrl.isAdmin\\\">environment configuration view</a>.\\n </p>\\n </div>\\n </div>\\n\\n <div class=\\\"form-inline\\\" ng-if=\\\"ctrl.formValues.DeploymentType !== ctrl.ApplicationDeploymentTypes.GLOBAL && ctrl.formValues.AutoScaler.IsUsed\\\">\\n <table class=\\\"table\\\" style=\\\"margin-bottom: 0px;\\\">\\n <tbody>\\n <tr class=\\\"small\\\">\\n <td style=\\\"width: 33%; border: none; padding: 2px 0 2px 0;\\\">Minimum instances</td>\\n <td style=\\\"width: 33%; border: none; padding: 2px 0 2px 0;\\\">Maximum instances</td>\\n <td style=\\\"width: 33%; border: none; padding: 2px 0 2px 0;\\\">\\n Target CPU usage (<b>%</b>)\\n <portainer-tooltip\\n position=\\\"bottom\\\"\\n message=\\\"The autoscaler will ensure enough instances are running to maintain an average CPU usage across all instances.\\\"\\n >\\n </portainer-tooltip>\\n </td>\\n </tr>\\n <tr>\\n <td style=\\\"padding: 8px 5px 5px 0; border: none;\\\">\\n <div class=\\\"input-group input-group-sm\\\" style=\\\"width: 100%;\\\">\\n <input\\n type=\\\"number\\\"\\n class=\\\"form-control\\\"\\n name=\\\"auto_scaler_min\\\"\\n min=\\\"0\\\"\\n ng-max=\\\"ctrl.formValues.AutoScaler.MaxReplicas\\\"\\n ng-model=\\\"ctrl.formValues.AutoScaler.MinReplicas\\\"\\n data-cy=\\\"k8sAppCreate-autoScaleMin\\\"\\n required\\n />\\n </div>\\n <div class=\\\"input-group input-group-sm\\\" ng-show=\\\"kubernetesApplicationCreationForm['auto_scaler_min'].$invalid\\\">\\n <div class=\\\"small text-warning\\\" style=\\\"margin-top: 5px;\\\">\\n <ng-messages for=\\\"kubernetesApplicationCreationForm['auto_scaler_min'].$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Minimum instances is required.</p>\\n <p ng-message=\\\"min\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Minimum instances must be greater than 0.</p>\\n <p ng-message=\\\"max\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Minimum instances must be smaller than maximum instances.</p>\\n </ng-messages>\\n </div>\\n </div>\\n </td>\\n <td style=\\\"padding: 8px 5px 5px 0; border: none;\\\">\\n <div class=\\\"input-group input-group-sm\\\" style=\\\"width: 100%;\\\">\\n <input\\n type=\\\"number\\\"\\n class=\\\"form-control\\\"\\n name=\\\"auto_scaler_max\\\"\\n ng-min=\\\"ctrl.formValues.AutoScaler.MinReplicas\\\"\\n ng-model=\\\"ctrl.formValues.AutoScaler.MaxReplicas\\\"\\n />\\n </div>\\n <div class=\\\"input-group input-group-sm\\\" ng-show=\\\"kubernetesApplicationCreationForm['auto_scaler_max'].$invalid || ctrl.autoScalerOverflow()\\\">\\n <div class=\\\"small text-warning\\\" style=\\\"margin-top: 5px;\\\">\\n <ng-messages for=\\\"kubernetesApplicationCreationForm['auto_scaler_max'].$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Maximum instances is required.</p>\\n <p ng-message=\\\"min\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Maximum instances must be greater than minimum instances.</p>\\n </ng-messages>\\n </div>\\n </div>\\n </td>\\n <td style=\\\"padding: 8px 5px 5px 0; border: none;\\\">\\n <div class=\\\"input-group input-group-sm\\\" style=\\\"width: 100%;\\\">\\n <input\\n type=\\\"number\\\"\\n class=\\\"form-control\\\"\\n name=\\\"auto_scaler_cpu\\\"\\n ng-model=\\\"ctrl.formValues.AutoScaler.TargetCPUUtilization\\\"\\n min=\\\"1\\\"\\n max=\\\"100\\\"\\n required\\n data-cy=\\\"k8sAppCreate-targetCPUInput\\\"\\n />\\n </div>\\n <div class=\\\"input-group input-group-sm\\\" ng-show=\\\"kubernetesApplicationCreationForm['auto_scaler_cpu'].$invalid\\\">\\n <div class=\\\"small text-warning\\\" style=\\\"margin-top: 5px;\\\">\\n <ng-messages for=\\\"kubernetesApplicationCreationForm['auto_scaler_cpu'].$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Target CPU usage is required.</p>\\n <p ng-message=\\\"min\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Target CPU usage must be greater than 0.</p>\\n <p ng-message=\\\"max\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Target CPU usage must be smaller than 100.</p>\\n </ng-messages>\\n </div>\\n </div>\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n\\n <div class=\\\"form-group\\\" ng-if=\\\"ctrl.autoScalerOverflow()\\\" style=\\\"margin-bottom: 10px;\\\">\\n <div class=\\\"col-sm-12 small text-danger\\\">\\n <i class=\\\"fa fa-exclamation-circle red-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n This application would exceed available resources. Please review resource reservations or the maximum instance count of the auto-scaling policy.\\n </div>\\n </div>\\n </div>\\n <!-- #endregion -->\\n\\n <div ng-if=\\\"ctrl.formValues.DeploymentType === ctrl.ApplicationDeploymentTypes.REPLICATED\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Placement preferences and constraints\\n </div>\\n\\n <!-- #region PLACEMENTS -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label class=\\\"control-label text-left\\\">Placement rules</label>\\n <span class=\\\"label label-default interactive\\\" style=\\\"margin-left: 10px;\\\" ng-click=\\\"ctrl.addPlacement()\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add rule\\n </span>\\n </div>\\n\\n <div class=\\\"col-sm-12 small text-muted\\\" ng-if=\\\"ctrl.formValues.Placements.length > 0\\\" style=\\\"margin-top: 10px;\\\">\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Deploy this application on nodes that respect <b>ALL</b> of the following placement rules. Placement rules are based on node labels.\\n </div>\\n\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\">\\n <div ng-repeat-start=\\\"placement in ctrl.formValues.Placements\\\" style=\\\"margin-top: 2px;\\\">\\n <div class=\\\"col-sm-5 input-group\\\" ng-class=\\\"{ striked: placement.NeedsDeletion }\\\">\\n <select\\n class=\\\"form-control\\\"\\n ng-model=\\\"placement.Label\\\"\\n ng-options=\\\"label as (label.Key | kubernetesNodeLabelHumanReadbleText) for label in ctrl.nodesLabels\\\"\\n ng-change=\\\"ctrl.onChangePlacementLabel($index)\\\"\\n ng-disabled=\\\"ctrl.isEditAndNotNewPlacement($index)\\\"\\n data-cy=\\\"k8sAppCreate-placementLabel_{{ $index }}\\\"\\n >\\n </select>\\n </div>\\n <div class=\\\"col-sm-5 input-group\\\" ng-class=\\\"{ striked: placement.NeedsDeletion }\\\">\\n <select\\n class=\\\"form-control\\\"\\n ng-model=\\\"placement.Value\\\"\\n ng-options=\\\"value for value in placement.Label.Values\\\"\\n ng-disabled=\\\"ctrl.isEditAndNotNewPlacement($index)\\\"\\n data-cy=\\\"k8sAppCreate-placementName_{{ $index }}\\\"\\n >\\n </select>\\n </div>\\n\\n <div class=\\\"col-sm-1 input-group\\\">\\n <button\\n ng-if=\\\"!placement.NeedsDeletion\\\"\\n class=\\\"btn btn-sm btn-danger\\\"\\n type=\\\"button\\\"\\n ng-click=\\\"ctrl.removePlacement($index)\\\"\\n data-cy=\\\"k8sAppCreate-deletePlacementButton\\\"\\n >\\n <i class=\\\"fa fa-trash-alt\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n <button\\n ng-if=\\\"placement.NeedsDeletion\\\"\\n class=\\\"btn btn-sm btn-primary\\\"\\n type=\\\"button\\\"\\n ng-click=\\\"ctrl.restorePlacement($index)\\\"\\n data-cy=\\\"k8sAppCreate-restorePlacementButton\\\"\\n >\\n <i class=\\\"fa fa-trash-restore\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n <div ng-repeat-end ng-show=\\\"ctrl.state.duplicates.placements.refs[$index] !== undefined\\\">\\n <div class=\\\"col-sm-5 input-group\\\">\\n <div class=\\\"small text-warning\\\" style=\\\"margin-top: 5px;\\\" ng-if=\\\"ctrl.state.duplicates.placements.refs[$index] !== undefined\\\">\\n <p ng-if=\\\"ctrl.state.duplicates.placements.refs[$index] !== undefined\\\">\\n <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This label is already defined.\\n </p>\\n </div>\\n </div>\\n </div>\\n </div>\\n </div>\\n <div ng-if=\\\"ctrl.showPlacementPolicySection()\\\">\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label class=\\\"control-label text-left\\\">Placement policy</label>\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12 small text-muted\\\">\\n Specify the policy associated to the placement rules.\\n </div>\\n </div>\\n\\n <!-- placement policy options -->\\n <div class=\\\"form-group\\\" style=\\\"margin-bottom: 0;\\\" ng-if=\\\"ctrl.formValues.Placements.length\\\">\\n <div class=\\\"boxselector_wrapper\\\">\\n <div>\\n <input\\n type=\\\"radio\\\"\\n id=\\\"placement_hard\\\"\\n ng-value=\\\"ctrl.ApplicationPlacementTypes.MANDATORY\\\"\\n ng-model=\\\"ctrl.formValues.PlacementType\\\"\\n data-cy=\\\"k8sAppCreate-mandatoryPlacementButton\\\"\\n />\\n <label for=\\\"placement_hard\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-tasks\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Mandatory\\n </div>\\n <p>Schedule this application <b>ONLY</b> on nodes that match <b>ALL</b> Rules</p>\\n </label>\\n </div>\\n <div>\\n <input\\n type=\\\"radio\\\"\\n id=\\\"placement_soft\\\"\\n ng-value=\\\"ctrl.ApplicationPlacementTypes.PREFERRED\\\"\\n ng-model=\\\"ctrl.formValues.PlacementType\\\"\\n data-cy=\\\"k8sAppCreate-prefferedPlacementButton\\\"\\n />\\n <label for=\\\"placement_soft\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-list\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Preferred\\n </div>\\n <p>Schedule this application on nodes that match the rules if possible</p>\\n </label>\\n </div>\\n </div>\\n </div>\\n <!-- !placement policy options -->\\n </div>\\n <!-- #endregion -->\\n </div>\\n\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Publishing the application\\n </div>\\n <!-- #region PUBLISHING OPTIONS -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label for=\\\"enable_port_publishing\\\" class=\\\"control-label text-left\\\">\\n Enable publishing for this application\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\">\\n <input\\n type=\\\"checkbox\\\"\\n class=\\\"form-control\\\"\\n name=\\\"enable_port_publishing\\\"\\n ng-model=\\\"ctrl.formValues.IsPublishingService\\\"\\n ng-change=\\\"ctrl.onServicePublishChange()\\\"\\n />\\n <i></i>\\n </label>\\n </div>\\n </div>\\n\\n <span ng-if=\\\"ctrl.formValues.IsPublishingService\\\">\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12 small text-muted\\\">\\n Select how you want to publish your application.\\n </div>\\n </div>\\n\\n <!-- publishing options -->\\n <div class=\\\"form-group\\\" style=\\\"margin-bottom: 0;\\\">\\n <div class=\\\"boxselector_wrapper\\\">\\n <div ng-style=\\\"{ color: ctrl.isPublishingTypeEditDisabled() ? '#767676' : '' }\\\">\\n <input\\n type=\\\"radio\\\"\\n id=\\\"publishing_internal\\\"\\n ng-value=\\\"ctrl.ApplicationPublishingTypes.CLUSTER_IP\\\"\\n ng-model=\\\"ctrl.formValues.PublishingType\\\"\\n ng-change=\\\"ctrl.onChangePublishedPorts()\\\"\\n ng-disabled=\\\"ctrl.isPublishingTypeEditDisabled()\\\"\\n data-cy=\\\"k8sAppCreate-internalPublishButton\\\"\\n />\\n <label\\n for=\\\"publishing_internal\\\"\\n ng-if=\\\"\\n !ctrl.isPublishingTypeEditDisabled() ||\\n (ctrl.isPublishingTypeEditDisabled() && ctrl.formValues.PublishingType === ctrl.ApplicationPublishingTypes.CLUSTER_IP)\\n \\\"\\n >\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-list-alt\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n ClusterIP\\n </div>\\n <p>Internal communications inside the cluster only</p>\\n </label>\\n <label\\n for=\\\"publishing_internal\\\"\\n ng-if=\\\"ctrl.isPublishingTypeEditDisabled() && ctrl.formValues.PublishingType !== ctrl.ApplicationPublishingTypes.CLUSTER_IP\\\"\\n tooltip-append-to-body=\\\"true\\\"\\n tooltip-placement=\\\"bottom\\\"\\n tooltip-class=\\\"portainer-tooltip\\\"\\n uib-tooltip=\\\"Changing the publishing mode is not allowed until you delete all previously existing ports\\\"\\n style=\\\"cursor: pointer; border-color: #767676;\\\"\\n >\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-list-alt\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n ClusterIP\\n </div>\\n <p>Internal communications inside the cluster only</p>\\n </label>\\n </div>\\n\\n <div ng-style=\\\"{ color: ctrl.isPublishingTypeEditDisabled() ? '#767676' : '' }\\\">\\n <input\\n type=\\\"radio\\\"\\n id=\\\"publishing_cluster\\\"\\n ng-value=\\\"ctrl.ApplicationPublishingTypes.NODE_PORT\\\"\\n ng-model=\\\"ctrl.formValues.PublishingType\\\"\\n ng-change=\\\"ctrl.onChangePublishedPorts()\\\"\\n ng-disabled=\\\"ctrl.isPublishingTypeEditDisabled()\\\"\\n data-cy=\\\"k8sAppCreate-clusterPublishButton\\\"\\n />\\n <label\\n for=\\\"publishing_cluster\\\"\\n ng-if=\\\"\\n !ctrl.isPublishingTypeEditDisabled() ||\\n (ctrl.isPublishingTypeEditDisabled() && ctrl.formValues.PublishingType === ctrl.ApplicationPublishingTypes.NODE_PORT)\\n \\\"\\n >\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-list\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n NodePort\\n </div>\\n <p>Publish this application via a port on all nodes of the cluster</p>\\n </label>\\n <label\\n for=\\\"publishing_cluster\\\"\\n ng-if=\\\"ctrl.isPublishingTypeEditDisabled() && ctrl.formValues.PublishingType !== ctrl.ApplicationPublishingTypes.NODE_PORT\\\"\\n tooltip-append-to-body=\\\"true\\\"\\n tooltip-placement=\\\"bottom\\\"\\n tooltip-class=\\\"portainer-tooltip\\\"\\n uib-tooltip=\\\"Changing the publishing mode is not allowed until you delete all previously existing ports\\\"\\n style=\\\"cursor: pointer; border-color: #767676;\\\"\\n >\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-list\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n NodePort\\n </div>\\n <p>Publish this application via a port on all nodes of the cluster</p>\\n </label>\\n </div>\\n <div ng-if=\\\"ctrl.publishViaIngressEnabled()\\\" ng-style=\\\"{ color: ctrl.isPublishingTypeEditDisabled() ? '#767676' : '' }\\\">\\n <input\\n type=\\\"radio\\\"\\n id=\\\"publishing_ingress\\\"\\n ng-value=\\\"ctrl.ApplicationPublishingTypes.INGRESS\\\"\\n ng-model=\\\"ctrl.formValues.PublishingType\\\"\\n ng-change=\\\"ctrl.onChangePublishedPorts()\\\"\\n ng-disabled=\\\"ctrl.isPublishingTypeEditDisabled()\\\"\\n data-cy=\\\"k8sAppCreate-ingressPublishButton\\\"\\n />\\n <label\\n for=\\\"publishing_ingress\\\"\\n ng-if=\\\"\\n !ctrl.isPublishingTypeEditDisabled() ||\\n (ctrl.isPublishingTypeEditDisabled() && ctrl.formValues.PublishingType === ctrl.ApplicationPublishingTypes.INGRESS)\\n \\\"\\n >\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-route\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Ingress\\n </div>\\n <p>Publish this application via a HTTP route</p>\\n </label>\\n <label\\n for=\\\"publishing_ingress\\\"\\n ng-if=\\\"ctrl.isPublishingTypeEditDisabled() && ctrl.formValues.PublishingType !== ctrl.ApplicationPublishingTypes.INGRESS\\\"\\n tooltip-append-to-body=\\\"true\\\"\\n tooltip-placement=\\\"bottom\\\"\\n tooltip-class=\\\"portainer-tooltip\\\"\\n uib-tooltip=\\\"Changing the publishing mode is not allowed until you delete all previously existing ports\\\"\\n style=\\\"cursor: pointer; border-color: #767676;\\\"\\n >\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-route\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Ingress\\n </div>\\n <p>Publish this application via a HTTP route</p>\\n </label>\\n </div>\\n <div ng-if=\\\"ctrl.publishViaLoadBalancerEnabled()\\\" ng-style=\\\"{ color: ctrl.isPublishingTypeEditDisabled() ? '#767676' : '' }\\\">\\n <input\\n type=\\\"radio\\\"\\n id=\\\"publishing_loadbalancer\\\"\\n ng-value=\\\"ctrl.ApplicationPublishingTypes.LOAD_BALANCER\\\"\\n ng-model=\\\"ctrl.formValues.PublishingType\\\"\\n ng-change=\\\"ctrl.onChangePublishedPorts()\\\"\\n ng-disabled=\\\"ctrl.isPublishingTypeEditDisabled()\\\"\\n data-cy=\\\"k8sAppCreate-lbPublichButton\\\"\\n />\\n <label\\n for=\\\"publishing_loadbalancer\\\"\\n ng-if=\\\"\\n !ctrl.isPublishingTypeEditDisabled() ||\\n (ctrl.isPublishingTypeEditDisabled() && ctrl.formValues.PublishingType === ctrl.ApplicationPublishingTypes.LOAD_BALANCER)\\n \\\"\\n >\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-project-diagram\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Load balancer\\n </div>\\n <p>Publish this application via a load balancer</p>\\n </label>\\n <label\\n for=\\\"publishing_loadbalancer\\\"\\n ng-if=\\\"ctrl.isPublishingTypeEditDisabled() && ctrl.formValues.PublishingType !== ctrl.ApplicationPublishingTypes.LOAD_BALANCER\\\"\\n tooltip-append-to-body=\\\"true\\\"\\n tooltip-placement=\\\"bottom\\\"\\n tooltip-class=\\\"portainer-tooltip\\\"\\n uib-tooltip=\\\"Changing the publishing mode is not allowed until you delete all previously existing ports\\\"\\n style=\\\"cursor: pointer; border-color: #767676;\\\"\\n >\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-project-diagram\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Load balancer\\n </div>\\n <p>Publish this application via a load balancer</p>\\n </label>\\n </div>\\n </div>\\n </div>\\n <!-- #endregion -->\\n\\n <!-- #region PUBLISHED PORTS -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 5px;\\\">\\n <label class=\\\"control-label text-left\\\">Published ports</label>\\n <span class=\\\"label label-default interactive\\\" style=\\\"margin-left: 10px;\\\" ng-click=\\\"ctrl.addPublishedPort()\\\" data-cy=\\\"k8sAppCreate-addNewPortButton\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> publish a new port\\n </span>\\n </div>\\n\\n <div\\n class=\\\"col-sm-12 small text-muted\\\"\\n style=\\\"margin-top: 15px;\\\"\\n ng-if=\\\"ctrl.formValues.PublishingType === ctrl.ApplicationPublishingTypes.NODE_PORT && ctrl.formValues.PublishedPorts.length > 0\\\"\\n >\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n When publishing a port in cluster mode, the node port is optional. If left empty Kubernetes will use a random port number. If you wish to specify a port, use\\n a port number inside the default range <code>30000-32767</code>.\\n </div>\\n <div ng-if=\\\"ctrl.hasNoPublishedPorts()\\\" class=\\\"col-sm-12 small text-warning\\\" style=\\\"margin-top: 12px;\\\">\\n <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> At least one published port must be defined.\\n </div>\\n\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\">\\n <!-- #region INPUTS -->\\n <div\\n ng-repeat-start=\\\"publishedPort in ctrl.formValues.PublishedPorts\\\"\\n style=\\\"margin-top: 2px;\\\"\\n tooltip-append-to-body=\\\"true\\\"\\n tooltip-placement=\\\"bottom\\\"\\n tooltip-class=\\\"portainer-tooltip\\\"\\n tooltip-enable=\\\"ctrl.disableLoadBalancerEdit()\\\"\\n uib-tooltip=\\\"Edition is not allowed while the Load Balancer is in 'Pending' state\\\"\\n >\\n <div\\n class=\\\"input-group input-group-sm\\\"\\n ng-class=\\\"{\\n striked: publishedPort.NeedsDeletion,\\n 'col-sm-2': ctrl.formValues.PublishingType === ctrl.ApplicationPublishingTypes.INGRESS,\\n 'col-sm-3': ctrl.formValues.PublishingType !== ctrl.ApplicationPublishingTypes.INGRESS\\n }\\\"\\n >\\n <span class=\\\"input-group-addon\\\">container port</span>\\n <input\\n type=\\\"number\\\"\\n class=\\\"form-control\\\"\\n name=\\\"container_port_{{ $index }}\\\"\\n ng-model=\\\"publishedPort.ContainerPort\\\"\\n placeholder=\\\"80\\\"\\n ng-min=\\\"1\\\"\\n ng-max=\\\"65535\\\"\\n ng-required=\\\"!publishedPort.NeedsDeletion\\\"\\n ng-change=\\\"ctrl.onChangePortMappingContainerPort()\\\"\\n ng-disabled=\\\"ctrl.disableLoadBalancerEdit() || ctrl.isEditAndNotNewPublishedPort($index)\\\"\\n data-cy=\\\"k8sAppCreate-containerPort_{{ $index }}\\\"\\n />\\n </div>\\n\\n <div\\n class=\\\"col-sm-3 input-group input-group-sm\\\"\\n ng-class=\\\"{ striked: publishedPort.NeedsDeletion }\\\"\\n ng-if=\\\"\\n (publishedPort.IsNew && ctrl.formValues.PublishingType === ctrl.ApplicationPublishingTypes.NODE_PORT) ||\\n (!publishedPort.IsNew && ctrl.savedFormValues.PublishingType === ctrl.ApplicationPublishingTypes.NODE_PORT)\\n \\\"\\n >\\n <span class=\\\"input-group-addon\\\">node port</span>\\n <input\\n name=\\\"published_node_port_{{ $index }}\\\"\\n type=\\\"number\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"publishedPort.NodePort\\\"\\n placeholder=\\\"30080\\\"\\n ng-min=\\\"30000\\\"\\n ng-max=\\\"32767\\\"\\n ng-change=\\\"ctrl.onChangePortMappingNodePort()\\\"\\n ng-disabled=\\\"ctrl.disableLoadBalancerEdit() || ctrl.isEditAndNotNewPublishedPort($index)\\\"\\n data-cy=\\\"k8sAppCreate-nodePort_{{ $index }}\\\"\\n />\\n </div>\\n\\n <div\\n class=\\\"col-sm-3 input-group input-group-sm\\\"\\n ng-class=\\\"{ striked: publishedPort.NeedsDeletion }\\\"\\n ng-if=\\\"\\n (publishedPort.IsNew && ctrl.formValues.PublishingType === ctrl.ApplicationPublishingTypes.LOAD_BALANCER) ||\\n (!publishedPort.IsNew && ctrl.savedFormValues.PublishingType === ctrl.ApplicationPublishingTypes.LOAD_BALANCER)\\n \\\"\\n >\\n <span class=\\\"input-group-addon\\\">load balancer port</span>\\n <input\\n type=\\\"number\\\"\\n class=\\\"form-control\\\"\\n name=\\\"load_balancer_port_{{ $index }}\\\"\\n ng-model=\\\"publishedPort.LoadBalancerPort\\\"\\n placeholder=\\\"80\\\"\\n value=\\\"8080\\\"\\n ng-min=\\\"1\\\"\\n ng-max=\\\"65535\\\"\\n ng-required=\\\"!publishedPort.NeedsDeletion\\\"\\n ng-change=\\\"ctrl.onChangePortMappingLoadBalancer()\\\"\\n ng-disabled=\\\"ctrl.disableLoadBalancerEdit() || ctrl.isEditAndNotNewPublishedPort($index)\\\"\\n data-cy=\\\"k8sAppCreate-lbPortInput_{{ $index }}\\\"\\n />\\n </div>\\n\\n <div\\n class=\\\"col-sm-2 input-group input-group-sm\\\"\\n ng-class=\\\"{ striked: publishedPort.NeedsDeletion }\\\"\\n ng-if=\\\"\\n (publishedPort.IsNew && ctrl.formValues.PublishingType === ctrl.ApplicationPublishingTypes.INGRESS) ||\\n (!publishedPort.IsNew && ctrl.savedFormValues.PublishingType === ctrl.ApplicationPublishingTypes.INGRESS)\\n \\\"\\n >\\n <span class=\\\"input-group-addon\\\">ingress</span>\\n <select\\n class=\\\"form-control\\\"\\n name=\\\"ingress_class_{{ $index }}\\\"\\n ng-model=\\\"publishedPort.IngressName\\\"\\n ng-options=\\\"ingress.Name as ingress.Name for ingress in ctrl.ingresses\\\"\\n ng-required=\\\"!publishedPort.NeedsDeletion\\\"\\n ng-change=\\\"ctrl.onChangePortMappingIngress($index)\\\"\\n ng-disabled=\\\"ctrl.disableLoadBalancerEdit() || ctrl.isEditAndNotNewPublishedPort($index)\\\"\\n data-cy=\\\"k8sAppCreate-ingressSelect_{{ $index }}\\\"\\n >\\n <option selected disabled hidden value=\\\"\\\">Select an ingress</option>\\n </select>\\n </div>\\n\\n <div\\n class=\\\"col-sm-2 input-group input-group-sm\\\"\\n ng-class=\\\"{ striked: publishedPort.NeedsDeletion }\\\"\\n ng-if=\\\"\\n (publishedPort.IsNew && ctrl.formValues.PublishingType === ctrl.ApplicationPublishingTypes.INGRESS) ||\\n (!publishedPort.IsNew && ctrl.savedFormValues.PublishingType === ctrl.ApplicationPublishingTypes.INGRESS)\\n \\\"\\n >\\n <span class=\\\"input-group-addon\\\">hostname</span>\\n <select\\n class=\\\"form-control\\\"\\n name=\\\"ingress_hostname_{{ $index }}\\\"\\n ng-model=\\\"publishedPort.IngressHost\\\"\\n ng-options=\\\"host as (host | kubernetesApplicationIngressEmptyHostname) for host in publishedPort.IngressHosts\\\"\\n ng-change=\\\"ctrl.onChangePublishedPorts()\\\"\\n ng-disabled=\\\"ctrl.disableLoadBalancerEdit() || ctrl.isEditAndNotNewPublishedPort($index)\\\"\\n data-cy=\\\"k8sAppCreate-hostnameSelect_{{ $index }}\\\"\\n >\\n <option selected disabled hidden value=\\\"\\\">Select a hostname</option>\\n </select>\\n </div>\\n\\n <div\\n class=\\\"col-sm-2 input-group input-group-sm\\\"\\n ng-class=\\\"{ striked: publishedPort.NeedsDeletion }\\\"\\n ng-if=\\\"\\n (publishedPort.IsNew && ctrl.formValues.PublishingType === ctrl.ApplicationPublishingTypes.INGRESS) ||\\n (!publishedPort.IsNew && ctrl.savedFormValues.PublishingType === ctrl.ApplicationPublishingTypes.INGRESS)\\n \\\"\\n >\\n <span class=\\\"input-group-addon\\\">route</span>\\n <input\\n class=\\\"form-control\\\"\\n name=\\\"ingress_route_{{ $index }}\\\"\\n ng-model=\\\"publishedPort.IngressRoute\\\"\\n placeholder=\\\"route\\\"\\n ng-required=\\\"!publishedPort.NeedsDeletion\\\"\\n ng-change=\\\"ctrl.onChangePortMappingIngressRoute()\\\"\\n ng-pattern=\\\"/^(\\\\/?[a-zA-Z0-9]+([a-zA-Z0-9-/_]*[a-zA-Z0-9])?|[a-zA-Z0-9]+)|(\\\\/){1}$/\\\"\\n ng-disabled=\\\"ctrl.disableLoadBalancerEdit() || ctrl.isEditAndNotNewPublishedPort($index)\\\"\\n data-cy=\\\"k8sAppCreate-ingressRoute_{{ $index }}\\\"\\n />\\n </div>\\n\\n <div class=\\\"input-group col-sm-2 input-group-sm\\\">\\n <div class=\\\"btn-group btn-group-sm\\\" ng-class=\\\"{ striked: publishedPort.NeedsDeletion }\\\">\\n <label\\n class=\\\"btn btn-primary\\\"\\n ng-model=\\\"publishedPort.Protocol\\\"\\n uib-btn-radio=\\\"'TCP'\\\"\\n ng-change=\\\"ctrl.onChangePortProtocol($index)\\\"\\n ng-disabled=\\\"ctrl.isProtocolOptionDisabled($index, 'TCP')\\\"\\n data-cy=\\\"k8sAppCreate-TCPButton_{{ $index }}\\\"\\n >TCP</label\\n >\\n <label\\n class=\\\"btn btn-primary\\\"\\n ng-model=\\\"publishedPort.Protocol\\\"\\n uib-btn-radio=\\\"'UDP'\\\"\\n ng-change=\\\"ctrl.onChangePortProtocol($index)\\\"\\n ng-disabled=\\\"ctrl.isProtocolOptionDisabled($index, 'UDP')\\\"\\n data-cy=\\\"k8sAppCreate-UDPButton_{{ $index }}\\\"\\n >UDP</label\\n >\\n </div>\\n <button\\n ng-if=\\\"!ctrl.disableLoadBalancerEdit() && !publishedPort.NeedsDeletion\\\"\\n class=\\\"btn btn-sm btn-danger\\\"\\n type=\\\"button\\\"\\n ng-click=\\\"ctrl.removePublishedPort($index)\\\"\\n data-cy=\\\"k8sAppCreate-rmPortButton_{{ $index }}\\\"\\n >\\n <i class=\\\"fa fa-trash-alt\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n <button\\n ng-if=\\\"publishedPort.NeedsDeletion && ctrl.formValues.PublishingType === ctrl.savedFormValues.PublishingType\\\"\\n class=\\\"btn btn-sm btn-primary\\\"\\n type=\\\"button\\\"\\n ng-click=\\\"ctrl.restorePublishedPort($index)\\\"\\n data-cy=\\\"k8sAppCreate-restorePortButton_{{ $index }}\\\"\\n >\\n <i class=\\\"fa fa-trash-restore\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n <!-- #endregion -->\\n\\n <!-- #region VALIDATION -->\\n <div\\n ng-repeat-end\\n ng-show=\\\"\\n kubernetesApplicationCreationForm['container_port_' + $index].$invalid ||\\n kubernetesApplicationCreationForm['published_node_port_' + $index].$invalid ||\\n kubernetesApplicationCreationForm['load_balancer_port_' + $index].$invalid ||\\n kubernetesApplicationCreationForm['ingress_class_' + $index].$invalid ||\\n kubernetesApplicationCreationForm['ingress_route_' + $index].$invalid ||\\n ctrl.state.duplicates.publishedPorts.containerPorts.refs[$index] !== undefined ||\\n (ctrl.formValues.PublishingType === ctrl.ApplicationPublishingTypes.NODE_PORT &&\\n ctrl.state.duplicates.publishedPorts.nodePorts.refs[$index] !== undefined) ||\\n (ctrl.formValues.PublishingType === ctrl.ApplicationPublishingTypes.INGRESS &&\\n ctrl.state.duplicates.publishedPorts.ingressRoutes.refs[$index] !== undefined) ||\\n (ctrl.formValues.PublishingType === ctrl.ApplicationPublishingTypes.LOAD_BALANCER &&\\n ctrl.state.duplicates.publishedPorts.loadBalancerPorts.refs[$index] !== undefined)\\n \\\"\\n >\\n <div class=\\\"col-sm-3 input-group input-group-sm\\\">\\n <div\\n class=\\\"small text-warning\\\"\\n style=\\\"margin-top: 5px;\\\"\\n ng-if=\\\"\\n kubernetesApplicationCreationForm['container_port_' + $index].$invalid ||\\n ctrl.state.duplicates.publishedPorts.containerPorts.refs[$index] !== undefined\\n \\\"\\n >\\n <div ng-messages=\\\"kubernetesApplicationCreationForm['container_port_'+$index].$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Container port number is required.</p>\\n <p ng-message=\\\"min\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Container port number must be inside the range 1-65535.</p>\\n <p ng-message=\\\"max\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Container port number must be inside the range 1-65535.</p>\\n </div>\\n <p ng-if=\\\"ctrl.state.duplicates.publishedPorts.containerPorts.refs[$index] !== undefined\\\">\\n <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This port is already used.\\n </p>\\n </div>\\n </div>\\n\\n <div class=\\\"col-sm-3 input-group input-group-sm\\\" ng-if=\\\"ctrl.formValues.PublishingType === ctrl.ApplicationPublishingTypes.NODE_PORT\\\">\\n <div\\n class=\\\"small text-warning\\\"\\n style=\\\"margin-top: 5px;\\\"\\n ng-if=\\\"\\n kubernetesApplicationCreationForm['published_node_port_' + $index].$invalid ||\\n ctrl.state.duplicates.publishedPorts.nodePorts.refs[$index] !== undefined\\n \\\"\\n >\\n <div ng-messages=\\\"kubernetesApplicationCreationForm['published_node_port_'+$index].$error\\\">\\n <p ng-message=\\\"min\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Node port number must be inside the range 30000-32767.</p>\\n <p ng-message=\\\"max\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Node port number must be inside the range 30000-32767.</p>\\n </div>\\n <p ng-if=\\\"ctrl.state.duplicates.publishedPorts.nodePorts.refs[$index] !== undefined\\\">\\n <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This port is already used.\\n </p>\\n </div>\\n </div>\\n\\n <div class=\\\"col-sm-3 input-group input-group-sm\\\" ng-if=\\\"ctrl.formValues.PublishingType === ctrl.ApplicationPublishingTypes.INGRESS\\\">\\n <div class=\\\"small text-warning\\\" style=\\\"margin-top: 5px;\\\" ng-if=\\\"kubernetesApplicationCreationForm['ingress_class_' + $index].$invalid\\\">\\n <div ng-messages=\\\"kubernetesApplicationCreationForm['ingress_class_'+$index].$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Ingress selection is required.</p>\\n </div>\\n </div>\\n </div>\\n <div class=\\\"col-sm-3 input-group input-group-sm\\\" ng-if=\\\"ctrl.formValues.PublishingType === ctrl.ApplicationPublishingTypes.INGRESS\\\">\\n <div\\n class=\\\"small text-warning\\\"\\n style=\\\"margin-top: 5px;\\\"\\n ng-if=\\\"\\n kubernetesApplicationCreationForm['ingress_route_' + $index].$invalid || ctrl.state.duplicates.publishedPorts.ingressRoutes.refs[$index] !== undefined\\n \\\"\\n >\\n <div ng-messages=\\\"kubernetesApplicationCreationForm['ingress_route_'+$index].$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Route is required.</p>\\n <p ng-message=\\\"pattern\\\"\\n ><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field must consist of alphanumeric characters or the special characters: '-',\\n '_' or '/'. It must start and end with an alphanumeric character (e.g. 'my-route', or 'route-123').</p\\n >\\n </div>\\n <p ng-if=\\\"ctrl.state.duplicates.publishedPorts.ingressRoutes.refs[$index] !== undefined\\\">\\n <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This route is already used.\\n </p>\\n </div>\\n </div>\\n\\n <div class=\\\"col-sm-3 input-group input-group-sm\\\" ng-if=\\\"ctrl.formValues.PublishingType === ctrl.ApplicationPublishingTypes.LOAD_BALANCER\\\">\\n <div\\n class=\\\"small text-warning\\\"\\n style=\\\"margin-top: 5px;\\\"\\n ng-if=\\\"\\n kubernetesApplicationCreationForm['load_balancer_port_' + $index].$invalid ||\\n ctrl.state.duplicates.publishedPorts.loadBalancerPorts.refs[$index] !== undefined\\n \\\"\\n >\\n <div ng-messages=\\\"kubernetesApplicationCreationForm['load_balancer_port_'+$index].$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Load balancer port number is required.</p>\\n <p ng-message=\\\"min\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Load balancer port number must be inside the range 1-65535.</p>\\n <p ng-message=\\\"max\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Load balancer port number must be inside the range 1-65535.</p>\\n </div>\\n <p ng-if=\\\"ctrl.state.duplicates.publishedPorts.loadBalancerPorts.refs[$index] !== undefined\\\">\\n <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i>\\n This port is already used.\\n </p>\\n </div>\\n </div>\\n\\n <div class=\\\"input-group col-sm-1 input-group-sm\\\"> </div>\\n </div>\\n <!-- #endregion -->\\n </div>\\n </div>\\n </span>\\n <!-- #endregion -->\\n\\n <!-- summary -->\\n <kubernetes-summary-view\\n ng-if=\\\"!(!kubernetesApplicationCreationForm.$valid || ctrl.isDeployUpdateButtonDisabled() || !ctrl.state.pullImageValidity)\\\"\\n form-values=\\\"ctrl.formValues\\\"\\n old-form-values=\\\"ctrl.savedFormValues\\\"\\n ></kubernetes-summary-view>\\n </div>\\n </div>\\n\\n <div class=\\\"col-sm-12 form-section-title\\\" ng-if=\\\"ctrl.state.appType !== ctrl.KubernetesDeploymentTypes.GIT\\\">\\n Actions\\n </div>\\n <!-- #region ACTIONS -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n ng-if=\\\"ctrl.state.appType === ctrl.KubernetesDeploymentTypes.APPLICATION_FORM\\\"\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"!kubernetesApplicationCreationForm.$valid || ctrl.isDeployUpdateButtonDisabled() || !ctrl.imageValidityIsValid()\\\"\\n ng-click=\\\"ctrl.deployApplication()\\\"\\n button-spinner=\\\"ctrl.state.actionInProgress\\\"\\n data-cy=\\\"k8sAppCreate-deployButton\\\"\\n >\\n <span ng-show=\\\"!ctrl.state.isEdit && !ctrl.state.actionInProgress\\\">Deploy application</span>\\n <span ng-show=\\\"!ctrl.state.isEdit && ctrl.state.actionInProgress\\\">Deployment in progress...</span>\\n <span ng-show=\\\"ctrl.state.isEdit && !ctrl.state.actionInProgress\\\">Update application</span>\\n <span ng-show=\\\"ctrl.state.isEdit && ctrl.state.actionInProgress\\\">Update in progress...</span>\\n </button>\\n <button\\n ng-if=\\\"ctrl.state.isEdit && !ctrl.state.actionInProgress && ctrl.state.appType === ctrl.KubernetesDeploymentTypes.APPLICATION_FORM\\\"\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-default\\\"\\n ui-sref=\\\"kubernetes.applications.application({ name: ctrl.application.Name, namespace: ctrl.application.ResourcePool })\\\"\\n data-cy=\\\"k8sAppCreate-appCancelButton\\\"\\n >\\n Cancel\\n </button>\\n <!-- #Web editor buttons -->\\n <button\\n class=\\\"btn btn-sm btn-primary\\\"\\n ng-click=\\\"ctrl.updateApplicationViaWebEditor()\\\"\\n ng-if=\\\"ctrl.state.appType === ctrl.KubernetesDeploymentTypes.CONTENT || ctrl.state.updateWebEditorInProgress\\\"\\n ng-disabled=\\\"!kubernetesApplicationCreationForm.$valid || !ctrl.state.isEditorDirty || ctrl.state.updateWebEditorInProgress\\\"\\n style=\\\"margin-top: 7px; margin-left: 0;\\\"\\n button-spinner=\\\"ctrl.state.updateWebEditorInProgress\\\"\\n >\\n <span ng-show=\\\"!ctrl.state.updateWebEditorInProgress\\\">Update the application</span>\\n <span ng-show=\\\"ctrl.state.updateWebEditorInProgress\\\">Update in progress...</span>\\n </button>\\n </div>\\n </div>\\n <!-- #endregion -->\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import angular from 'angular';\nimport _ from 'lodash-es';\nimport filesizeParser from 'filesize-parser';\nimport * as JsonPatch from 'fast-json-patch';\nimport { RegistryTypes } from '@/portainer/models/registryTypes';\n\nimport {\n KubernetesApplicationDataAccessPolicies,\n KubernetesApplicationDeploymentTypes,\n KubernetesApplicationPublishingTypes,\n KubernetesApplicationQuotaDefaults,\n KubernetesApplicationTypes,\n KubernetesApplicationPlacementTypes,\n KubernetesDeploymentTypes,\n} from 'Kubernetes/models/application/models';\nimport {\n KubernetesApplicationConfigurationFormValue,\n KubernetesApplicationConfigurationFormValueOverridenKey,\n KubernetesApplicationConfigurationFormValueOverridenKeyTypes,\n KubernetesApplicationEnvironmentVariableFormValue,\n KubernetesApplicationFormValues,\n KubernetesApplicationPersistedFolderFormValue,\n KubernetesApplicationPublishedPortFormValue,\n KubernetesApplicationPlacementFormValue,\n KubernetesFormValidationReferences,\n} from 'Kubernetes/models/application/formValues';\nimport KubernetesFormValidationHelper from 'Kubernetes/helpers/formValidationHelper';\nimport KubernetesApplicationConverter from 'Kubernetes/converters/application';\nimport KubernetesResourceReservationHelper from 'Kubernetes/helpers/resourceReservationHelper';\nimport { KubernetesServiceTypes } from 'Kubernetes/models/service/models';\nimport KubernetesApplicationHelper from 'Kubernetes/helpers/application/index';\nimport KubernetesVolumeHelper from 'Kubernetes/helpers/volumeHelper';\nimport KubernetesNamespaceHelper from 'Kubernetes/helpers/namespaceHelper';\nimport { KubernetesNodeHelper } from 'Kubernetes/node/helper';\n\nclass KubernetesCreateApplicationController {\n /* #region CONSTRUCTOR */\n\n /* @ngInject */\n constructor(\n $scope,\n $async,\n $state,\n Notifications,\n Authentication,\n ModalService,\n KubernetesResourcePoolService,\n KubernetesApplicationService,\n KubernetesStackService,\n KubernetesConfigurationService,\n KubernetesNodeService,\n KubernetesIngressService,\n KubernetesPersistentVolumeClaimService,\n KubernetesVolumeService,\n RegistryService,\n StackService,\n KubernetesNodesLimitsService\n ) {\n this.$scope = $scope;\n this.$async = $async;\n this.$state = $state;\n this.Notifications = Notifications;\n this.Authentication = Authentication;\n this.ModalService = ModalService;\n this.KubernetesResourcePoolService = KubernetesResourcePoolService;\n this.KubernetesApplicationService = KubernetesApplicationService;\n this.KubernetesStackService = KubernetesStackService;\n this.KubernetesConfigurationService = KubernetesConfigurationService;\n this.KubernetesNodeService = KubernetesNodeService;\n this.KubernetesVolumeService = KubernetesVolumeService;\n this.KubernetesIngressService = KubernetesIngressService;\n this.KubernetesPersistentVolumeClaimService = KubernetesPersistentVolumeClaimService;\n this.RegistryService = RegistryService;\n this.StackService = StackService;\n this.KubernetesNodesLimitsService = KubernetesNodesLimitsService;\n\n this.ApplicationDeploymentTypes = KubernetesApplicationDeploymentTypes;\n this.ApplicationDataAccessPolicies = KubernetesApplicationDataAccessPolicies;\n this.ApplicationPublishingTypes = KubernetesApplicationPublishingTypes;\n this.ApplicationPlacementTypes = KubernetesApplicationPlacementTypes;\n this.ApplicationTypes = KubernetesApplicationTypes;\n this.ApplicationConfigurationFormValueOverridenKeyTypes = KubernetesApplicationConfigurationFormValueOverridenKeyTypes;\n this.ServiceTypes = KubernetesServiceTypes;\n this.KubernetesDeploymentTypes = KubernetesDeploymentTypes;\n\n this.state = {\n appType: this.KubernetesDeploymentTypes.APPLICATION_FORM,\n updateWebEditorInProgress: false,\n actionInProgress: false,\n useLoadBalancer: false,\n useServerMetrics: false,\n sliders: {\n cpu: {\n min: 0,\n max: 0,\n },\n memory: {\n min: 0,\n max: 0,\n },\n },\n nodes: {\n memory: 0,\n cpu: 0,\n },\n namespaceLimits: {\n memory: 0,\n cpu: 0,\n },\n resourcePoolHasQuota: false,\n viewReady: false,\n availableSizeUnits: ['MB', 'GB', 'TB'],\n alreadyExists: false,\n duplicates: {\n environmentVariables: new KubernetesFormValidationReferences(),\n persistedFolders: new KubernetesFormValidationReferences(),\n configurationPaths: new KubernetesFormValidationReferences(),\n existingVolumes: new KubernetesFormValidationReferences(),\n publishedPorts: {\n containerPorts: new KubernetesFormValidationReferences(),\n nodePorts: new KubernetesFormValidationReferences(),\n ingressRoutes: new KubernetesFormValidationReferences(),\n loadBalancerPorts: new KubernetesFormValidationReferences(),\n },\n placements: new KubernetesFormValidationReferences(),\n },\n isEdit: this.$state.params.namespace && this.$state.params.name,\n persistedFoldersUseExistingVolumes: false,\n pullImageValidity: false,\n };\n\n this.isAdmin = this.Authentication.isAdmin();\n\n this.editChanges = [];\n\n this.storageClasses = [];\n this.state.useLoadBalancer = false;\n this.state.useServerMetrics = false;\n\n this.formValues = new KubernetesApplicationFormValues();\n\n this.updateApplicationAsync = this.updateApplicationAsync.bind(this);\n this.deployApplicationAsync = this.deployApplicationAsync.bind(this);\n this.setPullImageValidity = this.setPullImageValidity.bind(this);\n this.onChangeFileContent = this.onChangeFileContent.bind(this);\n this.onServicePublishChange = this.onServicePublishChange.bind(this);\n }\n /* #endregion */\n\n onChangeFileContent(value) {\n if (this.stackFileContent.replace(/(\\r\\n|\\n|\\r)/gm, '') !== value.replace(/(\\r\\n|\\n|\\r)/gm, '')) {\n this.state.isEditorDirty = true;\n this.stackFileContent = value;\n }\n }\n\n async updateApplicationViaWebEditor() {\n return this.$async(async () => {\n try {\n const confirmed = await this.ModalService.confirmAsync({\n title: 'Are you sure?',\n message: 'Any changes to this application will be overriden and may cause a service interruption. Do you wish to continue?',\n buttons: {\n confirm: {\n label: 'Update',\n className: 'btn-warning',\n },\n },\n });\n if (!confirmed) {\n return;\n }\n this.state.updateWebEditorInProgress = true;\n await this.StackService.updateKubeStack({ EndpointId: this.endpoint.Id, Id: this.application.StackId }, this.stackFileContent, null);\n this.state.isEditorDirty = false;\n await this.$state.reload(this.$state.current);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Failed redeploying application');\n } finally {\n this.state.updateWebEditorInProgress = false;\n }\n });\n }\n\n async uiCanExit() {\n if (this.stackFileContent && this.state.isEditorDirty) {\n return this.ModalService.confirmWebEditorDiscard();\n }\n }\n\n setPullImageValidity(validity) {\n this.state.pullImageValidity = validity;\n }\n\n imageValidityIsValid() {\n return this.state.pullImageValidity || this.formValues.ImageModel.Registry.Type !== RegistryTypes.DOCKERHUB;\n }\n\n onChangeName() {\n const existingApplication = _.find(this.applications, { Name: this.formValues.Name });\n this.state.alreadyExists = (this.state.isEdit && existingApplication && this.application.Id !== existingApplication.Id) || (!this.state.isEdit && existingApplication);\n }\n\n /* #region AUTO SCALER UI MANAGEMENT */\n unselectAutoScaler() {\n if (this.formValues.DeploymentType === this.ApplicationDeploymentTypes.GLOBAL) {\n this.formValues.AutoScaler.IsUsed = false;\n }\n }\n /* #endregion */\n\n /* #region CONFIGURATION UI MANAGEMENT */\n addConfiguration() {\n let config = new KubernetesApplicationConfigurationFormValue();\n config.SelectedConfiguration = this.configurations[0];\n this.formValues.Configurations.push(config);\n }\n\n removeConfiguration(index) {\n this.formValues.Configurations.splice(index, 1);\n this.onChangeConfigurationPath();\n }\n\n overrideConfiguration(index) {\n const config = this.formValues.Configurations[index];\n config.Overriden = true;\n config.OverridenKeys = _.map(_.keys(config.SelectedConfiguration.Data), (key) => {\n const res = new KubernetesApplicationConfigurationFormValueOverridenKey();\n res.Key = key;\n return res;\n });\n }\n\n resetConfiguration(index) {\n const config = this.formValues.Configurations[index];\n config.Overriden = false;\n config.OverridenKeys = [];\n this.onChangeConfigurationPath();\n }\n\n clearConfigurations() {\n this.formValues.Configurations = [];\n }\n\n onChangeConfigurationPath() {\n this.state.duplicates.configurationPaths.refs = [];\n\n const paths = _.reduce(\n this.formValues.Configurations,\n (result, config) => {\n const uniqOverridenKeysPath = _.uniq(_.map(config.OverridenKeys, 'Path'));\n return _.concat(result, uniqOverridenKeysPath);\n },\n []\n );\n\n const duplicatePaths = KubernetesFormValidationHelper.getDuplicates(paths);\n\n _.forEach(this.formValues.Configurations, (config, index) => {\n _.forEach(config.OverridenKeys, (overridenKey, keyIndex) => {\n const findPath = _.find(duplicatePaths, (path) => path === overridenKey.Path);\n if (findPath) {\n this.state.duplicates.configurationPaths.refs[index + '_' + keyIndex] = findPath;\n }\n });\n });\n\n this.state.duplicates.configurationPaths.hasRefs = Object.keys(this.state.duplicates.configurationPaths.refs).length > 0;\n }\n /* #endregion */\n\n /* #region ENVIRONMENT UI MANAGEMENT */\n addEnvironmentVariable() {\n this.formValues.EnvironmentVariables.push(new KubernetesApplicationEnvironmentVariableFormValue());\n }\n\n restoreEnvironmentVariable(item) {\n item.NeedsDeletion = false;\n }\n\n removeEnvironmentVariable(item) {\n const index = this.formValues.EnvironmentVariables.indexOf(item);\n if (index !== -1) {\n const envVar = this.formValues.EnvironmentVariables[index];\n if (!envVar.IsNew) {\n envVar.NeedsDeletion = true;\n } else {\n this.formValues.EnvironmentVariables.splice(index, 1);\n }\n }\n this.onChangeEnvironmentName();\n }\n\n onChangeEnvironmentName() {\n this.state.duplicates.environmentVariables.refs = KubernetesFormValidationHelper.getDuplicates(_.map(this.formValues.EnvironmentVariables, 'Name'));\n this.state.duplicates.environmentVariables.hasRefs = Object.keys(this.state.duplicates.environmentVariables.refs).length > 0;\n }\n /* #endregion */\n\n /* #region PERSISTENT FOLDERS UI MANAGEMENT */\n addPersistedFolder() {\n let storageClass = {};\n if (this.storageClasses.length > 0) {\n storageClass = this.storageClasses[0];\n }\n\n const newPf = new KubernetesApplicationPersistedFolderFormValue(storageClass);\n this.formValues.PersistedFolders.push(newPf);\n this.resetDeploymentType();\n }\n\n restorePersistedFolder(index) {\n this.formValues.PersistedFolders[index].NeedsDeletion = false;\n this.validatePersistedFolders();\n }\n\n resetPersistedFolders() {\n this.formValues.PersistedFolders = _.forEach(this.formValues.PersistedFolders, (persistedFolder) => {\n persistedFolder.ExistingVolume = null;\n persistedFolder.UseNewVolume = true;\n });\n this.validatePersistedFolders();\n }\n\n removePersistedFolder(index) {\n if (this.state.isEdit && this.formValues.PersistedFolders[index].PersistentVolumeClaimName) {\n this.formValues.PersistedFolders[index].NeedsDeletion = true;\n } else {\n this.formValues.PersistedFolders.splice(index, 1);\n }\n this.validatePersistedFolders();\n }\n\n useNewVolume(index) {\n this.formValues.PersistedFolders[index].UseNewVolume = true;\n this.formValues.PersistedFolders[index].ExistingVolume = null;\n this.state.persistedFoldersUseExistingVolumes = !_.reduce(this.formValues.PersistedFolders, (acc, pf) => acc && pf.UseNewVolume, true);\n this.validatePersistedFolders();\n }\n\n useExistingVolume(index) {\n this.formValues.PersistedFolders[index].UseNewVolume = false;\n this.state.persistedFoldersUseExistingVolumes = _.find(this.formValues.PersistedFolders, { UseNewVolume: false }) ? true : false;\n if (this.formValues.DataAccessPolicy === this.ApplicationDataAccessPolicies.ISOLATED) {\n this.formValues.DataAccessPolicy = this.ApplicationDataAccessPolicies.SHARED;\n this.resetDeploymentType();\n }\n this.validatePersistedFolders();\n }\n /* #endregion */\n\n /* #region PERSISTENT FOLDERS ON CHANGE VALIDATION */\n validatePersistedFolders() {\n this.onChangePersistedFolderPath();\n this.onChangeExistingVolumeSelection();\n }\n\n onChangePersistedFolderPath() {\n this.state.duplicates.persistedFolders.refs = KubernetesFormValidationHelper.getDuplicates(\n _.map(this.formValues.PersistedFolders, (persistedFolder) => {\n if (persistedFolder.NeedsDeletion) {\n return undefined;\n }\n return persistedFolder.ContainerPath;\n })\n );\n this.state.duplicates.persistedFolders.hasRefs = Object.keys(this.state.duplicates.persistedFolders.refs).length > 0;\n }\n\n onChangeExistingVolumeSelection() {\n this.state.duplicates.existingVolumes.refs = KubernetesFormValidationHelper.getDuplicates(\n _.map(this.formValues.PersistedFolders, (persistedFolder) => {\n if (persistedFolder.NeedsDeletion) {\n return undefined;\n }\n return persistedFolder.ExistingVolume ? persistedFolder.ExistingVolume.PersistentVolumeClaim.Name : '';\n })\n );\n this.state.duplicates.existingVolumes.hasRefs = Object.keys(this.state.duplicates.existingVolumes.refs).length > 0;\n }\n /* #endregion */\n\n /* #region PLACEMENT UI MANAGEMENT */\n addPlacement() {\n const placement = new KubernetesApplicationPlacementFormValue();\n const label = this.nodesLabels[0];\n placement.Label = label;\n placement.Value = label.Values[0];\n this.formValues.Placements.push(placement);\n this.onChangePlacement();\n }\n\n restorePlacement(index) {\n this.formValues.Placements[index].NeedsDeletion = false;\n this.onChangePlacement();\n }\n\n removePlacement(index) {\n if (this.state.isEdit && !this.formValues.Placements[index].IsNew) {\n this.formValues.Placements[index].NeedsDeletion = true;\n } else {\n this.formValues.Placements.splice(index, 1);\n }\n this.onChangePlacement();\n }\n\n // call all validation functions when a placement is added/removed/restored\n onChangePlacement() {\n this.onChangePlacementLabelValidate();\n }\n\n onChangePlacementLabel(index) {\n this.formValues.Placements[index].Value = this.formValues.Placements[index].Label.Values[0];\n this.onChangePlacementLabelValidate();\n }\n\n onChangePlacementLabelValidate() {\n const state = this.state.duplicates.placements;\n const source = _.map(this.formValues.Placements, (p) => (p.NeedsDeletion ? undefined : p.Label.Key));\n const duplicates = KubernetesFormValidationHelper.getDuplicates(source);\n state.refs = duplicates;\n state.hasRefs = Object.keys(duplicates).length > 0;\n }\n\n /* #endregion */\n\n /* #region PUBLISHED PORTS UI MANAGEMENT */\n onServicePublishChange() {\n // enable publishing with no previous ports exposed\n if (this.formValues.IsPublishingService && !this.formValues.PublishedPorts.length) {\n this.addPublishedPort();\n return;\n }\n\n // service update\n if (this.formValues.IsPublishingService) {\n this.formValues.PublishedPorts.forEach((port) => (port.NeedsDeletion = false));\n } else {\n // delete new ports, mark old ports to be deleted\n this.formValues.PublishedPorts = this.formValues.PublishedPorts.filter((port) => !port.IsNew).map((port) => ({ ...port, NeedsDeletion: true }));\n }\n }\n\n addPublishedPort() {\n const p = new KubernetesApplicationPublishedPortFormValue();\n const ingresses = this.ingresses;\n if (this.formValues.PublishingType === KubernetesApplicationPublishingTypes.INGRESS) {\n p.IngressName = ingresses && ingresses.length ? ingresses[0].Name : undefined;\n p.IngressHost = ingresses && ingresses.length ? ingresses[0].Hosts[0] : undefined;\n p.IngressHosts = ingresses && ingresses.length ? ingresses[0].Hosts : undefined;\n }\n if (this.formValues.PublishedPorts.length) {\n p.Protocol = this.formValues.PublishedPorts[0].Protocol;\n }\n this.formValues.PublishedPorts.push(p);\n }\n\n resetPublishedPorts() {\n const ingresses = this.ingresses;\n _.forEach(this.formValues.PublishedPorts, (p) => {\n p.IngressName = ingresses && ingresses.length ? ingresses[0].Name : undefined;\n p.IngressHost = ingresses && ingresses.length ? ingresses[0].Hosts[0] : undefined;\n });\n }\n\n restorePublishedPort(index) {\n this.formValues.PublishedPorts[index].NeedsDeletion = false;\n this.onChangePublishedPorts();\n }\n\n removePublishedPort(index) {\n if (this.state.isEdit && !this.formValues.PublishedPorts[index].IsNew) {\n this.formValues.PublishedPorts[index].NeedsDeletion = true;\n } else {\n this.formValues.PublishedPorts.splice(index, 1);\n }\n this.onChangePublishedPorts();\n }\n /* #endregion */\n\n /* #region PUBLISHED PORTS ON CHANGE VALIDATION */\n onChangePublishedPorts() {\n this.onChangePortMappingContainerPort();\n this.onChangePortMappingNodePort();\n this.onChangePortMappingIngressRoute();\n this.onChangePortMappingLoadBalancer();\n this.onChangePortProtocol();\n }\n\n onChangePortMappingContainerPort() {\n const state = this.state.duplicates.publishedPorts.containerPorts;\n if (this.formValues.PublishingType !== KubernetesApplicationPublishingTypes.INGRESS) {\n const source = _.map(this.formValues.PublishedPorts, (p) => (p.NeedsDeletion ? undefined : p.ContainerPort + p.Protocol));\n const duplicates = KubernetesFormValidationHelper.getDuplicates(source);\n state.refs = duplicates;\n state.hasRefs = Object.keys(duplicates).length > 0;\n } else {\n state.refs = {};\n state.hasRefs = false;\n }\n }\n\n onChangePortMappingNodePort() {\n const state = this.state.duplicates.publishedPorts.nodePorts;\n if (this.formValues.PublishingType === KubernetesApplicationPublishingTypes.NODE_PORT) {\n const source = _.map(this.formValues.PublishedPorts, (p) => (p.NeedsDeletion ? undefined : p.NodePort));\n const duplicates = KubernetesFormValidationHelper.getDuplicates(source);\n state.refs = duplicates;\n state.hasRefs = Object.keys(duplicates).length > 0;\n } else {\n state.refs = {};\n state.hasRefs = false;\n }\n }\n\n onChangePortMappingIngress(index) {\n const publishedPort = this.formValues.PublishedPorts[index];\n const ingress = _.find(this.ingresses, { Name: publishedPort.IngressName });\n publishedPort.IngressHosts = ingress.Hosts;\n this.ingressHostnames = ingress.Hosts;\n publishedPort.IngressHost = this.ingressHostnames.length ? this.ingressHostnames[0] : [];\n this.onChangePublishedPorts();\n }\n\n onChangePortMappingIngressRoute() {\n const state = this.state.duplicates.publishedPorts.ingressRoutes;\n\n if (this.formValues.PublishingType === KubernetesApplicationPublishingTypes.INGRESS) {\n const newRoutes = _.map(this.formValues.PublishedPorts, (p) => (p.IsNew && p.IngressRoute ? `${p.IngressHost || p.IngressName}${p.IngressRoute}` : undefined));\n const toDelRoutes = _.map(this.formValues.PublishedPorts, (p) => (p.NeedsDeletion && p.IngressRoute ? `${p.IngressHost || p.IngressName}${p.IngressRoute}` : undefined));\n const allRoutes = _.flatMap(this.ingresses, (i) => _.map(i.Paths, (p) => `${p.Host || i.Name}${p.Path}`));\n const duplicates = KubernetesFormValidationHelper.getDuplicates(newRoutes);\n _.forEach(newRoutes, (route, idx) => {\n if (_.includes(allRoutes, route) && !_.includes(toDelRoutes, route)) {\n duplicates[idx] = route;\n }\n });\n state.refs = duplicates;\n state.hasRefs = Object.keys(duplicates).length > 0;\n } else {\n state.refs = {};\n state.hasRefs = false;\n }\n }\n\n onChangePortMappingLoadBalancer() {\n const state = this.state.duplicates.publishedPorts.loadBalancerPorts;\n if (this.formValues.PublishingType === KubernetesApplicationPublishingTypes.LOAD_BALANCER) {\n const source = _.map(this.formValues.PublishedPorts, (p) => (p.NeedsDeletion ? undefined : p.LoadBalancerPort));\n const duplicates = KubernetesFormValidationHelper.getDuplicates(source);\n state.refs = duplicates;\n state.hasRefs = Object.keys(duplicates).length > 0;\n } else {\n state.refs = {};\n state.hasRefs = false;\n }\n }\n\n onChangePortProtocol(index) {\n if (this.formValues.PublishingType === KubernetesApplicationPublishingTypes.LOAD_BALANCER) {\n const newPorts = _.filter(this.formValues.PublishedPorts, { IsNew: true });\n _.forEach(newPorts, (port) => {\n port.Protocol = index ? this.formValues.PublishedPorts[index].Protocol : newPorts[0].Protocol;\n });\n this.onChangePortMappingLoadBalancer();\n }\n this.onChangePortMappingContainerPort();\n }\n /* #endregion */\n\n /* #region STATE VALIDATION FUNCTIONS */\n isValid() {\n return (\n !this.state.alreadyExists &&\n !this.state.duplicates.environmentVariables.hasRefs &&\n !this.state.duplicates.persistedFolders.hasRefs &&\n !this.state.duplicates.configurationPaths.hasRefs &&\n !this.state.duplicates.existingVolumes.hasRefs &&\n !this.state.duplicates.publishedPorts.containerPorts.hasRefs &&\n !this.state.duplicates.publishedPorts.nodePorts.hasRefs &&\n !this.state.duplicates.publishedPorts.ingressRoutes.hasRefs &&\n !this.state.duplicates.publishedPorts.loadBalancerPorts.hasRefs\n );\n }\n\n storageClassAvailable() {\n return this.storageClasses && this.storageClasses.length > 0;\n }\n\n hasMultipleStorageClassesAvailable() {\n return this.storageClasses && this.storageClasses.length > 1;\n }\n\n resetDeploymentType() {\n this.formValues.DeploymentType = this.ApplicationDeploymentTypes.REPLICATED;\n }\n\n // The data access policy panel is not shown when:\n // * There is not persisted folder specified\n showDataAccessPolicySection() {\n return this.formValues.PersistedFolders.length !== 0;\n }\n\n // A global deployment is not available when either:\n // * For each persisted folder specified, if one of the storage object only supports the RWO access mode\n // * The data access policy is set to ISOLATED\n supportGlobalDeployment() {\n const hasFolders = this.formValues.PersistedFolders.length !== 0;\n const hasRWOOnly = KubernetesApplicationHelper.hasRWOOnly(this.formValues);\n const isIsolated = this.formValues.DataAccessPolicy === this.ApplicationDataAccessPolicies.ISOLATED;\n\n if (hasFolders && (hasRWOOnly || isIsolated)) {\n return false;\n }\n return true;\n }\n\n // A StatefulSet is defined by DataAccessPolicy === ISOLATED\n isEditAndStatefulSet() {\n return this.state.isEdit && this.formValues.DataAccessPolicy === this.ApplicationDataAccessPolicies.ISOLATED;\n }\n\n // A scalable deployment is available when either:\n // * No persisted folders are specified\n // * The access policy is set to shared and for each persisted folders specified, all the associated\n // storage objects support at least RWX access mode (no RWO only)\n // * The access policy is set to isolated\n supportScalableReplicaDeployment() {\n const hasFolders = this.formValues.PersistedFolders.length !== 0;\n const hasRWOOnly = KubernetesApplicationHelper.hasRWOOnly(this.formValues);\n const isIsolated = this.formValues.DataAccessPolicy === this.ApplicationDataAccessPolicies.ISOLATED;\n\n if (!hasFolders || isIsolated || (hasFolders && !hasRWOOnly)) {\n return true;\n }\n return false;\n }\n\n // For each persisted folders, returns the non scalable deployments options (storage class that only supports RWO)\n getNonScalableStorage() {\n let storageOptions = [];\n\n for (let i = 0; i < this.formValues.PersistedFolders.length; i++) {\n const folder = this.formValues.PersistedFolders[i];\n\n if (folder.StorageClass && _.isEqual(folder.StorageClass.AccessModes, ['RWO'])) {\n storageOptions.push(folder.StorageClass.Name);\n } else {\n storageOptions.push('<no storage option available>');\n }\n }\n\n return _.uniq(storageOptions).join(', ');\n }\n\n enforceReplicaCountMinimum() {\n if (this.formValues.ReplicaCount === null) {\n this.formValues.ReplicaCount = 1;\n }\n }\n\n resourceQuotaCapacityExceeded() {\n return !this.state.sliders.memory.max || !this.state.sliders.cpu.max;\n }\n\n nodeLimitsOverflow() {\n const cpu = this.formValues.CpuLimit;\n const memory = KubernetesResourceReservationHelper.bytesValue(this.formValues.MemoryLimit);\n\n const overflow = this.nodesLimits.overflowForReplica(cpu, memory, 1);\n\n return overflow;\n }\n\n effectiveInstances() {\n return this.formValues.DeploymentType === this.ApplicationDeploymentTypes.GLOBAL ? this.nodeNumber : this.formValues.ReplicaCount;\n }\n\n resourceReservationsOverflow() {\n const instances = this.effectiveInstances();\n const cpu = this.formValues.CpuLimit;\n const maxCpu = this.state.namespaceLimits.cpu;\n const memory = KubernetesResourceReservationHelper.bytesValue(this.formValues.MemoryLimit);\n const maxMemory = this.state.namespaceLimits.memory;\n\n // multiply 1000 can avoid 0.1 * 3 > 0.3\n if (cpu * 1000 * instances > maxCpu * 1000) {\n return true;\n }\n\n if (memory * instances > maxMemory) {\n return true;\n }\n\n if (this.formValues.DeploymentType === this.ApplicationDeploymentTypes.REPLICATED) {\n return this.nodesLimits.overflowForReplica(cpu, memory, instances);\n }\n\n // DeploymentType == GLOBAL\n return this.nodesLimits.overflowForGlobal(cpu, memory);\n }\n\n autoScalerOverflow() {\n const instances = this.formValues.AutoScaler.MaxReplicas;\n const cpu = this.formValues.CpuLimit;\n const maxCpu = this.state.namespaceLimits.cpu;\n const memory = KubernetesResourceReservationHelper.bytesValue(this.formValues.MemoryLimit);\n const maxMemory = this.state.namespaceLimits.memory;\n\n // multiply 1000 can avoid 0.1 * 3 > 0.3\n if (cpu * 1000 * instances > maxCpu * 1000) {\n return true;\n }\n\n if (memory * instances > maxMemory) {\n return true;\n }\n\n return this.nodesLimits.overflowForReplica(cpu, memory, instances);\n }\n\n publishViaLoadBalancerEnabled() {\n return this.state.useLoadBalancer;\n }\n\n publishViaIngressEnabled() {\n return this.ingresses.length;\n }\n\n isEditAndNoChangesMade() {\n if (!this.state.isEdit) return false;\n const changes = JsonPatch.compare(this.savedFormValues, this.formValues);\n this.editChanges = _.filter(changes, (change) => !_.includes(change.path, '$$hashKey') && change.path !== '/ApplicationType');\n return !this.editChanges.length;\n }\n\n /* #region PERSISTED FOLDERS */\n /* #region BUTTONS STATES */\n isAddPersistentFolderButtonShowed() {\n return !this.isEditAndStatefulSet() && this.formValues.Containers.length <= 1;\n }\n\n isNewVolumeButtonDisabled(index) {\n return this.isEditAndExistingPersistedFolder(index);\n }\n\n isExistingVolumeButtonDisabled() {\n return !this.hasAvailableVolumes() || (this.isEdit && this.application.ApplicationType === this.ApplicationTypes.STATEFULSET);\n }\n /* #endregion */\n\n hasAvailableVolumes() {\n return this.availableVolumes.length > 0;\n }\n\n isEditAndExistingPersistedFolder(index) {\n return this.state.isEdit && this.formValues.PersistedFolders[index].PersistentVolumeClaimName;\n }\n /* #endregion */\n\n isEditAndNotNewPublishedPort(index) {\n return this.state.isEdit && !this.formValues.PublishedPorts[index].IsNew;\n }\n\n hasNoPublishedPorts() {\n return this.formValues.PublishedPorts.filter((port) => !port.NeedsDeletion).length === 0;\n }\n\n isEditAndNotNewPlacement(index) {\n return this.state.isEdit && !this.formValues.Placements[index].IsNew;\n }\n\n isNewAndNotFirst(index) {\n return !this.state.isEdit && index !== 0;\n }\n\n showPlacementPolicySection() {\n const placements = _.filter(this.formValues.Placements, { NeedsDeletion: false });\n return placements.length !== 0;\n }\n\n isNonScalable() {\n const scalable = this.supportScalableReplicaDeployment();\n const global = this.supportGlobalDeployment();\n const replica = this.formValues.ReplicaCount > 1;\n const replicated = this.formValues.DeploymentType === this.ApplicationDeploymentTypes.REPLICATED;\n const res = (replicated && !scalable && replica) || (!replicated && !global);\n return res;\n }\n\n isDeployUpdateButtonDisabled() {\n const overflow = this.resourceReservationsOverflow();\n const autoScalerOverflow = this.autoScalerOverflow();\n const inProgress = this.state.actionInProgress;\n const invalid = !this.isValid();\n const hasNoChanges = this.isEditAndNoChangesMade();\n const nonScalable = this.isNonScalable();\n const isPublishingWithoutPorts = this.formValues.IsPublishingService && this.hasNoPublishedPorts();\n return overflow || autoScalerOverflow || inProgress || invalid || hasNoChanges || nonScalable || isPublishingWithoutPorts;\n }\n\n disableLoadBalancerEdit() {\n return (\n this.state.isEdit &&\n this.application.ServiceType === this.ServiceTypes.LOAD_BALANCER &&\n !this.application.LoadBalancerIPAddress &&\n this.formValues.PublishingType === this.ApplicationPublishingTypes.LOAD_BALANCER\n );\n }\n\n isPublishingTypeEditDisabled() {\n const ports = _.filter(this.formValues.PublishedPorts, { IsNew: false, NeedsDeletion: false });\n return this.state.isEdit && this.formValues.PublishedPorts.length > 0 && ports.length > 0;\n }\n\n isEditLBWithPorts() {\n return this.formValues.PublishingType === KubernetesApplicationPublishingTypes.LOAD_BALANCER && _.filter(this.formValues.PublishedPorts, { IsNew: false }).length === 0;\n }\n\n isProtocolOptionDisabled(index, protocol) {\n return (\n this.disableLoadBalancerEdit() ||\n (this.isEditAndNotNewPublishedPort(index) && this.formValues.PublishedPorts[index].Protocol !== protocol) ||\n (this.isEditLBWithPorts() && this.formValues.PublishedPorts[index].Protocol !== protocol && this.isNewAndNotFirst(index))\n );\n }\n\n /* #endregion */\n\n /* #region DATA AUTO REFRESH */\n updateSliders() {\n const quota = this.formValues.ResourcePool.Quota;\n let minCpu = 0,\n minMemory = 0,\n maxCpu = this.state.namespaceLimits.cpu,\n maxMemory = this.state.namespaceLimits.memory;\n\n if (quota) {\n if (quota.CpuLimit) {\n minCpu = KubernetesApplicationQuotaDefaults.CpuLimit;\n }\n if (quota.MemoryLimit) {\n minMemory = KubernetesResourceReservationHelper.bytesValue(KubernetesApplicationQuotaDefaults.MemoryLimit);\n }\n }\n\n maxCpu = Math.min(maxCpu, this.nodesLimits.MaxCPU);\n maxMemory = Math.min(maxMemory, this.nodesLimits.MaxMemory);\n\n if (maxMemory < minMemory) {\n minMemory = 0;\n maxMemory = 0;\n }\n\n this.state.sliders.memory.min = KubernetesResourceReservationHelper.megaBytesValue(minMemory);\n this.state.sliders.memory.max = KubernetesResourceReservationHelper.megaBytesValue(maxMemory);\n this.state.sliders.cpu.min = minCpu;\n this.state.sliders.cpu.max = _.floor(maxCpu, 2);\n if (!this.state.isEdit) {\n this.formValues.CpuLimit = minCpu;\n this.formValues.MemoryLimit = KubernetesResourceReservationHelper.megaBytesValue(minMemory);\n }\n }\n\n updateNamespaceLimits() {\n let maxCpu = this.state.nodes.cpu;\n let maxMemory = this.state.nodes.memory;\n const quota = this.formValues.ResourcePool.Quota;\n\n this.state.resourcePoolHasQuota = false;\n\n if (quota) {\n if (quota.CpuLimit) {\n this.state.resourcePoolHasQuota = true;\n maxCpu = quota.CpuLimit - quota.CpuLimitUsed;\n if (this.state.isEdit && this.savedFormValues.CpuLimit) {\n maxCpu += this.savedFormValues.CpuLimit * this.effectiveInstances();\n }\n }\n\n if (quota.MemoryLimit) {\n this.state.resourcePoolHasQuota = true;\n maxMemory = quota.MemoryLimit - quota.MemoryLimitUsed;\n if (this.state.isEdit && this.savedFormValues.MemoryLimit) {\n maxMemory += KubernetesResourceReservationHelper.bytesValue(this.savedFormValues.MemoryLimit) * this.effectiveInstances();\n }\n }\n }\n\n this.state.namespaceLimits.cpu = maxCpu;\n this.state.namespaceLimits.memory = maxMemory;\n }\n\n refreshStacks(namespace) {\n return this.$async(async () => {\n try {\n this.stacks = await this.KubernetesStackService.get(namespace);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve stacks');\n }\n });\n }\n\n refreshConfigurations(namespace) {\n return this.$async(async () => {\n try {\n this.configurations = await this.KubernetesConfigurationService.get(namespace);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve configurations');\n }\n });\n }\n\n refreshApplications(namespace) {\n return this.$async(async () => {\n try {\n this.applications = await this.KubernetesApplicationService.get(namespace);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve applications');\n }\n });\n }\n\n refreshVolumes(namespace) {\n return this.$async(async () => {\n try {\n const volumes = await this.KubernetesVolumeService.get(namespace);\n _.forEach(volumes, (volume) => {\n volume.Applications = KubernetesVolumeHelper.getUsingApplications(volume, this.applications);\n });\n this.volumes = volumes;\n const filteredVolumes = _.filter(this.volumes, (volume) => {\n const isUnused = !KubernetesVolumeHelper.isUsed(volume);\n const isRWX = volume.PersistentVolumeClaim.StorageClass && _.includes(volume.PersistentVolumeClaim.StorageClass.AccessModes, 'RWX');\n return isUnused || isRWX;\n });\n this.availableVolumes = filteredVolumes;\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve volumes');\n }\n });\n }\n\n refreshIngresses(namespace) {\n return this.$async(async () => {\n try {\n this.ingresses = await this.KubernetesIngressService.get(namespace);\n this.ingressHostnames = this.ingresses.length ? this.ingresses[0].Hosts : [];\n if (!this.publishViaIngressEnabled()) {\n if (this.savedFormValues) {\n this.formValues.PublishingType = this.savedFormValues.PublishingType;\n } else {\n this.formValues.PublishingType = this.ApplicationPublishingTypes.CLUSTER_IP;\n }\n }\n this.formValues.OriginalIngresses = this.ingresses;\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve ingresses');\n }\n });\n }\n\n refreshNamespaceData(namespace) {\n return this.$async(async () => {\n await Promise.all([\n this.refreshStacks(namespace),\n this.refreshConfigurations(namespace),\n this.refreshApplications(namespace),\n this.refreshIngresses(namespace),\n this.refreshVolumes(namespace),\n ]);\n this.onChangeName();\n });\n }\n\n resetFormValues() {\n this.clearConfigurations();\n this.resetPersistedFolders();\n this.resetPublishedPorts();\n }\n\n onResourcePoolSelectionChange() {\n return this.$async(async () => {\n const namespace = this.formValues.ResourcePool.Namespace.Name;\n this.updateNamespaceLimits();\n this.updateSliders();\n await this.refreshNamespaceData(namespace);\n this.resetFormValues();\n });\n }\n /* #endregion */\n\n /* #region ACTIONS */\n async deployApplicationAsync() {\n this.state.actionInProgress = true;\n try {\n this.formValues.ApplicationOwner = this.Authentication.getUserDetails().username;\n _.remove(this.formValues.Configurations, (item) => item.SelectedConfiguration === undefined);\n await this.KubernetesApplicationService.create(this.formValues);\n this.Notifications.success('Application successfully deployed', this.formValues.Name);\n this.$state.go('kubernetes.applications');\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to create application');\n } finally {\n this.state.actionInProgress = false;\n }\n }\n\n async updateApplicationAsync() {\n try {\n this.state.actionInProgress = true;\n await this.KubernetesApplicationService.patch(this.savedFormValues, this.formValues);\n this.Notifications.success('Application successfully updated');\n this.$state.go('kubernetes.applications.application', { name: this.application.Name, namespace: this.application.ResourcePool });\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to update application');\n } finally {\n this.state.actionInProgress = false;\n }\n }\n\n deployApplication() {\n if (this.state.isEdit) {\n this.ModalService.confirmUpdate('Updating the application may cause a service interruption. Do you wish to continue?', (confirmed) => {\n if (confirmed) {\n return this.$async(this.updateApplicationAsync);\n }\n });\n } else {\n return this.$async(this.deployApplicationAsync);\n }\n }\n /* #endregion */\n\n /* #region APPLICATION - used on edit context only */\n getApplication() {\n return this.$async(async () => {\n try {\n const namespace = this.$state.params.namespace;\n [this.application, this.persistentVolumeClaims] = await Promise.all([\n this.KubernetesApplicationService.get(namespace, this.$state.params.name),\n this.KubernetesPersistentVolumeClaimService.get(namespace),\n ]);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve application details');\n }\n });\n }\n\n async parseImageConfiguration(imageModel) {\n return this.$async(async () => {\n try {\n return await this.RegistryService.retrievePorRegistryModelFromRepository(imageModel.Image, this.endpoint.Id, imageModel.Registry.Id, this.$state.params.namespace);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve registry');\n return imageModel;\n }\n });\n }\n /* #endregion */\n\n /* #region ON INIT */\n $onInit() {\n return this.$async(async () => {\n try {\n this.storageClasses = this.endpoint.Kubernetes.Configuration.StorageClasses;\n this.state.useLoadBalancer = this.endpoint.Kubernetes.Configuration.UseLoadBalancer;\n this.state.useServerMetrics = this.endpoint.Kubernetes.Configuration.UseServerMetrics;\n\n const [resourcePools, nodes, nodesLimits] = await Promise.all([\n this.KubernetesResourcePoolService.get(),\n this.KubernetesNodeService.get(),\n this.KubernetesNodesLimitsService.get(),\n ]);\n this.nodesLimits = nodesLimits;\n\n const nonSystemNamespaces = _.filter(resourcePools, (resourcePool) => !KubernetesNamespaceHelper.isSystemNamespace(resourcePool.Namespace.Name));\n\n this.resourcePools = _.sortBy(nonSystemNamespaces, ({ Namespace }) => (Namespace.Name === 'default' ? 0 : 1));\n\n this.formValues.ResourcePool = this.resourcePools[0];\n if (!this.formValues.ResourcePool) {\n return;\n }\n\n _.forEach(nodes, (item) => {\n this.state.nodes.memory += filesizeParser(item.Memory);\n this.state.nodes.cpu += item.CPU;\n });\n this.nodesLabels = KubernetesNodeHelper.generateNodeLabelsFromNodes(nodes);\n this.nodeNumber = nodes.length;\n\n const namespace = this.state.isEdit ? this.$state.params.namespace : this.formValues.ResourcePool.Namespace.Name;\n await this.refreshNamespaceData(namespace);\n\n if (this.state.isEdit) {\n await this.getApplication();\n this.formValues = KubernetesApplicationConverter.applicationToFormValues(\n this.application,\n this.resourcePools,\n this.configurations,\n this.persistentVolumeClaims,\n this.nodesLabels,\n this.ingresses\n );\n\n if (this.application.ApplicationKind) {\n this.state.appType = KubernetesDeploymentTypes[this.application.ApplicationKind.toUpperCase()];\n if (this.application.ApplicationKind === KubernetesDeploymentTypes.URL) {\n this.state.appType = KubernetesDeploymentTypes.CONTENT;\n }\n\n if (this.application.StackId) {\n this.stack = await this.StackService.stack(this.application.StackId);\n if (this.state.appType === KubernetesDeploymentTypes.CONTENT) {\n this.stackFileContent = await this.StackService.getStackFile(this.application.StackId);\n }\n }\n }\n\n this.formValues.OriginalIngresses = this.ingresses;\n this.formValues.ImageModel = await this.parseImageConfiguration(this.formValues.ImageModel);\n this.savedFormValues = angular.copy(this.formValues);\n delete this.formValues.ApplicationType;\n\n if (this.application.ApplicationType !== KubernetesApplicationTypes.STATEFULSET) {\n _.forEach(this.formValues.PersistedFolders, (persistedFolder) => {\n const volume = _.find(this.availableVolumes, ['PersistentVolumeClaim.Name', persistedFolder.PersistentVolumeClaimName]);\n if (volume) {\n persistedFolder.UseNewVolume = false;\n persistedFolder.ExistingVolume = volume;\n }\n });\n }\n await this.refreshNamespaceData(namespace);\n } else {\n this.formValues.AutoScaler = KubernetesApplicationHelper.generateAutoScalerFormValueFromHorizontalPodAutoScaler(null, this.formValues.ReplicaCount);\n }\n\n if (this.state.isEdit) {\n this.nodesLimits.excludesPods(this.application.Pods, this.formValues.CpuLimit, KubernetesResourceReservationHelper.bytesValue(this.formValues.MemoryLimit));\n }\n\n this.formValues.IsPublishingService = this.formValues.PublishedPorts.length > 0;\n\n this.updateNamespaceLimits();\n this.updateSliders();\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to load view data');\n } finally {\n this.state.viewReady = true;\n }\n });\n }\n\n /* #endregion */\n}\n\nexport default KubernetesCreateApplicationController;\nangular.module('portainer.kubernetes').controller('KubernetesCreateApplicationController', KubernetesCreateApplicationController);\n","const autoNgTemplateLoaderTemplate1 = require('./application.html');\n\nangular.module('portainer.kubernetes').component('kubernetesApplicationView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'KubernetesApplicationController',\n controllerAs: 'ctrl',\n bindings: {\n $transition$: '<',\n },\n});\n","var path = 'app/kubernetes/views/applications/edit/application.html';\nvar html = \"<kubernetes-view-header title=\\\"Application details\\\" state=\\\"kubernetes.applications.application\\\" view-ready=\\\"ctrl.state.viewReady\\\">\\n <a ui-sref=\\\"kubernetes.resourcePools\\\">Namespaces</a> >\\n <a ui-sref=\\\"kubernetes.resourcePools.resourcePool({ id: ctrl.application.ResourcePool })\\\">{{ ctrl.application.ResourcePool }}</a> >\\n <a ui-sref=\\\"kubernetes.applications\\\">Applications</a> > {{ ctrl.application.Name }}\\n</kubernetes-view-header>\\n\\n<kubernetes-view-loading view-ready=\\\"ctrl.state.viewReady\\\"></kubernetes-view-loading>\\n\\n<div ng-if=\\\"ctrl.state.viewReady\\\">\\n <div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <uib-tabset active=\\\"ctrl.state.activeTab\\\" justified=\\\"true\\\" type=\\\"pills\\\">\\n <uib-tab index=\\\"0\\\" classes=\\\"btn-sm\\\" select=\\\"ctrl.selectTab(0)\\\">\\n <uib-tab-heading> <i class=\\\"fa fa-laptop-code space-right\\\" aria-hidden=\\\"true\\\"></i> Application </uib-tab-heading>\\n <div style=\\\"padding: 20px;\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr>\\n <td>Name</td>\\n <td data-cy=\\\"k8sAppDetail-appName\\\">\\n {{ ctrl.application.Name }}\\n <span class=\\\"label label-primary image-tag label-margins\\\" ng-if=\\\"!ctrl.isSystemNamespace() && ctrl.isExternalApplication()\\\">external</span>\\n </td>\\n </tr>\\n <tr>\\n <td>Stack</td>\\n <td data-cy=\\\"k8sAppDetail-stackName\\\">{{ ctrl.application.StackName || '-' }}</td>\\n </tr>\\n <tr>\\n <td>Namespace</td>\\n <td data-cy=\\\"k8sAppDetail-resourcePoolName\\\">\\n <a ui-sref=\\\"kubernetes.resourcePools.resourcePool({ id: ctrl.application.ResourcePool })\\\">{{ ctrl.application.ResourcePool }}</a>\\n <span style=\\\"margin-left: 5px;\\\" class=\\\"label label-info image-tag\\\" ng-if=\\\"ctrl.isSystemNamespace()\\\">system</span>\\n </td>\\n </tr>\\n <tr>\\n <td>Application Type</td>\\n <td data-cy=\\\"k8sAppDetail-appType\\\">\\n {{ ctrl.application.ApplicationType | kubernetesApplicationTypeText }}\\n </td>\\n </tr>\\n <tr>\\n <td>Status</td>\\n <td ng-if=\\\"ctrl.application.ApplicationType !== ctrl.KubernetesApplicationTypes.POD\\\">\\n <span ng-if=\\\"ctrl.application.DeploymentType === ctrl.KubernetesApplicationDeploymentTypes.REPLICATED\\\" data-cy=\\\"k8sAppDetail-deployType\\\">Replicated</span>\\n <span ng-if=\\\"ctrl.application.DeploymentType === ctrl.KubernetesApplicationDeploymentTypes.GLOBAL\\\" data-cy=\\\"k8sAppDetail-appType\\\">Global</span>\\n <code data-cy=\\\"k8sAppDetail-runningPods\\\">{{ ctrl.application.RunningPodsCount }}</code> /\\n <code data-cy=\\\"k8sAppDetail-totalPods\\\">{{ ctrl.application.TotalPodsCount }}</code>\\n </td>\\n <td ng-if=\\\"ctrl.application.ApplicationType === ctrl.KubernetesApplicationTypes.POD\\\">\\n {{ ctrl.application.Pods[0].Status }}\\n </td>\\n </tr>\\n <tr ng-if=\\\"ctrl.application.Requests.Cpu || ctrl.application.Requests.Memory\\\">\\n <td>\\n <div>Resource reservations</div>\\n <div ng-if=\\\"ctrl.application.ApplicationType !== ctrl.KubernetesApplicationTypes.POD\\\" class=\\\"text-muted small\\\"> per instance </div>\\n </td>\\n <td>\\n <div ng-if=\\\"ctrl.application.Requests.Cpu\\\" data-cy=\\\"k8sAppDetail-cpuReservation\\\"\\n >CPU {{ ctrl.application.Requests.Cpu | kubernetesApplicationCPUValue }}</div\\n >\\n <div ng-if=\\\"ctrl.application.Requests.Memory\\\" data-cy=\\\"k8sAppDetail-memoryReservation\\\">Memory {{ ctrl.application.Requests.Memory | humansize }}</div>\\n </td>\\n </tr>\\n <tr>\\n <td>Creation</td>\\n <td>\\n <span ng-if=\\\"ctrl.application.ApplicationOwner\\\" style=\\\"margin-right: 5px;\\\"> <i class=\\\"fas fa-user\\\"></i> {{ ctrl.application.ApplicationOwner }} </span>\\n <span> <i class=\\\"fas fa-clock\\\"></i> {{ ctrl.application.CreationDate | getisodate }}</span>\\n <span ng-if=\\\"ctrl.application.ApplicationOwner\\\">\\n <i class=\\\"fa fa-file-code space-left space-right\\\" aria-hidden=\\\"true\\\"></i> Deployed from {{ ctrl.state.appType }}</span\\n >\\n </td>\\n </tr>\\n <tr>\\n <td colspan=\\\"2\\\">\\n <form class=\\\"form-horizontal\\\" name=\\\"kubernetesApplicationNoteForm\\\">\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <i class=\\\"fa fa-edit\\\" aria-hidden=\\\"true\\\"></i> Note\\n <button class=\\\"btn btn-xs btn-primary\\\" ng-click=\\\"ctrl.state.expandedNote = !ctrl.state.expandedNote;\\\" data-cy=\\\"k8sAppDetail-expandNoteButton\\\"\\n >{{ ctrl.state.expandedNote ? 'Collapse' : 'Expand' }}\\n <i class=\\\"fas {{ ctrl.state.expandedNote ? 'fa-angle-up' : 'fa-angle-down' }}\\\" aria-hidden=\\\"true\\\"></i\\n ></button>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-if=\\\"ctrl.state.expandedNote\\\">\\n <div class=\\\"col-sm-12\\\">\\n <textarea\\n class=\\\"form-control\\\"\\n name=\\\"application_note\\\"\\n id=\\\"application_note\\\"\\n ng-model=\\\"ctrl.formValues.Note\\\"\\n rows=\\\"5\\\"\\n placeholder=\\\"Enter a note about this application...\\\"\\n ></textarea>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-if=\\\"ctrl.state.expandedNote\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n class=\\\"btn btn-primary btn-sm\\\"\\n style=\\\"margin-left: 0px;\\\"\\n type=\\\"button\\\"\\n ng-click=\\\"ctrl.updateApplication()\\\"\\n ng-disabled=\\\"ctrl.formValues.Note === ctrl.application.Note\\\"\\n data-cy=\\\"k8sAppDetail-saveNoteButton\\\"\\n >{{ ctrl.application.Note ? 'Update' : 'Save' }} note</button\\n >\\n </div>\\n </div>\\n </form>\\n </td>\\n </tr>\\n <!-- <tr>\\n <td colspan=\\\"2\\\">\\n <form class=\\\"form-horizontal\\\" name=\\\"KubernetesApplicationRollbackForm\\\">\\n <div class=\\\"form-group\\\">\\n <label for=\\\"resource-pool-selector\\\" class=\\\"col-sm-2 col-lg-1 control-label text-left\\\">Version</label>\\n <div class=\\\"col-sm-2\\\">\\n <select class=\\\"form-control\\\" id=\\\"resource-pool-selector\\\" ng-model=\\\"ctrl.formValues.SelectedRevision\\\"\\n ng-options=\\\"revision as revision.revision for revision in ctrl.application.Revisions\\\"></select>\\n </div>\\n <div class=\\\"col-sm-2\\\">\\n <button class=\\\"btn btn-primary btn-sm\\\" style=\\\"margin-left: 0px;\\\" type=\\\"button\\\" ng-click=\\\"ctrl.rollbackApplication()\\\"\\n ng-disabled=\\\"ctrl.formValues.SelectedRevision.revision === ctrl.application.CurrentRevision.revision\\\">Rollback</button>\\n </div>\\n </div>\\n </form>\\n </td>\\n </tr> -->\\n </tbody>\\n </table>\\n </div>\\n </uib-tab>\\n\\n <uib-tab index=\\\"1\\\" classes=\\\"btn-sm\\\" select=\\\"ctrl.selectTab(1)\\\">\\n <uib-tab-heading>\\n <i class=\\\"fas fa-compress-arrows-alt space-right\\\" aria-hidden=\\\"true\\\"></i> Placement\\n <div ng-if=\\\"ctrl.state.placementWarning\\\">\\n <i class=\\\"fa fa-exclamation-circle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n warning\\n </div>\\n </uib-tab-heading>\\n <div class=\\\"small text-muted\\\" style=\\\"padding: 20px;\\\">\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n The placement component helps you understand whether or not this application can be deployed on a specific node.\\n </div>\\n <kubernetes-application-placements-datatable\\n title-text=\\\"Placement constraints/preferences\\\"\\n title-icon=\\\"fa-compress-arrows-alt\\\"\\n dataset=\\\"ctrl.placements\\\"\\n table-key=\\\"kubernetes.application.placements\\\"\\n order-by=\\\"Name\\\"\\n reverse-order=\\\"false\\\"\\n loading=\\\"ctrl.state.dataLoading\\\"\\n refresh-callback=\\\"ctrl.getApplication\\\"\\n ></kubernetes-application-placements-datatable>\\n </uib-tab>\\n\\n <uib-tab index=\\\"2\\\" classes=\\\"btn-sm\\\" select=\\\"ctrl.selectTab(2)\\\">\\n <uib-tab-heading>\\n <i class=\\\"fa fa-history space-right\\\" aria-hidden=\\\"true\\\"></i> Events\\n <div ng-if=\\\"ctrl.hasEventWarnings()\\\">\\n <i class=\\\"fa fa-exclamation-circle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n {{ ctrl.state.eventWarningCount }} warning(s)\\n </div>\\n </uib-tab-heading>\\n <kubernetes-events-datatable\\n title-text=\\\"Events\\\"\\n title-icon=\\\"fa-history\\\"\\n dataset=\\\"ctrl.events\\\"\\n table-key=\\\"kubernetes.application.events\\\"\\n order-by=\\\"Date\\\"\\n reverse-order=\\\"true\\\"\\n loading=\\\"ctrl.state.eventsLoading\\\"\\n refresh-callback=\\\"ctrl.getEvents\\\"\\n ></kubernetes-events-datatable>\\n </uib-tab>\\n\\n <uib-tab index=\\\"3\\\" ng-if=\\\"ctrl.application.Yaml\\\" select=\\\"ctrl.showEditor()\\\" classes=\\\"btn-sm\\\">\\n <uib-tab-heading> <i class=\\\"fa fa-code space-right\\\" aria-hidden=\\\"true\\\"></i> YAML </uib-tab-heading>\\n <div style=\\\"padding-right: 25px;\\\" ng-if=\\\"ctrl.state.showEditorTab\\\">\\n <kubernetes-yaml-inspector key=\\\"application-yaml\\\" data=\\\"ctrl.application.Yaml\\\"></kubernetes-yaml-inspector>\\n </div>\\n </uib-tab>\\n </uib-tabset>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n </div>\\n\\n <div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <div ng-if=\\\"!ctrl.isSystemNamespace()\\\" style=\\\"margin-bottom: 15px;\\\">\\n <button\\n ng-if=\\\"!ctrl.isExternalApplication()\\\"\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-primary\\\"\\n ui-sref=\\\"kubernetes.applications.application.edit\\\"\\n style=\\\"margin-left: 0;\\\"\\n data-cy=\\\"k8sAppDetail-editAppButton\\\"\\n >\\n <i class=\\\"fa fa-file-code space-right\\\" aria-hidden=\\\"true\\\"></i>Edit this application\\n </button>\\n <button\\n ng-if=\\\"ctrl.application.ApplicationType !== ctrl.KubernetesApplicationTypes.POD\\\"\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-primary\\\"\\n style=\\\"margin-left: 0;\\\"\\n ng-click=\\\"ctrl.redeployApplication()\\\"\\n data-cy=\\\"k8sAppDetail-redeployButton\\\"\\n >\\n <i class=\\\"fa fa-redo space-right\\\" aria-hidden=\\\"true\\\"></i>Redeploy\\n </button>\\n <button\\n ng-if=\\\"!ctrl.isExternalApplication()\\\"\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-primary\\\"\\n style=\\\"margin-left: 0;\\\"\\n ng-click=\\\"ctrl.rollbackApplication()\\\"\\n ng-disabled=\\\"ctrl.application.Revisions.length < 2 || ctrl.state.appType !== ctrl.KubernetesDeploymentTypes.APPLICATION_FORM\\\"\\n data-cy=\\\"k8sAppDetail-rollbackButton\\\"\\n >\\n <i class=\\\"fas fa-history space-right\\\" aria-hidden=\\\"true\\\"></i>Rollback to previous configuration\\n </button>\\n <a\\n ng-if=\\\"ctrl.isStack() && ctrl.stackFileContent\\\"\\n class=\\\"btn btn-sm btn-primary space-left\\\"\\n ui-sref=\\\"kubernetes.templates.custom.new({fileContent: ctrl.stackFileContent})\\\"\\n >\\n <i class=\\\"fas fa-plus space-right\\\" aria-hidden=\\\"true\\\"></i>Create template from application\\n </a>\\n </div>\\n\\n <!-- ACCESSING APPLICATION -->\\n <div class=\\\"text-muted\\\" style=\\\"margin-bottom: 15px;\\\">\\n <i class=\\\"fa fa-external-link-alt\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> Accessing the application\\n </div>\\n\\n <div class=\\\"small text-muted\\\" ng-if=\\\"ctrl.application.PublishedPorts.length === 0\\\" style=\\\"margin-bottom: 15px;\\\">\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n This application is not exposing any port.\\n </div>\\n\\n <div ng-if=\\\"ctrl.application.PublishedPorts.length > 0\\\">\\n <!-- LB notice -->\\n <div ng-if=\\\"ctrl.application.ServiceType === ctrl.KubernetesServiceTypes.LOAD_BALANCER\\\">\\n <div class=\\\"small text-muted\\\">\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n This application is exposed through a service of type <span class=\\\"bold\\\">{{ ctrl.application.ServiceType }}</span\\n >. Refer to the port configuration below to access it.\\n </div>\\n <div style=\\\"margin-top: 10px;\\\" class=\\\"small text-muted\\\">\\n <span ng-if=\\\"!ctrl.application.LoadBalancerIPAddress\\\">\\n <p> Load balancer status: <i class=\\\"fa fa-cog fa-spin\\\" style=\\\"margin-left: 2px;\\\"></i> pending </p>\\n <p>\\n <u>what does the \\\"pending\\\" status means?</u>\\n <portainer-tooltip\\n position=\\\"bottom\\\"\\n message=\\\"A pending status means that Portainer delegated the request to the provider responsible for creating the external load balancer. If it stays in pending state for long, this means that this capability might not be supported or you might have an issue with your cluster provider. Contact your cluster administrator for more information.\\\"\\n >\\n </portainer-tooltip>\\n </p>\\n </span>\\n <span ng-if=\\\"ctrl.application.LoadBalancerIPAddress\\\">\\n <p> Load balancer status: <i class=\\\"fa fa-check green-icon\\\" style=\\\"margin-left: 2px;\\\"></i> available </p>\\n <p>\\n Load balancer IP address: {{ ctrl.application.LoadBalancerIPAddress }}\\n <span class=\\\"btn btn-primary btn-xs\\\" ng-click=\\\"ctrl.copyLoadBalancerIP()\\\" style=\\\"margin-left: 5px;\\\">\\n <i class=\\\"fa fa-copy space-right\\\" aria-hidden=\\\"true\\\"></i>Copy\\n </span>\\n <span id=\\\"copyNotificationLB\\\" style=\\\"margin-left: 7px; display: none; color: #23ae89;\\\" class=\\\"small\\\">\\n <i class=\\\"fa fa-check\\\" aria-hidden=\\\"true\\\"></i> copied\\n </span>\\n </p>\\n </span>\\n </div>\\n </div>\\n\\n <!-- NodePort notice -->\\n <div ng-if=\\\"ctrl.application.ServiceType === ctrl.KubernetesServiceTypes.NODE_PORT\\\">\\n <div class=\\\"small text-muted\\\">\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n This application is exposed through a service of type <span class=\\\"bold\\\">{{ ctrl.application.ServiceType }}</span\\n >. It can be reached using the IP address of any node in your cluster using the port configuration below.\\n </div>\\n </div>\\n\\n <!-- ClusterIP notice -->\\n <div ng-if=\\\"ctrl.application.ServiceType === ctrl.KubernetesServiceTypes.CLUSTER_IP && !ctrl.state.useIngress\\\">\\n <div class=\\\"small text-muted\\\">\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n This application is exposed through a service of type <span class=\\\"bold\\\">{{ ctrl.application.ServiceType }}</span\\n >. It can be reached via the application name <code>{{ ctrl.application.ServiceName }}</code> and the port configuration below.\\n <span class=\\\"btn btn-primary btn-xs\\\" ng-click=\\\"ctrl.copyApplicationName()\\\"><i class=\\\"fa fa-copy space-right\\\" aria-hidden=\\\"true\\\"></i>Copy</span>\\n <span id=\\\"copyNotificationApplicationName\\\" style=\\\"margin-left: 7px; display: none; color: #23ae89;\\\" class=\\\"small\\\"\\n ><i class=\\\"fa fa-check\\\" aria-hidden=\\\"true\\\"></i> copied</span\\n >\\n </div>\\n </div>\\n\\n <!-- Ingress notice -->\\n <div ng-if=\\\"ctrl.application.ServiceType === ctrl.KubernetesServiceTypes.CLUSTER_IP && ctrl.state.useIngress\\\">\\n <div class=\\\"small text-muted\\\">\\n <p>\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n This application is exposed through a service of type <span class=\\\"bold\\\">{{ ctrl.application.ServiceType }}</span\\n >. It can be reached via the application name <code>{{ ctrl.application.ServiceName }}</code> and the port configuration below.\\n <span class=\\\"btn btn-primary btn-xs\\\" ng-click=\\\"ctrl.copyApplicationName()\\\"><i class=\\\"fa fa-copy space-right\\\" aria-hidden=\\\"true\\\"></i>Copy</span>\\n <span id=\\\"copyNotificationApplicationName\\\" style=\\\"margin-left: 7px; display: none; color: #23ae89;\\\" class=\\\"small\\\"\\n ><i class=\\\"fa fa-check\\\" aria-hidden=\\\"true\\\"></i> copied</span\\n >\\n </p>\\n <p>It is also associated to an <span class=\\\"bold\\\">Ingress</span> and can be accessed via specific HTTP route(s).</p>\\n </div>\\n </div>\\n\\n <!-- table -->\\n <div style=\\\"margin-top: 15px;\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr class=\\\"text-muted\\\">\\n <td style=\\\"width: 25%;\\\">Container port</td>\\n <td style=\\\"width: 25%;\\\">Service port</td>\\n <td style=\\\"width: 50%;\\\">HTTP route</td>\\n </tr>\\n <tr ng-repeat-start=\\\"port in ctrl.application.PublishedPorts\\\">\\n <td ng-if=\\\"!ctrl.portHasIngressRules(port)\\\" data-cy=\\\"k8sAppDetail-containerPort\\\">{{ port.TargetPort }}/{{ port.Protocol }}</td>\\n <td ng-if=\\\"!ctrl.portHasIngressRules(port)\\\">\\n <span ng-if=\\\"ctrl.application.ServiceType === ctrl.KubernetesServiceTypes.NODE_PORT\\\" data-cy=\\\"k8sAppDetail-nodePort\\\">\\n {{ port.NodePort }}\\n </span>\\n <span ng-if=\\\"ctrl.application.ServiceType !== ctrl.KubernetesServiceTypes.NODE_PORT\\\" data-cy=\\\"k8sAppDetail-containerPort\\\">\\n {{ port.Port }}\\n </span>\\n <a\\n ng-if=\\\"ctrl.application.LoadBalancerIPAddress\\\"\\n ng-href=\\\"http://{{ ctrl.application.LoadBalancerIPAddress }}:{{ port.Port }}\\\"\\n target=\\\"_blank\\\"\\n style=\\\"margin-left: 5px;\\\"\\n data-cy=\\\"k8sAppDetail-accessLink\\\"\\n >\\n <i class=\\\"fa fa-external-link-alt\\\" aria-hidden=\\\"true\\\"></i> access\\n </a>\\n </td>\\n <td ng-if=\\\"!ctrl.portHasIngressRules(port)\\\">-</td>\\n </tr>\\n <tr ng-repeat-end ng-repeat=\\\"rule in port.IngressRules\\\">\\n <td data-cy=\\\"k8sAppDetail-httpRoute\\\">{{ port.TargetPort }}/{{ port.Protocol }}</td>\\n <td>\\n <span ng-if=\\\"ctrl.application.ServiceType === ctrl.KubernetesServiceTypes.NODE_PORT\\\" data-cy=\\\"k8sAppDetail-nodePort\\\">\\n {{ port.NodePort }}\\n </span>\\n <span ng-if=\\\"ctrl.application.ServiceType !== ctrl.KubernetesServiceTypes.NODE_PORT\\\" data-cy=\\\"k8sAppDetail-port\\\">\\n {{ port.Port }}\\n </span>\\n <a\\n ng-if=\\\"ctrl.application.LoadBalancerIPAddress\\\"\\n ng-href=\\\"http://{{ ctrl.application.LoadBalancerIPAddress }}:{{ port.Port }}\\\"\\n target=\\\"_blank\\\"\\n style=\\\"margin-left: 5px;\\\"\\n >\\n <i class=\\\"fa fa-external-link-alt\\\" aria-hidden=\\\"true\\\"></i> access\\n </a>\\n </td>\\n <td>\\n <span\\n ng-if=\\\"!ctrl.ruleCanBeDisplayed(rule)\\\"\\n class=\\\"text-muted\\\"\\n tooltip-append-to-body=\\\"true\\\"\\n tooltip-placement=\\\"bottom\\\"\\n tooltip-class=\\\"portainer-tooltip\\\"\\n uib-tooltip=\\\"Ingress controller IP address not available yet\\\"\\n style=\\\"cursor: pointer;\\\"\\n >pending\\n </span>\\n <span ng-if=\\\"ctrl.ruleCanBeDisplayed(rule)\\\">\\n <a ng-href=\\\"{{ ctrl.buildIngressRuleURL(rule) }}\\\" target=\\\"_blank\\\" data-cy=\\\"k8sAppDetail-httpRouteLink\\\">\\n {{ ctrl.buildIngressRuleURL(rule) | stripprotocol }}\\n </a>\\n </span>\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n </div>\\n <!-- !ACCESSING APPLICATION -->\\n <!-- AUTO SCALING -->\\n <div class=\\\"text-muted\\\" style=\\\"margin-bottom: 15px;\\\"> <i class=\\\"fa fa-expand-arrows-alt\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> Auto-scaling</div>\\n\\n <div class=\\\"small text-muted\\\" ng-if=\\\"!ctrl.application.AutoScaler\\\" style=\\\"margin-bottom: 15px;\\\">\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n This application does not have an autoscaling policy defined.\\n </div>\\n\\n <div ng-if=\\\"ctrl.application.AutoScaler\\\">\\n <div style=\\\"margin-top: 15px; width: 50%;\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr class=\\\"text-muted\\\">\\n <td style=\\\"width: 33%;\\\">Minimum instances</td>\\n <td style=\\\"width: 33%;\\\">Maximum instances</td>\\n <td style=\\\"width: 33%;\\\">\\n Target CPU usage\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"The autoscaler will ensure enough instances are running to maintain an average CPU usage across all instances.\\\">\\n </portainer-tooltip>\\n </td>\\n </tr>\\n <tr>\\n <td data-cy=\\\"k8sAppDetail-minReplicas\\\">{{ ctrl.application.AutoScaler.MinReplicas }}</td>\\n <td data-cy=\\\"k8sAppDetail-maxReplicas\\\">{{ ctrl.application.AutoScaler.MaxReplicas }}</td>\\n <td data-cy=\\\"k8sAppDetail-targetCPU\\\">{{ ctrl.application.AutoScaler.TargetCPUUtilization }}%</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n </div>\\n <!-- !AUTO SCALING -->\\n\\n <!-- CONFIGURATIONS -->\\n <div class=\\\"text-muted\\\" style=\\\"margin-bottom: 15px; margin-top: 25px;\\\"> <i class=\\\"fa fa-file-code\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> Configuration </div>\\n\\n <div class=\\\"small text-muted\\\" ng-if=\\\"!ctrl.application.Env.length > 0 && !ctrl.hasVolumeConfiguration()\\\" style=\\\"margin-bottom: 15px;\\\">\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n This application is not using any environment variable or configuration.\\n </div>\\n\\n <table class=\\\"table\\\" ng-if=\\\"ctrl.application.Env.length > 0\\\">\\n <tr class=\\\"text-muted\\\">\\n <td style=\\\"width: 25%;\\\">Container</td>\\n <td style=\\\"width: 25%;\\\">Environment variable</td>\\n <td style=\\\"width: 25%;\\\">Value</td>\\n <td style=\\\"width: 25%;\\\">Configuration</td>\\n </tr>\\n <tbody ng-repeat=\\\"container in ctrl.application.Containers\\\" style=\\\"border-top: 0;\\\">\\n <tr ng-repeat=\\\"envvar in container.Env | orderBy: 'name'\\\">\\n <td data-cy=\\\"k8sAppDetail-containerName\\\">\\n {{ container.Name }}\\n <span ng-if=\\\"container.Type === ctrl.KubernetesPodContainerTypes.INIT\\\"\\n ><i class=\\\"fa fa-asterisk\\\" aria-hidden=\\\"true\\\"></i> {{ envvar.valueFrom.fieldRef.fieldPath }} (<a\\n href=\\\"https://kubernetes.io/docs/concepts/workloads/pods/init-containers/\\\"\\n target=\\\"_blank\\\"\\n >init container</a\\n >)</span\\n >\\n </td>\\n <td data-cy=\\\"k8sAppDetail-envVarName\\\">{{ envvar.name }}</td>\\n <td>\\n <span ng-if=\\\"envvar.value\\\" data-cy=\\\"k8sAppDetail-envVarValue\\\">{{ envvar.value }}</span>\\n <span ng-if=\\\"envvar.valueFrom.configMapKeyRef\\\" data-cy=\\\"k8sAppDetail-envVarValue\\\"\\n ><i class=\\\"fa fa-key\\\" aria-hidden=\\\"true\\\"></i> {{ envvar.valueFrom.configMapKeyRef.key }}</span\\n >\\n <span ng-if=\\\"envvar.valueFrom.secretKeyRef\\\" data-cy=\\\"k8sAppDetail-envVarValue\\\"\\n ><i class=\\\"fa fa-key\\\" aria-hidden=\\\"true\\\"></i> {{ envvar.valueFrom.secretKeyRef.key }}</span\\n >\\n <span ng-if=\\\"envvar.valueFrom.fieldRef\\\" data-cy=\\\"k8sAppDetail-envVarValue\\\"\\n ><i class=\\\"fa fa-asterisk\\\" aria-hidden=\\\"true\\\"></i> {{ envvar.valueFrom.fieldRef.fieldPath }} (<a\\n href=\\\"https://kubernetes.io/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information/#capabilities-of-the-downward-api\\\"\\n target=\\\"_blank\\\"\\n >downward API</a\\n >)</span\\n >\\n <span ng-if=\\\"!envvar.value && !envvar.valueFrom.secretKeyRef && !envvar.valueFrom.configMapKeyRef && !envvar.valueFrom.fieldRef\\\">-</span>\\n </td>\\n <td>\\n <span ng-if=\\\"envvar.value || envvar.valueFrom.fieldRef || (!envvar.valueFrom.secretKeyRef && !envvar.valueFrom.configMapKeyRef)\\\">-</span>\\n <span ng-if=\\\"envvar.valueFrom.configMapKeyRef\\\" data-cy=\\\"k8sAppDetail-configName\\\"\\n ><a ui-sref=\\\"kubernetes.configurations.configuration({ name: envvar.valueFrom.configMapKeyRef.name, namespace: ctrl.application.ResourcePool })\\\"\\n ><i class=\\\"fa fa-file-code\\\" aria-hidden=\\\"true\\\"></i> {{ envvar.valueFrom.configMapKeyRef.name }}</a\\n ></span\\n >\\n <span ng-if=\\\"envvar.valueFrom.secretKeyRef\\\" data-cy=\\\"k8sAppDetail-configName\\\"\\n ><a ui-sref=\\\"kubernetes.configurations.configuration({ name: envvar.valueFrom.secretKeyRef.name, namespace: ctrl.application.ResourcePool })\\\"\\n ><i class=\\\"fa fa-file-code\\\" aria-hidden=\\\"true\\\"></i> {{ envvar.valueFrom.secretKeyRef.name }}</a\\n ></span\\n >\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n\\n <table class=\\\"table\\\" ng-if=\\\"ctrl.hasVolumeConfiguration()\\\">\\n <tr class=\\\"text-muted\\\">\\n <td style=\\\"width: 25%;\\\">Container</td>\\n <td style=\\\"width: 25%;\\\">Configuration path</td>\\n <td style=\\\"width: 25%;\\\">Value</td>\\n <td style=\\\"width: 25%;\\\">Configuration</td>\\n </tr>\\n <tbody ng-repeat=\\\"container in ctrl.application.Containers\\\" style=\\\"border-top: 0;\\\">\\n <tr ng-repeat=\\\"volume in container.ConfigurationVolumes track by $index\\\" style=\\\"border-top: 0;\\\">\\n <td>\\n {{ container.Name }}\\n <span ng-if=\\\"container.Type === ctrl.KubernetesPodContainerTypes.INIT\\\"\\n ><i class=\\\"fa fa-asterisk\\\" aria-hidden=\\\"true\\\"></i> {{ envvar.valueFrom.fieldRef.fieldPath }} (<a\\n href=\\\"https://kubernetes.io/docs/concepts/workloads/pods/init-containers/\\\"\\n target=\\\"_blank\\\"\\n >init container</a\\n >)</span\\n >\\n </td>\\n <td>\\n {{ volume.fileMountPath }}\\n </td>\\n <td> <i class=\\\"fa fa-key\\\" ng-if=\\\"volume.configurationKey\\\" aria-hidden=\\\"true\\\"></i> {{ volume.configurationKey ? volume.configurationKey : '-' }} </td>\\n <td>\\n <a ui-sref=\\\"kubernetes.configurations.configuration({ name: volume.configurationName, namespace: ctrl.application.ResourcePool })\\\"\\n ><i class=\\\"fa fa-file-code\\\" aria-hidden=\\\"true\\\"></i> {{ volume.configurationName }}</a\\n >\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n <!-- !CONFIGURATIONS -->\\n\\n <!-- DATA PERSISTENCE -->\\n <div class=\\\"text-muted\\\" style=\\\"margin-bottom: 15px; margin-top: 25px;\\\">\\n <i class=\\\"fa fa-database\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> Data persistence\\n </div>\\n\\n <div class=\\\"small text-muted\\\" ng-if=\\\"!ctrl.hasPersistedFolders()\\\">\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n This application has no persisted folders.\\n </div>\\n\\n <div ng-if=\\\"ctrl.hasPersistedFolders()\\\">\\n <div class=\\\"small text-muted\\\" style=\\\"margin-bottom: 15px;\\\">\\n Data access policy: <i class=\\\"fa {{ ctrl.application.DataAccessPolicy | kubernetesApplicationDataAccessPolicyIcon }}\\\" aria-hidden=\\\"true\\\"></i>\\n {{ ctrl.application.DataAccessPolicy | kubernetesApplicationDataAccessPolicyText }}\\n <portainer-tooltip position=\\\"right\\\" message=\\\"{{ ctrl.application.DataAccessPolicy | kubernetesApplicationDataAccessPolicyTooltip }}\\\"> </portainer-tooltip>\\n </div>\\n\\n <table class=\\\"table\\\" ng-if=\\\"ctrl.application.DataAccessPolicy === ctrl.ApplicationDataAccessPolicies.SHARED\\\">\\n <tr class=\\\"text-muted\\\">\\n <td style=\\\"width: 33%;\\\">Persisted folder</td>\\n <td style=\\\"width: 66%;\\\">Persistence</td>\\n </tr>\\n <tbody ng-repeat=\\\"container in ctrl.application.Containers\\\" style=\\\"border-top: 0;\\\">\\n <tr ng-repeat=\\\"volume in container.PersistedFolders track by $index\\\">\\n <td data-cy=\\\"k8sAppDetail-volMountPath\\\">\\n {{ volume.MountPath }}\\n </td>\\n <td ng-if=\\\"volume.PersistentVolumeClaimName\\\">\\n <a ui-sref=\\\"kubernetes.volumes.volume({ name: volume.PersistentVolumeClaimName, namespace: ctrl.application.ResourcePool })\\\" data-cy=\\\"k8sAppDetail-volClaimName\\\"\\n ><i class=\\\"fa fa-database\\\" aria-hidden=\\\"true\\\"></i> {{ volume.PersistentVolumeClaimName }}</a\\n >\\n </td>\\n <td ng-if=\\\"volume.HostPath\\\"> {{ volume.HostPath }} on host filesystem </td>\\n </tr>\\n </tbody>\\n </table>\\n\\n <table class=\\\"table\\\" ng-if=\\\"ctrl.application.DataAccessPolicy === ctrl.ApplicationDataAccessPolicies.ISOLATED\\\">\\n <thead>\\n <tr class=\\\"text-muted\\\">\\n <td style=\\\"width: 25%;\\\">Container name</td>\\n <td style=\\\"width: 25%;\\\">Pod name</td>\\n <td style=\\\"width: 25%;\\\">Persisted folder</td>\\n <td style=\\\"width: 25%;\\\">Persistence</td>\\n </tr>\\n </thead>\\n <tbody ng-repeat=\\\"container in ctrl.allContainers track by $index\\\" style=\\\"border-top: none;\\\">\\n <tr ng-repeat=\\\"volume in container.PersistedFolders track by $index\\\">\\n <td>\\n {{ container.Name }}\\n <span ng-if=\\\"container.Type === ctrl.KubernetesPodContainerTypes.INIT\\\"\\n ><i class=\\\"fa fa-asterisk\\\" aria-hidden=\\\"true\\\"></i> {{ envvar.valueFrom.fieldRef.fieldPath }} (<a\\n href=\\\"https://kubernetes.io/docs/concepts/workloads/pods/init-containers/\\\"\\n target=\\\"_blank\\\"\\n >init container</a\\n >)</span\\n >\\n </td>\\n <td>{{ container.PodName }}</td>\\n <td>\\n {{ volume.MountPath }}\\n </td>\\n <td ng-if=\\\"volume.PersistentVolumeClaimName\\\">\\n <a ui-sref=\\\"kubernetes.volumes.volume({ name: volume.PersistentVolumeClaimName + '-' + container.PodName, namespace: ctrl.application.ResourcePool })\\\">\\n <i class=\\\"fa fa-database\\\" aria-hidden=\\\"true\\\"></i> {{ volume.PersistentVolumeClaimName + '-' + container.PodName }}</a\\n >\\n </td>\\n <td ng-if=\\\"volume.HostPath\\\"> {{ volume.HostPath }} on host filesystem </td>\\n </tr>\\n </tbody>\\n </table>\\n <!-- !DATA PERSISTENCE -->\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n </div>\\n\\n <div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <kubernetes-containers-datatable\\n title-text=\\\"Application containers\\\"\\n title-icon=\\\"fa-server\\\"\\n dataset=\\\"ctrl.allContainers\\\"\\n table-key=\\\"kubernetes.application.containers\\\"\\n is-pod=\\\"ctrl.application.ApplicationType === ctrl.KubernetesApplicationTypes.POD\\\"\\n order-by=\\\"{{ ctrl.application.ApplicationType === ctrl.KubernetesApplicationTypes.POD ? 'Name' : 'PodName' }}\\\"\\n use-server-metrics=\\\"ctrl.state.useServerMetrics\\\"\\n >\\n </kubernetes-containers-datatable>\\n </div>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import angular from 'angular';\nimport _ from 'lodash-es';\nimport * as JsonPatch from 'fast-json-patch';\nimport {\n KubernetesApplicationDataAccessPolicies,\n KubernetesApplicationDeploymentTypes,\n KubernetesApplicationTypes,\n KubernetesDeploymentTypes,\n} from 'Kubernetes/models/application/models';\nimport KubernetesEventHelper from 'Kubernetes/helpers/eventHelper';\nimport KubernetesApplicationHelper from 'Kubernetes/helpers/application';\nimport { KubernetesServiceTypes } from 'Kubernetes/models/service/models';\nimport { KubernetesPodNodeAffinityNodeSelectorRequirementOperators } from 'Kubernetes/pod/models';\nimport { KubernetesPodContainerTypes } from 'Kubernetes/pod/models/index';\nimport KubernetesNamespaceHelper from 'Kubernetes/helpers/namespaceHelper';\n\nfunction computeTolerations(nodes, application) {\n const pod = application.Pods[0];\n _.forEach(nodes, (n) => {\n n.AcceptsApplication = true;\n n.Expanded = false;\n if (!pod) {\n return;\n }\n n.UnmetTaints = [];\n _.forEach(n.Taints, (t) => {\n const matchKeyMatchValueMatchEffect = _.find(pod.Tolerations, { Key: t.Key, Operator: 'Equal', Value: t.Value, Effect: t.Effect });\n const matchKeyAnyValueMatchEffect = _.find(pod.Tolerations, { Key: t.Key, Operator: 'Exists', Effect: t.Effect });\n const matchKeyMatchValueAnyEffect = _.find(pod.Tolerations, { Key: t.Key, Operator: 'Equal', Value: t.Value, Effect: '' });\n const matchKeyAnyValueAnyEffect = _.find(pod.Tolerations, { Key: t.Key, Operator: 'Exists', Effect: '' });\n const anyKeyAnyValueAnyEffect = _.find(pod.Tolerations, { Key: '', Operator: 'Exists', Effect: '' });\n\n if (!matchKeyMatchValueMatchEffect && !matchKeyAnyValueMatchEffect && !matchKeyMatchValueAnyEffect && !matchKeyAnyValueAnyEffect && !anyKeyAnyValueAnyEffect) {\n n.AcceptsApplication = false;\n n.UnmetTaints.push(t);\n } else {\n n.AcceptsApplication = true;\n }\n });\n });\n return nodes;\n}\n\n// For node requirement format depending on operator value\n// see https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.18/#nodeselectorrequirement-v1-core\n// Some operators require empty \"values\" field, some only one element in \"values\" field, etc\n\nfunction computeAffinities(nodes, application) {\n if (!application.Pods || application.Pods.length === 0) {\n return nodes;\n }\n\n const pod = application.Pods[0];\n _.forEach(nodes, (n) => {\n if (pod.NodeSelector) {\n const patch = JsonPatch.compare(n.Labels, pod.NodeSelector);\n _.remove(patch, { op: 'remove' });\n n.UnmatchedNodeSelectorLabels = _.map(patch, (i) => {\n return { key: _.trimStart(i.path, '/'), value: i.value };\n });\n if (n.UnmatchedNodeSelectorLabels.length) {\n n.AcceptsApplication = false;\n }\n }\n\n if (pod.Affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution) {\n const unmatchedTerms = _.map(pod.Affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms, (t) => {\n const unmatchedExpressions = _.map(t.matchExpressions, (e) => {\n const exists = {}.hasOwnProperty.call(n.Labels, e.key);\n const isIn = exists && _.includes(e.values, n.Labels[e.key]);\n if (\n (e.operator === KubernetesPodNodeAffinityNodeSelectorRequirementOperators.EXISTS && exists) ||\n (e.operator === KubernetesPodNodeAffinityNodeSelectorRequirementOperators.DOES_NOT_EXIST && !exists) ||\n (e.operator === KubernetesPodNodeAffinityNodeSelectorRequirementOperators.IN && isIn) ||\n (e.operator === KubernetesPodNodeAffinityNodeSelectorRequirementOperators.NOT_IN && !isIn) ||\n (e.operator === KubernetesPodNodeAffinityNodeSelectorRequirementOperators.GREATER_THAN && exists && parseInt(n.Labels[e.key], 10) > parseInt(e.values[0], 10)) ||\n (e.operator === KubernetesPodNodeAffinityNodeSelectorRequirementOperators.LOWER_THAN && exists && parseInt(n.Labels[e.key], 10) < parseInt(e.values[0], 10))\n ) {\n return;\n }\n return e;\n });\n return _.without(unmatchedExpressions, undefined);\n });\n _.remove(unmatchedTerms, (i) => i.length === 0);\n n.UnmatchedNodeAffinities = unmatchedTerms;\n if (n.UnmatchedNodeAffinities.length) {\n n.AcceptsApplication = false;\n }\n }\n });\n return nodes;\n}\n\nfunction computePlacements(nodes, application) {\n nodes = computeTolerations(nodes, application);\n nodes = computeAffinities(nodes, application);\n return nodes;\n}\n\nclass KubernetesApplicationController {\n /* @ngInject */\n constructor(\n $async,\n $state,\n clipboard,\n Notifications,\n LocalStorage,\n ModalService,\n KubernetesApplicationService,\n KubernetesEventService,\n KubernetesStackService,\n KubernetesPodService,\n KubernetesNodeService,\n EndpointProvider,\n StackService\n ) {\n this.$async = $async;\n this.$state = $state;\n this.clipboard = clipboard;\n this.Notifications = Notifications;\n this.LocalStorage = LocalStorage;\n this.ModalService = ModalService;\n this.StackService = StackService;\n\n this.KubernetesApplicationService = KubernetesApplicationService;\n this.KubernetesEventService = KubernetesEventService;\n this.KubernetesStackService = KubernetesStackService;\n this.KubernetesPodService = KubernetesPodService;\n this.KubernetesNodeService = KubernetesNodeService;\n\n this.KubernetesApplicationDeploymentTypes = KubernetesApplicationDeploymentTypes;\n this.KubernetesApplicationTypes = KubernetesApplicationTypes;\n this.EndpointProvider = EndpointProvider;\n this.KubernetesDeploymentTypes = KubernetesDeploymentTypes;\n\n this.ApplicationDataAccessPolicies = KubernetesApplicationDataAccessPolicies;\n this.KubernetesServiceTypes = KubernetesServiceTypes;\n this.KubernetesPodContainerTypes = KubernetesPodContainerTypes;\n\n this.onInit = this.onInit.bind(this);\n this.getApplication = this.getApplication.bind(this);\n this.getApplicationAsync = this.getApplicationAsync.bind(this);\n this.getEvents = this.getEvents.bind(this);\n this.getEventsAsync = this.getEventsAsync.bind(this);\n this.updateApplicationKindText = this.updateApplicationKindText.bind(this);\n this.updateApplicationAsync = this.updateApplicationAsync.bind(this);\n this.redeployApplicationAsync = this.redeployApplicationAsync.bind(this);\n this.rollbackApplicationAsync = this.rollbackApplicationAsync.bind(this);\n this.copyLoadBalancerIP = this.copyLoadBalancerIP.bind(this);\n }\n\n selectTab(index) {\n this.LocalStorage.storeActiveTab('application', index);\n }\n\n showEditor() {\n this.state.showEditorTab = true;\n this.selectTab(3);\n }\n\n isSystemNamespace() {\n return KubernetesNamespaceHelper.isSystemNamespace(this.application.ResourcePool);\n }\n\n isExternalApplication() {\n return KubernetesApplicationHelper.isExternalApplication(this.application);\n }\n\n copyLoadBalancerIP() {\n this.clipboard.copyText(this.application.LoadBalancerIPAddress);\n $('#copyNotificationLB').show().fadeOut(2500);\n }\n\n copyApplicationName() {\n this.clipboard.copyText(this.application.Name);\n $('#copyNotificationApplicationName').show().fadeOut(2500);\n }\n\n hasPersistedFolders() {\n return this.application && this.application.PersistedFolders.length;\n }\n\n hasVolumeConfiguration() {\n return this.application && this.application.ConfigurationVolumes.length;\n }\n\n hasEventWarnings() {\n return this.state.eventWarningCount;\n }\n\n buildIngressRuleURL(rule) {\n const hostname = rule.Host ? rule.Host : rule.IP;\n return 'http://' + hostname + rule.Path;\n }\n\n portHasIngressRules(port) {\n return port.IngressRules.length > 0;\n }\n\n ruleCanBeDisplayed(rule) {\n return !rule.Host && !rule.IP ? false : true;\n }\n\n isStack() {\n return this.application.StackId;\n }\n\n /**\n * ROLLBACK\n */\n async rollbackApplicationAsync() {\n try {\n // await this.KubernetesApplicationService.rollback(this.application, this.formValues.SelectedRevision);\n const revision = _.nth(this.application.Revisions, -2);\n await this.KubernetesApplicationService.rollback(this.application, revision);\n this.Notifications.success('Application successfully rolled back');\n this.$state.reload(this.$state.current);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to rollback the application');\n }\n }\n\n rollbackApplication() {\n this.ModalService.confirmUpdate('Rolling back the application to a previous configuration may cause a service interruption. Do you wish to continue?', (confirmed) => {\n if (confirmed) {\n return this.$async(this.rollbackApplicationAsync);\n }\n });\n }\n /**\n * REDEPLOY\n */\n async redeployApplicationAsync() {\n try {\n const promises = _.map(this.application.Pods, (item) => this.KubernetesPodService.delete(item));\n await Promise.all(promises);\n this.Notifications.success('Application successfully redeployed');\n this.$state.reload(this.$state.current);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to redeploy the application');\n }\n }\n\n redeployApplication() {\n this.ModalService.confirmUpdate('Redeploying the application may cause a service interruption. Do you wish to continue?', (confirmed) => {\n if (confirmed) {\n return this.$async(this.redeployApplicationAsync);\n }\n });\n }\n\n /**\n * UPDATE\n */\n async updateApplicationAsync() {\n try {\n const application = angular.copy(this.application);\n application.Note = this.formValues.Note;\n await this.KubernetesApplicationService.patch(this.application, application, true);\n this.Notifications.success('Application successfully updated');\n this.$state.reload(this.$state.current);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to update application');\n }\n }\n\n updateApplication() {\n return this.$async(this.updateApplicationAsync);\n }\n\n updateApplicationKindText() {\n if (this.application.ApplicationKind === this.KubernetesDeploymentTypes.GIT) {\n this.state.appType = `git repository`;\n } else if (this.application.ApplicationKind === this.KubernetesDeploymentTypes.CONTENT) {\n this.state.appType = `manifest`;\n } else if (this.application.ApplicationKind === this.KubernetesDeploymentTypes.URL) {\n this.state.appType = `manifest`;\n }\n }\n\n /**\n * EVENTS\n */\n async getEventsAsync() {\n try {\n this.state.eventsLoading = true;\n const events = await this.KubernetesEventService.get(this.state.params.namespace);\n this.events = _.filter(\n events,\n (event) =>\n event.Involved.uid === this.application.Id ||\n event.Involved.uid === this.application.ServiceId ||\n _.find(this.application.Pods, (pod) => pod.Id === event.Involved.uid) !== undefined\n );\n this.state.eventWarningCount = KubernetesEventHelper.warningCount(this.events);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve application related events');\n } finally {\n this.state.eventsLoading = false;\n }\n }\n\n getEvents() {\n return this.$async(this.getEventsAsync);\n }\n\n /**\n * APPLICATION\n */\n async getApplicationAsync() {\n try {\n this.state.dataLoading = true;\n const [application, nodes] = await Promise.all([\n this.KubernetesApplicationService.get(this.state.params.namespace, this.state.params.name),\n this.KubernetesNodeService.get(),\n ]);\n this.application = application;\n this.allContainers = KubernetesApplicationHelper.associateAllContainersAndApplication(application);\n this.formValues.Note = this.application.Note;\n if (this.application.Note) {\n this.state.expandedNote = true;\n }\n if (this.application.CurrentRevision) {\n this.formValues.SelectedRevision = _.find(this.application.Revisions, { revision: this.application.CurrentRevision.revision });\n }\n\n this.state.useIngress = _.find(application.PublishedPorts, (p) => {\n return this.portHasIngressRules(p);\n });\n\n this.placements = computePlacements(nodes, this.application);\n this.state.placementWarning = _.find(this.placements, { AcceptsApplication: true }) ? false : true;\n\n if (application.StackId) {\n const file = await this.StackService.getStackFile(application.StackId);\n this.stackFileContent = file;\n }\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve application details');\n } finally {\n this.state.dataLoading = false;\n }\n }\n\n getApplication() {\n return this.$async(this.getApplicationAsync);\n }\n\n async onInit() {\n this.state = {\n activeTab: 0,\n currentName: this.$state.$current.name,\n showEditorTab: false,\n DisplayedPanel: 'pods',\n eventsLoading: true,\n dataLoading: true,\n viewReady: false,\n params: {\n namespace: this.$transition$.params().namespace,\n name: this.$transition$.params().name,\n },\n appType: this.KubernetesDeploymentTypes.APPLICATION_FORM,\n eventWarningCount: 0,\n placementWarning: false,\n expandedNote: false,\n useIngress: false,\n useServerMetrics: this.EndpointProvider.currentEndpoint().Kubernetes.Configuration.UseServerMetrics,\n };\n\n this.state.activeTab = this.LocalStorage.getActiveTab('application');\n\n this.formValues = {\n Note: '',\n SelectedRevision: undefined,\n };\n\n await this.getApplication();\n await this.getEvents();\n this.updateApplicationKindText();\n this.state.viewReady = true;\n }\n\n $onInit() {\n return this.$async(this.onInit);\n }\n\n $onDestroy() {\n if (this.state.currentName !== this.$state.$current.name) {\n this.LocalStorage.storeActiveTab('application', 0);\n }\n }\n}\n\nexport default KubernetesApplicationController;\nangular.module('portainer.kubernetes').controller('KubernetesApplicationController', KubernetesApplicationController);\n","import _ from 'lodash-es';\n\nangular.module('portainer.docker').controller('KubernetesApplicationPlacementsDatatableController', function ($scope, $controller, DatatableService, Authentication) {\n angular.extend(this, $controller('GenericDatatableController', { $scope: $scope }));\n this.state = Object.assign(this.state, {\n expandedItems: [],\n expandAll: false,\n });\n\n this.expandItem = function (item, expanded) {\n if (!this.itemCanExpand(item)) {\n return;\n }\n\n item.Expanded = expanded;\n if (!expanded) {\n item.Highlighted = false;\n }\n };\n\n this.itemCanExpand = function (item) {\n return !item.AcceptsApplication;\n };\n\n this.hasExpandableItems = function () {\n return _.filter(this.state.filteredDataSet, (item) => this.itemCanExpand(item)).length;\n };\n\n this.expandAll = function () {\n this.state.expandAll = !this.state.expandAll;\n _.forEach(this.state.filteredDataSet, (item) => {\n if (this.itemCanExpand(item)) {\n this.expandItem(item, this.state.expandAll);\n }\n });\n };\n\n this.$onInit = function () {\n this.isAdmin = Authentication.isAdmin();\n this.setDefaults();\n this.prepareTableFromDataset();\n\n this.state.orderBy = this.orderBy;\n var storedOrder = DatatableService.getDataTableOrder(this.tableKey);\n if (storedOrder !== null) {\n this.state.reverseOrder = storedOrder.reverse;\n this.state.orderBy = storedOrder.orderBy;\n }\n\n var textFilter = DatatableService.getDataTableTextFilters(this.tableKey);\n if (textFilter !== null) {\n this.state.textFilter = textFilter;\n this.onTextFilterChange();\n }\n\n var storedFilters = DatatableService.getDataTableFilters(this.tableKey);\n if (storedFilters !== null) {\n this.filters = storedFilters;\n }\n if (this.filters && this.filters.state) {\n this.filters.state.open = false;\n }\n\n var storedSettings = DatatableService.getDataTableSettings(this.tableKey);\n if (storedSettings !== null) {\n this.settings = storedSettings;\n this.settings.open = false;\n }\n this.onSettingsRepeaterChange();\n };\n});\n","const autoNgTemplateLoaderTemplate1 = require('./template.html');\n\nangular.module('portainer.kubernetes').component('kubernetesApplicationPlacementsDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'KubernetesApplicationPlacementsDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n refreshCallback: '<',\n loading: '<',\n removeAction: '<',\n },\n});\n","var path = 'app/kubernetes/views/applications/edit/components/placements-datatable/template.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n <div class=\\\"settings\\\">\\n <span class=\\\"setting\\\" ng-class=\\\"{ 'setting-active': $ctrl.settings.open }\\\" uib-dropdown dropdown-append-to-body auto-close=\\\"disabled\\\" is-open=\\\"$ctrl.settings.open\\\">\\n <span uib-dropdown-toggle><i class=\\\"fa fa-cog\\\" aria-hidden=\\\"true\\\"></i> Table settings</span>\\n <div class=\\\"dropdown-menu dropdown-menu-right\\\" uib-dropdown-menu>\\n <div class=\\\"tableMenu\\\">\\n <div class=\\\"menuHeader\\\">\\n Table settings\\n </div>\\n <div class=\\\"menuContent\\\">\\n <div>\\n <div class=\\\"md-checkbox\\\">\\n <input id=\\\"setting_auto_refresh\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.settings.repeater.autoRefresh\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" />\\n <label for=\\\"setting_auto_refresh\\\">Auto refresh</label>\\n </div>\\n <div ng-if=\\\"$ctrl.settings.repeater.autoRefresh\\\">\\n <label for=\\\"settings_refresh_rate\\\">\\n Refresh rate\\n </label>\\n <select id=\\\"settings_refresh_rate\\\" ng-model=\\\"$ctrl.settings.repeater.refreshRate\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" class=\\\"small-select\\\">\\n <option value=\\\"10\\\">10s</option>\\n <option value=\\\"30\\\">30s</option>\\n <option value=\\\"60\\\">1min</option>\\n <option value=\\\"120\\\">2min</option>\\n <option value=\\\"300\\\">5min</option>\\n </select>\\n <span>\\n <i id=\\\"refreshRateChange\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-top: 7px; display: none;\\\"></i>\\n </span>\\n </div>\\n </div>\\n </div>\\n <div>\\n <a type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"$ctrl.settings.open = false;\\\">Close</a>\\n </div>\\n </div>\\n </div>\\n </span>\\n </div>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n auto-focus\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th style=\\\"width: 2%;\\\">\\n <a ng-click=\\\"$ctrl.expandAll()\\\" ng-if=\\\"$ctrl.hasExpandableItems()\\\">\\n <i ng-class=\\\"{ 'fas fa-angle-down': $ctrl.state.expandAll, 'fas fa-angle-right': !$ctrl.state.expandAll }\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </th>\\n <th style=\\\"width: 98%;\\\">\\n <a ng-click=\\\"$ctrl.changeOrderBy('Name')\\\">\\n Node\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate-start=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | filter: $ctrl.isDisplayed | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit: $ctrl.tableKey))\\\"\\n ng-class=\\\"{ active: item.Checked, 'datatable-highlighted': item.Highlighted }\\\"\\n ng-click=\\\"$ctrl.expandItem(item, !item.Expanded)\\\"\\n pagination-id=\\\"$ctrl.tableKey\\\"\\n >\\n <td>\\n <a ng-if=\\\"$ctrl.itemCanExpand(item)\\\">\\n <i ng-class=\\\"{ 'fas fa-angle-down': item.Expanded, 'fas fa-angle-right': !item.Expanded }\\\" class=\\\"space-right\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n <i ng-if=\\\"item.AcceptsApplication\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\"></i>\\n <i ng-if=\\\"!item.AcceptsApplication\\\" class=\\\"fa fa-times red-icon\\\" aria-hidden=\\\"true\\\"></i>\\n </td>\\n <td>\\n {{ item.Name }}\\n </td>\\n </tr>\\n <!-- ADMIN + UNMET TAINTS -->\\n <tr\\n ng-if=\\\"$ctrl.isAdmin\\\"\\n ng-show=\\\"item.Expanded\\\"\\n ng-repeat=\\\"taint in item.UnmetTaints\\\"\\n ng-class=\\\"{ 'datatable-highlighted': item.Highlighted, 'datatable-unhighlighted': !item.Highlighted }\\\"\\n >\\n <td colspan=\\\"2\\\">\\n This application is missing a toleration for the taint <code>{{ taint.Key }}{{ taint.Value ? '=' + taint.Value : '' }}:{{ taint.Effect }}</code>\\n </td>\\n </tr>\\n <!-- !ADMIN + UNMET TAINTS -->\\n <!-- USER + UNMET TAINTS -->\\n <tr\\n ng-if=\\\"!$ctrl.isAdmin && item.UnmetTaints.length\\\"\\n ng-show=\\\"item.Expanded\\\"\\n ng-class=\\\"{ 'datatable-highlighted': item.Highlighted, 'datatable-unhighlighted': !item.Highlighted }\\\"\\n >\\n <td colspan=\\\"2\\\">\\n Placement constraint not respected for that node.\\n </td>\\n </tr>\\n <!-- ! USER + UNMET TAINTS -->\\n <!-- ADMIN + UNMET NODE SELECTOR LABELS -->\\n <tr\\n ng-if=\\\"$ctrl.isAdmin\\\"\\n ng-show=\\\"item.Expanded\\\"\\n ng-repeat=\\\"label in item.UnmatchedNodeSelectorLabels\\\"\\n ng-class=\\\"{ 'datatable-highlighted': item.Highlighted, 'datatable-unhighlighted': !item.Highlighted }\\\"\\n >\\n <td colspan=\\\"2\\\">\\n This application can only be scheduled on a node where the label <code>{{ label.key }}</code> is set to <code>{{ label.value }}</code>\\n </td>\\n </tr>\\n <!-- ! ADMIN + UNMET NODE SELECTOR LABELS -->\\n <!-- USER + UNMET NODE SELECTOR LABELS || UNMET NODE AFFINITIES -->\\n <tr\\n ng-if=\\\"!$ctrl.isAdmin && (item.UnmatchedNodeSelectorLabels.length || item.UnmatchedNodeAffinities.length)\\\"\\n ng-show=\\\"item.Expanded\\\"\\n ng-class=\\\"{ 'datatable-highlighted': item.Highlighted, 'datatable-unhighlighted': !item.Highlighted }\\\"\\n >\\n <td colspan=\\\"2\\\">\\n Placement label not respected for that node.\\n </td>\\n </tr>\\n <!-- ! USER + UNMET NODE SELECTOR LABELS || UNMET NODE AFFINITIES -->\\n <!-- ADMIN + UNMET NODE AFFINITIES -->\\n <tr\\n ng-if=\\\"$ctrl.isAdmin\\\"\\n ng-show=\\\"item.Expanded && item.UnmatchedNodeAffinities.length\\\"\\n ng-class=\\\"{ 'datatable-highlighted': item.Highlighted, 'datatable-unhighlighted': !item.Highlighted }\\\"\\n >\\n <td colspan=\\\"2\\\">\\n This application can only be scheduled on nodes respecting one of the following labels combination:\\n </td>\\n </tr>\\n <tr\\n dir-paginate-end\\n ng-if=\\\"$ctrl.isAdmin\\\"\\n ng-show=\\\"item.Expanded\\\"\\n ng-repeat=\\\"aff in item.UnmatchedNodeAffinities\\\"\\n ng-class=\\\"{ 'datatable-highlighted': item.Highlighted, 'datatable-unhighlighted': !item.Highlighted }\\\"\\n >\\n <td></td>\\n <td>\\n <code ng-repeat-start=\\\"term in aff track by $index\\\">\\n {{ term.key }} {{ term.operator }} {{ term.values | kubernetesApplicationConstraintNodeAffinityValue: term.operator }}\\n </code>\\n <span ng-repeat-end>{{ $last ? '' : ' + ' }}</span>\\n </td>\\n </tr>\\n <!-- ! ADMIN + UNMET NODE AFFINITIES -->\\n <tr ng-if=\\\"$ctrl.loading\\\">\\n <td colspan=\\\"2\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.loading && (!$ctrl.dataset || $ctrl.state.filteredDataSet.length === 0)\\\">\\n <td colspan=\\\"2\\\" class=\\\"text-center text-muted\\\">No node available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\" pagination-id=\\\"$ctrl.tableKey\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/kubernetes/views/applications/helm/helm.html';\nvar html = \"<kubernetes-view-header title=\\\"Helm details\\\" state=\\\"kubernetes.helm\\\" view-ready=\\\"$ctrl.state.viewReady\\\">\\n <a ui-sref=\\\"kubernetes.applications\\\">Applications</a> > {{ $ctrl.state.params.name }}\\n</kubernetes-view-header>\\n\\n<kubernetes-view-loading view-ready=\\\"$ctrl.state.viewReady\\\"></kubernetes-view-loading>\\n\\n<div ng-if=\\\"$ctrl.state.viewReady\\\">\\n <div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Information\\n </div>\\n <p class=\\\"text-muted\\\">\\n <i class=\\\"fa fa-flask orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n This is a first version for Helm charts, for more information see this\\n <a href=\\\"https://www.portainer.io/blog/portainer-now-with-helm-support\\\" target=\\\"_blank\\\">blog post</a>.\\n </p>\\n </div>\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-dharmachakra\\\" title-text=\\\"Release\\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <tbody class=\\\"release-table\\\">\\n <tr>\\n <td>Name</td>\\n <td>\\n {{ $ctrl.state.release.name }}\\n </td>\\n </tr>\\n <tr>\\n <td>Chart</td>\\n <td>\\n {{ $ctrl.state.release.chart }}\\n </td>\\n </tr>\\n <tr>\\n <td>App version</td>\\n <td>\\n {{ $ctrl.state.release.app_version }}\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./logs.html');\n\nangular.module('portainer.kubernetes').component('kubernetesApplicationLogsView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'KubernetesApplicationLogsController',\n controllerAs: 'ctrl',\n bindings: {\n $transition$: '<',\n },\n});\n","var path = 'app/kubernetes/views/applications/logs/logs.html';\nvar html = \"<kubernetes-view-header title=\\\"Application logs\\\" state=\\\"kubernetes.applications.application.logs\\\" view-ready=\\\"ctrl.state.viewReady\\\">\\n <a ui-sref=\\\"kubernetes.resourcePools\\\">Namespaces</a> >\\n <a ui-sref=\\\"kubernetes.resourcePools.resourcePool({ id: ctrl.application.ResourcePool })\\\">{{ ctrl.application.ResourcePool }}</a> >\\n <a ui-sref=\\\"kubernetes.applications\\\">Applications</a> >\\n <a ui-sref=\\\"kubernetes.applications.application({ name: ctrl.application.Name, namespace: ctrl.application.ResourcePool })\\\">{{ ctrl.application.Name }}</a> > Pods >\\n {{ ctrl.podName }} > Containers > {{ ctrl.containerName }} > Logs\\n</kubernetes-view-header>\\n\\n<kubernetes-view-loading view-ready=\\\"ctrl.state.viewReady\\\"></kubernetes-view-loading>\\n\\n<div ng-if=\\\"ctrl.state.viewReady\\\" style=\\\"height: 100%;\\\">\\n <div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\" autocomplete=\\\"off\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <!-- auto-refresh -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label class=\\\"control-label text-left\\\">\\n Auto-refresh\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"Automatically refresh logs every 5 seconds\\\"></portainer-tooltip>\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\"> <input type=\\\"checkbox\\\" ng-model=\\\"ctrl.state.autoRefresh\\\" ng-change=\\\"ctrl.updateAutoRefresh()\\\" /><i></i> </label>\\n </div>\\n </div>\\n <!-- !auto-refresh -->\\n <!-- search -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"logs_search\\\" class=\\\"col-sm-1 control-label text-left\\\">\\n Search\\n </label>\\n <div class=\\\"col-sm-11\\\">\\n <input\\n class=\\\"form-control\\\"\\n type=\\\"text\\\"\\n name=\\\"logs_search\\\"\\n ng-model=\\\"ctrl.state.search\\\"\\n ng-change=\\\"ctrl.state.selectedLines.length = 0;\\\"\\n placeholder=\\\"Filter...\\\"\\n auto-focus\\n />\\n </div>\\n </div>\\n <!-- !search -->\\n <!-- actions -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button class=\\\"btn btn-primary btn-sm\\\" type=\\\"button\\\" ng-click=\\\"ctrl.downloadLogs()\\\" style=\\\"margin-left: 0;\\\"><i class=\\\"fa fa-download\\\"></i> Download logs</button>\\n </div>\\n </div>\\n <!-- !actions -->\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n </div>\\n\\n <div class=\\\"row\\\" style=\\\"height: 54%;\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"height: 100%;\\\">\\n <pre\\n class=\\\"log_viewer\\\"\\n ><div ng-repeat=\\\"line in ctrl.state.filteredLogs = (ctrl.applicationLogs | filter:ctrl.state.search) track by $index\\\" class=\\\"line\\\" ng-if=\\\"line\\\"><p class=\\\"inner_line\\\">{{ line }}</p></div><div ng-if=\\\"ctrl.applicationLogs.length && !ctrl.state.filteredLogs.length\\\" class=\\\"line\\\"><p class=\\\"inner_line\\\">No log line matching the '{{ ctrl.state.search }}' filter</p></div><div ng-if=\\\"ctrl.applicationLogs.length === 0\\\" class=\\\"line\\\"><p class=\\\"inner_line\\\">No logs available</p></div></pre>\\n </div>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import angular from 'angular';\nimport _ from 'lodash-es';\n\nclass KubernetesApplicationLogsController {\n /* @ngInject */\n constructor($async, $state, $interval, Notifications, KubernetesApplicationService, KubernetesPodService, Blob, FileSaver) {\n this.$async = $async;\n this.$state = $state;\n this.$interval = $interval;\n this.Notifications = Notifications;\n this.KubernetesApplicationService = KubernetesApplicationService;\n this.KubernetesPodService = KubernetesPodService;\n this.Blob = Blob;\n this.FileSaver = FileSaver;\n\n this.onInit = this.onInit.bind(this);\n this.stopRepeater = this.stopRepeater.bind(this);\n this.getApplicationLogsAsync = this.getApplicationLogsAsync.bind(this);\n }\n\n updateAutoRefresh() {\n if (this.state.autoRefresh) {\n this.setUpdateRepeater();\n return;\n }\n\n this.stopRepeater();\n }\n\n stopRepeater() {\n if (angular.isDefined(this.repeater)) {\n this.$interval.cancel(this.repeater);\n this.repeater = null;\n }\n }\n\n setUpdateRepeater() {\n this.repeater = this.$interval(this.getApplicationLogsAsync, this.state.refreshRate);\n }\n\n downloadLogs() {\n const data = new this.Blob([_.reduce(this.applicationLogs, (acc, log) => acc + '\\n' + log, '')]);\n this.FileSaver.saveAs(data, this.podName + '_logs.txt');\n }\n\n async getApplicationLogsAsync() {\n try {\n this.applicationLogs = await this.KubernetesPodService.logs(this.application.ResourcePool, this.podName, this.containerName);\n } catch (err) {\n this.stopRepeater();\n this.Notifications.error('Failure', err, 'Unable to retrieve application logs');\n }\n }\n\n async onInit() {\n this.state = {\n autoRefresh: false,\n refreshRate: 5000, // 5 seconds\n search: '',\n viewReady: false,\n };\n\n const podName = this.$transition$.params().pod;\n const applicationName = this.$transition$.params().name;\n const namespace = this.$transition$.params().namespace;\n const containerName = this.$transition$.params().container;\n\n this.applicationLogs = [];\n this.podName = podName;\n this.containerName = containerName;\n\n try {\n const [application, applicationLogs] = await Promise.all([\n this.KubernetesApplicationService.get(namespace, applicationName),\n this.KubernetesPodService.logs(namespace, podName, containerName),\n ]);\n\n this.application = application;\n this.applicationLogs = applicationLogs;\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve application logs');\n } finally {\n this.state.viewReady = true;\n }\n }\n\n $onInit() {\n return this.$async(this.onInit);\n }\n\n $onDestroy() {\n this.stopRepeater();\n }\n}\n\nexport default KubernetesApplicationLogsController;\nangular.module('portainer.kubernetes').controller('KubernetesApplicationLogsController', KubernetesApplicationLogsController);\n","const autoNgTemplateLoaderTemplate1 = require('./stats.html');\n\nangular.module('portainer.kubernetes').component('kubernetesApplicationStatsView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'KubernetesApplicationStatsController',\n controllerAs: 'ctrl',\n bindings: {\n $transition$: '<',\n },\n});\n","var path = 'app/kubernetes/views/applications/stats/stats.html';\nvar html = \"<kubernetes-view-header title=\\\"Application stats\\\" state=\\\"kubernetes.applications.application.stats\\\" view-ready=\\\"ctrl.state.viewReady\\\">\\n <a ui-sref=\\\"kubernetes.resourcePools\\\">Namespaces</a> >\\n <a ui-sref=\\\"kubernetes.resourcePools.resourcePool({ id: ctrl.state.transition.namespace })\\\">{{ ctrl.state.transition.namespace }}</a> >\\n <a ui-sref=\\\"kubernetes.applications\\\">Applications</a> >\\n <a ui-sref=\\\"kubernetes.applications.application({ name: ctrl.state.transition.applicationName, namespace: ctrl.state.transition.namespace })\\\">{{\\n ctrl.state.transition.applicationName\\n }}</a>\\n > Pods > {{ ctrl.state.transition.podName }} > Containers > {{ ctrl.state.transition.containerName }} > Stats\\n</kubernetes-view-header>\\n\\n<kubernetes-view-loading view-ready=\\\"ctrl.state.viewReady\\\"></kubernetes-view-loading>\\n\\n<div ng-if=\\\"ctrl.state.viewReady\\\">\\n <information-panel ng-if=\\\"!ctrl.state.getMetrics\\\" title-text=\\\"Unable to retrieve container metrics\\\">\\n <span class=\\\"small text-muted\\\">\\n <i class=\\\"fa fa-exclamation-circle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Portainer was unable to retrieve any metrics associated to that container. Please contact your administrator to ensure that the Kubernetes metrics feature is properly\\n configured.\\n </span>\\n </information-panel>\\n <div class=\\\"row\\\" ng-if=\\\"ctrl.state.getMetrics\\\">\\n <div class=\\\"col-md-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-info-circle\\\" title-text=\\\"About statistics\\\"> </rd-widget-header>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\">\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <span class=\\\"small text-muted\\\">\\n This view displays real-time statistics about the container <b>{{ ctrl.state.transition.containerName | trimcontainername }}</b\\n >.\\n </span>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\">\\n <label for=\\\"refreshRate\\\" class=\\\"col-sm-3 col-md-2 col-lg-2 margin-sm-top control-label text-left\\\">\\n Refresh rate\\n </label>\\n <div class=\\\"col-sm-3 col-md-2\\\">\\n <select id=\\\"refreshRate\\\" ng-model=\\\"ctrl.state.refreshRate\\\" ng-change=\\\"ctrl.changeUpdateRepeater()\\\" class=\\\"form-control\\\">\\n <option value=\\\"30\\\">30s</option>\\n <option value=\\\"60\\\">60s</option>\\n </select>\\n </div>\\n <span>\\n <i id=\\\"refreshRateChange\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-top: 7px; display: none;\\\"></i>\\n </span>\\n </div>\\n <div class=\\\"form-group\\\" ng-if=\\\"ctrl.state.networkStatsUnavailable\\\">\\n <div class=\\\"col-sm-12\\\">\\n <span class=\\\"small text-muted\\\"> <i class=\\\"fa fa-exclamation-triangle orange-icon\\\" aria-hidden=\\\"true\\\"></i> Network stats are unavailable for this container. </span>\\n </div>\\n </div>\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n </div>\\n\\n <div class=\\\"row\\\" ng-if=\\\"ctrl.state.getMetrics\\\">\\n <div class=\\\"col-lg-6 col-md-12 col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-chart-area\\\" title-text=\\\"Memory usage\\\"></rd-widget-header>\\n <rd-widget-body>\\n <div class=\\\"chart-container\\\" style=\\\"position: relative;\\\">\\n <canvas id=\\\"memoryChart\\\" width=\\\"770\\\" height=\\\"300\\\"></canvas>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n <div class=\\\"col-lg-6 col-md-12 col-sm-12\\\" ng-if=\\\"!ctrl.state.networkStatsUnavailable\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-chart-area\\\" title-text=\\\"CPU usage\\\"></rd-widget-header>\\n <rd-widget-body>\\n <div class=\\\"chart-container\\\" style=\\\"position: relative;\\\">\\n <canvas id=\\\"cpuChart\\\" width=\\\"770\\\" height=\\\"300\\\"></canvas>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import angular from 'angular';\nimport moment from 'moment';\nimport _ from 'lodash-es';\nimport filesizeParser from 'filesize-parser';\nimport KubernetesResourceReservationHelper from 'Kubernetes/helpers/resourceReservationHelper';\nimport KubernetesPodConverter from 'Kubernetes/pod/converter';\n\nclass KubernetesApplicationStatsController {\n /* @ngInject */\n constructor($async, $state, $interval, $document, Notifications, KubernetesPodService, KubernetesNodeService, KubernetesMetricsService, ChartService) {\n this.$async = $async;\n this.$state = $state;\n this.$interval = $interval;\n this.$document = $document;\n this.Notifications = Notifications;\n this.KubernetesPodService = KubernetesPodService;\n this.KubernetesNodeService = KubernetesNodeService;\n this.KubernetesMetricsService = KubernetesMetricsService;\n this.ChartService = ChartService;\n\n this.onInit = this.onInit.bind(this);\n }\n\n changeUpdateRepeater() {\n var cpuChart = this.cpuChart;\n var memoryChart = this.memoryChart;\n\n this.stopRepeater();\n this.setUpdateRepeater(cpuChart, memoryChart);\n $('#refreshRateChange').show();\n $('#refreshRateChange').fadeOut(1500);\n }\n\n updateCPUChart() {\n const label = moment(this.stats.read).format('HH:mm:ss');\n\n this.ChartService.UpdateCPUChart(label, this.stats.CPUUsage, this.cpuChart);\n }\n\n updateMemoryChart() {\n const label = moment(this.stats.read).format('HH:mm:ss');\n\n this.ChartService.UpdateMemoryChart(label, this.stats.MemoryUsage, this.stats.MemoryCache, this.memoryChart);\n }\n\n stopRepeater() {\n var repeater = this.repeater;\n if (angular.isDefined(repeater)) {\n this.$interval.cancel(repeater);\n repeater = undefined;\n }\n }\n\n setUpdateRepeater() {\n const refreshRate = this.state.refreshRate;\n\n this.repeater = this.$interval(async () => {\n try {\n await this.getStats();\n\n this.updateCPUChart();\n this.updateMemoryChart();\n } catch (error) {\n this.stopRepeater();\n this.Notifications.error('Failure', error);\n }\n }, refreshRate * 1000);\n }\n\n initCharts() {\n const cpuChartCtx = $('#cpuChart');\n const cpuChart = this.ChartService.CreateCPUChart(cpuChartCtx);\n this.cpuChart = cpuChart;\n\n const memoryChartCtx = $('#memoryChart');\n const memoryChart = this.ChartService.CreateMemoryChart(memoryChartCtx);\n this.memoryChart = memoryChart;\n\n this.updateCPUChart();\n this.updateMemoryChart();\n this.setUpdateRepeater();\n }\n\n getStats() {\n return this.$async(async () => {\n try {\n const stats = await this.KubernetesMetricsService.getPod(this.state.transition.namespace, this.state.transition.podName);\n const container = _.find(stats.containers, { name: this.state.transition.containerName });\n if (container) {\n const memory = filesizeParser(container.usage.memory);\n const cpu = KubernetesResourceReservationHelper.parseCPU(container.usage.cpu);\n this.stats = {\n read: stats.timestamp,\n preread: '',\n MemoryCache: 0,\n MemoryUsage: memory,\n NumProcs: '',\n isWindows: false,\n PreviousCPUTotalUsage: 0,\n CPUUsage: (cpu / this.nodeCPU) * 100,\n CPUCores: 0,\n };\n }\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve application stats');\n }\n });\n }\n\n $onDestroy() {\n this.stopRepeater();\n }\n\n async onInit() {\n this.state = {\n autoRefresh: false,\n refreshRate: '30',\n viewReady: false,\n transition: {\n podName: this.$transition$.params().pod,\n containerName: this.$transition$.params().container,\n namespace: this.$transition$.params().namespace,\n applicationName: this.$transition$.params().name,\n },\n getMetrics: false,\n };\n\n try {\n await this.KubernetesMetricsService.getPod(this.state.transition.namespace, this.state.transition.podName);\n } catch (error) {\n this.state.getMetrics = false;\n this.state.viewReady = true;\n return;\n }\n\n try {\n const podRaw = await this.KubernetesPodService.get(this.state.transition.namespace, this.state.transition.podName);\n const pod = KubernetesPodConverter.apiToModel(podRaw.Raw);\n if (pod) {\n const node = await this.KubernetesNodeService.get(pod.Node);\n this.nodeCPU = node.CPU;\n } else {\n throw new Error('Unable to find pod');\n }\n await this.getStats();\n this.state.getMetrics = true;\n\n this.$document.ready(() => {\n this.initCharts();\n });\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve application stats');\n } finally {\n this.state.viewReady = true;\n }\n }\n\n $onInit() {\n return this.$async(this.onInit);\n }\n}\n\nexport default KubernetesApplicationStatsController;\nangular.module('portainer.kubernetes').controller('KubernetesApplicationStatsController', KubernetesApplicationStatsController);\n","const autoNgTemplateLoaderTemplate1 = require('./cluster.html');\n\nangular.module('portainer.kubernetes').component('kubernetesClusterView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'KubernetesClusterController',\n controllerAs: 'ctrl',\n bindings: {\n endpoint: '<',\n },\n});\n","var path = 'app/kubernetes/views/cluster/cluster.html';\nvar html = \"<kubernetes-view-header title=\\\"Cluster\\\" state=\\\"kubernetes.cluster\\\" view-ready=\\\"ctrl.state.viewReady\\\">\\n Cluster information\\n</kubernetes-view-header>\\n\\n<kubernetes-view-loading view-ready=\\\"ctrl.state.viewReady\\\"></kubernetes-view-loading>\\n\\n<div ng-if=\\\"ctrl.state.viewReady\\\">\\n <div class=\\\"row\\\" ng-if=\\\"ctrl.isAdmin\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <!-- resource-reservation -->\\n <form class=\\\"form-horizontal\\\" ng-if=\\\"ctrl.resourceReservation\\\">\\n <kubernetes-resource-reservation\\n description=\\\"Resource reservation represents the total amount of resource assigned to all the applications inside the cluster.\\\"\\n cpu-reservation=\\\"ctrl.resourceReservation.CPU\\\"\\n cpu-limit=\\\"ctrl.CPULimit\\\"\\n memory-reservation=\\\"ctrl.resourceReservation.Memory\\\"\\n memory-limit=\\\"ctrl.MemoryLimit\\\"\\n display-usage=\\\"ctrl.hasResourceUsageAccess()\\\"\\n cpu-usage=\\\"ctrl.resourceUsage.CPU\\\"\\n memory-usage=\\\"ctrl.resourceUsage.Memory\\\"\\n >\\n </kubernetes-resource-reservation>\\n </form>\\n <!-- !resource-reservation -->\\n\\n <!-- leader-status -->\\n <div ng-if=\\\"ctrl.systemEndpoints.length > 0\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Leader status\\n </div>\\n\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr class=\\\"text-muted\\\">\\n <td style=\\\"border-top: none; width: 25%;\\\">Component</td>\\n <td style=\\\"border-top: none; width: 25%;\\\">Leader node</td>\\n </tr>\\n <tr ng-repeat=\\\"ep in ctrl.systemEndpoints\\\">\\n <td style=\\\"width: 25%;\\\">\\n {{ ep.Name }}\\n </td>\\n <td style=\\\"width: 25%;\\\">\\n {{ ep.HolderIdentity }}\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <!-- !leader-status -->\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n </div>\\n\\n <div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <kubernetes-nodes-datatable\\n title-text=\\\"Nodes\\\"\\n title-icon=\\\"fa-hdd\\\"\\n dataset=\\\"ctrl.nodes\\\"\\n table-key=\\\"kubernetes.nodes\\\"\\n order-by=\\\"Name\\\"\\n refresh-callback=\\\"ctrl.getNodes\\\"\\n is-admin=\\\"ctrl.isAdmin\\\"\\n use-server-metrics=\\\"ctrl.state.useServerMetrics\\\"\\n ></kubernetes-nodes-datatable>\\n </div>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import angular from 'angular';\nimport _ from 'lodash-es';\nimport filesizeParser from 'filesize-parser';\nimport KubernetesResourceReservationHelper from 'Kubernetes/helpers/resourceReservationHelper';\nimport { KubernetesResourceReservation } from 'Kubernetes/models/resource-reservation/models';\n\nclass KubernetesClusterController {\n /* @ngInject */\n constructor(\n $async,\n $state,\n Authentication,\n Notifications,\n LocalStorage,\n KubernetesNodeService,\n KubernetesMetricsService,\n KubernetesApplicationService,\n KubernetesEndpointService\n ) {\n this.$async = $async;\n this.$state = $state;\n this.Authentication = Authentication;\n this.Notifications = Notifications;\n this.LocalStorage = LocalStorage;\n this.KubernetesNodeService = KubernetesNodeService;\n this.KubernetesMetricsService = KubernetesMetricsService;\n this.KubernetesApplicationService = KubernetesApplicationService;\n this.KubernetesEndpointService = KubernetesEndpointService;\n\n this.onInit = this.onInit.bind(this);\n this.getNodes = this.getNodes.bind(this);\n this.getNodesAsync = this.getNodesAsync.bind(this);\n this.getApplicationsAsync = this.getApplicationsAsync.bind(this);\n this.getEndpointsAsync = this.getEndpointsAsync.bind(this);\n this.hasResourceUsageAccess = this.hasResourceUsageAccess.bind(this);\n }\n\n async getEndpointsAsync() {\n try {\n const endpoints = await this.KubernetesEndpointService.get();\n const systemEndpoints = _.filter(endpoints, { Namespace: 'kube-system' });\n this.systemEndpoints = _.filter(systemEndpoints, (ep) => ep.HolderIdentity);\n\n const kubernetesEndpoint = _.find(endpoints, { Name: 'kubernetes' });\n if (kubernetesEndpoint && kubernetesEndpoint.Subsets) {\n const ips = _.flatten(_.map(kubernetesEndpoint.Subsets, 'Ips'));\n _.forEach(this.nodes, (node) => {\n node.Api = _.includes(ips, node.IPAddress);\n });\n }\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve environments');\n }\n }\n\n getEndpoints() {\n return this.$async(this.getEndpointsAsync);\n }\n\n async getNodesAsync() {\n try {\n const nodes = await this.KubernetesNodeService.get();\n _.forEach(nodes, (node) => (node.Memory = filesizeParser(node.Memory)));\n this.nodes = nodes;\n this.CPULimit = _.reduce(this.nodes, (acc, node) => node.CPU + acc, 0);\n this.MemoryLimit = _.reduce(this.nodes, (acc, node) => KubernetesResourceReservationHelper.megaBytesValue(node.Memory) + acc, 0);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve nodes');\n }\n }\n\n getNodes() {\n return this.$async(this.getNodesAsync);\n }\n\n async getApplicationsAsync() {\n try {\n this.state.applicationsLoading = true;\n this.applications = await this.KubernetesApplicationService.get();\n const nodeNames = _.map(this.nodes, (node) => node.Name);\n this.resourceReservation = _.reduce(\n this.applications,\n (acc, app) => {\n app.Pods = _.filter(app.Pods, (pod) => nodeNames.includes(pod.Node));\n const resourceReservation = KubernetesResourceReservationHelper.computeResourceReservation(app.Pods);\n acc.CPU += resourceReservation.CPU;\n acc.Memory += resourceReservation.Memory;\n return acc;\n },\n new KubernetesResourceReservation()\n );\n this.resourceReservation.Memory = KubernetesResourceReservationHelper.megaBytesValue(this.resourceReservation.Memory);\n\n if (this.hasResourceUsageAccess()) {\n await this.getResourceUsage(this.endpoint.Id);\n }\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve applications');\n } finally {\n this.state.applicationsLoading = false;\n }\n }\n\n getApplications() {\n return this.$async(this.getApplicationsAsync);\n }\n\n async getResourceUsage(endpointId) {\n try {\n const nodeMetrics = await this.KubernetesMetricsService.getNodes(endpointId);\n const resourceUsageList = nodeMetrics.items.map((i) => i.usage);\n const clusterResourceUsage = resourceUsageList.reduce((total, u) => {\n total.CPU += KubernetesResourceReservationHelper.parseCPU(u.cpu);\n total.Memory += KubernetesResourceReservationHelper.megaBytesValue(u.memory);\n return total;\n }, new KubernetesResourceReservation());\n this.resourceUsage = clusterResourceUsage;\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve cluster resource usage');\n }\n }\n\n /**\n * Check if resource usage stats can be displayed\n * @returns {boolean}\n */\n hasResourceUsageAccess() {\n return this.isAdmin && this.state.useServerMetrics;\n }\n\n async onInit() {\n this.isAdmin = this.Authentication.isAdmin();\n const useServerMetrics = this.endpoint.Kubernetes.Configuration.UseServerMetrics;\n\n this.state = {\n applicationsLoading: true,\n viewReady: false,\n useServerMetrics,\n };\n\n await this.getNodes();\n if (this.isAdmin) {\n await this.getEndpoints();\n await this.getApplications();\n }\n\n this.state.viewReady = true;\n }\n\n $onInit() {\n return this.$async(this.onInit);\n }\n}\n\nexport default KubernetesClusterController;\nangular.module('portainer.kubernetes').controller('KubernetesClusterController', KubernetesClusterController);\n","const autoNgTemplateLoaderTemplate1 = require('./node.html');\n\nangular.module('portainer.kubernetes').component('kubernetesNodeView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'KubernetesNodeController',\n controllerAs: 'ctrl',\n bindings: {\n endpoint: '<',\n $transition$: '<',\n },\n});\n","var path = 'app/kubernetes/views/cluster/node/node.html';\nvar html = \"<kubernetes-view-header title=\\\"Node details\\\" state=\\\"kubernetes.cluster.node\\\" view-ready=\\\"ctrl.state.viewReady\\\">\\n <a ui-sref=\\\"kubernetes.cluster\\\">Cluster</a> > {{ ctrl.node.Name }}\\n</kubernetes-view-header>\\n\\n<kubernetes-view-loading view-ready=\\\"ctrl.state.viewReady\\\"></kubernetes-view-loading>\\n\\n<div ng-if=\\\"ctrl.state.viewReady\\\">\\n <div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <uib-tabset active=\\\"ctrl.state.activeTab\\\" justified=\\\"true\\\" type=\\\"pills\\\">\\n <uib-tab index=\\\"0\\\" classes=\\\"btn-sm\\\" select=\\\"ctrl.selectTab(0)\\\">\\n <uib-tab-heading> <i class=\\\"fa fa-hdd space-right\\\" aria-hidden=\\\"true\\\"></i> Node </uib-tab-heading>\\n\\n <form class=\\\"form-horizontal\\\" name=\\\"kubernetesNodeUpdateForm\\\" style=\\\"padding: 20px;\\\" autocomplete=\\\"off\\\">\\n <table class=\\\"table\\\">\\n <tbody ng-if=\\\"ctrl.node\\\">\\n <tr>\\n <td>Hostname</td>\\n <td>\\n {{ ctrl.node.Name }}\\n <span class=\\\"label label-primary image-tag\\\" style=\\\"margin-left: 5px;\\\" ng-if=\\\"ctrl.node.Api\\\">api</span>\\n </td>\\n </tr>\\n <tr ng-if=\\\"ctrl.node.Api\\\">\\n <td>\\n Kubernetes API\\n </td>\\n <td>{{ ctrl.node.IPAddress }}:{{ ctrl.node.Port }}</td>\\n </tr>\\n <tr>\\n <td>Role</td>\\n <td>{{ ctrl.node.Role }}</td>\\n </tr>\\n <tr>\\n <td>Kubelet version</td>\\n <td>{{ ctrl.node.Version }}</td>\\n </tr>\\n <tr>\\n <td>Creation date</td>\\n <td>{{ ctrl.node.CreationDate | getisodate }}</td>\\n </tr>\\n <tr>\\n <td>Status</td>\\n <td>\\n <span class=\\\"label label-{{ ctrl.node.Status | kubernetesNodeStatusColor }}\\\">\\n {{ ctrl.node.Status }}\\n </span>\\n <span ng-if=\\\"ctrl.node.Status == 'Warning'\\\" class=\\\"text text-warning\\\">\\n {{ ctrl.node.Conditions | kubernetesNodeConditionsMessage }}\\n </span>\\n </td>\\n </tr>\\n <tr>\\n <td class=\\\"col-xs-3\\\">\\n Availability\\n </td>\\n <td class=\\\"col-xs-9\\\">\\n <select class=\\\"form-control\\\" name=\\\"availability\\\" style=\\\"display: inline-block; width: 16rem;\\\" ng-model=\\\"ctrl.formValues.Availability\\\">\\n <option>{{ ctrl.availabilities.ACTIVE }}</option>\\n <option>{{ ctrl.availabilities.PAUSE }}</option>\\n <option>{{ ctrl.availabilities.DRAIN }}</option>\\n </select>\\n <span class=\\\"small text-warning\\\" ng-if=\\\"ctrl.state.isDrainOperation && ctrl.formValues.Availability === ctrl.availabilities.DRAIN\\\">\\n <i class=\\\"fa fa-exclamation-circle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Cannot use this action while another node is currently being drained.\\n </span>\\n <span class=\\\"small text-warning\\\" ng-if=\\\"ctrl.state.isContainPortainer && ctrl.formValues.Availability === ctrl.availabilities.DRAIN\\\">\\n <i class=\\\"fa fa-exclamation-circle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Cannot drain a node where this Portainer instance is running.\\n </span>\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n\\n <div style=\\\"padding: 8px;\\\">\\n <kubernetes-resource-reservation\\n ng-if=\\\"ctrl.resourceReservation\\\"\\n cpu-reservation=\\\"ctrl.resourceReservation.CPU\\\"\\n cpu-usage=\\\"ctrl.resourceUsage.CPU\\\"\\n cpu-limit=\\\"ctrl.node.CPU\\\"\\n memory-reservation=\\\"ctrl.resourceReservation.Memory\\\"\\n memory-usage=\\\"ctrl.resourceUsage.Memory\\\"\\n memory-limit=\\\"ctrl.memoryLimit\\\"\\n description=\\\"Resource reservation represents the total amount of resource assigned to all the applications running on this node.\\\"\\n display-usage=\\\"ctrl.hasResourceUsageAccess()\\\"\\n >\\n </kubernetes-resource-reservation>\\n </div>\\n\\n <div style=\\\"padding: 8px;\\\">\\n <!-- #region labels -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Labels\\n </div>\\n\\n <div style=\\\"margin-bottom: 10px;\\\">\\n <span class=\\\"label label-default interactive\\\" ng-click=\\\"ctrl.addLabel()\\\"> <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add label </span>\\n </div>\\n\\n <div class=\\\"form-inline\\\" ng-repeat=\\\"label in ctrl.formValues.Labels\\\" style=\\\"padding: 3px 0 3px 0;\\\">\\n <div class=\\\"input-group col-sm-3 input-group-sm\\\" ng-class=\\\"{ striked: label.NeedsDeletion }\\\">\\n <span class=\\\"input-group-addon\\\">Key</span>\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n name=\\\"label_key_{{ $index }}\\\"\\n ng-model=\\\"label.Key\\\"\\n ng-change=\\\"ctrl.onChangeLabelKey($index)\\\"\\n ng-disabled=\\\"ctrl.isSystemLabel($index)\\\"\\n required\\n />\\n </div>\\n <div class=\\\"input-group col-sm-3 input-group-sm\\\" ng-class=\\\"{ striked: label.NeedsDeletion }\\\">\\n <span class=\\\"input-group-addon\\\">Value</span>\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n name=\\\"label_value_{{ $index }}\\\"\\n ng-change=\\\"ctrl.onChangeLabel($index)\\\"\\n ng-model=\\\"label.Value\\\"\\n ng-disabled=\\\"ctrl.isSystemLabel($index)\\\"\\n />\\n </div>\\n <div class=\\\"input-group col-sm-1 input-group-sm\\\">\\n <div style=\\\"white-space: nowrap;\\\">\\n <button ng-if=\\\"!ctrl.isSystemLabel($index) && !label.NeedsDeletion\\\" class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"ctrl.removeLabel($index)\\\">\\n <i class=\\\"fa fa-times\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n <button ng-if=\\\"!ctrl.isSystemLabel($index) && label.NeedsDeletion\\\" class=\\\"btn btn-sm btn-primary\\\" type=\\\"button\\\" ng-click=\\\"ctrl.restoreLabel($index)\\\">\\n Restore\\n </button>\\n <span class=\\\"label label-warning label-sm image-tag\\\" ng-if=\\\"label.IsUsed && !ctrl.isSystemLabel($index)\\\" style=\\\"margin-left: 5px;\\\">used</span>\\n <span class=\\\"label label-info image-tag\\\" ng-if=\\\"ctrl.isSystemLabel($index)\\\" style=\\\"margin-left: 5px;\\\">system</span>\\n </div>\\n </div>\\n <div\\n class=\\\"small text-warning\\\"\\n style=\\\"margin-top: 5px;\\\"\\n ng-show=\\\"kubernetesNodeUpdateForm['label_key_' + $index].$invalid || ctrl.state.duplicateLabelKeys[$index] !== undefined\\\"\\n >\\n <ng-messages for=\\\"kubernetesNodeUpdateForm['label_key_' + $index].$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Label key is required.</p>\\n </ng-messages>\\n <p ng-if=\\\"ctrl.state.duplicateLabelKeys[$index] !== undefined\\\"\\n ><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This label key is already defined.</p\\n >\\n </div>\\n </div>\\n\\n <!-- #endregion -->\\n\\n <!-- #region taints -->\\n\\n <div class=\\\"col-sm-12 form-section-title\\\" style=\\\"margin-top: 20px;\\\">\\n Taints\\n </div>\\n\\n <div style=\\\"margin-bottom: 10px;\\\">\\n <span class=\\\"label label-default interactive\\\" ng-click=\\\"ctrl.addTaint()\\\"> <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add taint </span>\\n </div>\\n\\n <div class=\\\"form-inline\\\" ng-repeat=\\\"taint in ctrl.formValues.Taints\\\" style=\\\"padding: 3px 0 3px 0;\\\">\\n <div class=\\\"input-group col-sm-3 input-group-sm\\\" ng-class=\\\"{ striked: taint.NeedsDeletion }\\\">\\n <span class=\\\"input-group-addon\\\">Key</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" name=\\\"taint_key_{{ $index }}\\\" ng-model=\\\"taint.Key\\\" ng-change=\\\"ctrl.onChangeTaintKey($index)\\\" required />\\n </div>\\n <div class=\\\"input-group col-sm-3 input-group-sm\\\" ng-class=\\\"{ striked: taint.NeedsDeletion }\\\">\\n <span class=\\\"input-group-addon\\\">Value</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" name=\\\"taint_value_{{ $index }}\\\" ng-model=\\\"taint.Value\\\" ng-change=\\\"ctrl.onChangeTaint($index)\\\" />\\n </div>\\n <div class=\\\"input-group col-sm-3 input-group-sm\\\" ng-class=\\\"{ striked: taint.NeedsDeletion }\\\">\\n <span class=\\\"input-group-addon\\\">Effect</span>\\n <select\\n id=\\\"taint_effect_{{ $index }}\\\"\\n name=\\\"taint_effect_{{ $index }}\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"taint.Effect\\\"\\n ng-change=\\\"ctrl.onChangeTaint($index)\\\"\\n ;\\n ng-options=\\\"effect as effect for effect in ctrl.availableEffects\\\"\\n ></select>\\n </div>\\n <div class=\\\"input-group col-sm-1 input-group-sm\\\">\\n <div>\\n <button ng-if=\\\"!taint.NeedsDeletion\\\" class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"ctrl.removeTaint($index)\\\">\\n <i class=\\\"fa fa-times\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n <button ng-if=\\\"taint.NeedsDeletion\\\" class=\\\"btn btn-sm btn-primary\\\" type=\\\"button\\\" ng-click=\\\"ctrl.restoreTaint($index)\\\">\\n Restore\\n </button>\\n </div>\\n </div>\\n <div\\n class=\\\"small text-warning\\\"\\n style=\\\"margin-top: 5px;\\\"\\n ng-show=\\\"kubernetesNodeUpdateForm['taint_key_' + $index].$invalid || ctrl.state.duplicateTaintKeys[$index] !== undefined\\\"\\n >\\n <ng-messages for=\\\"kubernetesNodeUpdateForm['taint_key_' + $index].$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Taint key is required.</p>\\n </ng-messages>\\n <p ng-if=\\\"ctrl.state.duplicateTaintKeys[$index] !== undefined\\\"\\n ><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This taint key is already defined.</p\\n >\\n </div>\\n </div>\\n\\n <!-- #endregion -->\\n\\n <!-- #region actions -->\\n\\n <div class=\\\"col-sm-12 form-section-title\\\" style=\\\"margin-top: 20px;\\\">\\n Actions\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n class=\\\"btn btn-primary btn-sm\\\"\\n type=\\\"button\\\"\\n style=\\\"margin-left: 0;\\\"\\n ng-click=\\\"ctrl.updateNode()\\\"\\n ng-disabled=\\\"kubernetesNodeUpdateForm.$invalid || !ctrl.isFormValid()\\\"\\n >\\n Update node\\n </button>\\n <button class=\\\"btn btn-default btn-sm\\\" type=\\\"button\\\" ng-click=\\\"ctrl.resetFormValues()\\\" ng-disabled=\\\"ctrl.isNoChangesMade()\\\">\\n Cancel\\n </button>\\n </div>\\n </div>\\n\\n <!-- #endregion -->\\n </div>\\n </form>\\n </uib-tab>\\n <uib-tab index=\\\"1\\\" classes=\\\"btn-sm\\\" select=\\\"ctrl.selectTab(1)\\\">\\n <uib-tab-heading>\\n <i class=\\\"fa fa-history space-right\\\" aria-hidden=\\\"true\\\"></i> Events\\n <div ng-if=\\\"ctrl.hasEventWarnings()\\\">\\n <i class=\\\"fa fa-exclamation-circle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n {{ ctrl.state.eventWarningCount }} warning(s)\\n </div>\\n </uib-tab-heading>\\n <kubernetes-events-datatable\\n title-text=\\\"Events\\\"\\n title-icon=\\\"fa-history\\\"\\n dataset=\\\"ctrl.events\\\"\\n table-key=\\\"kubernetes.node.events\\\"\\n order-by=\\\"Date\\\"\\n reverse-order=\\\"true\\\"\\n loading=\\\"ctrl.state.eventsLoading\\\"\\n refresh-callback=\\\"ctrl.getEvents\\\"\\n >\\n </kubernetes-events-datatable>\\n </uib-tab>\\n <uib-tab index=\\\"2\\\" ng-if=\\\"ctrl.node.Yaml\\\" select=\\\"ctrl.showEditor()\\\" classes=\\\"btn-sm\\\">\\n <uib-tab-heading> <i class=\\\"fa fa-code space-right\\\" aria-hidden=\\\"true\\\"></i> YAML </uib-tab-heading>\\n <div style=\\\"padding-right: 25px;\\\" ng-if=\\\"ctrl.state.showEditorTab\\\">\\n <kubernetes-yaml-inspector key=\\\"node-yaml\\\" data=\\\"ctrl.node.Yaml\\\"> </kubernetes-yaml-inspector>\\n </div>\\n </uib-tab>\\n </uib-tabset>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n </div>\\n\\n <div class=\\\"row\\\" ng-if=\\\"ctrl.applications && ctrl.applications.length > 0\\\">\\n <div class=\\\"col-sm-12\\\">\\n <kubernetes-node-applications-datatable\\n dataset=\\\"ctrl.applications\\\"\\n table-key=\\\"kubernetes.node.applications\\\"\\n order-by=\\\"Name\\\"\\n refresh-callback=\\\"ctrl.getApplications\\\"\\n loading=\\\"ctrl.state.applicationsLoading\\\"\\n title-text=\\\"Applications running on this node\\\"\\n title-icon=\\\"fa-laptop-code\\\"\\n >\\n </kubernetes-node-applications-datatable>\\n </div>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import angular from 'angular';\nimport _ from 'lodash-es';\nimport KubernetesResourceReservationHelper from 'Kubernetes/helpers/resourceReservationHelper';\nimport { KubernetesResourceReservation } from 'Kubernetes/models/resource-reservation/models';\nimport KubernetesEventHelper from 'Kubernetes/helpers/eventHelper';\nimport KubernetesNodeConverter from 'Kubernetes/node/converter';\nimport { KubernetesNodeLabelFormValues, KubernetesNodeTaintFormValues } from 'Kubernetes/node/formValues';\nimport { KubernetesNodeTaintEffects, KubernetesNodeAvailabilities } from 'Kubernetes/node/models';\nimport KubernetesFormValidationHelper from 'Kubernetes/helpers/formValidationHelper';\nimport { KubernetesNodeHelper } from 'Kubernetes/node/helper';\n\nclass KubernetesNodeController {\n /* @ngInject */\n constructor(\n $async,\n $state,\n Notifications,\n LocalStorage,\n ModalService,\n KubernetesNodeService,\n KubernetesEventService,\n KubernetesPodService,\n KubernetesApplicationService,\n KubernetesEndpointService,\n KubernetesMetricsService,\n Authentication\n ) {\n this.$async = $async;\n this.$state = $state;\n this.Notifications = Notifications;\n this.LocalStorage = LocalStorage;\n this.ModalService = ModalService;\n this.KubernetesNodeService = KubernetesNodeService;\n this.KubernetesEventService = KubernetesEventService;\n this.KubernetesPodService = KubernetesPodService;\n this.KubernetesApplicationService = KubernetesApplicationService;\n this.KubernetesEndpointService = KubernetesEndpointService;\n this.KubernetesMetricsService = KubernetesMetricsService;\n this.Authentication = Authentication;\n\n this.onInit = this.onInit.bind(this);\n this.getNodesAsync = this.getNodesAsync.bind(this);\n this.getEvents = this.getEvents.bind(this);\n this.getEventsAsync = this.getEventsAsync.bind(this);\n this.getApplicationsAsync = this.getApplicationsAsync.bind(this);\n this.getEndpointsAsync = this.getEndpointsAsync.bind(this);\n this.updateNodeAsync = this.updateNodeAsync.bind(this);\n this.drainNodeAsync = this.drainNodeAsync.bind(this);\n this.hasResourceUsageAccess = this.hasResourceUsageAccess.bind(this);\n this.getNodeUsageAsync = this.getNodeUsageAsync.bind(this);\n }\n\n selectTab(index) {\n this.LocalStorage.storeActiveTab('node', index);\n }\n\n /* #region taint */\n\n onChangeTaintKey(index) {\n this.state.duplicateTaintKeys = KubernetesFormValidationHelper.getDuplicates(\n _.map(this.formValues.Taints, (taint) => {\n if (taint.NeedsDeletion) {\n return undefined;\n }\n return taint.Key;\n })\n );\n this.state.hasDuplicateTaintKeys = Object.keys(this.state.duplicateTaintKeys).length > 0;\n this.onChangeTaint(index);\n }\n\n onChangeTaint(index) {\n if (this.formValues.Taints[index]) {\n this.formValues.Taints[index].IsChanged = true;\n }\n }\n\n addTaint() {\n const taint = new KubernetesNodeTaintFormValues();\n taint.IsNew = true;\n taint.Effect = KubernetesNodeTaintEffects.NOSCHEDULE;\n this.formValues.Taints.push(taint);\n }\n\n removeTaint(index) {\n const taint = this.formValues.Taints[index];\n if (taint.IsNew) {\n this.formValues.Taints.splice(index, 1);\n } else {\n taint.NeedsDeletion = true;\n }\n this.onChangeTaintKey();\n }\n\n restoreTaint(index) {\n this.formValues.Taints[index].NeedsDeletion = false;\n this.onChangeTaintKey();\n }\n\n computeTaintsWarning() {\n return _.filter(this.formValues.Taints, (taint) => {\n return taint.Effect === KubernetesNodeTaintEffects.NOEXECUTE && (taint.IsNew || taint.IsChanged);\n }).length;\n }\n\n /* #endregion */\n\n /* #region label */\n\n onChangeLabelKey(index) {\n this.state.duplicateLabelKeys = KubernetesFormValidationHelper.getDuplicates(\n _.map(this.formValues.Labels, (label) => {\n if (label.NeedsDeletion) {\n return undefined;\n }\n return label.Key;\n })\n );\n this.state.hasDuplicateLabelKeys = Object.keys(this.state.duplicateLabelKeys).length > 0;\n this.onChangeLabel(index);\n }\n\n onChangeLabel(index) {\n if (this.formValues.Labels[index]) {\n this.formValues.Labels[index].IsChanged = true;\n }\n }\n\n addLabel() {\n const label = new KubernetesNodeLabelFormValues();\n label.IsNew = true;\n this.formValues.Labels.push(label);\n }\n\n removeLabel(index) {\n const label = this.formValues.Labels[index];\n if (label.IsNew) {\n this.formValues.Labels.splice(index, 1);\n } else {\n label.NeedsDeletion = true;\n }\n this.onChangeLabelKey();\n }\n\n restoreLabel(index) {\n this.formValues.Labels[index].NeedsDeletion = false;\n this.onChangeLabelKey();\n }\n\n isSystemLabel(index) {\n return KubernetesNodeHelper.isSystemLabel(this.formValues.Labels[index]);\n }\n\n computeLabelsWarning() {\n return _.filter(this.formValues.Labels, (label) => {\n return label.IsUsed && (label.NeedsDeletion || label.IsChanged);\n }).length;\n }\n\n /* #endregion */\n\n /* #region cordon */\n\n computeCordonWarning() {\n return this.formValues.Availability === this.availabilities.PAUSE;\n }\n\n /* #endregion */\n\n /* #region drain */\n\n computeDrainWarning() {\n return this.formValues.Availability === this.availabilities.DRAIN;\n }\n\n async drainNodeAsync() {\n const pods = _.flatten(_.map(this.applications, (app) => app.Pods));\n let actionCount = pods.length;\n for (const pod of pods) {\n try {\n await this.KubernetesPodService.eviction(pod);\n this.Notifications.success('Pod successfully evicted', pod.Name);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to evict pod');\n this.formValues.Availability = this.availabilities.PAUSE;\n await this.KubernetesNodeService.patch(this.node, this.formValues);\n } finally {\n --actionCount;\n if (actionCount === 0) {\n this.formValues.Availability = this.availabilities.PAUSE;\n await this.KubernetesNodeService.patch(this.node, this.formValues);\n }\n }\n }\n }\n\n drainNode() {\n return this.$async(this.drainNodeAsync);\n }\n\n /* #endregion */\n\n /* #region actions */\n\n isNoChangesMade() {\n const newNode = KubernetesNodeConverter.formValuesToNode(this.node, this.formValues);\n const payload = KubernetesNodeConverter.patchPayload(this.node, newNode);\n return !payload.length;\n }\n\n isDrainError() {\n return (this.state.isDrainOperation || this.state.isContainPortainer) && this.formValues.Availability === this.availabilities.DRAIN;\n }\n\n isFormValid() {\n return !this.state.hasDuplicateTaintKeys && !this.state.hasDuplicateLabelKeys && !this.isNoChangesMade() && !this.isDrainError();\n }\n\n resetFormValues() {\n this.formValues = KubernetesNodeConverter.nodeToFormValues(this.node);\n }\n\n /* #endregion */\n\n async getEndpointsAsync() {\n try {\n const endpoints = await this.KubernetesEndpointService.get();\n this.endpoint = _.find(endpoints, { Name: 'kubernetes' });\n if (this.endpoint && this.endpoint.Subsets) {\n _.forEach(this.endpoint.Subsets, (subset) => {\n return _.forEach(subset.Ips, (ip) => {\n if (ip === this.node.IPAddress) {\n this.node.Api = true;\n this.node.Port = subset.Port;\n return false;\n }\n });\n });\n }\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve environments');\n }\n }\n\n getEndpoints() {\n return this.$async(this.getEndpointsAsync);\n }\n\n async updateNodeAsync() {\n try {\n this.node = await this.KubernetesNodeService.patch(this.node, this.formValues);\n if (this.formValues.Availability === 'Drain') {\n await this.drainNode();\n }\n this.Notifications.success('Node updated successfully');\n this.$state.reload(this.$state.current);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to update node');\n }\n }\n\n updateNode() {\n const taintsWarning = this.computeTaintsWarning();\n const labelsWarning = this.computeLabelsWarning();\n const cordonWarning = this.computeCordonWarning();\n const drainWarning = this.computeDrainWarning();\n\n if (taintsWarning && !labelsWarning) {\n this.ModalService.confirmUpdate(\n 'Changes to taints will immediately deschedule applications running on this node without the corresponding tolerations. Do you wish to continue?',\n (confirmed) => {\n if (confirmed) {\n return this.$async(this.updateNodeAsync);\n }\n }\n );\n } else if (!taintsWarning && labelsWarning) {\n this.ModalService.confirmUpdate(\n 'Removing or changing a label that is used might prevent applications from being scheduled on this node in the future. Do you wish to continue?',\n (confirmed) => {\n if (confirmed) {\n return this.$async(this.updateNodeAsync);\n }\n }\n );\n } else if (taintsWarning && labelsWarning) {\n this.ModalService.confirmUpdate(\n 'Changes to taints will immediately deschedule applications running on this node without the corresponding tolerations.<br/></br/>Removing or changing a label that is used might prevent applications from scheduling on this node in the future.\\n\\nDo you wish to continue?',\n (confirmed) => {\n if (confirmed) {\n return this.$async(this.updateNodeAsync);\n }\n }\n );\n } else if (cordonWarning) {\n this.ModalService.confirmUpdate(\n 'Marking this node as unschedulable will effectively cordon the node and prevent any new workload from being scheduled on that node. Are you sure?',\n (confirmed) => {\n if (confirmed) {\n return this.$async(this.updateNodeAsync);\n }\n }\n );\n } else if (drainWarning) {\n this.ModalService.confirmUpdate(\n 'Draining this node will cause all workloads to be evicted from that node. This might lead to some service interruption. Are you sure?',\n (confirmed) => {\n if (confirmed) {\n return this.$async(this.updateNodeAsync);\n }\n }\n );\n } else {\n return this.$async(this.updateNodeAsync);\n }\n }\n\n async getNodesAsync() {\n try {\n this.state.dataLoading = true;\n const nodeName = this.$transition$.params().name;\n this.nodes = await this.KubernetesNodeService.get();\n this.node = _.find(this.nodes, { Name: nodeName });\n this.state.isDrainOperation = _.find(this.nodes, { Availability: this.availabilities.DRAIN });\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve node');\n } finally {\n this.state.dataLoading = false;\n }\n }\n\n getNodes() {\n return this.$async(this.getNodesAsync);\n }\n\n hasResourceUsageAccess() {\n return this.state.isAdmin && this.state.useServerMetrics;\n }\n\n async getNodeUsageAsync() {\n try {\n const nodeName = this.$transition$.params().name;\n const node = await this.KubernetesMetricsService.getNode(nodeName);\n this.resourceUsage = new KubernetesResourceReservation();\n this.resourceUsage.CPU = KubernetesResourceReservationHelper.parseCPU(node.usage.cpu);\n this.resourceUsage.Memory = KubernetesResourceReservationHelper.megaBytesValue(node.usage.memory);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve node resource usage');\n }\n }\n\n getNodeUsage() {\n return this.$async(this.getNodeUsageAsync);\n }\n\n hasEventWarnings() {\n return this.state.eventWarningCount;\n }\n\n async getEventsAsync() {\n try {\n this.state.eventsLoading = true;\n const events = await this.KubernetesEventService.get();\n this.events = events.filter((item) => item.Involved.kind === 'Node');\n this.state.eventWarningCount = KubernetesEventHelper.warningCount(this.events);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve node events');\n } finally {\n this.state.eventsLoading = false;\n }\n }\n\n getEvents() {\n return this.$async(this.getEventsAsync);\n }\n\n showEditor() {\n this.state.showEditorTab = true;\n this.selectTab(2);\n }\n\n async getApplicationsAsync() {\n try {\n this.state.applicationsLoading = true;\n this.applications = await this.KubernetesApplicationService.get();\n\n this.resourceReservation = new KubernetesResourceReservation();\n this.applications = _.map(this.applications, (app) => {\n app.Pods = _.filter(app.Pods, (pod) => pod.Node === this.node.Name);\n return app;\n });\n this.applications = _.filter(this.applications, (app) => app.Pods.length !== 0);\n this.applications = _.map(this.applications, (app) => {\n const resourceReservation = KubernetesResourceReservationHelper.computeResourceReservation(app.Pods);\n app.CPU = resourceReservation.CPU;\n app.Memory = resourceReservation.Memory;\n this.resourceReservation.CPU += resourceReservation.CPU;\n this.resourceReservation.Memory += resourceReservation.Memory;\n return app;\n });\n this.resourceReservation.Memory = KubernetesResourceReservationHelper.megaBytesValue(this.resourceReservation.Memory);\n this.memoryLimit = KubernetesResourceReservationHelper.megaBytesValue(this.node.Memory);\n this.state.isContainPortainer = _.find(this.applications, { ApplicationName: 'portainer' });\n\n if (this.hasResourceUsageAccess()) {\n await this.getNodeUsage();\n }\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve applications');\n } finally {\n this.state.applicationsLoading = false;\n }\n }\n\n getApplications() {\n return this.$async(this.getApplicationsAsync);\n }\n\n async onInit() {\n this.availabilities = KubernetesNodeAvailabilities;\n\n this.state = {\n isAdmin: this.Authentication.isAdmin(),\n activeTab: this.LocalStorage.getActiveTab('node'),\n currentName: this.$state.$current.name,\n dataLoading: true,\n eventsLoading: true,\n applicationsLoading: true,\n showEditorTab: false,\n viewReady: false,\n eventWarningCount: 0,\n duplicateTaintKeys: [],\n hasDuplicateTaintKeys: false,\n duplicateLabelKeys: [],\n hasDuplicateLabelKeys: false,\n isDrainOperation: false,\n isContainPortainer: false,\n useServerMetrics: this.endpoint.Kubernetes.Configuration.UseServerMetrics,\n };\n\n await this.getNodes();\n await this.getEvents();\n await this.getApplications();\n await this.getEndpoints();\n\n this.availableEffects = _.values(KubernetesNodeTaintEffects);\n this.formValues = KubernetesNodeConverter.nodeToFormValues(this.node);\n this.formValues.Labels = KubernetesNodeHelper.computeUsedLabels(this.applications, this.formValues.Labels);\n this.formValues.Labels = KubernetesNodeHelper.reorderLabels(this.formValues.Labels);\n\n this.state.viewReady = true;\n }\n\n $onInit() {\n return this.$async(this.onInit);\n }\n\n $onDestroy() {\n if (this.state.currentName !== this.$state.$current.name) {\n this.LocalStorage.storeActiveTab('node', 0);\n }\n }\n}\n\nexport default KubernetesNodeController;\nangular.module('portainer.kubernetes').controller('KubernetesNodeController', KubernetesNodeController);\n","const autoNgTemplateLoaderTemplate1 = require('./stats.html');\n\nangular.module('portainer.kubernetes').component('kubernetesNodeStatsView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'KubernetesNodeStatsController',\n controllerAs: 'ctrl',\n bindings: {\n $transition$: '<',\n },\n});\n","var path = 'app/kubernetes/views/cluster/node/stats/stats.html';\nvar html = \"<kubernetes-view-header title=\\\"Node stats\\\" state=\\\"kubernetes.cluster.node.stats\\\" view-ready=\\\"ctrl.state.viewReady\\\">\\n <a ui-sref=\\\"kubernetes.cluster\\\">Cluster</a> > <a ui-sref=\\\"kubernetes.cluster.node({name: ctrl.state.transition.nodeName})\\\"> {{ ctrl.state.transition.nodeName }} </a> >\\n {{ ctrl.state.transition.nodeName }}\\n</kubernetes-view-header>\\n\\n<kubernetes-view-loading view-ready=\\\"ctrl.state.viewReady\\\"></kubernetes-view-loading>\\n\\n<div ng-if=\\\"ctrl.state.viewReady\\\">\\n <information-panel ng-if=\\\"!ctrl.state.getMetrics\\\" title-text=\\\"Unable to retrieve node metrics\\\">\\n <span class=\\\"small text-muted\\\">\\n <i class=\\\"fa fa-exclamation-circle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Portainer was unable to retrieve any metrics associated to that node. Please contact your administrator to ensure that the Kubernetes metrics feature is properly configured.\\n </span>\\n </information-panel>\\n <div class=\\\"row\\\" ng-if=\\\"ctrl.state.getMetrics\\\">\\n <div class=\\\"col-md-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-info-circle\\\" title-text=\\\"About statistics\\\"> </rd-widget-header>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\">\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <span class=\\\"small text-muted\\\">\\n This view displays real-time statistics about the node <b>{{ ctrl.state.transition.nodeName }}</b\\n >.\\n </span>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\">\\n <label for=\\\"refreshRate\\\" class=\\\"col-sm-3 col-md-2 col-lg-2 margin-sm-top control-label text-left\\\">\\n Refresh rate\\n </label>\\n <div class=\\\"col-sm-3 col-md-2\\\">\\n <select id=\\\"refreshRate\\\" ng-model=\\\"ctrl.state.refreshRate\\\" ng-change=\\\"ctrl.changeUpdateRepeater()\\\" class=\\\"form-control\\\">\\n <option value=\\\"30\\\">30s</option>\\n <option value=\\\"60\\\">60s</option>\\n </select>\\n </div>\\n <span>\\n <i id=\\\"refreshRateChange\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-top: 7px; display: none;\\\"></i>\\n </span>\\n </div>\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n </div>\\n\\n <div class=\\\"row\\\" ng-show=\\\"ctrl.state.getMetrics\\\">\\n <div class=\\\"col-lg-6 col-md-12 col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-chart-area\\\" title-text=\\\"Memory usage\\\"></rd-widget-header>\\n <rd-widget-body>\\n <div class=\\\"chart-node\\\" style=\\\"position: relative;\\\">\\n <canvas id=\\\"memoryChart\\\" width=\\\"770\\\" height=\\\"300\\\"></canvas>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n <div class=\\\"col-lg-6 col-md-12 col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-chart-area\\\" title-text=\\\"CPU usage\\\"></rd-widget-header>\\n <rd-widget-body>\\n <div class=\\\"chart-node\\\" style=\\\"position: relative;\\\">\\n <canvas id=\\\"cpuChart\\\" width=\\\"770\\\" height=\\\"300\\\"></canvas>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import angular from 'angular';\nimport moment from 'moment';\nimport filesizeParser from 'filesize-parser';\nimport KubernetesResourceReservationHelper from 'Kubernetes/helpers/resourceReservationHelper';\nimport { PORTAINER_FADEOUT } from '@/constants';\n\nclass KubernetesNodeStatsController {\n /* @ngInject */\n constructor($async, $state, $interval, $document, Notifications, KubernetesNodeService, KubernetesMetricsService, ChartService) {\n this.$async = $async;\n this.$state = $state;\n this.$interval = $interval;\n this.$document = $document;\n this.Notifications = Notifications;\n this.KubernetesNodeService = KubernetesNodeService;\n this.KubernetesMetricsService = KubernetesMetricsService;\n this.ChartService = ChartService;\n\n this.onInit = this.onInit.bind(this);\n }\n\n changeUpdateRepeater() {\n var cpuChart = this.cpuChart;\n var memoryChart = this.memoryChart;\n\n this.stopRepeater();\n this.setUpdateRepeater(cpuChart, memoryChart);\n $('#refreshRateChange').show();\n $('#refreshRateChange').fadeOut(PORTAINER_FADEOUT);\n }\n\n updateCPUChart() {\n const label = moment(this.stats.read).format('HH:mm:ss');\n this.ChartService.UpdateCPUChart(label, this.stats.CPUUsage, this.cpuChart);\n }\n\n updateMemoryChart() {\n const label = moment(this.stats.read).format('HH:mm:ss');\n this.ChartService.UpdateMemoryChart(label, this.stats.MemoryUsage, 0, this.memoryChart);\n }\n\n stopRepeater() {\n var repeater = this.repeater;\n if (angular.isDefined(repeater)) {\n this.$interval.cancel(repeater);\n this.repeater = undefined;\n }\n }\n\n setUpdateRepeater() {\n const refreshRate = this.state.refreshRate;\n\n this.repeater = this.$interval(async () => {\n try {\n await this.getStats();\n this.updateCPUChart();\n this.updateMemoryChart();\n } catch (error) {\n this.stopRepeater();\n this.Notifications.error('Failure', error);\n }\n }, refreshRate * 1000);\n }\n\n initCharts() {\n const cpuChartCtx = $('#cpuChart');\n const cpuChart = this.ChartService.CreateCPUChart(cpuChartCtx);\n this.cpuChart = cpuChart;\n\n const memoryChartCtx = $('#memoryChart');\n const memoryChart = this.ChartService.CreateMemoryChart(memoryChartCtx);\n this.memoryChart = memoryChart;\n\n this.updateCPUChart();\n this.updateMemoryChart();\n this.setUpdateRepeater();\n }\n\n getStats() {\n return this.$async(async () => {\n try {\n const stats = await this.KubernetesMetricsService.getNode(this.state.transition.nodeName);\n if (stats) {\n const memory = filesizeParser(stats.usage.memory);\n const cpu = KubernetesResourceReservationHelper.parseCPU(stats.usage.cpu);\n this.stats = {\n read: stats.creationTimestamp,\n MemoryUsage: memory,\n CPUUsage: (cpu / this.nodeCPU) * 100,\n };\n }\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve node stats');\n }\n });\n }\n\n $onDestroy() {\n this.stopRepeater();\n }\n\n async onInit() {\n this.state = {\n autoRefresh: false,\n refreshRate: '30',\n viewReady: false,\n transition: {\n nodeName: this.$transition$.params().name,\n },\n getMetrics: true,\n };\n\n try {\n const nodeMetrics = await this.KubernetesMetricsService.getNode(this.state.transition.nodeName);\n\n if (nodeMetrics) {\n const node = await this.KubernetesNodeService.get(this.state.transition.nodeName);\n this.nodeCPU = node.CPU || 1;\n\n await this.getStats();\n\n if (this.state.getMetrics) {\n this.$document.ready(() => {\n this.initCharts();\n });\n }\n } else {\n this.state.getMetrics = false;\n }\n } catch (err) {\n this.state.getMetrics = false;\n this.Notifications.error('Failure', err, 'Unable to retrieve node stats');\n } finally {\n this.state.viewReady = true;\n }\n }\n\n $onInit() {\n return this.$async(this.onInit);\n }\n}\n\nexport default KubernetesNodeStatsController;\nangular.module('portainer.kubernetes').controller('KubernetesNodeStatsController', KubernetesNodeStatsController);\n","const autoNgTemplateLoaderTemplate1 = require('./configurations.html');\n\nangular.module('portainer.kubernetes').component('kubernetesConfigurationsView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'KubernetesConfigurationsController',\n controllerAs: 'ctrl',\n});\n","var path = 'app/kubernetes/views/configurations/configurations.html';\nvar html = \"<kubernetes-view-header title=\\\"ConfigMaps & Secrets list\\\" state=\\\"kubernetes.configurations\\\" view-ready=\\\"ctrl.state.viewReady\\\">\\n ConfigMaps & Secrets\\n</kubernetes-view-header>\\n\\n<kubernetes-view-loading view-ready=\\\"ctrl.state.viewReady\\\"></kubernetes-view-loading>\\n\\n<div ng-if=\\\"ctrl.state.viewReady\\\">\\n <div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <kubernetes-configurations-datatable\\n dataset=\\\"ctrl.configurations\\\"\\n table-key=\\\"kubernetes.configurations\\\"\\n order-by=\\\"Name\\\"\\n refresh-callback=\\\"ctrl.refreshCallback\\\"\\n remove-action=\\\"ctrl.removeAction\\\"\\n ></kubernetes-configurations-datatable>\\n </div>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import angular from 'angular';\nimport KubernetesConfigurationHelper from 'Kubernetes/helpers/configurationHelper';\n\nclass KubernetesConfigurationsController {\n /* @ngInject */\n constructor($async, $state, Notifications, Authentication, KubernetesConfigurationService, KubernetesApplicationService, ModalService) {\n this.$async = $async;\n this.$state = $state;\n this.Notifications = Notifications;\n this.Authentication = Authentication;\n this.KubernetesConfigurationService = KubernetesConfigurationService;\n this.KubernetesApplicationService = KubernetesApplicationService;\n this.ModalService = ModalService;\n\n this.onInit = this.onInit.bind(this);\n this.getConfigurations = this.getConfigurations.bind(this);\n this.getConfigurationsAsync = this.getConfigurationsAsync.bind(this);\n this.getApplicationsAsync = this.getApplicationsAsync.bind(this);\n this.removeAction = this.removeAction.bind(this);\n this.removeActionAsync = this.removeActionAsync.bind(this);\n this.refreshCallback = this.refreshCallback.bind(this);\n this.refreshCallbackAsync = this.refreshCallbackAsync.bind(this);\n }\n\n async getConfigurationsAsync() {\n try {\n this.state.configurationsLoading = true;\n this.configurations = await this.KubernetesConfigurationService.get();\n KubernetesConfigurationHelper.setConfigurationsUsed(this.configurations, this.applications);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve configurations');\n } finally {\n this.state.configurationsLoading = false;\n }\n }\n\n getConfigurations() {\n return this.$async(this.getConfigurationsAsync);\n }\n\n async removeActionAsync(selectedItems) {\n let actionCount = selectedItems.length;\n for (const configuration of selectedItems) {\n try {\n await this.KubernetesConfigurationService.delete(configuration);\n this.Notifications.success('Configurations successfully removed', configuration.Name);\n const index = this.configurations.indexOf(configuration);\n this.configurations.splice(index, 1);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to remove configuration');\n } finally {\n --actionCount;\n if (actionCount === 0) {\n this.$state.reload(this.$state.current);\n }\n }\n }\n }\n\n removeAction(selectedItems) {\n this.ModalService.confirmDeletion('Do you want to remove the selected configuration(s)?', (confirmed) => {\n if (confirmed) {\n return this.$async(this.removeActionAsync, selectedItems);\n }\n });\n }\n\n async getApplicationsAsync() {\n try {\n this.state.applicationsLoading = true;\n this.applications = await this.KubernetesApplicationService.get();\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve applications');\n } finally {\n this.state.applicationsLoading = false;\n }\n }\n\n getApplications() {\n return this.$async(this.getApplicationsAsync);\n }\n\n async refreshCallbackAsync() {\n await this.getConfigurations();\n await this.getApplications();\n }\n\n refreshCallback() {\n return this.$async(this.refreshCallbackAsync);\n }\n\n async onInit() {\n this.state = {\n configurationsLoading: true,\n applicationsLoading: true,\n viewReady: false,\n isAdmin: this.Authentication.isAdmin(),\n };\n\n await this.getApplications();\n await this.getConfigurations();\n\n this.state.viewReady = true;\n }\n\n $onInit() {\n return this.$async(this.onInit);\n }\n}\n\nexport default KubernetesConfigurationsController;\nangular.module('portainer.kubernetes').controller('KubernetesConfigurationsController', KubernetesConfigurationsController);\n","const autoNgTemplateLoaderTemplate1 = require('./createConfiguration.html');\n\nangular.module('portainer.kubernetes').component('kubernetesCreateConfigurationView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'KubernetesCreateConfigurationController',\n controllerAs: 'ctrl',\n});\n","var path = 'app/kubernetes/views/configurations/create/createConfiguration.html';\nvar html = \"<kubernetes-view-header title=\\\"Create configuration\\\" state=\\\"kubernetes.configurations.new\\\" view-ready=\\\"ctrl.state.viewReady\\\">\\n <a ui-sref=\\\"kubernetes.configurations\\\">ConfigMaps and Secrets</a> > Create a configuration\\n</kubernetes-view-header>\\n\\n<kubernetes-view-loading view-ready=\\\"ctrl.state.viewReady\\\"></kubernetes-view-loading>\\n\\n<div ng-if=\\\"ctrl.state.viewReady\\\">\\n <div class=\\\"row\\\">\\n <div class=\\\"col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\" name=\\\"kubernetesConfigurationCreationForm\\\" autocomplete=\\\"off\\\">\\n <!-- name -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"configuration_name\\\" class=\\\"col-sm-1 control-label text-left\\\">Name</label>\\n <div class=\\\"col-sm-11\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n name=\\\"configuration_name\\\"\\n ng-model=\\\"ctrl.formValues.Name\\\"\\n ng-pattern=\\\"/^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$/\\\"\\n ng-change=\\\"ctrl.onChangeName()\\\"\\n placeholder=\\\"my-configuration\\\"\\n auto-focus\\n required\\n data-cy=\\\"k8sConfigCreate-nameInput\\\"\\n />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"kubernetesConfigurationCreationForm.configuration_name.$invalid || ctrl.state.alreadyExist\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"kubernetesConfigurationCreationForm.configuration_name.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n <p ng-message=\\\"pattern\\\"\\n ><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field must consist of lower case alphanumeric characters, '-' or '.', and must start and end\\n with an alphanumeric character.</p\\n >\\n </div>\\n <p ng-if=\\\"ctrl.state.alreadyExist\\\"\\n ><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> A configuration with the same name already exists inside the selected namespace.</p\\n >\\n </div>\\n </div>\\n <!-- !name -->\\n\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Namespace\\n </div>\\n\\n <!-- resource-pool -->\\n <div class=\\\"form-group\\\" ng-if=\\\"ctrl.formValues.ResourcePool\\\">\\n <label for=\\\"resource-pool-selector\\\" class=\\\"col-sm-1 control-label text-left\\\">Namespace</label>\\n <div class=\\\"col-sm-11\\\">\\n <select\\n class=\\\"form-control\\\"\\n id=\\\"resource-pool-selector\\\"\\n ng-model=\\\"ctrl.formValues.ResourcePool\\\"\\n ng-options=\\\"resourcePool.Namespace.Name for resourcePool in ctrl.resourcePools\\\"\\n ng-change=\\\"ctrl.onResourcePoolSelectionChange()\\\"\\n data-cy=\\\"k8sConfigCreate-namespaceDropdown\\\"\\n ></select>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-if=\\\"ctrl.state.resourcePoolHasQuota && ctrl.resourceQuotaCapacityExceeded()\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <i class=\\\"fa fa-exclamation-triangle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n This namespace has exhausted its resource capacity and you will not be able to deploy the configuration. Contact your administrator to expand the capacity of the\\n namespace.\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-if=\\\"!ctrl.formValues.ResourcePool\\\">\\n <div class=\\\"col-sm-12 small text-muted\\\">\\n <i class=\\\"fa fa-exclamation-circle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n You do not have access to any namespace. Contact your administrator to get access to a namespace.\\n </div>\\n </div>\\n <!-- !resource-pool -->\\n <div ng-if=\\\"ctrl.formValues.ResourcePool\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Configuration type\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12 small text-muted\\\">\\n Select the type of data that you want to save in the configuration.\\n </div>\\n </div>\\n\\n <!-- type options -->\\n <div class=\\\"form-group\\\" style=\\\"margin-bottom: 0;\\\">\\n <div class=\\\"boxselector_wrapper\\\">\\n <div>\\n <input type=\\\"radio\\\" id=\\\"type_basic\\\" ng-value=\\\"ctrl.KubernetesConfigurationTypes.CONFIGMAP\\\" ng-model=\\\"ctrl.formValues.Type\\\" />\\n <label for=\\\"type_basic\\\" data-cy=\\\"k8sConfigCreate-nonSensitiveButton\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-file-code\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n ConfigMap\\n </div>\\n <p>This configuration holds non-sensitive information</p>\\n </label>\\n </div>\\n <div>\\n <input type=\\\"radio\\\" id=\\\"type_secret\\\" ng-value=\\\"ctrl.KubernetesConfigurationTypes.SECRET\\\" ng-model=\\\"ctrl.formValues.Type\\\" />\\n <label for=\\\"type_secret\\\" data-cy=\\\"k8sConfigCreate-sensitiveButton\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-user-secret\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Secret\\n </div>\\n <p>This configuration holds sensitive information</p>\\n </label>\\n </div>\\n </div>\\n </div>\\n <!-- !type options -->\\n\\n <div class=\\\"col-sm-12 form-section-title\\\" ng-if=\\\"ctrl.formValues.Type == ctrl.KubernetesConfigurationTypes.SECRET\\\">\\n Information\\n </div>\\n <div class=\\\"form-group\\\" ng-if=\\\"ctrl.formValues.Type == ctrl.KubernetesConfigurationTypes.SECRET\\\">\\n <div class=\\\"col-sm-12 small text-muted\\\">\\n Creating a sensitive configuration will create a Kubernetes Secret of type <code>Opaque</code>. You can find more information about this in the\\n <a href=\\\"https://kubernetes.io/docs/concepts/configuration/secret/#secret-types\\\" target=\\\"_blank\\\">official documentation</a>.\\n </div>\\n </div>\\n\\n <kubernetes-configuration-data\\n ng-if=\\\"ctrl.formValues\\\"\\n form-values=\\\"ctrl.formValues\\\"\\n is-valid=\\\"ctrl.state.isDataValid\\\"\\n is-creation=\\\"true\\\"\\n is-editor-dirty=\\\"ctrl.state.isEditorDirty\\\"\\n ></kubernetes-configuration-data>\\n\\n <!-- summary -->\\n <kubernetes-summary-view\\n ng-if=\\\"!(!kubernetesConfigurationCreationForm.$valid || !ctrl.isFormValid() || ctrl.state.actionInProgress)\\\"\\n form-values=\\\"ctrl.formValues\\\"\\n ></kubernetes-summary-view>\\n </div>\\n\\n <!-- actions -->\\n <div class=\\\"col-sm-12 form-section-title\\\" style=\\\"margin-top: 10px;\\\">\\n Actions\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"!kubernetesConfigurationCreationForm.$valid || !ctrl.isFormValid() || ctrl.state.actionInProgress || !ctrl.formValues.ResourcePool\\\"\\n ng-click=\\\"ctrl.createConfiguration()\\\"\\n button-spinner=\\\"ctrl.state.actionInProgress\\\"\\n data-cy=\\\"k8sConfigCreate-CreateConfigButton\\\"\\n >\\n <span ng-hide=\\\"ctrl.state.actionInProgress\\\">Create {{ ctrl.formValues.Type | kubernetesConfigurationTypeText }}</span>\\n <span ng-show=\\\"ctrl.state.actionInProgress\\\">Creation in progress...</span>\\n </button>\\n </div>\\n </div>\\n <!-- !actions -->\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import angular from 'angular';\nimport _ from 'lodash-es';\nimport { KubernetesConfigurationFormValues, KubernetesConfigurationFormValuesEntry } from 'Kubernetes/models/configuration/formvalues';\nimport { KubernetesConfigurationTypes } from 'Kubernetes/models/configuration/models';\nimport KubernetesConfigurationHelper from 'Kubernetes/helpers/configurationHelper';\nimport KubernetesNamespaceHelper from 'Kubernetes/helpers/namespaceHelper';\n\nclass KubernetesCreateConfigurationController {\n /* @ngInject */\n constructor($async, $state, $window, ModalService, Notifications, Authentication, KubernetesConfigurationService, KubernetesResourcePoolService) {\n this.$async = $async;\n this.$state = $state;\n this.$window = $window;\n this.ModalService = ModalService;\n this.Notifications = Notifications;\n this.Authentication = Authentication;\n this.KubernetesConfigurationService = KubernetesConfigurationService;\n this.KubernetesResourcePoolService = KubernetesResourcePoolService;\n this.KubernetesConfigurationTypes = KubernetesConfigurationTypes;\n\n this.onInit = this.onInit.bind(this);\n this.createConfigurationAsync = this.createConfigurationAsync.bind(this);\n this.getConfigurationsAsync = this.getConfigurationsAsync.bind(this);\n }\n\n onChangeName() {\n const filteredConfigurations = _.filter(this.configurations, (config) => config.Namespace === this.formValues.ResourcePool.Namespace.Name);\n this.state.alreadyExist = _.find(filteredConfigurations, (config) => config.Name === this.formValues.Name) !== undefined;\n }\n\n onResourcePoolSelectionChange() {\n this.onChangeName();\n }\n\n isFormValid() {\n const uniqueCheck = !this.state.alreadyExist && this.state.isDataValid;\n if (this.formValues.IsSimple) {\n return this.formValues.Data.length > 0 && uniqueCheck;\n }\n return uniqueCheck;\n }\n\n async createConfigurationAsync() {\n try {\n this.state.actionInProgress = true;\n this.formValues.ConfigurationOwner = this.Authentication.getUserDetails().username;\n if (!this.formValues.IsSimple) {\n this.formValues.Data = KubernetesConfigurationHelper.parseYaml(this.formValues);\n }\n await this.KubernetesConfigurationService.create(this.formValues);\n this.Notifications.success('Configuration succesfully created');\n this.state.isEditorDirty = false;\n this.$state.go('kubernetes.configurations');\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to create configuration');\n } finally {\n this.state.actionInProgress = false;\n }\n }\n\n createConfiguration() {\n return this.$async(this.createConfigurationAsync);\n }\n\n async getConfigurationsAsync() {\n try {\n this.configurations = await this.KubernetesConfigurationService.get();\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve configurations');\n }\n }\n\n getConfigurations() {\n return this.$async(this.getConfigurationsAsync);\n }\n\n async uiCanExit() {\n if (!this.formValues.IsSimple && this.formValues.DataYaml && this.state.isEditorDirty) {\n return this.ModalService.confirmWebEditorDiscard();\n }\n }\n\n async onInit() {\n this.state = {\n actionInProgress: false,\n viewReady: false,\n alreadyExist: false,\n isDataValid: true,\n isEditorDirty: false,\n };\n\n this.formValues = new KubernetesConfigurationFormValues();\n this.formValues.Data.push(new KubernetesConfigurationFormValuesEntry());\n\n try {\n const resourcePools = await this.KubernetesResourcePoolService.get();\n this.resourcePools = _.filter(resourcePools, (resourcePool) => !KubernetesNamespaceHelper.isSystemNamespace(resourcePool.Namespace.Name));\n\n this.formValues.ResourcePool = this.resourcePools[0];\n await this.getConfigurations();\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to load view data');\n } finally {\n this.state.viewReady = true;\n }\n\n this.$window.onbeforeunload = () => {\n if (!this.formValues.IsSimple && this.formValues.DataYaml && this.state.isEditorDirty) {\n return '';\n }\n };\n }\n\n $onInit() {\n return this.$async(this.onInit);\n }\n\n $onDestroy() {\n this.state.isEditorDirty = false;\n }\n}\n\nexport default KubernetesCreateConfigurationController;\nangular.module('portainer.kubernetes').controller('KubernetesCreateConfigurationController', KubernetesCreateConfigurationController);\n","const autoNgTemplateLoaderTemplate1 = require('./configuration.html');\n\nangular.module('portainer.kubernetes').component('kubernetesConfigurationView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'KubernetesConfigurationController',\n controllerAs: 'ctrl',\n bindings: {\n $transition$: '<',\n },\n});\n","var path = 'app/kubernetes/views/configurations/edit/configuration.html';\nvar html = \"<kubernetes-view-header title=\\\"Configuration details\\\" state=\\\"kubernetes.configurations.configuration\\\" view-ready=\\\"ctrl.state.viewReady\\\">\\n <a ui-sref=\\\"kubernetes.resourcePools\\\">Namespaces</a> >\\n <a ui-sref=\\\"kubernetes.resourcePools.resourcePool({ id: ctrl.configuration.Namespace })\\\">{{ ctrl.configuration.Namespace }}</a> >\\n <a ui-sref=\\\"kubernetes.configurations\\\">ConfigMaps and Secrets</a> > {{ ctrl.configuration.Name }}\\n</kubernetes-view-header>\\n\\n<kubernetes-view-loading view-ready=\\\"ctrl.state.viewReady\\\"></kubernetes-view-loading>\\n\\n<div ng-if=\\\"ctrl.state.viewReady\\\">\\n <div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <uib-tabset active=\\\"ctrl.state.activeTab\\\" justified=\\\"true\\\" type=\\\"pills\\\">\\n <uib-tab index=\\\"0\\\" classes=\\\"btn-sm\\\" select=\\\"ctrl.selectTab(0)\\\" data-cy=\\\"k8sConfigDetail-configTab\\\">\\n <uib-tab-heading> <i class=\\\"fa fa-file-code space-right\\\" aria-hidden=\\\"true\\\"></i> Configuration </uib-tab-heading>\\n <div style=\\\"padding: 20px;\\\">\\n <table class=\\\"table\\\" data-cy=\\\"k8sConfigDetail-configTable\\\">\\n <tbody>\\n <tr>\\n <td>Name</td>\\n <td>\\n {{ ctrl.configuration.Name }}\\n <span style=\\\"margin-left: 5px;\\\" class=\\\"label label-info image-tag\\\" ng-if=\\\"ctrl.configuration.IsRegistrySecret\\\">system</span>\\n </td>\\n </tr>\\n <tr>\\n <td>Namespace</td>\\n <td>\\n <a ui-sref=\\\"kubernetes.resourcePools.resourcePool({ id: ctrl.configuration.Namespace })\\\">{{ ctrl.configuration.Namespace }}</a>\\n <span style=\\\"margin-left: 5px;\\\" class=\\\"label label-info image-tag\\\" ng-if=\\\"ctrl.isSystemNamespace()\\\">system</span>\\n </td>\\n </tr>\\n <tr>\\n <td>Configuration type</td>\\n <td>\\n {{ ctrl.configuration.Type | kubernetesConfigurationTypeText }}\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n </uib-tab>\\n <uib-tab index=\\\"1\\\" classes=\\\"btn-sm\\\" select=\\\"ctrl.selectTab(1)\\\" data-cy=\\\"k8sConfigDetail-eventsTab\\\">\\n <uib-tab-heading>\\n <i class=\\\"fa fa-history space-right\\\" aria-hidden=\\\"true\\\"></i> Events\\n <div ng-if=\\\"ctrl.hasEventWarnings()\\\">\\n <i class=\\\"fa fa-exclamation-circle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n {{ ctrl.state.eventWarningCount }} warning(s)\\n </div>\\n </uib-tab-heading>\\n <kubernetes-events-datatable\\n title-text=\\\"Events\\\"\\n title-icon=\\\"fa-history\\\"\\n dataset=\\\"ctrl.events\\\"\\n table-key=\\\"kubernetes.configuration.events\\\"\\n order-by=\\\"Date\\\"\\n reverse-order=\\\"true\\\"\\n loading=\\\"ctrl.state.eventsLoading\\\"\\n refresh-callback=\\\"ctrl.getEvents\\\"\\n >\\n </kubernetes-events-datatable>\\n </uib-tab>\\n <uib-tab index=\\\"2\\\" ng-if=\\\"ctrl.configuration.Yaml\\\" classes=\\\"btn-sm\\\" select=\\\"ctrl.showEditor()\\\" data-cy=\\\"k8sConfigDetail-yamlTab\\\">\\n <uib-tab-heading> <i class=\\\"fa fa-code space-right\\\" aria-hidden=\\\"true\\\"></i> YAML </uib-tab-heading>\\n <div style=\\\"padding-right: 25px;\\\" ng-if=\\\"ctrl.state.showEditorTab\\\">\\n <kubernetes-yaml-inspector key=\\\"configuration-yaml\\\" data=\\\"ctrl.configuration.Yaml\\\"> </kubernetes-yaml-inspector>\\n </div>\\n </uib-tab>\\n </uib-tabset>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n </div>\\n\\n <div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <form ng-if=\\\"!ctrl.isSystemConfig()\\\" class=\\\"form-horizontal\\\" name=\\\"kubernetesConfigurationCreationForm\\\" autocomplete=\\\"off\\\">\\n <kubernetes-configuration-data\\n ng-if=\\\"ctrl.formValues\\\"\\n form-values=\\\"ctrl.formValues\\\"\\n is-valid=\\\"ctrl.state.isDataValid\\\"\\n is-creation=\\\"false\\\"\\n is-editor-dirty=\\\"ctrl.state.isEditorDirty\\\"\\n ></kubernetes-configuration-data>\\n\\n <!-- summary -->\\n <kubernetes-summary-view\\n ng-if=\\\"!(!ctrl.isFormValid() || !kubernetesConfigurationCreationForm.$valid || ctrl.state.actionInProgress)\\\"\\n form-values=\\\"ctrl.formValues\\\"\\n ></kubernetes-summary-view>\\n\\n <!-- actions -->\\n <div class=\\\"col-sm-12 form-section-title\\\" style=\\\"margin-top: 10px;\\\">\\n Actions\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"!ctrl.isFormValid() || !kubernetesConfigurationCreationForm.$valid || ctrl.state.actionInProgress\\\"\\n ng-click=\\\"ctrl.updateConfiguration()\\\"\\n button-spinner=\\\"ctrl.state.actionInProgress\\\"\\n data-cy=\\\"k8sConfigDetail-updateConfig\\\"\\n >\\n <span ng-hide=\\\"ctrl.state.actionInProgress\\\">Update {{ ctrl.configuration.Type | kubernetesConfigurationTypeText }}</span>\\n <span ng-show=\\\"ctrl.state.actionInProgress\\\">Update in progress...</span>\\n </button>\\n </div>\\n </div>\\n <!-- !actions -->\\n </form>\\n <div ng-if=\\\"ctrl.isSystemConfig()\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\" style=\\\"margin-top: 10px;\\\">\\n Data\\n </div>\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr class=\\\"text-muted\\\">\\n <td style=\\\"width: 10%; border-top: none;\\\">Key</td>\\n <td style=\\\"width: 90%; border-top: none;\\\">Value</td>\\n </tr>\\n\\n <tr ng-repeat=\\\"item in ctrl.formValues.Data track by $index\\\">\\n <td>{{ item.Key }}</td>\\n <td>\\n <div style=\\\"white-space: pre-wrap;\\\">{{ item.Value }}</div>\\n <div style=\\\"margin-top: 2px;\\\">\\n <span class=\\\"btn btn-primary btn-xs\\\" ng-click=\\\"ctrl.copyConfigurationValue($index)\\\"> <i class=\\\"fa fa-copy space-right\\\" aria-hidden=\\\"true\\\"></i>Copy </span>\\n <span id=\\\"copyValueNotification_{{ $index }}\\\" style=\\\"display: none; color: #23ae89; margin-left: 5px;\\\" class=\\\"small\\\">\\n <i class=\\\"fa fa-check\\\" aria-hidden=\\\"true\\\"></i> copied\\n </span>\\n </div>\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n </div>\\n\\n <div class=\\\"row\\\" ng-if=\\\"ctrl.configuration.Used\\\">\\n <div class=\\\"col-sm-12\\\">\\n <kubernetes-integrated-applications-datatable\\n dataset=\\\"ctrl.configuration.Applications\\\"\\n table-key=\\\"kubernetes.configurations.applications\\\"\\n order-by=\\\"Name\\\"\\n refresh-callback=\\\"ctrl.getApplications\\\"\\n title-text=\\\"Applications using this configuration\\\"\\n title-icon=\\\"fa-laptop-code\\\"\\n >\\n </kubernetes-integrated-applications-datatable>\\n </div>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import angular from 'angular';\nimport _ from 'lodash-es';\n\nimport { KubernetesConfigurationFormValues } from 'Kubernetes/models/configuration/formvalues';\nimport { KubernetesConfigurationTypes } from 'Kubernetes/models/configuration/models';\nimport KubernetesConfigurationHelper from 'Kubernetes/helpers/configurationHelper';\nimport KubernetesConfigurationConverter from 'Kubernetes/converters/configuration';\nimport KubernetesEventHelper from 'Kubernetes/helpers/eventHelper';\nimport KubernetesNamespaceHelper from 'Kubernetes/helpers/namespaceHelper';\n\nclass KubernetesConfigurationController {\n /* @ngInject */\n constructor(\n $async,\n $state,\n $window,\n clipboard,\n Notifications,\n LocalStorage,\n KubernetesConfigurationService,\n KubernetesConfigMapService,\n KubernetesSecretService,\n KubernetesResourcePoolService,\n ModalService,\n KubernetesApplicationService,\n KubernetesEventService\n ) {\n this.$async = $async;\n this.$state = $state;\n this.$window = $window;\n this.clipboard = clipboard;\n this.Notifications = Notifications;\n this.LocalStorage = LocalStorage;\n this.ModalService = ModalService;\n this.KubernetesConfigurationService = KubernetesConfigurationService;\n this.KubernetesResourcePoolService = KubernetesResourcePoolService;\n this.KubernetesApplicationService = KubernetesApplicationService;\n this.KubernetesEventService = KubernetesEventService;\n this.KubernetesConfigurationTypes = KubernetesConfigurationTypes;\n this.KubernetesConfigMapService = KubernetesConfigMapService;\n this.KubernetesSecretService = KubernetesSecretService;\n\n this.onInit = this.onInit.bind(this);\n this.getConfigurationAsync = this.getConfigurationAsync.bind(this);\n this.getEvents = this.getEvents.bind(this);\n this.getEventsAsync = this.getEventsAsync.bind(this);\n this.getApplications = this.getApplications.bind(this);\n this.getApplicationsAsync = this.getApplicationsAsync.bind(this);\n this.getConfigurationsAsync = this.getConfigurationsAsync.bind(this);\n this.updateConfiguration = this.updateConfiguration.bind(this);\n this.updateConfigurationAsync = this.updateConfigurationAsync.bind(this);\n }\n\n isSystemNamespace() {\n return KubernetesNamespaceHelper.isSystemNamespace(this.configuration.Namespace);\n }\n\n isSystemConfig() {\n return this.isSystemNamespace() || this.configuration.IsRegistrySecret;\n }\n\n selectTab(index) {\n this.LocalStorage.storeActiveTab('configuration', index);\n }\n\n showEditor() {\n this.state.showEditorTab = true;\n this.selectTab(2);\n }\n\n copyConfigurationValue(idx) {\n this.clipboard.copyText(this.formValues.Data[idx].Value);\n $('#copyValueNotification_' + idx)\n .show()\n .fadeOut(2500);\n }\n\n isFormValid() {\n if (this.formValues.IsSimple) {\n return this.formValues.Data.length > 0 && this.state.isDataValid;\n }\n return this.state.isDataValid;\n }\n\n // TODO: refactor\n // It looks like we're still doing a create/delete process but we've decided to get rid of this\n // approach.\n async updateConfigurationAsync() {\n try {\n this.state.actionInProgress = true;\n if (\n this.formValues.Type !== this.configuration.Type ||\n this.formValues.ResourcePool.Namespace.Name !== this.configuration.Namespace ||\n this.formValues.Name !== this.configuration.Name\n ) {\n await this.KubernetesConfigurationService.create(this.formValues);\n await this.KubernetesConfigurationService.delete(this.configuration);\n this.Notifications.success('Configuration succesfully updated');\n this.$state.go(\n 'kubernetes.configurations.configuration',\n {\n namespace: this.formValues.ResourcePool.Namespace.Name,\n name: this.formValues.Name,\n },\n { reload: true }\n );\n } else {\n await this.KubernetesConfigurationService.update(this.formValues, this.configuration);\n this.Notifications.success('Configuration succesfully updated');\n this.$state.reload(this.$state.current);\n }\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to update configuration');\n } finally {\n this.state.actionInProgress = false;\n }\n }\n\n updateConfiguration() {\n if (this.configuration.Used) {\n const plural = this.configuration.Applications.length > 1 ? 's' : '';\n this.ModalService.confirmUpdate(\n `The changes will be propagated to ${this.configuration.Applications.length} running application${plural}. Are you sure you want to update this configuration?`,\n (confirmed) => {\n if (confirmed) {\n return this.$async(this.updateConfigurationAsync);\n }\n }\n );\n } else {\n return this.$async(this.updateConfigurationAsync);\n }\n }\n\n async getConfigurationAsync() {\n try {\n this.state.configurationLoading = true;\n const name = this.$transition$.params().name;\n const namespace = this.$transition$.params().namespace;\n const [configMap, secret] = await Promise.allSettled([this.KubernetesConfigMapService.get(namespace, name), this.KubernetesSecretService.get(namespace, name)]);\n if (secret.status === 'rejected' && secret.reason.err.status === 403) {\n this.$state.go('kubernetes.configurations');\n throw new Error('Not authorized to edit secret');\n }\n if (secret.status === 'fulfilled') {\n this.configuration = KubernetesConfigurationConverter.secretToConfiguration(secret.value);\n this.formValues.Data = secret.value.Data;\n } else {\n this.configuration = KubernetesConfigurationConverter.configMapToConfiguration(configMap.value);\n this.formValues.Data = configMap.value.Data;\n }\n this.formValues.ResourcePool = _.find(this.resourcePools, (resourcePool) => resourcePool.Namespace.Name === this.configuration.Namespace);\n this.formValues.Id = this.configuration.Id;\n this.formValues.Name = this.configuration.Name;\n this.formValues.Type = this.configuration.Type;\n this.oldDataYaml = this.formValues.DataYaml;\n\n return this.configuration;\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve configuration');\n } finally {\n this.state.configurationLoading = false;\n }\n }\n\n getConfiguration() {\n return this.$async(this.getConfigurationAsync);\n }\n\n async getApplicationsAsync(namespace) {\n try {\n this.state.applicationsLoading = true;\n const applications = await this.KubernetesApplicationService.get(namespace);\n this.configuration.Applications = KubernetesConfigurationHelper.getUsingApplications(this.configuration, applications);\n KubernetesConfigurationHelper.setConfigurationUsed(this.configuration);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve applications');\n } finally {\n this.state.applicationsLoading = false;\n }\n }\n\n getApplications(namespace) {\n return this.$async(this.getApplicationsAsync, namespace);\n }\n\n hasEventWarnings() {\n return this.state.eventWarningCount;\n }\n\n async getEventsAsync(namespace) {\n try {\n this.state.eventsLoading = true;\n this.events = await this.KubernetesEventService.get(namespace);\n this.events = _.filter(this.events, (event) => event.Involved.uid === this.configuration.Id);\n this.state.eventWarningCount = KubernetesEventHelper.warningCount(this.events);\n } catch (err) {\n this.Notifications('Failure', err, 'Unable to retrieve events');\n } finally {\n this.state.eventsLoading = false;\n }\n }\n\n getEvents(namespace) {\n return this.$async(this.getEventsAsync, namespace);\n }\n\n async getConfigurationsAsync() {\n try {\n this.configurations = await this.KubernetesConfigurationService.get();\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve configurations');\n }\n }\n\n getConfigurations() {\n return this.$async(this.getConfigurationsAsync);\n }\n\n tagUsedDataKeys() {\n const configName = this.$transition$.params().name;\n const usedDataKeys = _.uniq(\n this.configuration.Applications.flatMap((app) =>\n app.Env.filter((e) => e.valueFrom && e.valueFrom.configMapKeyRef && e.valueFrom.configMapKeyRef.name === configName).map((e) => e.name)\n )\n );\n\n this.formValues.Data = this.formValues.Data.map((variable) => {\n if (!usedDataKeys.includes(variable.Key)) {\n return variable;\n }\n\n return { ...variable, Used: true };\n });\n }\n\n async uiCanExit() {\n if (!this.formValues.IsSimple && this.formValues.DataYaml !== this.oldDataYaml && this.state.isEditorDirty) {\n return this.ModalService.confirmWebEditorDiscard();\n }\n }\n\n async onInit() {\n try {\n this.state = {\n actionInProgress: false,\n configurationLoading: true,\n applicationsLoading: true,\n eventsLoading: true,\n showEditorTab: false,\n viewReady: false,\n eventWarningCount: 0,\n activeTab: 0,\n currentName: this.$state.$current.name,\n isDataValid: true,\n isEditorDirty: false,\n };\n\n this.state.activeTab = this.LocalStorage.getActiveTab('configuration');\n\n this.formValues = new KubernetesConfigurationFormValues();\n\n this.resourcePools = await this.KubernetesResourcePoolService.get();\n const configuration = await this.getConfiguration();\n if (configuration) {\n await this.getApplications(this.configuration.Namespace);\n await this.getEvents(this.configuration.Namespace);\n await this.getConfigurations();\n }\n this.tagUsedDataKeys();\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to load view data');\n } finally {\n this.state.viewReady = true;\n }\n\n this.$window.onbeforeunload = () => {\n if (!this.formValues.IsSimple && this.formValues.DataYaml !== this.oldDataYaml && this.state.isEditorDirty) {\n return '';\n }\n };\n }\n\n $onInit() {\n return this.$async(this.onInit);\n }\n\n $onDestroy() {\n if (this.state.currentName !== this.$state.$current.name) {\n this.LocalStorage.storeActiveTab('configuration', 0);\n }\n this.state.isEditorDirty = false;\n }\n}\n\nexport default KubernetesConfigurationController;\nangular.module('portainer.kubernetes').controller('KubernetesConfigurationController', KubernetesConfigurationController);\n","import _ from 'lodash-es';\nimport angular from 'angular';\nimport { KubernetesStorageClass, KubernetesStorageClassAccessPolicies } from 'Kubernetes/models/storage-class/models';\nimport { KubernetesFormValidationReferences } from 'Kubernetes/models/application/formValues';\nimport { KubernetesIngressClass } from 'Kubernetes/ingress/models';\nimport KubernetesFormValidationHelper from 'Kubernetes/helpers/formValidationHelper';\nimport { KubernetesIngressClassTypes } from 'Kubernetes/ingress/constants';\nimport KubernetesNamespaceHelper from 'Kubernetes/helpers/namespaceHelper';\nimport { K8S_SETUP_DEFAULT } from '@/portainer/feature-flags/feature-ids';\nimport { HIDE_AUTO_UPDATE_WINDOW } from 'Portainer/feature-flags/feature-ids';\nclass KubernetesConfigureController {\n /* #region CONSTRUCTOR */\n\n /* @ngInject */\n constructor(\n $async,\n $state,\n Notifications,\n KubernetesStorageService,\n EndpointService,\n EndpointProvider,\n ModalService,\n KubernetesResourcePoolService,\n KubernetesIngressService,\n KubernetesMetricsService\n ) {\n this.$async = $async;\n this.$state = $state;\n this.Notifications = Notifications;\n this.KubernetesStorageService = KubernetesStorageService;\n this.EndpointService = EndpointService;\n this.EndpointProvider = EndpointProvider;\n this.ModalService = ModalService;\n this.KubernetesResourcePoolService = KubernetesResourcePoolService;\n this.KubernetesIngressService = KubernetesIngressService;\n this.KubernetesMetricsService = KubernetesMetricsService;\n\n this.IngressClassTypes = KubernetesIngressClassTypes;\n\n this.onInit = this.onInit.bind(this);\n this.configureAsync = this.configureAsync.bind(this);\n this.limitedFeature = K8S_SETUP_DEFAULT;\n this.limitedFeatureAutoWindow = HIDE_AUTO_UPDATE_WINDOW;\n }\n /* #endregion */\n\n /* #region STORAGE CLASSES UI MANAGEMENT */\n storageClassAvailable() {\n return this.StorageClasses && this.StorageClasses.length > 0;\n }\n\n hasValidStorageConfiguration() {\n let valid = true;\n _.forEach(this.StorageClasses, (item) => {\n if (item.selected && item.AccessModes.length === 0) {\n valid = false;\n }\n });\n return valid;\n }\n /* #endregion */\n\n /* #region INGRESS CLASSES UI MANAGEMENT */\n addIngressClass() {\n this.formValues.IngressClasses.push(new KubernetesIngressClass());\n this.onChangeIngressClass();\n }\n\n restoreIngressClass(index) {\n this.formValues.IngressClasses[index].NeedsDeletion = false;\n this.onChangeIngressClass();\n }\n\n removeIngressClass(index) {\n if (!this.formValues.IngressClasses[index].IsNew) {\n this.formValues.IngressClasses[index].NeedsDeletion = true;\n } else {\n this.formValues.IngressClasses.splice(index, 1);\n }\n this.onChangeIngressClass();\n }\n\n onChangeIngressClass() {\n const state = this.state.duplicates.ingressClasses;\n const source = _.map(this.formValues.IngressClasses, (ic) => (ic.NeedsDeletion ? undefined : ic.Name));\n const duplicates = KubernetesFormValidationHelper.getDuplicates(source);\n state.refs = duplicates;\n state.hasRefs = Object.keys(duplicates).length > 0;\n }\n\n onChangeIngressClassName(index) {\n const fv = this.formValues.IngressClasses[index];\n if (_.includes(fv.Name, KubernetesIngressClassTypes.NGINX)) {\n fv.Type = KubernetesIngressClassTypes.NGINX;\n } else if (_.includes(fv.Name, KubernetesIngressClassTypes.TRAEFIK)) {\n fv.Type = KubernetesIngressClassTypes.TRAEFIK;\n }\n this.onChangeIngressClass();\n }\n\n hasTraefikIngress() {\n return _.find(this.formValues.IngressClasses, { Type: this.IngressClassTypes.TRAEFIK });\n }\n /* #endregion */\n\n /* #region CONFIGURE */\n assignFormValuesToEndpoint(endpoint, storageClasses, ingressClasses) {\n endpoint.Kubernetes.Configuration.StorageClasses = storageClasses;\n endpoint.Kubernetes.Configuration.UseLoadBalancer = this.formValues.UseLoadBalancer;\n endpoint.Kubernetes.Configuration.UseServerMetrics = this.formValues.UseServerMetrics;\n endpoint.Kubernetes.Configuration.IngressClasses = ingressClasses;\n endpoint.Kubernetes.Configuration.RestrictDefaultNamespace = this.formValues.RestrictDefaultNamespace;\n }\n\n transformFormValues() {\n const storageClasses = _.map(this.StorageClasses, (item) => {\n if (item.selected) {\n const res = new KubernetesStorageClass();\n res.Name = item.Name;\n res.AccessModes = _.map(item.AccessModes, 'Name');\n res.Provisioner = item.Provisioner;\n res.AllowVolumeExpansion = item.AllowVolumeExpansion;\n return res;\n }\n });\n _.pull(storageClasses, undefined);\n\n const ingressClasses = _.without(\n _.map(this.formValues.IngressClasses, (ic) => (ic.NeedsDeletion ? undefined : ic)),\n undefined\n );\n _.pull(ingressClasses, undefined);\n\n return [storageClasses, ingressClasses];\n }\n\n async removeIngressesAcrossNamespaces() {\n const ingressesToDel = _.filter(this.formValues.IngressClasses, { NeedsDeletion: true });\n\n if (!ingressesToDel.length) {\n return;\n }\n\n const promises = [];\n const oldEndpointID = this.EndpointProvider.endpointID();\n this.EndpointProvider.setEndpointID(this.endpoint.Id);\n\n try {\n const allResourcePools = await this.KubernetesResourcePoolService.get();\n const resourcePools = _.filter(\n allResourcePools,\n (resourcePool) => !KubernetesNamespaceHelper.isSystemNamespace(resourcePool.Namespace.Name) && !KubernetesNamespaceHelper.isDefaultNamespace(resourcePool.Namespace.Name)\n );\n\n ingressesToDel.forEach((ingress) => {\n resourcePools.forEach((resourcePool) => {\n promises.push(this.KubernetesIngressService.delete(resourcePool.Namespace.Name, ingress.Name));\n });\n });\n } finally {\n this.EndpointProvider.setEndpointID(oldEndpointID);\n }\n\n const responses = await Promise.allSettled(promises);\n responses.forEach((respons) => {\n if (respons.status == 'rejected' && respons.reason.err.status != 404) {\n throw respons.reason;\n }\n });\n }\n\n enableMetricsServer() {\n if (this.formValues.UseServerMetrics) {\n this.state.metrics.userClick = true;\n this.state.metrics.pending = true;\n this.KubernetesMetricsService.capabilities(this.endpoint.Id)\n .then(() => {\n this.state.metrics.isServerRunning = true;\n this.state.metrics.pending = false;\n this.formValues.UseServerMetrics = true;\n })\n .catch(() => {\n this.state.metrics.isServerRunning = false;\n this.state.metrics.pending = false;\n this.formValues.UseServerMetrics = false;\n });\n } else {\n this.state.metrics.userClick = false;\n this.formValues.UseServerMetrics = false;\n }\n }\n\n async configureAsync() {\n try {\n this.state.actionInProgress = true;\n const [storageClasses, ingressClasses] = this.transformFormValues();\n\n await this.removeIngressesAcrossNamespaces();\n\n this.assignFormValuesToEndpoint(this.endpoint, storageClasses, ingressClasses);\n await this.EndpointService.updateEndpoint(this.endpoint.Id, this.endpoint);\n\n const storagePromises = _.map(storageClasses, (storageClass) => {\n const oldStorageClass = _.find(this.oldStorageClasses, { Name: storageClass.Name });\n if (oldStorageClass) {\n return this.KubernetesStorageService.patch(this.state.endpointId, oldStorageClass, storageClass);\n }\n });\n await Promise.all(storagePromises);\n\n const endpoints = this.EndpointProvider.endpoints();\n const modifiedEndpoint = _.find(endpoints, (item) => item.Id === this.endpoint.Id);\n if (modifiedEndpoint) {\n this.assignFormValuesToEndpoint(modifiedEndpoint, storageClasses, ingressClasses);\n this.EndpointProvider.setEndpoints(endpoints);\n }\n this.Notifications.success('Configuration successfully applied');\n this.$state.go('portainer.home');\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to apply configuration');\n } finally {\n this.state.actionInProgress = false;\n }\n }\n\n configure() {\n const toDel = _.filter(this.formValues.IngressClasses, { NeedsDeletion: true });\n if (toDel.length) {\n this.ModalService.confirmUpdate(\n `Removing ingress controllers may cause applications to be unaccessible. All ingress configurations from affected applications will be removed.<br/><br/>Do you wish to continue?`,\n (confirmed) => {\n if (confirmed) {\n return this.$async(this.configureAsync);\n }\n }\n );\n } else {\n return this.$async(this.configureAsync);\n }\n }\n /* #endregion */\n\n restrictDefaultToggledOn() {\n return this.formValues.RestrictDefaultNamespace && !this.oldFormValues.RestrictDefaultNamespace;\n }\n\n /* #region ON INIT */\n async onInit() {\n this.state = {\n actionInProgress: false,\n displayConfigureClassPanel: {},\n viewReady: false,\n endpointId: this.$state.params.id,\n duplicates: {\n ingressClasses: new KubernetesFormValidationReferences(),\n },\n metrics: {\n pending: false,\n isServerRunning: false,\n userClick: false,\n },\n };\n\n this.formValues = {\n UseLoadBalancer: false,\n UseServerMetrics: false,\n IngressClasses: [],\n RestrictDefaultNamespace: false,\n };\n\n try {\n [this.StorageClasses, this.endpoint] = await Promise.all([this.KubernetesStorageService.get(this.state.endpointId), this.EndpointService.endpoint(this.state.endpointId)]);\n _.forEach(this.StorageClasses, (item) => {\n item.availableAccessModes = new KubernetesStorageClassAccessPolicies();\n const storage = _.find(this.endpoint.Kubernetes.Configuration.StorageClasses, (sc) => sc.Name === item.Name);\n if (storage) {\n item.selected = true;\n _.forEach(storage.AccessModes, (access) => {\n const mode = _.find(item.availableAccessModes, { Name: access });\n if (mode) {\n mode.selected = true;\n }\n });\n }\n });\n\n this.oldStorageClasses = angular.copy(this.StorageClasses);\n\n this.formValues.UseLoadBalancer = this.endpoint.Kubernetes.Configuration.UseLoadBalancer;\n this.formValues.UseServerMetrics = this.endpoint.Kubernetes.Configuration.UseServerMetrics;\n this.formValues.RestrictDefaultNamespace = this.endpoint.Kubernetes.Configuration.RestrictDefaultNamespace;\n this.formValues.IngressClasses = _.map(this.endpoint.Kubernetes.Configuration.IngressClasses, (ic) => {\n ic.IsNew = false;\n ic.NeedsDeletion = false;\n return ic;\n });\n\n this.oldFormValues = Object.assign({}, this.formValues);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve environment configuration');\n } finally {\n this.state.viewReady = true;\n }\n }\n\n $onInit() {\n return this.$async(this.onInit);\n }\n /* #endregion */\n}\n\nexport default KubernetesConfigureController;\nangular.module('portainer.kubernetes').controller('KubernetesConfigureController', KubernetesConfigureController);\n","const autoNgTemplateLoaderTemplate1 = require('./dashboard.html');\n\nangular.module('portainer.kubernetes').component('kubernetesDashboardView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'KubernetesDashboardController',\n controllerAs: 'ctrl',\n});\n","var path = 'app/kubernetes/views/dashboard/dashboard.html';\nvar html = \"<kubernetes-view-header title=\\\"Dashboard\\\" state=\\\"kubernetes.dashboard\\\" view-ready=\\\"ctrl.state.viewReady\\\">\\n Environment summary\\n</kubernetes-view-header>\\n\\n<kubernetes-view-loading view-ready=\\\"ctrl.state.viewReady\\\"></kubernetes-view-loading>\\n\\n<div ng-if=\\\"ctrl.state.viewReady\\\">\\n <div class=\\\"row\\\" ng-if=\\\"ctrl.endpoint\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-tachometer-alt\\\" title-text=\\\"Environment info\\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr>\\n <td>Environment</td>\\n <td>\\n {{ ctrl.endpoint.Name }}\\n </td>\\n </tr>\\n <tr>\\n <td>URL</td>\\n <td>{{ ctrl.endpoint.URL | stripprotocol }}</td>\\n </tr>\\n <tr>\\n <td>Tags</td>\\n <td>{{ ctrl.endpointTags }}</td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n </div>\\n\\n <div class=\\\"row\\\">\\n <div class=\\\"col-xs-12 col-md-6\\\" ng-if=\\\"ctrl.pools\\\" data-cy=\\\"k8sDashboard-namespaces\\\">\\n <a ui-sref=\\\"kubernetes.resourcePools\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <div class=\\\"widget-icon blue pull-left\\\">\\n <i class=\\\"fa fa-layer-group\\\"></i>\\n </div>\\n <div class=\\\"title\\\">{{ ctrl.pools.length }}</div>\\n <div class=\\\"comment\\\">{{ ctrl.pools.length === 1 ? 'Namespace' : 'Namespaces' }}</div>\\n </rd-widget-body>\\n </rd-widget>\\n </a>\\n </div>\\n <div class=\\\"col-xs-12 col-md-6\\\" ng-if=\\\"ctrl.applications\\\" data-cy=\\\"k8sDashboard-applications\\\">\\n <a ui-sref=\\\"kubernetes.applications\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <div class=\\\"widget-icon blue pull-left\\\">\\n <i class=\\\"fa fa-laptop-code\\\"></i>\\n </div>\\n <div class=\\\"title\\\">{{ ctrl.applications.length }}</div>\\n <div class=\\\"comment\\\">{{ ctrl.applications.length === 1 ? 'Application' : 'Applications' }}</div>\\n </rd-widget-body>\\n </rd-widget>\\n </a>\\n </div>\\n <div class=\\\"col-xs-12 col-md-6\\\" ng-if=\\\"ctrl.configurations\\\" data-cy=\\\"k8sDashboard-configurations\\\">\\n <a ui-sref=\\\"kubernetes.configurations\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <div class=\\\"widget-icon blue pull-left\\\">\\n <i class=\\\"fa fa-file-code\\\"></i>\\n </div>\\n <div class=\\\"title\\\">{{ ctrl.configurations.length }}</div>\\n <div class=\\\"comment\\\">{{ ctrl.configurations.length === 1 ? 'Configuration' : 'Configurations' }}</div>\\n </rd-widget-body>\\n </rd-widget>\\n </a>\\n </div>\\n <div class=\\\"col-xs-12 col-md-6\\\" ng-if=\\\"ctrl.volumes\\\" data-cy=\\\"k8sDashboard-volumes\\\">\\n <a ui-sref=\\\"kubernetes.volumes\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <div class=\\\"widget-icon blue pull-left\\\">\\n <i class=\\\"fa fa-database\\\"></i>\\n </div>\\n <div class=\\\"title\\\">{{ ctrl.volumes.length }}</div>\\n <div class=\\\"comment\\\">{{ ctrl.volumes.length === 1 ? 'Volume' : 'Volumes' }}</div>\\n </rd-widget-body>\\n </rd-widget>\\n </a>\\n </div>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import angular from 'angular';\nimport _ from 'lodash-es';\nimport KubernetesConfigurationHelper from 'Kubernetes/helpers/configurationHelper';\nimport KubernetesNamespaceHelper from 'Kubernetes/helpers/namespaceHelper';\n\nclass KubernetesDashboardController {\n /* @ngInject */\n constructor(\n $async,\n Notifications,\n EndpointService,\n EndpointProvider,\n KubernetesResourcePoolService,\n KubernetesApplicationService,\n KubernetesConfigurationService,\n KubernetesVolumeService,\n Authentication,\n TagService\n ) {\n this.$async = $async;\n this.Notifications = Notifications;\n this.EndpointService = EndpointService;\n this.EndpointProvider = EndpointProvider;\n this.KubernetesResourcePoolService = KubernetesResourcePoolService;\n this.KubernetesApplicationService = KubernetesApplicationService;\n this.KubernetesConfigurationService = KubernetesConfigurationService;\n this.KubernetesVolumeService = KubernetesVolumeService;\n this.Authentication = Authentication;\n this.TagService = TagService;\n\n this.onInit = this.onInit.bind(this);\n this.getAll = this.getAll.bind(this);\n this.getAllAsync = this.getAllAsync.bind(this);\n }\n\n async getAllAsync() {\n const isAdmin = this.Authentication.isAdmin();\n\n try {\n const endpointId = this.EndpointProvider.endpointID();\n const [endpoint, pools, applications, configurations, volumes, tags] = await Promise.all([\n this.EndpointService.endpoint(endpointId),\n this.KubernetesResourcePoolService.get(),\n this.KubernetesApplicationService.get(),\n this.KubernetesConfigurationService.get(),\n this.KubernetesVolumeService.get(),\n this.TagService.tags(),\n ]);\n this.endpoint = endpoint;\n this.applications = applications;\n this.volumes = volumes;\n\n this.endpointTags = this.endpoint.TagIds.length\n ? _.join(\n _.filter(\n _.map(this.endpoint.TagIds, (id) => {\n const tag = tags.find((tag) => tag.Id === id);\n return tag ? tag.Name : '';\n }),\n Boolean\n ),\n ', '\n )\n : '-';\n\n if (!isAdmin) {\n this.pools = _.filter(pools, (pool) => !KubernetesNamespaceHelper.isSystemNamespace(pool.Namespace.Name));\n this.configurations = _.filter(configurations, (config) => !KubernetesConfigurationHelper.isSystemToken(config));\n } else {\n this.pools = pools;\n this.configurations = configurations;\n }\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to load dashboard data');\n }\n }\n\n getAll() {\n return this.$async(this.getAllAsync);\n }\n\n async onInit() {\n this.state = {\n viewReady: false,\n };\n\n await this.getAll();\n\n this.state.viewReady = true;\n }\n\n $onInit() {\n return this.$async(this.onInit);\n }\n}\n\nexport default KubernetesDashboardController;\nangular.module('portainer.kubernetes').controller('KubernetesDashboardController', KubernetesDashboardController);\n","const autoNgTemplateLoaderTemplate1 = require('./deploy.html');\n\nangular.module('portainer.kubernetes').component('kubernetesDeployView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'KubernetesDeployController',\n controllerAs: 'ctrl',\n});\n","var path = 'app/kubernetes/views/deploy/deploy.html';\nvar html = \"<kubernetes-view-header title=\\\"Advanced deployment\\\" state=\\\"kubernetes.deploy\\\" view-ready=\\\"ctrl.state.viewReady\\\">\\n Deploy Kubernetes resources\\n</kubernetes-view-header>\\n\\n<kubernetes-view-loading view-ready=\\\"ctrl.state.viewReady\\\"></kubernetes-view-loading>\\n\\n<div ng-if=\\\"ctrl.state.viewReady\\\">\\n <kubernetes-feedback-panel></kubernetes-feedback-panel>\\n\\n <div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <uib-tabset active=\\\"ctrl.state.activeTab\\\" justified=\\\"true\\\" type=\\\"pills\\\">\\n <uib-tab index=\\\"0\\\">\\n <uib-tab-heading> <i class=\\\"fa fa-code space-right\\\" aria-hidden=\\\"true\\\"></i> Deploy </uib-tab-heading>\\n\\n <form class=\\\"form-horizontal\\\" style=\\\"margin-top: 20px;\\\">\\n <div class=\\\"form-group\\\" ng-if=\\\"ctrl.formValues.Namespace\\\">\\n <label for=\\\"target_node\\\" class=\\\"col-lg-1 col-sm-2 control-label text-left\\\">Namespace</label>\\n <div class=\\\"col-lg-11 col-sm-10\\\">\\n <select class=\\\"form-control\\\" ng-model=\\\"ctrl.formValues.Namespace\\\" ng-options=\\\"namespace.Name as namespace.Name for namespace in ctrl.namespaces\\\"></select>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-if=\\\"!ctrl.formValues.Namespace\\\">\\n <div class=\\\"col-sm-12 small text-muted\\\">\\n <i class=\\\"fa fa-exclamation-circle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n You do not have access to any namespace. Contact your administrator to get access to a namespace.\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <label for=\\\"stack_name\\\" class=\\\"col-sm-1 control-label text-left\\\">Name</label>\\n <div class=\\\"col-lg-11 col-sm-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"ctrl.formValues.StackName\\\" id=\\\"stack_name\\\" placeholder=\\\"my-app\\\" auto-focus />\\n </div>\\n </div>\\n\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Build method\\n </div>\\n <box-selector radio-name=\\\"method\\\" ng-model=\\\"ctrl.state.BuildMethod\\\" options=\\\"ctrl.methodOptions\\\" data-cy=\\\"k8sAppDeploy-buildSelector\\\"></box-selector>\\n\\n <div ng-if=\\\"ctrl.state.BuildMethod !== ctrl.BuildMethods.CUSTOM_TEMPLATE\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Deployment type\\n </div>\\n <box-selector\\n radio-name=\\\"deploy\\\"\\n ng-model=\\\"ctrl.state.DeployType\\\"\\n on-change=\\\"(ctrl.onDeployTypeChange)\\\"\\n options=\\\"ctrl.deployOptions\\\"\\n data-cy=\\\"k8sAppDeploy-deploymentSelector\\\"\\n ></box-selector>\\n </div>\\n\\n <!-- repository -->\\n <git-form\\n ng-if=\\\"ctrl.state.BuildMethod === ctrl.BuildMethods.GIT\\\"\\n model=\\\"ctrl.formValues\\\"\\n on-change=\\\"(ctrl.onChangeFormValues)\\\"\\n additional-file=\\\"true\\\"\\n auto-update=\\\"true\\\"\\n show-auth-explanation=\\\"true\\\"\\n path-text-title=\\\"Manifest path\\\"\\n path-placeholder=\\\"deployment.yml\\\"\\n deploy-method=\\\"{{ ctrl.DeployMethod }}\\\"\\n ></git-form>\\n <!-- !repository -->\\n\\n <custom-template-selector\\n ng-show=\\\"ctrl.state.BuildMethod === ctrl.BuildMethods.CUSTOM_TEMPLATE\\\"\\n new-template-path=\\\"kubernetes.templates.custom.new\\\"\\n stack-type=\\\"3\\\"\\n on-change=\\\"(ctrl.onChangeTemplateId)\\\"\\n value=\\\"ctrl.state.templateId\\\"\\n ></custom-template-selector>\\n\\n <!-- editor -->\\n <web-editor-form\\n ng-if=\\\"ctrl.state.BuildMethod === ctrl.BuildMethods.WEB_EDITOR || (ctrl.state.BuildMethod === ctrl.BuildMethods.CUSTOM_TEMPLATE && ctrl.state.templateId)\\\"\\n identifier=\\\"kubernetes-deploy-editor\\\"\\n value=\\\"ctrl.formValues.EditorContent\\\"\\n on-change=\\\"(ctrl.onChangeFileContent)\\\"\\n ng-required=\\\"true\\\"\\n yml=\\\"true\\\"\\n placeholder=\\\"# Define or paste the content of your manifest file here\\\"\\n >\\n <editor-description>\\n <span class=\\\"col-sm-12 text-muted small\\\" ng-show=\\\"ctrl.state.DeployType === ctrl.ManifestDeployTypes.COMPOSE\\\">\\n <p>\\n <i class=\\\"fa fa-exclamation-circle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Portainer uses <a href=\\\"https://kompose.io/\\\" target=\\\"_blank\\\">Kompose</a> to convert your Compose manifest to a Kubernetes compliant manifest. Be wary that\\n not all the Compose format options are supported by Kompose at the moment.\\n </p>\\n <p>\\n You can get more information about Compose file format in the\\n <a href=\\\"https://docs.docker.com/compose/compose-file/\\\" target=\\\"_blank\\\">official documentation</a>.\\n </p>\\n </span>\\n <span\\n class=\\\"col-sm-12 text-muted small\\\"\\n ng-show=\\\"ctrl.state.DeployType === ctrl.ManifestDeployTypes.KUBERNETES && ctrl.state.BuildMethod === ctrl.BuildMethods.WEB_EDITOR\\\"\\n >\\n <p>\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n This feature allows you to deploy any kind of Kubernetes resource in this environment (Deployment, Secret, ConfigMap...).\\n </p>\\n <p>\\n You can get more information about Kubernetes file format in the\\n <a href=\\\"https://kubernetes.io/docs/concepts/overview/working-with-objects/kubernetes-objects/\\\" target=\\\"_blank\\\">official documentation</a>.\\n </p>\\n </span>\\n </editor-description>\\n </web-editor-form>\\n\\n <!-- !editor -->\\n\\n <!-- url -->\\n <div ng-show=\\\"ctrl.state.BuildMethod === ctrl.BuildMethods.URL\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n URL\\n </div>\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n Indicate the URL to the manifest.\\n </span>\\n </div>\\n <div class=\\\"form-group\\\">\\n <label for=\\\"manifest_url\\\" class=\\\"col-sm-1 control-label text-left\\\">URL</label>\\n <div class=\\\"col-sm-11\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"ctrl.formValues.ManifestURL\\\"\\n id=\\\"manifest_url\\\"\\n placeholder=\\\"https://raw.githubusercontent.com/kubernetes/website/main/content/en/examples/controllers/nginx-deployment.yaml\\\"\\n data-cy=\\\"k8sAppDeploy-urlFileUrl\\\"\\n />\\n </div>\\n </div>\\n </div>\\n <!-- !url -->\\n\\n <!-- actions -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"ctrl.disableDeploy()\\\"\\n ng-click=\\\"ctrl.deploy()\\\"\\n button-spinner=\\\"ctrl.state.actionInProgress\\\"\\n data-cy=\\\"k8sAppDeploy-deployButton\\\"\\n analytics-on\\n analytics-category=\\\"kubernetes\\\"\\n analytics-event=\\\"kubernetes-application-advanced-deployment\\\"\\n analytics-properties=\\\"ctrl.buildAnalyticsProperties()\\\"\\n >\\n <span ng-hide=\\\"ctrl.state.actionInProgress\\\">Deploy</span>\\n <span ng-show=\\\"ctrl.state.actionInProgress\\\">Deployment in progress...</span>\\n </button>\\n </div>\\n </div>\\n <!-- !actions -->\\n </form>\\n </uib-tab>\\n\\n <uib-tab index=\\\"1\\\" disable=\\\"ctrl.state.tabLogsDisabled\\\">\\n <uib-tab-heading> <i class=\\\"fa fa-file space-right\\\" aria-hidden=\\\"true\\\"></i> Logs </uib-tab-heading>\\n <form class=\\\"form-horizontal\\\" style=\\\"margin-top: 20px;\\\">\\n <div class=\\\"form-group\\\" ng-if=\\\"ctrl.state.activeTab === 1\\\">\\n <div class=\\\"col-sm-12\\\">\\n <code-editor identifier=\\\"kubernetes-deploy-logs\\\" read-only=\\\"true\\\" yml=\\\"false\\\" value=\\\"ctrl.errorLog\\\"></code-editor>\\n </div>\\n </div>\\n </form>\\n </uib-tab>\\n </uib-tabset>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import angular from 'angular';\nimport _ from 'lodash-es';\nimport stripAnsi from 'strip-ansi';\nimport uuidv4 from 'uuid/v4';\nimport PortainerError from 'Portainer/error';\n\nimport { KubernetesDeployManifestTypes, KubernetesDeployBuildMethods, KubernetesDeployRequestMethods, RepositoryMechanismTypes } from 'Kubernetes/models/deploy';\nimport { buildOption } from '@/portainer/components/box-selector';\nclass KubernetesDeployController {\n /* @ngInject */\n constructor(\n $async,\n $state,\n $window,\n Authentication,\n ModalService,\n Notifications,\n EndpointProvider,\n KubernetesResourcePoolService,\n StackService,\n WebhookHelper,\n CustomTemplateService\n ) {\n this.$async = $async;\n this.$state = $state;\n this.$window = $window;\n this.Authentication = Authentication;\n this.ModalService = ModalService;\n this.Notifications = Notifications;\n this.EndpointProvider = EndpointProvider;\n this.KubernetesResourcePoolService = KubernetesResourcePoolService;\n this.StackService = StackService;\n this.WebhookHelper = WebhookHelper;\n this.CustomTemplateService = CustomTemplateService;\n this.DeployMethod = 'manifest';\n\n this.deployOptions = [\n buildOption('method_kubernetes', 'fa fa-cubes', 'Kubernetes', 'Kubernetes manifest format', KubernetesDeployManifestTypes.KUBERNETES),\n buildOption('method_compose', 'fab fa-docker', 'Compose', 'docker-compose format', KubernetesDeployManifestTypes.COMPOSE),\n ];\n\n this.methodOptions = [\n buildOption('method_repo', 'fab fa-github', 'Git Repository', 'Use a git repository', KubernetesDeployBuildMethods.GIT),\n buildOption('method_editor', 'fa fa-edit', 'Web editor', 'Use our Web editor', KubernetesDeployBuildMethods.WEB_EDITOR),\n buildOption('method_url', 'fa fa-globe', 'URL', 'Specify a URL to a file', KubernetesDeployBuildMethods.URL),\n buildOption('method_template', 'fa fa-rocket', 'Custom Template', 'Use a custom template', KubernetesDeployBuildMethods.CUSTOM_TEMPLATE),\n ];\n\n this.state = {\n DeployType: KubernetesDeployManifestTypes.KUBERNETES,\n BuildMethod: KubernetesDeployBuildMethods.GIT,\n tabLogsDisabled: true,\n activeTab: 0,\n viewReady: false,\n isEditorDirty: false,\n templateId: null,\n };\n\n this.formValues = {\n StackName: '',\n RepositoryURL: '',\n RepositoryReferenceName: '',\n RepositoryAuthentication: true,\n RepositoryUsername: '',\n RepositoryPassword: '',\n AdditionalFiles: [],\n ComposeFilePathInRepository: '',\n RepositoryAutomaticUpdates: true,\n RepositoryMechanism: RepositoryMechanismTypes.INTERVAL,\n RepositoryFetchInterval: '5m',\n RepositoryWebhookURL: this.WebhookHelper.returnStackWebhookUrl(uuidv4()),\n };\n\n this.ManifestDeployTypes = KubernetesDeployManifestTypes;\n this.BuildMethods = KubernetesDeployBuildMethods;\n this.endpointId = this.EndpointProvider.endpointID();\n\n this.onChangeTemplateId = this.onChangeTemplateId.bind(this);\n this.deployAsync = this.deployAsync.bind(this);\n this.onChangeFileContent = this.onChangeFileContent.bind(this);\n this.getNamespacesAsync = this.getNamespacesAsync.bind(this);\n this.onChangeFormValues = this.onChangeFormValues.bind(this);\n this.buildAnalyticsProperties = this.buildAnalyticsProperties.bind(this);\n this.onDeployTypeChange = this.onDeployTypeChange.bind(this);\n }\n\n buildAnalyticsProperties() {\n const metadata = {\n type: buildLabel(this.state.BuildMethod),\n format: formatLabel(this.state.DeployType),\n role: roleLabel(this.Authentication.isAdmin()),\n 'automatic-updates': automaticUpdatesLabel(this.formValues.RepositoryAutomaticUpdates, this.formValues.RepositoryMechanism),\n };\n\n if (this.state.BuildMethod === KubernetesDeployBuildMethods.GIT) {\n metadata.auth = this.formValues.RepositoryAuthentication;\n }\n\n return { metadata };\n\n function automaticUpdatesLabel(repositoryAutomaticUpdates, repositoryMechanism) {\n switch (repositoryAutomaticUpdates && repositoryMechanism) {\n case RepositoryMechanismTypes.INTERVAL:\n return 'polling';\n case RepositoryMechanismTypes.WEBHOOK:\n return 'webhook';\n default:\n return 'off';\n }\n }\n\n function roleLabel(isAdmin) {\n if (isAdmin) {\n return 'admin';\n }\n\n return 'standard';\n }\n\n function buildLabel(buildMethod) {\n switch (buildMethod) {\n case KubernetesDeployBuildMethods.GIT:\n return 'git';\n case KubernetesDeployBuildMethods.WEB_EDITOR:\n return 'web-editor';\n }\n }\n\n function formatLabel(format) {\n switch (format) {\n case KubernetesDeployManifestTypes.COMPOSE:\n return 'compose';\n case KubernetesDeployManifestTypes.KUBERNETES:\n return 'manifest';\n }\n }\n }\n\n disableDeploy() {\n const isGitFormInvalid =\n this.state.BuildMethod === KubernetesDeployBuildMethods.GIT &&\n (!this.formValues.RepositoryURL || !this.formValues.FilePathInRepository || (this.formValues.RepositoryAuthentication && !this.formValues.RepositoryPassword)) &&\n _.isEmpty(this.formValues.Namespace);\n const isWebEditorInvalid =\n this.state.BuildMethod === KubernetesDeployBuildMethods.WEB_EDITOR && _.isEmpty(this.formValues.EditorContent) && _.isEmpty(this.formValues.Namespace);\n const isURLFormInvalid = this.state.BuildMethod == KubernetesDeployBuildMethods.WEB_EDITOR.URL && _.isEmpty(this.formValues.ManifestURL);\n\n const isNamespaceInvalid = _.isEmpty(this.formValues.Namespace);\n return !this.formValues.StackName || isGitFormInvalid || isWebEditorInvalid || isURLFormInvalid || this.state.actionInProgress || isNamespaceInvalid;\n }\n\n onChangeFormValues(values) {\n this.formValues = {\n ...this.formValues,\n ...values,\n };\n }\n\n onChangeTemplateId(templateId) {\n return this.$async(async () => {\n if (this.state.templateId === templateId) {\n return;\n }\n\n this.state.templateId = templateId;\n\n try {\n const fileContent = await this.CustomTemplateService.customTemplateFile(templateId);\n this.onChangeFileContent(fileContent);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to load template file');\n }\n });\n }\n\n onChangeFileContent(value) {\n this.formValues.EditorContent = value;\n this.state.isEditorDirty = true;\n }\n\n displayErrorLog(log) {\n this.errorLog = stripAnsi(log);\n this.state.tabLogsDisabled = false;\n this.state.activeTab = 1;\n }\n\n async deployAsync() {\n this.errorLog = '';\n this.state.actionInProgress = true;\n\n try {\n let method;\n let composeFormat = this.state.DeployType === this.ManifestDeployTypes.COMPOSE;\n\n switch (this.state.BuildMethod) {\n case this.BuildMethods.GIT:\n method = KubernetesDeployRequestMethods.REPOSITORY;\n break;\n case this.BuildMethods.WEB_EDITOR:\n method = KubernetesDeployRequestMethods.STRING;\n break;\n case KubernetesDeployBuildMethods.CUSTOM_TEMPLATE:\n method = KubernetesDeployRequestMethods.STRING;\n composeFormat = false;\n break;\n case this.BuildMethods.URL:\n method = KubernetesDeployRequestMethods.URL;\n break;\n default:\n throw new PortainerError('Unable to determine build method');\n }\n\n let deployNamespace = '';\n\n if (this.formValues.Namespace !== 'default') {\n deployNamespace = this.formValues.Namespace;\n }\n\n const payload = {\n ComposeFormat: composeFormat,\n Namespace: deployNamespace,\n StackName: this.formValues.StackName,\n };\n\n if (method === KubernetesDeployRequestMethods.REPOSITORY) {\n payload.RepositoryURL = this.formValues.RepositoryURL;\n payload.RepositoryReferenceName = this.formValues.RepositoryReferenceName;\n payload.RepositoryAuthentication = this.formValues.RepositoryAuthentication ? true : false;\n if (payload.RepositoryAuthentication) {\n payload.RepositoryUsername = this.formValues.RepositoryUsername;\n payload.RepositoryPassword = this.formValues.RepositoryPassword;\n }\n payload.ManifestFile = this.formValues.ComposeFilePathInRepository;\n payload.AdditionalFiles = this.formValues.AdditionalFiles;\n if (this.formValues.RepositoryAutomaticUpdates) {\n payload.AutoUpdate = {};\n if (this.formValues.RepositoryMechanism === RepositoryMechanismTypes.INTERVAL) {\n payload.AutoUpdate.Interval = this.formValues.RepositoryFetchInterval;\n } else if (this.formValues.RepositoryMechanism === RepositoryMechanismTypes.WEBHOOK) {\n payload.AutoUpdate.Webhook = this.formValues.RepositoryWebhookURL.split('/').reverse()[0];\n }\n }\n } else if (method === KubernetesDeployRequestMethods.STRING) {\n payload.StackFileContent = this.formValues.EditorContent;\n } else {\n payload.ManifestURL = this.formValues.ManifestURL;\n }\n\n await this.StackService.kubernetesDeploy(this.endpointId, method, payload);\n\n this.Notifications.success('Manifest successfully deployed');\n this.state.isEditorDirty = false;\n this.$state.go('kubernetes.applications');\n } catch (err) {\n this.Notifications.error('Unable to deploy manifest', err, 'Unable to deploy resources');\n this.displayErrorLog(err.err.data.details);\n } finally {\n this.state.actionInProgress = false;\n }\n }\n\n deploy() {\n return this.$async(this.deployAsync);\n }\n\n async getNamespacesAsync() {\n try {\n const pools = await this.KubernetesResourcePoolService.get();\n const namespaces = _.map(pools, 'Namespace').sort((a, b) => {\n if (a.Name === 'default') {\n return -1;\n }\n if (b.Name === 'default') {\n return 1;\n }\n return 0;\n });\n\n this.namespaces = namespaces;\n if (this.namespaces.length > 0) {\n this.formValues.Namespace = this.namespaces[0].Name;\n }\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to load namespaces data');\n }\n }\n\n getNamespaces() {\n return this.$async(this.getNamespacesAsync);\n }\n\n onDeployTypeChange(value) {\n if (value == this.ManifestDeployTypes.COMPOSE) {\n this.DeployMethod = 'compose';\n } else {\n this.DeployMethod = 'manifest';\n }\n }\n\n async uiCanExit() {\n if (this.formValues.EditorContent && this.state.isEditorDirty) {\n return this.ModalService.confirmWebEditorDiscard();\n }\n }\n\n $onInit() {\n return this.$async(async () => {\n await this.getNamespaces();\n\n if (this.$state.params.templateId) {\n const templateId = parseInt(this.$state.params.templateId, 10);\n if (templateId && !Number.isNaN(templateId)) {\n this.state.BuildMethod = KubernetesDeployBuildMethods.CUSTOM_TEMPLATE;\n this.onChangeTemplateId(templateId);\n }\n }\n\n this.state.viewReady = true;\n\n this.$window.onbeforeunload = () => {\n if (this.formValues.EditorContent && this.state.isEditorDirty) {\n return '';\n }\n };\n });\n }\n\n $onDestroy() {\n this.state.isEditorDirty = false;\n }\n}\n\nexport default KubernetesDeployController;\nangular.module('portainer.kubernetes').controller('KubernetesDeployController', KubernetesDeployController);\n","const autoNgTemplateLoaderTemplate1 = require('./resourcePoolAccess.html');\n\nangular.module('portainer.kubernetes').component('kubernetesResourcePoolAccessView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'KubernetesResourcePoolAccessController',\n controllerAs: 'ctrl',\n bindings: {\n $transition$: '<',\n },\n});\n","var path = 'app/kubernetes/views/resource-pools/access/resourcePoolAccess.html';\nvar html = \"<kubernetes-view-header title=\\\"Namespace access management\\\" state=\\\"kubernetes.resourcePools.resourcePool.access\\\" view-ready=\\\"ctrl.state.viewReady\\\">\\n <a ui-sref=\\\"kubernetes.resourcePools\\\">Namespaces</a> >\\n <a ui-sref=\\\"kubernetes.resourcePools.resourcePool({id: ctrl.pool.Namespace.Name})\\\">{{ ctrl.pool.Namespace.Name }}</a> > Access management\\n</kubernetes-view-header>\\n\\n<kubernetes-view-loading view-ready=\\\"ctrl.state.viewReady\\\"></kubernetes-view-loading>\\n\\n<div ng-if=\\\"ctrl.state.viewReady\\\">\\n <div class=\\\"row\\\" ng-if=\\\"ctrl.pool\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-plug\\\" title-text=\\\"Namespace\\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr>\\n <td>Name</td>\\n <td>\\n {{ ctrl.pool.Namespace.Name }}\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n </div>\\n\\n <div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget ng-if=\\\"ctrl.availableUsersAndTeams\\\">\\n <rd-widget-header icon=\\\"fa-user-lock\\\" title-text=\\\"Create access\\\"></rd-widget-header>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\">\\n <div class=\\\"form-group\\\">\\n <label class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Select user(s) and/or team(s)\\n </label>\\n <div class=\\\"col-sm-9 col-lg-4\\\">\\n <span class=\\\"small text-muted\\\" ng-if=\\\"ctrl.availableUsersAndTeams.length === 0\\\">\\n No user nor team access has been set on the environment. Head over to the\\n <a ui-sref=\\\"portainer.endpoints.endpoint.access({id: ctrl.endpointId})\\\">environment access view</a> to manage them.\\n </span>\\n <span\\n isteven-multi-select\\n ng-if=\\\"ctrl.availableUsersAndTeams.length > 0\\\"\\n input-model=\\\"ctrl.availableUsersAndTeams\\\"\\n output-model=\\\"ctrl.formValues.multiselectOutput\\\"\\n button-label=\\\"icon '-' Name\\\"\\n item-label=\\\"icon '-' Name\\\"\\n tick-property=\\\"ticked\\\"\\n helper-elements=\\\"filter\\\"\\n search-property=\\\"Name\\\"\\n translation=\\\"{nothingSelected: 'Select one or more users and/or teams', search: 'Search...'}\\\"\\n >\\n </span>\\n </div>\\n </div>\\n\\n <!-- actions -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"submit\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"(ctrl.availableUsersAndTeams | filter:{ticked:true}).length === 0 || ctrl.actionInProgress\\\"\\n ng-click=\\\"ctrl.authorizeAccess()\\\"\\n button-spinner=\\\"ctrl.actionInProgress\\\"\\n >\\n <span ng-hide=\\\"ctrl.state.actionInProgress\\\"><i class=\\\"fa fa-plus\\\" aria-hidden=\\\"true\\\"></i> Create access</span>\\n <span ng-show=\\\"ctrl.state.actionInProgress\\\">Creating access...</span>\\n </button>\\n </div>\\n </div>\\n <!-- !actions -->\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n </div>\\n\\n <div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <access-datatable\\n ng-if=\\\"ctrl.authorizedUsersAndTeams\\\"\\n title-text=\\\"Access\\\"\\n title-icon=\\\"fa-user-lock\\\"\\n table-key=\\\"kubernetes_resourcepool_access\\\"\\n order-by=\\\"Name\\\"\\n dataset=\\\"ctrl.authorizedUsersAndTeams\\\"\\n remove-action=\\\"ctrl.unauthorizeAccess\\\"\\n >\\n </access-datatable>\\n </div>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import angular from 'angular';\nimport _ from 'lodash-es';\nimport { KubernetesPortainerConfigMapConfigName, KubernetesPortainerConfigMapNamespace, KubernetesPortainerConfigMapAccessKey } from 'Kubernetes/models/config-map/models';\nimport { UserAccessViewModel, TeamAccessViewModel } from 'Portainer/models/access';\nimport KubernetesConfigMapHelper from 'Kubernetes/helpers/configMapHelper';\n\nclass KubernetesResourcePoolAccessController {\n /* @ngInject */\n constructor($async, $state, Notifications, KubernetesResourcePoolService, KubernetesConfigMapService, EndpointProvider, EndpointService, GroupService, AccessService) {\n this.$async = $async;\n this.$state = $state;\n this.Notifications = Notifications;\n this.KubernetesResourcePoolService = KubernetesResourcePoolService;\n this.KubernetesConfigMapService = KubernetesConfigMapService;\n\n this.EndpointProvider = EndpointProvider;\n this.EndpointService = EndpointService;\n this.GroupService = GroupService;\n this.AccessService = AccessService;\n\n this.onInit = this.onInit.bind(this);\n this.authorizeAccessAsync = this.authorizeAccessAsync.bind(this);\n this.unauthorizeAccessAsync = this.unauthorizeAccessAsync.bind(this);\n\n this.unauthorizeAccess = this.unauthorizeAccess.bind(this);\n }\n\n initAccessConfigMap(configMap) {\n configMap.Name = KubernetesPortainerConfigMapConfigName;\n configMap.Namespace = KubernetesPortainerConfigMapNamespace;\n configMap.Data[KubernetesPortainerConfigMapAccessKey] = {};\n return configMap;\n }\n\n /**\n * Init\n */\n async onInit() {\n this.state = {\n actionInProgress: false,\n viewReady: false,\n };\n\n this.formValues = {\n multiselectOutput: [],\n };\n\n this.endpointId = this.EndpointProvider.endpointID();\n\n try {\n const name = this.$transition$.params().id;\n let [endpoint, pool, configMap] = await Promise.all([\n this.EndpointService.endpoint(this.endpointId),\n this.KubernetesResourcePoolService.get(name),\n this.KubernetesConfigMapService.getAccess(KubernetesPortainerConfigMapNamespace, KubernetesPortainerConfigMapConfigName),\n ]);\n const group = await this.GroupService.group(endpoint.GroupId);\n const roles = [];\n const endpointAccesses = await this.AccessService.accesses(endpoint, group, roles);\n this.pool = pool;\n if (configMap.Id === 0) {\n configMap = this.initAccessConfigMap(configMap);\n }\n configMap = KubernetesConfigMapHelper.parseJSONData(configMap);\n\n this.authorizedUsersAndTeams = [];\n this.accessConfigMap = configMap;\n const poolAccesses = configMap.Data[KubernetesPortainerConfigMapAccessKey][name];\n if (poolAccesses) {\n this.authorizedUsersAndTeams = _.filter(endpointAccesses.authorizedUsersAndTeams, (item) => {\n if (item instanceof UserAccessViewModel && poolAccesses.UserAccessPolicies) {\n return poolAccesses.UserAccessPolicies[item.Id] !== undefined;\n } else if (item instanceof TeamAccessViewModel && poolAccesses.TeamAccessPolicies) {\n return poolAccesses.TeamAccessPolicies[item.Id] !== undefined;\n }\n return false;\n });\n }\n this.availableUsersAndTeams = _.without(endpointAccesses.authorizedUsersAndTeams, ...this.authorizedUsersAndTeams);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve namespace information');\n } finally {\n this.state.viewReady = true;\n }\n }\n\n $onInit() {\n return this.$async(this.onInit);\n }\n\n /**\n * Authorize access\n */\n async authorizeAccessAsync() {\n try {\n this.state.actionInProgress = true;\n const newAccesses = _.concat(this.authorizedUsersAndTeams, this.formValues.multiselectOutput);\n const accessConfigMap = KubernetesConfigMapHelper.modifiyNamespaceAccesses(angular.copy(this.accessConfigMap), this.pool.Namespace.Name, newAccesses);\n await this.KubernetesConfigMapService.updateAccess(accessConfigMap);\n this.Notifications.success('Access successfully created');\n this.$state.reload(this.$state.current);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to create accesses');\n }\n }\n\n authorizeAccess() {\n return this.$async(this.authorizeAccessAsync);\n }\n\n /**\n *\n */\n async unauthorizeAccessAsync(selectedItems) {\n try {\n this.state.actionInProgress = true;\n const newAccesses = _.without(this.authorizedUsersAndTeams, ...selectedItems);\n const accessConfigMap = KubernetesConfigMapHelper.modifiyNamespaceAccesses(angular.copy(this.accessConfigMap), this.pool.Namespace.Name, newAccesses);\n await this.KubernetesConfigMapService.updateAccess(accessConfigMap);\n this.Notifications.success('Access successfully removed');\n this.$state.reload(this.$state.current);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to remove accesses');\n } finally {\n this.state.actionInProgress = false;\n }\n }\n\n unauthorizeAccess(selectedItems) {\n return this.$async(this.unauthorizeAccessAsync, selectedItems);\n }\n}\n\nexport default KubernetesResourcePoolAccessController;\nangular.module('portainer.kubernetes').controller('KubernetesResourcePoolAccessController', KubernetesResourcePoolAccessController);\n","const autoNgTemplateLoaderTemplate1 = require('./createResourcePool.html');\n\nimport angular from 'angular';\nimport KubernetesCreateResourcePoolController from './createResourcePoolController';\n\nangular.module('portainer.kubernetes').component('kubernetesCreateResourcePoolView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: KubernetesCreateResourcePoolController,\n bindings: {\n endpoint: '<',\n },\n});\n","var path = 'app/kubernetes/views/resource-pools/create/createResourcePool.html';\nvar html = \"<kubernetes-view-header title=\\\"Create a namespace\\\" state=\\\"kubernetes.resourcePools.new\\\" view-ready=\\\"$ctrl.state.viewReady\\\">\\n <a ui-sref=\\\"kubernetes.resourcePools\\\">Namespaces</a> > Create a namespace\\n</kubernetes-view-header>\\n\\n<kubernetes-view-loading view-ready=\\\"$ctrl.state.viewReady\\\"></kubernetes-view-loading>\\n\\n<div ng-if=\\\"$ctrl.state.viewReady\\\">\\n <div class=\\\"row\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\" autocomplete=\\\"off\\\" name=\\\"resourcePoolCreationForm\\\">\\n <!-- #region NAME INPUT -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"pool_name\\\" class=\\\"col-sm-1 control-label text-left\\\">Name</label>\\n <div class=\\\"col-sm-11\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n name=\\\"pool_name\\\"\\n ng-model=\\\"$ctrl.formValues.Name\\\"\\n ng-pattern=\\\"/^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$/\\\"\\n ng-change=\\\"$ctrl.onChangeName()\\\"\\n placeholder=\\\"my-project\\\"\\n data-cy=\\\"k8sNamespaceCreate-namespaceNameInput\\\"\\n required\\n auto-focus\\n />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"resourcePoolCreationForm.pool_name.$invalid || $ctrl.state.isAlreadyExist\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"resourcePoolCreationForm.pool_name.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n <p ng-message=\\\"pattern\\\"\\n ><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field must consist of lower case alphanumeric characters, '-' or '.', and must start and end\\n with an alphanumeric character.</p\\n >\\n </div>\\n <p ng-if=\\\"$ctrl.state.isAlreadyExist\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> A namespace with the same name already exists.</p>\\n </div>\\n </div>\\n <!-- #endregion -->\\n\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Quota\\n </div>\\n <!-- #region QUOTA -->\\n <!-- quotas-switch -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12 small text-muted\\\">\\n <p>\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n A namespace segments the underlying physical Kubernetes cluster into smaller virtual clusters. You should assign a capped limit of resources to this namespace or\\n disable for the safe operation of your platform.\\n </p>\\n </div>\\n <div class=\\\"col-sm-12\\\">\\n <label class=\\\"control-label text-left\\\">\\n Resource assignment\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\">\\n <input type=\\\"checkbox\\\" ng-model=\\\"$ctrl.formValues.HasQuota\\\" /><i data-cy=\\\"k8sNamespaceCreate-resourceAssignmentToggle\\\"></i>\\n </label>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-if=\\\"$ctrl.formValues.HasQuota && !$ctrl.isQuotaValid()\\\">\\n <span class=\\\"col-sm-12 text-warning small\\\">\\n <p> <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> At least a single limit must be set for the quota to be valid. </p>\\n </span>\\n </div>\\n <!-- !quotas-switch -->\\n <div ng-if=\\\"$ctrl.formValues.HasQuota\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Resource limits\\n </div>\\n <div>\\n <!-- memory-limit-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"memory-limit\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\" style=\\\"margin-top: 20px;\\\">\\n Memory\\n </label>\\n <div class=\\\"col-sm-3\\\">\\n <slider\\n model=\\\"$ctrl.formValues.MemoryLimit\\\"\\n floor=\\\"$ctrl.defaults.MemoryLimit\\\"\\n ceil=\\\"$ctrl.state.sliderMaxMemory\\\"\\n step=\\\"128\\\"\\n ng-if=\\\"$ctrl.state.sliderMaxMemory\\\"\\n data-cy=\\\"k8sNamespaceCreate-memoryLimitSlider\\\"\\n >\\n </slider>\\n </div>\\n <div class=\\\"col-sm-2\\\">\\n <input\\n name=\\\"memory_limit\\\"\\n type=\\\"number\\\"\\n min=\\\"{{ $ctrl.defaults.MemoryLimit }}\\\"\\n max=\\\"{{ $ctrl.state.sliderMaxMemory }}\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"$ctrl.formValues.MemoryLimit\\\"\\n id=\\\"memory-limit\\\"\\n data-cy=\\\"k8sNamespaceCreate-memoryLimitInput\\\"\\n required\\n />\\n </div>\\n <div class=\\\"col-sm-4\\\">\\n <p class=\\\"small text-muted\\\" style=\\\"margin-top: 7px;\\\">\\n Maximum memory usage (<b>MB</b>)\\n </p>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"resourcePoolCreationForm.memory_limit.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"resourcePoolCreationForm.pool_name.$error\\\">\\n <p\\n ><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Value must be between {{ $ctrl.defaults.MemoryLimit }} and {{ $ctrl.state.sliderMaxMemory }}\\n </p>\\n </div>\\n </div>\\n </div>\\n <!-- !memory-limit-input -->\\n <!-- cpu-limit-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"cpu-limit\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\" style=\\\"margin-top: 20px;\\\">\\n CPU\\n </label>\\n <div class=\\\"col-sm-5\\\">\\n <slider\\n model=\\\"$ctrl.formValues.CpuLimit\\\"\\n floor=\\\"$ctrl.defaults.CpuLimit\\\"\\n ceil=\\\"$ctrl.state.sliderMaxCpu\\\"\\n step=\\\"0.1\\\"\\n precision=\\\"2\\\"\\n ng-if=\\\"$ctrl.state.sliderMaxCpu\\\"\\n data-cy=\\\"k8sNamespaceCreate-cpuLimitSlider\\\"\\n >\\n </slider>\\n </div>\\n <div class=\\\"col-sm-4\\\" style=\\\"margin-top: 20px;\\\">\\n <p class=\\\"small text-muted\\\">\\n Maximum CPU usage\\n </p>\\n </div>\\n </div>\\n <!-- !cpu-limit-input -->\\n </div>\\n </div>\\n <!-- #endregion -->\\n\\n <!-- #region LOAD-BALANCERS -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Load balancers\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n You can set a quota on the amount of external load balancers that can be created inside this namespace. Set this quota to 0 to effectively disable the use of load\\n balancers in this namespace.\\n </span>\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <por-switch-field\\n ng-data-cy=\\\"k8sNamespaceCreate-loadBalancerQuotaToggle\\\"\\n label=\\\"Load Balancer quota\\\"\\n name=\\\"k8s-resourcepool-Ibquota\\\"\\n feature=\\\"$ctrl.LBQuotaFeatureId\\\"\\n ng-model=\\\"lbquota\\\"\\n ></por-switch-field>\\n </div>\\n </div>\\n <!-- #endregion -->\\n\\n <!-- #region STORAGES -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Storage\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Quotas can be set on each storage option to prevent users from exceeding a specific threshold when deploying applications. You can set a quota to 0 to effectively\\n prevent the usage of a specific storage option inside this namespace.\\n </span>\\n </div>\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n <i class=\\\"fa fa-route\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n standard\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <por-switch-field\\n ng-data-cy=\\\"k8sNamespaceCreate-enableQuotaToggle\\\"\\n label=\\\"Enable quota\\\"\\n name=\\\"k8s-resourcepool-storagequota\\\"\\n feature=\\\"$ctrl.StorageQuotaFeatureId\\\"\\n ng-model=\\\"storagequota\\\"\\n ></por-switch-field>\\n </div>\\n </div>\\n <!-- #endregion -->\\n\\n <div ng-if=\\\"$ctrl.state.canUseIngress\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Ingresses\\n </div>\\n <!-- #region INGRESSES -->\\n <div class=\\\"form-group\\\" ng-if=\\\"$ctrl.formValues.IngressClasses.length === 0\\\">\\n <div class=\\\"col-sm-12 small text-muted\\\">\\n The ingress feature must be enabled in the\\n <a ui-sref=\\\"portainer.k8sendpoint.kubernetesConfig({id: $ctrl.endpoint.Id})\\\">environment configuration view</a> to be able to register ingresses inside this\\n namespace.\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\" ng-if=\\\"$ctrl.formValues.IngressClasses.length > 0\\\">\\n <div class=\\\"col-sm-12 small text-muted\\\">\\n <p>\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Enable and configure ingresses available to users when deploying applications.\\n </p>\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\" ng-repeat-start=\\\"ic in $ctrl.formValues.IngressClasses track by ic.IngressClass.Name\\\">\\n <div class=\\\"text-muted col-sm-12\\\" style=\\\"width: 100%;\\\">\\n <div style=\\\"border-bottom: 1px solid #cdcdcd; padding-bottom: 5px;\\\">\\n <i class=\\\"fa fa-route\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ ic.IngressClass.Name }}\\n </div>\\n </div>\\n\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 10px;\\\">\\n <label class=\\\"control-label text-left\\\">\\n Allow users to use this ingress\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\">\\n <input type=\\\"checkbox\\\" ng-model=\\\"ic.Selected\\\" /><i data-cy=\\\"namespaceCreate-ingressToggle{{ ic.IngressClass.Name }}\\\"></i>\\n </label>\\n </div>\\n </div>\\n\\n <div ng-if=\\\"ic.Selected\\\">\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label class=\\\"control-label text-left\\\">\\n Hostnames\\n <portainer-tooltip\\n position=\\\"bottom\\\"\\n message=\\\"Hostnames associated to the ingress inside this namespace. Users will be able to expose and access their applications over the ingress via one of these hostname.\\\"\\n >\\n </portainer-tooltip>\\n </label>\\n <span\\n class=\\\"label label-default interactive\\\"\\n style=\\\"margin-left: 10px;\\\"\\n ng-click=\\\"$ctrl.addHostname(ic)\\\"\\n data-cy=\\\"namespaceCreate-addHostButton{{ ic.IngressClass.Name }}\\\"\\n >\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add hostname\\n </span>\\n </div>\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 10px;\\\">\\n <div ng-repeat=\\\"item in ic.Hosts track by $index\\\" style=\\\"margin-top: 2px;\\\">\\n <div class=\\\"form-inline\\\">\\n <div class=\\\"col-sm-10 input-group input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">Hostname</span>\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n name=\\\"hostname_{{ ic.IngressClass.Name }}_{{ $index }}\\\"\\n ng-model=\\\"item.Host\\\"\\n ng-change=\\\"$ctrl.onChangeIngressHostname()\\\"\\n placeholder=\\\"foo\\\"\\n pattern=\\\"[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\\\"\\n required\\n data-cy=\\\"namespaceCreate-hostnameInput{{ ic.IngressClass.Name }}_{{ $index }}\\\"\\n />\\n </div>\\n <div class=\\\"col-sm-1 input-group input-group-sm\\\" ng-if=\\\"$index > 0\\\">\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"$ctrl.removeHostname(ic, $index)\\\">\\n <i class=\\\"fa fa-trash-alt\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n <div\\n class=\\\"small text-warning\\\"\\n style=\\\"margin-top: 5px;\\\"\\n ng-show=\\\"\\n resourcePoolCreationForm['hostname_' + ic.IngressClass.Name + '_' + $index].$invalid ||\\n $ctrl.state.duplicates.ingressHosts.refs[ic.IngressClass.Name][$index] !== undefined\\n \\\"\\n >\\n <ng-messages for=\\\"resourcePoolCreationForm['hostname_' + ic.IngressClass.Name + '_' + $index].$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Hostname is required.</p>\\n <p ng-message=\\\"pattern\\\">\\n <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i>\\n This field must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (e.g. 'example.com').\\n </p>\\n </ng-messages>\\n <p ng-if=\\\"$ctrl.state.duplicates.ingressHosts.refs[ic.IngressClass.Name][$index] !== undefined\\\">\\n <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This hostname is already used.\\n </p>\\n </div>\\n </div>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-if=\\\"ic.IngressClass.Type === $ctrl.IngressClassTypes.NGINX\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label class=\\\"control-label text-left\\\">\\n Redirect published routes to / in application\\n <portainer-tooltip\\n position=\\\"bottom\\\"\\n message=\\\"Enables the redirection of any route published via ingress to the root path of the application, e.g. /path remaps to /\\\"\\n >\\n </portainer-tooltip>\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\">\\n <input type=\\\"checkbox\\\" ng-model=\\\"ic.RewriteTarget\\\" /><i data-cy=\\\"namespaceCreate-redirectRoutesToggle{{ ic.IngressClass.Name }}\\\"></i>\\n </label>\\n </div>\\n </div>\\n </div>\\n <div ng-repeat-end class=\\\"form-group\\\" ng-if=\\\"ic.Selected\\\" style=\\\"margin-bottom: 20px;\\\">\\n <div class=\\\"col-sm-12\\\">\\n <p>\\n <a class=\\\"small interactive\\\" ng-if=\\\"!ic.AdvancedConfig\\\" ng-click=\\\"ic.AdvancedConfig = true\\\" data-cy=\\\"namespaceCreate-advancedConfig{{ ic.IngressClass.Name }}\\\">\\n <i class=\\\"fa fa-plus space-right\\\" aria-hidden=\\\"true\\\"></i> Advanced configuration\\n </a>\\n <a class=\\\"small interactive\\\" ng-if=\\\"ic.AdvancedConfig\\\" ng-click=\\\"ic.AdvancedConfig = false\\\" data-cy=\\\"namespaceCreate-hideConfig{{ ic.IngressClass.Name }}\\\">\\n <i class=\\\"fa fa-minus space-right\\\" aria-hidden=\\\"true\\\"></i> Hide configuration\\n </a>\\n </p>\\n </div>\\n\\n <div class=\\\"col-sm-12 small text-muted\\\" ng-if=\\\"ic.AdvancedConfig\\\" style=\\\"margin-top: 5px;\\\">\\n <p>\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n You can specify a list of annotations that will be associated to the ingress.\\n </p>\\n </div>\\n\\n <div class=\\\"col-sm-12\\\" ng-if=\\\"ic.AdvancedConfig\\\">\\n <label class=\\\"control-label text-left\\\">Annotations</label>\\n <span\\n class=\\\"label label-default interactive\\\"\\n style=\\\"margin-left: 10px;\\\"\\n ng-click=\\\"$ctrl.addAnnotation(ic)\\\"\\n data-cy=\\\"namespaceCreate-addAnnotation{{ ic.IngressClass.Name }}\\\"\\n >\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add annotation\\n </span>\\n </div>\\n\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\" ng-if=\\\"ic.AdvancedConfig\\\">\\n <div ng-repeat=\\\"annotation in ic.Annotations track by $index\\\" style=\\\"margin-top: 2px;\\\">\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">Key</span>\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"annotation.Key\\\"\\n placeholder=\\\"nginx.ingress.kubernetes.io/rewrite-target\\\"\\n required\\n data-cy=\\\"namespaceCreate-annotationKey{{ ic.IngressClass.Name }}\\\"\\n />\\n </div>\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">Value</span>\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"annotation.Value\\\"\\n placeholder=\\\"/$1\\\"\\n required\\n data-cy=\\\"namespaceCreate-annotationValue{{ ic.IngressClass.Name }}\\\"\\n />\\n </div>\\n <div class=\\\"col-sm-1 input-group input-group-sm\\\">\\n <button\\n class=\\\"btn btn-sm btn-danger\\\"\\n type=\\\"button\\\"\\n ng-click=\\\"$ctrl.removeAnnotation(ic, $index)\\\"\\n data-cy=\\\"namespaceCreate-deleteAnnotationButton{{ ic.IngressClass.Name }}\\\"\\n >\\n <i class=\\\"fa fa-trash-alt\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n </div>\\n </div>\\n <!-- #endregion -->\\n </div>\\n\\n <!-- #region REGISTRIES -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Registries\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12 small text-muted\\\">\\n <p>\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Define which registry can be used by users who have access to this namespace.\\n </p>\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <label class=\\\"col-sm-3 col-lg-2 control-label text-left\\\" style=\\\"padding-top: 0;\\\">\\n Select registries\\n </label>\\n <div class=\\\"col-sm-9 col-lg-4\\\">\\n <span class=\\\"small text-muted\\\" ng-if=\\\"!$ctrl.registries.length && $ctrl.state.isAdmin\\\">\\n No registries available. Head over <a ui-sref=\\\"portainer.registries\\\">registry view</a> to define container registry.\\n </span>\\n <span class=\\\"small text-muted\\\" ng-if=\\\"!$ctrl.registries.length && !$ctrl.state.isAdmin\\\">\\n No registries available. Contact your administrator to create a container registry.\\n </span>\\n <span\\n isteven-multi-select\\n ng-if=\\\"$ctrl.registries.length\\\"\\n input-model=\\\"$ctrl.registries\\\"\\n output-model=\\\"$ctrl.formValues.Registries\\\"\\n button-label=\\\"Name\\\"\\n item-label=\\\"Name\\\"\\n tick-property=\\\"Checked\\\"\\n helper-elements=\\\"filter\\\"\\n search-property=\\\"Name\\\"\\n translation=\\\"{nothingSelected: 'Select one or more registry', search: 'Search...'}\\\"\\n data-cy=\\\"namespaceCreate-registrySelect\\\"\\n >\\n </span>\\n </div>\\n </div>\\n <!-- #endregion -->\\n\\n <!-- summary -->\\n <kubernetes-summary-view ng-if=\\\"resourcePoolCreationForm.$valid && !$ctrl.isCreateButtonDisabled()\\\" form-values=\\\"$ctrl.formValues\\\"></kubernetes-summary-view>\\n <!-- !summary -->\\n\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <!-- #region ACTIONS -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"!resourcePoolCreationForm.$valid || $ctrl.isCreateButtonDisabled()\\\"\\n ng-click=\\\"$ctrl.createResourcePool()\\\"\\n button-spinner=\\\"$ctrl.state.actionInProgress\\\"\\n >\\n <span ng-hide=\\\"$ctrl.state.actionInProgress\\\" data-cy=\\\"k8sNamespace-createNamespaceButton\\\">Create namespace</span>\\n <span ng-show=\\\"$ctrl.state.actionInProgress\\\">Creation in progress...</span>\\n </button>\\n </div>\\n </div>\\n\\n <!-- #endregion -->\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import _ from 'lodash-es';\n\nangular.module('portainer.kubernetes').controller('KubernetesResourcePoolIngressesDatatableController', function ($scope, $controller, DatatableService) {\n angular.extend(this, $controller('GenericDatatableController', { $scope: $scope }));\n this.state = Object.assign(this.state, {\n expandedItems: [],\n expandAll: false,\n });\n\n this.onSettingsRepeaterChange = function () {\n DatatableService.setDataTableSettings(this.tableKey, this.settings);\n };\n\n this.expandItem = function (item, expanded) {\n if (!this.itemCanExpand(item)) {\n return;\n }\n\n item.Expanded = expanded;\n if (!expanded) {\n item.Highlighted = false;\n }\n };\n\n this.itemCanExpand = function (item) {\n return item.Paths.length > 0;\n };\n\n this.hasExpandableItems = function () {\n return _.filter(this.state.filteredDataSet, (item) => this.itemCanExpand(item)).length;\n };\n\n this.expandAll = function () {\n this.state.expandAll = !this.state.expandAll;\n _.forEach(this.state.filteredDataSet, (item) => {\n if (this.itemCanExpand(item)) {\n this.expandItem(item, this.state.expandAll);\n }\n });\n };\n\n this.$onInit = function () {\n this.setDefaults();\n this.prepareTableFromDataset();\n\n this.state.orderBy = this.orderBy;\n var storedOrder = DatatableService.getDataTableOrder(this.tableKey);\n if (storedOrder !== null) {\n this.state.reverseOrder = storedOrder.reverse;\n this.state.orderBy = storedOrder.orderBy;\n }\n\n var textFilter = DatatableService.getDataTableTextFilters(this.tableKey);\n if (textFilter !== null) {\n this.state.textFilter = textFilter;\n this.onTextFilterChange();\n }\n\n var storedFilters = DatatableService.getDataTableFilters(this.tableKey);\n if (storedFilters !== null) {\n this.filters = storedFilters;\n }\n if (this.filters && this.filters.state) {\n this.filters.state.open = false;\n }\n\n var storedSettings = DatatableService.getDataTableSettings(this.tableKey);\n if (storedSettings !== null) {\n this.settings = storedSettings;\n this.settings.open = false;\n }\n this.onSettingsRepeaterChange();\n };\n});\n","const autoNgTemplateLoaderTemplate1 = require('./template.html');\n\nangular.module('portainer.kubernetes').component('kubernetesResourcePoolIngressesDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'KubernetesResourcePoolIngressesDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n refreshCallback: '<',\n },\n});\n","var path = 'app/kubernetes/views/resource-pools/edit/components/ingresses-datatable/template.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n <div class=\\\"settings\\\">\\n <span class=\\\"setting\\\" ng-class=\\\"{ 'setting-active': $ctrl.settings.open }\\\" uib-dropdown dropdown-append-to-body auto-close=\\\"disabled\\\" is-open=\\\"$ctrl.settings.open\\\">\\n <span uib-dropdown-toggle><i class=\\\"fa fa-cog\\\" aria-hidden=\\\"true\\\"></i> Table settings</span>\\n <div class=\\\"dropdown-menu dropdown-menu-right\\\" uib-dropdown-menu>\\n <div class=\\\"tableMenu\\\">\\n <div class=\\\"menuHeader\\\">\\n Table settings\\n </div>\\n <div class=\\\"menuContent\\\">\\n <div>\\n <div class=\\\"md-checkbox\\\">\\n <input id=\\\"setting_auto_refresh\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.settings.repeater.autoRefresh\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" />\\n <label for=\\\"setting_auto_refresh\\\">Auto refresh</label>\\n </div>\\n <div ng-if=\\\"$ctrl.settings.repeater.autoRefresh\\\">\\n <label for=\\\"settings_refresh_rate\\\">\\n Refresh rate\\n </label>\\n <select id=\\\"settings_refresh_rate\\\" ng-model=\\\"$ctrl.settings.repeater.refreshRate\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" class=\\\"small-select\\\">\\n <option value=\\\"10\\\">10s</option>\\n <option value=\\\"30\\\">30s</option>\\n <option value=\\\"60\\\">1min</option>\\n <option value=\\\"120\\\">2min</option>\\n <option value=\\\"300\\\">5min</option>\\n </select>\\n <span>\\n <i id=\\\"refreshRateChange\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-top: 7px; display: none;\\\"></i>\\n </span>\\n </div>\\n </div>\\n </div>\\n <div>\\n <a type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"$ctrl.settings.open = false;\\\">Close</a>\\n </div>\\n </div>\\n </div>\\n </span>\\n </div>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n auto-focus\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th>\\n <a ng-click=\\\"$ctrl.expandAll()\\\" ng-if=\\\"$ctrl.hasExpandableItems()\\\" style=\\\"margin-right: 5px;\\\">\\n <i ng-class=\\\"{ 'fas fa-angle-down': $ctrl.state.expandAll, 'fas fa-angle-right': !$ctrl.state.expandAll }\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Name')\\\">\\n Ingress\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate-start=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit: $ctrl.tableKey))\\\"\\n ng-class=\\\"{ active: item.Checked, 'datatable-highlighted': item.Highlighted }\\\"\\n ng-click=\\\"$ctrl.expandItem(item, !item.Expanded)\\\"\\n pagination-id=\\\"$ctrl.tableKey\\\"\\n >\\n <td colspan=\\\"3\\\">\\n <a ng-if=\\\"$ctrl.itemCanExpand(item)\\\" style=\\\"margin-right: 5px;\\\">\\n <i ng-class=\\\"{ 'fas fa-angle-down': item.Expanded, 'fas fa-angle-right': !item.Expanded }\\\" class=\\\"space-right\\\" aria-hidden=\\\"true\\\"></i> </a\\n >{{ item.Name }}\\n </td>\\n </tr>\\n <tr\\n dir-paginate-end\\n ng-show=\\\"item.Expanded\\\"\\n ng-repeat=\\\"path in item.Paths\\\"\\n ng-class=\\\"{ 'datatable-highlighted': item.Highlighted, 'datatable-unhighlighted': !item.Highlighted }\\\"\\n >\\n <td>\\n <a style=\\\"margin-left: 15px;\\\" ng-href=\\\"http://{{ path.Host ? path.Host : path.IP }}{{ path.Path }}\\\" target=\\\"_blank\\\">\\n {{ path.Host ? path.Host : path.IP }}{{ path.Path }}\\n </a>\\n <span ng-if=\\\"path.ApplicationName !== '-'\\\">\\n <i class=\\\"fas fa-long-arrow-alt-right\\\" style=\\\"margin: 2px;\\\"></i>\\n <a ui-sref=\\\"kubernetes.applications.application({ name: path.ApplicationName, namespace: item.Namespace })\\\">{{ path.ApplicationName }}</a>\\n </span>\\n <span class=\\\"label label-warning image-tag label-margins\\\" ng-if=\\\"path.ApplicationName === '-'\\\">unused</span>\\n </td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"4\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"4\\\" class=\\\"text-center text-muted\\\">No ingresses available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\" pagination-id=\\\"$ctrl.tableKey\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./resourcePool.html');\n\nangular.module('portainer.kubernetes').component('kubernetesResourcePoolView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'KubernetesResourcePoolController',\n controllerAs: 'ctrl',\n bindings: {\n endpoint: '<',\n },\n});\n","var path = 'app/kubernetes/views/resource-pools/edit/resourcePool.html';\nvar html = \"<kubernetes-view-header title=\\\"Namespace details\\\" state=\\\"kubernetes.resourcePools.resourcePool\\\" view-ready=\\\"ctrl.state.viewReady\\\">\\n <a ui-sref=\\\"kubernetes.resourcePools\\\">Namespaces</a> > {{ ctrl.pool.Namespace.Name }}\\n</kubernetes-view-header>\\n\\n<kubernetes-view-loading view-ready=\\\"ctrl.state.viewReady\\\"></kubernetes-view-loading>\\n\\n<div ng-if=\\\"ctrl.state.viewReady\\\">\\n <div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <uib-tabset active=\\\"ctrl.state.activeTab\\\" justified=\\\"true\\\" type=\\\"pills\\\">\\n <uib-tab index=\\\"0\\\" classes=\\\"btn-sm\\\" select=\\\"ctrl.selectTab(0)\\\">\\n <uib-tab-heading> <i class=\\\"fa fa-layer-group space-right\\\" aria-hidden=\\\"true\\\"></i> Namespace </uib-tab-heading>\\n <form class=\\\"form-horizontal\\\" autocomplete=\\\"off\\\" name=\\\"resourcePoolEditForm\\\" style=\\\"padding: 20px; margin-top: 10px;\\\">\\n <!-- name-input -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr>\\n <td>Name</td>\\n <td>\\n {{ ctrl.pool.Namespace.Name }}\\n <span class=\\\"label label-info image-tag label-margins\\\" ng-if=\\\"ctrl.isSystem\\\">system</span>\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n </div>\\n <!-- !name-input -->\\n <div ng-if=\\\"ctrl.isAdmin && ctrl.isEditable\\\" class=\\\"col-sm-12 form-section-title\\\">Quota</div>\\n <!-- quotas-switch -->\\n <div ng-if=\\\"ctrl.isAdmin && ctrl.isEditable\\\" class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label class=\\\"control-label text-left\\\">\\n Resource assignment\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\"> <input type=\\\"checkbox\\\" ng-model=\\\"ctrl.formValues.HasQuota\\\" /><i></i> </label>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-if=\\\"ctrl.formValues.HasQuota && ctrl.isAdmin && ctrl.isEditable && !ctrl.isQuotaValid()\\\">\\n <span class=\\\"col-sm-12 text-warning small\\\">\\n <p> <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> At least a single limit must be set for the quota to be valid. </p>\\n </span>\\n </div>\\n <div ng-if=\\\"ctrl.formValues.HasQuota\\\">\\n <kubernetes-resource-reservation\\n ng-if=\\\"ctrl.pool.Quota\\\"\\n description=\\\"Resource reservation represents the total amount of resource assigned to all the applications deployed inside this namespace.\\\"\\n cpu-reservation=\\\"ctrl.state.resourceReservation.CPU\\\"\\n memory-reservation=\\\"ctrl.state.resourceReservation.Memory\\\"\\n cpu-limit=\\\"ctrl.formValues.CpuLimit\\\"\\n memory-limit=\\\"ctrl.formValues.MemoryLimit\\\"\\n display-usage=\\\"ctrl.state.useServerMetrics\\\"\\n cpu-usage=\\\"ctrl.state.resourceUsage.CPU\\\"\\n memory-usage=\\\"ctrl.state.resourceUsage.Memory\\\"\\n >\\n </kubernetes-resource-reservation>\\n </div>\\n <!-- !quotas-switch -->\\n <div ng-if=\\\"ctrl.formValues.HasQuota && ctrl.isAdmin && ctrl.isEditable\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Resource limits\\n </div>\\n <div>\\n <!-- memory-limit-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"memory-limit\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\" style=\\\"margin-top: 20px;\\\">\\n Memory limit\\n </label>\\n <div class=\\\"col-sm-3\\\">\\n <slider\\n model=\\\"ctrl.formValues.MemoryLimit\\\"\\n floor=\\\"ctrl.ResourceQuotaDefaults.MemoryLimit\\\"\\n ceil=\\\"ctrl.state.sliderMaxMemory\\\"\\n step=\\\"128\\\"\\n ng-if=\\\"ctrl.state.sliderMaxMemory\\\"\\n ></slider>\\n </div>\\n <div class=\\\"col-sm-2\\\">\\n <input\\n name=\\\"memory_limit\\\"\\n type=\\\"number\\\"\\n min=\\\"{{ ctrl.ResourceQuotaDefaults.MemoryLimit }}\\\"\\n max=\\\"{{ ctrl.state.sliderMaxMemory }}\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"ctrl.formValues.MemoryLimit\\\"\\n id=\\\"memory-limit\\\"\\n required\\n />\\n </div>\\n <div class=\\\"col-sm-4\\\">\\n <p class=\\\"small text-muted\\\" style=\\\"margin-top: 7px;\\\">\\n Memory limit (<b>MB</b>)\\n </p>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"resourcePoolEditForm.memory_limit.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"resourcePoolEditForm.pool_name.$error\\\">\\n <p\\n ><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Value must be between {{ ctrl.ResourceQuotaDefaults.MemoryLimit }} and\\n {{ ctrl.state.sliderMaxMemory }}</p\\n >\\n </div>\\n </div>\\n </div>\\n <!-- !memory-limit-input -->\\n <!-- cpu-limit-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"cpu-limit\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\" style=\\\"margin-top: 20px;\\\">\\n CPU limit\\n </label>\\n <div class=\\\"col-sm-5\\\">\\n <slider\\n model=\\\"ctrl.formValues.CpuLimit\\\"\\n floor=\\\"ctrl.ResourceQuotaDefaults.CpuLimit\\\"\\n ceil=\\\"ctrl.state.sliderMaxCpu\\\"\\n step=\\\"0.1\\\"\\n precision=\\\"2\\\"\\n ng-if=\\\"ctrl.state.sliderMaxCpu\\\"\\n ></slider>\\n </div>\\n <div class=\\\"col-sm-4\\\" style=\\\"margin-top: 20px;\\\">\\n <p class=\\\"small text-muted\\\">\\n Maximum CPU usage\\n </p>\\n </div>\\n </div>\\n <!-- !cpu-limit-input -->\\n </div>\\n </div>\\n <!-- #region LOADBALANCERS -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Load balancers\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n You can set a quota on the amount of external load balancers that can be created inside this namespace. Set this quota to 0 to effectively disable the use of\\n load balancers in this namespace.\\n </span>\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <por-switch-field\\n ng-data-cy=\\\"k8sNamespaceCreate-loadBalancerQuotaToggle\\\"\\n label=\\\"Load Balancer quota\\\"\\n name=\\\"k8s-resourcepool-Lbquota\\\"\\n feature=\\\"ctrl.LBQuotaFeatureId\\\"\\n ng-model=\\\"lbquota\\\"\\n ></por-switch-field>\\n </div>\\n </div>\\n <!-- #endregion -->\\n <div ng-if=\\\"ctrl.isAdmin && ctrl.isEditable && ctrl.state.canUseIngress\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Ingresses\\n </div>\\n <!-- #region INGRESSES -->\\n <div class=\\\"form-group\\\" ng-if=\\\"ctrl.formValues.IngressClasses.length === 0\\\">\\n <div class=\\\"col-sm-12 small text-muted\\\">\\n The ingress feature must be enabled in the\\n <a ui-sref=\\\"portainer.k8sendpoint.kubernetesConfig({id: ctrl.endpoint.Id})\\\">environment configuration view</a> to be able to register ingresses inside this\\n namespace.\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\" ng-if=\\\"ctrl.formValues.IngressClasses.length > 0\\\">\\n <div class=\\\"col-sm-12 small text-muted\\\">\\n <p>\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Enable and configure ingresses available to users when deploying applications.\\n </p>\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\" ng-repeat-start=\\\"ic in ctrl.formValues.IngressClasses track by ic.IngressClass.Name\\\">\\n <div class=\\\"text-muted col-sm-12\\\" style=\\\"width: 100%;\\\">\\n <div style=\\\"border-bottom: 1px solid #cdcdcd; padding-bottom: 5px;\\\">\\n <i class=\\\"fa fa-route\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ ic.IngressClass.Name }}\\n </div>\\n </div>\\n\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 10px;\\\">\\n <label class=\\\"control-label text-left\\\">\\n Allow users to use this ingress\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\"> <input type=\\\"checkbox\\\" ng-model=\\\"ic.Selected\\\" /><i></i> </label>\\n </div>\\n </div>\\n\\n <div ng-if=\\\"ic.Selected\\\">\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label class=\\\"control-label text-left\\\">\\n Hostnames\\n <portainer-tooltip\\n position=\\\"bottom\\\"\\n message=\\\"Hostnames associated to the ingress inside this namespace. Users will be able to expose and access their applications over the ingress via one of these hostname.\\\"\\n >\\n </portainer-tooltip>\\n </label>\\n <span class=\\\"label label-default interactive\\\" style=\\\"margin-left: 10px;\\\" ng-click=\\\"ctrl.addHostname(ic)\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add hostname\\n </span>\\n </div>\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 10px;\\\">\\n <div ng-repeat=\\\"item in ic.Hosts track by $index\\\" style=\\\"margin-top: 2px;\\\">\\n <div class=\\\"form-inline\\\">\\n <div class=\\\"col-sm-10 input-group input-group-sm\\\" ng-class=\\\"{ striked: item.NeedsDeletion }\\\">\\n <span class=\\\"input-group-addon\\\">Hostname</span>\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n name=\\\"hostname_{{ ic.IngressClass.Name }}_{{ $index }}\\\"\\n ng-model=\\\"item.Host\\\"\\n ng-change=\\\"ctrl.onChangeIngressHostname()\\\"\\n placeholder=\\\"foo\\\"\\n pattern=\\\"[a-z0-9]([-a-z0-9]*[a-z0-9])?(\\\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\\\"\\n required\\n />\\n </div>\\n <div class=\\\"col-sm-1 input-group input-group-sm\\\" ng-if=\\\"$index > 0\\\">\\n <button ng-if=\\\"!item.NeedsDeletion\\\" class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"ctrl.removeHostname(ic, $index)\\\">\\n <i class=\\\"fa fa-trash-alt\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n <button ng-if=\\\"item.NeedsDeletion\\\" class=\\\"btn btn-sm btn-primary\\\" type=\\\"button\\\" ng-click=\\\"ctrl.restoreHostname(item)\\\">\\n <i class=\\\"fa fa-trash-restore\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n <div\\n class=\\\"small text-warning\\\"\\n style=\\\"margin-top: 5px;\\\"\\n ng-show=\\\"resourcePoolEditForm['hostname_' + ic.IngressClass.Name + '_' + $index].$invalid || item.Duplicate\\\"\\n >\\n <ng-messages for=\\\"resourcePoolEditForm['hostname_' + ic.IngressClass.Name + '_' + $index].$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Hostname is required.</p>\\n <p ng-message=\\\"pattern\\\">\\n <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i>\\n This field must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (e.g.\\n 'example.com').\\n </p>\\n </ng-messages>\\n <p ng-if=\\\"item.Duplicate\\\">\\n <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i>\\n This hostname is already used.\\n </p>\\n </div>\\n </div>\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\" ng-if=\\\"ic.IngressClass.Type === ctrl.IngressClassTypes.NGINX\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label class=\\\"control-label text-left\\\">\\n Redirect published routes to / in application\\n <portainer-tooltip\\n position=\\\"bottom\\\"\\n message=\\\"Enables the redirection of any route published via ingress to the root path of the application, e.g. /path remaps to /\\\"\\n >\\n </portainer-tooltip>\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\"> <input type=\\\"checkbox\\\" ng-model=\\\"ic.RewriteTarget\\\" /><i></i> </label>\\n </div>\\n </div>\\n </div>\\n <div ng-repeat-end class=\\\"form-group\\\" ng-if=\\\"ic.Selected\\\" style=\\\"margin-bottom: 20px;\\\">\\n <div class=\\\"col-sm-12\\\">\\n <p>\\n <a class=\\\"small interactive\\\" ng-if=\\\"!ic.AdvancedConfig\\\" ng-click=\\\"ic.AdvancedConfig = true\\\">\\n <i class=\\\"fa fa-plus space-right\\\" aria-hidden=\\\"true\\\"></i> Advanced configuration\\n </a>\\n <a class=\\\"small interactive\\\" ng-if=\\\"ic.AdvancedConfig\\\" ng-click=\\\"ic.AdvancedConfig = false\\\">\\n <i class=\\\"fa fa-minus space-right\\\" aria-hidden=\\\"true\\\"></i> Hide configuration\\n </a>\\n </p>\\n </div>\\n\\n <div class=\\\"col-sm-12 small text-muted\\\" ng-if=\\\"ic.AdvancedConfig\\\" style=\\\"margin-top: 5px;\\\">\\n <p>\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n You can specify a list of annotations that will be associated to the ingress.\\n </p>\\n </div>\\n\\n <div class=\\\"col-sm-12\\\" ng-if=\\\"ic.AdvancedConfig\\\">\\n <label class=\\\"control-label text-left\\\">Annotations</label>\\n <span class=\\\"label label-default interactive\\\" style=\\\"margin-left: 10px;\\\" ng-click=\\\"ctrl.addAnnotation(ic)\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add annotation\\n </span>\\n </div>\\n\\n <div class=\\\"col-sm-12 form-inline\\\" style=\\\"margin-top: 10px;\\\" ng-if=\\\"ic.AdvancedConfig\\\">\\n <div ng-repeat=\\\"annotation in ic.Annotations track by $index\\\" style=\\\"margin-top: 2px;\\\">\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">Key</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"annotation.Key\\\" placeholder=\\\"nginx.ingress.kubernetes.io/rewrite-target\\\" required />\\n </div>\\n <div class=\\\"input-group col-sm-5 input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">Value</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"annotation.Value\\\" placeholder=\\\"/$1\\\" required />\\n </div>\\n <div class=\\\"col-sm-1 input-group input-group-sm\\\">\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"ctrl.removeAnnotation(ic, $index)\\\">\\n <i class=\\\"fa fa-trash-alt\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n </div>\\n </div>\\n </div>\\n <!-- #endregion -->\\n </div>\\n\\n <!-- #region REGISTRIES -->\\n <div>\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Registries\\n </div>\\n\\n <div class=\\\"form-group\\\" ng-if=\\\"!ctrl.isAdmin || ctrl.isSystem\\\">\\n <label class=\\\"col-sm-3 col-lg-2 control-label text-left\\\" style=\\\"padding-top: 0;\\\">\\n Selected registries\\n </label>\\n <div class=\\\"col-sm-9 col-lg-4\\\">\\n {{ ctrl.selectedRegistries ? ctrl.selectedRegistries : 'None' }}\\n </div>\\n </div>\\n\\n <div ng-if=\\\"ctrl.isAdmin && !ctrl.isSystem\\\">\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12 small text-muted\\\">\\n <p>\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Define which registry can be used by users who have access to this namespace.\\n </p>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\">\\n <label class=\\\"col-sm-3 col-lg-2 control-label text-left\\\" style=\\\"padding-top: 0;\\\">\\n Select registries\\n </label>\\n <div class=\\\"col-sm-9 col-lg-4\\\">\\n <span class=\\\"small text-muted\\\" ng-if=\\\"!ctrl.registries.length && ctrl.state.isAdmin\\\">\\n No registries available. Head over <a ui-sref=\\\"portainer.registries\\\">registry view</a> to define container registry.\\n </span>\\n <span class=\\\"small text-muted\\\" ng-if=\\\"!ctrl.registries.length && !ctrl.state.isAdmin\\\">\\n No registries available. Contact your administrator to create a container registry.\\n </span>\\n <span\\n isteven-multi-select\\n ng-if=\\\"ctrl.registries.length\\\"\\n input-model=\\\"ctrl.registries\\\"\\n output-model=\\\"ctrl.formValues.Registries\\\"\\n button-label=\\\"Name\\\"\\n item-label=\\\"Name\\\"\\n tick-property=\\\"Checked\\\"\\n helper-elements=\\\"filter\\\"\\n search-property=\\\"Name\\\"\\n translation=\\\"{nothingSelected: 'Select one or more registry', search: 'Search...'}\\\"\\n >\\n </span>\\n </div>\\n </div>\\n </div>\\n </div>\\n <!-- #endregion -->\\n\\n <!-- #region STORAGES -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Storage\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Quotas can be set on each storage option to prevent users from exceeding a specific threshold when deploying applications. You can set a quota to 0 to\\n effectively prevent the usage of a specific storage option inside this namespace.\\n </span>\\n </div>\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n <i class=\\\"fa fa-route\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n standard\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <por-switch-field\\n ng-data-cy=\\\"k8sNamespaceCreate-enableQuotaToggle\\\"\\n label=\\\"Enable quota\\\"\\n name=\\\"k8s-resourcepool-storagequota\\\"\\n feature=\\\"ctrl.StorageQuotaFeatureId\\\"\\n ng-model=\\\"storagequota\\\"\\n ></por-switch-field>\\n </div>\\n </div>\\n <!-- #endregion -->\\n\\n <!-- summary -->\\n <kubernetes-summary-view\\n ng-if=\\\"resourcePoolEditForm.$valid && !ctrl.isUpdateButtonDisabled()\\\"\\n form-values=\\\"ctrl.formValues\\\"\\n old-form-values=\\\"ctrl.savedFormValues\\\"\\n ></kubernetes-summary-view>\\n <!-- !summary -->\\n\\n <!-- actions -->\\n <div ng-if=\\\"ctrl.isAdmin\\\" class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <div ng-if=\\\"ctrl.isAdmin\\\" class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n ng-if=\\\"!ctrl.isSystem\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"!resourcePoolEditForm.$valid || ctrl.isUpdateButtonDisabled()\\\"\\n ng-click=\\\"ctrl.updateResourcePool()\\\"\\n button-spinner=\\\"ctrl.state.actionInProgress\\\"\\n >\\n <span ng-hide=\\\"ctrl.state.actionInProgress\\\" data-cy=\\\"k8sNamespaceEdit-updateNamespaceButton\\\">Update namespace</span>\\n <span ng-show=\\\"ctrl.state.actionInProgress\\\">Update in progress...</span>\\n </button>\\n <button\\n ng-if=\\\"!ctrl.isDefaultNamespace\\\"\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-click=\\\"ctrl.markUnmarkAsSystem()\\\"\\n button-spinner=\\\"ctrl.state.actionInProgress\\\"\\n >\\n <span ng-if=\\\"ctrl.isSystem\\\">Unmark as system</span>\\n <span ng-if=\\\"!ctrl.isSystem\\\">Mark as system</span>\\n </button>\\n </div>\\n </div>\\n <!-- !actions -->\\n </form>\\n </uib-tab>\\n <uib-tab index=\\\"1\\\" classes=\\\"btn-sm\\\" select=\\\"ctrl.selectTab(1)\\\">\\n <uib-tab-heading>\\n <i class=\\\"fa fa-history space-right\\\" aria-hidden=\\\"true\\\"></i> Events\\n <div ng-if=\\\"ctrl.hasEventWarnings()\\\">\\n <i class=\\\"fa fa-exclamation-circle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n {{ ctrl.state.eventWarningCount }} warning(s)\\n </div>\\n </uib-tab-heading>\\n <kubernetes-events-datatable\\n title-text=\\\"Events\\\"\\n title-icon=\\\"fa-history\\\"\\n dataset=\\\"ctrl.events\\\"\\n table-key=\\\"kubernetes.resourcepool.events\\\"\\n order-by=\\\"Date\\\"\\n reverse-order=\\\"true\\\"\\n loading=\\\"ctrl.state.eventsLoading\\\"\\n refresh-callback=\\\"ctrl.getEvents\\\"\\n ></kubernetes-events-datatable>\\n </uib-tab>\\n <uib-tab index=\\\"2\\\" ng-if=\\\"ctrl.pool.Yaml\\\" select=\\\"ctrl.showEditor()\\\" classes=\\\"btn-sm\\\">\\n <uib-tab-heading> <i class=\\\"fa fa-code space-right\\\" aria-hidden=\\\"true\\\"></i> YAML </uib-tab-heading>\\n <div style=\\\"padding-right: 25px;\\\" ng-if=\\\"ctrl.state.showEditorTab\\\">\\n <kubernetes-yaml-inspector key=\\\"resource-pool-yaml\\\" data=\\\"ctrl.pool.Yaml\\\"></kubernetes-yaml-inspector>\\n </div>\\n </uib-tab>\\n </uib-tabset>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n </div>\\n\\n <div class=\\\"row\\\" ng-if=\\\"ctrl.applications && ctrl.applications.length > 0\\\">\\n <div class=\\\"col-sm-12\\\">\\n <kubernetes-resource-pool-applications-datatable\\n dataset=\\\"ctrl.applications\\\"\\n table-key=\\\"kubernetes.resourcepool.applications\\\"\\n order-by=\\\"Name\\\"\\n refresh-callback=\\\"ctrl.getApplications\\\"\\n loading=\\\"ctrl.state.applicationsLoading\\\"\\n title-text=\\\"Applications running in this namespace\\\"\\n title-icon=\\\"fa-laptop-code\\\"\\n >\\n </kubernetes-resource-pool-applications-datatable>\\n </div>\\n </div>\\n\\n <div class=\\\"row\\\" ng-if=\\\"ctrl.ingresses && ctrl.ingresses.length > 0\\\">\\n <div class=\\\"col-sm-12\\\">\\n <kubernetes-resource-pool-ingresses-datatable\\n dataset=\\\"ctrl.ingresses\\\"\\n table-key=\\\"kubernetes.resourcepool.ingresses\\\"\\n order-by=\\\"Name\\\"\\n refresh-callback=\\\"ctrl.getIngresses\\\"\\n loading=\\\"ctrl.state.ingressesLoading\\\"\\n title-text=\\\"Ingress routes and applications\\\"\\n title-icon=\\\"fa-route\\\"\\n >\\n </kubernetes-resource-pool-ingresses-datatable>\\n </div>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import angular from 'angular';\nimport _ from 'lodash-es';\nimport filesizeParser from 'filesize-parser';\nimport { KubernetesResourceQuotaDefaults } from 'Kubernetes/models/resource-quota/models';\nimport KubernetesResourceReservationHelper from 'Kubernetes/helpers/resourceReservationHelper';\nimport { KubernetesResourceReservation } from 'Kubernetes/models/resource-reservation/models';\nimport KubernetesEventHelper from 'Kubernetes/helpers/eventHelper';\nimport {\n KubernetesResourcePoolFormValues,\n KubernetesResourcePoolIngressClassAnnotationFormValue,\n KubernetesResourcePoolIngressClassHostFormValue,\n} from 'Kubernetes/models/resource-pool/formValues';\nimport { KubernetesIngressConverter } from 'Kubernetes/ingress/converter';\nimport { KubernetesFormValidationReferences } from 'Kubernetes/models/application/formValues';\nimport KubernetesFormValidationHelper from 'Kubernetes/helpers/formValidationHelper';\nimport { KubernetesIngressClassTypes } from 'Kubernetes/ingress/constants';\nimport KubernetesResourceQuotaConverter from 'Kubernetes/converters/resourceQuota';\nimport KubernetesNamespaceHelper from 'Kubernetes/helpers/namespaceHelper';\nimport { K8S_RESOURCE_POOL_LB_QUOTA, K8S_RESOURCE_POOL_STORAGE_QUOTA } from '@/portainer/feature-flags/feature-ids';\n\nclass KubernetesResourcePoolController {\n /* #region CONSTRUCTOR */\n /* @ngInject */\n constructor(\n $async,\n $state,\n Authentication,\n Notifications,\n LocalStorage,\n EndpointService,\n ModalService,\n KubernetesNodeService,\n KubernetesMetricsService,\n KubernetesResourceQuotaService,\n KubernetesResourcePoolService,\n KubernetesEventService,\n KubernetesPodService,\n KubernetesApplicationService,\n KubernetesIngressService,\n KubernetesVolumeService\n ) {\n Object.assign(this, {\n $async,\n $state,\n Authentication,\n Notifications,\n LocalStorage,\n EndpointService,\n ModalService,\n KubernetesNodeService,\n KubernetesMetricsService,\n KubernetesResourceQuotaService,\n KubernetesResourcePoolService,\n KubernetesEventService,\n KubernetesPodService,\n KubernetesApplicationService,\n KubernetesIngressService,\n KubernetesVolumeService,\n });\n\n this.IngressClassTypes = KubernetesIngressClassTypes;\n this.ResourceQuotaDefaults = KubernetesResourceQuotaDefaults;\n\n this.LBQuotaFeatureId = K8S_RESOURCE_POOL_LB_QUOTA;\n this.StorageQuotaFeatureId = K8S_RESOURCE_POOL_STORAGE_QUOTA;\n\n this.updateResourcePoolAsync = this.updateResourcePoolAsync.bind(this);\n this.getEvents = this.getEvents.bind(this);\n }\n /* #endregion */\n\n /* #region ANNOTATIONS MANAGEMENT */\n addAnnotation(ingressClass) {\n ingressClass.Annotations.push(new KubernetesResourcePoolIngressClassAnnotationFormValue());\n }\n\n removeAnnotation(ingressClass, index) {\n ingressClass.Annotations.splice(index, 1);\n this.onChangeIngressHostname();\n }\n /* #endregion */\n\n /* #region INGRESS MANAGEMENT */\n onChangeIngressHostname() {\n const state = this.state.duplicates.ingressHosts;\n const otherIngresses = _.without(this.allIngresses, ...this.ingresses);\n const allHosts = _.flatMap(otherIngresses, 'Hosts');\n\n const hosts = _.flatMap(this.formValues.IngressClasses, 'Hosts');\n const hostsWithoutRemoved = _.filter(hosts, { NeedsDeletion: false });\n const hostnames = _.map(hostsWithoutRemoved, 'Host');\n const formDuplicates = KubernetesFormValidationHelper.getDuplicates(hostnames);\n _.forEach(hostnames, (host, idx) => {\n if (host !== undefined && _.includes(allHosts, host)) {\n formDuplicates[idx] = host;\n }\n });\n const duplicatedHostnames = Object.values(formDuplicates);\n state.hasRefs = false;\n _.forEach(this.formValues.IngressClasses, (ic) => {\n _.forEach(ic.Hosts, (hostFV) => {\n if (_.includes(duplicatedHostnames, hostFV.Host) && hostFV.NeedsDeletion === false) {\n hostFV.Duplicate = true;\n state.hasRefs = true;\n } else {\n hostFV.Duplicate = false;\n }\n });\n });\n }\n\n addHostname(ingressClass) {\n ingressClass.Hosts.push(new KubernetesResourcePoolIngressClassHostFormValue());\n }\n\n removeHostname(ingressClass, index) {\n if (!ingressClass.Hosts[index].IsNew) {\n ingressClass.Hosts[index].NeedsDeletion = true;\n } else {\n ingressClass.Hosts.splice(index, 1);\n }\n this.onChangeIngressHostname();\n }\n\n restoreHostname(host) {\n if (!host.IsNew) {\n host.NeedsDeletion = false;\n }\n }\n /* #endregion*/\n\n selectTab(index) {\n this.LocalStorage.storeActiveTab('resourcePool', index);\n }\n\n isUpdateButtonDisabled() {\n return this.state.actionInProgress || (this.formValues.HasQuota && !this.isQuotaValid()) || this.state.duplicates.ingressHosts.hasRefs;\n }\n\n isQuotaValid() {\n if (\n this.state.sliderMaxCpu < this.formValues.CpuLimit ||\n this.state.sliderMaxMemory < this.formValues.MemoryLimit ||\n (this.formValues.CpuLimit === 0 && this.formValues.MemoryLimit === 0)\n ) {\n return false;\n }\n return true;\n }\n\n checkDefaults() {\n if (this.formValues.CpuLimit < KubernetesResourceQuotaDefaults.CpuLimit) {\n this.formValues.CpuLimit = KubernetesResourceQuotaDefaults.CpuLimit;\n }\n if (this.formValues.MemoryLimit < KubernetesResourceReservationHelper.megaBytesValue(KubernetesResourceQuotaDefaults.MemoryLimit)) {\n this.formValues.MemoryLimit = KubernetesResourceReservationHelper.megaBytesValue(KubernetesResourceQuotaDefaults.MemoryLimit);\n }\n }\n\n showEditor() {\n this.state.showEditorTab = true;\n this.selectTab(2);\n }\n\n hasResourceQuotaBeenReduced() {\n if (this.formValues.HasQuota && this.oldQuota) {\n const cpuLimit = this.formValues.CpuLimit;\n const memoryLimit = KubernetesResourceReservationHelper.bytesValue(this.formValues.MemoryLimit);\n if (cpuLimit < this.oldQuota.CpuLimit || memoryLimit < this.oldQuota.MemoryLimit) {\n return true;\n }\n }\n return false;\n }\n\n /* #region UPDATE NAMESPACE */\n async updateResourcePoolAsync(oldFormValues, newFormValues) {\n this.state.actionInProgress = true;\n try {\n this.checkDefaults();\n await this.KubernetesResourcePoolService.patch(oldFormValues, newFormValues);\n this.Notifications.success('Namespace successfully updated', this.pool.Namespace.Name);\n this.$state.reload(this.$state.current);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to create namespace');\n } finally {\n this.state.actionInProgress = false;\n }\n }\n\n updateResourcePool() {\n const ingressesToDelete = _.filter(this.formValues.IngressClasses, { WasSelected: true, Selected: false });\n const registriesToDelete = _.filter(this.registries, { WasChecked: true, Checked: false });\n const warnings = {\n quota: this.hasResourceQuotaBeenReduced(),\n ingress: ingressesToDelete.length !== 0,\n registries: registriesToDelete.length !== 0,\n };\n\n if (warnings.quota || warnings.ingress || warnings.registries) {\n const messages = {\n quota:\n 'Reducing the quota assigned to an \"in-use\" namespace may have unintended consequences, including preventing running applications from functioning correctly and potentially even blocking them from running at all.',\n ingress: 'Deactivating ingresses may cause applications to be unaccessible. All ingress configurations from affected applications will be removed.',\n registries:\n 'Some registries you removed might be used by one or more applications inside this environment. Removing the registries access could lead to a service interruption for these applications.',\n };\n const displayedMessage = `${warnings.quota ? messages.quota + '<br/><br/>' : ''}\n ${warnings.ingress ? messages.ingress + '<br/><br/>' : ''}\n ${warnings.registries ? messages.registries + '<br/><br/>' : ''}\n Do you wish to continue?`;\n this.ModalService.confirmUpdate(displayedMessage, (confirmed) => {\n if (confirmed) {\n return this.$async(this.updateResourcePoolAsync, this.savedFormValues, this.formValues);\n }\n });\n } else {\n return this.$async(this.updateResourcePoolAsync, this.savedFormValues, this.formValues);\n }\n }\n\n async confirmMarkUnmarkAsSystem() {\n const message = this.isSystem\n ? 'Unmarking this namespace as system will allow non administrator users to manage it and the resources in contains depending on the access control settings. Are you sure?'\n : 'Marking this namespace as a system namespace will prevent non administrator users from managing it and the resources it contains. Are you sure?';\n\n return new Promise((resolve) => {\n this.ModalService.confirmUpdate(message, resolve);\n });\n }\n\n markUnmarkAsSystem() {\n return this.$async(async () => {\n try {\n const namespaceName = this.$state.params.id;\n this.state.actionInProgress = true;\n\n const confirmed = await this.confirmMarkUnmarkAsSystem();\n if (!confirmed) {\n return;\n }\n await this.KubernetesResourcePoolService.toggleSystem(this.endpoint.Id, namespaceName, !this.isSystem);\n\n this.Notifications.success('Namespace successfully updated', namespaceName);\n this.$state.reload(this.$state.current);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to create namespace');\n } finally {\n this.state.actionInProgress = false;\n }\n });\n }\n /* #endregion */\n\n hasEventWarnings() {\n return this.state.eventWarningCount;\n }\n\n /* #region GET EVENTS */\n getEvents() {\n return this.$async(async () => {\n try {\n this.state.eventsLoading = true;\n this.events = await this.KubernetesEventService.get(this.pool.Namespace.Name);\n this.state.eventWarningCount = KubernetesEventHelper.warningCount(this.events);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve namespace related events');\n } finally {\n this.state.eventsLoading = false;\n }\n });\n }\n /* #endregion */\n\n /* #region GET APPLICATIONS */\n getApplications() {\n return this.$async(async () => {\n try {\n this.state.applicationsLoading = true;\n this.applications = await this.KubernetesApplicationService.get(this.pool.Namespace.Name);\n this.applications = _.map(this.applications, (app) => {\n const resourceReservation = KubernetesResourceReservationHelper.computeResourceReservation(app.Pods);\n app.CPU = resourceReservation.CPU;\n app.Memory = resourceReservation.Memory;\n return app;\n });\n\n if (this.state.useServerMetrics) {\n await this.getResourceUsage(this.pool.Namespace.Name);\n }\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve applications.');\n } finally {\n this.state.applicationsLoading = false;\n }\n });\n }\n /* #endregion */\n\n /* #region GET INGRESSES */\n getIngresses() {\n return this.$async(async () => {\n this.state.ingressesLoading = true;\n try {\n const namespace = this.pool.Namespace.Name;\n this.allIngresses = await this.KubernetesIngressService.get(this.state.hasWriteAuthorization ? '' : namespace);\n this.ingresses = _.filter(this.allIngresses, { Namespace: namespace });\n _.forEach(this.ingresses, (ing) => {\n ing.Namespace = namespace;\n _.forEach(ing.Paths, (path) => {\n const application = _.find(this.applications, { ServiceName: path.ServiceName });\n path.ApplicationName = application && application.Name ? application.Name : '-';\n });\n });\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve ingresses.');\n } finally {\n this.state.ingressesLoading = false;\n }\n });\n }\n /* #endregion */\n\n /* #region GET REGISTRIES */\n getRegistries() {\n return this.$async(async () => {\n try {\n const namespace = this.$state.params.id;\n\n if (this.isAdmin) {\n this.registries = await this.EndpointService.registries(this.endpoint.Id);\n this.registries.forEach((reg) => {\n if (reg.RegistryAccesses && reg.RegistryAccesses[this.endpoint.Id] && reg.RegistryAccesses[this.endpoint.Id].Namespaces.includes(namespace)) {\n reg.Checked = true;\n reg.WasChecked = true;\n this.formValues.Registries.push(reg);\n }\n });\n this.selectedRegistries = this.formValues.Registries.map((r) => r.Name).join(', ');\n return;\n }\n\n const registries = await this.EndpointService.registries(this.endpoint.Id, namespace);\n this.selectedRegistries = registries.map((r) => r.Name).join(', ');\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve registries');\n }\n });\n }\n /* #endregion */\n\n async getResourceUsage(namespace) {\n try {\n const namespaceMetrics = await this.KubernetesMetricsService.getPods(namespace);\n // extract resource usage of all containers within each pod of the namespace\n const containerResourceUsageList = namespaceMetrics.items.flatMap((i) => i.containers.map((c) => c.usage));\n const namespaceResourceUsage = containerResourceUsageList.reduce((total, u) => {\n total.CPU += KubernetesResourceReservationHelper.parseCPU(u.cpu);\n total.Memory += KubernetesResourceReservationHelper.megaBytesValue(u.memory);\n return total;\n }, new KubernetesResourceReservation());\n this.state.resourceUsage = namespaceResourceUsage;\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve namespace resource usage');\n }\n }\n\n /* #region ON INIT */\n $onInit() {\n return this.$async(async () => {\n try {\n this.isAdmin = this.Authentication.isAdmin();\n\n this.state = {\n actionInProgress: false,\n sliderMaxMemory: 0,\n sliderMaxCpu: 0,\n cpuUsage: 0,\n memoryUsage: 0,\n resourceReservation: { CPU: 0, Memory: 0 },\n activeTab: 0,\n currentName: this.$state.$current.name,\n showEditorTab: false,\n eventsLoading: true,\n applicationsLoading: true,\n ingressesLoading: true,\n viewReady: false,\n eventWarningCount: 0,\n canUseIngress: this.endpoint.Kubernetes.Configuration.IngressClasses.length,\n useServerMetrics: this.endpoint.Kubernetes.Configuration.UseServerMetrics,\n duplicates: {\n ingressHosts: new KubernetesFormValidationReferences(),\n },\n };\n\n this.state.activeTab = this.LocalStorage.getActiveTab('resourcePool');\n\n const name = this.$state.params.id;\n\n const [nodes, pools] = await Promise.all([this.KubernetesNodeService.get(), this.KubernetesResourcePoolService.get()]);\n\n this.pool = _.find(pools, { Namespace: { Name: name } });\n this.formValues = new KubernetesResourcePoolFormValues(KubernetesResourceQuotaDefaults);\n this.formValues.Name = this.pool.Namespace.Name;\n this.formValues.EndpointId = this.endpoint.Id;\n this.formValues.IsSystem = this.pool.Namespace.IsSystem;\n\n _.forEach(nodes, (item) => {\n this.state.sliderMaxMemory += filesizeParser(item.Memory);\n this.state.sliderMaxCpu += item.CPU;\n });\n this.state.sliderMaxMemory = KubernetesResourceReservationHelper.megaBytesValue(this.state.sliderMaxMemory);\n\n const quota = this.pool.Quota;\n if (quota) {\n this.oldQuota = angular.copy(quota);\n this.formValues = KubernetesResourceQuotaConverter.quotaToResourcePoolFormValues(quota);\n this.formValues.EndpointId = this.endpoint.Id;\n\n this.state.resourceReservation.CPU = quota.CpuLimitUsed;\n this.state.resourceReservation.Memory = KubernetesResourceReservationHelper.megaBytesValue(quota.MemoryLimitUsed);\n }\n this.isSystem = KubernetesNamespaceHelper.isSystemNamespace(this.pool.Namespace.Name);\n this.isDefaultNamespace = KubernetesNamespaceHelper.isDefaultNamespace(this.pool.Namespace.Name);\n this.isEditable = !this.isSystem && !this.isDefaultNamespace;\n\n await this.getEvents();\n await this.getApplications();\n\n if (this.state.canUseIngress) {\n await this.getIngresses();\n const ingressClasses = this.endpoint.Kubernetes.Configuration.IngressClasses;\n this.formValues.IngressClasses = KubernetesIngressConverter.ingressClassesToFormValues(ingressClasses, this.ingresses);\n _.forEach(this.formValues.IngressClasses, (ic) => {\n if (ic.Hosts.length === 0) {\n ic.Hosts.push(new KubernetesResourcePoolIngressClassHostFormValue());\n }\n });\n }\n\n await this.getRegistries();\n\n this.savedFormValues = angular.copy(this.formValues);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to load view data');\n } finally {\n this.state.viewReady = true;\n }\n });\n }\n\n /* #endregion */\n\n $onDestroy() {\n if (this.state.currentName !== this.$state.$current.name) {\n this.LocalStorage.storeActiveTab('resourcePool', 0);\n }\n }\n}\n\nexport default KubernetesResourcePoolController;\nangular.module('portainer.kubernetes').controller('KubernetesResourcePoolController', KubernetesResourcePoolController);\n","const autoNgTemplateLoaderTemplate1 = require('./resourcePools.html');\n\nangular.module('portainer.kubernetes').component('kubernetesResourcePoolsView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'KubernetesResourcePoolsController',\n controllerAs: 'ctrl',\n bindings: {\n endpoint: '<',\n },\n});\n","var path = 'app/kubernetes/views/resource-pools/resourcePools.html';\nvar html = \"<kubernetes-view-header title=\\\"Namespace list\\\" state=\\\"kubernetes.resourcePools\\\" view-ready=\\\"ctrl.state.viewReady\\\">\\n Namespaces\\n</kubernetes-view-header>\\n\\n<kubernetes-view-loading view-ready=\\\"ctrl.state.viewReady\\\"></kubernetes-view-loading>\\n\\n<div ng-if=\\\"ctrl.state.viewReady\\\">\\n <div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <kubernetes-resource-pools-datatable\\n dataset=\\\"ctrl.resourcePools\\\"\\n table-key=\\\"kubernetes.resourcePools\\\"\\n order-by=\\\"Namespace.Name\\\"\\n remove-action=\\\"ctrl.removeAction\\\"\\n refresh-callback=\\\"ctrl.getResourcePools\\\"\\n endpoint=\\\"ctrl.endpoint\\\"\\n data-cy=\\\"k8sNamespace-namespaceTable\\\"\\n ></kubernetes-resource-pools-datatable>\\n </div>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import angular from 'angular';\n\nclass KubernetesResourcePoolsController {\n /* @ngInject */\n constructor($async, $state, Notifications, ModalService, KubernetesResourcePoolService) {\n this.$async = $async;\n this.$state = $state;\n this.Notifications = Notifications;\n this.ModalService = ModalService;\n this.KubernetesResourcePoolService = KubernetesResourcePoolService;\n\n this.onInit = this.onInit.bind(this);\n this.getResourcePools = this.getResourcePools.bind(this);\n this.getResourcePoolsAsync = this.getResourcePoolsAsync.bind(this);\n this.removeAction = this.removeAction.bind(this);\n this.removeActionAsync = this.removeActionAsync.bind(this);\n }\n\n async removeActionAsync(selectedItems) {\n let actionCount = selectedItems.length;\n for (const pool of selectedItems) {\n try {\n await this.KubernetesResourcePoolService.delete(pool);\n this.Notifications.success('Namespace successfully removed', pool.Namespace.Name);\n const index = this.resourcePools.indexOf(pool);\n this.resourcePools.splice(index, 1);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to remove namespace');\n } finally {\n --actionCount;\n if (actionCount === 0) {\n this.$state.reload(this.$state.current);\n }\n }\n }\n }\n\n removeAction(selectedItems) {\n this.ModalService.confirmDeletion(\n 'Do you want to remove the selected namespace(s)? All the resources associated to the selected namespace(s) will be removed too.',\n (confirmed) => {\n if (confirmed) {\n return this.$async(this.removeActionAsync, selectedItems);\n }\n }\n );\n }\n\n async getResourcePoolsAsync() {\n try {\n this.resourcePools = await this.KubernetesResourcePoolService.get();\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retreive namespaces');\n }\n }\n\n getResourcePools() {\n return this.$async(this.getResourcePoolsAsync);\n }\n\n async onInit() {\n this.state = {\n viewReady: false,\n };\n\n await this.getResourcePools();\n\n this.state.viewReady = true;\n }\n\n $onInit() {\n return this.$async(this.onInit);\n }\n}\n\nexport default KubernetesResourcePoolsController;\nangular.module('portainer.kubernetes').controller('KubernetesResourcePoolsController', KubernetesResourcePoolsController);\n","const autoNgTemplateLoaderTemplate1 = require('./logs.html');\n\nangular.module('portainer.kubernetes').component('kubernetesStackLogsView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'KubernetesStackLogsController',\n controllerAs: 'ctrl',\n bindings: {\n $transition$: '<',\n },\n});\n","var path = 'app/kubernetes/views/stacks/logs/logs.html';\nvar html = \"<kubernetes-view-header title=\\\"Stacks logs\\\" state=\\\"kubernetes.stacks.stack.logs\\\" view-ready=\\\"ctrl.state.viewReady\\\">\\n <a ui-sref=\\\"kubernetes.resourcePools\\\">Namespaces</a>\\n > <a ui-sref=\\\"kubernetes.resourcePools.resourcePool({ id: ctrl.state.transition.namespace })\\\">{{ ctrl.state.transition.namespace }}</a> >\\n <a ui-sref=\\\"kubernetes.applications\\\">Applications</a> > Stacks > {{ ctrl.state.transition.name }} > Logs\\n</kubernetes-view-header>\\n\\n<kubernetes-view-loading view-ready=\\\"ctrl.state.viewReady\\\"></kubernetes-view-loading>\\n\\n<div ng-if=\\\"ctrl.state.viewReady\\\" style=\\\"height: 100%;\\\">\\n <div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\" autocomplete=\\\"off\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <!-- auto-refresh -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label class=\\\"control-label text-left\\\">\\n Auto-refresh\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"Automatically refresh logs every 30 seconds\\\"></portainer-tooltip>\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\"> <input type=\\\"checkbox\\\" ng-model=\\\"ctrl.state.autoRefresh\\\" ng-change=\\\"ctrl.updateAutoRefresh()\\\" /><i></i> </label>\\n </div>\\n </div>\\n <!-- !auto-refresh -->\\n <!-- search -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"logs_search\\\" class=\\\"col-sm-1 control-label text-left\\\">\\n Search\\n </label>\\n <div class=\\\"col-sm-11\\\">\\n <input\\n class=\\\"form-control\\\"\\n type=\\\"text\\\"\\n name=\\\"logs_search\\\"\\n ng-model=\\\"ctrl.state.search\\\"\\n ng-change=\\\"ctrl.state.selectedLines.length = 0;\\\"\\n placeholder=\\\"Filter...\\\"\\n auto-focus\\n />\\n </div>\\n </div>\\n <!-- !search -->\\n <!-- actions -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button class=\\\"btn btn-primary btn-sm\\\" type=\\\"button\\\" ng-click=\\\"ctrl.downloadLogs()\\\" style=\\\"margin-left: 0;\\\"><i class=\\\"fa fa-download\\\"></i> Download logs</button>\\n </div>\\n </div>\\n <!-- !actions -->\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n </div>\\n\\n <div class=\\\"row\\\" style=\\\"height: 54%;\\\">\\n <div class=\\\"col-sm-12\\\" style=\\\"height: 100%;\\\">\\n <pre\\n class=\\\"log_viewer\\\"\\n ><div ng-repeat=\\\"line in ctrl.state.filteredLogs = (ctrl.stackLogs | filter:ctrl.state.search) track by $index\\\" class=\\\"line\\\" ng-if=\\\"line\\\"><p class=\\\"inner_line\\\"><span ng-style=\\\"{'color': line.Color, 'font-weight': 'bold'};\\\">{{ line.AppName }}</span> {{ line.Line }}</p></div><div ng-if=\\\"ctrl.stackLogs.length && !ctrl.state.filteredLogs.length\\\" class=\\\"line\\\"><p class=\\\"inner_line\\\">No log line matching the '{{ ctrl.state.search }}' filter</p></div><div ng-if=\\\"ctrl.stackLogs.length === 0\\\" class=\\\"line\\\"><p class=\\\"inner_line\\\">No logs available</p></div></pre>\\n </div>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import _ from 'lodash-es';\nimport angular from 'angular';\nimport $allSettled from 'Portainer/services/allSettled';\n\nconst colors = ['red', 'orange', 'lime', 'green', 'darkgreen', 'cyan', 'turquoise', 'teal', 'deepskyblue', 'blue', 'darkblue', 'slateblue', 'magenta', 'darkviolet'];\n\nclass KubernetesStackLogsController {\n /* @ngInject */\n constructor($async, $state, $interval, Notifications, KubernetesApplicationService, KubernetesPodService, FileSaver, Blob) {\n this.$async = $async;\n this.$state = $state;\n this.$interval = $interval;\n this.Notifications = Notifications;\n this.KubernetesApplicationService = KubernetesApplicationService;\n this.KubernetesPodService = KubernetesPodService;\n this.Blob = Blob;\n this.FileSaver = FileSaver;\n\n this.onInit = this.onInit.bind(this);\n this.stopRepeater = this.stopRepeater.bind(this);\n this.generateLogsPromise = this.generateLogsPromise.bind(this);\n this.generateAppPromise = this.generateAppPromise.bind(this);\n this.getStackLogsAsync = this.getStackLogsAsync.bind(this);\n }\n\n updateAutoRefresh() {\n if (this.state.autoRefresh) {\n this.setUpdateRepeater();\n return;\n }\n\n this.stopRepeater();\n }\n\n stopRepeater() {\n if (angular.isDefined(this.repeater)) {\n this.$interval.cancel(this.repeater);\n this.repeater = null;\n }\n }\n\n setUpdateRepeater() {\n this.repeater = this.$interval(this.getStackLogsAsync, this.state.refreshRate);\n }\n\n async generateLogsPromise(pod, container) {\n const res = {\n Pod: pod,\n Logs: [],\n };\n res.Logs = await this.KubernetesPodService.logs(pod.Namespace, pod.Name, container.Name);\n return res;\n }\n\n async generateAppPromise(app) {\n const res = {\n Application: app,\n Pods: [],\n };\n\n const promises = _.flatMap(_.map(app.Pods, (pod) => _.map(pod.Containers, (container) => this.generateLogsPromise(pod, container))));\n const result = await $allSettled(promises);\n res.Pods = result.fulfilled;\n return res;\n }\n\n async getStackLogsAsync() {\n try {\n const applications = await this.KubernetesApplicationService.get(this.state.transition.namespace);\n const filteredApplications = _.filter(applications, (app) => app.StackName === this.state.transition.name);\n const logsPromises = _.map(filteredApplications, this.generateAppPromise);\n const data = await Promise.all(logsPromises);\n const logs = _.flatMap(data, (app, index) => {\n return _.flatMap(app.Pods, (pod) => {\n return _.map(pod.Logs, (line) => {\n const res = {\n Color: colors[index % colors.length],\n Line: line,\n AppName: pod.Pod.Name,\n };\n return res;\n });\n });\n });\n this.stackLogs = logs;\n } catch (err) {\n this.stopRepeater();\n this.Notifications.error('Failure', err, 'Unable to retrieve application logs');\n }\n }\n\n downloadLogs() {\n const data = new this.Blob([(this.dataLogs = _.reduce(this.stackLogs, (acc, log) => acc + '\\n' + log.AppName + ' ' + log.Line, ''))]);\n this.FileSaver.saveAs(data, this.state.transition.name + '_logs.txt');\n }\n\n async onInit() {\n this.state = {\n autoRefresh: false,\n refreshRate: 30000, // 30 seconds\n search: '',\n viewReady: false,\n transition: {\n namespace: this.$transition$.params().namespace,\n name: this.$transition$.params().name,\n },\n };\n\n this.stackLogs = [];\n try {\n await this.getStackLogsAsync();\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve stack logs');\n } finally {\n this.state.viewReady = true;\n }\n }\n\n $onInit() {\n return this.$async(this.onInit);\n }\n\n $onDestroy() {\n this.stopRepeater();\n }\n}\n\nexport default KubernetesStackLogsController;\nangular.module('portainer.kubernetes').controller('KubernetesStackLogsController', KubernetesStackLogsController);\n","const autoNgTemplateLoaderTemplate1 = require('./summary.html');\n\nangular.module('portainer.kubernetes').component('kubernetesSummaryView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'KubernetesSummaryController',\n controllerAs: '$ctrl',\n bindings: {\n formValues: '<',\n oldFormValues: '<',\n },\n});\n","var path = 'app/kubernetes/views/summary/summary.html';\nvar html = \"<div\\n class=\\\"col-xs-12 form-section-title interactive\\\"\\n ng-click=\\\"$ctrl.toggleSummary()\\\"\\n style=\\\"display: flex; justify-content: space-between;\\\"\\n ng-if=\\\"$ctrl.state.resources.length > 0\\\"\\n>\\n Summary\\n <span class=\\\"small space-left\\\">\\n <a ng-if=\\\"!$ctrl.state.expandedTemplate\\\"><i class=\\\"fa fa-angle-down\\\" aria-hidden=\\\"true\\\"></i> expand</a>\\n <a ng-if=\\\"$ctrl.state.expandedTemplate\\\"><i class=\\\"fa fa-angle-up\\\" aria-hidden=\\\"true\\\"></i> collapse</a>\\n </span>\\n</div>\\n\\n<div class=\\\"form-group\\\" ng-if=\\\"$ctrl.state.expandedTemplate\\\">\\n <div class=\\\"col-sm-12 small text-muted\\\">\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Portainer will execute the following Kubernetes actions.\\n </div>\\n\\n <div class=\\\"col-sm-12 small text-muted\\\" style=\\\"padding-top: 1em;\\\" ng-if=\\\"$ctrl.state.resources.length > 0\\\">\\n <ul>\\n <li ng-repeat=\\\"summary in $ctrl.state.resources\\\" ng-if=\\\"summary.action && summary.kind && summary.name\\\">\\n {{ summary.action }}\\n {{ $ctrl.getArticle(summary.kind, summary.action) }}\\n <span class=\\\"bold\\\">{{ summary.kind }}</span> named <code>{{ summary.name }}</code>\\n <span ng-if=\\\"summary.type\\\">\\n of type <code>{{ summary.type }}</code></span\\n >\\n </li>\\n <li ng-if=\\\"$ctrl.state.limits.memory\\\">\\n Set the memory resources limits and requests to <code>{{ $ctrl.state.limits.memory }}M</code>\\n </li>\\n <li ng-if=\\\"$ctrl.state.limits.cpu\\\">\\n Set the CPU resources limits and requests to <code>{{ $ctrl.state.limits.cpu }}</code>\\n </li>\\n </ul>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import angular from 'angular';\nimport { KubernetesConfigurationFormValues } from 'Kubernetes/models/configuration/formvalues';\nimport { KubernetesResourcePoolFormValues } from 'Kubernetes/models/resource-pool/formValues';\nimport { KubernetesApplicationFormValues } from 'Kubernetes/models/application/formValues';\nimport { KubernetesResourceActions, KubernetesResourceTypes } from 'Kubernetes/models/resource-types/models';\nimport getApplicationResources from './resources/applicationResources';\nimport getNamespaceResources from './resources/namespaceResources';\nimport getConfigurationResources from './resources/configurationResources';\n\nclass KubernetesSummaryController {\n /* @ngInject */\n constructor($scope, LocalStorage, KubernetesResourcePoolService) {\n this.LocalStorage = LocalStorage;\n this.KubernetesResourcePoolService = KubernetesResourcePoolService;\n\n this.toggleSummary = this.toggleSummary.bind(this);\n this.generateResourceSummaryList = this.generateResourceSummaryList.bind(this);\n\n // Deep-watch changes on formValues property\n $scope.$watch(\n '$ctrl.formValues',\n (formValues) => {\n this.state.resources = this.generateResourceSummaryList(angular.copy(formValues));\n },\n true\n );\n }\n\n getArticle(resourceType, resourceAction) {\n let article = 'a';\n if (resourceAction === KubernetesResourceActions.CREATE) {\n if (resourceType === KubernetesResourceTypes.INGRESS) {\n article = 'an';\n }\n } else {\n article = 'the';\n }\n\n return article;\n }\n\n /**\n * toggleSummary toggles the summary panel state and persists it to browser localstorage\n */\n toggleSummary() {\n this.state.expandedTemplate = !this.state.expandedTemplate;\n this.LocalStorage.storeKubernetesSummaryToggle(this.state.expandedTemplate);\n }\n\n /**\n * generateResourceSummaryList maps formValues to custom object\n * @param {object} formValues\n * @returns {object} => { action: \"string\", kind: \"string\", name: \"string\" }\n */\n generateResourceSummaryList(formValues) {\n const oldFormValues = this.oldFormValues;\n\n if (formValues instanceof KubernetesConfigurationFormValues) {\n // Configuration\n return getConfigurationResources(formValues);\n } else if (formValues instanceof KubernetesResourcePoolFormValues) {\n // Namespaces\n return getNamespaceResources(formValues, oldFormValues);\n } else if (formValues instanceof KubernetesApplicationFormValues) {\n // Applications\n\n // extract cpu and memory requests & limits for pod\n this.state.limits = { cpu: formValues.CpuLimit, memory: formValues.MemoryLimit };\n\n return getApplicationResources(formValues, oldFormValues);\n }\n\n return [];\n }\n\n $onInit() {\n const toggleValue = this.LocalStorage.getKubernetesSummaryToggle();\n const expanded = typeof toggleValue === 'boolean' ? toggleValue : true;\n\n this.state = {\n expandedTemplate: expanded,\n resources: [],\n limits: { cpu: null, memory: null },\n };\n }\n}\n\nexport default KubernetesSummaryController;\nangular.module('portainer.kubernetes').controller('KubernetesSummaryController', KubernetesSummaryController);\n","import _ from 'lodash-es';\n\nangular.module('portainer.kubernetes').controller('KubernetesVolumesStoragesDatatableController', [\n '$scope',\n '$controller',\n 'DatatableService',\n function ($scope, $controller, DatatableService) {\n angular.extend(this, $controller('GenericDatatableController', { $scope: $scope }));\n this.state = Object.assign(this.state, {\n expandedItems: [],\n expandAll: false,\n });\n\n this.onSettingsRepeaterChange = function () {\n DatatableService.setDataTableSettings(this.tableKey, this.settings);\n };\n\n this.expandItem = function (item, expanded) {\n if (!this.itemCanExpand(item)) {\n return;\n }\n\n item.Expanded = expanded;\n if (!expanded) {\n item.Highlighted = false;\n }\n };\n\n this.itemCanExpand = function (item) {\n return item.Volumes.length > 0;\n };\n\n this.hasExpandableItems = function () {\n return _.filter(this.state.filteredDataSet, (item) => this.itemCanExpand(item)).length;\n };\n\n this.expandAll = function () {\n this.state.expandAll = !this.state.expandAll;\n _.forEach(this.state.filteredDataSet, (item) => {\n if (this.itemCanExpand(item)) {\n this.expandItem(item, this.state.expandAll);\n }\n });\n };\n\n this.$onInit = function () {\n this.setDefaults();\n this.prepareTableFromDataset();\n\n this.state.orderBy = this.orderBy;\n var storedOrder = DatatableService.getDataTableOrder(this.tableKey);\n if (storedOrder !== null) {\n this.state.reverseOrder = storedOrder.reverse;\n this.state.orderBy = storedOrder.orderBy;\n }\n\n var textFilter = DatatableService.getDataTableTextFilters(this.tableKey);\n if (textFilter !== null) {\n this.state.textFilter = textFilter;\n this.onTextFilterChange();\n }\n\n var storedFilters = DatatableService.getDataTableFilters(this.tableKey);\n if (storedFilters !== null) {\n this.filters = storedFilters;\n }\n if (this.filters && this.filters.state) {\n this.filters.state.open = false;\n }\n\n var storedSettings = DatatableService.getDataTableSettings(this.tableKey);\n if (storedSettings !== null) {\n this.settings = storedSettings;\n this.settings.open = false;\n }\n this.onSettingsRepeaterChange();\n };\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./template.html');\n\nangular.module('portainer.kubernetes').component('kubernetesVolumesStoragesDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'KubernetesVolumesStoragesDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n refreshCallback: '<',\n },\n});\n","var path = 'app/kubernetes/views/volumes/components/volumes-storages-datatable/template.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n <div class=\\\"settings\\\">\\n <span class=\\\"setting\\\" ng-class=\\\"{ 'setting-active': $ctrl.settings.open }\\\" uib-dropdown dropdown-append-to-body auto-close=\\\"disabled\\\" is-open=\\\"$ctrl.settings.open\\\">\\n <span uib-dropdown-toggle><i class=\\\"fa fa-cog\\\" aria-hidden=\\\"true\\\"></i> Table settings</span>\\n <div class=\\\"dropdown-menu dropdown-menu-right\\\" uib-dropdown-menu>\\n <div class=\\\"tableMenu\\\">\\n <div class=\\\"menuHeader\\\">\\n Table settings\\n </div>\\n <div class=\\\"menuContent\\\">\\n <div>\\n <div class=\\\"md-checkbox\\\">\\n <input id=\\\"setting_auto_refresh\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.settings.repeater.autoRefresh\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" />\\n <label for=\\\"setting_auto_refresh\\\">Auto refresh</label>\\n </div>\\n <div ng-if=\\\"$ctrl.settings.repeater.autoRefresh\\\">\\n <label for=\\\"settings_refresh_rate\\\">\\n Refresh rate\\n </label>\\n <select id=\\\"settings_refresh_rate\\\" ng-model=\\\"$ctrl.settings.repeater.refreshRate\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" class=\\\"small-select\\\">\\n <option value=\\\"10\\\">10s</option>\\n <option value=\\\"30\\\">30s</option>\\n <option value=\\\"60\\\">1min</option>\\n <option value=\\\"120\\\">2min</option>\\n <option value=\\\"300\\\">5min</option>\\n </select>\\n <span>\\n <i id=\\\"refreshRateChange\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-top: 7px; display: none;\\\"></i>\\n </span>\\n </div>\\n </div>\\n </div>\\n <div>\\n <a type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"$ctrl.settings.open = false;\\\">Close</a>\\n </div>\\n </div>\\n </div>\\n </span>\\n </div>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n auto-focus\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th style=\\\"width: 20px;\\\">\\n <a ng-click=\\\"$ctrl.expandAll()\\\" ng-if=\\\"$ctrl.hasExpandableItems()\\\">\\n <i ng-class=\\\"{ 'fas fa-angle-down': $ctrl.state.expandAll, 'fas fa-angle-right': !$ctrl.state.expandAll }\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </th>\\n <th style=\\\"width: 60%;\\\">\\n <a ng-click=\\\"$ctrl.changeOrderBy('Name')\\\">\\n Storage\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th style=\\\"width: 38%;\\\">\\n <a ng-click=\\\"$ctrl.changeOrderBy('Size')\\\">\\n Usage\\n <i class=\\\"fa fa-sort-numeric-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Size' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-numeric-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Size' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate-start=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit: $ctrl.tableKey))\\\"\\n ng-class=\\\"{ active: item.Checked, 'datatable-highlighted': item.Highlighted }\\\"\\n ng-click=\\\"$ctrl.expandItem(item, !item.Expanded)\\\"\\n pagination-id=\\\"$ctrl.tableKey\\\"\\n >\\n <td>\\n <a ng-if=\\\"$ctrl.itemCanExpand(item)\\\">\\n <i ng-class=\\\"{ 'fas fa-angle-down': item.Expanded, 'fas fa-angle-right': !item.Expanded }\\\" class=\\\"space-right\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </td>\\n <td>{{ item.Name }}</td>\\n <td>{{ item.Size }}</td>\\n </tr>\\n <tr\\n dir-paginate-end\\n ng-show=\\\"item.Expanded\\\"\\n ng-repeat=\\\"vol in item.Volumes\\\"\\n ng-class=\\\"{ 'datatable-highlighted': item.Highlighted, 'datatable-unhighlighted': !item.Highlighted }\\\"\\n >\\n <td></td>\\n <td>\\n <a ui-sref=\\\"kubernetes.volumes.volume({ name: vol.PersistentVolumeClaim.Name, namespace: vol.PersistentVolumeClaim.Namespace })\\\">\\n {{ vol.PersistentVolumeClaim.Name }}\\n </a>\\n </td>\\n <td>\\n {{ vol.PersistentVolumeClaim.Storage }}\\n </td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"5\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"5\\\" class=\\\"text-center text-muted\\\">No storage available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\" pagination-id=\\\"$ctrl.tableKey\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./volume.html');\n\nangular.module('portainer.kubernetes').component('kubernetesVolumeView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'KubernetesVolumeController',\n controllerAs: 'ctrl',\n bindings: {\n $transition$: '<',\n },\n});\n","var path = 'app/kubernetes/views/volumes/edit/volume.html';\nvar html = \"<kubernetes-view-header title=\\\"Volume details\\\" state=\\\"kubernetes.volumes.volume\\\" view-ready=\\\"ctrl.state.viewReady\\\">\\n <a ui-sref=\\\"kubernetes.resourcePools\\\">Namespaces</a> >\\n <a ui-sref=\\\"kubernetes.resourcePools.resourcePool({ id: ctrl.volume.ResourcePool.Namespace.Name })\\\">{{ ctrl.volume.ResourcePool.Namespace.Name }}</a> >\\n <a ui-sref=\\\"kubernetes.volumes\\\">Volumes</a> > {{ ctrl.volume.PersistentVolumeClaim.Name }}\\n</kubernetes-view-header>\\n\\n<kubernetes-view-loading view-ready=\\\"ctrl.state.viewReady\\\"></kubernetes-view-loading>\\n\\n<div ng-if=\\\"ctrl.state.viewReady\\\">\\n <div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <uib-tabset active=\\\"ctrl.state.activeTab\\\" justified=\\\"true\\\" type=\\\"pills\\\">\\n <uib-tab index=\\\"0\\\" classes=\\\"btn-sm\\\" select=\\\"ctrl.selectTab(0)\\\">\\n <uib-tab-heading data-cy=\\\"k8sVolDetail-volTab\\\"> <i class=\\\"fa fa-database space-right\\\" aria-hidden=\\\"true\\\"></i> Volume </uib-tab-heading>\\n\\n <div style=\\\"padding: 20px;\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr>\\n <td>Name</td>\\n <td data-cy=\\\"k8sVolDetail-volName\\\">\\n {{ ctrl.volume.PersistentVolumeClaim.Name }}\\n <span class=\\\"label label-primary image-tag label-margins\\\" ng-if=\\\"!ctrl.isSystemNamespace() && ctrl.isExternalVolume()\\\">external</span>\\n <span class=\\\"label label-warning image-tag label-margins\\\" ng-if=\\\"!ctrl.isSystemNamespace() && !ctrl.isUsed()\\\">unused</span>\\n </td>\\n </tr>\\n <tr>\\n <td>Namespace</td>\\n <td>\\n <a ui-sref=\\\"kubernetes.resourcePools.resourcePool({ id: ctrl.volume.ResourcePool.Namespace.Name })\\\" data-cy=\\\"k8sVolDetail-volNamespace\\\">{{\\n ctrl.volume.ResourcePool.Namespace.Name\\n }}</a>\\n <span style=\\\"margin-left: 5px;\\\" class=\\\"label label-info image-tag\\\" ng-if=\\\"ctrl.isSystemNamespace()\\\">system</span>\\n </td>\\n </tr>\\n <tr>\\n <td>Storage</td>\\n <td data-cy=\\\"k8sVolDetail-volStorageClassname\\\">{{ ctrl.volume.PersistentVolumeClaim.StorageClass.Name }}</td>\\n </tr>\\n <tr>\\n <td>Shared Access Policy</td>\\n <td data-cy=\\\"k8sVolDetail-volAccessPolicy\\\"\\n >{{ ctrl.state.volumeSharedAccessPolicy }}\\n <portainer-tooltip\\n position=\\\"bottom\\\"\\n ng-if=\\\"ctrl.state.volumeSharedAccessPolicyTooltip\\\"\\n message=\\\"{{ ctrl.state.volumeSharedAccessPolicyTooltip }}\\\"\\n ></portainer-tooltip\\n ></td>\\n </tr>\\n <tr>\\n <td>Provisioner</td>\\n <td data-cy=\\\"k8sVolDetail-volProvisioner\\\">{{\\n ctrl.volume.PersistentVolumeClaim.StorageClass.Provisioner ? ctrl.volume.PersistentVolumeClaim.StorageClass.Provisioner : '-'\\n }}</td>\\n </tr>\\n <tr>\\n <td>Creation date</td>\\n <td data-cy=\\\"k8sVolDetail-volCreatedAt\\\">{{ ctrl.volume.PersistentVolumeClaim.CreationDate | getisodate }}</td>\\n </tr>\\n <tr>\\n <td>Size</td>\\n <td ng-if=\\\"!ctrl.state.increaseSize\\\">\\n {{ ctrl.volume.PersistentVolumeClaim.Storage }}\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-primary\\\"\\n ng-click=\\\"ctrl.state.increaseSize = true\\\"\\n ng-if=\\\"ctrl.volume.PersistentVolumeClaim.StorageClass.AllowVolumeExpansion\\\"\\n data-cy=\\\"k8sVolDetail-increaseSizeButton\\\"\\n >Increase size</button\\n >\\n </td>\\n <td ng-if=\\\"ctrl.state.increaseSize\\\">\\n <form name=\\\"kubernetesVolumeUpdateForm\\\">\\n <div class=\\\"form-inline\\\">\\n <div class=\\\"input-group input-group-sm\\\">\\n <input\\n type=\\\"number\\\"\\n class=\\\"form-control\\\"\\n name=\\\"size\\\"\\n ng-model=\\\"ctrl.state.volumeSize\\\"\\n placeholder=\\\"20\\\"\\n ng-min=\\\"0\\\"\\n min=\\\"0\\\"\\n ng-change=\\\"ctrl.onChangeSize()\\\"\\n required\\n data-cy=\\\"k8sVolDetail-increaseSizeInput\\\"\\n />\\n <span class=\\\"input-group-addon\\\" style=\\\"padding: 0;\\\">\\n <select\\n ng-model=\\\"ctrl.state.volumeSizeUnit\\\"\\n ng-change=\\\"ctrl.onChangeSize()\\\"\\n ng-options=\\\"unit for unit in ctrl.state.availableSizeUnits\\\"\\n style=\\\"width: 100%; height: 100%;\\\"\\n data-cy=\\\"k8sVolDetail-increaseSizeUnits\\\"\\n ></select>\\n </span>\\n </div>\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-primary\\\"\\n ng-disabled=\\\"!ctrl.sizeIsValid()\\\"\\n ng-click=\\\"ctrl.updateVolume()\\\"\\n data-cy=\\\"k8sVolDetail-updateSizeConfirm\\\"\\n >\\n Update size\\n </button>\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-default\\\" ng-click=\\\"ctrl.state.increaseSize = false\\\" data-cy=\\\"k8sVolDetail-cancelUpdateSize\\\">\\n Cancel\\n </button>\\n </div>\\n\\n <div class=\\\"form-inline\\\">\\n <div class=\\\"small text-warning\\\" style=\\\"margin-top: 5px;\\\" ng-show=\\\"ctrl.state.errors.volumeSize || kubernetesVolumeUpdateForm.size.$invalid\\\">\\n <div ng-messages=\\\"kubernetesVolumeUpdateForm.size.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n <p ng-show=\\\"ctrl.state.errors.volumeSize && !kubernetesVolumeUpdateForm.size.$invalid\\\"\\n ><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> The new size must be greater than the actual size.</p\\n >\\n </div>\\n </div>\\n </form>\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n </uib-tab>\\n\\n <uib-tab index=\\\"1\\\" classes=\\\"btn-sm\\\" select=\\\"ctrl.selectTab(1)\\\">\\n <uib-tab-heading data-cy=\\\"k8sVolDetail-volEventsTab\\\">\\n <i class=\\\"fa fa-history space-right\\\" aria-hidden=\\\"true\\\"></i> Events\\n <div ng-if=\\\"ctrl.hasEventWarnings()\\\">\\n <i class=\\\"fa fa-exclamation-circle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n {{ ctrl.state.eventWarningCount }} warning(s)\\n </div>\\n </uib-tab-heading>\\n <kubernetes-events-datatable\\n title-text=\\\"Events\\\"\\n title-icon=\\\"fa-history\\\"\\n dataset=\\\"ctrl.events\\\"\\n table-key=\\\"kubernetes.volume.events\\\"\\n order-by=\\\"Date\\\"\\n reverse-order=\\\"true\\\"\\n loading=\\\"ctrl.state.eventsLoading\\\"\\n refresh-callback=\\\"ctrl.getEvents\\\"\\n >\\n </kubernetes-events-datatable>\\n </uib-tab>\\n\\n <uib-tab index=\\\"2\\\" ng-if=\\\"ctrl.volume.PersistentVolumeClaim.Yaml\\\" select=\\\"ctrl.showEditor()\\\" classes=\\\"btn-sm\\\">\\n <uib-tab-heading data-cy=\\\"k8sVolDetail-volYamlTab\\\"> <i class=\\\"fa fa-code space-right\\\" aria-hidden=\\\"true\\\"></i> YAML </uib-tab-heading>\\n <div style=\\\"padding-right: 25px;\\\" ng-if=\\\"ctrl.state.showEditorTab\\\">\\n <kubernetes-yaml-inspector key=\\\"volume-yaml\\\" data=\\\"ctrl.volume.PersistentVolumeClaim.Yaml\\\"></kubernetes-yaml-inspector>\\n </div>\\n </uib-tab>\\n </uib-tabset>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n </div>\\n\\n <div class=\\\"row\\\" ng-if=\\\"ctrl.isUsed(item)\\\">\\n <div class=\\\"col-sm-12\\\">\\n <kubernetes-integrated-applications-datatable\\n dataset=\\\"ctrl.volume.Applications\\\"\\n table-key=\\\"kubernetes.volume.applications\\\"\\n order-by=\\\"Name\\\"\\n refresh-callback=\\\"ctrl.getVolume\\\"\\n title-text=\\\"Applications using this volume\\\"\\n title-icon=\\\"fa-laptop-code\\\"\\n >\\n </kubernetes-integrated-applications-datatable>\\n </div>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import angular from 'angular';\nimport _ from 'lodash-es';\nimport filesizeParser from 'filesize-parser';\nimport KubernetesVolumeHelper from 'Kubernetes/helpers/volumeHelper';\nimport KubernetesEventHelper from 'Kubernetes/helpers/eventHelper';\nimport { KubernetesStorageClassAccessPolicies } from 'Kubernetes/models/storage-class/models';\nimport KubernetesNamespaceHelper from 'Kubernetes/helpers/namespaceHelper';\n\nclass KubernetesVolumeController {\n /* @ngInject */\n constructor(\n $async,\n $state,\n Notifications,\n LocalStorage,\n KubernetesVolumeService,\n KubernetesEventService,\n KubernetesApplicationService,\n KubernetesPersistentVolumeClaimService,\n ModalService,\n KubernetesPodService\n ) {\n this.$async = $async;\n this.$state = $state;\n this.Notifications = Notifications;\n this.LocalStorage = LocalStorage;\n\n this.KubernetesVolumeService = KubernetesVolumeService;\n this.KubernetesEventService = KubernetesEventService;\n this.KubernetesApplicationService = KubernetesApplicationService;\n this.KubernetesPersistentVolumeClaimService = KubernetesPersistentVolumeClaimService;\n this.ModalService = ModalService;\n this.KubernetesPodService = KubernetesPodService;\n\n this.onInit = this.onInit.bind(this);\n this.getVolume = this.getVolume.bind(this);\n this.getVolumeAsync = this.getVolumeAsync.bind(this);\n this.updateVolumeAsync = this.updateVolumeAsync.bind(this);\n this.getEvents = this.getEvents.bind(this);\n this.getEventsAsync = this.getEventsAsync.bind(this);\n }\n\n selectTab(index) {\n this.LocalStorage.storeActiveTab('volume', index);\n }\n\n showEditor() {\n this.state.showEditorTab = true;\n this.selectTab(2);\n }\n\n isExternalVolume() {\n return KubernetesVolumeHelper.isExternalVolume(this.volume);\n }\n\n isSystemNamespace() {\n return KubernetesNamespaceHelper.isSystemNamespace(this.volume.ResourcePool.Namespace.Name);\n }\n\n isUsed() {\n return KubernetesVolumeHelper.isUsed(this.volume);\n }\n\n onChangeSize() {\n if (this.state.volumeSize) {\n const size = filesizeParser(this.state.volumeSize + this.state.volumeSizeUnit, { base: 10 });\n if (this.state.oldVolumeSize > size) {\n this.state.errors.volumeSize = true;\n } else {\n this.state.errors.volumeSize = false;\n }\n }\n }\n\n sizeIsValid() {\n return !this.state.errors.volumeSize && this.state.volumeSize && this.state.oldVolumeSize !== filesizeParser(this.state.volumeSize + this.state.volumeSizeUnit, { base: 10 });\n }\n\n /**\n * VOLUME\n */\n\n async updateVolumeAsync(redeploy) {\n try {\n this.volume.PersistentVolumeClaim.Storage = this.state.volumeSize + this.state.volumeSizeUnit.charAt(0);\n await this.KubernetesPersistentVolumeClaimService.patch(this.oldVolume.PersistentVolumeClaim, this.volume.PersistentVolumeClaim);\n this.Notifications.success('Volume successfully updated');\n\n if (redeploy) {\n const promises = _.flatten(\n _.map(this.volume.Applications, (app) => {\n return _.map(app.Pods, (item) => this.KubernetesPodService.delete(item));\n })\n );\n await Promise.all(promises);\n this.Notifications.success('Applications successfully redeployed');\n }\n\n this.$state.reload(this.$state.current);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to update volume.');\n }\n }\n\n updateVolume() {\n if (KubernetesVolumeHelper.isUsed(this.volume)) {\n this.ModalService.confirmRedeploy(\n 'One or multiple applications are currently using this volume.</br> For the change to be taken into account these applications will need to be redeployed. Do you want us to reschedule it now?',\n (redeploy) => {\n return this.$async(this.updateVolumeAsync, redeploy);\n }\n );\n } else {\n return this.$async(this.updateVolumeAsync, false);\n }\n }\n\n async getVolumeAsync() {\n try {\n const [volume, applications] = await Promise.all([\n this.KubernetesVolumeService.get(this.state.namespace, this.state.name),\n this.KubernetesApplicationService.get(this.state.namespace),\n ]);\n volume.Applications = KubernetesVolumeHelper.getUsingApplications(volume, applications);\n this.volume = volume;\n this.oldVolume = angular.copy(volume);\n this.state.volumeSize = parseInt(volume.PersistentVolumeClaim.Storage.slice(0, -2), 10);\n this.state.volumeSizeUnit = volume.PersistentVolumeClaim.Storage.slice(-2);\n this.state.oldVolumeSize = filesizeParser(volume.PersistentVolumeClaim.Storage, { base: 10 });\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve volume');\n }\n }\n\n getVolume() {\n return this.$async(this.getVolumeAsync);\n }\n\n /**\n * EVENTS\n */\n hasEventWarnings() {\n return this.state.eventWarningCount;\n }\n\n async getEventsAsync() {\n try {\n this.state.eventsLoading = true;\n const events = await this.KubernetesEventService.get(this.state.namespace);\n this.events = _.filter(events, (event) => event.Involved.uid === this.volume.PersistentVolumeClaim.Id);\n this.state.eventWarningCount = KubernetesEventHelper.warningCount(this.events);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve application related events');\n } finally {\n this.state.eventsLoading = false;\n }\n }\n\n getEvents() {\n return this.$async(this.getEventsAsync);\n }\n\n /**\n * ON INIT\n */\n async onInit() {\n this.state = {\n activeTab: 0,\n currentName: this.$state.$current.name,\n showEditorTab: false,\n eventsLoading: true,\n viewReady: false,\n namespace: this.$transition$.params().namespace,\n name: this.$transition$.params().name,\n eventWarningCount: 0,\n availableSizeUnits: ['MB', 'GB', 'TB'],\n increaseSize: false,\n volumeSize: 0,\n volumeSizeUnit: 'GB',\n volumeSharedAccessPolicy: '',\n volumeSharedAccessPolicyTooltip: '',\n errors: {\n volumeSize: false,\n },\n };\n\n this.state.activeTab = this.LocalStorage.getActiveTab('volume');\n\n try {\n await this.getVolume();\n await this.getEvents();\n if (this.volume.PersistentVolumeClaim.StorageClass !== undefined) {\n this.state.volumeSharedAccessPolicy = this.volume.PersistentVolumeClaim.StorageClass.AccessModes[this.volume.PersistentVolumeClaim.StorageClass.AccessModes.length - 1];\n let policies = KubernetesStorageClassAccessPolicies();\n\n policies.forEach((policy) => {\n if (policy.Name == this.state.volumeSharedAccessPolicy) {\n this.state.volumeSharedAccessPolicyTooltip = policy.Description;\n }\n });\n }\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to load view data');\n } finally {\n this.state.viewReady = true;\n }\n }\n\n $onInit() {\n return this.$async(this.onInit);\n }\n\n $onDestroy() {\n if (this.state.currentName !== this.$state.$current.name) {\n this.LocalStorage.storeActiveTab('volume', 0);\n }\n }\n}\n\nexport default KubernetesVolumeController;\nangular.module('portainer.kubernetes').controller('KubernetesVolumeController', KubernetesVolumeController);\n","const autoNgTemplateLoaderTemplate1 = require('./volumes.html');\n\nangular.module('portainer.kubernetes').component('kubernetesVolumesView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'KubernetesVolumesController',\n controllerAs: 'ctrl',\n bindings: {\n $transition$: '<',\n },\n});\n","var path = 'app/kubernetes/views/volumes/volumes.html';\nvar html = \"<kubernetes-view-header title=\\\"Volume list\\\" state=\\\"kubernetes.volumes\\\" view-ready=\\\"ctrl.state.viewReady\\\">\\n Volumes\\n</kubernetes-view-header>\\n\\n<kubernetes-view-loading view-ready=\\\"ctrl.state.viewReady\\\"></kubernetes-view-loading>\\n\\n<div ng-if=\\\"ctrl.state.viewReady\\\">\\n <div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <uib-tabset active=\\\"ctrl.state.activeTab\\\" justified=\\\"true\\\" type=\\\"pills\\\">\\n <uib-tab index=\\\"0\\\" classes=\\\"btn-sm\\\" select=\\\"ctrl.selectTab(0)\\\">\\n <uib-tab-heading> <i class=\\\"fa fa-database space-right\\\" aria-hidden=\\\"true\\\"></i> Volumes</uib-tab-heading>\\n <kubernetes-volumes-datatable\\n dataset=\\\"ctrl.volumes\\\"\\n table-key=\\\"kubernetes.volumes\\\"\\n order-by=\\\"PersistentVolumeClaim.Name\\\"\\n remove-action=\\\"ctrl.removeAction\\\"\\n refresh-callback=\\\"ctrl.getVolumes\\\"\\n >\\n </kubernetes-volumes-datatable>\\n </uib-tab>\\n <uib-tab index=\\\"1\\\" classes=\\\"btn-sm\\\" select=\\\"ctrl.selectTab(1)\\\">\\n <uib-tab-heading> <i class=\\\"fa fa-hdd space-right\\\" aria-hidden=\\\"true\\\"></i> Storage</uib-tab-heading>\\n <kubernetes-volumes-storages-datatable dataset=\\\"ctrl.storages\\\" table-key=\\\"kubernetes.volumes.storages\\\" order-by=\\\"Name\\\" refresh-callback=\\\"ctrl.getVolumes\\\">\\n </kubernetes-volumes-storages-datatable>\\n </uib-tab>\\n </uib-tabset>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import _ from 'lodash-es';\nimport filesizeParser from 'filesize-parser';\nimport angular from 'angular';\nimport KubernetesVolumeHelper from 'Kubernetes/helpers/volumeHelper';\nimport KubernetesResourceQuotaHelper from 'Kubernetes/helpers/resourceQuotaHelper';\n\nfunction buildStorages(storages, volumes) {\n _.forEach(storages, (s) => {\n const filteredVolumes = _.filter(volumes, ['PersistentVolumeClaim.StorageClass.Name', s.Name, 'PersistentVolumeClaim.StorageClass.Provisioner', s.Provisioner]);\n s.Volumes = filteredVolumes;\n s.Size = computeSize(filteredVolumes);\n });\n return storages;\n}\n\nfunction computeSize(volumes) {\n const size = _.sumBy(volumes, (v) => filesizeParser(v.PersistentVolumeClaim.Storage, { base: 10 }));\n const format = KubernetesResourceQuotaHelper.formatBytes(size);\n return `${format.Size}${format.SizeUnit}`;\n}\n\nclass KubernetesVolumesController {\n /* @ngInject */\n constructor(\n $async,\n $state,\n Notifications,\n Authentication,\n ModalService,\n LocalStorage,\n EndpointProvider,\n KubernetesStorageService,\n KubernetesVolumeService,\n KubernetesApplicationService\n ) {\n this.$async = $async;\n this.$state = $state;\n this.Notifications = Notifications;\n this.Authentication = Authentication;\n this.ModalService = ModalService;\n this.LocalStorage = LocalStorage;\n this.EndpointProvider = EndpointProvider;\n this.KubernetesStorageService = KubernetesStorageService;\n this.KubernetesVolumeService = KubernetesVolumeService;\n this.KubernetesApplicationService = KubernetesApplicationService;\n\n this.onInit = this.onInit.bind(this);\n this.getVolumes = this.getVolumes.bind(this);\n this.getVolumesAsync = this.getVolumesAsync.bind(this);\n this.removeAction = this.removeAction.bind(this);\n this.removeActionAsync = this.removeActionAsync.bind(this);\n }\n\n selectTab(index) {\n this.LocalStorage.storeActiveTab('volumes', index);\n }\n\n async removeActionAsync(selectedItems) {\n let actionCount = selectedItems.length;\n for (const volume of selectedItems) {\n try {\n await this.KubernetesVolumeService.delete(volume);\n this.Notifications.success('Volume successfully removed', volume.PersistentVolumeClaim.Name);\n const index = this.volumes.indexOf(volume);\n this.volumes.splice(index, 1);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to remove volume');\n } finally {\n --actionCount;\n if (actionCount === 0) {\n this.$state.reload(this.$state.current);\n }\n }\n }\n }\n\n removeAction(selectedItems) {\n this.ModalService.confirmDeletion('Do you want to remove the selected volume(s)?', (confirmed) => {\n if (confirmed) {\n return this.$async(this.removeActionAsync, selectedItems);\n }\n });\n }\n\n async getVolumesAsync() {\n try {\n const [volumes, applications, storages] = await Promise.all([\n this.KubernetesVolumeService.get(),\n this.KubernetesApplicationService.get(),\n this.KubernetesStorageService.get(this.state.endpointId),\n ]);\n\n this.volumes = _.map(volumes, (volume) => {\n volume.Applications = KubernetesVolumeHelper.getUsingApplications(volume, applications);\n return volume;\n });\n this.storages = buildStorages(storages, volumes);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retreive namespaces');\n }\n }\n\n getVolumes() {\n return this.$async(this.getVolumesAsync);\n }\n\n async onInit() {\n this.state = {\n viewReady: false,\n // endpointId: this.$transition$.params().endpointId, // TODO: use this when moving to endpointID in URL\n currentName: this.$state.$current.name,\n endpointId: this.EndpointProvider.endpointID(),\n activeTab: this.LocalStorage.getActiveTab('volumes'),\n isAdmin: this.Authentication.isAdmin(),\n };\n\n await this.getVolumes();\n\n this.state.viewReady = true;\n }\n\n $onInit() {\n return this.$async(this.onInit);\n }\n\n $onDestroy() {\n if (this.state.currentName !== this.$state.$current.name) {\n this.LocalStorage.storeActiveTab('volumes', 0);\n }\n }\n}\n\nexport default KubernetesVolumesController;\nangular.module('portainer.kubernetes').controller('KubernetesVolumesController', KubernetesVolumesController);\n","const autoNgTemplateLoaderTemplate1 = require('./accessDatatable.html');\n\nangular.module('portainer.app').component('accessDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'AccessDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n roles: '<',\n tableKey: '@',\n orderBy: '@',\n removeAction: '<',\n updateAction: '<',\n reverseOrder: '<',\n inheritFrom: '<',\n },\n});\n","var path = 'app/portainer/components/access-datatable/accessDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"{{ $ctrl.titleIcon }}\\\" title-text=\\\"{{ $ctrl.titleText }}\\\"> </rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar small\\\" ng-if=\\\"$ctrl.inheritFrom\\\">\\n Access tagged as <code>inherited</code> are inherited from the group access. They cannot be removed or modified at the environment level but they can be overriden.\\n </div>\\n <div class=\\\"toolBar small\\\" ng-if=\\\"$ctrl.inheritFrom\\\"> Access tagged as <code>override</code> are overriding the group access for the related users/teams. </div>\\n <div class=\\\"actionBar\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-danger\\\" ng-disabled=\\\"$ctrl.state.selectedItemCount === 0\\\" ng-click=\\\"$ctrl.removeAction($ctrl.state.selectedItems)\\\">\\n <i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Remove\\n </button>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th>\\n <span class=\\\"md-checkbox\\\">\\n <input id=\\\"select_all\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.state.selectAll\\\" ng-change=\\\"$ctrl.selectAll()\\\" />\\n <label for=\\\"select_all\\\"></label>\\n </span>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Name')\\\">\\n Name\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Type')\\\">\\n Type\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Type' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Type' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit)) track by $index\\\"\\n ng-class=\\\"{ active: item.Checked }\\\"\\n >\\n <td>\\n <span class=\\\"md-checkbox\\\">\\n <input id=\\\"select_{{ $index }}\\\" type=\\\"checkbox\\\" ng-model=\\\"item.Checked\\\" ng-disabled=\\\"$ctrl.disableRemove(item)\\\" ng-click=\\\"$ctrl.selectItem(item, $event)\\\" />\\n <label for=\\\"select_{{ $index }}\\\"></label>\\n </span>\\n {{ item.Name }}\\n <span ng-if=\\\"$ctrl.inheritFrom && item.Inherited\\\" class=\\\"text-muted small\\\" style=\\\"margin-left: 2px;\\\"\\n ><code style=\\\"font-size: 85% !important;\\\">inherited</code></span\\n >\\n <span ng-if=\\\"$ctrl.inheritFrom && item.Override\\\" class=\\\"text-muted small\\\" style=\\\"margin-left: 2px;\\\"><code style=\\\"font-size: 85% !important;\\\">override</code></span>\\n </td>\\n <td>{{ item.Type }}</td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"4\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"4\\\" class=\\\"text-center text-muted\\\">No authorized users or teams.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","angular.module('portainer.app').controller('AccessDatatableController', [\n '$scope',\n '$controller',\n 'DatatableService',\n function ($scope, $controller, DatatableService) {\n angular.extend(this, $controller('GenericDatatableController', { $scope: $scope }));\n\n this.disableRemove = function (item) {\n return item.Inherited && this.inheritFrom;\n };\n\n this.allowSelection = function (item) {\n return !this.disableRemove(item);\n };\n\n this.$onInit = function () {\n this.setDefaults();\n this.prepareTableFromDataset();\n\n this.state.orderBy = this.orderBy;\n var storedOrder = DatatableService.getDataTableOrder(this.tableKey);\n if (storedOrder !== null) {\n this.state.reverseOrder = storedOrder.reverse;\n this.state.orderBy = storedOrder.orderBy;\n }\n\n var textFilter = DatatableService.getDataTableTextFilters(this.tableKey);\n if (textFilter !== null) {\n this.state.textFilter = textFilter;\n this.onTextFilterChange();\n }\n\n var storedFilters = DatatableService.getDataTableFilters(this.tableKey);\n if (storedFilters !== null) {\n this.filters = storedFilters;\n }\n if (this.filters && this.filters.state) {\n this.filters.state.open = false;\n }\n\n var storedSettings = DatatableService.getDataTableSettings(this.tableKey);\n if (storedSettings !== null) {\n this.settings = storedSettings;\n this.settings.open = false;\n }\n this.onSettingsRepeaterChange();\n };\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./accessTable.html');\n\nangular.module('portainer.app').component('accessTable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: function () {\n this.state = {\n orderBy: 'Name',\n reverseOrder: false,\n paginatedItemLimit: '10',\n textFilter: '',\n };\n\n this.changeOrderBy = function (orderField) {\n this.state.reverseOrder = this.state.orderBy === orderField ? !this.state.reverseOrder : false;\n this.state.orderBy = orderField;\n };\n },\n bindings: {\n dataset: '<',\n entryClick: '<',\n emptyDatasetMessage: '@',\n },\n});\n","var path = 'app/portainer/components/access-table/accessTable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <table class=\\\"table table-hover\\\">\\n <div class=\\\"col-sm-12\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <thead>\\n <tr>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Name')\\\">\\n Name\\n <span ng-show=\\\"$ctrl.state.orderBy == 'Name' && !$ctrl.state.reverseOrder\\\" class=\\\"glyphicon glyphicon-chevron-down\\\"></span>\\n <span ng-show=\\\"$ctrl.state.orderBy == 'Name' && $ctrl.state.reverseOrder\\\" class=\\\"glyphicon glyphicon-chevron-up\\\"></span>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Type')\\\">\\n Type\\n <span ng-show=\\\"$ctrl.state.orderBy == 'Type' && !$ctrl.state.reverseOrder\\\" class=\\\"glyphicon glyphicon-chevron-down\\\"></span>\\n <span ng-show=\\\"$ctrl.state.orderBy == 'Type' && $ctrl.state.reverseOrder\\\" class=\\\"glyphicon glyphicon-chevron-up\\\"></span>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n ng-click=\\\"!item.Inherited && $ctrl.entryClick(item)\\\"\\n ng-class=\\\"{ interactive: !item.Inherited }\\\"\\n dir-paginate=\\\"item in $ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit\\\"\\n >\\n <td>\\n {{ item.Name }}\\n <!-- <span class=\\\"image-tag label label-\\\">inherited</span> -->\\n <span ng-if=\\\"item.Inherited\\\" class=\\\"text-muted small\\\" style=\\\"margin-left: 2px;\\\"><code style=\\\"font-size: 85% !important;\\\">inherited</code></span>\\n </td>\\n <td>\\n <i class=\\\"fa\\\" ng-class=\\\"item.Type === 'user' ? 'fa-user' : 'fa-users'\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n {{ item.Type }}\\n </td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"2\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr\\n ng-if=\\\"\\n $ctrl.dataset.length === 0 ||\\n ($ctrl.dataset | filter: $ctrl.state.textFilter | orderBy: $ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit).length === 0\\n \\\"\\n >\\n <td colspan=\\\"2\\\" class=\\\"text-center text-muted\\\">{{ $ctrl.emptyDatasetMessage }}</td>\\n </tr>\\n </tbody>\\n </table>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select ng-model=\\\"$ctrl.state.paginatedItemLimit\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./porAccessControlForm.html');\n\nangular.module('portainer.app').component('porAccessControlForm', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'porAccessControlFormController',\n bindings: {\n // This object will be populated with the form data.\n // Model reference in porAccessControlFromModel.js\n formData: '=',\n // Optional. An existing resource control object that will be used to set\n // the default values of the component.\n resourceControl: '<',\n hideTitle: '<',\n },\n});\n","var path = 'app/portainer/components/accessControlForm/porAccessControlForm.html';\nvar html = \"<div>\\n <div ng-if=\\\"!$ctrl.hideTitle\\\" class=\\\"col-sm-12 form-section-title\\\">\\n Access control\\n </div>\\n <!-- access-control-switch -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label for=\\\"ownership\\\" class=\\\"control-label text-left\\\">\\n Enable access control\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"When enabled, you can restrict the access and management of this resource.\\\"></portainer-tooltip>\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\"> <input name=\\\"ownership\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.formData.AccessControlEnabled\\\" /><i></i> </label>\\n </div>\\n </div>\\n <!-- !access-control-switch -->\\n <!-- restricted-access -->\\n <div class=\\\"form-group\\\" ng-if=\\\"$ctrl.formData.AccessControlEnabled\\\" style=\\\"margin-bottom: 0;\\\">\\n <div class=\\\"boxselector_wrapper\\\">\\n <div ng-if=\\\"$ctrl.isAdmin\\\">\\n <input type=\\\"radio\\\" id=\\\"access_administrators\\\" ng-model=\\\"$ctrl.formData.Ownership\\\" value=\\\"administrators\\\" />\\n <label for=\\\"access_administrators\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i ng-class=\\\"'administrators' | ownershipicon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Administrators\\n </div>\\n <p>I want to restrict the management of this resource to administrators only</p>\\n </label>\\n </div>\\n <div ng-if=\\\"$ctrl.isAdmin\\\">\\n <input type=\\\"radio\\\" id=\\\"access_restricted\\\" ng-model=\\\"$ctrl.formData.Ownership\\\" value=\\\"restricted\\\" />\\n <label for=\\\"access_restricted\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i ng-class=\\\"'restricted' | ownershipicon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Restricted\\n </div>\\n <p>\\n I want to restrict the management of this resource to a set of users and/or teams\\n </p>\\n </label>\\n </div>\\n <div ng-if=\\\"!$ctrl.isAdmin\\\">\\n <input type=\\\"radio\\\" id=\\\"access_private\\\" ng-model=\\\"$ctrl.formData.Ownership\\\" value=\\\"private\\\" />\\n <label for=\\\"access_private\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i ng-class=\\\"'private' | ownershipicon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Private\\n </div>\\n <p>\\n I want to this resource to be manageable by myself only\\n </p>\\n </label>\\n </div>\\n <div ng-if=\\\"!$ctrl.isAdmin && $ctrl.availableTeams.length > 0\\\">\\n <input type=\\\"radio\\\" id=\\\"access_restricted\\\" ng-model=\\\"$ctrl.formData.Ownership\\\" value=\\\"restricted\\\" />\\n <label for=\\\"access_restricted\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i ng-class=\\\"'restricted' | ownershipicon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Restricted\\n </div>\\n <p ng-if=\\\"$ctrl.availableTeams.length === 1\\\">\\n I want any member of my team (<b>{{ $ctrl.availableTeams[0].Name }}</b\\n >) to be able to manage this resource\\n </p>\\n <p ng-if=\\\"$ctrl.availableTeams.length > 1\\\">\\n I want to restrict the management of this resource to one or more of my teams\\n </p>\\n </label>\\n </div>\\n </div>\\n </div>\\n <!-- restricted-access -->\\n <!-- authorized-teams -->\\n <div\\n class=\\\"form-group\\\"\\n ng-if=\\\"$ctrl.formData.AccessControlEnabled && $ctrl.formData.Ownership === $ctrl.RCO.RESTRICTED && ($ctrl.isAdmin || (!$ctrl.isAdmin && $ctrl.availableTeams.length > 1))\\\"\\n >\\n <div class=\\\"col-sm-12\\\">\\n <label for=\\\"group-access\\\" class=\\\"control-label text-left\\\">\\n Authorized teams\\n <portainer-tooltip\\n ng-if=\\\"$ctrl.isAdmin && $ctrl.availableTeams.length > 0\\\"\\n position=\\\"bottom\\\"\\n message=\\\"You can select which teams(s) will be able to manage this resource.\\\"\\n ></portainer-tooltip>\\n <portainer-tooltip\\n ng-if=\\\"!$ctrl.isAdmin && $ctrl.availableTeams.length > 1\\\"\\n position=\\\"bottom\\\"\\n message=\\\"As you are a member of multiple teams, you can select which teams(s) will be able to manage this resource.\\\"\\n ></portainer-tooltip>\\n </label>\\n <span ng-if=\\\"$ctrl.isAdmin && $ctrl.availableTeams.length === 0\\\" class=\\\"small text-muted\\\" style=\\\"margin-left: 20px;\\\">\\n You have not yet created any teams. Head over to the <a ui-sref=\\\"portainer.teams\\\">Teams view</a> to manage teams.\\n </span>\\n <span\\n isteven-multi-select\\n ng-if=\\\"($ctrl.isAdmin && $ctrl.availableTeams.length > 0) || (!$ctrl.isAdmin && $ctrl.availableTeams.length > 1)\\\"\\n input-model=\\\"$ctrl.availableTeams\\\"\\n output-model=\\\"$ctrl.formData.AuthorizedTeams\\\"\\n button-label=\\\"Name\\\"\\n item-label=\\\"Name\\\"\\n tick-property=\\\"selected\\\"\\n helper-elements=\\\"filter\\\"\\n search-property=\\\"Name\\\"\\n translation=\\\"{nothingSelected: 'Select one or more teams', search: 'Search...'}\\\"\\n style=\\\"margin-left: 20px;\\\"\\n >\\n </span>\\n </div>\\n </div>\\n <!-- !authorized-teams -->\\n <!-- authorized-users -->\\n <div class=\\\"form-group\\\" ng-if=\\\"$ctrl.formData.AccessControlEnabled && $ctrl.formData.Ownership === $ctrl.RCO.RESTRICTED && $ctrl.isAdmin\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label for=\\\"group-access\\\" class=\\\"control-label text-left\\\">\\n Authorized users\\n <portainer-tooltip\\n ng-if=\\\"$ctrl.isAdmin && $ctrl.availableUsers.length > 0\\\"\\n position=\\\"bottom\\\"\\n message=\\\"You can select which user(s) will be able to manage this resource.\\\"\\n ></portainer-tooltip>\\n </label>\\n <span ng-if=\\\"$ctrl.availableUsers.length === 0\\\" class=\\\"small text-muted\\\" style=\\\"margin-left: 20px;\\\">\\n You have not yet created any users. Head over to the <a ui-sref=\\\"portainer.users\\\">Users view</a> to manage users.\\n </span>\\n <span\\n isteven-multi-select\\n ng-if=\\\"$ctrl.availableUsers.length > 0\\\"\\n input-model=\\\"$ctrl.availableUsers\\\"\\n output-model=\\\"$ctrl.formData.AuthorizedUsers\\\"\\n button-label=\\\"Username\\\"\\n item-label=\\\"Username\\\"\\n tick-property=\\\"selected\\\"\\n helper-elements=\\\"filter\\\"\\n search-property=\\\"Username\\\"\\n translation=\\\"{nothingSelected: 'Select one or more users', search: 'Search...'}\\\"\\n style=\\\"margin-left: 20px;\\\"\\n >\\n </span>\\n </div>\\n </div>\\n <!-- !authorized-users -->\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import _ from 'lodash-es';\nimport { ResourceControlOwnership as RCO } from 'Portainer/models/resourceControl/resourceControlOwnership';\n\nangular.module('portainer.app').controller('porAccessControlFormController', [\n '$q',\n 'UserService',\n 'TeamService',\n 'Notifications',\n 'Authentication',\n 'ResourceControlService',\n function ($q, UserService, TeamService, Notifications, Authentication, ResourceControlService) {\n var ctrl = this;\n\n ctrl.RCO = RCO;\n\n ctrl.availableTeams = [];\n ctrl.availableUsers = [];\n\n function setOwnership(resourceControl, isAdmin) {\n if (isAdmin && resourceControl.Ownership === RCO.PRIVATE) {\n ctrl.formData.Ownership = RCO.RESTRICTED;\n } else {\n ctrl.formData.Ownership = resourceControl.Ownership;\n }\n\n if (ctrl.formData.Ownership === RCO.PUBLIC) {\n ctrl.formData.AccessControlEnabled = false;\n }\n }\n\n function setAuthorizedUsersAndTeams(authorizedUsers, authorizedTeams) {\n angular.forEach(ctrl.availableUsers, function (user) {\n var found = _.find(authorizedUsers, { Id: user.Id });\n if (found) {\n user.selected = true;\n }\n });\n\n angular.forEach(ctrl.availableTeams, function (team) {\n var found = _.find(authorizedTeams, { Id: team.Id });\n if (found) {\n team.selected = true;\n }\n });\n }\n\n this.$onInit = $onInit;\n function $onInit() {\n var isAdmin = Authentication.isAdmin();\n ctrl.isAdmin = isAdmin;\n\n if (isAdmin) {\n ctrl.formData.Ownership = ctrl.RCO.ADMINISTRATORS;\n }\n\n $q.all({\n availableTeams: TeamService.teams(),\n availableUsers: isAdmin ? UserService.users(false) : [],\n })\n .then(function success(data) {\n ctrl.availableUsers = _.orderBy(data.availableUsers, 'Username', 'asc');\n\n var availableTeams = _.orderBy(data.availableTeams, 'Name', 'asc');\n ctrl.availableTeams = availableTeams;\n if (!isAdmin && availableTeams.length === 1) {\n ctrl.formData.AuthorizedTeams = availableTeams;\n }\n\n return $q.when(ctrl.resourceControl && ResourceControlService.retrieveOwnershipDetails(ctrl.resourceControl));\n })\n .then(function success(data) {\n if (data) {\n var authorizedUsers = data.authorizedUsers;\n var authorizedTeams = data.authorizedTeams;\n setOwnership(ctrl.resourceControl, isAdmin);\n setAuthorizedUsersAndTeams(authorizedUsers, authorizedTeams);\n }\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve access control information');\n });\n }\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./porAccessControlPanel.html');\n\nangular.module('portainer.app').component('porAccessControlPanel', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'porAccessControlPanelController',\n bindings: {\n // The component will use this identifier when updating the resource control object.\n resourceId: '<',\n // The component will display information about this resource control object.\n resourceControl: '=',\n // This component is usually displayed inside a resource-details view.\n // This variable specifies the type of the associated resource.\n // Accepted values: 'container', 'service' or 'volume'.\n resourceType: '<',\n // Allow to disable the Ownership edition based on non resource control data\n disableOwnershipChange: '<',\n },\n});\n","var path = 'app/portainer/components/accessControlPanel/porAccessControlPanel.html';\nvar html = \"<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\" ng-if=\\\"$ctrl.state.displayAccessControlPanel\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-eye\\\" title-text=\\\"Access control\\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <!-- ownership -->\\n <tr>\\n <td>Ownership</td>\\n <td>\\n <i ng-class=\\\"$ctrl.resourceControl.Ownership | ownershipicon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n <span ng-if=\\\"!$ctrl.resourceControl\\\">\\n administrators\\n <portainer-tooltip message=\\\"This resource can only be managed by administrators.\\\" position=\\\"bottom\\\" style=\\\"margin-left: -3px;\\\"></portainer-tooltip>\\n </span>\\n <span ng-if=\\\"$ctrl.resourceControl\\\">\\n {{ $ctrl.resourceControl.Ownership }}\\n <portainer-tooltip\\n ng-if=\\\"$ctrl.resourceControl.Ownership === $ctrl.RCO.PUBLIC\\\"\\n message=\\\"This resource can be managed by any user with access to this environment.\\\"\\n position=\\\"bottom\\\"\\n style=\\\"margin-left: -3px;\\\"\\n ></portainer-tooltip>\\n <portainer-tooltip\\n ng-if=\\\"$ctrl.resourceControl.Ownership === $ctrl.RCO.PRIVATE\\\"\\n message=\\\"Management of this resource is restricted to a single user.\\\"\\n position=\\\"bottom\\\"\\n style=\\\"margin-left: -3px;\\\"\\n ></portainer-tooltip>\\n <portainer-tooltip\\n ng-if=\\\"$ctrl.resourceControl.Ownership === $ctrl.RCO.RESTRICTED\\\"\\n message=\\\"This resource can be managed by a restricted set of users and/or teams.\\\"\\n position=\\\"bottom\\\"\\n style=\\\"margin-left: -3px;\\\"\\n ></portainer-tooltip>\\n </span>\\n </td>\\n </tr>\\n <!-- !ownership -->\\n <tr ng-if=\\\"$ctrl.resourceControl.Type === $ctrl.RCTI.SERVICE && $ctrl.resourceType === $ctrl.RCTS.CONTAINER\\\">\\n <td colspan=\\\"2\\\">\\n <i class=\\\"fa fa-info-circle\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Access control on this resource is inherited from the following service:\\n <a ui-sref=\\\"docker.services.service({ id: $ctrl.resourceControl.ResourceId })\\\">{{ $ctrl.resourceControl.ResourceId | truncate }}</a>\\n <portainer-tooltip\\n message=\\\"Access control applied on a service is also applied on each container of that service.\\\"\\n position=\\\"bottom\\\"\\n style=\\\"margin-left: 2px;\\\"\\n ></portainer-tooltip>\\n </td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.resourceControl.Type === $ctrl.RCTI.CONTAINER && $ctrl.resourceType === $ctrl.RCTS.VOLUME\\\">\\n <td colspan=\\\"2\\\">\\n <i class=\\\"fa fa-info-circle\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Access control on this resource is inherited from the following container:\\n <a ui-sref=\\\"docker.containers.container({ id: $ctrl.resourceControl.ResourceId })\\\">{{ $ctrl.resourceControl.ResourceId | truncate }}</a>\\n <portainer-tooltip\\n message=\\\"Access control applied on a container created using a template is also applied on each volume associated to the container.\\\"\\n position=\\\"bottom\\\"\\n style=\\\"margin-left: 2px;\\\"\\n ></portainer-tooltip>\\n </td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.resourceControl.Type === $ctrl.RCTI.STACK && $ctrl.resourceType !== $ctrl.RCTS.STACK\\\">\\n <td colspan=\\\"2\\\">\\n <i class=\\\"fa fa-info-circle\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Access control on this resource is inherited from the following stack: {{ $ctrl.resourceControl.ResourceId }}\\n <portainer-tooltip\\n message=\\\"Access control applied on a stack is also applied on each resource in the stack.\\\"\\n position=\\\"bottom\\\"\\n style=\\\"margin-left: 2px;\\\"\\n ></portainer-tooltip>\\n </td>\\n </tr>\\n <!-- authorized-users -->\\n <tr ng-if=\\\"$ctrl.resourceControl.UserAccesses.length > 0\\\">\\n <td>Authorized users</td>\\n <td>\\n <span ng-repeat=\\\"user in $ctrl.authorizedUsers\\\">{{ user.Username }}{{ $last ? '' : ', ' }} </span>\\n </td>\\n </tr>\\n <!-- !authorized-users -->\\n <!-- authorized-teams -->\\n <tr ng-if=\\\"$ctrl.resourceControl.TeamAccesses.length > 0\\\">\\n <td>Authorized teams</td>\\n <td>\\n <span ng-repeat=\\\"team in $ctrl.authorizedTeams\\\">{{ team.Name }}{{ $last ? '' : ', ' }} </span>\\n </td>\\n </tr>\\n <!-- !authorized-teams -->\\n <!-- edit-ownership -->\\n <tr ng-if=\\\"$ctrl.canEditOwnership();\\\">\\n <td colspan=\\\"2\\\">\\n <a ng-click=\\\"$ctrl.state.editOwnership = true\\\"><i class=\\\"fa fa-edit space-right\\\" aria-hidden=\\\"true\\\"></i>Change ownership</a>\\n </td>\\n </tr>\\n <!-- !edit-ownership -->\\n <!-- edit-ownership-choices -->\\n <tr ng-if=\\\"$ctrl.state.editOwnership\\\">\\n <td colspan=\\\"2\\\" style=\\\"white-space: inherit;\\\">\\n <div class=\\\"boxselector_wrapper\\\">\\n <div ng-if=\\\"$ctrl.isAdmin\\\">\\n <input type=\\\"radio\\\" id=\\\"access_administrators\\\" ng-model=\\\"$ctrl.formValues.Ownership\\\" ng-value=\\\"$ctrl.RCO.ADMINISTRATORS\\\" />\\n <label for=\\\"access_administrators\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i ng-class=\\\"'administrators' | ownershipicon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Administrators\\n </div>\\n <p>I want to restrict the management of this resource to administrators only</p>\\n </label>\\n </div>\\n <div ng-if=\\\"$ctrl.isAdmin\\\">\\n <input type=\\\"radio\\\" id=\\\"access_restricted\\\" ng-model=\\\"$ctrl.formValues.Ownership\\\" ng-value=\\\"$ctrl.RCO.RESTRICTED\\\" />\\n <label for=\\\"access_restricted\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i ng-class=\\\"'restricted' | ownershipicon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Restricted\\n </div>\\n <p>\\n I want to restrict the management of this resource to a set of users and/or teams\\n </p>\\n </label>\\n </div>\\n <div ng-if=\\\"!$ctrl.isAdmin && $ctrl.state.canChangeOwnershipToTeam && $ctrl.availableTeams.length > 0\\\">\\n <input type=\\\"radio\\\" id=\\\"access_restricted\\\" ng-model=\\\"$ctrl.formValues.Ownership\\\" ng-value=\\\"$ctrl.RCO.RESTRICTED\\\" />\\n <label for=\\\"access_restricted\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i ng-class=\\\"'restricted' | ownershipicon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Restricted\\n </div>\\n <p ng-if=\\\"$ctrl.availableTeams.length === 1\\\">\\n I want any member of my team (<b>{{ $ctrl.availableTeams[0].Name }}</b\\n >) to be able to manage this resource\\n </p>\\n <p ng-if=\\\"$ctrl.availableTeams.length > 1\\\">\\n I want to restrict the management of this resource to one or more of my teams\\n </p>\\n </label>\\n </div>\\n <div>\\n <input type=\\\"radio\\\" id=\\\"access_public\\\" ng-model=\\\"$ctrl.formValues.Ownership\\\" ng-value=\\\"$ctrl.RCO.PUBLIC\\\" />\\n <label for=\\\"access_public\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i ng-class=\\\"'public' | ownershipicon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Public\\n </div>\\n <p>I want any user with access to this environment to be able to manage this resource</p>\\n </label>\\n </div>\\n </div>\\n </td>\\n </tr>\\n <!-- edit-ownership-choices -->\\n <!-- select-teams -->\\n <tr ng-if=\\\"$ctrl.state.editOwnership && $ctrl.formValues.Ownership === $ctrl.RCO.RESTRICTED && ($ctrl.isAdmin || (!$ctrl.isAdmin && $ctrl.availableTeams.length > 1))\\\">\\n <td colspan=\\\"2\\\">\\n <span>Teams</span>\\n <span ng-if=\\\"$ctrl.isAdmin && $ctrl.availableTeams.length === 0\\\" class=\\\"small text-muted\\\" style=\\\"margin-left: 10px;\\\">\\n You have not yet created any teams. Head over to the <a ui-sref=\\\"portainer.teams\\\">Teams view</a> to manage teams.\\n </span>\\n <span\\n isteven-multi-select\\n ng-if=\\\"($ctrl.isAdmin && $ctrl.availableTeams.length > 0) || (!$ctrl.isAdmin && $ctrl.availableTeams.length > 1)\\\"\\n input-model=\\\"$ctrl.availableTeams\\\"\\n output-model=\\\"$ctrl.formValues.Ownership_Teams\\\"\\n button-label=\\\"Name\\\"\\n item-label=\\\"Name\\\"\\n tick-property=\\\"selected\\\"\\n helper-elements=\\\"filter\\\"\\n search-property=\\\"Name\\\"\\n max-labels=\\\"3\\\"\\n translation=\\\"{nothingSelected: 'Select one or more teams', search: 'Search...'}\\\"\\n >\\n </span>\\n </td>\\n </tr>\\n <!-- !select-teams -->\\n <!-- select-users -->\\n <tr ng-if=\\\"$ctrl.isAdmin && $ctrl.state.editOwnership && $ctrl.formValues.Ownership === $ctrl.RCO.RESTRICTED\\\">\\n <td colspan=\\\"2\\\">\\n <span>Users</span>\\n <span ng-if=\\\"$ctrl.availableUsers.length === 0\\\" class=\\\"small text-muted\\\" style=\\\"margin-left: 10px;\\\">\\n You have not yet created any users. Head over to the <a ui-sref=\\\"portainer.users\\\">Users view</a> to manage users.\\n </span>\\n <span\\n isteven-multi-select\\n ng-if=\\\"$ctrl.availableUsers.length > 0\\\"\\n input-model=\\\"$ctrl.availableUsers\\\"\\n output-model=\\\"$ctrl.formValues.Ownership_Users\\\"\\n button-label=\\\"Username\\\"\\n item-label=\\\"Username\\\"\\n tick-property=\\\"selected\\\"\\n helper-elements=\\\"filter\\\"\\n search-property=\\\"Username\\\"\\n max-labels=\\\"3\\\"\\n translation=\\\"{nothingSelected: 'Select one or more users', search: 'Search...'}\\\"\\n >\\n </span>\\n </td>\\n </tr>\\n <!-- !select-users -->\\n <!-- ownership-actions -->\\n <tr ng-if=\\\"$ctrl.state.editOwnership\\\">\\n <td colspan=\\\"2\\\">\\n <div>\\n <a type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"$ctrl.state.editOwnership = false\\\">Cancel</a>\\n <a type=\\\"button\\\" class=\\\"btn btn-primary btn-sm\\\" ng-click=\\\"$ctrl.confirmUpdateOwnership()\\\">Update ownership</a>\\n <span class=\\\"text-danger\\\" ng-if=\\\"$ctrl.state.formValidationError\\\" style=\\\"margin-left: 5px;\\\">{{ $ctrl.state.formValidationError }}</span>\\n </div>\\n </td>\\n </tr>\\n <!-- !ownership-actions -->\\n </tbody>\\n </table>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import _ from 'lodash-es';\nimport { ResourceControlOwnership as RCO } from 'Portainer/models/resourceControl/resourceControlOwnership';\nimport { ResourceControlTypeInt as RCTI, ResourceControlTypeString as RCTS } from 'Portainer/models/resourceControl/resourceControlTypes';\nimport { AccessControlPanelData } from './porAccessControlPanelModel';\n\nangular.module('portainer.app').controller('porAccessControlPanelController', [\n '$q',\n '$state',\n 'UserService',\n 'TeamService',\n 'ResourceControlHelper',\n 'ResourceControlService',\n 'Notifications',\n 'Authentication',\n 'ModalService',\n 'FormValidator',\n function ($q, $state, UserService, TeamService, ResourceControlHelper, ResourceControlService, Notifications, Authentication, ModalService, FormValidator) {\n var ctrl = this;\n\n ctrl.RCO = RCO;\n ctrl.RCTS = RCTS;\n ctrl.RCTI = RCTI;\n ctrl.state = {\n displayAccessControlPanel: false,\n canEditOwnership: false,\n editOwnership: false,\n formValidationError: '',\n };\n\n ctrl.formValues = new AccessControlPanelData();\n\n ctrl.authorizedUsers = [];\n ctrl.availableUsers = [];\n ctrl.authorizedTeams = [];\n ctrl.availableTeams = [];\n\n ctrl.canEditOwnership = function () {\n const hasRC = ctrl.resourceControl;\n const inheritedVolume = hasRC && ctrl.resourceControl.Type === RCTI.CONTAINER && ctrl.resourceType === RCTS.VOLUME;\n const inheritedContainer = hasRC && ctrl.resourceControl.Type === RCTI.SERVICE && ctrl.resourceType === RCTS.CONTAINER;\n const inheritedFromStack = hasRC && ctrl.resourceControl.Type === RCTI.STACK && ctrl.resourceType !== RCTS.STACK;\n const hasSpecialDisable = ctrl.disableOwnershipChange;\n\n return !inheritedVolume && !inheritedContainer && !inheritedFromStack && !hasSpecialDisable && !ctrl.state.editOwnership && (ctrl.isAdmin || ctrl.state.canEditOwnership);\n };\n\n ctrl.confirmUpdateOwnership = function () {\n if (!validateForm()) {\n return;\n }\n ModalService.confirmAccessControlUpdate(function (confirmed) {\n if (!confirmed) {\n return;\n }\n updateOwnership();\n });\n };\n\n function validateForm() {\n ctrl.state.formValidationError = '';\n var error = '';\n\n var accessControlData = {\n AccessControlEnabled: ctrl.formValues.Ownership === RCO.PUBLIC ? false : true,\n Ownership: ctrl.formValues.Ownership,\n AuthorizedUsers: ctrl.formValues.Ownership_Users,\n AuthorizedTeams: ctrl.formValues.Ownership_Teams,\n };\n var isAdmin = ctrl.isAdmin;\n error = FormValidator.validateAccessControl(accessControlData, isAdmin);\n if (error) {\n ctrl.state.formValidationError = error;\n return false;\n }\n return true;\n }\n\n function updateOwnership() {\n ResourceControlService.applyResourceControlChange(ctrl.resourceType, ctrl.resourceId, ctrl.resourceControl, ctrl.formValues)\n .then(function success() {\n Notifications.success('Access control successfully updated');\n $state.reload();\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to update access control');\n });\n }\n\n this.$onInit = $onInit;\n function $onInit() {\n var userDetails = Authentication.getUserDetails();\n var isAdmin = Authentication.isAdmin();\n var userId = userDetails.ID;\n ctrl.isAdmin = isAdmin;\n var resourceControl = ctrl.resourceControl;\n\n if (isAdmin && resourceControl) {\n ctrl.formValues.Ownership = resourceControl.Ownership === RCO.PRIVATE ? RCO.RESTRICTED : resourceControl.Ownership;\n } else {\n ctrl.formValues.Ownership = RCO.ADMINISTRATORS;\n }\n\n ResourceControlService.retrieveOwnershipDetails(resourceControl)\n .then(function success(data) {\n ctrl.authorizedUsers = data.authorizedUsers;\n ctrl.authorizedTeams = data.authorizedTeams;\n return ResourceControlService.retrieveUserPermissionsOnResource(userId, isAdmin, resourceControl);\n })\n .then(function success(data) {\n ctrl.state.canEditOwnership = data.isPartOfRestrictedUsers || data.isLeaderOfAnyRestrictedTeams;\n ctrl.state.canChangeOwnershipToTeam = data.isPartOfRestrictedUsers;\n\n return $q.all({\n availableUsers: isAdmin ? UserService.users(false) : [],\n availableTeams: isAdmin || data.isPartOfRestrictedUsers ? TeamService.teams() : [],\n });\n })\n .then(function success(data) {\n ctrl.availableUsers = _.orderBy(data.availableUsers, 'Username', 'asc');\n angular.forEach(ctrl.availableUsers, function (user) {\n var found = _.find(ctrl.authorizedUsers, { Id: user.Id });\n if (found) {\n user.selected = true;\n }\n });\n ctrl.availableTeams = _.orderBy(data.availableTeams, 'Name', 'asc');\n angular.forEach(data.availableTeams, function (team) {\n var found = _.find(ctrl.authorizedTeams, { Id: team.Id });\n if (found) {\n team.selected = true;\n }\n });\n if (data.availableTeams.length === 1) {\n ctrl.formValues.Ownership_Teams.push(data.availableTeams[0]);\n }\n ctrl.state.displayAccessControlPanel = true;\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve access control information');\n });\n }\n },\n]);\n","import _ from 'lodash-es';\nimport angular from 'angular';\n\nimport { RoleTypes } from '@/portainer/rbac/models/role';\n\nclass PorAccessManagementController {\n /* @ngInject */\n constructor(Notifications, AccessService, RoleService, featureService) {\n Object.assign(this, { Notifications, AccessService, RoleService, featureService });\n\n this.limitedToBE = false;\n\n this.unauthorizeAccess = this.unauthorizeAccess.bind(this);\n this.updateAction = this.updateAction.bind(this);\n }\n\n updateAction() {\n const entity = this.accessControlledEntity;\n const oldUserAccessPolicies = entity.UserAccessPolicies;\n const oldTeamAccessPolicies = entity.TeamAccessPolicies;\n const updatedUserAccesses = _.filter(this.authorizedUsersAndTeams, { Updated: true, Type: 'user', Inherited: false });\n const updatedTeamAccesses = _.filter(this.authorizedUsersAndTeams, { Updated: true, Type: 'team', Inherited: false });\n\n const accessPolicies = this.AccessService.generateAccessPolicies(oldUserAccessPolicies, oldTeamAccessPolicies, updatedUserAccesses, updatedTeamAccesses);\n this.accessControlledEntity.UserAccessPolicies = accessPolicies.userAccessPolicies;\n this.accessControlledEntity.TeamAccessPolicies = accessPolicies.teamAccessPolicies;\n this.updateAccess();\n }\n\n authorizeAccess() {\n const entity = this.accessControlledEntity;\n const oldUserAccessPolicies = entity.UserAccessPolicies;\n const oldTeamAccessPolicies = entity.TeamAccessPolicies;\n const selectedRoleId = this.formValues.selectedRole.Id;\n const selectedUserAccesses = _.filter(this.formValues.multiselectOutput, (access) => access.Type === 'user');\n const selectedTeamAccesses = _.filter(this.formValues.multiselectOutput, (access) => access.Type === 'team');\n\n const accessPolicies = this.AccessService.generateAccessPolicies(oldUserAccessPolicies, oldTeamAccessPolicies, selectedUserAccesses, selectedTeamAccesses, selectedRoleId);\n this.accessControlledEntity.UserAccessPolicies = accessPolicies.userAccessPolicies;\n this.accessControlledEntity.TeamAccessPolicies = accessPolicies.teamAccessPolicies;\n this.updateAccess();\n }\n\n unauthorizeAccess(selectedAccesses) {\n const entity = this.accessControlledEntity;\n const userAccessPolicies = entity.UserAccessPolicies;\n const teamAccessPolicies = entity.TeamAccessPolicies;\n const selectedUserAccesses = _.filter(selectedAccesses, (access) => access.Type === 'user');\n const selectedTeamAccesses = _.filter(selectedAccesses, (access) => access.Type === 'team');\n\n _.forEach(selectedUserAccesses, (access) => delete userAccessPolicies[access.Id]);\n _.forEach(selectedTeamAccesses, (access) => delete teamAccessPolicies[access.Id]);\n this.updateAccess();\n }\n\n isRoleLimitedToBE(role) {\n if (!this.limitedToBE) {\n return false;\n }\n\n return role.ID !== RoleTypes.STANDARD;\n }\n\n roleLabel(role) {\n if (!this.limitedToBE) {\n return role.Name;\n }\n\n if (this.isRoleLimitedToBE(role)) {\n return `${role.Name} (Business Edition Feature)`;\n }\n\n return `${role.Name} (Default)`;\n }\n\n async $onInit() {\n try {\n if (this.limitedFeature) {\n this.limitedToBE = this.featureService.isLimitedToBE(this.limitedFeature);\n }\n\n const entity = this.accessControlledEntity;\n const parent = this.inheritFrom;\n\n const roles = await this.RoleService.roles();\n this.roles = _.orderBy(roles, 'Priority', 'asc');\n this.formValues = {\n selectedRole: this.roles.find((role) => !this.isRoleLimitedToBE(role)),\n };\n\n const data = await this.AccessService.accesses(entity, parent, this.roles);\n\n if (this.filterUsers) {\n data.availableUsersAndTeams = this.filterUsers(data.availableUsersAndTeams);\n }\n\n this.availableUsersAndTeams = _.orderBy(data.availableUsersAndTeams, 'Name', 'asc');\n this.authorizedUsersAndTeams = data.authorizedUsersAndTeams;\n } catch (err) {\n this.availableUsersAndTeams = [];\n this.authorizedUsersAndTeams = [];\n this.Notifications.error('Failure', err, 'Unable to retrieve accesses');\n }\n }\n}\n\nexport default PorAccessManagementController;\nangular.module('portainer.app').controller('porAccessManagementController', PorAccessManagementController);\n","const autoNgTemplateLoaderTemplate1 = require('./associatedEndpointsSelector.html');\n\nimport angular from 'angular';\nimport AssociatedEndpointsSelectorController from './associatedEndpointsSelectorController';\n\nangular.module('portainer.app').component('associatedEndpointsSelector', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: AssociatedEndpointsSelectorController,\n bindings: {\n endpointIds: '<',\n tags: '<',\n groups: '<',\n hasBackendPagination: '<',\n\n onAssociate: '<',\n onDissociate: '<',\n },\n});\n","var path = 'app/portainer/components/associated-endpoints-selector/associatedEndpointsSelector.html';\nvar html = \"<div class=\\\"col-sm-12 small text-muted\\\">\\n You can select which environment should be part of this group by moving them to the associated environments table. Simply click on any environment entry to move it from one table\\n to the other.\\n</div>\\n<div class=\\\"col-sm-12\\\" style=\\\"margin-top: 20px;\\\">\\n <!-- available-endpoints -->\\n <div class=\\\"col-sm-6\\\">\\n <div class=\\\"text-center small text-muted\\\">Available environments</div>\\n <div style=\\\"margin-top: 10px;\\\">\\n <group-association-table\\n loaded=\\\"$ctrl.loaded\\\"\\n page-type=\\\"$ctrl.pageType\\\"\\n table-type=\\\"available\\\"\\n retrieve-page=\\\"$ctrl.getPaginatedEndpoints\\\"\\n dataset=\\\"$ctrl.endpoints.available\\\"\\n entry-click=\\\"$ctrl.associateEndpoint\\\"\\n pagination-state=\\\"$ctrl.state.available\\\"\\n empty-dataset-message=\\\"No environment available\\\"\\n tags=\\\"$ctrl.tags\\\"\\n show-tags=\\\"true\\\"\\n groups=\\\"$ctrl.groups\\\"\\n show-groups=\\\"true\\\"\\n has-backend-pagination=\\\"true\\\"\\n data-cy=\\\"edgeGroupCreate-availableEndpoints\\\"\\n ></group-association-table>\\n </div>\\n </div>\\n <!-- !available-endpoints -->\\n <!-- associated-endpoints -->\\n <div class=\\\"col-sm-6\\\">\\n <div class=\\\"text-center small text-muted\\\">Associated environments</div>\\n <div style=\\\"margin-top: 10px;\\\">\\n <group-association-table\\n loaded=\\\"$ctrl.loaded\\\"\\n page-type=\\\"$ctrl.pageType\\\"\\n table-type=\\\"associated\\\"\\n retrieve-page=\\\"$ctrl.getPaginatedEndpoints\\\"\\n dataset=\\\"$ctrl.endpoints.associated\\\"\\n entry-click=\\\"$ctrl.dissociateEndpoint\\\"\\n pagination-state=\\\"$ctrl.state.associated\\\"\\n empty-dataset-message=\\\"No associated environment\\\"\\n tags=\\\"$ctrl.tags\\\"\\n show-tags=\\\"true\\\"\\n groups=\\\"$ctrl.groups\\\"\\n show-groups=\\\"true\\\"\\n has-backend-pagination=\\\"true\\\"\\n data-cy=\\\"edgeGroupCreate-associatedEndpoints\\\"\\n ></group-association-table>\\n </div>\\n </div>\\n <!-- !associated-endpoints -->\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","angular.module('portainer.app').directive('autoFocus', [\n '$timeout',\n function porAutoFocus($timeout) {\n var directive = {\n restrict: 'A',\n link: function (scope, element) {\n $timeout(function () {\n element[0].focus();\n });\n },\n };\n\n return directive;\n },\n]);\n","var path = 'app/portainer/components/be-feature-indicator/be-feature-indicator.html';\nvar html = \"<a class=\\\"be-indicator\\\" href=\\\"{{ $ctrl.url }}\\\" target=\\\"_blank\\\" rel=\\\"noopener\\\" ng-if=\\\"$ctrl.limitedToBE\\\">\\n <ng-transclude></ng-transclude>\\n <i class=\\\"be-indicator-icon fas fa-briefcase space-right\\\"></i>\\n <span class=\\\"be-indicator-label\\\">Business Edition Feature</span>\\n</a>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./betaPanel.html');\n\nangular.module('portainer.app').component('betaPanel', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n});\n","var path = 'app/portainer/components/beta-panel/betaPanel.html';\nvar html = \"<information-panel title-text=\\\"Information\\\">\\n <span class=\\\"small\\\">\\n <p class=\\\"text-muted\\\">\\n <i class=\\\"fa fa-flask orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n This is a beta feature.\\n </p>\\n </span>\\n</information-panel>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/components/box-selector/box-selector-item/box-selector-item.html';\nvar html = \"<div\\n class=\\\"box-selector-item\\\"\\n ng-class=\\\"{ business: $ctrl.limitedToBE, limited: $ctrl.limitedToBE }\\\"\\n tooltip-append-to-body=\\\"true\\\"\\n tooltip-placement=\\\"bottom\\\"\\n tooltip-class=\\\"portainer-tooltip\\\"\\n tooltip-enable=\\\"$ctrl.tooltip\\\"\\n uib-tooltip=\\\"{{ $ctrl.tooltip }}\\\"\\n>\\n <input\\n type=\\\"radio\\\"\\n name=\\\"{{ $ctrl.radioName }}\\\"\\n id=\\\"{{ $ctrl.option.id }}\\\"\\n ng-checked=\\\"$ctrl.isChecked($ctrl.option.value)\\\"\\n ng-value=\\\"$ctrl.option.value\\\"\\n ng-disabled=\\\"$ctrl.disabled\\\"\\n />\\n <label for=\\\"{{ $ctrl.option.id }}\\\" ng-click=\\\"$ctrl.handleChange($ctrl.option.value)\\\" data-cy=\\\"{{ $ctrl.radioName }}_{{ $ctrl.option.value }}\\\">\\n <i class=\\\"fas fa-briefcase limited-icon\\\" ng-if=\\\"$ctrl.limitedToBE\\\"></i>\\n\\n <div class=\\\"boxselector_header\\\">\\n <i ng-class=\\\"$ctrl.option.icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n {{ $ctrl.option.label }}\\n </div>\\n <p class=\\\"box-selector-item-description\\\">{{ $ctrl.option.description }}</p>\\n </label>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","angular.module('portainer.app').directive('buttonSpinner', function buttonSpinner() {\n var directive = {\n restrict: 'A',\n scope: {\n spinning: '=buttonSpinner',\n },\n transclude: true,\n template: '<ng-transclude></ng-transclude><span ng-show=\"spinning\"><i class=\"fa fa-circle-notch fa-spin\" style=\"margin-left: 2px;\"></i> </span>',\n };\n\n return directive;\n});\n","const autoNgTemplateLoaderTemplate1 = require('./codeEditor.html');\n\nangular.module('portainer.app').component('codeEditor', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'CodeEditorController',\n bindings: {\n identifier: '@',\n placeholder: '@',\n yml: '<',\n readOnly: '<',\n onChange: '<',\n value: '<',\n },\n});\n","var path = 'app/portainer/components/code-editor/codeEditor.html';\nvar html = \"<textarea id=\\\"{{ $ctrl.identifier }}\\\" class=\\\"form-control\\\" placeholder=\\\"{{ $ctrl.placeholder }}\\\"></textarea>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","angular.module('portainer.app').controller('CodeEditorController', function CodeEditorController($document, CodeMirrorService, $scope) {\n var ctrl = this;\n\n this.$onChanges = function $onChanges({ value }) {\n if (value && value.currentValue && ctrl.editor && ctrl.editor.getValue() !== value.currentValue) {\n ctrl.editor.setValue(value.currentValue);\n }\n };\n\n this.$onInit = function () {\n $document.ready(function () {\n var editorElement = $document[0].getElementById(ctrl.identifier);\n ctrl.editor = CodeMirrorService.applyCodeMirrorOnElement(editorElement, ctrl.yml, ctrl.readOnly);\n if (ctrl.onChange) {\n ctrl.editor.on('change', (...args) => $scope.$evalAsync(() => ctrl.onChange(...args)));\n }\n if (ctrl.value) {\n ctrl.editor.setValue(ctrl.value);\n }\n });\n };\n});\n","var path = 'app/portainer/components/copy-button/copy-button.html';\nvar html = \"<span>\\n <button type=\\\"button\\\" class=\\\"btn btn-link nopadding\\\" ng-click=\\\"$ctrl.copyValueText()\\\" title=\\\"Copy Value\\\"> <i class=\\\"fa fa-copy\\\"></i> Copy </button>\\n <span ng-class=\\\"{ 'copy-button-fadeout': $ctrl.state.isFading }\\\" class=\\\"copy-button-copy-text\\\"> <i class=\\\"fa fa-check\\\" aria-hidden=\\\"true\\\"></i> copied </span>\\n</span>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./customTemplateCommonFields.html');\n\nimport CustomTemplateCommonFieldsController from './customTemplateCommonFieldsController.js';\n\nangular.module('portainer.app').component('customTemplateCommonFields', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: CustomTemplateCommonFieldsController,\n bindings: {\n formValues: '=',\n showPlatformField: '<',\n showTypeField: '<',\n nameRegex: '<',\n },\n});\n","var path = 'app/portainer/components/custom-template-common-fields/customTemplateCommonFields.html';\nvar html = \"<ng-form name=\\\"commonCustomTemplateForm\\\">\\n <!-- title-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"template_title\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Title\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"$ctrl.formValues.Title\\\"\\n ng-pattern=\\\"$ctrl.nameRegex\\\"\\n id=\\\"template_title\\\"\\n name=\\\"template_title\\\"\\n placeholder=\\\"e.g. mytemplate\\\"\\n auto-focus\\n required\\n />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"commonCustomTemplateForm.template_title.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"commonCustomTemplateForm.template_title.$error\\\">\\n <p ng-message=\\\"pattern\\\">\\n <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i>\\n <span>This field must consist of lower case alphanumeric characters, '_' or '-' (e.g. 'my-name', or 'abc-123').</span>\\n </p>\\n </div>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"commonCustomTemplateForm.template_title.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"commonCustomTemplateForm.template_title.$error\\\">\\n <p ng-message=\\\"required\\\"> <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Title is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !title-input -->\\n\\n <!-- description-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"description\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Description</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"description\\\" ng-model=\\\"$ctrl.formValues.Description\\\" name=\\\"description\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"commonCustomTemplateForm.description.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"commonCustomTemplateForm.description.$error\\\">\\n <p ng-message=\\\"required\\\"> <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Description is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !description-input -->\\n\\n <!-- note-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"note\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Note</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"note\\\" ng-model=\\\"$ctrl.formValues.Note\\\" />\\n </div>\\n </div>\\n <!-- !note-input -->\\n\\n <!-- icon-url-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"icon-url\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Icon URL</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"icon-url\\\" ng-model=\\\"$ctrl.formValues.Logo\\\" />\\n </div>\\n </div>\\n <!-- !icon-url-input -->\\n\\n <!-- platform-input -->\\n <div ng-if=\\\"$ctrl.showPlatformField\\\" class=\\\"form-group\\\">\\n <label for=\\\"platform\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Platform</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.formValues.Platform\\\" ng-options=\\\"+(opt.value) as opt.label for opt in $ctrl.platformTypes\\\"> </select>\\n </div>\\n </div>\\n <!-- !platform-input -->\\n\\n <!-- platform-input -->\\n <div ng-if=\\\"$ctrl.showTypeField\\\" class=\\\"form-group\\\">\\n <label for=\\\"platform\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Type</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.formValues.Type\\\" ng-options=\\\"+(opt.value) as opt.label for opt in $ctrl.templateTypes\\\"> </select>\\n </div>\\n </div>\\n <!-- !platform-input -->\\n</ng-form>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./custom-template-selector.html');\n\nimport angular from 'angular';\nimport controller from './custom-template-selector.controller.js';\n\nexport const customTemplateSelector = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n newTemplatePath: '@',\n stackType: '<',\n\n value: '<',\n onChange: '<',\n },\n};\n\nangular.module('portainer.app').component('customTemplateSelector', customTemplateSelector);\n","var path = 'app/portainer/components/custom-template-selector/custom-template-selector.html';\nvar html = \"<div>\\n <div class=\\\"form-group\\\">\\n <label for=\\\"stack_template\\\" class=\\\"col-sm-1 control-label text-left\\\">\\n Template\\n </label>\\n <div class=\\\"col-sm-11\\\">\\n <select\\n ng-if=\\\"$ctrl.templates.length\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"$ctrl.value\\\"\\n ng-options=\\\"template.Id as template.label for template in $ctrl.templates\\\"\\n ng-change=\\\"$ctrl.handleChangeTemplate($ctrl.value)\\\"\\n >\\n <option value=\\\"\\\" label=\\\"Select a Custom template\\\" disabled selected=\\\"selected\\\"> </option>\\n </select>\\n <span ng-if=\\\"!$ctrl.templates.length\\\"> No custom templates are available. Head over to the <a ui-state=\\\"$ctrl.newTemplatePath\\\">custom template view</a> to create one. </span>\\n </div>\\n </div>\\n\\n <!-- description -->\\n <div ng-if=\\\"$ctrl.selectedTemplate.note\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Information\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <div class=\\\"template-note\\\" ng-bind-html=\\\"$ctrl.selectedTemplate.note\\\"></div>\\n </div>\\n </div>\\n </div>\\n <!-- !description -->\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const CUSTOM_TEMPLATES_TYPES = {\n SWARM: 1,\n STANDALONE: 2,\n KUBERNETES: 3,\n};\n\nangular.module('portainer.docker').controller('CustomTemplatesListController', function ($scope, $controller, DatatableService) {\n angular.extend(this, $controller('GenericDatatableController', { $scope: $scope }));\n\n this.typeLabel = typeLabel;\n this.$onInit = $onInit;\n\n function typeLabel(type) {\n switch (type) {\n case CUSTOM_TEMPLATES_TYPES.SWARM:\n return 'swarm';\n case CUSTOM_TEMPLATES_TYPES.KUBERNETES:\n return 'manifest';\n case CUSTOM_TEMPLATES_TYPES.STANDALONE:\n default:\n return 'standalone';\n }\n }\n\n function $onInit() {\n this.setDefaults();\n this.prepareTableFromDataset();\n\n this.state.orderBy = this.orderBy;\n var storedOrder = DatatableService.getDataTableOrder(this.tableKey);\n if (storedOrder !== null) {\n this.state.reverseOrder = storedOrder.reverse;\n this.state.orderBy = storedOrder.orderBy;\n }\n\n var textFilter = DatatableService.getDataTableTextFilters(this.tableKey);\n if (textFilter !== null) {\n this.state.textFilter = textFilter;\n this.onTextFilterChange();\n }\n\n var storedFilters = DatatableService.getDataTableFilters(this.tableKey);\n if (storedFilters !== null) {\n this.filters = storedFilters;\n }\n if (this.filters && this.filters.state) {\n this.filters.state.open = false;\n }\n\n var storedSettings = DatatableService.getDataTableSettings(this.tableKey);\n if (storedSettings !== null) {\n this.settings = storedSettings;\n this.settings.open = false;\n }\n this.onSettingsRepeaterChange();\n }\n});\n","const autoNgTemplateLoaderTemplate1 = require('./customTemplatesList.html');\n\nimport angular from 'angular';\n\nangular.module('portainer.app').component('customTemplatesList', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'CustomTemplatesListController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n templates: '<',\n tableKey: '@',\n onSelectClick: '<',\n showSwarmStacks: '<',\n onDeleteClick: '<',\n isEditAllowed: '<',\n createPath: '@',\n editPath: '@',\n },\n});\n","var path = 'app/portainer/components/custom-templates-list/customTemplatesList.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n </div>\\n <div class=\\\"actionBar\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ui-state=\\\"$ctrl.createPath\\\"> <i class=\\\"fa fa-plus space-right\\\" aria-hidden=\\\"true\\\"></i>Add Custom Template </button>\\n </div>\\n\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n auto-focus\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n\\n <div class=\\\"blocklist\\\">\\n <template-item\\n ng-repeat=\\\"template in $ctrl.templates | filter:$ctrl.state.textFilter\\\"\\n model=\\\"template\\\"\\n type-label=\\\"{{ $ctrl.typeLabel(template.Type) }}\\\"\\n on-select=\\\"($ctrl.onSelectClick)\\\"\\n >\\n <template-item-actions>\\n <div ng-if=\\\"$ctrl.isEditAllowed(template)\\\" style=\\\"display: flex;\\\">\\n <a ui-state=\\\"$ctrl.editPath\\\" ui-state-params=\\\"{id: template.Id}\\\" ng-click=\\\"$event.stopPropagation();\\\" class=\\\"btn btn-primary btn-xs\\\" style=\\\"margin-right: 10px;\\\">\\n Edit\\n </a>\\n <button class=\\\"btn btn-danger btn-xs\\\" ng-click=\\\"$ctrl.onDeleteClick(template.Id); $event.stopPropagation();\\\">Delete</button>\\n </div>\\n </template-item-actions>\\n </template-item>\\n <div ng-if=\\\"!$ctrl.templates\\\" class=\\\"text-center text-muted\\\">\\n Loading...\\n </div>\\n <div ng-if=\\\"($ctrl.templates | filter: $ctrl.state.textFilter).length === 0\\\" class=\\\"text-center text-muted\\\">\\n No templates available.\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./access-tokens-datatable.html');\n\nimport angular from 'angular';\nimport controller from './access-tokens-datatable.controller';\n\nangular.module('portainer.app').component('accessTokensDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n removeAction: '<',\n },\n});\n","var path = 'app/portainer/components/datatables/access-tokens-datatable/access-tokens-datatable.html';\nvar html = \"<div class=\\\"datatable\\\" style=\\\"margin-top: 25px;\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n </div>\\n <div class=\\\"actionBar\\\">\\n <button\\n ng-if=\\\"!$ctrl.endpointType\\\"\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-danger\\\"\\n ng-disabled=\\\"$ctrl.state.selectedItemCount === 0\\\"\\n ng-click=\\\"$ctrl.removeAction($ctrl.state.selectedItems)\\\"\\n >\\n <i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Remove\\n </button>\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ui-sref=\\\"portainer.account.new-access-token\\\">\\n <i class=\\\"fa fa-plus space-right\\\" aria-hidden=\\\"true\\\"></i>Add access token\\n </button>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n auto-focus\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th>\\n <span class=\\\"md-checkbox\\\">\\n <input id=\\\"select_all\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.state.selectAll\\\" ng-change=\\\"$ctrl.selectAll()\\\" />\\n <label for=\\\"select_all\\\"></label>\\n </span>\\n <a ng-click=\\\"$ctrl.changeOrderBy('description')\\\">\\n Description\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'description' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'description' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('prefix')\\\">\\n Prefix\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'prefix' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'prefix' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('dateCreated')\\\">\\n Created\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'dateCreated' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'dateCreated' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('lastUsed')\\\">\\n Last Used\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'lastUsed' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'lastUsed' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit))\\\"\\n ng-class=\\\"{ active: item.Checked }\\\"\\n >\\n <td>\\n <span class=\\\"md-checkbox\\\">\\n <input id=\\\"select_{{ $index }}\\\" type=\\\"checkbox\\\" ng-model=\\\"item.Checked\\\" ng-click=\\\"$ctrl.selectItem(item, $event)\\\" />\\n <label for=\\\"select_{{ $index }}\\\"></label>\\n </span>\\n {{ item.description }}\\n </td>\\n <td>\\n {{ item.prefix }}\\n </td>\\n <td>\\n {{ item.dateCreated | getisodatefromtimestamp }}\\n </td>\\n <td>\\n <span ng-if=\\\"item.lastUsed > 0\\\">{{ item.lastUsed | getisodatefromtimestamp }}</span>\\n </td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"3\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./datatable-columns-visibility.html');\n\nimport angular from 'angular';\n\nimport controller from './datatable-columns-visibility.controller';\n\nangular.module('portainer.app').component('datatableColumnsVisibility', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n columns: '<',\n onChange: '<',\n },\n});\n","var path = 'app/portainer/components/datatables/datatable-columns-visibility/datatable-columns-visibility.html';\nvar html = \"<span class=\\\"setting\\\" ng-class=\\\"{ 'setting-active': $ctrl.state.isOpen }\\\" uib-dropdown dropdown-append-to-body auto-close=\\\"disabled\\\" is-open=\\\"$ctrl.state.isOpen\\\">\\n <span uib-dropdown-toggle><i class=\\\"fa fa-columns space-right\\\" aria-hidden=\\\"true\\\"></i>Columns</span>\\n <div class=\\\"dropdown-menu dropdown-menu-right\\\" uib-dropdown-menu>\\n <div class=\\\"tableMenu\\\">\\n <div class=\\\"menuHeader\\\">\\n Show / Hide Columns\\n </div>\\n <div class=\\\"menuContent\\\">\\n <div class=\\\"md-checkbox\\\" ng-repeat=\\\"(key, value) in $ctrl.columns\\\">\\n <input id=\\\"col_vis_{{::key}}\\\" ng-change=\\\"$ctrl.onChange($ctrl.columns)\\\" type=\\\"checkbox\\\" ng-model=\\\"value.display\\\" />\\n <label for=\\\"col_vis_{{::key}}\\\">{{ value.label }}</label>\\n </div>\\n </div>\\n <div>\\n <a type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"$ctrl.state.isOpen = false;\\\">Close</a>\\n </div>\\n </div>\\n </div>\\n</span>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./endpointsDatatable.html');\n\nangular.module('portainer.app').component('endpointsDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'EndpointsDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n removeAction: '<',\n retrievePage: '<',\n },\n});\n","var path = 'app/portainer/components/datatables/endpoints-datatable/endpointsDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n </div>\\n <div class=\\\"actionBar\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-danger\\\"\\n ng-disabled=\\\"$ctrl.state.selectedItemCount === 0\\\"\\n ng-click=\\\"$ctrl.removeAction($ctrl.state.selectedItems)\\\"\\n data-cy=\\\"endpoint-removeEndpointButton\\\"\\n >\\n <i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Remove\\n </button>\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ui-sref=\\\"portainer.endpoints.new\\\" data-cy=\\\"endpoint-addEndpointButton\\\">\\n <i class=\\\"fa fa-plus space-right\\\" aria-hidden=\\\"true\\\"></i>Add environment\\n </button>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n auto-focus\\n placeholder=\\\"Search...\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n data-cy=\\\"endpoint-searchInput\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\" data-cy=\\\"endpoint-endpointTable\\\">\\n <thead>\\n <tr>\\n <th>\\n <span class=\\\"md-checkbox\\\">\\n <input id=\\\"select_all\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.state.selectAll\\\" ng-change=\\\"$ctrl.selectAll()\\\" />\\n <label for=\\\"select_all\\\"></label>\\n </span>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Name')\\\">\\n Name\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Type')\\\">\\n Type\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Type' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Type' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('URL')\\\">\\n URL\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'URL' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'URL' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('GroupName')\\\">\\n Group\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'GroupName' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'GroupName' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>Actions</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in $ctrl.state.filteredDataSet | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit\\\"\\n total-items=\\\"$ctrl.state.totalFilteredDataSet\\\"\\n ng-class=\\\"{ active: item.Checked }\\\"\\n >\\n <td>\\n <span class=\\\"md-checkbox\\\">\\n <input id=\\\"select_{{ $index }}\\\" type=\\\"checkbox\\\" ng-model=\\\"item.Checked\\\" ng-click=\\\"$ctrl.selectItem(item, $event)\\\" />\\n <label for=\\\"select_{{ $index }}\\\"></label>\\n </span>\\n <a ui-sref=\\\"portainer.endpoints.endpoint({id: item.Id})\\\">{{ item.Name }}</a>\\n </td>\\n <td>\\n <span>\\n <i ng-class=\\\"item.Type | endpointtypeicon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n {{ item.Type | endpointtypename }}\\n </span>\\n </td>\\n <td>\\n <span ng-if=\\\"item.Type !== 4\\\">{{ item.URL | stripprotocol }}</span>\\n <span ng-if=\\\"item.Type === 4\\\">-</span>\\n </td>\\n <td>{{ item.GroupName }}</td>\\n <td>\\n <a ui-sref=\\\"portainer.endpoints.endpoint.access({id: item.Id})\\\"> <i class=\\\"fa fa-users\\\" aria-hidden=\\\"true\\\"></i> Manage access </a>\\n </td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.loading\\\">\\n <td colspan=\\\"5\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.state.loading && $ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"5\\\" class=\\\"text-center text-muted\\\">No environment available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"!$ctrl.state.loading\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\" on-page-change=\\\"$ctrl.onPageChange(newPageNumber, oldPageNumber)\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","angular.module('portainer.app').controller('EndpointsDatatableController', [\n '$scope',\n '$controller',\n 'DatatableService',\n 'PaginationService',\n function ($scope, $controller, DatatableService, PaginationService) {\n angular.extend(this, $controller('GenericDatatableController', { $scope: $scope }));\n\n this.state = Object.assign(this.state, {\n orderBy: this.orderBy,\n loading: true,\n filteredDataSet: [],\n totalFilteredDataset: 0,\n pageNumber: 1,\n });\n\n this.paginationChanged = function () {\n this.state.loading = true;\n this.state.filteredDataSet = [];\n const start = (this.state.pageNumber - 1) * this.state.paginatedItemLimit + 1;\n this.retrievePage(start, this.state.paginatedItemLimit, this.state.textFilter)\n .then((data) => {\n this.state.filteredDataSet = data.endpoints;\n this.state.totalFilteredDataSet = data.totalCount;\n })\n .finally(() => {\n this.state.loading = false;\n });\n };\n\n this.onPageChange = function (newPageNumber) {\n this.state.pageNumber = newPageNumber;\n this.paginationChanged();\n };\n\n /**\n * Overridden\n */\n this.onTextFilterChange = function () {\n var filterValue = this.state.textFilter;\n DatatableService.setDataTableTextFilters(this.tableKey, filterValue);\n this.paginationChanged();\n };\n\n /**\n * Overridden\n */\n this.changePaginationLimit = function () {\n PaginationService.setPaginationLimit(this.tableKey, this.state.paginatedItemLimit);\n this.paginationChanged();\n };\n\n /**\n * Overridden\n */\n this.$onInit = function () {\n this.setDefaults();\n this.prepareTableFromDataset();\n\n var storedOrder = DatatableService.getDataTableOrder(this.tableKey);\n if (storedOrder !== null) {\n this.state.reverseOrder = storedOrder.reverse;\n this.state.orderBy = storedOrder.orderBy;\n }\n\n var textFilter = DatatableService.getDataTableTextFilters(this.tableKey);\n if (textFilter !== null) {\n this.state.textFilter = textFilter;\n this.onTextFilterChange();\n }\n\n var storedFilters = DatatableService.getDataTableFilters(this.tableKey);\n if (storedFilters !== null) {\n this.filters = storedFilters;\n }\n if (this.filters && this.filters.state) {\n this.filters.state.open = false;\n }\n\n this.paginationChanged();\n };\n },\n]);\n","var path = 'app/portainer/components/datatables/filter/datatable-filter.html';\nvar html = \"<div uib-dropdown dropdown-append-to-body auto-close=\\\"outsideClick\\\" is-open=\\\"$ctrl.isOpen\\\">\\n <span ng-transclude></span>\\n <div class=\\\"filter-button\\\">\\n <span uib-dropdown-toggle class=\\\"table-filter\\\" ng-class=\\\"{ 'filter-active': $ctrl.isEnabled() }\\\">\\n Filter\\n <i class=\\\"fa\\\" ng-class=\\\"[$ctrl.isEnabled() ? 'fa-check' : 'fa-filter']\\\" aria-hidden=\\\"true\\\"></i>\\n </span>\\n </div>\\n <div class=\\\"dropdown-menu\\\" style=\\\"min-width: 0;\\\" uib-dropdown-menu>\\n <div class=\\\"tableMenu\\\">\\n <div class=\\\"menuContent\\\">\\n <div class=\\\"md-checkbox\\\" ng-repeat=\\\"filter in $ctrl.labels track by filter.value\\\">\\n <input\\n id=\\\"filter_{{ $ctrl.filterKey }}_{{ $index }}\\\"\\n type=\\\"checkbox\\\"\\n ng-value=\\\"filter.value\\\"\\n ng-checked=\\\"$ctrl.state.includes(filter.value)\\\"\\n ng-click=\\\"$ctrl.onChangeItem(filter.value)\\\"\\n />\\n <label for=\\\"filter_{{ $ctrl.filterKey }}_{{ $index }}\\\">\\n {{ filter.label }}\\n </label>\\n </div>\\n </div>\\n <div>\\n <a class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"$ctrl.isOpen = false;\\\">\\n Close\\n </a>\\n </div>\\n </div>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import _ from 'lodash-es';\nimport './datatable.css';\nimport { ResourceControlOwnership as RCO } from 'Portainer/models/resourceControl/resourceControlOwnership';\n\nfunction isBetween(value, a, b) {\n return (value >= a && value <= b) || (value >= b && value <= a);\n}\n\n// TODO: review - refactor to use a class that can be extended\nangular.module('portainer.app').controller('GenericDatatableController', [\n '$interval',\n 'PaginationService',\n 'DatatableService',\n 'PAGINATION_MAX_ITEMS',\n function ($interval, PaginationService, DatatableService, PAGINATION_MAX_ITEMS) {\n this.RCO = RCO;\n\n this.state = {\n selectAll: false,\n orderBy: this.orderBy,\n paginatedItemLimit: PAGINATION_MAX_ITEMS,\n displayTextFilter: false,\n get selectedItemCount() {\n return this.selectedItems.length || 0;\n },\n selectedItems: [],\n };\n\n this.settings = {\n open: false,\n repeater: {\n autoRefresh: false,\n refreshRate: '30',\n },\n };\n\n this.resetSelectionState = function () {\n this.state.selectAll = false;\n this.state.selectedItems = [];\n _.map(this.state.filteredDataSet, (item) => (item.Checked = false));\n };\n\n this.onTextFilterChange = function () {\n DatatableService.setDataTableTextFilters(this.tableKey, this.state.textFilter);\n };\n\n this.changeOrderBy = function changeOrderBy(orderField) {\n this.state.reverseOrder = this.state.orderBy === orderField ? !this.state.reverseOrder : false;\n this.state.orderBy = orderField;\n DatatableService.setDataTableOrder(this.tableKey, orderField, this.state.reverseOrder);\n };\n\n this.selectItem = function (item, event) {\n // Handle range select using shift\n if (event && event.originalEvent.shiftKey && this.state.firstClickedItem) {\n const firstItemIndex = this.state.filteredDataSet.indexOf(this.state.firstClickedItem);\n const lastItemIndex = this.state.filteredDataSet.indexOf(item);\n const itemsInRange = _.filter(this.state.filteredDataSet, (item, index) => {\n return isBetween(index, firstItemIndex, lastItemIndex);\n });\n const value = this.state.firstClickedItem.Checked;\n\n _.forEach(itemsInRange, (i) => {\n if (!this.allowSelection(i)) {\n return;\n }\n i.Checked = value;\n });\n this.state.firstClickedItem = item;\n } else if (event) {\n item.Checked = !item.Checked;\n this.state.firstClickedItem = item;\n }\n this.state.selectedItems = _.uniq(_.concat(this.state.selectedItems, this.state.filteredDataSet)).filter((i) => i.Checked);\n if (event && this.state.selectAll && this.state.selectedItems.length !== this.state.filteredDataSet.length) {\n this.state.selectAll = false;\n }\n this.onSelectionChanged();\n };\n\n this.selectAll = function () {\n this.state.firstClickedItem = null;\n for (var i = 0; i < this.state.filteredDataSet.length; i++) {\n var item = this.state.filteredDataSet[i];\n if (this.allowSelection(item) && item.Checked !== this.state.selectAll) {\n item.Checked = this.state.selectAll;\n this.selectItem(item);\n }\n }\n this.onSelectionChanged();\n };\n\n /**\n * Override this method to allow/deny selection\n */\n this.allowSelection = function (/*item*/) {\n return true;\n };\n\n /**\n * Override this method to prepare data table\n */\n this.prepareTableFromDataset = function () {\n return;\n };\n\n /**\n * Override this method to execute code after selection changed on datatable\n */\n this.onSelectionChanged = function () {\n return;\n };\n\n this.changePaginationLimit = function () {\n PaginationService.setPaginationLimit(this.tableKey, this.state.paginatedItemLimit);\n };\n\n this.setDefaults = function () {\n this.showTextFilter = this.showTextFilter ? this.showTextFilter : false;\n this.state.reverseOrder = this.reverseOrder ? this.reverseOrder : false;\n this.state.paginatedItemLimit = PaginationService.getPaginationLimit(this.tableKey);\n };\n\n /**\n * Duplicate this function when extending GenericDatatableController\n * Extending-controller's bindings are not accessible there\n * For more details see the following comments\n * https://github.com/portainer/portainer/pull/2877#issuecomment-503333425\n * https://github.com/portainer/portainer/pull/2877#issuecomment-503537249\n */\n this.$onInit = function $onInit() {\n this.$onInitGeneric();\n };\n\n this.$onInitGeneric = function $onInitGeneric() {\n this.setDefaults();\n this.prepareTableFromDataset();\n\n this.state.orderBy = this.orderBy;\n var storedOrder = DatatableService.getDataTableOrder(this.tableKey);\n if (storedOrder !== null) {\n this.state.reverseOrder = storedOrder.reverse;\n this.state.orderBy = storedOrder.orderBy;\n }\n\n var textFilter = DatatableService.getDataTableTextFilters(this.tableKey);\n if (textFilter !== null) {\n this.state.textFilter = textFilter;\n this.onTextFilterChange();\n }\n\n var storedFilters = DatatableService.getDataTableFilters(this.tableKey);\n if (storedFilters !== null) {\n this.filters = storedFilters;\n }\n if (this.filters && this.filters.state) {\n this.filters.state.open = false;\n }\n\n var storedSettings = DatatableService.getDataTableSettings(this.tableKey);\n if (storedSettings !== null) {\n this.settings = storedSettings;\n this.settings.open = false;\n }\n this.onSettingsRepeaterChange();\n\n var storedColumnVisibility = DatatableService.getColumnVisibilitySettings(this.tableKey);\n if (storedColumnVisibility !== null) {\n this.columnVisibility = storedColumnVisibility;\n }\n };\n\n /**\n * REPEATER SECTION\n */\n this.repeater = undefined;\n\n this.$onDestroy = function () {\n this.stopRepeater();\n };\n\n this.stopRepeater = function () {\n if (angular.isDefined(this.repeater)) {\n $interval.cancel(this.repeater);\n this.repeater = undefined;\n }\n };\n\n this.startRepeater = function () {\n this.repeater = $interval(async () => {\n await this.refreshCallback();\n this.onDataRefresh();\n }, this.settings.repeater.refreshRate * 1000);\n };\n\n this.onSettingsRepeaterChange = function () {\n this.stopRepeater();\n if (angular.isDefined(this.refreshCallback) && this.settings.repeater.autoRefresh) {\n this.startRepeater();\n $('#refreshRateChange').show();\n $('#refreshRateChange').fadeOut(1500);\n }\n DatatableService.setDataTableSettings(this.tableKey, this.settings);\n };\n\n /**\n * Override this method to execute code after calling the refresh callback\n */\n this.onDataRefresh = function () {\n return;\n };\n\n /**\n * !REPEATER SECTION\n */\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./groupsDatatable.html');\n\nangular.module('portainer.app').component('groupsDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'GenericDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n removeAction: '<',\n },\n});\n","var path = 'app/portainer/components/datatables/groups-datatable/groupsDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n </div>\\n <div class=\\\"actionBar\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-danger\\\"\\n ng-disabled=\\\"$ctrl.state.selectedItemCount === 0\\\"\\n ng-click=\\\"$ctrl.removeAction($ctrl.state.selectedItems)\\\"\\n data-cy=\\\"endpointGroup-removeGroupButton\\\"\\n >\\n <i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Remove\\n </button>\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ui-sref=\\\"portainer.groups.new\\\" data-cy=\\\"endpointGroup-addGroupButton\\\">\\n <i class=\\\"fa fa-plus space-right\\\" aria-hidden=\\\"true\\\"></i>Add group\\n </button>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n auto-focus\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n data-cy=\\\"endpointGroup-searchInput\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\" data-cy=\\\"endpointGroup-endpointGroupTable\\\">\\n <thead>\\n <tr>\\n <th>\\n <span class=\\\"md-checkbox\\\">\\n <input id=\\\"select_all\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.state.selectAll\\\" ng-change=\\\"$ctrl.selectAll()\\\" data-cy=\\\"endpointGroup-selectAllCheckbox\\\" />\\n <label for=\\\"select_all\\\"></label>\\n </span>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Name')\\\">\\n Name\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>Actions</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit))\\\"\\n ng-class=\\\"{ active: item.Checked }\\\"\\n >\\n <td>\\n <span class=\\\"md-checkbox\\\">\\n <input id=\\\"select_{{ $index }}\\\" type=\\\"checkbox\\\" ng-model=\\\"item.Checked\\\" ng-click=\\\"$ctrl.selectItem(item, $event)\\\" />\\n <label for=\\\"select_{{ $index }}\\\"></label>\\n </span>\\n <a ui-sref=\\\"portainer.groups.group({id: item.Id})\\\">{{ item.Name }}</a>\\n </td>\\n <td>\\n <a ui-sref=\\\"portainer.groups.group.access({id: item.Id})\\\"> <i class=\\\"fa fa-users\\\" aria-hidden=\\\"true\\\"></i> Manage access </a>\\n </td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"3\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"3\\\" class=\\\"text-center text-muted\\\">No group available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import angular from 'angular';\nimport 'angular-utils-pagination';\n\nimport { datatableTitlebar } from './titlebar';\nimport { datatableSearchbar } from './searchbar';\nimport { datatableSortIcon } from './sort-icon';\nimport { datatablePagination } from './pagination';\nimport { datatableFilter } from './filter';\n\nexport default angular\n .module('portainer.shared.datatable', ['angularUtils.directives.dirPagination'])\n .component('datatableTitlebar', datatableTitlebar)\n .component('datatableSearchbar', datatableSearchbar)\n .component('datatableSortIcon', datatableSortIcon)\n .component('datatablePagination', datatablePagination)\n .component('datatableFilter', datatableFilter).name;\n","var path = 'app/portainer/components/datatables/titlebar/datatable-titlebar.html';\nvar html = \"<div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\">\\n <i class=\\\"fa\\\" ng-class=\\\"$ctrl.icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n <span style=\\\"margin-right: 10px;\\\">{{ $ctrl.title }}</span>\\n <be-feature-indicator feature=\\\"$ctrl.feature\\\"></be-feature-indicator>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/components/datatables/searchbar/datatable-searchbar.html';\nvar html = \"<div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input type=\\\"text\\\" class=\\\"searchInput\\\" ng-model=\\\"$ctrl.filter\\\" ng-change=\\\"$ctrl.onChange($ctrl.filter)\\\" placeholder=\\\"Search...\\\" ng-model-options=\\\"{ debounce: 300 }\\\" />\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/components/datatables/sort-icon/datatable-sort-icon.html';\nvar html = \"<i\\n class=\\\"fa fa-sort-alpha-down\\\"\\n ng-class=\\\"{\\n 'fa-sort-alpha-down': !$ctrl.reverseOrder,\\n 'fa-sort-alpha-up': $ctrl.reverseOrder,\\n }\\\"\\n aria-hidden=\\\"true\\\"\\n ng-if=\\\"$ctrl.isCurrentSortOrder()\\\"\\n></i>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/components/datatables/pagination/pagination.html';\nvar html = \"<div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\"> Items per page </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.limit\\\" ng-change=\\\"$ctrl.onChangeLimit($ctrl.limit)\\\">\\n <option ng-if=\\\"$ctrl.enableNoLimit\\\" ng-value=\\\"0\\\">All</option>\\n <option ng-value=\\\"10\\\">10</option>\\n <option ng-value=\\\"25\\\">25</option>\\n <option ng-value=\\\"50\\\">50</option>\\n <option ng-value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\" on-page-change=\\\"$ctrl.onChangePage(newPageNumber)\\\"> </dir-pagination-controls>\\n </form>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./registriesDatatable.html');\n\nangular.module('portainer.app').component('registriesDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'RegistriesDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n removeAction: '<',\n canBrowse: '<',\n endpointType: '<',\n canManageAccess: '<',\n },\n});\n","var path = 'app/portainer/components/datatables/registries-datatable/registriesDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n </div>\\n <div class=\\\"actionBar\\\" ng-if=\\\"$ctrl.isAdmin\\\">\\n <button\\n ng-if=\\\"!$ctrl.endpointType\\\"\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-danger\\\"\\n ng-disabled=\\\"$ctrl.state.selectedItemCount === 0\\\"\\n ng-click=\\\"$ctrl.removeAction($ctrl.state.selectedItems)\\\"\\n >\\n <i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Remove\\n </button>\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ui-sref=\\\"portainer.registries.new\\\"> <i class=\\\"fa fa-plus space-right\\\" aria-hidden=\\\"true\\\"></i>Add registry </button>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n auto-focus\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th>\\n <span class=\\\"md-checkbox\\\" ng-if=\\\"$ctrl.isAdmin && !$ctrl.endpointType\\\">\\n <input id=\\\"select_all\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.state.selectAll\\\" ng-change=\\\"$ctrl.selectAll()\\\" />\\n <label for=\\\"select_all\\\"></label>\\n </span>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Name')\\\">\\n Name\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('URL')\\\">\\n URL\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'URL' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'URL' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>Actions</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr>\\n <td>\\n <span class=\\\"md-checkbox\\\" ng-if=\\\"$ctrl.isAdmin && !$ctrl.endpointType\\\">\\n <input id=\\\"select_{{ $index }}\\\" type=\\\"checkbox\\\" disabled />\\n <label for=\\\"select_{{ $index }}\\\"></label>\\n </span>\\n <span>DockerHub (anonymous)</span>\\n </td>\\n <td>\\n docker.io\\n </td>\\n <td>\\n -\\n </td>\\n </tr>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit))\\\"\\n ng-class=\\\"{ active: item.Checked }\\\"\\n >\\n <td>\\n <span class=\\\"md-checkbox\\\" ng-if=\\\"$ctrl.isAdmin && !$ctrl.endpointType\\\">\\n <input id=\\\"select_{{ $index }}\\\" type=\\\"checkbox\\\" ng-model=\\\"item.Checked\\\" ng-click=\\\"$ctrl.selectItem(item, $event)\\\" ng-disabled=\\\"!$ctrl.allowSelection(item)\\\" />\\n <label for=\\\"select_{{ $index }}\\\"></label>\\n </span>\\n <a ui-sref=\\\"portainer.registries.registry({id: item.Id})\\\" ng-if=\\\"$ctrl.enableGoToLink(item)\\\">{{ item.Name }}</a>\\n <span ng-if=\\\"!$ctrl.enableGoToLink(item)\\\">{{ item.Name }}</span>\\n <span ng-if=\\\"item.Authentication\\\" style=\\\"margin-left: 5px;\\\" class=\\\"label label-info image-tag\\\">authentication-enabled</span>\\n </td>\\n <td>\\n {{ item.URL }}\\n </td>\\n <td>\\n <a ng-if=\\\"$ctrl.canManageAccess(item)\\\" ng-click=\\\"$ctrl.redirectToManageAccess(item)\\\"> <i class=\\\"fa fa-users\\\" aria-hidden=\\\"true\\\"></i> Manage access </a>\\n <be-feature-indicator feature=\\\"$ctrl.limitedFeature\\\" ng-if=\\\"$ctrl.canBrowse(item)\\\">\\n <span class=\\\"text-muted space-left\\\" style=\\\"padding-right: 5px;\\\"> <i class=\\\"fa fa-search\\\" aria-hidden=\\\"true\\\"></i> Browse</span>\\n </be-feature-indicator>\\n\\n <span ng-if=\\\"!$ctrl.canBrowse(item) && !$ctrl.canManageAccess(item)\\\"> - </span>\\n </td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"3\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import { PortainerEndpointTypes } from 'Portainer/models/endpoint/models';\nimport { REGISTRY_MANAGEMENT } from '@/portainer/feature-flags/feature-ids';\nangular.module('portainer.docker').controller('RegistriesDatatableController', RegistriesDatatableController);\n\n/* @ngInject */\nfunction RegistriesDatatableController($scope, $controller, $state, Authentication, DatatableService) {\n angular.extend(this, $controller('GenericDatatableController', { $scope: $scope }));\n\n this.allowSelection = function (item) {\n return item.Id;\n };\n\n this.enableGoToLink = (item) => {\n return this.isAdmin && item.Id && !this.endpointType;\n };\n\n this.goToRegistry = function (item) {\n if (\n this.endpointType === PortainerEndpointTypes.KubernetesLocalEnvironment ||\n this.endpointType === PortainerEndpointTypes.AgentOnKubernetesEnvironment ||\n this.endpointType === PortainerEndpointTypes.EdgeAgentOnKubernetesEnvironment\n ) {\n $state.go('kubernetes.registries.registry', { id: item.Id });\n } else if (\n this.endpointType === PortainerEndpointTypes.DockerEnvironment ||\n this.endpointType === PortainerEndpointTypes.AgentOnDockerEnvironment ||\n this.endpointType === PortainerEndpointTypes.EdgeAgentOnDockerEnvironment\n ) {\n $state.go('docker.registries.registry', { id: item.Id });\n } else {\n $state.go('portainer.registries.registry', { id: item.Id });\n }\n };\n\n this.redirectToManageAccess = function (item) {\n if (\n this.endpointType === PortainerEndpointTypes.KubernetesLocalEnvironment ||\n this.endpointType === PortainerEndpointTypes.AgentOnKubernetesEnvironment ||\n this.endpointType === PortainerEndpointTypes.EdgeAgentOnKubernetesEnvironment\n ) {\n $state.go('kubernetes.registries.access', { id: item.Id });\n } else {\n $state.go('docker.registries.access', { id: item.Id });\n }\n };\n\n this.$onInit = function () {\n this.limitedFeature = REGISTRY_MANAGEMENT;\n this.isAdmin = Authentication.isAdmin();\n this.setDefaults();\n this.prepareTableFromDataset();\n\n this.state.orderBy = this.orderBy;\n var storedOrder = DatatableService.getDataTableOrder(this.tableKey);\n if (storedOrder !== null) {\n this.state.reverseOrder = storedOrder.reverse;\n this.state.orderBy = storedOrder.orderBy;\n }\n\n var textFilter = DatatableService.getDataTableTextFilters(this.tableKey);\n if (textFilter !== null) {\n this.state.textFilter = textFilter;\n this.onTextFilterChange();\n }\n\n var storedFilters = DatatableService.getDataTableFilters(this.tableKey);\n if (storedFilters !== null) {\n this.filters = storedFilters;\n }\n if (this.filters && this.filters.state) {\n this.filters.state.open = false;\n }\n\n var storedSettings = DatatableService.getDataTableSettings(this.tableKey);\n if (storedSettings !== null) {\n this.settings = storedSettings;\n this.settings.open = false;\n }\n this.onSettingsRepeaterChange();\n\n var storedColumnVisibility = DatatableService.getColumnVisibilitySettings(this.tableKey);\n if (storedColumnVisibility !== null) {\n this.columnVisibility = storedColumnVisibility;\n }\n };\n}\n","const autoNgTemplateLoaderTemplate1 = require('./stacksDatatable.html');\n\nangular.module('portainer.app').component('stacksDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'StacksDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n removeAction: '<',\n offlineMode: '<',\n refreshCallback: '<',\n createEnabled: '<',\n },\n});\n","var path = 'app/portainer/components/datatables/stacks-datatable/stacksDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"><i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n <div class=\\\"settings\\\">\\n <datatable-columns-visibility columns=\\\"$ctrl.columnVisibility.columns\\\" on-change=\\\"($ctrl.onColumnVisibilityChange)\\\"></datatable-columns-visibility>\\n <span class=\\\"setting\\\" ng-class=\\\"{ 'setting-active': $ctrl.settings.open }\\\" uib-dropdown dropdown-append-to-body auto-close=\\\"disabled\\\" is-open=\\\"$ctrl.settings.open\\\">\\n <span uib-dropdown-toggle><i class=\\\"fa fa-cog\\\" aria-hidden=\\\"true\\\"></i> Settings</span>\\n <div class=\\\"dropdown-menu dropdown-menu-right\\\" uib-dropdown-menu>\\n <div class=\\\"tableMenu\\\">\\n <div class=\\\"menuHeader\\\">\\n Table settings\\n </div>\\n <div class=\\\"menuContent\\\">\\n <div>\\n <div class=\\\"md-checkbox\\\" ng-if=\\\"$ctrl.isAdmin\\\">\\n <input id=\\\"setting_all_orphaned_stacks\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.settings.allOrphanedStacks\\\" ng-change=\\\"$ctrl.onSettingsAllOrphanedStacksChange()\\\" />\\n <label for=\\\"setting_all_orphaned_stacks\\\">Show all orphaned stacks</label>\\n </div>\\n <div class=\\\"md-checkbox\\\">\\n <input id=\\\"setting_auto_refresh\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.settings.repeater.autoRefresh\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" />\\n <label for=\\\"setting_auto_refresh\\\">Auto refresh</label>\\n </div>\\n <div ng-if=\\\"$ctrl.settings.repeater.autoRefresh\\\">\\n <label for=\\\"settings_refresh_rate\\\">\\n Refresh rate\\n </label>\\n <select id=\\\"settings_refresh_rate\\\" ng-model=\\\"$ctrl.settings.repeater.refreshRate\\\" ng-change=\\\"$ctrl.onSettingsRepeaterChange()\\\" class=\\\"small-select\\\">\\n <option value=\\\"10\\\">10s</option>\\n <option value=\\\"30\\\">30s</option>\\n <option value=\\\"60\\\">1min</option>\\n <option value=\\\"120\\\">2min</option>\\n <option value=\\\"300\\\">5min</option>\\n </select>\\n <span>\\n <i id=\\\"refreshRateChange\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-top: 7px; display: none;\\\"></i>\\n </span>\\n </div>\\n </div>\\n </div>\\n <div>\\n <a type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"$ctrl.settings.open = false;\\\">Close</a>\\n </div>\\n </div>\\n </div>\\n </span>\\n </div>\\n </div>\\n <div class=\\\"actionBar\\\" ng-if=\\\"!$ctrl.offlineMode\\\" authorization=\\\"PortainerStackCreate, PortainerStackDelete\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-danger\\\"\\n authorization=\\\"PortainerStackDelete\\\"\\n ng-disabled=\\\"$ctrl.state.selectedItemCount === 0\\\"\\n ng-click=\\\"$ctrl.removeAction($ctrl.state.selectedItems)\\\"\\n data-cy=\\\"stack-removeStackButton\\\"\\n >\\n <i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Remove\\n </button>\\n <button\\n ng-disabled=\\\"!$ctrl.createEnabled\\\"\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-primary\\\"\\n ui-sref=\\\"docker.stacks.newstack\\\"\\n authorization=\\\"PortainerStackCreate\\\"\\n data-cy=\\\"stack-addStackButton\\\"\\n >\\n <i class=\\\"fa fa-plus space-right\\\" aria-hidden=\\\"true\\\"></i>Add stack\\n </button>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n auto-focus\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n data-cy=\\\"stack-searchInput\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\" data-cy=\\\"stack-stackTable\\\">\\n <thead>\\n <tr>\\n <th uib-dropdown dropdown-append-to-body auto-close=\\\"disabled\\\" is-open=\\\"$ctrl.filters.state.open\\\">\\n <span class=\\\"md-checkbox\\\" ng-if=\\\"!$ctrl.offlineMode\\\" authorization=\\\"PortainerStackCreate, PortainerStackDelete\\\">\\n <input id=\\\"select_all\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.state.selectAll\\\" ng-change=\\\"$ctrl.selectAll()\\\" />\\n <label for=\\\"select_all\\\"></label>\\n </span>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Name')\\\">\\n Name\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n <div>\\n <span uib-dropdown-toggle ng-class=\\\"['table-filter', { 'filter-active': $ctrl.filters.state.enabled }]\\\">\\n Filter\\n <i ng-class=\\\"['fa', { 'fa-filter': !$ctrl.filters.state.enabled, 'fa-check': $ctrl.filters.state.enabled }]\\\" aria-hidden=\\\"true\\\"></i>\\n </span>\\n </div>\\n <div class=\\\"dropdown-menu\\\" uib-dropdown-menu>\\n <div class=\\\"tableMenu\\\">\\n <div class=\\\"menuHeader\\\">\\n Filter by activity\\n </div>\\n <div class=\\\"menuContent\\\">\\n <div class=\\\"md-checkbox\\\">\\n <input id=\\\"filter_usage_activeStacks\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.filters.state.showActiveStacks\\\" ng-change=\\\"$ctrl.onFilterChange()\\\" />\\n <label for=\\\"filter_usage_activeStacks\\\">Active stacks</label>\\n </div>\\n <div class=\\\"md-checkbox\\\">\\n <input id=\\\"filter_usage_unactiveStacks\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.filters.state.showUnactiveStacks\\\" ng-change=\\\"$ctrl.onFilterChange()\\\" />\\n <label for=\\\"filter_usage_unactiveStacks\\\">Inactive stacks</label>\\n </div>\\n </div>\\n <div>\\n <a type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"$ctrl.filters.state.open = false;\\\">Close</a>\\n </div>\\n </div>\\n </div>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Type')\\\">\\n Type\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Type' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Type' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>Control</th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('ResourceControl.CreationDate')\\\">\\n Created\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'ResourceControl.CreationDate' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'ResourceControl.CreationDate' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th ng-if=\\\"$ctrl.columnVisibility.columns.updated.display\\\">\\n <a ng-click=\\\"$ctrl.changeOrderBy('ResourceControl.UpdateDate')\\\">\\n Updated\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'ResourceControl.UpdateDate' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'ResourceControl.UpdateDate' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('ResourceControl.Ownership')\\\">\\n Ownership\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'ResourceControl.Ownership' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'ResourceControl.Ownership' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter: $ctrl.applyFilters | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit))\\\"\\n ng-class=\\\"{ active: item.Checked }\\\"\\n >\\n <td>\\n <span class=\\\"md-checkbox\\\" ng-if=\\\"!$ctrl.offlineMode\\\" authorization=\\\"PortainerStackCreate, PortainerStackDelete\\\">\\n <input id=\\\"select_{{ $index }}\\\" type=\\\"checkbox\\\" ng-model=\\\"item.Checked\\\" ng-click=\\\"$ctrl.selectItem(item, $event)\\\" ng-disabled=\\\"!$ctrl.allowSelection(item)\\\" />\\n <label for=\\\"select_{{ $index }}\\\"></label>\\n </span>\\n <a\\n ng-if=\\\"!$ctrl.offlineMode\\\"\\n ui-sref=\\\"docker.stacks.stack({ name: item.Name, id: item.Id, type: item.Type, regular: item.Regular, external: item.External, orphaned: item.Orphaned, orphanedRunning: item.OrphanedRunning })\\\"\\n >{{ item.Name }}</a\\n >\\n <span ng-if=\\\"$ctrl.offlineMode\\\">{{ item.Name }}</span>\\n <span ng-if=\\\"item.Regular && item.Status == 2\\\" style=\\\"margin-left: 10px;\\\" class=\\\"label label-warning image-tag space-left\\\">Inactive</span>\\n </td>\\n <td>{{ item.Type === 1 ? 'Swarm' : 'Compose' }}</td>\\n <td>\\n <span\\n ng-if=\\\"item.Orphaned\\\"\\n class=\\\"interactive\\\"\\n tooltip-append-to-body=\\\"true\\\"\\n tooltip-placement=\\\"bottom\\\"\\n tooltip-class=\\\"portainer-tooltip\\\"\\n uib-tooltip=\\\"This stack was created inside an environment that is no longer registered inside Portainer.\\\"\\n >\\n Orphaned <i class=\\\"fa fa-exclamation-circle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-left: 2px;\\\"></i>\\n </span>\\n <span\\n ng-if=\\\"item.External\\\"\\n class=\\\"interactive\\\"\\n tooltip-append-to-body=\\\"true\\\"\\n tooltip-placement=\\\"bottom\\\"\\n tooltip-class=\\\"portainer-tooltip\\\"\\n uib-tooltip=\\\"This stack was created outside of Portainer. Control over this stack is limited.\\\"\\n >\\n Limited <i class=\\\"fa fa-exclamation-circle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-left: 2px;\\\"></i>\\n </span>\\n <span ng-if=\\\"item.Regular\\\">Total</span>\\n </td>\\n <td>\\n <span ng-if=\\\"item.CreationDate\\\">{{ item.CreationDate | getisodatefromtimestamp }} {{ item.CreatedBy ? 'by ' + item.CreatedBy : '' }}</span>\\n <span ng-if=\\\"!item.CreationDate\\\"> - </span>\\n </td>\\n <td ng-if=\\\"$ctrl.columnVisibility.columns.updated.display\\\">\\n <span ng-if=\\\"item.UpdateDate\\\">{{ item.UpdateDate | getisodatefromtimestamp }} {{ item.UpdatedBy ? 'by ' + item.UpdatedBy : '' }}</span>\\n <span ng-if=\\\"!item.UpdateDate\\\"> - </span>\\n </td>\\n <td>\\n <span>\\n <i ng-class=\\\"item.ResourceControl.Ownership | ownershipicon\\\" aria-hidden=\\\"true\\\"></i>\\n {{ item.ResourceControl.Ownership ? item.ResourceControl.Ownership : item.ResourceControl.Ownership = $ctrl.RCO.ADMINISTRATORS }}\\n </span>\\n </td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\" data-cy=\\\"stacks-loadingTableRow\\\">\\n <td colspan=\\\"6\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\" data-cy=\\\"stacks-noStackTableRow\\\">\\n <td colspan=\\\"6\\\" class=\\\"text-center text-muted\\\">No stack available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\">\\n {{ $ctrl.state.selectedItemCount }}\\n item(s) selected\\n </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","angular.module('portainer.app').controller('StacksDatatableController', [\n '$scope',\n '$controller',\n 'DatatableService',\n 'Authentication',\n function ($scope, $controller, DatatableService, Authentication) {\n angular.extend(this, $controller('GenericDatatableController', { $scope: $scope }));\n\n this.filters = {\n state: {\n open: false,\n enabled: false,\n showActiveStacks: true,\n showUnactiveStacks: true,\n },\n };\n\n this.columnVisibility = {\n state: {\n open: false,\n },\n columns: {\n updated: {\n label: 'Updated',\n display: false,\n },\n },\n };\n\n this.onColumnVisibilityChange = onColumnVisibilityChange.bind(this);\n function onColumnVisibilityChange(columns) {\n this.columnVisibility.columns = columns;\n DatatableService.setColumnVisibilitySettings(this.tableKey, this.columnVisibility);\n }\n\n /**\n * Do not allow external items\n */\n this.allowSelection = function (item) {\n if (item.External && item.Type === 2) {\n return false;\n }\n\n return !(item.External && !this.isAdmin);\n };\n\n this.applyFilters = applyFilters.bind(this);\n function applyFilters(stack) {\n const { showActiveStacks, showUnactiveStacks } = this.filters.state;\n if (stack.Orphaned) {\n return stack.OrphanedRunning || this.settings.allOrphanedStacks;\n } else {\n return (stack.Status === 1 && showActiveStacks) || (stack.Status === 2 && showUnactiveStacks) || stack.External || !stack.Status;\n }\n }\n\n this.onFilterChange = onFilterChange.bind(this);\n function onFilterChange() {\n const { showActiveStacks, showUnactiveStacks } = this.filters.state;\n this.filters.state.enabled = !showActiveStacks || !showUnactiveStacks;\n DatatableService.setDataTableFilters(this.tableKey, this.filters);\n }\n\n this.onSettingsAllOrphanedStacksChange = function () {\n DatatableService.setDataTableSettings(this.tableKey, this.settings);\n };\n\n this.$onInit = function () {\n this.isAdmin = Authentication.isAdmin();\n this.setDefaults();\n this.prepareTableFromDataset();\n\n this.state.orderBy = this.orderBy;\n var storedOrder = DatatableService.getDataTableOrder(this.tableKey);\n if (storedOrder !== null) {\n this.state.reverseOrder = storedOrder.reverse;\n this.state.orderBy = storedOrder.orderBy;\n }\n\n var textFilter = DatatableService.getDataTableTextFilters(this.tableKey);\n if (textFilter !== null) {\n this.state.textFilter = textFilter;\n this.onTextFilterChange();\n }\n\n var storedFilters = DatatableService.getDataTableFilters(this.tableKey);\n if (storedFilters !== null) {\n this.filters = storedFilters;\n }\n if (this.filters && this.filters.state) {\n this.filters.state.open = false;\n }\n\n var storedSettings = DatatableService.getDataTableSettings(this.tableKey);\n if (storedSettings !== null) {\n this.settings = storedSettings;\n this.settings.open = false;\n this.settings.allOrphanedStacks = this.settings.allOrphanedStacks && this.isAdmin;\n }\n this.onSettingsRepeaterChange();\n\n var storedColumnVisibility = DatatableService.getColumnVisibilitySettings(this.tableKey);\n if (storedColumnVisibility !== null) {\n this.columnVisibility = storedColumnVisibility;\n }\n };\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./strings-datatable.html');\n\nimport angular from 'angular';\n// import controller from './strings-datatable.controller.js';\n\nexport const stringsDatatable = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'GenericDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n emptyDatasetMessage: '@',\n\n columnHeader: '@',\n tableKey: '@',\n\n onRemove: '<',\n },\n};\n\nangular.module('portainer.app').component('stringsDatatable', stringsDatatable);\n","var path = 'app/portainer/components/datatables/strings-datatable/strings-datatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"{{ $ctrl.titleIcon }}\\\" title-text=\\\"{{ $ctrl.titleText }}\\\"> </rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"actionBar\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-danger\\\" ng-disabled=\\\"$ctrl.state.selectedItemCount === 0\\\" ng-click=\\\"$ctrl.onRemove($ctrl.state.selectedItems)\\\">\\n <i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Remove\\n </button>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th>\\n <span class=\\\"md-checkbox\\\">\\n <input id=\\\"select_all\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.state.selectAll\\\" ng-change=\\\"$ctrl.selectAll()\\\" />\\n <label for=\\\"select_all\\\"></label>\\n </span>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Name')\\\">\\n {{ $ctrl.columnHeader }}\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit)) track by $index\\\"\\n ng-class=\\\"{ active: $ctrl.state.selectedItems.includes(item) }\\\"\\n >\\n <td>\\n <span class=\\\"md-checkbox\\\">\\n <input\\n id=\\\"select_{{ $index }}\\\"\\n type=\\\"checkbox\\\"\\n ng-checked=\\\"$ctrl.state.selectedItems.includes(item)\\\"\\n ng-disabled=\\\"$ctrl.disableRemove(item)\\\"\\n ng-click=\\\"$ctrl.selectItem(item, $event)\\\"\\n />\\n <label for=\\\"select_{{ $index }}\\\"></label>\\n </span>\\n {{ item.value }}\\n </td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td class=\\\"text-center text-muted\\\">{{ $ctrl.emptyDatasetMessage }}</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./tagsDatatable.html');\n\nangular.module('portainer.app').component('tagsDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'GenericDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n removeAction: '<',\n },\n});\n","var path = 'app/portainer/components/datatables/tags-datatable/tagsDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n </div>\\n <div class=\\\"actionBar\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-danger\\\" ng-disabled=\\\"$ctrl.state.selectedItemCount === 0\\\" ng-click=\\\"$ctrl.removeAction($ctrl.state.selectedItems)\\\">\\n <i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Remove\\n </button>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th>\\n <span class=\\\"md-checkbox\\\">\\n <input id=\\\"select_all\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.state.selectAll\\\" ng-change=\\\"$ctrl.selectAll()\\\" />\\n <label for=\\\"select_all\\\"></label>\\n </span>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Name')\\\">\\n Name\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit))\\\"\\n ng-class=\\\"{ active: item.Checked }\\\"\\n >\\n <td>\\n <span class=\\\"md-checkbox\\\">\\n <input id=\\\"select_{{ $index }}\\\" type=\\\"checkbox\\\" ng-model=\\\"item.Checked\\\" ng-click=\\\"$ctrl.selectItem(item, $event)\\\" />\\n <label for=\\\"select_{{ $index }}\\\"></label>\\n </span>\\n {{ item.Name }}\\n </td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"1\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"1\\\" class=\\\"text-center text-muted\\\">No tag available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./teamsDatatable.html');\n\nangular.module('portainer.app').component('teamsDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'GenericDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n removeAction: '<',\n },\n});\n","var path = 'app/portainer/components/datatables/teams-datatable/teamsDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n </div>\\n <div class=\\\"actionBar\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-danger\\\" ng-disabled=\\\"$ctrl.state.selectedItemCount === 0\\\" ng-click=\\\"$ctrl.removeAction($ctrl.state.selectedItems)\\\">\\n <i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Remove\\n </button>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th>\\n <span class=\\\"md-checkbox\\\">\\n <input id=\\\"select_all\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.state.selectAll\\\" ng-change=\\\"$ctrl.selectAll()\\\" />\\n <label for=\\\"select_all\\\"></label>\\n </span>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Name')\\\">\\n Name\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit))\\\"\\n ng-class=\\\"{ active: item.Checked }\\\"\\n >\\n <td>\\n <span class=\\\"md-checkbox\\\">\\n <input id=\\\"select_{{ $index }}\\\" type=\\\"checkbox\\\" ng-model=\\\"item.Checked\\\" ng-click=\\\"$ctrl.selectItem(item, $event)\\\" />\\n <label for=\\\"select_{{ $index }}\\\"></label>\\n </span>\\n <a ui-sref=\\\"portainer.teams.team({id: item.Id})\\\">{{ item.Name }}</a>\\n </td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td class=\\\"text-center text-muted\\\">No team available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./usersDatatable.html');\n\nimport angular from 'angular';\nimport UsersDatatableController from './usersDatatableController';\n\nangular.module('portainer.app').component('usersDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: UsersDatatableController,\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n removeAction: '<',\n authenticationMethod: '<',\n },\n});\n","var path = 'app/portainer/components/datatables/users-datatable/usersDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n </div>\\n <div class=\\\"actionBar\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-danger\\\"\\n ng-disabled=\\\"$ctrl.state.selectedItemCount === 0\\\"\\n ng-click=\\\"$ctrl.removeAction($ctrl.state.selectedItems)\\\"\\n data-cy=\\\"user-removeUserButton\\\"\\n >\\n <i class=\\\"fa fa-trash-alt space-right\\\" aria-hidden=\\\"true\\\"></i>Remove\\n </button>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\" data-cy=\\\"user-userTable\\\">\\n <thead>\\n <tr>\\n <th>\\n <span class=\\\"md-checkbox\\\">\\n <input id=\\\"select_all\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.state.selectAll\\\" ng-change=\\\"$ctrl.selectAll()\\\" />\\n <label for=\\\"select_all\\\"></label>\\n </span>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Username')\\\">\\n Name\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Username' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Username' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('RoleName')\\\">\\n Role\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'RoleName' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'RoleName' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('AuthenticationMethod')\\\">\\n Authentication\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'AuthenticationMethod' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'AuthenticationMethod' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit))\\\"\\n ng-class=\\\"{ active: item.Checked }\\\"\\n >\\n <td>\\n <span class=\\\"md-checkbox\\\">\\n <input id=\\\"select_{{ $index }}\\\" type=\\\"checkbox\\\" ng-model=\\\"item.Checked\\\" ng-click=\\\"$ctrl.selectItem(item, $event)\\\" ng-disabled=\\\"!$ctrl.allowSelection(item)\\\" />\\n <label for=\\\"select_{{ $index }}\\\"></label>\\n </span>\\n <a ui-sref=\\\"portainer.users.user({id: item.Id})\\\">{{ item.Username }}</a>\\n </td>\\n <td>\\n <span>\\n <i class=\\\"fa fa-user-circle\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 5px;\\\" ng-if=\\\"item.Role === 1 && !item.isTeamLeader\\\"></i>\\n <i class=\\\"fa fa-user-plus\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 5px;\\\" ng-if=\\\"item.Role !== 1 && item.isTeamLeader\\\"></i>\\n <i class=\\\"fa fa-user\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 5px;\\\" ng-if=\\\"item.Role !== 1 && !item.isTeamLeader\\\"></i>\\n {{ item.RoleName ? item.RoleName : '-' }}\\n </span>\\n </td>\\n <td>\\n <span ng-if=\\\"item.Id === 1 || ($ctrl.authenticationMethod !== 2 && $ctrl.authenticationMethod !== 3)\\\">Internal</span>\\n <span ng-if=\\\"item.Id !== 1 && $ctrl.authenticationMethod === 2\\\">LDAP</span>\\n <span ng-if=\\\"item.Id !== 1 && $ctrl.authenticationMethod === 3\\\">OAuth</span>\\n </td>\\n </tr>\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"3\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"3\\\" class=\\\"text-center text-muted\\\">No user available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./endpointItem.html');\n\nimport angular from 'angular';\n\nimport EndpointItemController from './endpoint-item-controller';\n\nangular.module('portainer.app').component('endpointItem', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n model: '<',\n onSelect: '<',\n onEdit: '<',\n isAdmin: '<',\n tags: '<',\n endpointInitTime: '<',\n },\n controller: EndpointItemController,\n});\n","var path = 'app/portainer/components/endpoint-list/endpoint-item/endpointItem.html';\nvar html = \"<div class=\\\"blocklist-item\\\" ng-click=\\\"$ctrl.onSelect($ctrl.model)\\\">\\n <div class=\\\"blocklist-item-box\\\">\\n <span ng-class=\\\"['blocklist-item-logo', 'endpoint-item', { azure: $ctrl.model.Type === 3 }]\\\">\\n <i\\n ng-if=\\\"$ctrl.model.Type !== 4 && $ctrl.model.Type !== 5 && $ctrl.model.Type !== 6 && $ctrl.model.Type !== 7\\\"\\n ng-class=\\\"$ctrl.model.Type | endpointtypeicon\\\"\\n class=\\\"fa-4x blue-icon\\\"\\n aria-hidden=\\\"true\\\"\\n ></i>\\n <img ng-if=\\\"$ctrl.model.Type === 4\\\" src=\\\"\" + require(\"@/assets/images/edge_endpoint.png\") + \"\\\" />\\n <img ng-if=\\\"$ctrl.model.Type === 5 || $ctrl.model.Type === 6\\\" src=\\\"\" + require(\"@/assets/images/kubernetes_endpoint.png\") + \"\\\" />\\n <img ng-if=\\\"$ctrl.model.Type === 7\\\" src=\\\"\" + require(\"@/assets/images/kubernetes_edge_endpoint.png\") + \"\\\" />\\n </span>\\n\\n <span class=\\\"col-sm-12\\\">\\n <div class=\\\"blocklist-item-line endpoint-item\\\">\\n <span>\\n <span class=\\\"blocklist-item-title endpoint-item\\\">\\n {{ $ctrl.model.Name }}\\n </span>\\n <span class=\\\"space-left blocklist-item-subtitle\\\">\\n <span ng-if=\\\"$ctrl.isEdgeEndpoint()\\\">\\n <span ng-if=\\\"!$ctrl.model.EdgeID\\\" class=\\\"label label-default\\\"><s>associated</s></span>\\n <span ng-if=\\\"$ctrl.model.EdgeID\\\">\\n <span class=\\\"label\\\" ng-class=\\\"{ 'label-danger': !$ctrl.isCheckInValid, 'label-success': $ctrl.isCheckInValid }\\\">heartbeat</span>\\n <span class=\\\"space-left small text-muted\\\" ng-if=\\\"$ctrl.model.LastCheckInDate\\\">\\n {{ $ctrl.model.LastCheckInDate | getisodatefromtimestamp }}\\n </span>\\n </span>\\n </span>\\n\\n <span ng-if=\\\"!$ctrl.isEdgeEndpoint()\\\">\\n <span class=\\\"label label-{{ $ctrl.model.Status | endpointstatusbadge }}\\\">\\n {{ $ctrl.model.Status === 1 ? 'up' : 'down' }}\\n </span>\\n <span class=\\\"space-left small text-muted\\\" ng-if=\\\"$ctrl.model.Snapshots[0]\\\">\\n {{ $ctrl.model.Snapshots[0].Time | getisodatefromtimestamp }}\\n </span>\\n <span class=\\\"space-left small text-muted\\\" ng-if=\\\"$ctrl.model.Kubernetes.Snapshots[0]\\\">\\n {{ $ctrl.model.Kubernetes.Snapshots[0].Time | getisodatefromtimestamp }}\\n </span>\\n </span>\\n </span>\\n </span>\\n <span>\\n <span class=\\\"small\\\" ng-if=\\\"$ctrl.model.GroupName\\\"> Group: {{ $ctrl.model.GroupName }} </span>\\n <button ng-if=\\\"$ctrl.isAdmin\\\" class=\\\"btn btn-link btn-xs\\\" ng-click=\\\"$ctrl.editEndpoint($event)\\\"><i class=\\\"fa fa-pencil-alt\\\"></i> </button>\\n </span>\\n </div>\\n\\n <div class=\\\"blocklist-item-line endpoint-item\\\" ng-if=\\\"$ctrl.model.Snapshots[0]\\\">\\n <span class=\\\"blocklist-item-desc\\\">\\n <span>\\n <span style=\\\"padding: 0 7px 0 0;\\\">\\n <i class=\\\"fa fa-th-list space-right\\\" aria-hidden=\\\"true\\\"></i>{{ $ctrl.model.Snapshots[0].StackCount }}\\n {{ $ctrl.model.Snapshots[0].StackCount === 1 ? 'stack' : 'stacks' }}\\n </span>\\n <span style=\\\"padding: 0 7px 0 7px;\\\" ng-if=\\\"$ctrl.model.Snapshots[0].Swarm\\\">\\n <i class=\\\"fa fa-list-alt space-right\\\" aria-hidden=\\\"true\\\"></i>{{ $ctrl.model.Snapshots[0].ServiceCount }}\\n {{ $ctrl.model.Snapshots[0].ServiceCount === 1 ? 'service' : 'services' }}\\n </span>\\n <span style=\\\"padding: 0 7px 0 7px;\\\">\\n <i class=\\\"fa fa-cubes space-right\\\" aria-hidden=\\\"true\\\"></i>{{ $ctrl.model.Snapshots[0].RunningContainerCount + $ctrl.model.Snapshots[0].StoppedContainerCount }}\\n {{ $ctrl.model.Snapshots[0].RunningContainerCount + $ctrl.model.Snapshots[0].StoppedContainerCount === 1 ? 'container' : 'containers' }}\\n <span ng-if=\\\"$ctrl.model.Snapshots[0].RunningContainerCount > 0 || $ctrl.model.Snapshots[0].StoppedContainerCount > 0\\\">\\n -\\n <i class=\\\"fa fa-power-off green-icon\\\" aria-hidden=\\\"true\\\"></i> {{ $ctrl.model.Snapshots[0].RunningContainerCount }}\\n <i class=\\\"fa fa-power-off red-icon\\\" aria-hidden=\\\"true\\\"></i> {{ $ctrl.model.Snapshots[0].StoppedContainerCount }}\\n /\\n <i class=\\\"fa fa-heartbeat green-icon\\\" aria-hidden=\\\"true\\\"></i> {{ $ctrl.model.Snapshots[0].HealthyContainerCount }}\\n <i class=\\\"fa fa-heartbeat orange-icon\\\" aria-hidden=\\\"true\\\"></i> {{ $ctrl.model.Snapshots[0].UnhealthyContainerCount }}\\n </span>\\n </span>\\n <span style=\\\"padding: 0 7px 0 7px;\\\">\\n <i class=\\\"fa fa-hdd space-right\\\" aria-hidden=\\\"true\\\"></i>{{ $ctrl.model.Snapshots[0].VolumeCount }}\\n {{ $ctrl.model.Snapshots[0].VolumeCount === 1 ? 'volume' : 'volumes' }}\\n </span>\\n <span style=\\\"padding: 0 7px 0 7px;\\\">\\n <i class=\\\"fa fa-clone space-right\\\" aria-hidden=\\\"true\\\"></i>{{ $ctrl.model.Snapshots[0].ImageCount }}\\n {{ $ctrl.model.Snapshots[0].ImageCount === 1 ? 'image' : 'images' }}\\n </span>\\n </span>\\n </span>\\n <span class=\\\"small text-muted\\\">\\n {{ $ctrl.model.Snapshots[0].Swarm ? 'Swarm' : 'Standalone' }} {{ $ctrl.model.Snapshots[0].DockerVersion }}\\n <span ng-if=\\\"$ctrl.model.Type === 2\\\">+ <i class=\\\"fa fa-bolt\\\" aria-hidden=\\\"true\\\"></i> Agent</span>\\n <span style=\\\"padding: 0 7px 0 0;\\\" ng-if=\\\"$ctrl.model.Snapshots[0].Swarm\\\">\\n <i class=\\\"fa fa-hdd space-left space-right\\\" aria-hidden=\\\"true\\\"></i>{{ $ctrl.model.Snapshots[0].NodeCount }}\\n {{ $ctrl.model.Snapshots[0].NodeCount === 1 ? 'node' : 'nodes' }}\\n </span>\\n </span>\\n </div>\\n\\n <div class=\\\"blocklist-item-line endpoint-item\\\" ng-if=\\\"!$ctrl.model.Snapshots[0] && $ctrl.model.Type !== 5 && $ctrl.model.Type !== 6 && $ctrl.model.Type !== 7\\\">\\n <span class=\\\"blocklist-item-desc\\\">\\n No snapshot available\\n </span>\\n </div>\\n\\n <div class=\\\"blocklist-item-line endpoint-item\\\" ng-if=\\\"$ctrl.model.Kubernetes.Snapshots[0] && ($ctrl.model.Type === 5 || $ctrl.model.Type === 6 || $ctrl.model.Type === 7)\\\">\\n <span class=\\\"blocklist-item-desc\\\">\\n <span>\\n <span style=\\\"padding: 0 7px 0 0;\\\"> <i class=\\\"fa fa-microchip space-right\\\" aria-hidden=\\\"true\\\"></i>{{ $ctrl.model.Kubernetes.Snapshots[0].TotalCPU }} CPU </span>\\n <span style=\\\"padding: 0 7px 0 7px;\\\">\\n <i class=\\\"fa fa-memory space-right\\\" aria-hidden=\\\"true\\\"></i>{{ $ctrl.model.Kubernetes.Snapshots[0].TotalMemory | humansize }} RAM\\n </span>\\n </span>\\n </span>\\n <span class=\\\"small text-muted\\\">\\n Kubernetes {{ $ctrl.model.Kubernetes.Snapshots[0].KubernetesVersion }}\\n <span style=\\\"padding: 0 0 0 7px;\\\">\\n <i class=\\\"fa fa-hdd space-left space-right\\\" aria-hidden=\\\"true\\\"></i>\\n {{ $ctrl.model.Kubernetes.Snapshots[0].NodeCount }} {{ $ctrl.model.Kubernetes.Snapshots[0].NodeCount === 1 ? 'node' : 'nodes' }}\\n </span>\\n </span>\\n </div>\\n\\n <div class=\\\"blocklist-item-line endpoint-item\\\" ng-if=\\\"!$ctrl.model.Kubernetes.Snapshots[0] && ($ctrl.model.Type === 5 || $ctrl.model.Type === 6 || $ctrl.model.Type === 7)\\\">\\n <span class=\\\"blocklist-item-desc\\\">\\n -\\n </span>\\n </div>\\n\\n <div class=\\\"blocklist-item-line endpoint-item\\\">\\n <span class=\\\"small text-muted\\\">\\n <span ng-if=\\\"$ctrl.model.Type === 1 || $ctrl.model.Type === 2 || $ctrl.model.Type === 4\\\">\\n <span class=\\\"small text-muted\\\">\\n <i class=\\\"fa fa-microchip\\\"></i> {{ $ctrl.model.Snapshots[0].TotalCPU }}<i class=\\\"fa fa-memory space-left\\\"></i> {{ $ctrl.model.Snapshots[0].TotalMemory | humansize }}\\n </span>\\n <span class=\\\"space-left space-right\\\">-</span>\\n </span>\\n <span ng-if=\\\"$ctrl.endpointTags.length === 0\\\"> <i class=\\\"fa fa-tags\\\" aria-hidden=\\\"true\\\"></i> No tags </span>\\n <span ng-if=\\\"$ctrl.endpointTags.length > 0\\\">\\n <i class=\\\"fa fa-tags\\\" aria-hidden=\\\"true\\\"></i>\\n {{ $ctrl.endpointTags }}\\n </span>\\n </span>\\n <span class=\\\"small text-muted\\\" ng-if=\\\"$ctrl.model.Type !== 4 && $ctrl.model.Type !== 7\\\">\\n {{ $ctrl.model.URL | stripprotocol }}\\n </span>\\n </div>\\n </span>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","module.exports = __webpack_public_path__ + \"eb45a68ab4c8d154c69396d27d5721be.png\";","module.exports = __webpack_public_path__ + \"5b98afb96054e0fa36a8299869f7f464.png\";","module.exports = __webpack_public_path__ + \"2ab6d77445159e590879381735de9ff1.png\";","import _ from 'lodash-es';\nimport { PortainerEndpointTypes } from '@/portainer/models/endpoint/models';\n\nconst ENDPOINTS_POLLING_INTERVAL = 30000; // in ms\nconst ENDPOINTS_CACHE_SIZE = 100;\n\nangular.module('portainer.app').controller('EndpointListController', [\n 'DatatableService',\n 'PaginationService',\n 'ModalService',\n 'KubernetesConfigService',\n 'Notifications',\n function EndpointListController(DatatableService, PaginationService, ModalService, KubernetesConfigService, Notifications) {\n this.state = {\n totalFilteredEndpoints: null,\n textFilter: '',\n filteredEndpoints: [],\n paginatedItemLimit: '10',\n pageNumber: 1,\n loading: true,\n pollingTimeout: null,\n };\n\n this.onTextFilterChange = function (init = false) {\n this.state.loading = true;\n var filterValue = this.state.textFilter;\n DatatableService.setDataTableTextFilters(this.tableKey, filterValue);\n if (!init && this.hasBackendPagination()) {\n this.paginationChangedAction();\n } else {\n this.state.filteredEndpoints = frontEndpointFilter(this.endpoints, this.tags, filterValue);\n this.state.loading = false;\n if (filterValue) {\n this.state.totalFilteredEndpoints = this.state.filteredEndpoints.length;\n } else {\n this.state.totalFilteredEndpoints = this.endpoints.length;\n }\n }\n };\n\n function frontEndpointFilter(endpoints, tags, filterValue) {\n if (!endpoints || !endpoints.length || !filterValue) {\n return endpoints;\n }\n var keywords = filterValue.split(' ');\n return _.filter(endpoints, function (endpoint) {\n var statusString = convertStatusToString(endpoint.Status);\n return _.every(keywords, function (keyword) {\n var lowerCaseKeyword = keyword.toLowerCase();\n return (\n _.includes(endpoint.Name.toLowerCase(), lowerCaseKeyword) ||\n _.includes(endpoint.GroupName.toLowerCase(), lowerCaseKeyword) ||\n _.includes(endpoint.URL.toLowerCase(), lowerCaseKeyword) ||\n _.some(endpoint.TagIds, (tagId) => {\n const tag = tags.find((t) => t.Id === tagId);\n if (!tag) {\n return false;\n }\n return _.includes(tag.Name.toLowerCase(), lowerCaseKeyword);\n }) ||\n _.includes(statusString, keyword)\n );\n });\n });\n }\n\n this.hasBackendPagination = function () {\n return this.totalCount && this.totalCount > ENDPOINTS_CACHE_SIZE;\n };\n\n this.clearPollTimeout = function () {\n if (this.state.pollingTimeout) {\n clearTimeout(this.state.pollingTimeout);\n this.state.pollingTimeout = 0;\n }\n };\n\n this.$onDestory = function () {\n this.clearPollTimeout();\n };\n\n this.getCurrentPage = async function (start, paginatedItemLimit, textFilter, init = false) {\n try {\n const { totalCount, endpoints } = await this.retrievePage(start, paginatedItemLimit, textFilter);\n if (init) {\n this.totalCount = totalCount;\n this.endpoints = endpoints;\n this.onTextFilterChange(init);\n } else {\n this.state.filteredEndpoints = endpoints;\n this.state.totalFilteredEndpoints = totalCount;\n }\n this.state.loading = false;\n\n const hasOfflineEndpoint = endpoints.some((e) => e.Status !== 1);\n if (hasOfflineEndpoint) {\n this.state.pollingTimeout = setTimeout(() => this.getCurrentPage(start, paginatedItemLimit, textFilter), ENDPOINTS_POLLING_INTERVAL);\n }\n } catch (err) {\n Notifications.error('Failed loading page data', err);\n }\n };\n\n this.paginationChangedAction = async function (init = false) {\n this.clearPollTimeout();\n if (init || this.hasBackendPagination()) {\n this.state.loading = true;\n this.state.filteredEndpoints = [];\n const start = (this.state.pageNumber - 1) * this.state.paginatedItemLimit + 1;\n if (init) {\n await this.getCurrentPage(start, ENDPOINTS_CACHE_SIZE, null, init);\n } else {\n await this.getCurrentPage(start, this.state.paginatedItemLimit, this.state.textFilter);\n }\n }\n };\n\n this.pageChangeHandler = function (newPageNumber) {\n this.state.pageNumber = newPageNumber;\n this.paginationChangedAction();\n };\n\n this.changePaginationLimit = function () {\n PaginationService.setPaginationLimit(this.tableKey, this.state.paginatedItemLimit);\n this.paginationChangedAction();\n };\n\n function convertStatusToString(status) {\n return status === 1 ? 'up' : 'down';\n }\n\n this.showKubeconfigButton = function () {\n if (window.location.protocol !== 'https:') {\n return false;\n }\n return _.some(this.endpoints, (endpoint) => isKubernetesMode(endpoint));\n };\n\n function isKubernetesMode(endpoint) {\n return [\n PortainerEndpointTypes.KubernetesLocalEnvironment,\n PortainerEndpointTypes.AgentOnKubernetesEnvironment,\n PortainerEndpointTypes.EdgeAgentOnKubernetesEnvironment,\n ].includes(endpoint.Type);\n }\n\n this.showKubeconfigModal = async function () {\n const kubeEnvironments = _.filter(this.endpoints, (endpoint) => isKubernetesMode(endpoint));\n const options = kubeEnvironments.map(function (environment) {\n return {\n text: `${environment.Name} (${environment.URL})`,\n value: environment.Id,\n };\n });\n\n let expiryMessage = '';\n try {\n expiryMessage = await KubernetesConfigService.expiryMessage();\n } catch (e) {\n Notifications.error('Failed fetching kubeconfig expiry time', e);\n }\n\n ModalService.confirmKubeconfigSelection(options, expiryMessage, async function (selectedEnvironmentIDs) {\n if (selectedEnvironmentIDs.length === 0) {\n Notifications.warning('No environment was selected');\n return;\n }\n try {\n await KubernetesConfigService.downloadKubeconfigFile(selectedEnvironmentIDs);\n } catch (e) {\n Notifications.error('Failed downloading kubeconfig file', e);\n }\n });\n };\n\n this.$onInit = function () {\n var textFilter = DatatableService.getDataTableTextFilters(this.tableKey);\n this.state.paginatedItemLimit = PaginationService.getPaginationLimit(this.tableKey);\n if (textFilter) {\n this.state.textFilter = textFilter;\n }\n this.paginationChangedAction(true);\n };\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./endpointList.html');\n\nangular.module('portainer.app').component('endpointList', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'EndpointListController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n tags: '<',\n tableKey: '@',\n dashboardAction: '<',\n snapshotAction: '<',\n showSnapshotAction: '<',\n editAction: '<',\n isAdmin: '<',\n retrievePage: '<',\n endpointInitTime: '<',\n },\n});\n","var path = 'app/portainer/components/endpoint-list/endpointList.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n </div>\\n\\n <div class=\\\"actionBar\\\" ng-if=\\\"$ctrl.showSnapshotAction || $ctrl.showKubeconfigButton()\\\">\\n <div style=\\\"margin-bottom: 10px;\\\" ng-if=\\\"$ctrl.endpoints.length\\\">\\n <i class=\\\"fa fa-exclamation-circle blue-icon\\\" style=\\\"margin-right: 5px;\\\"></i>Click on an environment to manage\\n </div>\\n <button type=\\\"button\\\" ng-if=\\\"$ctrl.showSnapshotAction\\\" class=\\\"btn btn-sm btn-primary\\\" ng-click=\\\"$ctrl.snapshotAction()\\\" data-cy=\\\"home-refreshEndpointsButton\\\">\\n <i class=\\\"fa fa-sync space-right\\\" aria-hidden=\\\"true\\\"></i>Refresh\\n </button>\\n <button\\n ng-if=\\\"$ctrl.showKubeconfigButton()\\\"\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-primary\\\"\\n ng-click=\\\"$ctrl.showKubeconfigModal()\\\"\\n analytics-on\\n analytics-category=\\\"kubernetes\\\"\\n analytics-event=\\\"kubernetes-kubectl-kubeconfig-multi\\\"\\n >\\n <i class=\\\"fas fa-download space-right\\\"></i> kubeconfig\\n </button>\\n </div>\\n\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n placeholder=\\\"Search by name, group, tag, status, URL...\\\"\\n auto-focus\\n data-cy=\\\"home-endpointsSearchInput\\\"\\n />\\n </div>\\n\\n <div class=\\\"blocklist\\\" data-cy=\\\"home-endpointList\\\">\\n <endpoint-item\\n ng-if=\\\"$ctrl.hasBackendPagination()\\\"\\n dir-paginate=\\\"endpoint in $ctrl.state.filteredEndpoints | itemsPerPage: $ctrl.state.paginatedItemLimit\\\"\\n model=\\\"endpoint\\\"\\n total-items=\\\"$ctrl.state.totalFilteredEndpoints\\\"\\n on-select=\\\"($ctrl.dashboardAction)\\\"\\n on-edit=\\\"($ctrl.editAction)\\\"\\n is-admin=\\\"$ctrl.isAdmin\\\"\\n tags=\\\"$ctrl.tags\\\"\\n endpoint-init-time=\\\"$ctrl.endpointInitTime\\\"\\n ></endpoint-item>\\n <endpoint-item\\n ng-if=\\\"!$ctrl.hasBackendPagination()\\\"\\n dir-paginate=\\\"endpoint in $ctrl.state.filteredEndpoints | itemsPerPage: $ctrl.state.paginatedItemLimit\\\"\\n model=\\\"endpoint\\\"\\n on-select=\\\"($ctrl.dashboardAction)\\\"\\n on-edit=\\\"($ctrl.editAction)\\\"\\n is-admin=\\\"$ctrl.isAdmin\\\"\\n tags=\\\"$ctrl.tags\\\"\\n endpoint-init-time=\\\"$ctrl.endpointInitTime\\\"\\n ></endpoint-item>\\n <div ng-if=\\\"$ctrl.state.loading\\\" class=\\\"text-center text-muted\\\" data-cy=\\\"home-loadingEndpoints\\\">\\n Loading...\\n </div>\\n <div ng-if=\\\"!$ctrl.state.loading && !$ctrl.state.filteredEndpoints.length\\\" class=\\\"text-center text-muted\\\" data-cy=\\\"home-noEndpoints\\\">\\n No environment available.\\n </div>\\n </div>\\n\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.endpoints\\\">\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"home-paginationSelect\\\">\\n <option value=\\\"0\\\" ng-if=\\\"!$ctrl.hasBackendPagination()\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\" on-page-change=\\\"$ctrl.pageChangeHandler(newPageNumber, oldPageNumber)\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./endpointSelector.html');\n\nangular.module('portainer.app').component('endpointSelector', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'EndpointSelectorController',\n bindings: {\n model: '=',\n endpoints: '<',\n groups: '<',\n },\n});\n","var path = 'app/portainer/components/endpoint-selector/endpointSelector.html';\nvar html = \"<ui-select ng-model=\\\"$ctrl.model\\\">\\n <ui-select-match placeholder=\\\"Select an environment\\\">\\n <span>{{ $select.selected.Name }}</span>\\n </ui-select-match>\\n <ui-select-choices group-by=\\\"$ctrl.groupEndpoints\\\" group-filter=\\\"$ctrl.sortGroups\\\" repeat=\\\"endpoint in ($ctrl.endpoints | filter: $select.search) track by endpoint.Id\\\">\\n <span>{{ endpoint.Name }}</span>\\n </ui-select-choices>\\n</ui-select>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import _ from 'lodash-es';\n\nangular.module('portainer.app').controller('EndpointSelectorController', function () {\n var ctrl = this;\n\n this.sortGroups = function (groups) {\n return _.sortBy(groups, ['name']);\n };\n\n this.groupEndpoints = function (endpoint) {\n for (var i = 0; i < ctrl.availableGroups.length; i++) {\n var group = ctrl.availableGroups[i];\n\n if (endpoint.GroupId === group.Id) {\n return group.Name;\n }\n }\n };\n\n this.$onInit = function () {\n this.availableGroups = filterEmptyGroups(this.groups, this.endpoints);\n };\n\n function filterEmptyGroups(groups, endpoints) {\n return groups.filter(function f(group) {\n for (var i = 0; i < endpoints.length; i++) {\n var endpoint = endpoints[i];\n if (endpoint.GroupId === group.Id) {\n return true;\n }\n }\n return false;\n });\n }\n});\n","const autoNgTemplateLoaderTemplate1 = require('./porEndpointSecurity.html');\n\nangular.module('portainer.app').component('porEndpointSecurity', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'porEndpointSecurityController',\n bindings: {\n // This object will be populated with the form data.\n // Model reference in endpointSecurityModel.js\n formData: '=',\n // The component will use this object to initialize the default values\n // if present.\n endpoint: '<',\n },\n});\n","var path = 'app/portainer/components/endpointSecurity/porEndpointSecurity.html';\nvar html = \"<div>\\n <!-- tls-checkbox -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label for=\\\"tls\\\" class=\\\"control-label text-left\\\">\\n TLS\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"Enable this option if you need to connect to the Docker environment with TLS.\\\"></portainer-tooltip>\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\"> <input type=\\\"checkbox\\\" ng-model=\\\"$ctrl.formData.TLS\\\" /><i></i> </label>\\n </div>\\n </div>\\n <!-- !tls-checkbox -->\\n <div class=\\\"col-sm-12 form-section-title\\\" ng-if=\\\"$ctrl.formData.TLS\\\">\\n TLS mode\\n </div>\\n <!-- note -->\\n <div class=\\\"form-group\\\" ng-if=\\\"$ctrl.formData.TLS\\\">\\n <div class=\\\"col-sm-12\\\">\\n <span class=\\\"small text-muted\\\">\\n You can find out more information about how to protect a Docker environment with TLS in the\\n <a href=\\\"https://docs.docker.com/engine/security/https/\\\" target=\\\"_blank\\\">Docker documentation</a>.\\n </span>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\"></div>\\n <!-- endpoint-tls-mode -->\\n <div class=\\\"form-group\\\" style=\\\"margin-bottom: 0;\\\" ng-if=\\\"$ctrl.formData.TLS\\\">\\n <div class=\\\"boxselector_wrapper\\\">\\n <div>\\n <input type=\\\"radio\\\" id=\\\"tls_client_ca\\\" ng-model=\\\"$ctrl.formData.TLSMode\\\" value=\\\"tls_client_ca\\\" />\\n <label for=\\\"tls_client_ca\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-shield-alt\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n TLS with server and client verification\\n </div>\\n <p>Use client certificates and server verification</p>\\n </label>\\n </div>\\n <div>\\n <input type=\\\"radio\\\" id=\\\"tls_client_noca\\\" ng-model=\\\"$ctrl.formData.TLSMode\\\" value=\\\"tls_client_noca\\\" />\\n <label for=\\\"tls_client_noca\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-shield-alt\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n TLS with client verification only\\n </div>\\n <p>Use client certificates without server verification</p>\\n </label>\\n </div>\\n <div>\\n <input type=\\\"radio\\\" id=\\\"tls_ca\\\" ng-model=\\\"$ctrl.formData.TLSMode\\\" value=\\\"tls_ca\\\" />\\n <label for=\\\"tls_ca\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-shield-alt\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n TLS with server verification only\\n </div>\\n <p>Only verify the server certificate</p>\\n </label>\\n </div>\\n <div>\\n <input type=\\\"radio\\\" id=\\\"tls_only\\\" ng-model=\\\"$ctrl.formData.TLSMode\\\" value=\\\"tls_only\\\" />\\n <label for=\\\"tls_only\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-shield-alt\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n TLS only\\n </div>\\n <p>No server/client verification</p>\\n </label>\\n </div>\\n </div>\\n </div>\\n <!-- !endpoint-tls-mode -->\\n <div class=\\\"col-sm-12 form-section-title\\\" ng-if=\\\"$ctrl.formData.TLS && $ctrl.formData.TLSMode !== 'tls_only'\\\">\\n Required TLS files\\n </div>\\n <!-- tls-file-upload -->\\n <div ng-if=\\\"$ctrl.formData.TLS\\\">\\n <!-- tls-file-ca -->\\n <div class=\\\"form-group\\\" ng-if=\\\"$ctrl.formData.TLSMode === 'tls_client_ca' || $ctrl.formData.TLSMode === 'tls_ca'\\\">\\n <label class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">TLS CA certificate</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ngf-select ng-model=\\\"$ctrl.formData.TLSCACert\\\">Select file</button>\\n <span style=\\\"margin-left: 5px;\\\">\\n {{ $ctrl.formData.TLSCACert.name }}\\n <i class=\\\"fa fa-check green-icon\\\" ng-if=\\\"$ctrl.formData.TLSCACert && $ctrl.formData.TLSCACert === $ctrl.endpoint.TLSConfig.TLSCACert\\\" aria-hidden=\\\"true\\\"></i>\\n <i class=\\\"fa fa-times red-icon\\\" ng-if=\\\"!$ctrl.formData.TLSCACert\\\" aria-hidden=\\\"true\\\"></i>\\n </span>\\n </div>\\n </div>\\n <!-- !tls-file-ca -->\\n <!-- tls-files-cert-key -->\\n <div ng-if=\\\"$ctrl.formData.TLSMode === 'tls_client_ca' || $ctrl.formData.TLSMode === 'tls_client_noca'\\\">\\n <!-- tls-file-cert -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"tls_cert\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">TLS certificate</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ngf-select ng-model=\\\"$ctrl.formData.TLSCert\\\">Select file</button>\\n <span style=\\\"margin-left: 5px;\\\">\\n {{ $ctrl.formData.TLSCert.name }}\\n <i class=\\\"fa fa-check green-icon\\\" ng-if=\\\"$ctrl.formData.TLSCert && $ctrl.formData.TLSCert === $ctrl.endpoint.TLSConfig.TLSCert\\\" aria-hidden=\\\"true\\\"></i>\\n <i class=\\\"fa fa-times red-icon\\\" ng-if=\\\"!$ctrl.formData.TLSCert\\\" aria-hidden=\\\"true\\\"></i>\\n </span>\\n </div>\\n </div>\\n <!-- !tls-file-cert -->\\n <!-- tls-file-key -->\\n <div class=\\\"form-group\\\">\\n <label class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">TLS key</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ngf-select ng-model=\\\"$ctrl.formData.TLSKey\\\">Select file</button>\\n <span style=\\\"margin-left: 5px;\\\">\\n {{ $ctrl.formData.TLSKey.name }}\\n <i class=\\\"fa fa-check green-icon\\\" ng-if=\\\"$ctrl.formData.TLSKey && $ctrl.formData.TLSKey === $ctrl.endpoint.TLSConfig.TLSKey\\\" aria-hidden=\\\"true\\\"></i>\\n <i class=\\\"fa fa-times red-icon\\\" ng-if=\\\"!$ctrl.formData.TLSKey\\\" aria-hidden=\\\"true\\\"></i>\\n </span>\\n </div>\\n </div>\\n <!-- !tls-file-key -->\\n </div>\\n <!-- tls-files-cert-key -->\\n </div>\\n <!-- !tls-file-upload -->\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","angular.module('portainer.app').controller('porEndpointSecurityController', [\n function () {\n var ctrl = this;\n\n this.$onInit = $onInit;\n function $onInit() {\n if (ctrl.endpoint) {\n var endpoint = ctrl.endpoint;\n var TLS = endpoint.TLSConfig.TLS;\n ctrl.formData.TLS = TLS;\n var CACert = endpoint.TLSConfig.TLSCACert;\n ctrl.formData.TLSCACert = CACert;\n var cert = endpoint.TLSConfig.TLSCert;\n ctrl.formData.TLSCert = cert;\n var key = endpoint.TLSConfig.TLSKey;\n ctrl.formData.TLSKey = key;\n\n if (TLS) {\n if (CACert && cert && key) {\n ctrl.formData.TLSMode = 'tls_client_ca';\n } else if (cert && key) {\n ctrl.formData.TLSMode = 'tls_client_noca';\n } else if (CACert) {\n ctrl.formData.TLSMode = 'tls_ca';\n } else {\n ctrl.formData.TLSMode = 'tls_only';\n }\n }\n }\n }\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./environment-variables-simple-mode-item.html');\n\nimport angular from 'angular';\nimport controller from './environment-variables-simple-mode-item.controller.js';\n\nexport const environmentVariablesSimpleModeItem = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n\n bindings: {\n variable: '<',\n index: '<',\n\n onChange: '<',\n onRemove: '<',\n },\n};\n\nangular.module('portainer.app').component('environmentVariablesSimpleModeItem', environmentVariablesSimpleModeItem);\n","var path = 'app/portainer/components/environment-variables-panel/environment-variables-simple-mode/environment-variables-simple-mode-item/environment-variables-simple-mode-item.html';\nvar html = \"<ng-form class=\\\"env-item\\\" name=\\\"$ctrl.{{ $ctrl.formName }}\\\">\\n <div class=\\\"col-sm-5\\\">\\n <div class=\\\"input-group input-group-sm env-item-key w-full\\\">\\n <span class=\\\"input-group-addon\\\">name</span>\\n <input\\n type=\\\"text\\\"\\n name=\\\"name\\\"\\n class=\\\"form-control\\\"\\n placeholder=\\\"e.g. FOO\\\"\\n ng-model=\\\"$ctrl.variable.name\\\"\\n ng-disabled=\\\"$ctrl.variable.added\\\"\\n ng-change=\\\"$ctrl.onChangeName($ctrl.variable.name)\\\"\\n required\\n />\\n </div>\\n <div class=\\\"form-group\\\" style=\\\"margin-top: 5px;\\\" ng-show=\\\"$ctrl[$ctrl.formName].name.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"$ctrl[$ctrl.formName].name.$error\\\">\\n <p ng-message=\\\"required\\\"> <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Name is required. </p>\\n <p ng-message=\\\"pattern\\\">\\n <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i>\\n This field must consist alphanumeric characters, '-' or '_', start with an alphabetic character, and end with an alphanumeric character (e.g. 'my-var', or 'MY_VAR123').\\n </p>\\n </div>\\n </div>\\n </div>\\n </div>\\n <div ng-if=\\\"$ctrl.hasValue()\\\" class=\\\"col-sm-6\\\">\\n <div class=\\\"w-full env-item-value\\\">\\n <div class=\\\"input-group input-group-sm\\\">\\n <span class=\\\"input-group-addon\\\">value</span>\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n ng-model=\\\"$ctrl.variable.value\\\"\\n placeholder=\\\"e.g. bar\\\"\\n ng-trim=\\\"false\\\"\\n name=\\\"value\\\"\\n ng-change=\\\"$ctrl.onChangeValue($ctrl.variable.value)\\\"\\n />\\n </div>\\n <button class=\\\"btn btn-sm btn-primary\\\" type=\\\"button\\\" ng-click=\\\"$ctrl.removeValue()\\\"> <i class=\\\"fa fa-minus\\\" aria-hidden=\\\"true\\\"></i> Remove value </button>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"$ctrl[$ctrl.formName].value.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"$ctrl[$ctrl.formName].value.$error\\\">\\n <p ng-message=\\\"required\\\"> <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Value is required. </p>\\n <p ng-message=\\\"pattern\\\"> <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Value is invalid. </p>\\n </div>\\n </div>\\n </div>\\n </div>\\n <div>\\n <button class=\\\"btn btn-sm btn-primary\\\" type=\\\"button\\\" ng-if=\\\"!$ctrl.hasValue()\\\" ng-click=\\\"$ctrl.onChangeValue('')\\\">\\n <i class=\\\"fa fa-plus\\\" aria-hidden=\\\"true\\\"></i> Add value\\n </button>\\n <button class=\\\"btn btn-sm btn-danger\\\" type=\\\"button\\\" ng-click=\\\"$ctrl.onRemove($ctrl.index)\\\">\\n <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"></i>\\n </button>\\n </div>\\n</ng-form>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/components/environment-variables-panel/environment-variables-simple-mode/environment-variables-simple-mode.html';\nvar html = \"<div class=\\\"environment-variables-simple-mode\\\">\\n <div class=\\\"col-sm-12\\\">\\n <a class=\\\"small interactive\\\" ng-click=\\\"$ctrl.onSwitchModeClick()\\\"> <i class=\\\"fa fa-list-ol space-right\\\" aria-hidden=\\\"true\\\"></i> Advanced mode </a>\\n </div>\\n <div class=\\\"col-sm-12 small text-muted\\\">\\n <i class=\\\"fa fa-info-circle blue-icon space-right\\\" aria-hidden=\\\"true\\\"></i>\\n Switch to advanced mode to copy & paste multiple variables\\n </div>\\n <div class=\\\"col-sm-12 environment-variables-simple-mode--actions\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-default\\\" ng-click=\\\"$ctrl.add()\\\"> <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> Add an environment variable </button>\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-default\\\"\\n ngf-select=\\\"$ctrl.addFromFile($file)\\\"\\n ngf-accept=\\\"'.env'\\\"\\n ngf-pattern=\\\"'.env'\\\"\\n ngf-max-size=\\\"1MB\\\"\\n ngf-model-invalid=\\\"errorFile\\\"\\n >\\n <i class=\\\"fa fa-file-upload\\\" aria-hidden=\\\"true\\\"></i> Load variables from .env file\\n </button>\\n <span class=\\\"space-left\\\" ng-if=\\\"errorFile.$error == 'maxSize'\\\">\\n <i class=\\\"fa fa-times red-icon space-right\\\" aria-hidden=\\\"true\\\"></i>\\n File too large! Try uploading a file smaller than 1MB\\n </span>\\n </div>\\n <div class=\\\"col-sm-12 form-inline env-items-list\\\">\\n <environment-variables-simple-mode-item\\n ng-repeat=\\\"variable in $ctrl.ngModel\\\"\\n variable=\\\"variable\\\"\\n index=\\\"$index\\\"\\n on-change=\\\"($ctrl.onChangeVariable)\\\"\\n on-remove=\\\"($ctrl.remove)\\\"\\n ></environment-variables-simple-mode-item>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/components/environment-variables-panel/environment-variables-panel.html';\nvar html = \"<ng-form class=\\\"form-horizontal environment-variables-panel\\\" name=\\\"$ctrl.envVarsForm\\\">\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\" style=\\\"margin-top: 10px; margin-left: 15px; width: 98%;\\\">\\n Environment variables\\n </div>\\n <div class=\\\"col-sm-12 environment-variables-panel--explanation\\\">\\n {{::$ctrl.explanation}}\\n </div>\\n\\n <environment-variables-simple-mode\\n ng-if=\\\"$ctrl.mode == 'simple'\\\"\\n ng-model=\\\"$ctrl.ngModel\\\"\\n on-change=\\\"($ctrl.handleSimpleChange)\\\"\\n on-switch-mode-click=\\\"($ctrl.switchEnvMode)\\\"\\n ></environment-variables-simple-mode>\\n\\n <div ng-if=\\\"$ctrl.mode == 'advanced'\\\" class=\\\"environment-variables-panel--advanced\\\">\\n <div class=\\\"col-sm-12\\\">\\n <a class=\\\"small interactive\\\" ng-click=\\\"$ctrl.switchEnvMode()\\\"> <i class=\\\"fa fa-list-ol space-right\\\" aria-hidden=\\\"true\\\"></i> Simple mode </a>\\n </div>\\n <div class=\\\"col-sm-12 small text-muted\\\">\\n <i class=\\\"fa fa-info-circle blue-icon space-right\\\" aria-hidden=\\\"true\\\"></i>\\n Switch to simple mode to define variables line by line, or load from .env file\\n </div>\\n <div class=\\\"form-group\\\" style=\\\"margin-left: 1px;\\\">\\n <code-editor identifier=\\\"environment-variables-editor\\\" placeholder=\\\"e.g. key=value\\\" value=\\\"$ctrl.editorText\\\" yml=\\\"false\\\" on-change=\\\"($ctrl.editorUpdate)\\\"></code-editor>\\n </div>\\n </div>\\n </div>\\n</ng-form>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import angular from 'angular';\n// ng-focus-if pkg from: https://github.com/hiebj/ng-focus-if\nangular.module('portainer.app').directive('focusIf', function ($timeout) {\n return {\n restrict: 'A',\n link: function ($scope, $element, $attrs) {\n var dom = $element[0];\n if ($attrs.focusIf) {\n $scope.$watch($attrs.focusIf, focus);\n } else {\n focus(true);\n }\n function focus(condition) {\n if (condition) {\n $timeout(function () {\n dom.focus();\n }, $scope.$eval($attrs.focusDelay) || 0);\n }\n }\n },\n };\n});\n","const autoNgTemplateLoaderTemplate1 = require('./groupForm.html');\n\nimport angular from 'angular';\nimport GroupFormController from './groupFormController';\n\nangular.module('portainer.app').component('groupForm', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: GroupFormController,\n bindings: {\n loaded: '<',\n pageType: '@',\n model: '=',\n availableEndpoints: '=',\n availableTags: '<',\n associatedEndpoints: '=',\n addLabelAction: '<',\n removeLabelAction: '<',\n formAction: '<',\n formActionLabel: '@',\n actionInProgress: '<',\n onCreateTag: '<',\n },\n});\n","var path = 'app/portainer/components/forms/group-form/groupForm.html';\nvar html = \"<form class=\\\"form-horizontal\\\" name=\\\"endpointGroupForm\\\">\\n <!-- name-input -->\\n <div class=\\\"form-group\\\" ng-class=\\\"{ 'has-error': endpointGroupForm.group_name.$invalid }\\\">\\n <label for=\\\"group_name\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Name</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" name=\\\"group_name\\\" ng-model=\\\"$ctrl.model.Name\\\" placeholder=\\\"e.g. my-group\\\" required auto-focus />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"endpointGroupForm.group_name.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"endpointGroupForm.group_name.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !name-input -->\\n <!-- description-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"group_description\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Description</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"group_description\\\" ng-model=\\\"$ctrl.model.Description\\\" placeholder=\\\"e.g. production environments...\\\" />\\n </div>\\n </div>\\n <!-- !description-input -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Metadata\\n </div>\\n <!-- tags -->\\n <div class=\\\"form-group\\\">\\n <tag-selector\\n ng-if=\\\"$ctrl.model && $ctrl.availableTags\\\"\\n tags=\\\"$ctrl.availableTags\\\"\\n model=\\\"$ctrl.model.TagIds\\\"\\n allow-create=\\\"$ctrl.state.allowCreateTag\\\"\\n on-create=\\\"($ctrl.onCreateTag)\\\"\\n ></tag-selector>\\n </div>\\n <!-- !tags -->\\n <!-- environments -->\\n <div ng-if=\\\"$ctrl.model.Id !== 1\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Associated environments\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12 small text-muted\\\">\\n You can select which environment should be part of this group by moving them to the associated environments table. Simply click on any environment entry to move it from one\\n table to the other.\\n </div>\\n <div class=\\\"col-sm-12\\\" style=\\\"margin-top: 20px;\\\">\\n <!-- available-endpoints -->\\n <div class=\\\"col-sm-6\\\">\\n <div class=\\\"text-center small text-muted\\\">Available environments</div>\\n <div style=\\\"margin-top: 10px;\\\">\\n <group-association-table\\n loaded=\\\"$ctrl.loaded\\\"\\n page-type=\\\"$ctrl.pageType\\\"\\n table-type=\\\"available\\\"\\n retrieve-page=\\\"$ctrl.getPaginatedEndpointsByGroup\\\"\\n dataset=\\\"$ctrl.availableEndpoints\\\"\\n entry-click=\\\"$ctrl.associateEndpoint\\\"\\n pagination-state=\\\"$ctrl.state.available\\\"\\n empty-dataset-message=\\\"No environment available\\\"\\n ></group-association-table>\\n </div>\\n </div>\\n <!-- !available-endpoints -->\\n <!-- associated-endpoints -->\\n <div class=\\\"col-sm-6\\\">\\n <div class=\\\"text-center small text-muted\\\">Associated environments</div>\\n <div style=\\\"margin-top: 10px;\\\">\\n <group-association-table\\n loaded=\\\"$ctrl.loaded\\\"\\n page-type=\\\"$ctrl.pageType\\\"\\n table-type=\\\"associated\\\"\\n retrieve-page=\\\"$ctrl.getPaginatedEndpointsByGroup\\\"\\n dataset=\\\"$ctrl.associatedEndpoints\\\"\\n entry-click=\\\"$ctrl.dissociateEndpoint\\\"\\n pagination-state=\\\"$ctrl.state.associated\\\"\\n empty-dataset-message=\\\"No associated environment\\\"\\n has-backend-pagination=\\\"this.pageType !== 'create'\\\"\\n ></group-association-table>\\n </div>\\n </div>\\n <!-- !associated-endpoints -->\\n </div>\\n </div>\\n </div>\\n <div ng-if=\\\"$ctrl.model.Id === 1\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Unassociated environments\\n </div>\\n <div style=\\\"margin-top: 10px;\\\">\\n <group-association-table\\n loaded=\\\"$ctrl.loaded\\\"\\n page-type=\\\"$ctrl.pageType\\\"\\n table-type=\\\"associated\\\"\\n retrieve-page=\\\"$ctrl.getPaginatedEndpointsByGroup\\\"\\n dataset=\\\"$ctrl.associatedEndpoints\\\"\\n pagination-state=\\\"$ctrl.state.associated\\\"\\n empty-dataset-message=\\\"No environment available\\\"\\n ></group-association-table>\\n </div>\\n </div>\\n <!-- !endpoints -->\\n <!-- actions -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-click=\\\"$ctrl.formAction()\\\"\\n ng-disabled=\\\"$ctrl.actionInProgress || !endpointGroupForm.$valid\\\"\\n button-spinner=\\\"$ctrl.actionInProgress\\\"\\n >\\n <span ng-hide=\\\"$ctrl.actionInProgress\\\">{{ $ctrl.formActionLabel }}</span>\\n <span ng-show=\\\"$ctrl.actionInProgress\\\">In progress...</span>\\n </button>\\n </div>\\n </div>\\n <!-- !actions -->\\n</form>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./kubernetes-app-git-form.html');\n\nimport angular from 'angular';\nimport controller from './kubernetes-app-git-form.controller';\n\nconst kubernetesAppGitForm = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n namespace: '<',\n stack: '<',\n },\n};\n\nangular.module('portainer.app').component('kubernetesAppGitForm', kubernetesAppGitForm);\n","var path = 'app/portainer/components/forms/kubernetes-app-git-form/kubernetes-app-git-form.html';\nvar html = \"<form name=\\\"$ctrl.redeployGitForm\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Redeploy from git repository\\n </div>\\n <div class=\\\"form-group text-muted\\\">\\n <div class=\\\"col-sm-12\\\">\\n <p>\\n Pull the latest manifest from git and redeploy the application.\\n </p>\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <p>\\n <a class=\\\"small interactive\\\" ng-click=\\\"$ctrl.state.showConfig = !$ctrl.state.showConfig\\\">\\n <i ng-class=\\\"['fa space-right', { 'fa-minus': $ctrl.state.showConfig, 'fa-plus': !$ctrl.state.showConfig }]\\\" aria-hidden=\\\"true\\\"></i>\\n {{ $ctrl.state.showConfig ? 'Hide' : 'Advanced' }} configuration\\n </a>\\n </p>\\n </div>\\n </div>\\n <git-form-ref-field ng-if=\\\"$ctrl.state.showConfig\\\" value=\\\"$ctrl.formValues.RefName\\\" on-change=\\\"($ctrl.onChangeRef)\\\"></git-form-ref-field>\\n <git-form-auth-fieldset\\n ng-if=\\\"$ctrl.state.showConfig\\\"\\n model=\\\"$ctrl.formValues\\\"\\n is-edit=\\\"$ctrl.state.isEdit\\\"\\n on-change=\\\"($ctrl.onChange)\\\"\\n show-auth-explanation=\\\"true\\\"\\n ></git-form-auth-fieldset>\\n\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <!-- #Git buttons -->\\n <button\\n class=\\\"btn btn-sm btn-primary\\\"\\n ng-click=\\\"$ctrl.pullAndRedeployApplication()\\\"\\n ng-disabled=\\\"$ctrl.isSubmitButtonDisabled() || !$ctrl.redeployGitForm.$valid\\\"\\n style=\\\"margin-top: 7px; margin-left: 0;\\\"\\n button-spinner=\\\"ctrl.state.redeployInProgress\\\"\\n analytics-on\\n analytics-category=\\\"kubernetes\\\"\\n analytics-event=\\\"kubernetes-application-edit-git-pull\\\"\\n >\\n <span ng-show=\\\"!$ctrl.state.redeployInProgress\\\"> <i class=\\\"fa fa-sync space-right\\\" aria-hidden=\\\"true\\\"></i> Pull and update application </span>\\n <span ng-show=\\\"$ctrl.state.redeployInProgress\\\">In progress...</span>\\n </button>\\n <button\\n class=\\\"btn btn-sm btn-primary\\\"\\n ng-click=\\\"$ctrl.saveGitSettings()\\\"\\n ng-disabled=\\\"$ctrl.isSubmitButtonDisabled() || !$ctrl.redeployGitForm.$valid\\\"\\n style=\\\"margin-top: 7px; margin-left: 0;\\\"\\n button-spinner=\\\"$ctrl.state.saveGitSettingsInProgress\\\"\\n >\\n <span ng-show=\\\"!$ctrl.state.saveGitSettingsInProgress\\\"> Save settings </span>\\n <span ng-show=\\\"$ctrl.state.saveGitSettingsInProgress\\\">In progress...</span>\\n </button>\\n</form>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./kubernetes-redeploy-app-git-form.html');\n\nimport angular from 'angular';\nimport controller from './kubernetes-redeploy-app-git-form.controller';\n\nconst kubernetesRedeployAppGitForm = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n stack: '<',\n namespace: '<',\n },\n};\n\nangular.module('portainer.app').component('kubernetesRedeployAppGitForm', kubernetesRedeployAppGitForm);\n","var path = 'app/portainer/components/forms/kubernetes-redeploy-app-git-form/kubernetes-redeploy-app-git-form.html';\nvar html = \"<form name=\\\"$ctrl.redeployGitForm\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Redeploy from git repository\\n </div>\\n <div class=\\\"form-group text-muted\\\">\\n <div class=\\\"col-sm-12\\\">\\n <p>\\n Pull the latest manifest from git and redeploy the application.\\n </p>\\n </div>\\n </div>\\n <git-form-auto-update-fieldset model=\\\"$ctrl.formValues.AutoUpdate\\\" on-change=\\\"($ctrl.onChangeAutoUpdate)\\\"></git-form-auto-update-fieldset>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <p>\\n <a class=\\\"small interactive\\\" ng-click=\\\"$ctrl.state.showConfig = !$ctrl.state.showConfig\\\">\\n <i ng-class=\\\"['fa space-right', { 'fa-minus': $ctrl.state.showConfig, 'fa-plus': !$ctrl.state.showConfig }]\\\" aria-hidden=\\\"true\\\"></i>\\n {{ $ctrl.state.showConfig ? 'Hide' : 'Advanced' }} configuration\\n </a>\\n </p>\\n </div>\\n </div>\\n <git-form-ref-field ng-if=\\\"$ctrl.state.showConfig\\\" value=\\\"$ctrl.formValues.RefName\\\" on-change=\\\"($ctrl.onChangeRef)\\\"></git-form-ref-field>\\n <git-form-auth-fieldset\\n ng-if=\\\"$ctrl.state.showConfig\\\"\\n model=\\\"$ctrl.formValues\\\"\\n is-edit=\\\"$ctrl.state.isEdit\\\"\\n on-change=\\\"($ctrl.onChange)\\\"\\n show-auth-explanation=\\\"true\\\"\\n ></git-form-auth-fieldset>\\n\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <!-- #Git buttons -->\\n <button\\n class=\\\"btn btn-sm btn-primary\\\"\\n ng-click=\\\"$ctrl.pullAndRedeployApplication()\\\"\\n ng-disabled=\\\"$ctrl.isSubmitButtonDisabled() || $ctrl.state.hasUnsavedChanges|| !$ctrl.redeployGitForm.$valid\\\"\\n style=\\\"margin-top: 7px; margin-left: 0;\\\"\\n button-spinner=\\\"$ctrl.state.redeployInProgress\\\"\\n analytics-on\\n analytics-category=\\\"kubernetes\\\"\\n analytics-event=\\\"kubernetes-application-edit-git-pull\\\"\\n >\\n <span ng-show=\\\"!$ctrl.state.redeployInProgress\\\"> <i class=\\\"fa fa-sync space-right\\\" aria-hidden=\\\"true\\\"></i> Pull and update application </span>\\n <span ng-show=\\\"$ctrl.state.redeployInProgress\\\">In progress...</span>\\n </button>\\n <button\\n class=\\\"btn btn-sm btn-primary\\\"\\n ng-click=\\\"$ctrl.saveGitSettings()\\\"\\n ng-disabled=\\\"$ctrl.isSubmitButtonDisabled() || !$ctrl.state.hasUnsavedChanges|| !$ctrl.redeployGitForm.$valid\\\"\\n style=\\\"margin-top: 7px; margin-left: 0;\\\"\\n button-spinner=\\\"$ctrl.state.saveGitSettingsInProgress\\\"\\n analytics-on\\n analytics-category=\\\"kubernetes\\\"\\n analytics-event=\\\"kubernetes-application-edit\\\"\\n analytics-properties=\\\"$ctrl.buildAnalyticsProperties()\\\"\\n >\\n <span ng-show=\\\"!$ctrl.state.saveGitSettingsInProgress\\\"> Save settings </span>\\n <span ng-show=\\\"$ctrl.state.saveGitSettingsInProgress\\\">In progress...</span>\\n </button>\\n</form>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./por-switch-field.html');\n\nimport angular from 'angular';\n\nexport const porSwitchField = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n tooltip: '@',\n ngModel: '=',\n label: '@',\n name: '@',\n labelClass: '@',\n ngDataCy: '@',\n disabled: '<',\n onChange: '<',\n feature: '<', // feature id\n },\n};\n\nangular.module('portainer.app').component('porSwitchField', porSwitchField);\n","var path = 'app/portainer/components/forms/por-switch-field/por-switch-field.html';\nvar html = \"<label style=\\\"display: flex; align-items: center; margin: 0;\\\">\\n <span for=\\\"toggle_{{::$ctrl.name}}\\\" class=\\\"control-label text-left space-right\\\" ng-class=\\\"$ctrl.labelClass\\\" style=\\\"padding: 0;\\\">\\n {{::$ctrl.label}}\\n <portainer-tooltip ng-if=\\\"$ctrl.tooltip\\\" position=\\\"bottom\\\" message=\\\"{{::$ctrl.tooltip}}\\\"></portainer-tooltip>\\n </span>\\n <por-switch\\n class-name=\\\"space-right\\\"\\n name=\\\"toggle_{{::$ctrl.name}}\\\"\\n id=\\\"toggle_{{::$ctrl.name}}\\\"\\n ng-model=\\\"$ctrl.ngModel\\\"\\n disabled=\\\"$ctrl.disabled\\\"\\n on-change=\\\"($ctrl.onChange)\\\"\\n feature=\\\"$ctrl.feature\\\"\\n ng-data-cy=\\\"{{::$ctrl.ngDataCy}}\\\"\\n ></por-switch>\\n</label>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/components/forms/por-switch/por-switch.html';\nvar html = \"<label class=\\\"switch\\\" ng-class=\\\"[$ctrl.className, { business: $ctrl.limitedToBE, limited: $ctrl.limitedToBE }]\\\" style=\\\"margin-bottom: 0;\\\">\\n <input\\n type=\\\"checkbox\\\"\\n name=\\\"{{::$ctrl.name}}\\\"\\n id=\\\"{{::$ctrl.id}}\\\"\\n ng-model=\\\"$ctrl.ngModel\\\"\\n ng-disabled=\\\"$ctrl.disabled || $ctrl.limitedToBE\\\"\\n ng-change=\\\"$ctrl.onChange($ctrl.ngModel)\\\"\\n />\\n <i data-cy=\\\"{{::$ctrl.ngDataCy}}\\\"></i>\\n</label>\\n<be-feature-indicator ng-if=\\\"$ctrl.limitedToBE\\\" feature=\\\"$ctrl.feature\\\"></be-feature-indicator>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./registry-form-ecr.html');\n\nangular.module('portainer.app').component('registryFormEcr', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n model: '=',\n formAction: '<',\n formActionLabel: '@',\n actionInProgress: '<',\n },\n});\n","var path = 'app/portainer/components/forms/registry-form-aws-ecr/registry-form-ecr.html';\nvar html = \"<form class=\\\"form-horizontal\\\" name=\\\"registryFormEcr\\\" ng-submit=\\\"$ctrl.formAction()\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Important notice\\n </div>\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n For information on how to generate an Access Key, follow the\\n <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html#id_users_create_console\\\" target=\\\"_blank\\\">AWS guide</a>.\\n </span>\\n </div>\\n\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n ECR connection details\\n </div>\\n\\n <!-- name-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"registry_name\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Name</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"registry_name\\\" name=\\\"registry_name\\\" ng-model=\\\"$ctrl.model.Name\\\" placeholder=\\\"my-ecr-registry\\\" required auto-focus />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"registryFormEcr.registry_name.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"registryFormEcr.registry_name.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !name-input -->\\n\\n <!-- url-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"registry_url\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Registry URL\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"URL of an Amazon Elastic Container Registry, which contains an account id and region.\\\"></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n id=\\\"registry_url\\\"\\n name=\\\"registry_url\\\"\\n ng-model=\\\"$ctrl.model.URL\\\"\\n placeholder=\\\"aws-account-id.dkr.ecr.us-east-1.amazonaws.com/\\\"\\n required\\n />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"registryFormEcr.registry_url.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"registryFormEcr.registry_url.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- url-input -->\\n\\n <!-- authentication-checkbox -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label class=\\\"control-label text-left\\\">\\n Authentication\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"Enable this option if you need to specify credentials to connect to a private registry.\\\"></portainer-tooltip>\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\"> <input type=\\\"checkbox\\\" ng-model=\\\"$ctrl.model.Authentication\\\" /><i></i> </label>\\n </div>\\n </div>\\n <!-- !authentication-checkbox -->\\n\\n <div ng-if=\\\"$ctrl.model.Authentication\\\">\\n <!-- aws-access-key -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"registry_access_key\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">AWS Access Key</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"registry_access_key\\\" name=\\\"registry_access_key\\\" ng-model=\\\"$ctrl.model.Username\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"registryFormEcr.registry_access_key.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"registryFormEcr.registry_access_key.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !aws-access-key -->\\n\\n <!-- aws-secret-access-key -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"registry_secret_access_key\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">AWS Secret Access Key</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"password\\\" class=\\\"form-control\\\" id=\\\"registry_secret_access_key\\\" name=\\\"registry_secret_access_key\\\" ng-model=\\\"$ctrl.model.Password\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"registryFormEcr.registry_secret_access_key.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"registryFormEcr.registry_secret_access_key.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !aws-secret-access-key -->\\n\\n <!-- region -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"registry_region\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Region</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"registry_region\\\" name=\\\"registry_region\\\" placeholder=\\\"us-west-1\\\" ng-model=\\\"$ctrl.model.Ecr.Region\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"registryFormEcr.registry_region.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"registryFormEcr.registry_region.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !region -->\\n </div>\\n\\n <!-- actions -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"submit\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"$ctrl.actionInProgress || !registryFormEcr.$valid\\\"\\n button-spinner=\\\"$ctrl.actionInProgress\\\"\\n analytics-on\\n analytics-category=\\\"portainer\\\"\\n analytics-event=\\\"portainer-registry-creation\\\"\\n analytics-properties=\\\"{ metadata: { type: 'ecr' } }\\\"\\n >\\n <span ng-hide=\\\"$ctrl.actionInProgress\\\">{{ $ctrl.formActionLabel }}</span>\\n <span ng-show=\\\"$ctrl.actionInProgress\\\">In progress...</span>\\n </button>\\n </div>\\n </div>\\n <!-- !actions -->\\n</form>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./registry-form-azure.html');\n\nangular.module('portainer.app').component('registryFormAzure', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n model: '=',\n formAction: '<',\n formActionLabel: '@',\n actionInProgress: '<',\n },\n});\n","var path = 'app/portainer/components/forms/registry-form-azure/registry-form-azure.html';\nvar html = \"<form class=\\\"form-horizontal\\\" name=\\\"registryFormAzure\\\" ng-submit=\\\"$ctrl.formAction()\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Azure registry details\\n </div>\\n <!-- name-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"registry_name\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Name</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"registry_name\\\" name=\\\"registry_name\\\" ng-model=\\\"$ctrl.model.Name\\\" placeholder=\\\"my-azure-registry\\\" required auto-focus />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"registryFormAzure.registry_name.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"registryFormAzure.registry_name.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !name-input -->\\n <!-- url-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"registry_url\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Registry URL\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"URL of an Azure Container Registry. Any protocol will be stripped.\\\"></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"registry_url\\\" name=\\\"registry_url\\\" ng-model=\\\"$ctrl.model.URL\\\" placeholder=\\\"myproject.azurecr.io\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"registryFormAzure.registry_url.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"registryFormAzure.registry_url.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- url-input -->\\n <!-- credentials-user -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"registry_username\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Username</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"registry_username\\\" name=\\\"registry_username\\\" ng-model=\\\"$ctrl.model.Username\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"registryFormAzure.registry_username.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"registryFormAzure.registry_username.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !credentials-user -->\\n <!-- credentials-password -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"registry_password\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Password</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"password\\\" class=\\\"form-control\\\" id=\\\"registry_password\\\" name=\\\"registry_password\\\" ng-model=\\\"$ctrl.model.Password\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"registryFormAzure.registry_password.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"registryFormAzure.registry_password.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !credentials-password -->\\n <!-- actions -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"submit\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"$ctrl.actionInProgress || !registryFormAzure.$valid\\\"\\n button-spinner=\\\"$ctrl.actionInProgress\\\"\\n analytics-on\\n analytics-category=\\\"portainer\\\"\\n analytics-event=\\\"portainer-registry-creation\\\"\\n analytics-properties=\\\"{ metadata: { type: 'azure' } }\\\"\\n >\\n <span ng-hide=\\\"$ctrl.actionInProgress\\\">{{ $ctrl.formActionLabel }}</span>\\n <span ng-show=\\\"$ctrl.actionInProgress\\\">In progress...</span>\\n </button>\\n </div>\\n </div>\\n <!-- !actions -->\\n</form>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./registry-form-custom.html');\n\nangular.module('portainer.app').component('registryFormCustom', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n model: '=',\n formAction: '<',\n formActionLabel: '@',\n actionInProgress: '<',\n },\n});\n","var path = 'app/portainer/components/forms/registry-form-custom/registry-form-custom.html';\nvar html = \"<form class=\\\"form-horizontal\\\" name=\\\"registryFormCustom\\\" ng-submit=\\\"$ctrl.formAction()\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Important notice\\n </div>\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n Docker requires you to connect to a <a href=\\\"https://docs.docker.com/registry/deploying/#running-a-domain-registry\\\" target=\\\"_blank\\\">secure registry</a>. You can find more\\n information about how to connect to an insecure registry <a href=\\\"https://docs.docker.com/registry/insecure/\\\" target=\\\"_blank\\\">in the Docker documentation</a>.\\n </span>\\n </div>\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Custom registry details\\n </div>\\n <!-- name-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"registry_name\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Name</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"registry_name\\\" name=\\\"registry_name\\\" ng-model=\\\"$ctrl.model.Name\\\" placeholder=\\\"my-custom-registry\\\" required auto-focus />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"registryFormCustom.registry_name.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"registryFormCustom.registry_name.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !name-input -->\\n <!-- url-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"registry_url\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Registry URL\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"URL or IP address of a Docker registry. Any protocol and trailing slash will be stripped if present.\\\"></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"registry_url\\\" name=\\\"registry_url\\\" ng-model=\\\"$ctrl.model.URL\\\" placeholder=\\\"10.0.0.10:5000 or myregistry.domain.tld\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"registryFormCustom.registry_url.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"registryFormCustom.registry_url.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- url-input -->\\n <!-- authentication-checkbox -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label for=\\\"registry_auth\\\" class=\\\"control-label text-left\\\">\\n Authentication\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"Enable this option if you need to specify credentials to connect to this registry.\\\"></portainer-tooltip>\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\"> <input type=\\\"checkbox\\\" ng-model=\\\"$ctrl.model.Authentication\\\" /><i></i> </label>\\n </div>\\n </div>\\n <!-- !authentication-checkbox -->\\n <div ng-if=\\\"$ctrl.model.Authentication\\\">\\n <!-- credentials-user -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"registry_username\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Username</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"registry_username\\\" name=\\\"registry_username\\\" ng-model=\\\"$ctrl.model.Username\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"registryFormCustom.registry_username.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"registryFormCustom.registry_username.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !credentials-user -->\\n <!-- credentials-password -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"registry_password\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Password</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"password\\\" class=\\\"form-control\\\" id=\\\"registry_password\\\" name=\\\"registry_password\\\" ng-model=\\\"$ctrl.model.Password\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"registryFormCustom.registry_password.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"registryFormCustom.registry_password.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !credentials-password -->\\n </div>\\n <!-- actions -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"submit\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"$ctrl.actionInProgress || !registryFormCustom.$valid\\\"\\n button-spinner=\\\"$ctrl.actionInProgress\\\"\\n analytics-on\\n analytics-category=\\\"portainer\\\"\\n analytics-event=\\\"portainer-registry-creation\\\"\\n analytics-properties=\\\"{ metadata: { type: 'custom' }}\\\"\\n >\\n <span ng-hide=\\\"$ctrl.actionInProgress\\\">{{ $ctrl.formActionLabel }}</span>\\n <span ng-show=\\\"$ctrl.actionInProgress\\\">In progress...</span>\\n </button>\\n </div>\\n </div>\\n <!-- !actions -->\\n</form>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./registry-form-dockerhub.html');\n\nangular.module('portainer.app').component('registryFormDockerhub', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n model: '=',\n formAction: '<',\n formActionLabel: '@',\n actionInProgress: '<',\n },\n});\n","var path = 'app/portainer/components/forms/registry-form-dockerhub/registry-form-dockerhub.html';\nvar html = \"<form class=\\\"form-horizontal\\\" name=\\\"registryFormDockerhub\\\" ng-submit=\\\"$ctrl.formAction()\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n DockerHub account details\\n </div>\\n <!-- name-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"registry_name\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Name</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"registry_name\\\" name=\\\"registry_name\\\" ng-model=\\\"$ctrl.model.Name\\\" placeholder=\\\"dockerhub-prod-us\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"registryFormDockerhub.registry_name.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"registryFormDockerhub.registry_name.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !name-input -->\\n <!-- credentials-user -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"registry_username\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">DockerHub username</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"registry_username\\\" name=\\\"registry_username\\\" ng-model=\\\"$ctrl.model.Username\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"registryFormDockerhub.registry_username.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"registryFormDockerhub.registry_username.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !credentials-user -->\\n <!-- credentials-password -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"registry_password\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">DockerHub password</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"password\\\" class=\\\"form-control\\\" id=\\\"registry_password\\\" name=\\\"registry_password\\\" ng-model=\\\"$ctrl.model.Password\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"registryFormDockerhub.registry_password.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"registryFormDockerhub.registry_password.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !credentials-password -->\\n\\n <!-- actions -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"submit\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"$ctrl.actionInProgress || !registryFormDockerhub.$valid\\\"\\n button-spinner=\\\"$ctrl.actionInProgress\\\"\\n analytics-on\\n analytics-category=\\\"portainer\\\"\\n analytics-event=\\\"portainer-registry-creation\\\"\\n analytics-properties=\\\"{ metadata: { type: 'dockerhub' } }\\\"\\n >\\n <span ng-hide=\\\"$ctrl.actionInProgress\\\">{{ $ctrl.formActionLabel }}</span>\\n <span ng-show=\\\"$ctrl.actionInProgress\\\">In progress...</span>\\n </button>\\n </div>\\n </div>\\n <!-- !actions -->\\n</form>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./gitlabProjectsDatatable.html');\n\nangular.module('portainer.app').component('gitlabProjectsDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'GitlabProjectsDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n state: '=',\n },\n});\n","var path = 'app/portainer/components/forms/registry-form-gitlab/gitlab-projects-datatable/gitlabProjectsDatatable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n </div>\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input type=\\\"text\\\" class=\\\"searchInput\\\" ng-model=\\\"$ctrl.state.textFilter\\\" ng-change=\\\"$ctrl.onTextFilterChange()\\\" placeholder=\\\"Search...\\\" auto-focus />\\n </div>\\n <div class=\\\"table-responsive\\\">\\n <table class=\\\"table table-hover nowrap-cells\\\">\\n <thead>\\n <tr>\\n <th>\\n <span class=\\\"md-checkbox\\\">\\n <input id=\\\"select_all\\\" type=\\\"checkbox\\\" ng-model=\\\"$ctrl.state.selectAll\\\" ng-change=\\\"$ctrl.selectAll()\\\" />\\n <label for=\\\"select_all\\\"></label>\\n </span>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Namespace')\\\">\\n Namespace\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Namespace' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Namespace' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('Name')\\\">\\n Name\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>\\n <a ng-click=\\\"$ctrl.changeOrderBy('PathWithNamespace')\\\">\\n Path with namespace\\n <i class=\\\"fa fa-sort-alpha-down\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'PathWithNamespace' && !$ctrl.state.reverseOrder\\\"></i>\\n <i class=\\\"fa fa-sort-alpha-up\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.state.orderBy === 'PathWithNamespace' && $ctrl.state.reverseOrder\\\"></i>\\n </a>\\n </th>\\n <th>Description</th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n dir-paginate=\\\"item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit))\\\"\\n ng-class=\\\"{ active: item.Checked }\\\"\\n >\\n <td>\\n <span class=\\\"md-checkbox\\\">\\n <input id=\\\"select_{{ $index }}\\\" type=\\\"checkbox\\\" ng-model=\\\"item.Checked\\\" ng-click=\\\"$ctrl.selectItem(item, $event)\\\" ng-disabled=\\\"$ctrl.disableSelection(item)\\\" />\\n <label for=\\\"select_{{ $index }}\\\"></label>\\n </span>\\n {{ item.Namespace }}\\n </td>\\n <td>\\n {{ item.Name }}\\n </td>\\n <td>\\n {{ item.PathWithNamespace }}\\n </td>\\n <td>\\n {{ item.Description }}\\n </td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.state.filteredDataSet.length === 0\\\">\\n <td colspan=\\\"3\\\" class=\\\"text-center text-muted\\\">No projects available.</td>\\n </tr>\\n </tbody>\\n </table>\\n </div>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"infoBar\\\" ng-if=\\\"$ctrl.state.selectedItemCount !== 0\\\"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.state.paginatedItemLimit\\\" ng-change=\\\"$ctrl.changePaginationLimit()\\\" data-cy=\\\"component-paginationSelect\\\">\\n <option value=\\\"0\\\">All</option>\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls max-size=\\\"5\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","angular.module('portainer.app').controller('GitlabProjectsDatatableController', [\n '$scope',\n '$controller',\n 'DatatableService',\n function ($scope, $controller, DatatableService) {\n angular.extend(this, $controller('GenericDatatableController', { $scope: $scope }));\n\n this.disableSelection = function (item) {\n return !this.allowSelection(item);\n };\n\n // based on RegistryGitlabProject model\n this.allowSelection = function (item) {\n return item.RegistryEnabled;\n };\n\n this.$onInit = function () {\n this.setDefaults();\n this.prepareTableFromDataset();\n\n this.state.orderBy = this.orderBy;\n var storedOrder = DatatableService.getDataTableOrder(this.tableKey);\n if (storedOrder !== null) {\n this.state.reverseOrder = storedOrder.reverse;\n this.state.orderBy = storedOrder.orderBy;\n }\n\n var textFilter = DatatableService.getDataTableTextFilters(this.tableKey);\n if (textFilter !== null) {\n this.state.textFilter = textFilter;\n this.onTextFilterChange();\n }\n\n var storedFilters = DatatableService.getDataTableFilters(this.tableKey);\n if (storedFilters !== null) {\n this.filters = storedFilters;\n }\n if (this.filters && this.filters.state) {\n this.filters.state.open = false;\n }\n\n var storedSettings = DatatableService.getDataTableSettings(this.tableKey);\n if (storedSettings !== null) {\n this.settings = storedSettings;\n this.settings.open = false;\n }\n this.onSettingsRepeaterChange();\n };\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./registry-form-gitlab.html');\n\nangular.module('portainer.app').component('registryFormGitlab', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n model: '=',\n retrieveRegistries: '<',\n createRegistries: '<',\n actionInProgress: '<',\n projects: '=',\n state: '=',\n resetDefaults: '<',\n },\n});\n","var path = 'app/portainer/components/forms/registry-form-gitlab/registry-form-gitlab.html';\nvar html = \"<form class=\\\"form-horizontal\\\" name=\\\"registryFormGitlab\\\" ng-submit=\\\"$ctrl.retrieveRegistries()\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Important notice\\n </div>\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n <p>\\n For information on how to generate a Gitlab Personal Access Token, follow the\\n <a href=\\\"https://gitlab.com/help/user/profile/personal_access_tokens.md\\\" target=\\\"_blank\\\">gitlab guide</a>.\\n </p>\\n </span>\\n </div>\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Gitlab registry connection details\\n </div>\\n <!-- credentials-user -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"registry_username\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Username</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"registry_username\\\" name=\\\"registry_username\\\" ng-model=\\\"$ctrl.model.Username\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"registryFormGitlab.registry_username.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"registryFormGitlab.registry_username.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !credentials-user -->\\n <!-- credentials-pat -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"registry_perso_acc_token\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Personal Access Token </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"password\\\" class=\\\"form-control\\\" id=\\\"registry_perso_acc_token\\\" name=\\\"registry_perso_acc_token\\\" ng-model=\\\"$ctrl.model.Token\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"registryFormGitlab.registry_perso_acc_token.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"registryFormGitlab.registry_perso_acc_token.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !credentials-pat -->\\n\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <a class=\\\"small interactive\\\" ng-if=\\\"!$ctrl.state.overrideConfiguration\\\" ng-click=\\\"$ctrl.state.overrideConfiguration = true;\\\">\\n <i class=\\\"fa fa-wrench space-right\\\" aria-hidden=\\\"true\\\"></i> Override default configuration\\n </a>\\n <a class=\\\"small interactive\\\" ng-if=\\\"$ctrl.state.overrideConfiguration\\\" ng-click=\\\"$ctrl.state.overrideConfiguration = false; $ctrl.resetDefaults()\\\">\\n <i class=\\\"fa fa-cogs space-right\\\" aria-hidden=\\\"true\\\"></i> Use default configuration\\n </a>\\n </div>\\n </div>\\n\\n <!-- url-input -->\\n <div class=\\\"form-group\\\" ng-if=\\\"$ctrl.state.overrideConfiguration\\\">\\n <label for=\\\"instance_url\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Instance URL\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"URL of Gitlab instance.\\\"></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"instance_url\\\" name=\\\"instance_url\\\" ng-model=\\\"$ctrl.model.Gitlab.InstanceURL\\\" placeholder=\\\"https://gitlab.com\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"registryFormGitlab.instance_url.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"registryFormGitlab.instance_url.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !url-input -->\\n <!-- url-input -->\\n <div class=\\\"form-group\\\" ng-if=\\\"$ctrl.state.overrideConfiguration\\\">\\n <label for=\\\"registry_url\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Registry URL\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"URL of Gitlab registry instance.\\\"></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"registry_url\\\" name=\\\"registry_url\\\" ng-model=\\\"$ctrl.model.URL\\\" placeholder=\\\"https://registry.gitlab.com\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"registryFormGitlab.registry_url.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"registryFormGitlab.registry_url.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !url-input -->\\n\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button type=\\\"submit\\\" class=\\\"btn btn-primary btn-sm\\\" ng-disabled=\\\"$ctrl.actionInProgress || !registryFormGitlab.$valid\\\" button-spinner=\\\"$ctrl.actionInProgress\\\">\\n <span ng-hide=\\\"$ctrl.actionInProgress\\\">Retrieve projects</span>\\n <span ng-show=\\\"$ctrl.actionInProgress\\\">In progress...</span>\\n </button>\\n </div>\\n </div>\\n</form>\\n<div class=\\\"form-horizontal\\\" ng-if=\\\"$ctrl.projects\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Gitlab projects\\n </div>\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n Select the project's registries you want to manage. Portainer will create one registry for each selected project.\\n </span>\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n <i class=\\\"fa fa-exclamation-circle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n If you can't select a project, make sure that registry feature is activated on it.\\n </span>\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <gitlab-projects-datatable\\n title-text=\\\"Gitlab projects\\\"\\n title-icon=\\\"fa-project-diagram\\\"\\n dataset=\\\"$ctrl.projects\\\"\\n table-key=\\\"gitlab_projects\\\"\\n state=\\\"$ctrl.state.gitlab\\\"\\n order-by=\\\"Name\\\"\\n ></gitlab-projects-datatable>\\n </div>\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n ng-click=\\\"$ctrl.createRegistries()\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"$ctrl.actionInProgress || !$ctrl.state.gitlab.selectedItemCount\\\"\\n button-spinner=\\\"$ctrl.actionInProgress\\\"\\n analytics-on\\n analytics-category=\\\"portainer\\\"\\n analytics-event=\\\"portainer-registry-creation\\\"\\n analytics-properties=\\\"{ metadata: { type: 'gitlab' } }\\\"\\n >\\n <span ng-hide=\\\"$ctrl.actionInProgress\\\">Create registries</span>\\n <span ng-show=\\\"$ctrl.actionInProgress\\\">In progress...</span>\\n </button>\\n </div>\\n </div>\\n <!-- !actions -->\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./registry-form-proget.html');\n\nangular.module('portainer.app').component('registryFormProget', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n model: '=',\n formAction: '<',\n formActionLabel: '@',\n actionInProgress: '<',\n },\n});\n","var path = 'app/portainer/components/forms/registry-form-proget/registry-form-proget.html';\nvar html = \"<form class=\\\"form-horizontal\\\" name=\\\"registryFormProGet\\\" ng-submit=\\\"$ctrl.formAction()\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Important notice\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12 text-muted small\\\">\\n Any Portainer user that has access to this registry will be able to use the Registry Manager features against the content of any Feed in the ProGet registry that the ProGet\\n user has access to.\\n </div>\\n </div>\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n ProGet registry details\\n </div>\\n <!-- name-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"registry_name\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Name</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"registry_name\\\" name=\\\"registry_name\\\" ng-model=\\\"$ctrl.model.Name\\\" placeholder=\\\"proget-registry\\\" required auto-focus />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"registryFormProGet.registry_name.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"registryFormProGet.registry_name.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i>This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !name-input -->\\n <!-- url-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"registry_url\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Registry URL\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"The URL of the ProGet registry including the Feed name\\\"></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"registry_url\\\" name=\\\"registry_url\\\" ng-model=\\\"$ctrl.model.URL\\\" placeholder=\\\"proget.example.com/example-registry\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"registryFormProGet.registry_url.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"registryFormProGet.registry_url.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- url-input -->\\n <!-- base-url-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"registry_base_url\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Base URL\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"The base URL of the ProGet registry\\\"></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"registry_base_url\\\" name=\\\"registry_base_url\\\" ng-model=\\\"$ctrl.model.BaseURL\\\" placeholder=\\\"proget.example.com\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"registryFormProGet.registry_base_url.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"registryFormProGet.registry_base_url.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !base-url-input -->\\n <div>\\n <!-- credentials-user -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"registry_username\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Username</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"registry_username\\\" name=\\\"registry_username\\\" ng-model=\\\"$ctrl.model.Username\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"registryFormProGet.registry_username.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"registryFormProGet.registry_username.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !credentials-user -->\\n <!-- credentials-password -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"registry_password\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Password</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"password\\\" class=\\\"form-control\\\" id=\\\"registry_password\\\" name=\\\"registry_password\\\" ng-model=\\\"$ctrl.model.Password\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"registryFormProGet.registry_password.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"registryFormProGet.registry_password.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !credentials-password -->\\n </div>\\n <!-- actions -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"submit\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"$ctrl.actionInProgress || !registryFormProGet.$valid\\\"\\n button-spinner=\\\"$ctrl.actionInProgress\\\"\\n analytics-on\\n analytics-category=\\\"portainer\\\"\\n analytics-event=\\\"portainer-registry-creation\\\"\\n analytics-properties=\\\"{ metadata: { type: 'proget' } }\\\"\\n >\\n <span ng-hide=\\\"$ctrl.actionInProgress\\\">{{ $ctrl.formActionLabel }}</span>\\n <span ng-show=\\\"$ctrl.actionInProgress\\\">In progress...</span>\\n </button>\\n </div>\\n </div>\\n <!-- !actions -->\\n</form>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./registry-form-quay.html');\n\nangular.module('portainer.app').component('registryFormQuay', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n model: '=',\n formAction: '<',\n formActionLabel: '@',\n actionInProgress: '<',\n },\n});\n","var path = 'app/portainer/components/forms/registry-form-quay/registry-form-quay.html';\nvar html = \"<form class=\\\"form-horizontal\\\" name=\\\"registryFormQuay\\\" ng-submit=\\\"$ctrl.formAction()\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Quay account details\\n </div>\\n <!-- credentials-user -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"registry_username\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Username</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"registry_username\\\" name=\\\"registry_username\\\" ng-model=\\\"$ctrl.model.Username\\\" required auto-focus />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"registryFormQuay.registry_username.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"registryFormQuay.registry_username.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !credentials-user -->\\n <!-- credentials-password -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"registry_password\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Password</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"password\\\" class=\\\"form-control\\\" id=\\\"registry_password\\\" name=\\\"registry_password\\\" ng-model=\\\"$ctrl.model.Password\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"registryFormQuay.registry_password.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"registryFormQuay.registry_password.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !credentials-password -->\\n\\n <!-- organisation-checkbox -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <label class=\\\"control-label text-left\\\">\\n Use organisation registry\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\"> <input type=\\\"checkbox\\\" ng-model=\\\"$ctrl.model.Quay.useOrganisation\\\" /><i></i> </label>\\n </div>\\n </div>\\n <!-- !organisation-checkbox -->\\n <div ng-if=\\\"$ctrl.model.Quay.useOrganisation\\\">\\n <!-- organisation_name -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"organisation_name\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Organisation name</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"organisation_name\\\" name=\\\"organisation_name\\\" ng-model=\\\"$ctrl.model.Quay.organisationName\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"registryFormQuay.organisation_name.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"registryFormQuay.organisation_name.$error\\\">\\n <p ng-message=\\\"required\\\"><i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> This field is required.</p>\\n </div>\\n </div>\\n </div>\\n <!-- !organisation_name -->\\n </div>\\n\\n <!-- actions -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"submit\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"$ctrl.actionInProgress || !registryFormQuay.$valid\\\"\\n button-spinner=\\\"$ctrl.actionInProgress\\\"\\n analytics-on\\n analytics-category=\\\"portainer\\\"\\n analytics-event=\\\"portainer-registry-creation\\\"\\n analytics-properties=\\\"{ metadata: { type: 'quay' } }\\\"\\n >\\n <span ng-hide=\\\"$ctrl.actionInProgress\\\">{{ $ctrl.formActionLabel }}</span>\\n <span ng-show=\\\"$ctrl.actionInProgress\\\">In progress...</span>\\n </button>\\n </div>\\n </div>\\n <!-- !actions -->\\n</form>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./stackFromTemplateForm.html');\n\nimport angular from 'angular';\n\nangular.module('portainer.app').component('stackFromTemplateForm', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n template: '=',\n formValues: '=',\n state: '=',\n createTemplate: '<',\n unselectTemplate: '<',\n nameRegex: '<',\n },\n transclude: {\n advanced: '?advancedForm',\n },\n});\n","var path = 'app/portainer/components/forms/stack-from-template-form/stackFromTemplateForm.html';\nvar html = \"<div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-custom-header icon=\\\"$ctrl.template.Logo\\\" title-text=\\\"$ctrl.template.Title\\\"></rd-widget-custom-header>\\n <rd-widget-body classes=\\\"padding\\\">\\n <form class=\\\"form-horizontal\\\" name=\\\"stackTemplateForm\\\">\\n <!-- description -->\\n <div ng-if=\\\"$ctrl.template.Note\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Information\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <div class=\\\"template-note\\\" ng-bind-html=\\\"$ctrl.template.Note\\\"></div>\\n </div>\\n </div>\\n </div>\\n <!-- !description -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Configuration\\n </div>\\n <!-- name-input -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"template_name\\\" class=\\\"col-sm-2 control-label text-left\\\">Name</label>\\n <div class=\\\"col-sm-10\\\">\\n <input type=\\\"text\\\" name=\\\"template_name\\\" class=\\\"form-control\\\" ng-model=\\\"$ctrl.formValues.name\\\" ng-pattern=\\\"$ctrl.nameRegex\\\" placeholder=\\\"e.g. myStack\\\" required />\\n </div>\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"stackTemplateForm.template_name.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"stackTemplateForm.template_name.$error\\\">\\n <p ng-message=\\\"pattern\\\">\\n <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i>\\n <span>This field must consist of lower case alphanumeric characters, '_' or '-' (e.g. 'my-name', or 'abc-123').</span>\\n </p>\\n </div>\\n </div>\\n </div>\\n <!-- !name-input -->\\n <!-- env -->\\n <div ng-repeat=\\\"var in $ctrl.template.Env\\\" ng-if=\\\"!var.preset || var.select\\\" class=\\\"form-group\\\">\\n <label for=\\\"field_{{ $index }}\\\" class=\\\"col-sm-2 control-label text-left\\\">\\n {{ var.label }}\\n <portainer-tooltip ng-if=\\\"var.description\\\" position=\\\"bottom\\\" message=\\\"{{ var.description }}\\\"></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-if=\\\"!var.select\\\" ng-model=\\\"var.value\\\" id=\\\"field_{{ $index }}\\\" />\\n <select class=\\\"form-control\\\" ng-if=\\\"var.select\\\" ng-model=\\\"var.value\\\" id=\\\"field_{{ $index }}\\\">\\n <option selected disabled hidden value=\\\"\\\">Select value</option>\\n <option ng-repeat=\\\"choice in var.select\\\" value=\\\"{{ choice.value }}\\\">{{ choice.text }}</option>\\n </select>\\n </div>\\n </div>\\n <!-- !env -->\\n <ng-transclude ng-transclude-slot=\\\"advanced\\\"></ng-transclude>\\n\\n <!-- access-control -->\\n <por-access-control-form form-data=\\\"$ctrl.formValues.AccessControlData\\\"></por-access-control-form>\\n <!-- !access-control -->\\n <!-- actions -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"$ctrl.state.actionInProgress || !$ctrl.formValues.name || !$ctrl.state.deployable\\\"\\n ng-click=\\\"$ctrl.createTemplate()\\\"\\n button-spinner=\\\"$ctrl.state.actionInProgress\\\"\\n >\\n <span ng-hide=\\\"$ctrl.state.actionInProgress\\\">Deploy the stack</span>\\n <span ng-show=\\\"$ctrl.state.actionInProgress\\\">Deployment in progress...</span>\\n </button>\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-default\\\" ng-click=\\\"$ctrl.unselectTemplate($ctrl.template)\\\">Hide</button>\\n <div class=\\\"cols-sm-12 small text-danger\\\" ng-if=\\\"$ctrl.state.formValidationError\\\" style=\\\"margin-left: 5px; margin-top: 5px;\\\">{{ $ctrl.state.formValidationError }}</div>\\n <div class=\\\"cols-sm-12 small text-danger\\\" ng-if=\\\"!$ctrl.state.deployable\\\" style=\\\"margin-left: 5px; margin-top: 5px;\\\"\\n >This template type cannot be deployed on this environment.</div\\n >\\n </div>\\n </div>\\n <!-- !actions -->\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./stack-redeploy-git-form.html');\n\nimport angular from 'angular';\nimport controller from './stack-redeploy-git-form.controller.js';\n\nexport const stackRedeployGitForm = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n model: '<',\n stack: '<',\n },\n};\n\nangular.module('portainer.app').component('stackRedeployGitForm', stackRedeployGitForm);\n","var path = 'app/portainer/components/forms/stack-redeploy-git-form/stack-redeploy-git-form.html';\nvar html = \"<form name=\\\"$ctrl.redeployGitForm\\\" class=\\\"form-horizontal my-8\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Redeploy from git repository\\n </div>\\n <git-form-info-panel\\n class-name=\\\"text-muted small\\\"\\n url=\\\"$ctrl.model.URL\\\"\\n type=\\\"stack\\\"\\n config-file-path=\\\"$ctrl.model.ConfigFilePath\\\"\\n additional-files=\\\"$ctrl.stack.AdditionalFiles\\\"\\n ></git-form-info-panel>\\n\\n <git-form-auto-update-fieldset model=\\\"$ctrl.formValues.AutoUpdate\\\" on-change=\\\"($ctrl.onChangeAutoUpdate)\\\"></git-form-auto-update-fieldset>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <p>\\n <a class=\\\"small interactive\\\" ng-click=\\\"$ctrl.state.showConfig = !$ctrl.state.showConfig\\\">\\n <i ng-class=\\\"{ 'fa fa-minus space-right': $ctrl.state.showConfig, 'fa fa-plus space-right': !$ctrl.state.showConfig }\\\" aria-hidden=\\\"true\\\"></i>\\n {{ $ctrl.state.showConfig ? 'Hide' : 'Advanced' }} configuration\\n </a>\\n </p>\\n </div>\\n </div>\\n <git-form-ref-field ng-if=\\\"$ctrl.state.showConfig\\\" value=\\\"$ctrl.formValues.RefName\\\" on-change=\\\"($ctrl.onChangeRef)\\\"></git-form-ref-field>\\n <git-form-auth-fieldset\\n ng-if=\\\"$ctrl.state.showConfig\\\"\\n is-edit=\\\"$ctrl.state.isEdit\\\"\\n model=\\\"$ctrl.formValues\\\"\\n on-change=\\\"($ctrl.onChange)\\\"\\n show-auth-explanation=\\\"true\\\"\\n ></git-form-auth-fieldset>\\n <environment-variables-panel\\n ng-model=\\\"$ctrl.formValues.Env\\\"\\n explanation=\\\"These values will be used as substitutions in the stack file\\\"\\n on-change=\\\"($ctrl.onChangeEnvVar)\\\"\\n ></environment-variables-panel>\\n\\n <button\\n class=\\\"btn btn-sm btn-primary\\\"\\n ng-click=\\\"$ctrl.submit()\\\"\\n ng-disabled=\\\"$ctrl.isSubmitButtonDisabled() || $ctrl.state.hasUnsavedChanges || !$ctrl.redeployGitForm.$valid\\\"\\n style=\\\"margin-top: 7px; margin-left: 0;\\\"\\n button-spinner=\\\"$ctrl.state.redeployInProgress\\\"\\n analytics-on\\n analytics-event=\\\"docker-stack-pull-redeploy\\\"\\n analytics-category=\\\"docker\\\"\\n >\\n <span ng-hide=\\\"$ctrl.state.redeployInProgress\\\"> <i class=\\\"fa fa-sync space-right\\\" aria-hidden=\\\"true\\\"></i> Pull and redeploy </span>\\n <span ng-show=\\\"$ctrl.state.redeployInProgress\\\">In progress...</span>\\n </button>\\n\\n <button\\n class=\\\"btn btn-sm btn-primary\\\"\\n ng-click=\\\"$ctrl.saveGitSettings()\\\"\\n ng-disabled=\\\"$ctrl.isSubmitButtonDisabled() || !$ctrl.state.hasUnsavedChanges || !$ctrl.redeployGitForm.$valid\\\"\\n style=\\\"margin-top: 7px; margin-left: 0;\\\"\\n button-spinner=\\\"$ctrl.state.inProgress\\\"\\n analytics-on\\n analytics-event=\\\"docker-stack-update-git-settings\\\"\\n analytics-category=\\\"docker\\\"\\n analytics-properties=\\\"$ctrl.buildAnalyticsProperties()\\\"\\n >\\n <span ng-hide=\\\"$ctrl.state.inProgress\\\"> Save settings </span>\\n <span ng-show=\\\"$ctrl.state.inProgress\\\">In progress...</span>\\n </button>\\n</form>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./groupAssociationTable.html');\n\nimport _ from 'lodash-es';\nimport PortainerEndpointTagHelper from 'Portainer/helpers/tagHelper';\n\nangular.module('portainer.app').component('groupAssociationTable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: function () {\n this.state = {\n orderBy: 'Name',\n reverseOrder: false,\n paginatedItemLimit: '10',\n textFilter: '',\n loading: true,\n pageNumber: 1,\n };\n\n this.changeOrderBy = function (orderField) {\n this.state.reverseOrder = this.state.orderBy === orderField ? !this.state.reverseOrder : false;\n this.state.orderBy = orderField;\n };\n\n this.onTextFilterChange = function () {\n this.paginationChangedAction();\n };\n\n this.onPageChanged = function (newPageNumber) {\n this.paginationState.pageNumber = newPageNumber;\n this.paginationChangedAction();\n };\n\n this.onPaginationLimitChanged = function () {\n this.paginationChangedAction();\n };\n\n this.paginationChangedAction = function () {\n this.retrievePage(this.pageType, this.tableType);\n };\n\n this.$onChanges = function (changes) {\n if (changes.loaded && changes.loaded.currentValue) {\n this.paginationChangedAction();\n }\n };\n\n this.tagIdsToTagNames = function tagIdsToTagNames(tagIds) {\n return PortainerEndpointTagHelper.idsToTagNames(this.tags, tagIds).join(', ') || '-';\n };\n\n this.groupIdToGroupName = function groupIdToGroupName(groupId) {\n const group = _.find(this.groups, { Id: groupId });\n return group ? group.Name : '';\n };\n },\n bindings: {\n paginationState: '=',\n loaded: '<',\n pageType: '<',\n tableType: '@',\n retrievePage: '<',\n dataset: '<',\n entryClick: '<',\n emptyDatasetMessage: '@',\n tags: '<',\n showTags: '<',\n groups: '<',\n showGroups: '<',\n hasBackendPagination: '<',\n },\n});\n","var path = 'app/portainer/components/group-association-table/groupAssociationTable.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <table class=\\\"table table-hover\\\">\\n <div class=\\\"col-sm-12\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.paginationState.filter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n placeholder=\\\"Search...\\\"\\n />\\n </div>\\n <thead>\\n <tr>\\n <th>\\n Name\\n </th>\\n <th ng-if=\\\"$ctrl.showGroups\\\">\\n Group\\n </th>\\n <th ng-if=\\\"$ctrl.showTags\\\">\\n Tags\\n </th>\\n </tr>\\n </thead>\\n <tbody>\\n <tr\\n ng-if=\\\"!$ctrl.hasBackendPagination\\\"\\n ng-click=\\\"$ctrl.entryClick(item)\\\"\\n class=\\\"interactive\\\"\\n dir-paginate=\\\"item in $ctrl.dataset | filter:$ctrl.paginationState.filter | itemsPerPage: $ctrl.paginationState.limit\\\"\\n pagination-id=\\\"$ctrl.tableType\\\"\\n >\\n <td>\\n {{ item.Name | truncate: 64 }}\\n </td>\\n <td ng-if=\\\"$ctrl.showGroups\\\">\\n {{ $ctrl.groupIdToGroupName(item.GroupId) | truncate: 64 }}\\n </td>\\n <td ng-if=\\\"$ctrl.showTags\\\">\\n {{ $ctrl.tagIdsToTagNames(item.TagIds) | arraytostr | truncate: 64 }}\\n </td>\\n </tr>\\n <tr\\n ng-if=\\\"$ctrl.hasBackendPagination\\\"\\n ng-click=\\\"$ctrl.entryClick(item)\\\"\\n class=\\\"interactive\\\"\\n dir-paginate=\\\"item in $ctrl.dataset | itemsPerPage: $ctrl.paginationState.limit\\\"\\n pagination-id=\\\"$ctrl.tableType\\\"\\n total-items=\\\"$ctrl.paginationState.totalCount\\\"\\n >\\n <td>\\n {{ item.Name | truncate: 64 }}\\n </td>\\n <td ng-if=\\\"$ctrl.showGroups\\\">\\n {{ $ctrl.groupIdToGroupName(item.GroupId) | truncate: 64 }}\\n </td>\\n <td ng-if=\\\"$ctrl.showTags\\\">\\n {{ $ctrl.tagIdsToTagNames(item.TagIds) | truncate: 64 }}\\n </td>\\n </tr>\\n\\n <tr ng-if=\\\"!$ctrl.dataset\\\">\\n <td colspan=\\\"3\\\" class=\\\"text-center text-muted\\\">Loading...</td>\\n </tr>\\n <tr ng-if=\\\"$ctrl.dataset.length === 0\\\">\\n <td colspan=\\\"3\\\" class=\\\"text-center text-muted\\\">{{ $ctrl.emptyDatasetMessage }}</td>\\n </tr>\\n </tbody>\\n </table>\\n <div class=\\\"footer\\\" ng-if=\\\"$ctrl.dataset\\\">\\n <div class=\\\"paginationControls\\\">\\n <form class=\\\"form-inline\\\">\\n <span class=\\\"limitSelector\\\">\\n <span style=\\\"margin-right: 5px;\\\">\\n Items per page\\n </span>\\n <select ng-model=\\\"$ctrl.paginationState.limit\\\" ng-change=\\\"$ctrl.onPaginationLimitChanged()\\\">\\n <option value=\\\"10\\\">10</option>\\n <option value=\\\"25\\\">25</option>\\n <option value=\\\"50\\\">50</option>\\n <option value=\\\"100\\\">100</option>\\n </select>\\n </span>\\n <dir-pagination-controls pagination-id=\\\"$ctrl.tableType\\\" max-size=\\\"5\\\" on-page-change=\\\"$ctrl.onPageChanged(newPageNumber, oldPageNumber)\\\"></dir-pagination-controls>\\n </form>\\n </div>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","angular.module('portainer.app').directive('rdHeaderContent', [\n 'Authentication',\n function rdHeaderContent(Authentication) {\n var directive = {\n requires: '^rdHeader',\n transclude: true,\n link: function (scope) {\n scope.username = Authentication.getUserDetails().username;\n },\n template:\n '<div class=\"breadcrumb-links\"><div class=\"pull-left\" ng-transclude></div><div class=\"pull-right\" ng-if=\"username\"><a ui-sref=\"portainer.account\" style=\"margin-right: 5px;\"><u><i class=\"fa fa-wrench\" aria-hidden=\"true\"></i> my account </u></a><a ui-sref=\"portainer.logout({performApiLogout: true})\" class=\"text-danger\" style=\"margin-right: 25px;\" data-cy=\"template-logoutButton\"><u><i class=\"fa fa-sign-out-alt\" aria-hidden=\"true\"></i> log out</u></a></div></div>',\n restrict: 'E',\n };\n return directive;\n },\n]);\n","angular.module('portainer.app').directive('rdHeaderTitle', [\n 'Authentication',\n function rdHeaderTitle(Authentication) {\n var directive = {\n requires: '^rdHeader',\n scope: {\n titleText: '@',\n },\n link: function (scope) {\n scope.username = Authentication.getUserDetails().username;\n },\n transclude: true,\n template:\n '<div class=\"page white-space-normal\">{{titleText}}<span class=\"header_title_content\" ng-transclude></span><span class=\"pull-right user-box\" ng-if=\"username\"><i class=\"fa fa-user-circle\" aria-hidden=\"true\"></i> {{username}}</span></div>',\n restrict: 'E',\n };\n return directive;\n },\n]);\n","angular.module('portainer.app').directive('rdHeader', function rdHeader() {\n var directive = {\n scope: {\n ngModel: '=',\n },\n transclude: true,\n template: '<div class=\"row header\"><div id=\"loadingbar-placeholder\"></div><div class=\"col-xs-12\"><div class=\"meta\" ng-transclude></div></div></div>',\n restrict: 'EA',\n };\n return directive;\n});\n","const autoNgTemplateLoaderTemplate1 = require('./informationPanelOffline.html');\n\nangular.module('portainer.app').component('informationPanelOffline', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'InformationPanelOfflineController',\n});\n","var path = 'app/portainer/components/information-panel-offline/informationPanelOffline.html';\nvar html = \"<information-panel title-text=\\\"Offline mode\\\" cant-dismiss=\\\"true\\\">\\n <span class=\\\"small\\\">\\n <p class=\\\"text-muted\\\">\\n <i class=\\\"fa fa-exclamation-circle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n This environment is currently offline (read-only). Data shown is based on the latest available snapshot.\\n </p>\\n <p class=\\\"text-muted\\\">\\n <i class=\\\"fa fa-clock\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Last snapshot: {{ $ctrl.snapshotTime | getisodatefromtimestamp }}\\n </p>\\n <button type=\\\"button\\\" class=\\\"btn btn-xs btn-primary\\\" ng-click=\\\"$ctrl.triggerSnapshot()\\\" ng-if=\\\"$ctrl.showRefreshButton\\\">\\n <i class=\\\"fa fa-sync space-right\\\" aria-hidden=\\\"true\\\"></i>Refresh\\n </button>\\n </span>\\n</information-panel>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","angular.module('portainer.app').controller('InformationPanelOfflineController', [\n '$state',\n 'EndpointProvider',\n 'EndpointService',\n 'Authentication',\n 'Notifications',\n function StackDuplicationFormController($state, EndpointProvider, EndpointService, Authentication, Notifications) {\n var ctrl = this;\n\n this.$onInit = onInit;\n this.triggerSnapshot = triggerSnapshot;\n\n function triggerSnapshot() {\n var endpointId = EndpointProvider.endpointID();\n\n EndpointService.snapshotEndpoint(endpointId)\n .then(function onSuccess() {\n $state.reload();\n })\n .catch(function onError(err) {\n Notifications.error('Failure', err, 'An error occured during environment snapshot');\n });\n }\n\n function onInit() {\n var endpointId = EndpointProvider.endpointID();\n ctrl.showRefreshButton = Authentication.isAdmin();\n\n EndpointService.endpoint(endpointId)\n .then(function onSuccess(data) {\n ctrl.snapshotTime = data.Snapshots[0].Time;\n })\n .catch(function onError(err) {\n Notifications.error('Failure', err, 'Unable to retrieve environment information');\n });\n }\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./informationPanel.html');\n\nangular.module('portainer.app').component('informationPanel', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n titleText: '@',\n dismissAction: '&?',\n },\n transclude: true,\n});\n","var path = 'app/portainer/components/information-panel/informationPanel.html';\nvar html = \"<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n <span style=\\\"float: left;\\\">\\n {{ $ctrl.titleText }}\\n </span>\\n <span class=\\\"small\\\" style=\\\"float: right;\\\" ng-if=\\\"$ctrl.dismissAction\\\">\\n <a ng-click=\\\"$ctrl.dismissAction()\\\"><i class=\\\"fa fa-times\\\"></i> dismiss</a>\\n </span>\\n </div>\\n <div class=\\\"form-group\\\">\\n <ng-transclude></ng-transclude>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import angular from 'angular';\nimport parse from 'parse-duration';\n\nangular.module('portainer.app').directive('intervalFormat', function () {\n return {\n restrict: 'A',\n require: 'ngModel',\n link: function ($scope, $element, $attrs, ngModel) {\n ngModel.$validators.invalidIntervalFormat = function (modelValue) {\n try {\n return modelValue && modelValue.toUpperCase().match(/^P?(?!$)(\\d+Y)?(\\d+M)?(\\d+W)?(\\d+D)?(T?(?=\\d+[HMS])(\\d+H)?(\\d+M)?(\\d+S)?)?$/gm) !== null;\n } catch (error) {\n return false;\n }\n };\n\n ngModel.$validators.minimumInterval = function (modelValue) {\n try {\n return modelValue && parse(modelValue, 'minute') >= 1;\n } catch (error) {\n return false;\n }\n };\n },\n };\n});\n","const autoNgTemplateLoaderTemplate1 = require('./motdPanel.html');\n\nangular.module('portainer.app').component('motdPanel', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n motd: '<',\n dismissAction: '&?',\n },\n transclude: true,\n});\n","var path = 'app/portainer/components/motd-panel/motdPanel.html';\nvar html = \"<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"motd-body\\\">\\n <style ng-if=\\\"$ctrl.motd.Style\\\">\\n {{ $ctrl.motd.Style }}\\n </style>\\n <div ng-style=\\\"{{ $ctrl.motd.ContentLayout ? $ctrl.motd.ContentLayout : {} }}\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n <span style=\\\"float: left;\\\">\\n {{ $ctrl.motd.Title }}\\n </span>\\n <span class=\\\"small\\\" style=\\\"float: right;\\\" ng-if=\\\"$ctrl.dismissAction\\\">\\n <a ng-click=\\\"$ctrl.dismissAction()\\\"><i class=\\\"fa fa-times\\\"></i> dismiss</a>\\n </span>\\n </div>\\n <div class=\\\"form-group\\\">\\n <span class=\\\"text-muted\\\">\\n <p ng-bind-html=\\\"$ctrl.motd.Message\\\"></p>\\n </span>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","angular.module('portainer.app').directive('onEnterKey', [\n function porOnEnterKey() {\n var directive = {\n restrict: 'A',\n link: function (scope, element, attrs) {\n element.bind('keydown keypress', function (e) {\n if (e.which === 13) {\n e.preventDefault();\n scope.$apply(function () {\n scope.$eval(attrs.onEnterKey);\n });\n }\n });\n },\n };\n\n return directive;\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./productItem.html');\n\nangular.module('portainer.app').component('productItem', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n model: '<',\n goTo: '<',\n },\n});\n","var path = 'app/portainer/components/product-list/product-item/productItem.html';\nvar html = \"<!-- extension -->\\n<div class=\\\"blocklist-item\\\" ng-click=\\\"$ctrl.goTo($ctrl.model)\\\">\\n <div class=\\\"blocklist-item-box\\\">\\n <!-- extension-image -->\\n <span class=\\\"blocklist-item-logo\\\">\\n <img class=\\\"blocklist-item-logo\\\" ng-if=\\\"$ctrl.model.Id == 1 || $ctrl.model.Id == 2 || $ctrl.model.Id == 3\\\" src=\\\"\" + require(\"@/assets/images/support_1.png\") + \"\\\" />\\n <img class=\\\"blocklist-item-logo\\\" ng-if=\\\"$ctrl.model.Id == 4 || $ctrl.model.Id == 5\\\" src=\\\"\" + require(\"@/assets/images/support_2.png\") + \"\\\" />\\n </span>\\n <!-- !extension-image -->\\n <!-- extension-details -->\\n <span class=\\\"col-sm-12\\\">\\n <!-- blocklist-item-line1 -->\\n <div class=\\\"blocklist-item-line\\\">\\n <span>\\n <span class=\\\"blocklist-item-title\\\">\\n {{ $ctrl.model.Name }}\\n </span>\\n </span>\\n </div>\\n <!-- !blocklist-item-line1 -->\\n <!-- blocklist-item-line2 -->\\n <div class=\\\"blocklist-item-line\\\">\\n <span>\\n <span class=\\\"blocklist-item-desc\\\">\\n {{ $ctrl.model.ShortDescription }}\\n </span>\\n </span>\\n </div>\\n <!-- !blocklist-item-line2 -->\\n </span>\\n <!-- !extension-details -->\\n </div>\\n <!-- !extension -->\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","module.exports = __webpack_public_path__ + \"6b03ffb82223ffdcc7fc093f199f758b.png\";","module.exports = __webpack_public_path__ + \"249bec13697c484bcfe40241cabfd053.png\";","const autoNgTemplateLoaderTemplate1 = require('./productList.html');\n\nangular.module('portainer.app').component('productList', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n titleText: '@',\n products: '<',\n goTo: '<',\n },\n});\n","var path = 'app/portainer/components/product-list/productList.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa fa-bolt\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n </div>\\n\\n <div class=\\\"blocklist\\\">\\n <product-item ng-repeat=\\\"product in $ctrl.products\\\" model=\\\"product\\\" go-to=\\\"$ctrl.goTo\\\"></product-item>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./registry-details.html');\n\nimport angular from 'angular';\n\nexport const registryDetails = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n registry: '<',\n },\n};\n\nangular.module('portainer.app').component('registryDetails', registryDetails);\n","var path = 'app/portainer/components/registry-details/registry-details.html';\nvar html = \"<div class=\\\"row\\\" ng-if=\\\"$ctrl.registry\\\">\\n <div class=\\\"col-lg-12 col-md-12 col-xs-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-plug\\\" title-text=\\\"Registry\\\"></rd-widget-header>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <table class=\\\"table\\\">\\n <tbody>\\n <tr>\\n <td>Name</td>\\n <td>\\n {{ $ctrl.registry.Name }}\\n </td>\\n </tr>\\n <tr>\\n <td>URL</td>\\n <td>\\n {{ $ctrl.registry.URL }}\\n </td>\\n </tr>\\n </tbody>\\n </table>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/components/sensitive-details/sensitive-details.html';\nvar html = \"<div class=\\\"sensitive-details-container\\\">\\n <div class=\\\"text-wrap\\\">{{ $ctrl.key }}</div>\\n <show-hide class=\\\"show-hide-container\\\" value=\\\"$ctrl.value\\\" use-asterisk=\\\"true\\\"></show-hide>\\n <copy-button value=\\\"$ctrl.value\\\"></copy-button>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./show-hide.html');\n\nimport angular from 'angular';\n\nangular.module('portainer.app').component('showHide', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n value: '<',\n useAsterisk: '<',\n },\n});\n","var path = 'app/portainer/components/show-hide/show-hide.html';\nvar html = \"<div class=\\\"small text-muted text-wrap\\\">\\n <span ng-if=\\\"!$ctrl.show && $ctrl.useAsterisk\\\">********</span>\\n <span ng-if=\\\"$ctrl.show\\\">{{ $ctrl.value }}</span>\\n</div>\\n\\n<button type=\\\"button\\\" class=\\\"btn btn-link nopadding\\\" ng-click=\\\"$ctrl.show = !$ctrl.show\\\" title=\\\"Show/Hide value\\\">\\n <div ng-if=\\\"!$ctrl.show\\\"> <i class=\\\"fa fa-eye-slash\\\"></i> Show</div>\\n <div ng-if=\\\"$ctrl.show\\\"> <i class=\\\"fa fa-eye\\\"></i> Hide</div>\\n</button>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./slider.html');\n\nangular.module('portainer.app').component('slider', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'SliderController',\n bindings: {\n model: '=',\n onChange: '<',\n floor: '<',\n ceil: '<',\n step: '<',\n precision: '<',\n },\n});\n","var path = 'app/portainer/components/slider/slider.html';\nvar html = \"<div>\\n <rzslider rz-slider-options=\\\"$ctrl.options\\\" rz-slider-model=\\\"$ctrl.model\\\"></rzslider>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","// TODO: k8s merge - TEST WITH EXISTING SLIDERS !\n// Not sure if this is not breaking existing sliders on docker views\n// Or sliders with onChange call (docker service update view)\nimport angular from 'angular';\n\nclass SliderController {\n /* @ngInject */\n constructor($scope) {\n this.$scope = $scope;\n\n this.buildOptions = this.buildOptions.bind(this);\n this.translate = this.translate.bind(this);\n }\n\n $onChanges() {\n this.buildOptions();\n }\n\n translate(value, sliderId, label) {\n if ((label === 'floor' && this.floor === 0) || value === 0) {\n return 'unlimited';\n }\n return value;\n }\n\n buildOptions() {\n this.options = {\n floor: this.floor,\n ceil: this.ceil,\n step: this.step,\n precision: this.precision,\n showSelectionBar: true,\n enforceStep: false,\n translate: this.translate,\n onChange: () => this.onChange(),\n };\n }\n\n $onInit() {\n this.buildOptions();\n }\n}\n\nexport default SliderController;\nangular.module('portainer.app').controller('SliderController', SliderController);\n","import { STACK_NAME_VALIDATION_REGEX } from '@/constants';\n\nangular.module('portainer.app').controller('StackDuplicationFormController', [\n 'Notifications',\n function StackDuplicationFormController(Notifications) {\n var ctrl = this;\n\n ctrl.state = {\n duplicationInProgress: false,\n migrationInProgress: false,\n };\n\n ctrl.formValues = {\n endpoint: null,\n newName: '',\n };\n\n ctrl.STACK_NAME_VALIDATION_REGEX = STACK_NAME_VALIDATION_REGEX;\n\n ctrl.isFormValidForDuplication = isFormValidForDuplication;\n ctrl.isFormValidForMigration = isFormValidForMigration;\n ctrl.duplicateStack = duplicateStack;\n ctrl.migrateStack = migrateStack;\n ctrl.isMigrationButtonDisabled = isMigrationButtonDisabled;\n ctrl.isEndpointSelected = isEndpointSelected;\n\n function isFormValidForMigration() {\n return ctrl.formValues.endpoint && ctrl.formValues.endpoint.Id;\n }\n\n function isFormValidForDuplication() {\n return isFormValidForMigration() && ctrl.formValues.newName && !ctrl.yamlError;\n }\n\n function duplicateStack() {\n if (!ctrl.formValues.newName) {\n Notifications.error('Failure', null, 'Stack name is required for duplication');\n return;\n }\n ctrl.state.duplicationInProgress = true;\n ctrl\n .onDuplicate({\n endpointId: ctrl.formValues.endpoint.Id,\n name: ctrl.formValues.newName ? ctrl.formValues.newName : undefined,\n })\n .finally(function () {\n ctrl.state.duplicationInProgress = false;\n });\n }\n\n function migrateStack() {\n ctrl.state.migrationInProgress = true;\n ctrl\n .onMigrate({\n endpointId: ctrl.formValues.endpoint.Id,\n name: ctrl.formValues.newName ? ctrl.formValues.newName : undefined,\n })\n .finally(function () {\n ctrl.state.migrationInProgress = false;\n });\n }\n\n function isMigrationButtonDisabled() {\n return !ctrl.isFormValidForMigration() || ctrl.state.duplicationInProgress || ctrl.state.migrationInProgress || isTargetEndpointAndCurrentEquals();\n }\n\n function isTargetEndpointAndCurrentEquals() {\n return ctrl.formValues.endpoint && ctrl.formValues.endpoint.Id === ctrl.currentEndpointId;\n }\n\n function isEndpointSelected() {\n return ctrl.formValues.endpoint && ctrl.formValues.endpoint.Id;\n }\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./stack-duplication-form.html');\n\nangular.module('portainer.app').component('stackDuplicationForm', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'StackDuplicationFormController',\n bindings: {\n onDuplicate: '&',\n onMigrate: '&',\n endpoints: '<',\n groups: '<',\n currentEndpointId: '<',\n yamlError: '<',\n },\n});\n","var path = 'app/portainer/components/stack-duplication-form/stack-duplication-form.html';\nvar html = \"<div authorization=\\\"PortainerStackMigrate\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Stack duplication / migration\\n </div>\\n <rd-widget>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\" name=\\\"dupStackForm\\\">\\n <div class=\\\"form-group\\\">\\n <span class=\\\"small\\\" style=\\\"margin-top: 10px;\\\">\\n <p class=\\\"text-muted\\\">\\n This feature allows you to duplicate or migrate this stack.\\n </p>\\n </span>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <input\\n class=\\\"form-control\\\"\\n placeholder=\\\"Stack name (optional for migration)\\\"\\n aria-placeholder=\\\"Stack name\\\"\\n name=\\\"new_stack_name\\\"\\n ng-pattern=\\\"$ctrl.STACK_NAME_VALIDATION_REGEX\\\"\\n ng-model=\\\"$ctrl.formValues.newName\\\"\\n />\\n </div>\\n <div class=\\\"form-group\\\" ng-show=\\\"dupStackForm.new_stack_name.$invalid\\\">\\n <div class=\\\"col-sm-12 small text-warning\\\">\\n <div ng-messages=\\\"dupStackForm.new_stack_name.$error\\\">\\n <p ng-message=\\\"pattern\\\">\\n <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i>\\n <span>This field must consist of lower case alphanumeric characters, '_' or '-' (e.g. 'my-name', or 'abc-123').</span>\\n </p>\\n </div>\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <endpoint-selector ng-if=\\\"$ctrl.endpoints && $ctrl.groups\\\" model=\\\"$ctrl.formValues.endpoint\\\" endpoints=\\\"$ctrl.endpoints\\\" groups=\\\"$ctrl.groups\\\"></endpoint-selector>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <button\\n class=\\\"btn btn-sm btn-primary\\\"\\n ng-click=\\\"$ctrl.migrateStack()\\\"\\n ng-disabled=\\\"$ctrl.isMigrationButtonDisabled()\\\"\\n style=\\\"margin-top: 7px; margin-left: 0;\\\"\\n button-spinner=\\\"$ctrl.state.migrationInProgress\\\"\\n >\\n <span ng-hide=\\\"$ctrl.state.migrationInProgress\\\"> <i class=\\\"fa fa-long-arrow-alt-right space-right\\\" aria-hidden=\\\"true\\\"></i> Migrate </span>\\n <span ng-show=\\\"$ctrl.state.migrationInProgress\\\">Migration in progress...</span>\\n </button>\\n <button\\n class=\\\"btn btn-sm btn-primary\\\"\\n ng-click=\\\"$ctrl.duplicateStack()\\\"\\n ng-disabled=\\\"!$ctrl.isFormValidForDuplication() || $ctrl.state.duplicationInProgress || $ctrl.state.migrationInProgress\\\"\\n style=\\\"margin-top: 7px; margin-left: 0;\\\"\\n button-spinner=\\\"$ctrl.state.duplicationInProgress\\\"\\n >\\n <span ng-hide=\\\"$ctrl.state.duplicationInProgress\\\"> <i class=\\\"fa fa-clone space-right\\\" aria-hidden=\\\"true\\\"></i> Duplicate </span>\\n <span ng-show=\\\"$ctrl.state.duplicationInProgress\\\">Duplication in progress...</span>\\n </button>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <div ng-if=\\\"$ctrl.yamlError && $ctrl.isEndpointSelected()\\\">\\n <span class=\\\"text-danger small\\\">{{ $ctrl.yamlError }}</span>\\n </div>\\n </div>\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/components/status-indicator/status-indicator.html';\nvar html = \"<i aria-hidden=\\\"true\\\" ng-class=\\\"['status-indicator', { ok: $ctrl.ok }]\\\"></i>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./tagSelector.html');\n\nangular.module('portainer.app').component('tagSelector', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'TagSelectorController',\n bindings: {\n tags: '<',\n model: '=',\n onCreate: '<',\n allowCreate: '<',\n },\n});\n","var path = 'app/portainer/components/tag-selector/tagSelector.html';\nvar html = \"<div ng-show=\\\"$ctrl.model.length > 0\\\" class=\\\"col-sm-12\\\" style=\\\"padding: 0; margin-bottom: 15px;\\\">\\n <label class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Selected tags\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\" style=\\\"padding-top: 4px;\\\">\\n <span class=\\\"tag space-right interactive\\\" ng-repeat=\\\"tag in $ctrl.state.selectedTags\\\" ng-click=\\\"$ctrl.removeTag(tag)\\\">\\n {{ tag.Name }}\\n <a title=\\\"Remove tag\\\" ng-click=\\\"$ctrl.removeTag(tag)\\\" style=\\\"margin-left: 2px;\\\">\\n <span class=\\\"fa fa-trash-alt white-icon\\\" aria-hidden=\\\"true\\\"></span>\\n </a>\\n </span>\\n </div>\\n</div>\\n<div class=\\\"col-sm-12\\\" style=\\\"padding: 0;\\\">\\n <label for=\\\"tags\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Tags\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\" id=\\\"scrollable-dropdown-menu\\\" ng-if=\\\"$ctrl.allowCreate || $ctrl.tags.length > 0\\\">\\n <input\\n type=\\\"text\\\"\\n ng-model=\\\"$ctrl.state.selectedValue\\\"\\n id=\\\"tags\\\"\\n class=\\\"form-control\\\"\\n placeholder=\\\"Select tags...\\\"\\n uib-typeahead=\\\"tag.Id as tag.Name for tag in $ctrl.filterTags($viewValue)\\\"\\n typeahead-on-select=\\\"$ctrl.selectTag($item, $model, $label)\\\"\\n typeahead-no-results=\\\"$ctrl.state.noResult\\\"\\n typeahead-show-hint=\\\"true\\\"\\n typeahead-min-length=\\\"0\\\"\\n data-cy=\\\"tags-tagInput\\\"\\n />\\n </div>\\n <div class=\\\"col-sm-9 col-lg-10\\\" ng-if=\\\"!$ctrl.allowCreate && $ctrl.tags.length === 0\\\">\\n <span class=\\\"small text-muted\\\">\\n No tags available.\\n </span>\\n </div>\\n</div>\\n<div class=\\\"col-sm-offset-3 col-lg-offset-2 col-sm-12\\\" ng-if=\\\"!$ctrl.allowCreate && $ctrl.state.noResult\\\" style=\\\"margin-top: 2px;\\\">\\n <span class=\\\"small text-muted\\\">\\n No tags matching your filter.\\n </span>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import angular from 'angular';\nimport _ from 'lodash-es';\n\nclass TagSelectorController {\n /* @ngInject */\n constructor() {\n this.state = {\n selectedValue: '',\n selectedTags: [],\n noResult: false,\n };\n }\n\n removeTag(tag) {\n _.remove(this.model, (id) => tag.Id === id);\n _.remove(this.state.selectedTags, { Id: tag.Id });\n }\n\n selectTag($item) {\n this.state.selectedValue = '';\n if ($item.create && this.allowCreate) {\n this.onCreate($item.value);\n return;\n }\n this.state.selectedTags.push($item);\n this.model.push($item.Id);\n }\n\n filterTags(searchValue) {\n let filteredTags = _.filter(this.tags, (tag) => !_.includes(this.model, tag.Id));\n if (!searchValue) {\n return filteredTags;\n }\n\n const exactTag = _.find(this.tags, (tag) => tag.Name === searchValue);\n filteredTags = _.filter(filteredTags, (tag) => _.includes(tag.Name.toLowerCase(), searchValue.toLowerCase()));\n if (exactTag || !this.allowCreate) {\n return filteredTags;\n }\n\n return filteredTags.concat({ Name: `Create \"${searchValue}\"`, create: true, value: searchValue });\n }\n\n generateSelectedTags(model, tags) {\n this.state.selectedTags = _.map(model, (id) => _.find(tags, (t) => t.Id === id));\n }\n\n $onInit() {\n this.generateSelectedTags(this.model, this.tags);\n }\n\n $onChanges({ tags, model }) {\n const tagsValue = tags && tags.currentValue ? tags.currentValue : this.tags;\n const modelValue = model && model.currentValue ? model.currentValue : this.model;\n if (modelValue && tagsValue) {\n this.generateSelectedTags(modelValue, tagsValue);\n }\n }\n}\n\nexport default TagSelectorController;\nangular.module('portainer.app').controller('TagSelectorController', TagSelectorController);\n","var path = 'app/portainer/components/template-list/template-item/templateItem.html';\nvar html = \"<!-- template -->\\n<div ng-class=\\\"{ 'blocklist-item--selected': $ctrl.model.Selected }\\\" class=\\\"blocklist-item template-item\\\" ng-click=\\\"$ctrl.onSelect($ctrl.model)\\\">\\n <div class=\\\"blocklist-item-box\\\">\\n <!-- template-image -->\\n <span ng-if=\\\"$ctrl.model.Logo\\\">\\n <img class=\\\"blocklist-item-logo\\\" ng-src=\\\"{{ $ctrl.model.Logo }}\\\" />\\n </span>\\n <span class=\\\"blocklist-item-logo\\\" ng-if=\\\"!$ctrl.model.Logo\\\">\\n <i class=\\\"fa fa-rocket fa-4x blue-icon\\\" aria-hidden=\\\"true\\\"></i>\\n </span>\\n <!-- !template-image -->\\n <!-- template-details -->\\n <div class=\\\"col-sm-12 template-item-details\\\">\\n <!-- blocklist-item-line1 -->\\n <div class=\\\"blocklist-item-line\\\">\\n <span>\\n <span class=\\\"blocklist-item-title\\\">\\n {{ $ctrl.model.Title }}\\n </span>\\n <span class=\\\"space-left blocklist-item-subtitle\\\">\\n <span ng-if=\\\"$ctrl.model.Type != 3\\\">\\n <i class=\\\"fab fa-linux\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.model.Platform === 1 || $ctrl.model.Platform === 'linux' || !$ctrl.model.Platform\\\"></i>\\n <span ng-if=\\\"!$ctrl.model.Platform\\\"> & </span>\\n <i class=\\\"fab fa-windows\\\" aria-hidden=\\\"true\\\" ng-if=\\\"$ctrl.model.Platform === 2 || $ctrl.model.Platform === 'windows' || !$ctrl.model.Platform\\\"></i>\\n </span>\\n <span ng-if=\\\"$ctrl.model.Type === 3\\\">\\n <i class=\\\"fa fa-dharmachakra\\\" aria-hidden=\\\"true\\\"></i>\\n </span>\\n <span>\\n {{ $ctrl.typeLabel }}\\n </span>\\n </span>\\n </span>\\n </div>\\n <!-- !blocklist-item-line1 -->\\n <span class=\\\"blocklist-item-actions\\\" ng-transclude=\\\"actions\\\"></span>\\n <!-- blocklist-item-line2 -->\\n <div class=\\\"blocklist-item-line template-item-details-sub\\\">\\n <span class=\\\"blocklist-item-desc\\\">\\n {{ $ctrl.model.Description }}\\n </span>\\n <span class=\\\"small text-muted\\\" ng-if=\\\"$ctrl.model.Categories.length > 0\\\">\\n {{ $ctrl.model.Categories.join(', ') }}\\n </span>\\n </div>\\n <!-- !blocklist-item-line2 -->\\n </div>\\n <!-- !template-details -->\\n </div>\\n <!-- !template -->\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import _ from 'lodash-es';\n\nangular.module('portainer.app').controller('TemplateListController', TemplateListController);\n\nfunction TemplateListController($async, $state, DatatableService, Notifications, TemplateService) {\n var ctrl = this;\n\n this.state = {\n textFilter: '',\n selectedCategory: '',\n categories: [],\n showContainerTemplates: true,\n };\n\n this.onTextFilterChange = function () {\n DatatableService.setDataTableTextFilters(this.tableKey, this.state.textFilter);\n };\n\n this.updateCategories = function () {\n var availableCategories = [];\n\n for (var i = 0; i < ctrl.templates.length; i++) {\n var template = ctrl.templates[i];\n if ((template.Type === 1 && ctrl.state.showContainerTemplates) || (template.Type === 2 && ctrl.showSwarmStacks) || (template.Type === 3 && !ctrl.showSwarmStacks)) {\n availableCategories = availableCategories.concat(template.Categories);\n }\n }\n\n this.state.categories = _.sortBy(_.uniq(availableCategories));\n };\n\n this.filterByCategory = function (item) {\n if (!ctrl.state.selectedCategory) {\n return true;\n }\n\n return _.includes(item.Categories, ctrl.state.selectedCategory);\n };\n\n this.filterByType = function (item) {\n if ((item.Type === 1 && ctrl.state.showContainerTemplates) || (item.Type === 2 && ctrl.showSwarmStacks) || (item.Type === 3 && !ctrl.showSwarmStacks)) {\n return true;\n }\n return false;\n };\n\n this.duplicateTemplate = duplicateTemplate.bind(this);\n this.duplicateTemplateAsync = duplicateTemplateAsync.bind(this);\n function duplicateTemplate(template) {\n return $async(this.duplicateTemplateAsync, template);\n }\n\n async function duplicateTemplateAsync(template) {\n try {\n const { FileContent: fileContent } = await TemplateService.templateFile(template.Repository.url, template.Repository.stackfile);\n let type = 0;\n if (template.Type === 2) {\n type = 1;\n }\n if (template.Type === 3) {\n type = 2;\n }\n $state.go('docker.templates.custom.new', { fileContent, type });\n } catch (err) {\n Notifications.error('Failure', err, 'Failed to duplicate template');\n }\n }\n\n this.$onInit = function () {\n if (this.showSwarmStacks) {\n this.state.showContainerTemplates = false;\n }\n this.updateCategories();\n\n var textFilter = DatatableService.getDataTableTextFilters(this.tableKey);\n if (textFilter !== null) {\n this.state.textFilter = textFilter;\n }\n };\n}\n","const autoNgTemplateLoaderTemplate1 = require('./templateList.html');\n\nangular.module('portainer.app').component('templateList', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'TemplateListController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n templates: '<',\n tableKey: '@',\n selectAction: '<',\n showSwarmStacks: '<',\n },\n});\n","var path = 'app/portainer/components/template-list/templateList.html';\nvar html = \"<div class=\\\"datatable\\\">\\n <rd-widget>\\n <rd-widget-body classes=\\\"no-padding\\\">\\n <div class=\\\"toolBar\\\">\\n <div class=\\\"toolBarTitle\\\"> <i class=\\\"fa\\\" ng-class=\\\"$ctrl.titleIcon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i> {{ $ctrl.titleText }} </div>\\n </div>\\n\\n <div class=\\\"actionBar\\\">\\n <div>\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ui-sref=\\\"docker.templates.new\\\" ng-if=\\\"$ctrl.showAddAction\\\">\\n <i class=\\\"fa fa-plus space-right\\\" aria-hidden=\\\"true\\\"></i>Add template\\n </button>\\n <span ng-class=\\\"{ 'pull-right': $ctrl.showAddAction }\\\" style=\\\"width: 25%;\\\">\\n <ui-select ng-model=\\\"$ctrl.state.selectedCategory\\\">\\n <ui-select-match placeholder=\\\"Select a category\\\" allow-clear=\\\"true\\\">\\n <span>{{ $select.selected }}</span>\\n </ui-select-match>\\n <ui-select-choices repeat=\\\"category in ($ctrl.state.categories | filter: $select.search)\\\">\\n <span>{{ category }}</span>\\n </ui-select-choices>\\n </ui-select>\\n </span>\\n </div>\\n\\n <div class=\\\"small text-muted\\\" style=\\\"margin: 15px 0 0 5px;\\\">\\n <label for=\\\"show_stacks\\\" class=\\\"control-label text-left\\\">\\n Show container templates\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\">\\n <input type=\\\"checkbox\\\" name=\\\"show_stacks\\\" ng-model=\\\"$ctrl.state.showContainerTemplates\\\" ng-change=\\\"$ctrl.updateCategories()\\\" /><i></i>\\n </label>\\n </div>\\n </div>\\n\\n <div class=\\\"searchBar\\\">\\n <i class=\\\"fa fa-search searchIcon\\\" aria-hidden=\\\"true\\\"></i>\\n <input\\n type=\\\"text\\\"\\n class=\\\"searchInput\\\"\\n ng-model=\\\"$ctrl.state.textFilter\\\"\\n ng-change=\\\"$ctrl.onTextFilterChange()\\\"\\n placeholder=\\\"Search...\\\"\\n auto-focus\\n ng-model-options=\\\"{ debounce: 300 }\\\"\\n />\\n </div>\\n\\n <div class=\\\"blocklist\\\">\\n <template-item\\n ng-repeat=\\\"template in $ctrl.templates | filter: $ctrl.filterByType | filter:$ctrl.filterByCategory | filter:$ctrl.state.textFilter\\\"\\n model=\\\"template\\\"\\n type-label=\\\"{{ template.Type === 1 ? 'container' : 'stack' }}\\\"\\n on-select=\\\"($ctrl.selectAction)\\\"\\n >\\n <template-item-actions ng-if=\\\"template.Type === 2 || template.Type === 3\\\">\\n <button ng-click=\\\"$event.stopPropagation(); $ctrl.duplicateTemplate(template)\\\" class=\\\"btn btn-primary btn-xs\\\">\\n Copy as Custom\\n </button>\\n </template-item-actions>\\n </template-item>\\n <div ng-if=\\\"!$ctrl.templates\\\" class=\\\"text-center text-muted\\\">\\n Loading...\\n </div>\\n <div ng-if=\\\"($ctrl.templates | filter: $ctrl.filterByType | filter: $ctrl.filterByCategory | filter: $ctrl.state.textFilter).length === 0\\\" class=\\\"text-center text-muted\\\">\\n No templates available.\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","angular.module('portainer.app').directive('rdTemplateWidget', function rdWidget() {\n var directive = {\n scope: {\n ngModel: '=',\n },\n transclude: true,\n template: '<div class=\"widget template-widget\" id=\"template-widget\" ng-transclude></div>',\n restrict: 'EA',\n };\n return directive;\n});\n","const autoNgTemplateLoaderTemplate1 = require('./theme-settings.html');\n\nimport angular from 'angular';\nimport controller from './theme-settings.controller';\n\nangular.module('portainer.app').component('themeSettings', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n});\n","var path = 'app/portainer/components/theme/theme-settings.html';\nvar html = \"<information-panel class=\\\"theme-information\\\" title-text=\\\"Information\\\">\\n <span class=\\\"small text-muted\\\">\\n <p>\\n <i class=\\\"fa fa-flask orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Dark and High-contrast theme are experimental. Some UI components might not display properly.\\n </p>\\n </span>\\n</information-panel>\\n<rd-widget>\\n <rd-widget-header icon=\\\"fa-palette\\\" title-text=\\\"Change user theme\\\"></rd-widget-header>\\n <rd-widget-body>\\n <form class=\\\"theme-panel\\\">\\n <!-- Theme -->\\n <box-selector radio-name=\\\"theme\\\" ng-model=\\\"$ctrl.state.userTheme\\\" options=\\\"$ctrl.state.availableThemes\\\" on-change=\\\"($ctrl.setTheme)\\\"></box-selector>\\n <button ng-click=\\\"$ctrl.updateTheme()\\\" class=\\\"btn btn-primary btn-sm\\\">Update theme</button>\\n <!-- !Theme -->\\n </form>\\n </rd-widget-body>\\n</rd-widget>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import angular from 'angular';\nimport _ from 'lodash-es';\n\nimport {\n arrayToStr,\n endpointStatusBadge,\n endpointTypeIcon,\n endpointTypeName,\n getPairKey,\n getPairValue,\n humanize,\n ipAddress,\n isoDate,\n isoDateFromTimestamp,\n labelsToStr,\n ownershipIcon,\n stripProtocol,\n truncate,\n truncateLeftRight,\n} from './filters';\n\nangular\n .module('portainer.app')\n .filter('truncate', () => truncate)\n .filter('truncatelr', () => truncateLeftRight)\n .filter('capitalize', () => _.capitalize)\n .filter('stripprotocol', () => stripProtocol)\n .filter('humansize', () => humanize)\n .filter('getisodatefromtimestamp', () => isoDateFromTimestamp)\n .filter('getisodate', () => isoDate)\n .filter('key', () => getPairKey)\n .filter('value', () => getPairValue)\n .filter('emptyobject', () => _.isEmpty)\n .filter('ipaddress', () => ipAddress)\n .filter('arraytostr', () => arrayToStr)\n .filter('labelsToStr', () => labelsToStr)\n .filter('endpointtypename', () => endpointTypeName)\n .filter('endpointtypeicon', () => endpointTypeIcon)\n .filter('ownershipicon', () => ownershipIcon)\n .filter('endpointstatusbadge', () => endpointStatusBadge);\n","angular.module('portainer.app').factory('FormHelper', [\n function FormHelperFactory() {\n 'use strict';\n var helper = {};\n\n helper.removeInvalidEnvVars = function (env) {\n for (var i = env.length - 1; i >= 0; i--) {\n var envvar = env[i];\n if (!envvar.value || !envvar.name) {\n env.splice(i, 1);\n }\n }\n\n return env;\n };\n\n return helper;\n },\n]);\n","import _ from 'lodash-es';\nimport angular from 'angular';\n\nclass NetworkHelper {\n /* @ngInject */\n constructor(PREDEFINED_NETWORKS) {\n this.PREDEFINED_NETWORKS = PREDEFINED_NETWORKS;\n }\n\n isSystemNetwork(item) {\n return _.includes(this.PREDEFINED_NETWORKS, item.Name);\n }\n}\n\nexport default NetworkHelper;\nangular.module('portainer.app').service('NetworkHelper', NetworkHelper);\n","import _ from 'lodash-es';\nimport angular from 'angular';\nimport { ResourceControlOwnership as RCO } from 'Portainer/models/resourceControl/resourceControlOwnership';\nimport { ResourceControlOwnershipParameters } from '../models/resourceControl/resourceControlOwnershipParameters';\n\nclass ResourceControlHelper {\n /**\n * Transform ResourceControlViewModel to ResourceControlOwnershipParameters\n * @param {int} userId ID of User performing the action\n * @param {ResourceControlViewModel} resourceControl ResourceControl view model\n */\n RCViewModelToOwnershipParameters(userId, resourceControl) {\n if (!resourceControl) {\n return new ResourceControlOwnershipParameters(true);\n }\n let adminOnly = false;\n let publicOnly = false;\n let users = [];\n let teams = [];\n switch (resourceControl.Ownership) {\n case RCO.PUBLIC:\n publicOnly = true;\n break;\n case RCO.PRIVATE:\n users = [userId];\n break;\n case RCO.RESTRICTED:\n users = _.map(resourceControl.UserAccesses, (user) => user.UserId);\n teams = _.map(resourceControl.TeamAccesses, (team) => team.TeamId);\n break;\n default:\n adminOnly = true;\n break;\n }\n return new ResourceControlOwnershipParameters(adminOnly, publicOnly, users, teams);\n }\n\n /**\n * Transform AccessControlFormData to ResourceControlOwnershipParameters\n * @param {int} userId ID of user performing the operation\n * @param {AccessControlFormData} formValues Form data (generated by AccessControlForm)\n * @param {int[]} subResources Sub Resources restricted by the ResourceControl\n */\n RCFormDataToOwnershipParameters(userId, formValues, subResources = []) {\n if (!formValues.AccessControlEnabled) {\n formValues.Ownership = RCO.PUBLIC;\n }\n\n let adminOnly = false;\n let publicOnly = false;\n let users = [];\n let teams = [];\n switch (formValues.Ownership) {\n case RCO.PUBLIC:\n publicOnly = true;\n break;\n case RCO.PRIVATE:\n users.push(userId);\n break;\n case RCO.RESTRICTED:\n users = _.map(formValues.AuthorizedUsers, (user) => user.Id);\n teams = _.map(formValues.AuthorizedTeams, (team) => team.Id);\n break;\n default:\n adminOnly = true;\n break;\n }\n return new ResourceControlOwnershipParameters(adminOnly, publicOnly, users, teams, subResources);\n }\n\n /**\n * Transform AccessControlPanelData to ResourceControlOwnershipParameters\n * @param {AccessControlPanelData} formValues Form data (generated by AccessControlPanel)\n */\n RCPanelDataToOwnershipParameters(formValues) {\n const adminOnly = formValues.Ownership === RCO.ADMINISTRATORS;\n const publicOnly = formValues.Ownership === RCO.PUBLIC;\n const userIds = publicOnly || adminOnly ? [] : _.map(formValues.Ownership_Users, (user) => user.Id);\n const teamIds = publicOnly || adminOnly ? [] : _.map(formValues.Ownership_Teams, (team) => team.Id);\n\n return new ResourceControlOwnershipParameters(adminOnly, publicOnly, userIds, teamIds);\n }\n\n retrieveAuthorizedUsers(resourceControl, users) {\n const authorizedUsers = [];\n _.forEach(resourceControl.UserAccesses, (access) => {\n const user = _.find(users, { Id: access.UserId });\n if (user) {\n authorizedUsers.push(user);\n }\n });\n return authorizedUsers;\n }\n\n retrieveAuthorizedTeams(resourceControl, teams) {\n const authorizedTeams = [];\n _.forEach(resourceControl.TeamAccesses, (access) => {\n const team = _.find(teams, { Id: access.TeamId });\n if (team) {\n authorizedTeams.push(team);\n }\n });\n return authorizedTeams;\n }\n\n isLeaderOfAnyRestrictedTeams(userMemberships, resourceControl) {\n let isTeamLeader = false;\n _.forEach(userMemberships, (membership) => {\n const found = _.find(resourceControl.TeamAccesses, { TeamId: membership.TeamId });\n if (found && membership.Role === 1) {\n isTeamLeader = true;\n return false;\n }\n });\n return isTeamLeader;\n }\n}\n\nexport default ResourceControlHelper;\nangular.module('portainer.app').service('ResourceControlHelper', ResourceControlHelper);\n","import _ from 'lodash-es';\nimport YAML from 'yaml';\nimport GenericHelper from '@/portainer/helpers/genericHelper';\nimport { ExternalStackViewModel } from '@/portainer/models/stack';\n\nangular.module('portainer.app').factory('StackHelper', [\n function StackHelperFactory() {\n 'use strict';\n var helper = {};\n\n helper.getExternalStacksFromContainers = function (containers) {\n return getExternalStacksFromLabel(containers, 'com.docker.compose.project', 2);\n };\n\n helper.getExternalStacksFromServices = function (services) {\n return getExternalStacksFromLabel(services, 'com.docker.stack.namespace', 1);\n };\n\n function getExternalStacksFromLabel(items, label, type) {\n return _.uniqBy(\n items.filter((item) => item.Labels && item.Labels[label]).map((item) => new ExternalStackViewModel(item.Labels[label], type, item.Created)),\n 'Name'\n );\n }\n\n helper.validateYAML = function (yaml, containerNames) {\n let yamlObject;\n\n try {\n yamlObject = YAML.parse(yaml);\n } catch (err) {\n return 'There is an error in the yaml syntax: ' + err;\n }\n\n const names = _.uniq(GenericHelper.findDeepAll(yamlObject, 'container_name'));\n const duplicateContainers = _.intersection(containerNames, names);\n\n if (duplicateContainers.length === 0) return;\n\n return (\n (duplicateContainers.length === 1 ? 'This container name is' : 'These container names are') +\n ' already used by another container running in this environment: ' +\n _.join(duplicateContainers, ', ') +\n '.'\n );\n };\n\n return helper;\n },\n]);\n","import _ from 'lodash-es';\n\nangular.module('portainer.app').factory('TemplateHelper', [\n function TemplateHelperFactory() {\n 'use strict';\n var helper = {};\n\n helper.getDefaultContainerConfiguration = function () {\n return {\n Env: [],\n OpenStdin: false,\n Tty: false,\n ExposedPorts: {},\n HostConfig: {\n RestartPolicy: {\n Name: 'no',\n },\n PortBindings: {},\n Binds: [],\n Privileged: false,\n ExtraHosts: [],\n },\n Volumes: {},\n Labels: {},\n };\n };\n\n helper.portArrayToPortConfiguration = function (ports) {\n var portConfiguration = {\n bindings: {},\n exposedPorts: {},\n };\n ports.forEach(function (p) {\n if (p.containerPort) {\n var key = p.containerPort + '/' + p.protocol;\n var binding = {};\n if (p.hostPort) {\n binding.HostPort = p.hostPort;\n if (p.hostPort.indexOf(':') > -1) {\n var hostAndPort = p.hostPort.split(':');\n binding.HostIp = hostAndPort[0];\n binding.HostPort = hostAndPort[1];\n }\n }\n portConfiguration.bindings[key] = [binding];\n portConfiguration.exposedPorts[key] = {};\n }\n });\n return portConfiguration;\n };\n\n helper.updateContainerConfigurationWithLabels = function (labelsArray) {\n var labels = {};\n labelsArray.forEach(function (l) {\n if (l.name) {\n if (l.value) {\n labels[l.name] = l.value;\n } else {\n labels[l.name] = '';\n }\n }\n });\n return labels;\n };\n\n helper.EnvToStringArray = function (templateEnvironment) {\n var env = [];\n templateEnvironment.forEach(function (envvar) {\n if (envvar.value || envvar.set) {\n var value = envvar.set ? envvar.set : envvar.value;\n env.push(envvar.name + '=' + value);\n }\n });\n return env;\n };\n\n helper.getConsoleConfiguration = function (interactiveFlag) {\n var consoleConfiguration = {\n openStdin: false,\n tty: false,\n };\n if (interactiveFlag === true) {\n consoleConfiguration.openStdin = true;\n consoleConfiguration.tty = true;\n }\n return consoleConfiguration;\n };\n\n helper.createVolumeBindings = function (volumes, generatedVolumesPile) {\n volumes.forEach(function (volume) {\n if (volume.container) {\n var binding;\n if (volume.type === 'auto') {\n binding = generatedVolumesPile.pop().Id + ':' + volume.container;\n } else if (volume.type !== 'auto' && volume.bind) {\n binding = volume.bind + ':' + volume.container;\n }\n if (volume.readonly) {\n binding += ':ro';\n }\n volume.binding = binding;\n }\n });\n };\n\n helper.determineRequiredGeneratedVolumeCount = function (volumes) {\n var count = 0;\n volumes.forEach(function (volume) {\n if (volume.type === 'auto') {\n ++count;\n }\n });\n return count;\n };\n\n helper.getUniqueCategories = function (templates) {\n var categories = [];\n for (var i = 0; i < templates.length; i++) {\n var template = templates[i];\n categories = categories.concat(template.Categories);\n }\n return _.uniq(categories);\n };\n\n return helper;\n },\n]);\n","angular.module('portainer.app').factory('URLHelper', [\n '$window',\n function URLHelperFactory($window) {\n 'use strict';\n var helper = {};\n\n helper.getParameter = getParameter;\n helper.cleanParameters = cleanParameters;\n\n function getParameter(param) {\n var parameters = extractParameters();\n return parameters[param];\n }\n\n function extractParameters() {\n var queryString = $window.location.search.replace(/.*?\\?/, '').split('&');\n return queryString.reduce(function (acc, keyValStr) {\n var keyVal = keyValStr.split('=');\n var key = keyVal[0];\n var val = keyVal[1];\n acc[key] = val;\n return acc;\n }, {});\n }\n\n function cleanParameters() {\n $window.location.replace($window.location.origin + $window.location.pathname + $window.location.hash);\n }\n\n return helper;\n },\n]);\n","angular.module('portainer.app').factory('UserHelper', [\n function UserHelperFactory() {\n 'use strict';\n var helper = {};\n\n helper.filterNonAdministratorUsers = function (users) {\n return users.filter(function (user) {\n if (user.Role !== 1) {\n return user;\n }\n });\n };\n\n return helper;\n },\n]);\n","angular.module('portainer.app').factory('WebhookHelper', [\n '$location',\n 'API_ENDPOINT_WEBHOOKS',\n 'API_ENDPOINT_STACKS',\n function WebhookHelperFactory($location, API_ENDPOINT_WEBHOOKS, API_ENDPOINT_STACKS) {\n 'use strict';\n\n var helper = {};\n const protocol = $location.protocol().toLowerCase();\n const port = $location.port();\n const displayPort = (protocol === 'http' && port === 80) || (protocol === 'https' && port === 443) ? '' : ':' + port;\n\n helper.returnWebhookUrl = function (token) {\n return `${protocol}://${$location.host()}${displayPort}/${API_ENDPOINT_WEBHOOKS}/${token}`;\n };\n\n helper.returnStackWebhookUrl = function (token) {\n return `${protocol}://${$location.host()}${displayPort}/${API_ENDPOINT_STACKS}/webhooks/${token}`;\n };\n\n return helper;\n },\n]);\n","import _ from 'lodash-es';\n\nangular.module('portainer.app').factory('EndpointStatusInterceptor', [\n '$q',\n 'EndpointProvider',\n function ($q, EndpointProvider) {\n 'use strict';\n var interceptor = {};\n\n interceptor.response = responseInterceptor;\n interceptor.responseError = responseErrorInterceptor;\n\n function canBeOffline(url) {\n return (\n _.startsWith(url, 'api/') &&\n (_.includes(url, '/containers') ||\n _.includes(url, '/images') ||\n _.includes(url, '/volumes') ||\n _.includes(url, '/networks') ||\n _.includes(url, '/info') ||\n _.includes(url, '/version'))\n );\n }\n\n function responseInterceptor(response) {\n var url = response.config.url;\n if (response.status === 200 && canBeOffline(url) && EndpointProvider.offlineMode()) {\n EndpointProvider.setOfflineMode(false);\n }\n return response || $q.when(response);\n }\n\n function responseErrorInterceptor(rejection) {\n var url = rejection.config.url;\n if ((rejection.status === 502 || rejection.status === 503 || rejection.status === -1) && canBeOffline(url) && !EndpointProvider.offlineMode()) {\n EndpointProvider.setOfflineMode(true);\n }\n return $q.reject(rejection);\n }\n\n return interceptor;\n },\n]);\n","/**\n * Payload for resourceControleCreate operation\n * @param {string} resourceId ID of involved Resource\n * @param {ResourceControlResourceType} resourceType Type of involved Resource\n * @param {ResourceControlOwnershipParameters} data Transcient type from view data to payload\n */\nexport function ResourceControlCreatePayload(resourceId, resourceType, data) {\n void data;\n\n this.ResourceID = resourceId;\n this.Type = resourceType;\n this.Public = data.Public;\n this.AdministratorsOnly = data.AdministratorsOnly;\n this.Users = data.Users;\n this.Teams = data.Teams;\n this.SubResourceIDs = data.SubResourceIDs;\n}\n","/**\n * Payload for resourceControlUpdate operation\n * @param {ResourceControlOwnershipParameters} data\n */\nexport function ResourceControlUpdatePayload(data) {\n this.Public = data.Public;\n this.AdministratorsOnly = data.AdministratorsOnly;\n this.Users = data.Users;\n this.Teams = data.Teams;\n}\n","angular.module('portainer.oauth', ['ngResource']).constant('API_ENDPOINT_OAUTH', 'api/auth/oauth');\n","const autoNgTemplateLoaderTemplate1 = require('./oauth-providers-selector.html');\n\nimport angular from 'angular';\nimport controller from './oauth-provider-selector.controller';\n\nangular.module('portainer.oauth').component('oauthProvidersSelector', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n onChange: '<',\n value: '<',\n },\n controller,\n});\n","var path = 'app/portainer/oauth/components/oauth-providers-selector/oauth-providers-selector.html';\nvar html = \"<div class=\\\"col-sm-12 form-section-title\\\">\\n Provider\\n</div>\\n\\n<box-selector ng-model=\\\"$ctrl.value\\\" options=\\\"$ctrl.options\\\" on-change=\\\"($ctrl.onChange)\\\" radio-name=\\\"oauth_provider\\\"></box-selector>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./oauth-settings.html');\n\nimport angular from 'angular';\nimport controller from './oauth-settings.controller';\n\nangular.module('portainer.oauth').component('oauthSettings', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n settings: '=',\n teams: '<',\n onSaveSettings: '<',\n saveButtonState: '<',\n },\n controller,\n});\n","var path = 'app/portainer/oauth/components/oauth-settings/oauth-settings.html';\nvar html = \"<ng-form name=\\\"oauthSettingsForm\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Single Sign-On\\n </div>\\n\\n <!-- SSO -->\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <por-switch-field\\n label=\\\"Use SSO\\\"\\n tooltip=\\\"When using SSO the OAuth provider is not forced to prompt for credentials.\\\"\\n name=\\\"use-sso\\\"\\n ng-model=\\\"$ctrl.settings.SSO\\\"\\n on-change=\\\"$ctrl.updateSSO()\\\"\\n ></por-switch-field>\\n </div>\\n </div>\\n <!-- !SSO -->\\n\\n <!-- HideInternalAuth -->\\n <div class=\\\"form-group\\\" ng-if=\\\"$ctrl.settings.SSO\\\">\\n <div class=\\\"col-sm-12\\\">\\n <por-switch-field\\n label=\\\"Hide internal authentication prompt\\\"\\n name=\\\"hide-internal-auth\\\"\\n feature=\\\"$ctrl.limitedFeature\\\"\\n ng-model=\\\"$ctrl.settings.HideInternalAuth\\\"\\n ></por-switch-field>\\n </div>\\n </div>\\n <!-- !HideInternalAuth -->\\n\\n <auto-user-provision-toggle ng-model=\\\"$ctrl.settings.OAuthAutoCreateUsers\\\">\\n <field-description>\\n With automatic user provisioning enabled, Portainer will create user(s) automatically with the standard user role. If disabled, users must be created beforehand in Portainer\\n in order to login.\\n </field-description>\\n </auto-user-provision-toggle>\\n\\n <div ng-if=\\\"$ctrl.settings.OAuthAutoCreateUsers\\\">\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n <p>The users created by the automatic provisioning feature can be added to a default team on creation.</p>\\n <p>\\n By assigning newly created users to a team, they will be able to access the environments associated to that team. This setting is optional and if not set, newly created\\n users won't be able to access any environments.\\n </p>\\n </span>\\n </div>\\n <div class=\\\"form-group\\\">\\n <label class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Default team</label>\\n <span class=\\\"small text-muted\\\" style=\\\"margin-left: 20px;\\\" ng-if=\\\"$ctrl.teams.length === 0\\\">\\n You have not yet created any teams. Head over to the <a ui-sref=\\\"portainer.teams\\\">Teams view</a> to manage teams.\\n </span>\\n\\n <div class=\\\"col-sm-9\\\" ng-if=\\\"$ctrl.teams.length > 0\\\">\\n <div class=\\\"col-sm-12 small text-muted\\\">\\n <p>\\n <i class=\\\"fa fa-info-circle blue-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n The default team option will be disabled when automatic team membership is enabled\\n </p>\\n </div>\\n <div class=\\\"col-xs-11\\\">\\n <select\\n class=\\\"form-control\\\"\\n ng-disabled=\\\"$ctrl.settings.OAuthAutoMapTeamMemberships\\\"\\n ng-model=\\\"$ctrl.settings.DefaultTeamID\\\"\\n ng-options=\\\"team.Id as team.Name for team in $ctrl.teams\\\"\\n >\\n <option value=\\\"\\\">No team</option>\\n </select>\\n </div>\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-sm btn-danger\\\"\\n ng-click=\\\"$ctrl.settings.DefaultTeamID = null\\\"\\n ng-disabled=\\\"!$ctrl.settings.DefaultTeamID || $ctrl.settings.OAuthAutoMapTeamMemberships\\\"\\n ng-if=\\\"$ctrl.teams.length > 0\\\"\\n >\\n <i class=\\\"fa fa-times\\\" aria-hidden=\\\"true\\\"> </i\\n ></button>\\n </div>\\n </div>\\n </div>\\n\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Team membership\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12 text-muted small\\\">\\n Automatic team membership synchronizes the team membership based on a custom claim in the token from the OAuth provider.\\n </div>\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <por-switch-field label=\\\"Automatic team membership\\\" name=\\\"tls\\\" feature=\\\"$ctrl.limitedFeature\\\" ng-model=\\\"$ctrl.settings.OAuthAutoMapTeamMemberships\\\"></por-switch-field>\\n </div>\\n </div>\\n\\n <div ng-if=\\\"$ctrl.settings.OAuthAutoMapTeamMemberships\\\">\\n <div class=\\\"form-group\\\">\\n <label class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Claim name\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"The OpenID Connect UserInfo Claim name that contains the team identifier the user belongs to.\\\"></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <div class=\\\"col-xs-11 col-lg-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"oauth_token_claim_name\\\" ng-model=\\\"$ctrl.settings.TeamMemberships.OAuthClaimName\\\" placeholder=\\\"groups\\\" />\\n </div>\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <label class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Statically assigned teams\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <span class=\\\"label label-default interactive\\\" style=\\\"margin-left: 1.4em;\\\" ng-click=\\\"$ctrl.addTeamMembershipMapping()\\\">\\n <i class=\\\"fa fa-plus-circle\\\" aria-hidden=\\\"true\\\"></i> add team mapping\\n </span>\\n\\n <div class=\\\"col-sm-12 form-inline\\\" ng-repeat=\\\"mapping in $ctrl.settings.TeamMemberships.OAuthClaimMappings\\\" style=\\\"margin-top: 0.75em;\\\">\\n <div class=\\\"input-group input-group-sm col-sm-5\\\">\\n <span class=\\\"input-group-addon\\\">claim value regex</span>\\n <input type=\\\"text\\\" class=\\\"form-control\\\" ng-model=\\\"mapping.ClaimValRegex\\\" />\\n </div>\\n <span style=\\\"margin: 0px 0.5em;\\\">maps to</span>\\n <div class=\\\"input-group input-group-sm col-sm-3 col-lg-4\\\">\\n <span class=\\\"input-group-addon\\\">team</span>\\n <select\\n class=\\\"form-control\\\"\\n ng-init=\\\"mapping.Team = mapping.Team || $ctrl.settings.DefaultTeamID\\\"\\n ng-model=\\\"mapping.Team\\\"\\n ng-options=\\\"team.Id as team.Name for team in $ctrl.teams\\\"\\n >\\n <option selected value=\\\"\\\">Select a team</option>\\n </select>\\n </div>\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-danger\\\" ng-click=\\\"$ctrl.removeTeamMembership($index)\\\"> <i class=\\\"fa fa-trash\\\" aria-hidden=\\\"true\\\"> </i></button>\\n\\n <div class=\\\"small text-warning\\\" ng-show=\\\"!mapping.ClaimValRegex\\\" style=\\\"margin-top: 0.4em;\\\">\\n <i class=\\\"fa fa-exclamation-triangle\\\" aria-hidden=\\\"true\\\"></i> Claim value regex is required.\\n </div>\\n </div>\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12 text-muted small\\\" style=\\\"margin-bottom: 0.5em;\\\">\\n The default team will be assigned when the user does not belong to any other team\\n </div>\\n <label class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Default team</label>\\n <span class=\\\"small text-muted\\\" style=\\\"margin-left: 20px;\\\" ng-if=\\\"$ctrl.teams.length === 0\\\">\\n You have not yet created any teams. Head over to the <a ui-sref=\\\"portainer.teams\\\">Teams view</a> to manage teams.\\n </span>\\n\\n <div class=\\\"col-sm-9\\\" ng-if=\\\"$ctrl.teams.length > 0\\\">\\n <div class=\\\"col-xs-11\\\">\\n <select class=\\\"form-control\\\" ng-model=\\\"$ctrl.settings.DefaultTeamID\\\" ng-options=\\\"team.Id as team.Name for team in $ctrl.teams\\\">\\n <option value=\\\"\\\">No team</option>\\n </select>\\n </div>\\n </div>\\n </div>\\n </div>\\n\\n <oauth-providers-selector on-change=\\\"($ctrl.onSelectProvider)\\\" value=\\\"$ctrl.state.provider\\\"></oauth-providers-selector>\\n\\n <div class=\\\"col-sm-12 form-section-title\\\">OAuth Configuration</div>\\n\\n <div class=\\\"form-group\\\" ng-if=\\\"$ctrl.state.provider == 'microsoft'\\\">\\n <label for=\\\"oauth_microsoft_tenant_id\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Tenant ID\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"ID of the Azure Directory you wish to authenticate against. Also known as the Directory ID\\\"></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n id=\\\"oauth_microsoft_tenant_id\\\"\\n placeholder=\\\"xxxxxxxxxxxxxxxxxxxx\\\"\\n ng-model=\\\"$ctrl.state.microsoftTenantID\\\"\\n ng-change=\\\"$ctrl.onMicrosoftTenantIDChange()\\\"\\n limited-feature-dir=\\\"{{::$ctrl.limitedFeature}}\\\"\\n limited-feature-class=\\\"limited-be\\\"\\n limited-feature-disabled\\n limited-feature-tabindex=\\\"-1\\\"\\n required\\n />\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <label for=\\\"oauth_client_id\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n {{ $ctrl.state.provider == 'microsoft' ? 'Application ID' : 'Client ID' }}\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"Public identifier of the OAuth application\\\"></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input\\n type=\\\"text\\\"\\n id=\\\"oauth_client_id\\\"\\n ng-model=\\\"$ctrl.settings.ClientID\\\"\\n placeholder=\\\"xxxxxxxxxxxxxxxxxxxx\\\"\\n ng-class=\\\"['form-control', { 'limited-be': $ctrl.isLimitedToBE && $ctrl.state.provider !== 'custom' }]\\\"\\n ng-disabled=\\\"$ctrl.isLimitedToBE && $ctrl.state.provider !== 'custom'\\\"\\n tabindex=\\\"{{ $ctrl.isLimitedToBE && $ctrl.state.provider !== 'custom' ? -1 : 0 }}\\\"\\n />\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <label for=\\\"oauth_client_secret\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n {{ $ctrl.state.provider == 'microsoft' ? 'Application key' : 'Client secret' }}\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input\\n type=\\\"password\\\"\\n class=\\\"form-control\\\"\\n id=\\\"oauth_client_secret\\\"\\n ng-model=\\\"$ctrl.settings.ClientSecret\\\"\\n placeholder=\\\"xxxxxxxxxxxxxxxxxxxx\\\"\\n autocomplete=\\\"new-password\\\"\\n ng-class=\\\"['form-control', { 'limited-be': $ctrl.isLimitedToBE && $ctrl.state.provider !== 'custom' }]\\\"\\n ng-disabled=\\\"$ctrl.isLimitedToBE && $ctrl.state.provider !== 'custom'\\\"\\n tabindex=\\\"{{ $ctrl.isLimitedToBE && $ctrl.state.provider !== 'custom' ? -1 : 0 }}\\\"\\n />\\n </div>\\n </div>\\n\\n <div ng-if=\\\"$ctrl.state.provider == 'custom' || $ctrl.state.overrideConfiguration\\\">\\n <div class=\\\"form-group\\\">\\n <label for=\\\"oauth_authorization_uri\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Authorization URL\\n <portainer-tooltip\\n position=\\\"bottom\\\"\\n message=\\\"URL used to authenticate against the OAuth provider. Will redirect the user to the OAuth provider login view\\\"\\n ></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n id=\\\"oauth_authorization_uri\\\"\\n ng-model=\\\"$ctrl.settings.AuthorizationURI\\\"\\n placeholder=\\\"https://example.com/oauth/authorize\\\"\\n ng-class=\\\"['form-control', { 'limited-be': $ctrl.isLimitedToBE && $ctrl.state.provider !== 'custom' }]\\\"\\n ng-disabled=\\\"$ctrl.isLimitedToBE && $ctrl.state.provider !== 'custom'\\\"\\n />\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <label for=\\\"oauth_access_token_uri\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Access token URL\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"URL used by Portainer to exchange a valid OAuth authentication code for an access token\\\"></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n id=\\\"oauth_access_token_uri\\\"\\n ng-model=\\\"$ctrl.settings.AccessTokenURI\\\"\\n placeholder=\\\"https://example.com/oauth/token\\\"\\n ng-class=\\\"['form-control', { 'limited-be': $ctrl.isLimitedToBE && $ctrl.state.provider !== 'custom' }]\\\"\\n ng-disabled=\\\"$ctrl.isLimitedToBE && $ctrl.state.provider !== 'custom'\\\"\\n />\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <label for=\\\"oauth_resource_uri\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Resource URL\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"URL used by Portainer to retrieve information about the authenticated user\\\"></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n id=\\\"oauth_resource_uri\\\"\\n ng-model=\\\"$ctrl.settings.ResourceURI\\\"\\n placeholder=\\\"https://example.com/user\\\"\\n ng-class=\\\"['form-control', { 'limited-be': $ctrl.isLimitedToBE && $ctrl.state.provider !== 'custom' }]\\\"\\n ng-disabled=\\\"$ctrl.isLimitedToBE && $ctrl.state.provider !== 'custom'\\\"\\n />\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <label for=\\\"oauth_redirect_uri\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Redirect URL\\n <portainer-tooltip\\n position=\\\"bottom\\\"\\n message=\\\"URL used by the OAuth provider to redirect the user after successful authentication. Should be set to your Portainer instance URL\\\"\\n ></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n id=\\\"oauth_redirect_uri\\\"\\n ng-model=\\\"$ctrl.settings.RedirectURI\\\"\\n placeholder=\\\"http://yourportainer.com/\\\"\\n ng-class=\\\"['form-control', { 'limited-be': $ctrl.isLimitedToBE && $ctrl.state.provider !== 'custom' }]\\\"\\n ng-disabled=\\\"$ctrl.isLimitedToBE && $ctrl.state.provider !== 'custom'\\\"\\n />\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <label for=\\\"oauth_logout_url\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Logout URL\\n <portainer-tooltip\\n position=\\\"bottom\\\"\\n message=\\\"URL used by Portainer to redirect the user to the OAuth provider in order to log the user out of the identity provider session.\\\"\\n ></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n id=\\\"oauth_logout_url\\\"\\n ng-model=\\\"$ctrl.settings.LogoutURI\\\"\\n ng-class=\\\"['form-control', { 'limited-be': $ctrl.isLimitedToBE && $ctrl.state.provider !== 'custom' }]\\\"\\n ng-disabled=\\\"$ctrl.isLimitedToBE && $ctrl.state.provider !== 'custom'\\\"\\n />\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <label for=\\\"oauth_user_identifier\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n User identifier\\n <portainer-tooltip\\n position=\\\"bottom\\\"\\n message=\\\"Identifier that will be used by Portainer to create an account for the authenticated user. Retrieved from the resource server specified via the Resource URL field\\\"\\n ></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n id=\\\"oauth_user_identifier\\\"\\n ng-model=\\\"$ctrl.settings.UserIdentifier\\\"\\n placeholder=\\\"id\\\"\\n ng-class=\\\"['form-control', { 'limited-be': $ctrl.isLimitedToBE && $ctrl.state.provider !== 'custom' }]\\\"\\n ng-disabled=\\\"$ctrl.isLimitedToBE && $ctrl.state.provider !== 'custom'\\\"\\n />\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <label for=\\\"oauth_scopes\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Scopes\\n <portainer-tooltip\\n position=\\\"bottom\\\"\\n message=\\\"Scopes required by the OAuth provider to retrieve information about the authenticated user. Refer to your OAuth provider documentation for more information about this\\\"\\n ></portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n id=\\\"oauth_scopes\\\"\\n ng-model=\\\"$ctrl.settings.Scopes\\\"\\n placeholder=\\\"id,email,name\\\"\\n ng-class=\\\"['form-control', { 'limited-be': $ctrl.isLimitedToBE && $ctrl.state.provider !== 'custom' }]\\\"\\n ng-disabled=\\\"$ctrl.isLimitedToBE && $ctrl.state.provider !== 'custom'\\\"\\n />\\n </div>\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\" ng-if=\\\"$ctrl.state.provider != 'custom'\\\">\\n <div class=\\\"col-sm-12\\\">\\n <a class=\\\"small interactive\\\" ng-if=\\\"!$ctrl.state.overrideConfiguration\\\" ng-click=\\\"$ctrl.state.overrideConfiguration = true;\\\">\\n <i class=\\\"fa fa-wrench space-right\\\" aria-hidden=\\\"true\\\"></i> Override default configuration\\n </a>\\n <a class=\\\"small interactive\\\" ng-if=\\\"$ctrl.state.overrideConfiguration\\\" ng-click=\\\"$ctrl.useDefaultProviderConfiguration($ctrl.state.provider)\\\">\\n <i class=\\\"fa fa-cogs space-right\\\" aria-hidden=\\\"true\\\"></i> Use default configuration\\n </a>\\n </div>\\n </div>\\n <save-auth-settings-button\\n on-save-settings=\\\"($ctrl.onSaveSettings)\\\"\\n save-button-state=\\\"($ctrl.saveButtonState)\\\"\\n save-button-disabled=\\\"!$ctrl.isOAuthTeamMembershipFormValid() || oauthSettingsForm.$invalid\\\"\\n limited-feature-id=\\\"$ctrl.limitedFeature\\\"\\n limited-feature-class=\\\"$ctrl.limitedFeatureClass\\\"\\n class-name=\\\"'oauth-save-settings-button'\\\"\\n ></save-auth-settings-button>\\n</ng-form>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","angular.module('portainer.oauth').factory('OAuth', [\n '$resource',\n 'API_ENDPOINT_OAUTH',\n function OAuthFactory($resource, API_ENDPOINT_OAUTH) {\n 'use strict';\n return $resource(\n API_ENDPOINT_OAUTH + '/:action',\n {},\n {\n validate: {\n method: 'POST',\n ignoreLoadingBar: true,\n params: {\n action: 'validate',\n },\n },\n }\n );\n },\n]);\n","angular.module('portainer.app').factory('Auth', [\n '$resource',\n 'API_ENDPOINT_AUTH',\n function AuthFactory($resource, API_ENDPOINT_AUTH) {\n 'use strict';\n return $resource(\n API_ENDPOINT_AUTH + '/:action',\n {},\n {\n login: { method: 'POST', ignoreLoadingBar: true },\n logout: { method: 'POST', params: { action: 'logout' }, ignoreLoadingBar: true },\n }\n );\n },\n]);\n","angular.module('portainer.app').factory('Backup', [\n '$resource',\n 'API_ENDPOINT_BACKUP',\n function BackupFactory($resource, API_ENDPOINT_BACKUP) {\n 'use strict';\n return $resource(\n API_ENDPOINT_BACKUP + '/:subResource/:action',\n {},\n {\n download: {\n method: 'POST',\n responseType: 'blob',\n ignoreLoadingBar: true,\n transformResponse: (data, headersGetter) => ({\n file: data,\n name: headersGetter('Content-Disposition').replace('attachment; filename=', ''),\n }),\n },\n getS3Settings: { method: 'GET', params: { subResource: 's3', action: 'settings' } },\n saveS3Settings: { method: 'POST', params: { subResource: 's3', action: 'settings' } },\n exportS3Backup: { method: 'POST', params: { subResource: 's3', action: 'execute' } },\n restoreS3Backup: { method: 'POST', params: { subResource: 's3', action: 'restore' } },\n getBackupStatus: { method: 'GET', params: { subResource: 's3', action: 'status' } },\n }\n );\n },\n]);\n","import angular from 'angular';\n\nangular.module('portainer.app').factory('CustomTemplates', CustomTemplatesFactory);\n\nfunction CustomTemplatesFactory($resource, API_ENDPOINT_CUSTOM_TEMPLATES) {\n return $resource(\n API_ENDPOINT_CUSTOM_TEMPLATES + '/:id/:action',\n {},\n {\n create: { method: 'POST', ignoreLoadingBar: true },\n query: { method: 'GET', isArray: true },\n get: { method: 'GET', params: { id: '@id' } },\n update: { method: 'PUT', params: { id: '@id' } },\n remove: { method: 'DELETE', params: { id: '@id' } },\n file: { method: 'GET', params: { id: '@id', action: 'file' } },\n }\n );\n}\n","import getEndpointsTotalCount from './transform/getEndpointsTotalCount';\n\nangular.module('portainer.app').factory('Endpoints', [\n '$resource',\n 'API_ENDPOINT_ENDPOINTS',\n function EndpointsFactory($resource, API_ENDPOINT_ENDPOINTS) {\n 'use strict';\n return $resource(\n API_ENDPOINT_ENDPOINTS + '/:id/:action',\n {},\n {\n query: {\n method: 'GET',\n params: { start: '@start', limit: '@limit', search: '@search', groupId: '@groupId' },\n transformResponse: getEndpointsTotalCount,\n },\n get: { method: 'GET', params: { id: '@id' } },\n update: { method: 'PUT', params: { id: '@id' } },\n deassociate: { method: 'DELETE', params: { id: '@id', action: 'association' } },\n updateAccess: { method: 'PUT', params: { id: '@id', action: 'access' } },\n remove: { method: 'DELETE', params: { id: '@id' } },\n snapshots: { method: 'POST', params: { action: 'snapshot' } },\n snapshot: { method: 'POST', params: { id: '@id', action: 'snapshot' } },\n status: { method: 'GET', params: { id: '@id', action: 'status' } },\n updateSecuritySettings: { method: 'PUT', params: { id: '@id', action: 'settings' } },\n dockerhubLimits: {\n method: 'GET',\n url: `${API_ENDPOINT_ENDPOINTS}/:id/dockerhub/:registryId`,\n },\n registries: {\n method: 'GET',\n url: `${API_ENDPOINT_ENDPOINTS}/:id/registries`,\n params: { id: '@id', namespace: '@namespace' },\n isArray: true,\n },\n registry: {\n url: `${API_ENDPOINT_ENDPOINTS}/:id/registries/:registryId`,\n method: 'GET',\n params: { id: '@id', namespace: '@namespace', registryId: '@registryId' },\n },\n updateRegistryAccess: {\n method: 'PUT',\n url: `${API_ENDPOINT_ENDPOINTS}/:id/registries/:registryId`,\n params: { id: '@id', registryId: '@registryId' },\n },\n }\n );\n },\n]);\n","import gitlabResponseGetLink from './transform/gitlabResponseGetLink';\n\nangular.module('portainer.app').factory('Gitlab', [\n '$resource',\n 'API_ENDPOINT_REGISTRIES',\n function GitlabFactory($resource, API_ENDPOINT_REGISTRIES) {\n 'use strict';\n return function (env) {\n const headers = {};\n if (env) {\n headers['Private-Token'] = env.token;\n headers['X-Gitlab-Domain'] = env.url;\n }\n\n const baseUrl = API_ENDPOINT_REGISTRIES + '/:id/proxies/gitlab/api/v4/projects';\n\n return $resource(\n baseUrl,\n { id: '@id' },\n {\n projects: {\n method: 'GET',\n params: { membership: 'true' },\n transformResponse: gitlabResponseGetLink,\n headers: headers,\n },\n repositories: {\n method: 'GET',\n url: baseUrl + '/:projectId/registry/repositories',\n params: { tags: true },\n headers: headers,\n transformResponse: gitlabResponseGetLink,\n },\n }\n );\n };\n },\n]);\n","angular.module('portainer.app').factory('EndpointGroups', [\n '$resource',\n 'API_ENDPOINT_ENDPOINT_GROUPS',\n function EndpointGroupsFactory($resource, API_ENDPOINT_ENDPOINT_GROUPS) {\n 'use strict';\n return $resource(\n API_ENDPOINT_ENDPOINT_GROUPS + '/:id/:action',\n {},\n {\n create: { method: 'POST', ignoreLoadingBar: true },\n query: { method: 'GET', isArray: true },\n get: { method: 'GET', params: { id: '@id' } },\n update: { method: 'PUT', params: { id: '@id' } },\n updateAccess: { method: 'PUT', params: { id: '@id', action: 'access' } },\n addEndpoint: { method: 'PUT', params: { id: '@id', action: '@action' } },\n removeEndpoint: { method: 'DELETE', params: { id: '@id', action: '@action' } },\n remove: { method: 'DELETE', params: { id: '@id' } },\n }\n );\n },\n]);\n","// TODO: legacy extension management\nangular.module('portainer.app').factory('LegacyExtensions', [\n '$resource',\n 'EndpointProvider',\n 'API_ENDPOINT_ENDPOINTS',\n function LegacyExtensions($resource, EndpointProvider, API_ENDPOINT_ENDPOINTS) {\n 'use strict';\n return $resource(\n API_ENDPOINT_ENDPOINTS + '/:endpointId/extensions/:type',\n {\n endpointId: EndpointProvider.endpointID,\n },\n {\n register: { method: 'POST' },\n deregister: { method: 'DELETE', params: { type: '@type' } },\n }\n );\n },\n]);\n","angular.module('portainer.app').factory('Motd', [\n '$resource',\n 'API_ENDPOINT_MOTD',\n function MotdFactory($resource, API_ENDPOINT_MOTD) {\n 'use strict';\n return $resource(\n API_ENDPOINT_MOTD,\n {},\n {\n get: {\n method: 'GET',\n ignoreLoadingBar: true,\n },\n }\n );\n },\n]);\n","angular.module('portainer.app').factory('Registries', [\n '$resource',\n 'API_ENDPOINT_REGISTRIES',\n function RegistriesFactory($resource, API_ENDPOINT_REGISTRIES) {\n 'use strict';\n return $resource(\n API_ENDPOINT_REGISTRIES + '/:id/:action',\n {},\n {\n create: { method: 'POST', ignoreLoadingBar: true },\n query: { method: 'GET', isArray: true },\n get: { method: 'GET', params: { id: '@id', action: '', endpointId: '@endpointId' } },\n update: { method: 'PUT', params: { id: '@id' } },\n remove: { method: 'DELETE', params: { id: '@id' } },\n configure: { method: 'POST', params: { id: '@id', action: 'configure' } },\n }\n );\n },\n]);\n","angular.module('portainer.app').factory('ResourceControl', [\n '$resource',\n 'API_ENDPOINT_RESOURCE_CONTROLS',\n function ResourceControlFactory($resource, API_ENDPOINT_RESOURCE_CONTROLS) {\n 'use strict';\n return $resource(\n API_ENDPOINT_RESOURCE_CONTROLS + '/:id',\n {},\n {\n create: { method: 'POST', ignoreLoadingBar: true },\n get: { method: 'GET', params: { id: '@id' } },\n update: { method: 'PUT', params: { id: '@id' } },\n remove: { method: 'DELETE', params: { id: '@id' } },\n }\n );\n },\n]);\n","angular.module('portainer.app').factory('Settings', [\n '$resource',\n 'API_ENDPOINT_SETTINGS',\n function SettingsFactory($resource, API_ENDPOINT_SETTINGS) {\n 'use strict';\n return $resource(\n API_ENDPOINT_SETTINGS + '/:subResource/:action',\n {},\n {\n get: { method: 'GET' },\n update: { method: 'PUT', ignoreLoadingBar: true },\n publicSettings: { method: 'GET', params: { subResource: 'public' }, ignoreLoadingBar: true },\n checkLDAPConnectivity: { method: 'PUT', params: { subResource: 'authentication', action: 'checkLDAP' } },\n }\n );\n },\n]);\n","import angular from 'angular';\n\nconst API_ENDPOINT_SSL = 'api/ssl';\n\nangular.module('portainer.app').factory('SSL', SSLFactory);\n\n/* @ngInject */\nfunction SSLFactory($resource) {\n return $resource(\n API_ENDPOINT_SSL,\n {},\n {\n get: { method: 'GET' },\n upload: { method: 'PUT' },\n }\n );\n}\n","angular.module('portainer.app').factory('Stack', [\n '$resource',\n 'EndpointProvider',\n 'API_ENDPOINT_STACKS',\n function StackFactory($resource, EndpointProvider, API_ENDPOINT_STACKS) {\n 'use strict';\n return $resource(\n API_ENDPOINT_STACKS + '/:id/:action/:subaction',\n {},\n {\n get: { method: 'GET', params: { id: '@id' } },\n query: { method: 'GET', isArray: true },\n create: { method: 'POST', ignoreLoadingBar: true },\n update: { method: 'PUT', params: { id: '@id' }, ignoreLoadingBar: true },\n associate: { method: 'PUT', params: { id: '@id', swarmId: '@swarmId', endpointId: '@endpointId', orphanedRunning: '@orphanedRunning', action: 'associate' } },\n remove: { method: 'DELETE', params: { id: '@id', external: '@external', endpointId: '@endpointId' } },\n getStackFile: { method: 'GET', params: { id: '@id', action: 'file' } },\n migrate: { method: 'POST', params: { id: '@id', action: 'migrate', endpointId: '@endpointId' }, ignoreLoadingBar: true },\n start: { method: 'POST', params: { id: '@id', action: 'start' } },\n stop: { method: 'POST', params: { id: '@id', action: 'stop' } },\n updateGit: { method: 'PUT', params: { id: '@id', action: 'git', subaction: 'redeploy' } },\n updateGitStackSettings: { method: 'POST', params: { id: '@id', action: 'git' }, ignoreLoadingBar: true },\n }\n );\n },\n]);\n","angular.module('portainer.app').factory('Status', [\n '$resource',\n 'API_ENDPOINT_STATUS',\n function StatusFactory($resource, API_ENDPOINT_STATUS) {\n 'use strict';\n return $resource(\n API_ENDPOINT_STATUS + '/:action',\n {},\n {\n get: { method: 'GET' },\n version: { method: 'GET', params: { action: 'version' } },\n }\n );\n },\n]);\n","angular.module('portainer.app').factory('Support', [\n '$resource',\n 'API_ENDPOINT_SUPPORT',\n function SupportFactory($resource, API_ENDPOINT_SUPPORT) {\n 'use strict';\n return $resource(\n API_ENDPOINT_SUPPORT,\n {},\n {\n get: { method: 'GET', isArray: true },\n }\n );\n },\n]);\n","angular.module('portainer.app').factory('Tags', [\n '$resource',\n 'API_ENDPOINT_TAGS',\n function TagsFactory($resource, API_ENDPOINT_TAGS) {\n 'use strict';\n return $resource(\n API_ENDPOINT_TAGS + '/:id',\n {},\n {\n create: { method: 'POST' },\n query: { method: 'GET', isArray: true },\n remove: { method: 'DELETE', params: { id: '@id' } },\n }\n );\n },\n]);\n","angular.module('portainer.app').factory('Teams', [\n '$resource',\n 'API_ENDPOINT_TEAMS',\n function TeamsFactory($resource, API_ENDPOINT_TEAMS) {\n 'use strict';\n return $resource(\n API_ENDPOINT_TEAMS + '/:id/:entity/:entityId',\n {},\n {\n create: { method: 'POST', ignoreLoadingBar: true },\n query: { method: 'GET', isArray: true },\n get: { method: 'GET', params: { id: '@id' } },\n remove: { method: 'DELETE', params: { id: '@id' } },\n queryMemberships: { method: 'GET', isArray: true, params: { id: '@id', entity: 'memberships' } },\n }\n );\n },\n]);\n","angular.module('portainer.app').factory('TeamMemberships', [\n '$resource',\n 'API_ENDPOINT_TEAM_MEMBERSHIPS',\n function TeamMembershipsFactory($resource, API_ENDPOINT_TEAM_MEMBERSHIPS) {\n 'use strict';\n return $resource(\n API_ENDPOINT_TEAM_MEMBERSHIPS + '/:id/:action',\n {},\n {\n create: { method: 'POST', ignoreLoadingBar: true },\n query: { method: 'GET', isArray: true },\n update: { method: 'PUT', params: { id: '@id' } },\n remove: { method: 'DELETE', params: { id: '@id' } },\n }\n );\n },\n]);\n","angular.module('portainer.app').factory('Templates', [\n '$resource',\n 'API_ENDPOINT_TEMPLATES',\n function TemplatesFactory($resource, API_ENDPOINT_TEMPLATES) {\n return $resource(\n API_ENDPOINT_TEMPLATES + '/:action',\n {},\n {\n query: { method: 'GET' },\n file: { method: 'POST', params: { action: 'file' } },\n }\n );\n },\n]);\n","angular.module('portainer.app').factory('Users', [\n '$resource',\n 'API_ENDPOINT_USERS',\n function UsersFactory($resource, API_ENDPOINT_USERS) {\n 'use strict';\n return $resource(\n API_ENDPOINT_USERS + '/:id/:entity/:entityId',\n {},\n {\n create: { method: 'POST', ignoreLoadingBar: true },\n query: { method: 'GET', isArray: true },\n get: { method: 'GET', params: { id: '@id' } },\n update: { method: 'PUT', params: { id: '@id' }, ignoreLoadingBar: true },\n updatePassword: { method: 'PUT', params: { id: '@id', entity: 'passwd' } },\n updateTheme: { method: 'PUT', params: { id: '@id' } },\n remove: { method: 'DELETE', params: { id: '@id' } },\n queryMemberships: { method: 'GET', isArray: true, params: { id: '@id', entity: 'memberships' } },\n checkAdminUser: { method: 'GET', params: { id: 'admin', entity: 'check' }, isArray: true, ignoreLoadingBar: true },\n initAdminUser: { method: 'POST', params: { id: 'admin', entity: 'init' }, ignoreLoadingBar: true },\n createAccessToken: { url: `${API_ENDPOINT_USERS}/:id/tokens`, method: 'POST', params: { id: '@id' }, ignoreLoadingBar: true },\n getAccessTokens: { method: 'GET', params: { id: '@id', entity: 'tokens' }, isArray: true },\n deleteAccessToken: { url: `${API_ENDPOINT_USERS}/:id/tokens/:tokenId`, method: 'DELETE', params: { id: '@id', entityId: '@tokenId' } },\n }\n );\n },\n]);\n","angular.module('portainer.app').factory('Webhooks', [\n '$resource',\n 'API_ENDPOINT_WEBHOOKS',\n function WebhooksFactory($resource, API_ENDPOINT_WEBHOOKS) {\n 'use strict';\n return $resource(\n API_ENDPOINT_WEBHOOKS + '/:id',\n {},\n {\n query: { method: 'GET', isArray: true },\n create: { method: 'POST' },\n update: { method: 'PUT', params: { id: '@id' } },\n remove: { method: 'DELETE', params: { id: '@id' } },\n }\n );\n },\n]);\n","import _ from 'lodash-es';\nimport { UserAccessViewModel } from '../../models/access';\nimport { TeamAccessViewModel } from '../../models/access';\n\nangular.module('portainer.app').factory('AccessService', [\n '$q',\n '$async',\n 'UserService',\n 'TeamService',\n function AccessServiceFactory($q, $async, UserService, TeamService) {\n 'use strict';\n return {\n accesses,\n generateAccessPolicies,\n };\n\n function _mapAccessData(accesses, authorizedPolicies, inheritedPolicies) {\n var availableAccesses = [];\n var authorizedAccesses = [];\n\n for (var i = 0; i < accesses.length; i++) {\n const access = accesses[i];\n\n const authorized = authorizedPolicies && authorizedPolicies[access.Id];\n const inherited = inheritedPolicies && inheritedPolicies[access.Id];\n\n if (authorized && inherited) {\n access.Override = true;\n authorizedAccesses.push(access);\n } else if (authorized && !inherited) {\n authorizedAccesses.push(access);\n } else if (!authorized && inherited) {\n access.Inherited = true;\n authorizedAccesses.push(access);\n availableAccesses.push(access);\n } else {\n availableAccesses.push(access);\n }\n }\n\n return {\n available: availableAccesses,\n authorized: authorizedAccesses,\n };\n }\n\n function getAccesses(authorizedUserPolicies, authorizedTeamPolicies, inheritedUserPolicies, inheritedTeamPolicies) {\n var deferred = $q.defer();\n\n $q.all({\n users: UserService.users(false),\n teams: TeamService.teams(),\n })\n .then(function success(data) {\n var userAccesses = data.users.map(function (user) {\n return new UserAccessViewModel(user);\n });\n var teamAccesses = data.teams.map(function (team) {\n return new TeamAccessViewModel(team);\n });\n\n var userAccessData = _mapAccessData(userAccesses, authorizedUserPolicies, inheritedUserPolicies);\n var teamAccessData = _mapAccessData(teamAccesses, authorizedTeamPolicies, inheritedTeamPolicies);\n\n var accessData = {\n availableUsersAndTeams: userAccessData.available.concat(teamAccessData.available),\n authorizedUsersAndTeams: userAccessData.authorized.concat(teamAccessData.authorized),\n };\n\n deferred.resolve(accessData);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve users and teams', err: err });\n });\n\n return deferred.promise;\n }\n\n async function accessesAsync(entity, parent) {\n if (!entity) {\n throw new Error('Unable to retrieve accesses');\n }\n if (!entity.UserAccessPolicies) {\n entity.UserAccessPolicies = {};\n }\n if (!entity.TeamAccessPolicies) {\n entity.TeamAccessPolicies = {};\n }\n if (parent && !parent.UserAccessPolicies) {\n parent.UserAccessPolicies = {};\n }\n if (parent && !parent.TeamAccessPolicies) {\n parent.TeamAccessPolicies = {};\n }\n return await getAccesses(entity.UserAccessPolicies, entity.TeamAccessPolicies, parent ? parent.UserAccessPolicies : {}, parent ? parent.TeamAccessPolicies : {});\n }\n\n function accesses(entity, parent) {\n return $async(accessesAsync, entity, parent);\n }\n\n function generateAccessPolicies(userAccessPolicies, teamAccessPolicies, selectedUserAccesses, selectedTeamAccesses, selectedRoleId) {\n const newUserPolicies = _.clone(userAccessPolicies);\n const newTeamPolicies = _.clone(teamAccessPolicies);\n\n _.forEach(selectedUserAccesses, (access) => (newUserPolicies[access.Id] = { RoleId: selectedRoleId ? selectedRoleId : access.Role.Id }));\n _.forEach(selectedTeamAccesses, (access) => (newTeamPolicies[access.Id] = { RoleId: selectedRoleId ? selectedRoleId : access.Role.Id }));\n\n const accessPolicies = {\n userAccessPolicies: newUserPolicies,\n teamAccessPolicies: newTeamPolicies,\n };\n\n return accessPolicies;\n }\n },\n]);\n","angular.module('portainer.app').factory('BackupService', [\n '$q',\n '$async',\n 'Backup',\n 'FileUploadService',\n function BackupServiceFactory($q, $async, Backup, FileUploadService) {\n 'use strict';\n const service = {};\n\n service.downloadBackup = function (payload) {\n return Backup.download({}, payload).$promise;\n };\n\n service.uploadBackup = function (file, password) {\n return FileUploadService.uploadBackup(file, password);\n };\n\n service.getS3Settings = function () {\n var deferred = $q.defer();\n\n Backup.getS3Settings()\n .$promise.then(function success(data) {\n deferred.resolve(data);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve backup S3 settings', err: err });\n });\n\n return deferred.promise;\n };\n\n service.saveS3Settings = function (payload) {\n var deferred = $q.defer();\n\n Backup.saveS3Settings({}, payload)\n .$promise.then(function success(data) {\n deferred.resolve(data);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to save backup S3 settings', err: err });\n });\n\n return deferred.promise;\n };\n\n service.exportBackup = function (payload) {\n var deferred = $q.defer();\n\n Backup.exportS3Backup({}, payload)\n .$promise.then(function success(data) {\n deferred.resolve(data);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to export backup', err: err });\n });\n\n return deferred.promise;\n };\n\n service.restoreFromS3 = function (payload) {\n var deferred = $q.defer();\n\n Backup.restoreS3Backup({}, payload)\n .$promise.then(function success(data) {\n deferred.resolve(data);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to restore backup from S3', err: err });\n });\n\n return deferred.promise;\n };\n\n service.getBackupStatus = function () {\n var deferred = $q.defer();\n\n Backup.getBackupStatus()\n .$promise.then(function success(data) {\n deferred.resolve(data);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve backup status', err: err });\n });\n\n return deferred.promise;\n };\n\n return service;\n },\n]);\n","import angular from 'angular';\n\nangular.module('portainer.app').factory('CustomTemplateService', CustomTemplateServiceFactory);\n\n/* @ngInject */\nfunction CustomTemplateServiceFactory($sanitize, CustomTemplates, FileUploadService) {\n var service = {};\n\n service.customTemplate = function customTemplate(id) {\n return CustomTemplates.get({ id }).$promise;\n };\n\n service.customTemplates = async function customTemplates(type) {\n const templates = await CustomTemplates.query({ type }).$promise;\n templates.forEach((template) => {\n if (template.Note) {\n template.Note = $('<p>').html($sanitize(template.Note)).find('img').remove().end().html();\n }\n });\n return templates;\n };\n\n service.remove = function remove(id) {\n return CustomTemplates.remove({ id }).$promise;\n };\n\n service.customTemplateFile = async function customTemplateFile(id) {\n try {\n const { FileContent } = await CustomTemplates.file({ id }).$promise;\n return FileContent;\n } catch (err) {\n throw { msg: 'Unable to retrieve customTemplate content', err };\n }\n };\n\n service.updateCustomTemplate = async function updateCustomTemplate(id, customTemplate) {\n return CustomTemplates.update({ id }, customTemplate).$promise;\n };\n\n service.createCustomTemplateFromFileContent = async function createCustomTemplateFromFileContent(payload) {\n try {\n return await CustomTemplates.create({ method: 'string' }, payload).$promise;\n } catch (err) {\n throw { msg: 'Unable to create the customTemplate', err };\n }\n };\n\n service.createCustomTemplateFromFileUpload = async function createCustomTemplateFromFileUpload(payload) {\n try {\n const { data } = await FileUploadService.createCustomTemplate(payload);\n return data;\n } catch (err) {\n throw { msg: 'Unable to create the customTemplate', err };\n }\n };\n\n service.createCustomTemplateFromGitRepository = async function createCustomTemplateFromGitRepository(payload) {\n try {\n return await CustomTemplates.create({ method: 'repository' }, payload).$promise;\n } catch (err) {\n throw { msg: 'Unable to create the customTemplate', err };\n }\n };\n\n return service;\n}\n","import EndpointHelper from 'Portainer/helpers/endpointHelper';\nimport { PortainerEndpointTypes } from 'Portainer/models/endpoint/models';\n\nangular.module('portainer.app').factory('DockerHubService', DockerHubService);\n\n/* @ngInject */\nfunction DockerHubService(Endpoints, AgentDockerhub) {\n return {\n checkRateLimits,\n };\n\n function checkRateLimits(endpoint, registryId) {\n if (EndpointHelper.isLocalEndpoint(endpoint)) {\n return Endpoints.dockerhubLimits({ id: endpoint.Id, registryId }).$promise;\n }\n\n switch (endpoint.Type) {\n case PortainerEndpointTypes.AgentOnDockerEnvironment:\n case PortainerEndpointTypes.EdgeAgentOnDockerEnvironment:\n return AgentDockerhub.limits({ endpointId: endpoint.Id, endpointType: 'docker', registryId }).$promise;\n\n case PortainerEndpointTypes.AgentOnKubernetesEnvironment:\n case PortainerEndpointTypes.EdgeAgentOnKubernetesEnvironment:\n return AgentDockerhub.limits({ endpointId: endpoint.Id, endpointType: 'kubernetes', registryId }).$promise;\n }\n }\n}\n","import { PortainerEndpointCreationTypes } from 'Portainer/models/endpoint/models';\n\nangular.module('portainer.app').factory('EndpointService', [\n '$q',\n 'Endpoints',\n 'FileUploadService',\n function EndpointServiceFactory($q, Endpoints, FileUploadService) {\n 'use strict';\n var service = {\n updateSecuritySettings,\n registries,\n registry,\n updateRegistryAccess,\n };\n\n service.endpoint = function (endpointID) {\n return Endpoints.get({ id: endpointID }).$promise;\n };\n\n service.endpoints = function (start, limit, { search, types, tagIds, endpointIds, tagsPartialMatch } = {}) {\n if (tagIds && !tagIds.length) {\n return Promise.resolve({ value: [], totalCount: 0 });\n }\n return Endpoints.query({ start, limit, search, types: JSON.stringify(types), tagIds: JSON.stringify(tagIds), endpointIds: JSON.stringify(endpointIds), tagsPartialMatch })\n .$promise;\n };\n\n service.snapshotEndpoints = function () {\n return Endpoints.snapshots({}, {}).$promise;\n };\n\n service.snapshotEndpoint = function (endpointID) {\n return Endpoints.snapshot({ id: endpointID }, {}).$promise;\n };\n\n service.endpointsByGroup = function (start, limit, search, groupId) {\n return Endpoints.query({ start, limit, search, groupId }).$promise;\n };\n\n service.updateAccess = function (id, userAccessPolicies, teamAccessPolicies) {\n return Endpoints.updateAccess({ id: id }, { UserAccessPolicies: userAccessPolicies, TeamAccessPolicies: teamAccessPolicies }).$promise;\n };\n\n service.deassociateEndpoint = function (endpointID) {\n return Endpoints.deassociate({ id: endpointID }).$promise;\n };\n\n service.updateEndpoint = function (id, payload) {\n var deferred = $q.defer();\n FileUploadService.uploadTLSFilesForEndpoint(id, payload.TLSCACert, payload.TLSCert, payload.TLSKey)\n .then(function success() {\n deferred.notify({ upload: false });\n return Endpoints.update({ id: id }, payload).$promise;\n })\n .then(function success(data) {\n deferred.resolve(data);\n })\n .catch(function error(err) {\n deferred.notify({ upload: false });\n deferred.reject({ msg: 'Unable to update environment', err: err });\n });\n return deferred.promise;\n };\n\n service.deleteEndpoint = function (endpointID) {\n return Endpoints.remove({ id: endpointID }).$promise;\n };\n\n service.createLocalEndpoint = function (name = 'local', URL = '', PublicURL = '', groupID = 1, tagIds = []) {\n var deferred = $q.defer();\n\n var endpointURL = URL;\n if (endpointURL !== '') {\n if (endpointURL.indexOf('//./pipe/') == 0) {\n // Windows named pipe\n endpointURL = 'npipe://' + URL;\n } else {\n endpointURL = 'unix://' + URL;\n }\n }\n\n FileUploadService.createEndpoint(name, PortainerEndpointCreationTypes.LocalDockerEnvironment, endpointURL, PublicURL, groupID, tagIds, false)\n .then(function success(response) {\n deferred.resolve(response.data);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to create environment', err: err });\n });\n\n return deferred.promise;\n };\n\n service.createRemoteEndpoint = function (\n name,\n creationType,\n URL,\n PublicURL,\n groupID,\n tagIds,\n TLS,\n TLSSkipVerify,\n TLSSkipClientVerify,\n TLSCAFile,\n TLSCertFile,\n TLSKeyFile,\n checkinInterval\n ) {\n var deferred = $q.defer();\n\n var endpointURL = URL;\n if (creationType !== PortainerEndpointCreationTypes.EdgeAgentEnvironment) {\n endpointURL = 'tcp://' + URL;\n }\n\n FileUploadService.createEndpoint(\n name,\n creationType,\n endpointURL,\n PublicURL,\n groupID,\n tagIds,\n TLS,\n TLSSkipVerify,\n TLSSkipClientVerify,\n TLSCAFile,\n TLSCertFile,\n TLSKeyFile,\n checkinInterval\n )\n .then(function success(response) {\n deferred.resolve(response.data);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to create environment', err: err });\n });\n\n return deferred.promise;\n };\n\n service.createLocalKubernetesEndpoint = function (name = 'local', tagIds = []) {\n var deferred = $q.defer();\n\n FileUploadService.createEndpoint(name, PortainerEndpointCreationTypes.LocalKubernetesEnvironment, '', '', 1, tagIds, true, true, true)\n .then(function success(response) {\n deferred.resolve(response.data);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to create environment', err: err });\n });\n\n return deferred.promise;\n };\n\n service.createAzureEndpoint = function (name, applicationId, tenantId, authenticationKey, groupId, tagIds) {\n var deferred = $q.defer();\n\n FileUploadService.createAzureEndpoint(name, applicationId, tenantId, authenticationKey, groupId, tagIds)\n .then(function success(response) {\n deferred.resolve(response.data);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to connect to Azure', err: err });\n });\n\n return deferred.promise;\n };\n\n function updateRegistryAccess(id, registryId, endpointAccesses) {\n return Endpoints.updateRegistryAccess({ registryId, id }, endpointAccesses).$promise;\n }\n\n function registries(id, namespace) {\n return Endpoints.registries({ namespace, id }).$promise;\n }\n\n return service;\n\n function updateSecuritySettings(id, securitySettings) {\n return Endpoints.updateSecuritySettings({ id }, securitySettings).$promise;\n }\n\n function registry(endpointId, registryId) {\n return Endpoints.registry({ registryId, id: endpointId }).$promise;\n }\n },\n]);\n","import { EndpointGroupCreateRequest, EndpointGroupModel, EndpointGroupUpdateRequest } from '../../models/group';\n\nangular.module('portainer.app').factory('GroupService', [\n '$q',\n 'EndpointGroups',\n function GroupService($q, EndpointGroups) {\n 'use strict';\n var service = {};\n\n service.group = function (groupId) {\n var deferred = $q.defer();\n\n EndpointGroups.get({ id: groupId })\n .$promise.then(function success(data) {\n var group = new EndpointGroupModel(data);\n deferred.resolve(group);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve group', err: err });\n });\n\n return deferred.promise;\n };\n\n service.groups = function () {\n return EndpointGroups.query({}).$promise;\n };\n\n service.createGroup = function (model, endpoints) {\n var payload = new EndpointGroupCreateRequest(model, endpoints);\n return EndpointGroups.create(payload).$promise;\n };\n\n service.updateGroup = function (model, endpoints) {\n var payload = new EndpointGroupUpdateRequest(model, endpoints);\n return EndpointGroups.update(payload).$promise;\n };\n\n service.updateAccess = function (groupId, userAccessPolicies, teamAccessPolicies) {\n return EndpointGroups.updateAccess({ id: groupId }, { UserAccessPolicies: userAccessPolicies, TeamAccessPolicies: teamAccessPolicies }).$promise;\n };\n\n service.addEndpoint = function (groupId, endpoint) {\n return EndpointGroups.addEndpoint({ id: groupId, action: 'endpoints/' + endpoint.Id }, endpoint).$promise;\n };\n\n service.removeEndpoint = function (groupId, endpointId) {\n return EndpointGroups.removeEndpoint({ id: groupId, action: 'endpoints/' + endpointId }).$promise;\n };\n\n service.deleteGroup = function (groupId) {\n return EndpointGroups.remove({ id: groupId }).$promise;\n };\n\n return service;\n },\n]);\n","// TODO: legacy extension management\nangular.module('portainer.app').factory('LegacyExtensionService', [\n 'LegacyExtensions',\n function LegacyExtensionServiceFactory(LegacyExtensions) {\n 'use strict';\n var service = {};\n\n service.registerStoridgeExtension = function (url) {\n var payload = {\n Type: 1,\n URL: url,\n };\n\n return LegacyExtensions.register(payload).$promise;\n };\n\n service.deregisterStoridgeExtension = function () {\n return LegacyExtensions.deregister({ type: 1 }).$promise;\n };\n\n return service;\n },\n]);\n","import { MotdViewModel } from '../../models/motd';\n\nangular.module('portainer.app').factory('MotdService', [\n '$q',\n 'Motd',\n function MotdServiceFactory($q, Motd) {\n 'use strict';\n var service = {};\n\n service.motd = function () {\n var deferred = $q.defer();\n\n Motd.get()\n .$promise.then(function success(data) {\n var motd = new MotdViewModel(data);\n deferred.resolve(motd);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve information message', err: err });\n });\n\n return deferred.promise;\n };\n\n return service;\n },\n]);\n","import _ from 'lodash-es';\nimport { PorImageRegistryModel } from 'Docker/models/porImageRegistry';\nimport { RegistryTypes } from 'Portainer/models/registryTypes';\nimport { RegistryCreateRequest, RegistryViewModel } from 'Portainer/models/registry';\nimport { DockerHubViewModel } from 'Portainer/models/dockerhub';\n\nangular.module('portainer.app').factory('RegistryService', [\n '$q',\n '$async',\n 'EndpointService',\n 'Registries',\n 'ImageHelper',\n 'FileUploadService',\n function RegistryServiceFactory($q, $async, EndpointService, Registries, ImageHelper, FileUploadService) {\n return {\n registries,\n registry,\n encodedCredentials,\n deleteRegistry,\n updateRegistry,\n configureRegistry,\n createRegistry,\n createGitlabRegistries,\n retrievePorRegistryModelFromRepository,\n retrievePorRegistryModelFromRepositoryWithRegistries,\n loadRegistriesForDropdown,\n };\n\n function registries() {\n var deferred = $q.defer();\n\n Registries.query()\n .$promise.then(function success(data) {\n var registries = data.map(function (item) {\n return new RegistryViewModel(item);\n });\n deferred.resolve(registries);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve registries', err: err });\n });\n\n return deferred.promise;\n }\n\n function registry(id, endpointId) {\n var deferred = $q.defer();\n\n Registries.get({ id, endpointId })\n .$promise.then(function success(data) {\n var registry = new RegistryViewModel(data);\n deferred.resolve(registry);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve registry details', err: err });\n });\n\n return deferred.promise;\n }\n\n function encodedCredentials(registry) {\n var credentials = {\n registryId: registry.Id,\n };\n return btoa(JSON.stringify(credentials));\n }\n\n function deleteRegistry(id) {\n return Registries.remove({ id: id }).$promise;\n }\n\n function updateRegistry(registry) {\n registry.URL = _.replace(registry.URL, /^https?\\:\\/\\//i, '');\n registry.URL = _.replace(registry.URL, /\\/$/, '');\n return Registries.update({ id: registry.Id }, registry).$promise;\n }\n\n function configureRegistry(id, registryManagementConfigurationModel) {\n return FileUploadService.configureRegistry(id, registryManagementConfigurationModel);\n }\n\n function createRegistry(model) {\n var payload = new RegistryCreateRequest(model);\n return Registries.create(payload).$promise;\n }\n\n function createGitlabRegistries(model, projects) {\n const promises = [];\n _.forEach(projects, (p) => {\n const m = model;\n m.Name = p.PathWithNamespace;\n m.Gitlab.ProjectPath = _.toLower(p.PathWithNamespace);\n m.Gitlab.ProjectId = p.Id;\n m.Password = m.Token;\n const payload = new RegistryCreateRequest(m);\n promises.push(Registries.create(payload).$promise);\n });\n return $q.all(promises);\n }\n\n function getURL(reg) {\n let url = reg.URL;\n if (reg.Type === RegistryTypes.GITLAB) {\n url = reg.URL + '/' + reg.Gitlab.ProjectPath;\n } else if (reg.Type === RegistryTypes.QUAY) {\n const name = reg.Quay.UseOrganisation ? reg.Quay.OrganisationName : reg.Username;\n url = reg.URL + '/' + name;\n }\n return url;\n }\n\n // findBestMatchRegistry finds out the best match registry for repository\n // matching precedence:\n // 1. registryId matched\n // 2. both domain name and username matched (for dockerhub only)\n // 3. only URL matched\n // 4. pick up the first dockerhub registry\n function findBestMatchRegistry(repository, registries, registryId) {\n let match2, match3, match4;\n\n for (const registry of registries) {\n if (registry.Id == registryId) {\n return registry;\n }\n\n if (registry.Type === RegistryTypes.DOCKERHUB) {\n // try to match repository examples:\n // <USERNAME>/nginx:latest\n // docker.io/<USERNAME>/nginx:latest\n if (repository.startsWith(registry.Username + '/') || repository.startsWith(getURL(registry) + '/' + registry.Username + '/')) {\n match2 = registry;\n }\n\n // try to match repository examples:\n // portainer/portainer-ee:latest\n // <NON-USERNAME>/portainer-ee:latest\n match4 = match4 || registry;\n }\n\n if (_.includes(repository, getURL(registry))) {\n match3 = registry;\n }\n }\n\n return match2 || match3 || match4;\n }\n\n function retrievePorRegistryModelFromRepositoryWithRegistries(repository, registries, registryId) {\n const model = new PorImageRegistryModel();\n const registry = findBestMatchRegistry(repository, registries, registryId);\n if (registry) {\n const url = getURL(registry);\n let lastIndex = repository.lastIndexOf(url);\n lastIndex = lastIndex === -1 ? 0 : lastIndex + url.length;\n let image = repository.substring(lastIndex);\n if (_.startsWith(image, '/')) {\n image = image.substring(1);\n }\n model.Registry = registry;\n model.Image = image;\n } else {\n if (ImageHelper.imageContainsURL(repository)) {\n model.UseRegistry = false;\n }\n model.Registry = new DockerHubViewModel();\n model.Image = repository;\n }\n return model;\n }\n\n function retrievePorRegistryModelFromRepository(repository, endpointId, registryId, namespace) {\n return $async(async () => {\n try {\n const regs = await EndpointService.registries(endpointId, namespace);\n return retrievePorRegistryModelFromRepositoryWithRegistries(repository, regs, registryId);\n } catch (err) {\n throw { msg: 'Unable to retrieve the registry associated to the repository', err: err };\n }\n });\n }\n\n function loadRegistriesForDropdown(endpointId, namespace) {\n return $async(async () => {\n try {\n const registries = await EndpointService.registries(endpointId, namespace);\n\n // hide default(anonymous) dockerhub registry if user has an authenticated one\n if (!registries.some((registry) => registry.Type === RegistryTypes.DOCKERHUB)) {\n registries.push(new DockerHubViewModel());\n }\n\n return registries;\n } catch (err) {\n throw { msg: 'Unable to retrieve the registries', err: err };\n }\n });\n }\n },\n]);\n","import _ from 'lodash-es';\n\nangular.module('portainer.app').factory('ResourceControlService', [\n '$q',\n 'ResourceControl',\n 'UserService',\n 'TeamService',\n 'ResourceControlHelper',\n function ResourceControlServiceFactory($q, ResourceControl, UserService, TeamService, ResourceControlHelper) {\n 'use strict';\n const service = {};\n\n service.duplicateResourceControl = duplicateResourceControl;\n service.applyResourceControlChange = applyResourceControlChange;\n service.applyResourceControl = applyResourceControl;\n service.retrieveOwnershipDetails = retrieveOwnershipDetails;\n service.retrieveUserPermissionsOnResource = retrieveUserPermissionsOnResource;\n\n /**\n * PRIVATE SECTION\n */\n\n /**\n * Create a ResourceControl\n * @param {ResourceControlTypeString} rcType Type of ResourceControl\n * @param {string} rcID ID of involved resource\n * @param {ResourceControlOwnershipParameters} ownershipParameters Transcient type from view data to payload\n */\n function createResourceControl(rcType, resourceID, ownershipParameters) {\n var payload = {\n Type: rcType,\n Public: ownershipParameters.Public,\n AdministratorsOnly: ownershipParameters.AdministratorsOnly,\n ResourceID: resourceID,\n Users: ownershipParameters.Users,\n Teams: ownershipParameters.Teams,\n SubResourceIds: ownershipParameters.SubResourceIDs,\n };\n return ResourceControl.create({}, payload).$promise;\n }\n\n /**\n * Update a ResourceControl\n * @param {String} rcID ID of involved resource\n * @param {ResourceControlOwnershipParameters} ownershipParameters Transcient type from view data to payload\n */\n function updateResourceControl(rcID, ownershipParameters) {\n const payload = {\n AdministratorsOnly: ownershipParameters.AdministratorsOnly,\n Public: ownershipParameters.Public,\n Users: ownershipParameters.Users,\n Teams: ownershipParameters.Teams,\n };\n\n return ResourceControl.update({ id: rcID }, payload).$promise;\n }\n\n /**\n * END PRIVATE SECTION\n */\n\n /**\n * PUBLIC SECTION\n */\n\n /**\n * Apply a ResourceControl after Resource creation\n * @param {int} userId ID of User performing the action\n * @param {AccessControlFormData} accessControlData ResourceControl to apply\n * @param {ResourceControlViewModel} resourceControl ResourceControl to update\n * @param {[]int} subResources SubResources managed by the ResourceControl\n */\n function applyResourceControl(userId, accessControlData, resourceControl, subResources = []) {\n const ownershipParameters = ResourceControlHelper.RCFormDataToOwnershipParameters(userId, accessControlData, subResources);\n return updateResourceControl(resourceControl.Id, ownershipParameters);\n }\n\n /**\n * Duplicate an existing ResourceControl (default to AdministratorsOnly if undefined)\n * @param {int} userId ID of User performing the action\n * @param {ResourceControlViewModel} oldResourceControl ResourceControl to duplicate\n * @param {ResourceControlViewModel} newResourceControl ResourceControl to apply duplication to\n */\n function duplicateResourceControl(userId, oldResourceControl, newResourceControl) {\n const ownershipParameters = ResourceControlHelper.RCViewModelToOwnershipParameters(userId, oldResourceControl);\n return updateResourceControl(newResourceControl.Id, ownershipParameters);\n }\n\n /**\n * Update an existing ResourceControl or create a new one on existing resource without RC\n * @param {ResourceControlTypeString} rcType Type of ResourceControl\n * @param {String} resourceId ID of involved Resource\n * @param {ResourceControlViewModel} resourceControl Previous ResourceControl (can be undefined)\n * @param {AccessControlPanelData} formValues View data generated by AccessControlPanel\n */\n function applyResourceControlChange(rcType, resourceId, resourceControl, formValues) {\n const ownershipParameters = ResourceControlHelper.RCPanelDataToOwnershipParameters(formValues);\n if (resourceControl) {\n return updateResourceControl(resourceControl.Id, ownershipParameters);\n } else {\n return createResourceControl(rcType, resourceId, ownershipParameters);\n }\n }\n\n /**\n * Retrieve users and team details for ResourceControlViewModel\n * @param {ResourceControlViewModel} resourceControl ResourceControl view model\n */\n function retrieveOwnershipDetails(resourceControl) {\n var deferred = $q.defer();\n\n if (!resourceControl) {\n deferred.resolve({ authorizedUsers: [], authorizedTeams: [] });\n return deferred.promise;\n }\n\n $q.all({\n users: resourceControl.UserAccesses.length > 0 ? UserService.users(false) : [],\n teams: resourceControl.TeamAccesses.length > 0 ? TeamService.teams() : [],\n })\n .then(function success(data) {\n var authorizedUsers = ResourceControlHelper.retrieveAuthorizedUsers(resourceControl, data.users);\n var authorizedTeams = ResourceControlHelper.retrieveAuthorizedTeams(resourceControl, data.teams);\n deferred.resolve({ authorizedUsers: authorizedUsers, authorizedTeams: authorizedTeams });\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve user and team information', err: err });\n });\n\n return deferred.promise;\n }\n\n function retrieveUserPermissionsOnResource(userID, isAdministrator, resourceControl) {\n var deferred = $q.defer();\n\n if (!resourceControl || isAdministrator) {\n deferred.resolve({ isPartOfRestrictedUsers: false, isLeaderOfAnyRestrictedTeams: false });\n return deferred.promise;\n }\n\n var found = _.find(resourceControl.UserAccesses, { UserId: userID });\n if (found) {\n deferred.resolve({ isPartOfRestrictedUsers: true, isLeaderOfAnyRestrictedTeams: false });\n } else {\n var isTeamLeader = false;\n UserService.userMemberships(userID)\n .then(function success(data) {\n var memberships = data;\n isTeamLeader = ResourceControlHelper.isLeaderOfAnyRestrictedTeams(memberships, resourceControl);\n deferred.resolve({ isPartOfRestrictedUsers: false, isLeaderOfAnyRestrictedTeams: isTeamLeader });\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve user memberships', err: err });\n });\n }\n\n return deferred.promise;\n }\n\n /**\n * END PUBLIC SECTION\n */\n\n return service;\n },\n]);\n","import { SettingsViewModel, PublicSettingsViewModel } from '../../models/settings';\n\nangular.module('portainer.app').factory('SettingsService', [\n '$q',\n 'Settings',\n function SettingsServiceFactory($q, Settings) {\n 'use strict';\n var service = {};\n\n service.settings = function () {\n var deferred = $q.defer();\n\n Settings.get()\n .$promise.then(function success(data) {\n var settings = new SettingsViewModel(data);\n deferred.resolve(settings);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve application settings', err: err });\n });\n\n return deferred.promise;\n };\n\n service.update = function (settings) {\n return Settings.update({}, settings).$promise;\n };\n\n service.publicSettings = function () {\n var deferred = $q.defer();\n\n Settings.publicSettings()\n .$promise.then(function success(data) {\n var settings = new PublicSettingsViewModel(data);\n deferred.resolve(settings);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve application settings', err: err });\n });\n\n return deferred.promise;\n };\n\n service.checkLDAPConnectivity = function (settings) {\n return Settings.checkLDAPConnectivity({}, settings).$promise;\n };\n\n return service;\n },\n]);\n","import angular from 'angular';\n\nangular.module('portainer.app').service('SSLService', SSLServiceFactory);\n\n/* @ngInject */\nfunction SSLServiceFactory(SSL) {\n return {\n upload,\n get,\n };\n\n function get() {\n return SSL.get().$promise;\n }\n\n function upload(httpEnabled, cert, key) {\n return SSL.upload({ httpEnabled, cert, key }).$promise;\n }\n}\n","import _ from 'lodash-es';\nimport { RepositoryMechanismTypes } from 'Kubernetes/models/deploy';\nimport { StackViewModel, OrphanedStackViewModel } from '../../models/stack';\n\nangular.module('portainer.app').factory('StackService', [\n '$q',\n '$async',\n 'Stack',\n 'FileUploadService',\n 'StackHelper',\n 'ServiceService',\n 'ContainerService',\n 'SwarmService',\n 'EndpointProvider',\n function StackServiceFactory($q, $async, Stack, FileUploadService, StackHelper, ServiceService, ContainerService, SwarmService, EndpointProvider) {\n 'use strict';\n var service = {\n updateGit,\n updateKubeGit,\n };\n\n service.stack = function (id) {\n var deferred = $q.defer();\n\n Stack.get({ id: id })\n .$promise.then(function success(data) {\n var stack = new StackViewModel(data);\n deferred.resolve(stack);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve stack details', err: err });\n });\n\n return deferred.promise;\n };\n\n service.getStackFile = function (id) {\n var deferred = $q.defer();\n\n Stack.getStackFile({ id: id })\n .$promise.then(function success(data) {\n deferred.resolve(data.StackFileContent);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve stack content', err: err });\n });\n\n return deferred.promise;\n };\n\n service.migrateSwarmStack = function (stack, targetEndpointId, newName) {\n var deferred = $q.defer();\n\n EndpointProvider.setEndpointID(targetEndpointId);\n\n SwarmService.swarm()\n .then(function success(data) {\n var swarm = data;\n if (swarm.Id === stack.SwarmId) {\n deferred.reject({ msg: 'Target environment is located in the same Swarm cluster as the current environment', err: null });\n return;\n }\n return Stack.migrate({ id: stack.Id, endpointId: stack.EndpointId }, { EndpointID: targetEndpointId, SwarmID: swarm.Id, Name: newName }).$promise;\n })\n .then(function success() {\n deferred.resolve();\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to migrate stack', err: err });\n })\n .finally(function final() {\n EndpointProvider.setEndpointID(stack.EndpointId);\n });\n\n return deferred.promise;\n };\n\n service.migrateComposeStack = function (stack, targetEndpointId, newName) {\n var deferred = $q.defer();\n\n EndpointProvider.setEndpointID(targetEndpointId);\n\n Stack.migrate({ id: stack.Id, endpointId: stack.EndpointId }, { EndpointID: targetEndpointId, Name: newName })\n .$promise.then(function success() {\n deferred.resolve();\n })\n .catch(function error(err) {\n EndpointProvider.setEndpointID(stack.EndpointId);\n deferred.reject({ msg: 'Unable to migrate stack', err: err });\n });\n\n return deferred.promise;\n };\n\n service.stacks = function (compose, swarm, endpointId, includeOrphanedStacks = false) {\n var deferred = $q.defer();\n\n var queries = [];\n if (compose) {\n queries.push(service.composeStacks(endpointId, true, { EndpointID: endpointId, IncludeOrphanedStacks: includeOrphanedStacks }));\n }\n if (swarm) {\n queries.push(service.swarmStacks(endpointId, true, { IncludeOrphanedStacks: includeOrphanedStacks }));\n }\n\n $q.all(queries)\n .then(function success(data) {\n var stacks = [];\n if (data[0]) {\n stacks = stacks.concat(data[0]);\n }\n if (data[1]) {\n stacks = stacks.concat(data[1]);\n }\n deferred.resolve(stacks);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve stacks', err: err });\n });\n\n return deferred.promise;\n };\n\n service.externalSwarmStacks = function () {\n var deferred = $q.defer();\n\n ServiceService.services()\n .then(function success(services) {\n deferred.resolve(StackHelper.getExternalStacksFromServices(services));\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve external stacks', err: err });\n });\n\n return deferred.promise;\n };\n\n service.externalComposeStacks = function () {\n var deferred = $q.defer();\n\n ContainerService.containers(1)\n .then(function success(containers) {\n deferred.resolve(StackHelper.getExternalStacksFromContainers(containers));\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve external stacks', err: err });\n });\n\n return deferred.promise;\n };\n\n service.unionStacks = function (stacks, externalStacks) {\n stacks.forEach((stack) => {\n externalStacks.forEach((externalStack) => {\n if (stack.Orphaned && stack.Name == externalStack.Name) {\n stack.OrphanedRunning = true;\n }\n });\n });\n const result = _.unionWith(stacks, externalStacks, function (a, b) {\n return a.Name === b.Name;\n });\n\n return result;\n };\n\n service.composeStacks = function (endpointId, includeExternalStacks, filters) {\n var deferred = $q.defer();\n\n $q.all({\n stacks: Stack.query({ filters: filters }).$promise,\n externalStacks: includeExternalStacks ? service.externalComposeStacks() : [],\n })\n .then(function success(data) {\n var stacks = data.stacks.map(function (item) {\n if (item.EndpointId == endpointId) {\n return new StackViewModel(item);\n } else {\n return new OrphanedStackViewModel(item);\n }\n });\n\n var externalStacks = data.externalStacks;\n const result = service.unionStacks(stacks, externalStacks);\n deferred.resolve(result);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve stacks', err: err });\n });\n\n return deferred.promise;\n };\n\n service.swarmStacks = function (endpointId, includeExternalStacks, filters = {}) {\n var deferred = $q.defer();\n\n SwarmService.swarm()\n .then(function success(data) {\n var swarm = data;\n filters = { SwarmID: swarm.Id, ...filters };\n\n return $q.all({\n stacks: Stack.query({ filters: filters }).$promise,\n externalStacks: includeExternalStacks ? service.externalSwarmStacks() : [],\n });\n })\n .then(function success(data) {\n var stacks = data.stacks.map(function (item) {\n if (item.EndpointId == endpointId) {\n return new StackViewModel(item);\n } else {\n return new OrphanedStackViewModel(item);\n }\n });\n\n var externalStacks = data.externalStacks;\n const result = service.unionStacks(stacks, externalStacks);\n deferred.resolve(result);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve stacks', err: err });\n });\n\n return deferred.promise;\n };\n\n service.remove = function (stack, external, endpointId) {\n var deferred = $q.defer();\n\n Stack.remove({ id: stack.Id ? stack.Id : stack.Name, external: external, endpointId: endpointId })\n .$promise.then(function success() {\n deferred.resolve();\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to remove the stack', err: err });\n });\n\n return deferred.promise;\n };\n\n service.associate = function (stack, endpointId, orphanedRunning) {\n var deferred = $q.defer();\n\n if (stack.Type == 1) {\n SwarmService.swarm()\n .then(function success(data) {\n const swarm = data;\n return Stack.associate({ id: stack.Id, endpointId: endpointId, swarmId: swarm.Id, orphanedRunning }).$promise;\n })\n .then(function success(data) {\n deferred.resolve(data);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to associate the stack', err: err });\n });\n } else {\n Stack.associate({ id: stack.Id, endpointId: endpointId, orphanedRunning })\n .$promise.then(function success(data) {\n deferred.resolve(data);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to associate the stack', err: err });\n });\n }\n\n return deferred.promise;\n };\n\n service.updateStack = function (stack, stackFile, env, prune) {\n return Stack.update({ endpointId: stack.EndpointId }, { id: stack.Id, StackFileContent: stackFile, Env: env, Prune: prune }).$promise;\n };\n\n service.updateKubeStack = function (stack, stackFile, gitConfig) {\n let payload = {};\n\n if (stackFile) {\n payload = {\n StackFileContent: stackFile,\n };\n } else {\n const autoUpdate = {};\n if (gitConfig.AutoUpdate && gitConfig.AutoUpdate.RepositoryAutomaticUpdates) {\n if (gitConfig.AutoUpdate.RepositoryMechanism === RepositoryMechanismTypes.INTERVAL) {\n autoUpdate.Interval = gitConfig.AutoUpdate.RepositoryFetchInterval;\n } else if (gitConfig.AutoUpdate.RepositoryMechanism === RepositoryMechanismTypes.WEBHOOK) {\n autoUpdate.Webhook = gitConfig.AutoUpdate.RepositoryWebhookURL.split('/').reverse()[0];\n }\n }\n\n payload = {\n AutoUpdate: autoUpdate,\n RepositoryReferenceName: gitConfig.RefName,\n RepositoryAuthentication: gitConfig.RepositoryAuthentication,\n RepositoryUsername: gitConfig.RepositoryUsername,\n RepositoryPassword: gitConfig.RepositoryPassword,\n };\n }\n\n return Stack.update({ id: stack.Id, endpointId: stack.EndpointId }, payload).$promise;\n };\n\n service.createComposeStackFromFileUpload = function (name, stackFile, env, endpointId) {\n return FileUploadService.createComposeStack(name, stackFile, env, endpointId);\n };\n\n service.createSwarmStackFromFileUpload = function (name, stackFile, env, endpointId) {\n var deferred = $q.defer();\n\n SwarmService.swarm()\n .then(function success(data) {\n var swarm = data;\n return FileUploadService.createSwarmStack(name, swarm.Id, stackFile, env, endpointId);\n })\n .then(function success(data) {\n deferred.resolve(data.data);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to create the stack', err: err });\n });\n\n return deferred.promise;\n };\n service.createComposeStackFromFileContent = function (name, stackFileContent, env, endpointId) {\n var payload = {\n Name: name,\n StackFileContent: stackFileContent,\n Env: env,\n };\n return Stack.create({ method: 'string', type: 2, endpointId: endpointId }, payload).$promise;\n };\n\n service.createSwarmStackFromFileContent = function (name, stackFileContent, env, endpointId) {\n var deferred = $q.defer();\n\n SwarmService.swarm()\n .then(function success(swarm) {\n var payload = {\n Name: name,\n SwarmID: swarm.Id,\n StackFileContent: stackFileContent,\n Env: env,\n };\n return Stack.create({ method: 'string', type: 1, endpointId: endpointId }, payload).$promise;\n })\n .then(function success(data) {\n deferred.resolve(data);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to create the stack', err: err });\n });\n\n return deferred.promise;\n };\n\n service.createComposeStackFromGitRepository = function (name, repositoryOptions, env, endpointId) {\n var payload = {\n Name: name,\n RepositoryURL: repositoryOptions.RepositoryURL,\n RepositoryReferenceName: repositoryOptions.RepositoryReferenceName,\n ComposeFile: repositoryOptions.ComposeFilePathInRepository,\n AdditionalFiles: repositoryOptions.AdditionalFiles,\n RepositoryAuthentication: repositoryOptions.RepositoryAuthentication,\n RepositoryUsername: repositoryOptions.RepositoryUsername,\n RepositoryPassword: repositoryOptions.RepositoryPassword,\n Env: env,\n };\n\n if (repositoryOptions.AutoUpdate) {\n payload.AutoUpdate = repositoryOptions.AutoUpdate;\n }\n\n return Stack.create({ method: 'repository', type: 2, endpointId: endpointId }, payload).$promise;\n };\n\n service.createSwarmStackFromGitRepository = function (name, repositoryOptions, env, endpointId) {\n var deferred = $q.defer();\n\n SwarmService.swarm()\n .then(function success(data) {\n var swarm = data;\n var payload = {\n Name: name,\n SwarmID: swarm.Id,\n RepositoryURL: repositoryOptions.RepositoryURL,\n RepositoryReferenceName: repositoryOptions.RepositoryReferenceName,\n ComposeFile: repositoryOptions.ComposeFilePathInRepository,\n AdditionalFiles: repositoryOptions.AdditionalFiles,\n RepositoryAuthentication: repositoryOptions.RepositoryAuthentication,\n RepositoryUsername: repositoryOptions.RepositoryUsername,\n RepositoryPassword: repositoryOptions.RepositoryPassword,\n Env: env,\n };\n\n if (repositoryOptions.AutoUpdate) {\n payload.AutoUpdate = repositoryOptions.AutoUpdate;\n }\n\n return Stack.create({ method: 'repository', type: 1, endpointId: endpointId }, payload).$promise;\n })\n .then(function success(data) {\n deferred.resolve(data);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to create the stack', err: err });\n });\n\n return deferred.promise;\n };\n\n service.duplicateStack = function duplicateStack(name, stackFileContent, env, endpointId, type) {\n var action = type === 1 ? service.createSwarmStackFromFileContent : service.createComposeStackFromFileContent;\n return action(name, stackFileContent, env, endpointId);\n };\n\n async function kubernetesDeployAsync(endpointId, method, payload) {\n try {\n await Stack.create({ endpointId: endpointId, method: method, type: 3 }, payload).$promise;\n } catch (err) {\n throw { err: err };\n }\n }\n\n service.kubernetesDeploy = function (endpointId, method, payload) {\n return $async(kubernetesDeployAsync, endpointId, method, payload);\n };\n\n service.start = start;\n function start(id) {\n return Stack.start({ id }).$promise;\n }\n\n service.stop = stop;\n function stop(id) {\n return Stack.stop({ id }).$promise;\n }\n\n function updateGit(id, endpointId, env, prune, gitConfig) {\n return Stack.updateGit(\n { endpointId, id },\n {\n env,\n prune,\n RepositoryReferenceName: gitConfig.RefName,\n RepositoryAuthentication: gitConfig.RepositoryAuthentication,\n RepositoryUsername: gitConfig.RepositoryUsername,\n RepositoryPassword: gitConfig.RepositoryPassword,\n }\n ).$promise;\n }\n\n function updateKubeGit(id, endpointId, namespace, gitConfig) {\n return Stack.updateGit(\n { endpointId, id },\n {\n Namespace: namespace,\n RepositoryReferenceName: gitConfig.RefName,\n RepositoryAuthentication: gitConfig.RepositoryAuthentication,\n RepositoryUsername: gitConfig.RepositoryUsername,\n RepositoryPassword: gitConfig.RepositoryPassword,\n }\n ).$promise;\n }\n\n service.updateGitStackSettings = function (id, endpointId, env, gitConfig) {\n // prepare auto update\n const autoUpdate = {};\n\n if (gitConfig.AutoUpdate.RepositoryAutomaticUpdates) {\n if (gitConfig.AutoUpdate.RepositoryMechanism === RepositoryMechanismTypes.INTERVAL) {\n autoUpdate.Interval = gitConfig.AutoUpdate.RepositoryFetchInterval;\n } else if (gitConfig.AutoUpdate.RepositoryMechanism === RepositoryMechanismTypes.WEBHOOK) {\n autoUpdate.Webhook = gitConfig.AutoUpdate.RepositoryWebhookURL.split('/').reverse()[0];\n }\n }\n\n return Stack.updateGitStackSettings(\n { endpointId, id },\n {\n AutoUpdate: autoUpdate,\n Env: env,\n RepositoryReferenceName: gitConfig.RefName,\n RepositoryAuthentication: gitConfig.RepositoryAuthentication,\n RepositoryUsername: gitConfig.RepositoryUsername,\n RepositoryPassword: gitConfig.RepositoryPassword,\n }\n ).$promise;\n };\n\n return service;\n },\n]);\n","import { StatusVersionViewModel, StatusViewModel } from '../../models/status';\n\nangular.module('portainer.app').factory('StatusService', [\n '$q',\n 'Status',\n function StatusServiceFactory($q, Status) {\n 'use strict';\n var service = {};\n\n service.status = function () {\n var deferred = $q.defer();\n\n Status.get()\n .$promise.then(function success(data) {\n var status = new StatusViewModel(data);\n deferred.resolve(status);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve application status', err: err });\n });\n\n return deferred.promise;\n };\n\n service.version = function () {\n var deferred = $q.defer();\n\n Status.version()\n .$promise.then(function success(data) {\n var status = new StatusVersionViewModel(data);\n deferred.resolve(status);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve application version info', err: err });\n });\n\n return deferred.promise;\n };\n\n return service;\n },\n]);\n","angular.module('portainer.app').factory('SupportService', [\n '$q',\n 'Support',\n function SupportServiceFactory($q, Support) {\n 'use strict';\n var service = {};\n\n service.supportProducts = function () {\n var deferred = $q.defer();\n\n Support.get()\n .$promise.then(function success(data) {\n deferred.resolve(data);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve support options', err: err });\n });\n\n return deferred.promise;\n };\n\n return service;\n },\n]);\n","import { TagViewModel } from '../../models/tag';\n\nangular.module('portainer.app').factory('TagService', [\n '$q',\n '$async',\n 'Tags',\n function TagServiceFactory($q, $async, Tags) {\n 'use strict';\n var service = {};\n\n service.tags = function () {\n var deferred = $q.defer();\n Tags.query()\n .$promise.then(function success(data) {\n var tags = data.map(function (item) {\n return new TagViewModel(item);\n });\n deferred.resolve(tags);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve tags', err: err });\n });\n return deferred.promise;\n };\n\n service.tagNames = function () {\n var deferred = $q.defer();\n Tags.query()\n .$promise.then(function success(data) {\n var tags = data.map(function (item) {\n return item.Name;\n });\n deferred.resolve(tags);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve tags', err: err });\n });\n return deferred.promise;\n };\n\n async function createTagAsync(name) {\n var payload = {\n Name: name,\n };\n try {\n const tag = await Tags.create({}, payload).$promise;\n return new TagViewModel(tag);\n } catch (err) {\n throw { msg: 'Unable to create tag', err };\n }\n }\n\n function createTag(name) {\n return $async(createTagAsync, name);\n }\n service.createTag = createTag;\n\n service.deleteTag = function (id) {\n return Tags.remove({ id: id }).$promise;\n };\n\n return service;\n },\n]);\n","import { TeamMembershipModel } from '../../models/teamMembership';\n\nangular.module('portainer.app').factory('TeamMembershipService', [\n '$q',\n 'TeamMemberships',\n function TeamMembershipFactory($q, TeamMemberships) {\n 'use strict';\n var service = {};\n\n service.memberships = function () {\n var deferred = $q.defer();\n TeamMemberships.query()\n .$promise.then(function success(data) {\n var memberships = data.map(function (item) {\n return new TeamMembershipModel(item);\n });\n deferred.resolve(memberships);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve team memberships', err: err });\n });\n return deferred.promise;\n };\n\n service.createMembership = function (userId, teamId, role) {\n var payload = {\n UserID: userId,\n TeamID: teamId,\n Role: role,\n };\n return TeamMemberships.create({}, payload).$promise;\n };\n\n service.deleteMembership = function (id) {\n return TeamMemberships.remove({ id: id }).$promise;\n };\n\n service.updateMembership = function (id, userId, teamId, role) {\n var payload = {\n UserID: userId,\n TeamID: teamId,\n Role: role,\n };\n return TeamMemberships.update({ id: id }, payload).$promise;\n };\n\n return service;\n },\n]);\n","import { TeamViewModel } from '../../models/team';\nimport { TeamMembershipModel } from '../../models/teamMembership';\n\nangular.module('portainer.app').factory('TeamService', [\n '$q',\n 'Teams',\n 'TeamMembershipService',\n function TeamServiceFactory($q, Teams, TeamMembershipService) {\n 'use strict';\n var service = {};\n\n service.teams = function () {\n var deferred = $q.defer();\n Teams.query()\n .$promise.then(function success(data) {\n var teams = data.map(function (item) {\n return new TeamViewModel(item);\n });\n deferred.resolve(teams);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve teams', err: err });\n });\n return deferred.promise;\n };\n\n service.team = function (id) {\n var deferred = $q.defer();\n Teams.get({ id: id })\n .$promise.then(function success(data) {\n var team = new TeamViewModel(data);\n deferred.resolve(team);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve team details', err: err });\n });\n return deferred.promise;\n };\n\n service.createTeam = function (name, leaderIds) {\n var deferred = $q.defer();\n var payload = {\n Name: name,\n };\n Teams.create({}, payload)\n .$promise.then(function success(data) {\n var teamId = data.Id;\n var teamMembershipQueries = [];\n angular.forEach(leaderIds, function (userId) {\n teamMembershipQueries.push(TeamMembershipService.createMembership(userId, teamId, 1));\n });\n $q.all(teamMembershipQueries).then(function success() {\n deferred.resolve();\n });\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to create team', err: err });\n });\n return deferred.promise;\n };\n\n service.deleteTeam = function (id) {\n return Teams.remove({ id: id }).$promise;\n };\n\n service.userMemberships = function (id) {\n var deferred = $q.defer();\n Teams.queryMemberships({ id: id })\n .$promise.then(function success(data) {\n var memberships = data.map(function (item) {\n return new TeamMembershipModel(item);\n });\n deferred.resolve(memberships);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve user memberships for the team', err: err });\n });\n return deferred.promise;\n };\n\n return service;\n },\n]);\n","import { DockerHubViewModel } from 'Portainer/models/dockerhub';\nimport { TemplateViewModel } from '../../models/template';\n\nangular.module('portainer.app').factory('TemplateService', TemplateServiceFactory);\n\n/* @ngInject */\nfunction TemplateServiceFactory($q, Templates, TemplateHelper, EndpointProvider, ImageHelper, ContainerHelper, EndpointService) {\n var service = {};\n\n service.templates = function () {\n const deferred = $q.defer();\n const endpointId = EndpointProvider.currentEndpoint().Id;\n\n $q.all({\n templates: Templates.query().$promise,\n registries: EndpointService.registries(endpointId),\n })\n .then(function success({ templates, registries }) {\n const version = templates.version;\n deferred.resolve(\n templates.templates.map((item) => {\n try {\n const template = new TemplateViewModel(item, version);\n const registryURL = template.RegistryModel.Registry.URL;\n const registry = registryURL ? registries.find((reg) => reg.URL === registryURL) : new DockerHubViewModel();\n template.RegistryModel.Registry = registry;\n return template;\n } catch (err) {\n deferred.reject({ msg: 'Unable to retrieve templates', err: err });\n }\n })\n );\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve templates', err: err });\n });\n\n return deferred.promise;\n };\n\n service.templateFile = templateFile;\n function templateFile(repositoryUrl, composeFilePathInRepository) {\n return Templates.file({ repositoryUrl, composeFilePathInRepository }).$promise;\n }\n\n service.createTemplateConfiguration = function (template, containerName, network) {\n var imageConfiguration = ImageHelper.createImageConfigForContainer(template.RegistryModel);\n var containerConfiguration = createContainerConfiguration(template, containerName, network);\n containerConfiguration.Image = imageConfiguration.fromImage;\n return containerConfiguration;\n };\n\n function createContainerConfiguration(template, containerName, network) {\n var configuration = TemplateHelper.getDefaultContainerConfiguration();\n configuration.HostConfig.NetworkMode = network.Name;\n configuration.HostConfig.Privileged = template.Privileged;\n configuration.HostConfig.RestartPolicy = { Name: template.RestartPolicy };\n configuration.HostConfig.ExtraHosts = template.Hosts ? template.Hosts : [];\n configuration.name = containerName;\n configuration.Hostname = template.Hostname;\n configuration.Env = TemplateHelper.EnvToStringArray(template.Env);\n configuration.Cmd = ContainerHelper.commandStringToArray(template.Command);\n var portConfiguration = TemplateHelper.portArrayToPortConfiguration(template.Ports);\n configuration.HostConfig.PortBindings = portConfiguration.bindings;\n configuration.ExposedPorts = portConfiguration.exposedPorts;\n var consoleConfiguration = TemplateHelper.getConsoleConfiguration(template.Interactive);\n configuration.OpenStdin = consoleConfiguration.openStdin;\n configuration.Tty = consoleConfiguration.tty;\n configuration.Labels = TemplateHelper.updateContainerConfigurationWithLabels(template.Labels);\n return configuration;\n }\n\n service.updateContainerConfigurationWithVolumes = function (configuration, template, generatedVolumesPile) {\n var volumes = template.Volumes;\n TemplateHelper.createVolumeBindings(volumes, generatedVolumesPile);\n volumes.forEach(function (volume) {\n if (volume.binding) {\n configuration.Volumes[volume.container] = {};\n configuration.HostConfig.Binds.push(volume.binding);\n }\n });\n };\n\n return service;\n}\n","import _ from 'lodash-es';\nimport { UserViewModel, UserTokenModel } from '../../models/user';\nimport { TeamMembershipModel } from '../../models/teamMembership';\n\nangular.module('portainer.app').factory('UserService', [\n '$q',\n 'Users',\n 'UserHelper',\n 'TeamService',\n 'TeamMembershipService',\n function UserServiceFactory($q, Users, UserHelper, TeamService, TeamMembershipService) {\n 'use strict';\n var service = {};\n\n service.users = function (includeAdministrators) {\n var deferred = $q.defer();\n\n Users.query({})\n .$promise.then(function success(data) {\n var users = data.map(function (user) {\n return new UserViewModel(user);\n });\n if (!includeAdministrators) {\n users = UserHelper.filterNonAdministratorUsers(users);\n }\n deferred.resolve(users);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve users', err: err });\n });\n\n return deferred.promise;\n };\n\n service.user = function (id) {\n var deferred = $q.defer();\n\n Users.get({ id: id })\n .$promise.then(function success(data) {\n var user = new UserViewModel(data);\n deferred.resolve(user);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve user details', err: err });\n });\n\n return deferred.promise;\n };\n\n service.createUser = function (username, password, role, teamIds) {\n var deferred = $q.defer();\n\n var payload = {\n username: username,\n password: password,\n role: role,\n };\n\n Users.create({}, payload)\n .$promise.then(function success(data) {\n var userId = data.Id;\n var teamMembershipQueries = [];\n angular.forEach(teamIds, function (teamId) {\n teamMembershipQueries.push(TeamMembershipService.createMembership(userId, teamId, 2));\n });\n $q.all(teamMembershipQueries).then(function success() {\n deferred.resolve();\n });\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to create user', err: err });\n });\n\n return deferred.promise;\n };\n\n service.deleteUser = function (id) {\n return Users.remove({ id: id }).$promise;\n };\n\n service.updateUser = function (id, { password, role, username }) {\n return Users.update({ id }, { password, role, username }).$promise;\n };\n\n service.updateUserPassword = function (id, currentPassword, newPassword) {\n var payload = {\n Password: currentPassword,\n NewPassword: newPassword,\n };\n\n return Users.updatePassword({ id: id }, payload).$promise;\n };\n\n service.updateUserTheme = function (id, userTheme) {\n return Users.updateTheme({ id }, { userTheme }).$promise;\n };\n\n service.userMemberships = function (id) {\n var deferred = $q.defer();\n\n Users.queryMemberships({ id: id })\n .$promise.then(function success(data) {\n var memberships = data.map(function (item) {\n return new TeamMembershipModel(item);\n });\n deferred.resolve(memberships);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve user memberships', err: err });\n });\n\n return deferred.promise;\n };\n\n service.userLeadingTeams = function (id) {\n var deferred = $q.defer();\n\n $q.all({\n teams: TeamService.teams(),\n memberships: service.userMemberships(id),\n })\n .then(function success(data) {\n var memberships = data.memberships;\n var teams = data.teams.filter(function (team) {\n var membership = _.find(memberships, { TeamId: team.Id });\n if (membership && membership.Role === 1) {\n return team;\n }\n });\n deferred.resolve(teams);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve user teams', err: err });\n });\n\n return deferred.promise;\n };\n\n service.createAccessToken = function (id, description) {\n const deferred = $q.defer();\n const payload = { description };\n Users.createAccessToken({ id }, payload)\n .$promise.then((data) => {\n deferred.resolve(data);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to create user', err: err });\n });\n return deferred.promise;\n };\n\n service.getAccessTokens = function (id) {\n var deferred = $q.defer();\n\n Users.getAccessTokens({ id: id })\n .$promise.then(function success(data) {\n var userTokens = data.map(function (item) {\n return new UserTokenModel(item);\n });\n deferred.resolve(userTokens);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve user tokens', err: err });\n });\n\n return deferred.promise;\n };\n\n service.deleteAccessToken = function (id, tokenId) {\n return Users.deleteAccessToken({ id: id, tokenId: tokenId }).$promise;\n };\n\n service.initAdministrator = function (username, password) {\n return Users.initAdminUser({ Username: username, Password: password }).$promise;\n };\n\n service.administratorExists = function () {\n var deferred = $q.defer();\n\n Users.checkAdminUser({})\n .$promise.then(function success() {\n deferred.resolve(true);\n })\n .catch(function error(err) {\n if (err.status === 404) {\n deferred.resolve(false);\n }\n deferred.reject({ msg: 'Unable to verify administrator account existence', err: err });\n });\n\n return deferred.promise;\n };\n\n return service;\n },\n]);\n","import { WebhookViewModel } from '../../models/webhook';\n\nangular.module('portainer.app').factory('WebhookService', [\n '$q',\n 'Webhooks',\n function WebhookServiceFactory($q, Webhooks) {\n 'use strict';\n var service = {};\n\n service.webhooks = function (serviceID, endpointID) {\n var deferred = $q.defer();\n var filters = { ResourceID: serviceID, EndpointID: endpointID };\n\n Webhooks.query({ filters: filters })\n .$promise.then(function success(data) {\n var webhooks = data.map(function (item) {\n return new WebhookViewModel(item);\n });\n deferred.resolve(webhooks);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve webhooks', err: err });\n });\n\n return deferred.promise;\n };\n\n service.createServiceWebhook = function (serviceID, endpointID, registryID) {\n return Webhooks.create({ ResourceID: serviceID, EndpointID: endpointID, WebhookType: 1, registryID }).$promise;\n };\n\n service.updateServiceWebhook = function (id, registryID) {\n return Webhooks.update({ id, registryID }).$promise;\n };\n\n service.deleteWebhook = function (id) {\n return Webhooks.remove({ id: id }).$promise;\n };\n\n return service;\n },\n]);\n","/**\n * Look a the following PR for how to use the wrapper\n * and documentation about it\n * https://github.com/portainer/portainer/pull/2945\n */\n\nangular.module('portainer').factory('$async', [\n '$q',\n function ($q) {\n return function (asyncFunc, ...args) {\n const def = $q.defer();\n const wrapper = function (params) {\n const deferred = $q.defer();\n asyncFunc(...params)\n .then(deferred.resolve)\n .catch(deferred.reject);\n return deferred.promise;\n };\n\n wrapper(args).then(def.resolve).catch(def.reject);\n return def.promise;\n };\n },\n]);\n","import { clear as clearSessionStorage } from './session-storage';\n\nangular.module('portainer.app').factory('Authentication', [\n '$async',\n '$state',\n 'Auth',\n 'OAuth',\n 'jwtHelper',\n 'LocalStorage',\n 'StateManager',\n 'EndpointProvider',\n 'UserService',\n 'ThemeManager',\n function AuthenticationFactory($async, $state, Auth, OAuth, jwtHelper, LocalStorage, StateManager, EndpointProvider, UserService, ThemeManager) {\n 'use strict';\n\n var service = {};\n var user = {};\n\n service.init = init;\n service.OAuthLogin = OAuthLogin;\n service.login = login;\n service.logout = logout;\n service.isAuthenticated = isAuthenticated;\n service.getUserDetails = getUserDetails;\n service.isAdmin = isAdmin;\n\n async function initAsync() {\n try {\n const jwt = LocalStorage.getJWT();\n if (jwt) {\n await setUser(jwt);\n }\n return !!jwt;\n } catch (error) {\n return false;\n }\n }\n\n async function logoutAsync(performApiLogout) {\n if (performApiLogout) {\n await Auth.logout().$promise;\n }\n\n clearSessionStorage();\n StateManager.clean();\n EndpointProvider.clean();\n LocalStorage.cleanAuthData();\n LocalStorage.storeLoginStateUUID('');\n }\n\n function logout(performApiLogout) {\n return $async(logoutAsync, performApiLogout);\n }\n\n function init() {\n return $async(initAsync);\n }\n\n async function OAuthLoginAsync(code) {\n const response = await OAuth.validate({ code: code }).$promise;\n await setUser(response.jwt);\n }\n\n function OAuthLogin(code) {\n return $async(OAuthLoginAsync, code);\n }\n\n async function loginAsync(username, password) {\n const response = await Auth.login({ username: username, password: password }).$promise;\n await setUser(response.jwt);\n }\n\n function login(username, password) {\n return $async(loginAsync, username, password);\n }\n\n function isAuthenticated() {\n var jwt = LocalStorage.getJWT();\n return jwt && !jwtHelper.isTokenExpired(jwt);\n }\n\n function getUserDetails() {\n return user;\n }\n\n async function setUserTheme() {\n const data = await UserService.user(user.ID);\n // Initialize user theme base on Usertheme from database\n const userTheme = data.UserTheme;\n if (userTheme === 'auto' || !userTheme) {\n ThemeManager.autoTheme();\n } else {\n ThemeManager.setTheme(userTheme);\n }\n }\n\n async function setUser(jwt) {\n LocalStorage.storeJWT(jwt);\n var tokenPayload = jwtHelper.decodeToken(jwt);\n user.username = tokenPayload.username;\n user.ID = tokenPayload.id;\n user.role = tokenPayload.role;\n await setUserTheme();\n }\n\n function isAdmin() {\n if (user.role === 1) {\n return true;\n }\n return false;\n }\n\n return service;\n },\n]);\n","import Chart from 'chart.js';\nimport filesize from 'filesize';\n\nangular.module('portainer.app').factory('ChartService', [\n function ChartService() {\n 'use strict';\n\n // Max. number of items to display on a chart\n var CHART_LIMIT = 600;\n\n var service = {};\n\n function defaultChartOptions(pos, tooltipCallback, scalesCallback, isStacked) {\n return {\n animation: { duration: 0 },\n responsiveAnimationDuration: 0,\n responsive: true,\n tooltips: {\n mode: 'index',\n intersect: false,\n position: pos,\n callbacks: {\n label: function (tooltipItem, data) {\n var datasetLabel = data.datasets[tooltipItem.datasetIndex].label;\n return tooltipCallback(datasetLabel, tooltipItem.yLabel);\n },\n },\n },\n layout: {\n padding: {\n left: 15,\n },\n },\n hover: { animationDuration: 0 },\n scales: {\n yAxes: [\n {\n stacked: isStacked,\n ticks: {\n beginAtZero: true,\n callback: scalesCallback,\n precision: 0,\n },\n },\n ],\n },\n };\n }\n\n function CreateChart(context, label, tooltipCallback, scalesCallback) {\n return new Chart(context, {\n type: 'line',\n data: {\n labels: [],\n datasets: [\n {\n label: label,\n data: [],\n fill: true,\n backgroundColor: 'rgba(151,187,205,0.4)',\n borderColor: 'rgba(151,187,205,0.6)',\n pointBackgroundColor: 'rgba(151,187,205,1)',\n pointBorderColor: 'rgba(151,187,205,1)',\n pointRadius: 2,\n borderWidth: 2,\n },\n ],\n },\n options: defaultChartOptions('nearest', tooltipCallback, scalesCallback),\n });\n }\n\n function CreateMemoryChart(context, tooltipCallback, scalesCallback) {\n return new Chart(context, {\n type: 'line',\n data: {\n labels: [],\n datasets: [\n {\n label: 'Memory',\n data: [],\n fill: true,\n backgroundColor: 'rgba(151,187,205,0.4)',\n borderColor: 'rgba(151,187,205,0.6)',\n pointBackgroundColor: 'rgba(151,187,205,1)',\n pointBorderColor: 'rgba(151,187,205,1)',\n pointRadius: 2,\n borderWidth: 2,\n },\n {\n label: 'Cache',\n data: [],\n fill: true,\n backgroundColor: 'rgba(255,180,174,0.4)',\n borderColor: 'rgba(255,180,174,0.6)',\n pointBackgroundColor: 'rgba(255,180,174,1)',\n pointBorderColor: 'rgba(255,180,174,1)',\n pointRadius: 2,\n borderWidth: 2,\n },\n ],\n },\n options: defaultChartOptions('nearest', tooltipCallback, scalesCallback, true),\n });\n }\n\n function CreateIOChart(context, tooltipCallback, scalesCallback) {\n return new Chart(context, {\n type: 'line',\n data: {\n labels: [],\n datasets: [\n {\n label: 'Read (Aggregate)',\n data: [],\n fill: true,\n backgroundColor: 'rgba(151,187,205,0.4)',\n borderColor: 'rgba(151,187,205,0.6)',\n pointBackgroundColor: 'rgba(151,187,205,1)',\n pointBorderColor: 'rgba(151,187,205,1)',\n pointRadius: 2,\n borderWidth: 2,\n },\n {\n label: 'Write (Aggregate)',\n data: [],\n fill: true,\n backgroundColor: 'rgba(255,180,174,0.4)',\n borderColor: 'rgba(255,180,174,0.6)',\n pointBackgroundColor: 'rgba(255,180,174,1)',\n pointBorderColor: 'rgba(255,180,174,1)',\n pointRadius: 2,\n borderWidth: 2,\n },\n ],\n },\n options: defaultChartOptions('nearest', tooltipCallback, scalesCallback, true),\n });\n }\n\n service.CreateCPUChart = function (context) {\n return CreateChart(context, 'CPU', percentageBasedTooltipLabel, percentageBasedAxisLabel);\n };\n\n service.CreateIOChart = function (context) {\n return CreateIOChart(context, byteBasedTooltipLabel, byteBasedAxisLabel);\n };\n\n service.CreateMemoryChart = function (context) {\n return CreateMemoryChart(context, byteBasedTooltipLabel, byteBasedAxisLabel);\n };\n\n service.CreateNetworkChart = function (context) {\n return new Chart(context, {\n type: 'line',\n data: {\n labels: [],\n datasets: [\n {\n label: 'RX on eth0',\n data: [],\n fill: false,\n backgroundColor: 'rgba(151,187,205,0.4)',\n borderColor: 'rgba(151,187,205,0.6)',\n pointBackgroundColor: 'rgba(151,187,205,1)',\n pointBorderColor: 'rgba(151,187,205,1)',\n pointRadius: 2,\n borderWidth: 2,\n },\n {\n label: 'TX on eth0',\n data: [],\n fill: false,\n backgroundColor: 'rgba(255,180,174,0.4)',\n borderColor: 'rgba(255,180,174,0.6)',\n pointBackgroundColor: 'rgba(255,180,174,1)',\n pointBorderColor: 'rgba(255,180,174,1)',\n pointRadius: 2,\n borderWidth: 2,\n },\n ],\n },\n options: defaultChartOptions('average', byteBasedTooltipLabel, byteBasedAxisLabel),\n });\n };\n\n function LimitChartItems(chart, CHART_LIMIT) {\n if (chart.data.datasets[0].data.length > CHART_LIMIT) {\n chart.data.labels.pop();\n chart.data.datasets[0].data.pop();\n chart.data.datasets[1].data.pop();\n }\n }\n\n function UpdateChart(label, value, chart) {\n chart.data.labels.push(label);\n chart.data.datasets[0].data.push(value);\n\n if (chart.data.datasets[0].data.length > CHART_LIMIT) {\n chart.data.labels.pop();\n chart.data.datasets[0].data.pop();\n }\n\n chart.update(0);\n }\n\n service.UpdateMemoryChart = function UpdateChart(label, memoryValue, cacheValue, chart) {\n chart.data.labels.push(label);\n chart.data.datasets[0].data.push(memoryValue);\n\n if (cacheValue) {\n chart.data.datasets[1].data.push(cacheValue);\n } else {\n // cache values are not available for Windows\n chart.data.datasets.splice(1, 1);\n }\n\n LimitChartItems(chart);\n\n chart.update(0);\n };\n service.UpdateCPUChart = UpdateChart;\n service.UpdateIOChart = function (label, read, write, chart) {\n chart.data.labels.push(label);\n chart.data.datasets[0].data.push(read);\n chart.data.datasets[1].data.push(write);\n LimitChartItems(chart);\n chart.update(0);\n };\n\n service.UpdateNetworkChart = function (label, rx, tx, chart) {\n chart.data.labels.push(label);\n chart.data.datasets[0].data.push(rx);\n chart.data.datasets[1].data.push(tx);\n\n LimitChartItems(chart);\n\n chart.update(0);\n };\n\n function byteBasedTooltipLabel(label, value) {\n var processedValue = 0;\n if (value > 5) {\n processedValue = filesize(value, { base: 10, round: 1 });\n } else {\n processedValue = value.toFixed(1) + 'B';\n }\n return label + ': ' + processedValue;\n }\n\n function byteBasedAxisLabel(value) {\n if (value > 5) {\n return filesize(value, { base: 10, round: 1 });\n }\n return value.toFixed(1) + 'B';\n }\n\n function percentageBasedAxisLabel(value) {\n if (value > 1) {\n return Math.round(value) + '%';\n }\n return value.toFixed(1) + '%';\n }\n\n function percentageBasedTooltipLabel(label, value) {\n var processedValue = 0;\n if (value > 1) {\n processedValue = Math.round(value);\n } else {\n processedValue = value.toFixed(1);\n }\n return label + ': ' + processedValue + '%';\n }\n\n return service;\n },\n]);\n","import _ from 'lodash-es';\nimport CodeMirror from 'codemirror';\nimport 'codemirror/mode/yaml/yaml.js';\nimport 'codemirror/addon/lint/lint.js';\nimport 'codemirror/addon/lint/yaml-lint.js';\nimport 'codemirror/addon/display/placeholder.js';\n\nangular.module('portainer.app').factory('CodeMirrorService', function CodeMirrorService() {\n 'use strict';\n\n var service = {};\n\n var codeMirrorGenericOptions = {\n lineNumbers: true,\n };\n\n var codeMirrorYAMLOptions = {\n mode: 'text/x-yaml',\n gutters: ['CodeMirror-lint-markers'],\n lint: true,\n extraKeys: {\n Tab: function (cm) {\n var spaces = Array(cm.getOption('indentUnit') + 1).join(' ');\n cm.replaceSelection(spaces);\n },\n },\n };\n\n service.applyCodeMirrorOnElement = function (element, yamlLint, readOnly) {\n var options = angular.copy(codeMirrorGenericOptions);\n\n if (yamlLint) {\n _.assign(options, codeMirrorYAMLOptions);\n }\n\n if (readOnly) {\n options.readOnly = true;\n }\n\n var cm = CodeMirror.fromTextArea(element, options);\n cm.setSize('100%', 500);\n return cm;\n };\n\n return service;\n});\n","import angular from 'angular';\n\nimport * as sessionStorage from './session-storage';\n\nangular.module('portainer.app').factory('DatatableService', DatatableServiceFactory);\n\nconst DATATABLE_PREFIX = 'datatable_';\nconst TEXT_FILTER_KEY_PREFIX = `${DATATABLE_PREFIX}text_filter_`;\n\n/* @ngInject */\nfunction DatatableServiceFactory(LocalStorage) {\n return {\n setDataTableSettings,\n getDataTableSettings,\n setDataTableTextFilters,\n getDataTableTextFilters,\n setDataTableFilters,\n getDataTableFilters,\n getDataTableOrder,\n setDataTableOrder,\n setDataTableExpandedItems,\n setColumnVisibilitySettings,\n getDataTableExpandedItems,\n setDataTableSelectedItems,\n getDataTableSelectedItems,\n getColumnVisibilitySettings,\n };\n\n function setDataTableSettings(key, settings) {\n LocalStorage.storeDataTableSettings(key, settings);\n }\n\n function getDataTableSettings(key) {\n return LocalStorage.getDataTableSettings(key);\n }\n\n function setDataTableTextFilters(key, filters) {\n sessionStorage.save(TEXT_FILTER_KEY_PREFIX + key, filters);\n }\n\n function getDataTableTextFilters(key) {\n return sessionStorage.get(TEXT_FILTER_KEY_PREFIX + key);\n }\n\n function setDataTableFilters(key, filters) {\n LocalStorage.storeDataTableFilters(key, filters);\n }\n\n function getDataTableFilters(key) {\n return LocalStorage.getDataTableFilters(key);\n }\n\n function getDataTableOrder(key) {\n return LocalStorage.getDataTableOrder(key);\n }\n\n function setDataTableOrder(key, orderBy, reverse) {\n var filter = {\n orderBy: orderBy,\n reverse: reverse,\n };\n LocalStorage.storeDataTableOrder(key, filter);\n }\n\n function setDataTableExpandedItems(key, expandedItems) {\n LocalStorage.storeDataTableExpandedItems(key, expandedItems);\n }\n\n function setColumnVisibilitySettings(key, columnVisibility) {\n LocalStorage.storeColumnVisibilitySettings(key, columnVisibility);\n }\n\n function getDataTableExpandedItems(key) {\n return LocalStorage.getDataTableExpandedItems(key);\n }\n\n function setDataTableSelectedItems(key, selectedItems) {\n LocalStorage.storeDataTableSelectedItems(key, selectedItems);\n }\n\n function getDataTableSelectedItems(key) {\n return LocalStorage.getDataTableSelectedItems(key);\n }\n\n function getColumnVisibilitySettings(key) {\n return LocalStorage.getColumnVisibilitySettings(key);\n }\n}\n","import _ from 'lodash-es';\n\nangular.module('portainer.app').factory(\n 'EndpointProvider',\n /* @ngInject */\n function EndpointProviderFactory(LocalStorage, $uiRouterGlobals) {\n 'use strict';\n var service = {};\n var endpoint = {};\n\n service.initialize = function () {\n var endpointID = LocalStorage.getEndpointID();\n var endpointPublicURL = LocalStorage.getEndpointPublicURL();\n var offlineMode = LocalStorage.getOfflineMode();\n\n if (endpointID) {\n endpoint.ID = endpointID;\n }\n if (endpointPublicURL) {\n endpoint.PublicURL = endpointPublicURL;\n }\n if (offlineMode) {\n endpoint.OfflineMode = offlineMode;\n }\n };\n\n service.clean = function () {\n LocalStorage.cleanEndpointData();\n endpoint = {};\n };\n\n service.endpoint = function () {\n return endpoint;\n };\n\n service.endpointID = function () {\n if (endpoint.ID === undefined) {\n endpoint.ID = LocalStorage.getEndpointID();\n }\n if (endpoint.ID === null || endpoint.ID === undefined) {\n return service.getUrlEndpointID();\n }\n return endpoint.ID;\n };\n\n // TODO: technical debt\n // Reference issue: JIRA CE-463\n // Documentation (https://ui-router.github.io/ng1/docs/latest/modules/injectables.html) show the usage of either\n // * $stateParams\n // * $transition$\n // * $uiRouterGlobals\n // to retrieve the URL params\n //\n // * $stateParams: is deprecated and will cause a circular dependency injection error\n // because EndpointProvider is used by EndpointStatusInterceptor which is injected inside $httpProvider\n // >> [$injector:cdep] Circular dependency found: $uiRouter <- $stateParams <- EndpointProvider <- EndpointStatusInterceptor <- $http <- $uiRouter\n // For more details, see https://stackoverflow.com/questions/20230691/injecting-state-ui-router-into-http-interceptor-causes-circular-dependency#20230786\n //\n // * $transition$: mentionned as the replacement of $stateParams (https://ui-router.github.io/guide/ng1/migrate-to-1_0#stateparams-deprecation)\n // but is not injectable without tweaks inside a service\n //\n // * $uiRouterGlobal: per https://github.com/angular-ui/ui-router/issues/3237#issuecomment-271979688\n // seems the recommanded way to retrieve params inside a service/factory\n //\n // We need this function to fallback on URL endpoint ID when no endpoint has been selected\n service.getUrlEndpointID = () => {\n return $uiRouterGlobals.params.id;\n };\n\n service.setEndpointID = function (id) {\n endpoint.ID = id;\n LocalStorage.storeEndpointID(id);\n };\n\n service.endpointPublicURL = function () {\n if (endpoint.PublicURL === undefined) {\n endpoint.PublicURL = LocalStorage.getEndpointPublicURL();\n }\n return endpoint.PublicURL;\n };\n\n service.setEndpointPublicURL = function (publicURL) {\n endpoint.PublicURL = publicURL;\n LocalStorage.storeEndpointPublicURL(publicURL);\n };\n\n service.endpoints = function () {\n return LocalStorage.getEndpoints();\n };\n\n service.setEndpoints = function (data) {\n LocalStorage.storeEndpoints(data);\n };\n\n service.offlineMode = function () {\n return endpoint.OfflineMode;\n };\n\n service.setOfflineMode = function (isOffline) {\n endpoint.OfflineMode = isOffline;\n LocalStorage.storeOfflineMode(isOffline);\n };\n\n service.setOfflineModeFromStatus = function (status) {\n var isOffline = status !== 1;\n endpoint.OfflineMode = isOffline;\n LocalStorage.storeOfflineMode(isOffline);\n };\n\n service.currentEndpoint = function () {\n var endpointId = endpoint.ID;\n var endpoints = LocalStorage.getEndpoints();\n return _.find(endpoints, function (item) {\n return item.Id === endpointId;\n });\n };\n\n return service;\n }\n);\n","import { PortainerEndpointCreationTypes } from 'Portainer/models/endpoint/models';\nimport { genericHandler, jsonObjectsToArrayHandler } from '../../docker/rest/response/handlers';\n\nangular.module('portainer.app').factory('FileUploadService', [\n '$q',\n 'Upload',\n 'EndpointProvider',\n function FileUploadFactory($q, Upload, EndpointProvider) {\n 'use strict';\n\n var service = {};\n\n function uploadFile(url, file) {\n return Upload.upload({ url: url, data: { file: file } });\n }\n\n service.buildImage = function (names, file, path) {\n var endpointID = EndpointProvider.endpointID();\n return Upload.http({\n url: 'api/endpoints/' + endpointID + '/docker/build',\n headers: {\n 'Content-Type': file.type,\n },\n data: file,\n params: {\n t: names,\n dockerfile: path,\n },\n ignoreLoadingBar: true,\n transformResponse: function (data) {\n return jsonObjectsToArrayHandler(data);\n },\n });\n };\n\n service.loadImages = function (file) {\n var endpointID = EndpointProvider.endpointID();\n return Upload.http({\n url: 'api/endpoints/' + endpointID + '/docker/images/load',\n headers: {\n 'Content-Type': file.type,\n },\n data: file,\n ignoreLoadingBar: true,\n transformResponse: genericHandler,\n });\n };\n\n service.createSchedule = function (payload) {\n return Upload.upload({\n url: 'api/schedules?method=file',\n data: {\n file: payload.File,\n Name: payload.Name,\n CronExpression: payload.CronExpression,\n Image: payload.Image,\n Endpoints: Upload.json(payload.Endpoints),\n RetryCount: payload.RetryCount,\n RetryInterval: payload.RetryInterval,\n },\n });\n };\n\n service.uploadBackup = function (file, password) {\n return Upload.upload({\n url: 'api/restore',\n data: {\n file,\n password,\n },\n });\n };\n\n service.createSwarmStack = function (stackName, swarmId, file, env, endpointId) {\n return Upload.upload({\n url: 'api/stacks?method=file&type=1&endpointId=' + endpointId,\n data: {\n file: file,\n Name: stackName,\n SwarmID: swarmId,\n Env: Upload.json(env),\n },\n ignoreLoadingBar: true,\n });\n };\n\n service.createComposeStack = function (stackName, file, env, endpointId) {\n return Upload.upload({\n url: 'api/stacks?method=file&type=2&endpointId=' + endpointId,\n data: {\n file: file,\n Name: stackName,\n Env: Upload.json(env),\n },\n ignoreLoadingBar: true,\n });\n };\n\n service.createEdgeStack = function createEdgeStack({ EdgeGroups, ...payload }, file) {\n return Upload.upload({\n url: 'api/edge_stacks?method=file',\n data: {\n file,\n EdgeGroups: Upload.json(EdgeGroups),\n ...payload,\n },\n ignoreLoadingBar: true,\n });\n };\n\n service.createCustomTemplate = function createCustomTemplate(data) {\n return Upload.upload({\n url: 'api/custom_templates?method=file',\n data,\n ignoreLoadingBar: true,\n });\n };\n\n service.configureRegistry = function (registryId, registryManagementConfigurationModel) {\n return Upload.upload({\n url: 'api/registries/' + registryId + '/configure',\n data: registryManagementConfigurationModel,\n });\n };\n\n service.createEndpoint = function (\n name,\n creationType,\n URL,\n PublicURL,\n groupID,\n tagIds,\n TLS,\n TLSSkipVerify,\n TLSSkipClientVerify,\n TLSCAFile,\n TLSCertFile,\n TLSKeyFile,\n checkinInterval\n ) {\n return Upload.upload({\n url: 'api/endpoints',\n data: {\n Name: name,\n EndpointCreationType: creationType,\n URL: URL,\n PublicURL: PublicURL,\n GroupID: groupID,\n TagIds: Upload.json(tagIds),\n TLS: TLS,\n TLSSkipVerify: TLSSkipVerify,\n TLSSkipClientVerify: TLSSkipClientVerify,\n TLSCACertFile: TLSCAFile,\n TLSCertFile: TLSCertFile,\n TLSKeyFile: TLSKeyFile,\n CheckinInterval: checkinInterval,\n },\n ignoreLoadingBar: true,\n });\n };\n\n service.createAzureEndpoint = function (name, applicationId, tenantId, authenticationKey, groupId, tagIds) {\n return Upload.upload({\n url: 'api/endpoints',\n data: {\n Name: name,\n EndpointCreationType: PortainerEndpointCreationTypes.AzureEnvironment,\n GroupID: groupId,\n TagIds: Upload.json(tagIds),\n AzureApplicationID: applicationId,\n AzureTenantID: tenantId,\n AzureAuthenticationKey: authenticationKey,\n },\n ignoreLoadingBar: true,\n });\n };\n\n service.uploadLDAPTLSFiles = function (TLSCAFile, TLSCertFile, TLSKeyFile) {\n var queue = [];\n\n if (TLSCAFile) {\n queue.push(uploadFile('api/upload/tls/ca?folder=ldap', TLSCAFile));\n }\n if (TLSCertFile) {\n queue.push(uploadFile('api/upload/tls/cert?folder=ldap', TLSCertFile));\n }\n if (TLSKeyFile) {\n queue.push(uploadFile('api/upload/tls/key?folder=ldap', TLSKeyFile));\n }\n\n return $q.all(queue);\n };\n\n service.uploadTLSFilesForEndpoint = function (endpointID, TLSCAFile, TLSCertFile, TLSKeyFile) {\n var queue = [];\n\n if (TLSCAFile) {\n queue.push(uploadFile('api/upload/tls/ca?folder=' + endpointID, TLSCAFile));\n }\n if (TLSCertFile) {\n queue.push(uploadFile('api/upload/tls/cert?folder=' + endpointID, TLSCertFile));\n }\n if (TLSKeyFile) {\n queue.push(uploadFile('api/upload/tls/key?folder=' + endpointID, TLSKeyFile));\n }\n\n return $q.all(queue);\n };\n\n return service;\n },\n]);\n","import { ResourceControlOwnership as RCO } from 'Portainer/models/resourceControl/resourceControlOwnership';\n\nangular.module('portainer.app').factory('FormValidator', [\n function FormValidatorFactory() {\n 'use strict';\n\n var validator = {};\n\n validator.validateAccessControl = function (accessControlData, isAdmin) {\n if (!accessControlData.AccessControlEnabled) {\n return '';\n }\n\n if (isAdmin && accessControlData.Ownership === RCO.RESTRICTED && accessControlData.AuthorizedUsers.length === 0 && accessControlData.AuthorizedTeams.length === 0) {\n return 'You must specify at least one team or user.';\n } else if (!isAdmin && accessControlData.Ownership === RCO.RESTRICTED && accessControlData.AuthorizedTeams.length === 0) {\n return 'You must specify at least a team.';\n }\n return '';\n };\n\n return validator;\n },\n]);\n","angular.module('portainer.app').factory('HttpRequestHelper', [\n function HttpRequestHelper() {\n 'use strict';\n\n var service = {};\n var headers = {};\n headers.agentTargetQueue = [];\n headers.agentManagerOperation = false;\n\n service.registryAuthenticationHeader = function () {\n return headers.registryAuthentication;\n };\n\n service.setRegistryAuthenticationHeader = function (headerValue) {\n headers.registryAuthentication = headerValue;\n };\n\n // Due to the fact that async HTTP requests are decorated using an interceptor\n // we need to store and retrieve the headers using a first-in-first-out (FIFO) data structure.\n // Otherwise, sequential HTTP requests might end up using the same header value (incorrect in the case\n // of starting multiple containers on different nodes for example).\n // To prevent having to use the HttpRequestHelper.setPortainerAgentTargetHeader before EACH request,\n // we re-use the latest available header in the data structure (handy in thee case of multiple requests affecting\n // the same node in the same view).\n service.portainerAgentTargetHeader = function () {\n if (headers.agentTargetQueue.length === 0) {\n return headers.agentTargetLastValue;\n } else if (headers.agentTargetQueue.length === 1) {\n headers.agentTargetLastValue = headers.agentTargetQueue[0];\n }\n return headers.agentTargetQueue.shift();\n };\n\n service.setPortainerAgentTargetHeader = function (headerValue) {\n if (headerValue) {\n headers.agentTargetQueue.push(headerValue);\n }\n };\n\n service.setPortainerAgentManagerOperation = function (set) {\n headers.agentManagerOperation = set;\n };\n\n service.portainerAgentManagerOperation = function () {\n return headers.agentManagerOperation;\n };\n\n service.resetAgentHeaders = function () {\n headers.agentTargetQueue = [];\n delete headers.agentTargetLastValue;\n headers.agentManagerOperation = false;\n };\n\n return service;\n },\n]);\n","import _ from 'lodash-es';\n\n// TODO: legacy extension management\nangular.module('portainer.app').factory('LegacyExtensionManager', [\n '$q',\n 'PluginService',\n 'SystemService',\n 'NodeService',\n 'LegacyExtensionService',\n function ExtensionManagerFactory($q, PluginService, SystemService, NodeService, LegacyExtensionService) {\n 'use strict';\n var service = {};\n\n service.initEndpointExtensions = function (endpoint) {\n var deferred = $q.defer();\n\n if (endpoint.Status !== 1) {\n deferred.resolve([]);\n return deferred.promise;\n }\n\n SystemService.version()\n .then(function success(data) {\n var endpointAPIVersion = parseFloat(data.ApiVersion);\n\n return $q.all([endpointAPIVersion >= 1.25 ? initStoridgeExtension() : {}]);\n })\n .then(function success(data) {\n var extensions = data;\n deferred.resolve(extensions);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to connect to the Docker environment', err: err });\n });\n\n return deferred.promise;\n };\n\n function initStoridgeExtension() {\n var deferred = $q.defer();\n\n PluginService.volumePlugins()\n .then(function success(data) {\n var volumePlugins = data;\n if (_.includes(volumePlugins, 'cio:latest')) {\n return registerStoridgeUsingSwarmManagerIP();\n } else {\n return deregisterStoridgeExtension();\n }\n })\n .then(function success(data) {\n deferred.resolve(data);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'An error occured during Storidge extension check', err: err });\n });\n\n return deferred.promise;\n }\n\n function registerStoridgeUsingSwarmManagerIP() {\n var deferred = $q.defer();\n\n NodeService.getActiveManager()\n .then(function success(data) {\n var managerIP = data.Addr;\n var storidgeAPIURL = 'tcp://' + managerIP + ':8282';\n return LegacyExtensionService.registerStoridgeExtension(storidgeAPIURL);\n })\n .then(function success(data) {\n deferred.resolve(data);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'An error occured during Storidge extension initialization', err: err });\n });\n\n return deferred.promise;\n }\n\n function deregisterStoridgeExtension() {\n return LegacyExtensionService.deregisterStoridgeExtension();\n }\n\n return service;\n },\n]);\n","angular.module('portainer.app').factory('LocalStorage', [\n 'localStorageService',\n function LocalStorageFactory(localStorageService) {\n return {\n storeEndpointID: function (id) {\n localStorageService.set('ENDPOINT_ID', id);\n },\n getEndpointID: function () {\n return localStorageService.get('ENDPOINT_ID');\n },\n storeEndpointPublicURL: function (publicURL) {\n localStorageService.set('ENDPOINT_PUBLIC_URL', publicURL);\n },\n getEndpointPublicURL: function () {\n return localStorageService.get('ENDPOINT_PUBLIC_URL');\n },\n storeLoginStateUUID: function (uuid) {\n localStorageService.set('LOGIN_STATE_UUID', uuid);\n },\n getLoginStateUUID: function () {\n return localStorageService.get('LOGIN_STATE_UUID');\n },\n storeOfflineMode: function (isOffline) {\n localStorageService.set('ENDPOINT_OFFLINE_MODE', isOffline);\n },\n getOfflineMode: function () {\n return localStorageService.get('ENDPOINT_OFFLINE_MODE');\n },\n storeEndpoints: function (data) {\n localStorageService.set('ENDPOINTS_DATA', data);\n },\n getEndpoints: function () {\n return localStorageService.get('ENDPOINTS_DATA');\n },\n storeEndpointState: function (state) {\n localStorageService.set('ENDPOINT_STATE', state);\n },\n getEndpointState: function () {\n return localStorageService.get('ENDPOINT_STATE');\n },\n storeApplicationState: function (state) {\n localStorageService.set('APPLICATION_STATE', state);\n },\n getApplicationState: function () {\n return localStorageService.get('APPLICATION_STATE');\n },\n storeUIState: function (state) {\n localStorageService.set('UI_STATE', state);\n },\n getUIState: function () {\n return localStorageService.get('UI_STATE');\n },\n storeJWT: function (jwt) {\n localStorageService.set('JWT', jwt);\n },\n getJWT: function () {\n return localStorageService.get('JWT');\n },\n deleteJWT: function () {\n localStorageService.remove('JWT');\n },\n storePaginationLimit: function (key, count) {\n localStorageService.set('datatable_pagination_' + key, count);\n },\n getPaginationLimit: function (key) {\n return localStorageService.get('datatable_pagination_' + key);\n },\n getDataTableOrder: function (key) {\n return localStorageService.get('datatable_order_' + key);\n },\n storeDataTableOrder: function (key, data) {\n localStorageService.set('datatable_order_' + key, data);\n },\n getDataTableTextFilters: function (key) {\n return localStorageService.get('datatable_text_filter_' + key);\n },\n storeDataTableTextFilters: function (key, data) {\n localStorageService.set('datatable_text_filter_' + key, data);\n },\n getDataTableFilters: function (key) {\n return localStorageService.get('datatable_filters_' + key);\n },\n storeDataTableFilters: function (key, data) {\n localStorageService.set('datatable_filters_' + key, data);\n },\n getDataTableSettings: function (key) {\n return localStorageService.get('datatable_settings_' + key);\n },\n storeDataTableSettings: function (key, data) {\n localStorageService.set('datatable_settings_' + key, data);\n },\n getDataTableExpandedItems: function (key) {\n return localStorageService.get('datatable_expandeditems_' + key);\n },\n storeDataTableExpandedItems: function (key, data) {\n localStorageService.set('datatable_expandeditems_' + key, data);\n },\n getDataTableSelectedItems: function (key) {\n return localStorageService.get('datatable_selecteditems_' + key);\n },\n storeDataTableSelectedItems: function (key, data) {\n localStorageService.set('datatable_selecteditems_' + key, data);\n },\n storeSwarmVisualizerSettings: function (key, data) {\n localStorageService.set('swarmvisualizer_' + key, data);\n },\n getSwarmVisualizerSettings: function (key) {\n return localStorageService.get('swarmvisualizer_' + key);\n },\n storeColumnVisibilitySettings: function (key, data) {\n localStorageService.set('col_visibility_' + key, data);\n },\n getColumnVisibilitySettings: function (key) {\n return localStorageService.get('col_visibility_' + key);\n },\n storeJobImage: function (data) {\n localStorageService.set('job_image', data);\n },\n getJobImage: function () {\n return localStorageService.get('job_image');\n },\n storeActiveTab: function (key, index) {\n return localStorageService.set('active_tab_' + key, index);\n },\n getActiveTab: function (key) {\n const activeTab = localStorageService.get('active_tab_' + key);\n return activeTab === null ? 0 : activeTab;\n },\n storeToolbarToggle(value) {\n localStorageService.set('toolbar_toggle', value);\n },\n getToolbarToggle() {\n return localStorageService.get('toolbar_toggle');\n },\n storeLogoutReason: (reason) => localStorageService.set('logout_reason', reason),\n getLogoutReason: () => localStorageService.get('logout_reason'),\n cleanLogoutReason: () => localStorageService.remove('logout_reason'),\n clean: function () {\n localStorageService.clearAll();\n },\n cleanAuthData() {\n localStorageService.remove('JWT', 'APPLICATION_STATE', 'LOGIN_STATE_UUID');\n },\n cleanEndpointData() {\n localStorageService.remove('ENDPOINT_ID', 'ENDPOINT_PUBLIC_URL', 'ENDPOINT_OFFLINE_MODE', 'ENDPOINTS_DATA', 'ENDPOINT_STATE');\n },\n storeKubernetesSummaryToggle(value) {\n localStorageService.set('kubernetes_summary_expanded', value);\n },\n getKubernetesSummaryToggle() {\n return localStorageService.get('kubernetes_summary_expanded');\n },\n };\n },\n]);\n","import bootbox from 'bootbox';\n\nangular.module('portainer.app').factory('ModalService', [\n '$sanitize',\n function ModalServiceFactory($sanitize) {\n 'use strict';\n var service = {};\n\n var applyBoxCSS = function (box) {\n box.css({\n top: '50%',\n 'margin-top': function () {\n return -(box.height() / 2);\n },\n });\n };\n\n var confirmButtons = function (options) {\n var buttons = {\n confirm: {\n label: $sanitize(options.buttons.confirm.label),\n className: $sanitize(options.buttons.confirm.className),\n },\n cancel: {\n label: options.buttons.cancel && options.buttons.cancel.label ? $sanitize(options.buttons.cancel.label) : 'Cancel',\n },\n };\n return buttons;\n };\n\n service.enlargeImage = function (image) {\n image = $sanitize(image);\n bootbox.dialog({\n message: '<img src=\"' + image + '\" style=\"width:100%\" />',\n className: 'image-zoom-modal',\n onEscape: true,\n });\n };\n\n service.confirmWebEditorDiscard = confirmWebEditorDiscard;\n function confirmWebEditorDiscard() {\n const options = {\n title: 'Are you sure ?',\n message: 'You currently have unsaved changes in the editor. Are you sure you want to leave?',\n buttons: {\n confirm: {\n label: 'Yes',\n className: 'btn-danger',\n },\n },\n };\n return new Promise((resolve) => {\n service.confirm({ ...options, callback: (confirmed) => resolve(confirmed) });\n });\n }\n\n service.confirmAsync = confirmAsync;\n function confirmAsync(options) {\n return new Promise((resolve) => {\n service.confirm({ ...options, callback: (confirmed) => resolve(confirmed) });\n });\n }\n\n service.confirm = function (options) {\n var box = bootbox.confirm({\n title: options.title,\n message: options.message,\n buttons: confirmButtons(options),\n callback: options.callback,\n });\n applyBoxCSS(box);\n };\n\n function prompt(options) {\n var box = bootbox.prompt({\n title: options.title,\n inputType: options.inputType,\n inputOptions: options.inputOptions,\n buttons: confirmButtons(options),\n callback: options.callback,\n });\n applyBoxCSS(box);\n }\n\n function customCheckboxPrompt(options) {\n var box = bootbox.prompt({\n title: options.title,\n inputType: 'checkbox',\n inputOptions: options.inputOptions,\n buttons: confirmButtons(options),\n callback: options.callback,\n });\n applyBoxCSS(box);\n box.find('.bootbox-body').prepend('<p>' + options.message + '</p>');\n box.find('.bootbox-input-checkbox').prop('checked', options.optionToggled);\n if (options.showCheck) {\n box.find('.bootbox-input-checkbox').addClass('visible');\n }\n }\n\n service.confirmAccessControlUpdate = function (callback) {\n service.confirm({\n title: 'Are you sure ?',\n message: 'Changing the ownership of this resource will potentially restrict its management to some users.',\n buttons: {\n confirm: {\n label: 'Change ownership',\n className: 'btn-primary',\n },\n },\n callback: callback,\n });\n };\n\n service.confirmImageForceRemoval = function (callback) {\n service.confirm({\n title: 'Are you sure?',\n message: 'Forcing the removal of the image will remove the image even if it has multiple tags or if it is used by stopped containers.',\n buttons: {\n confirm: {\n label: 'Remove the image',\n className: 'btn-danger',\n },\n },\n callback: callback,\n });\n };\n\n service.cancelRegistryRepositoryAction = function (callback) {\n service.confirm({\n title: 'Are you sure?',\n message: 'WARNING: interrupting this operation before it has finished will result in the loss of all tags. Are you sure you want to do this?',\n buttons: {\n confirm: {\n label: 'Stop',\n className: 'btn-danger',\n },\n },\n callback: callback,\n });\n };\n\n service.confirmDeletion = function (message, callback) {\n message = $sanitize(message);\n service.confirm({\n title: 'Are you sure ?',\n message: message,\n buttons: {\n confirm: {\n label: 'Remove',\n className: 'btn-danger',\n },\n },\n callback: callback,\n });\n };\n\n service.confirmDeassociate = function (callback) {\n const message =\n '<p>De-associating this Edge environment will mark it as non associated and will clear the registered Edge ID.</p>' +\n '<p>Any agent started with the Edge key associated to this environment will be able to re-associate with this environment.</p>' +\n '<p>You can re-use the Edge ID and Edge key that you used to deploy the existing Edge agent to associate a new Edge device to this environment.</p>';\n service.confirm({\n title: 'About de-associating',\n message: $sanitize(message),\n buttons: {\n confirm: {\n label: 'De-associate',\n className: 'btn-primary',\n },\n },\n callback: callback,\n });\n };\n\n service.confirmUpdate = function (message, callback) {\n message = $sanitize(message);\n service.confirm({\n title: 'Are you sure ?',\n message: message,\n buttons: {\n confirm: {\n label: 'Update',\n className: 'btn-warning',\n },\n },\n callback: callback,\n });\n };\n\n service.confirmRedeploy = function (message, callback) {\n message = $sanitize(message);\n service.confirm({\n title: '',\n message: message,\n buttons: {\n confirm: {\n label: 'Redeploy the applications',\n className: 'btn-primary',\n },\n cancel: {\n label: \"I'll do it later\",\n },\n },\n callback: callback,\n });\n };\n\n service.confirmDeletionAsync = function confirmDeletionAsync(message) {\n return new Promise((resolve) => {\n service.confirmDeletion(message, (confirmed) => resolve(confirmed));\n });\n };\n\n service.confirmContainerDeletion = function (title, callback) {\n title = $sanitize(title);\n prompt({\n title: title,\n inputType: 'checkbox',\n inputOptions: [\n {\n text: 'Automatically remove non-persistent volumes<i></i>',\n value: '1',\n },\n ],\n buttons: {\n confirm: {\n label: 'Remove',\n className: 'btn-danger',\n },\n },\n callback: callback,\n });\n };\n\n service.confirmContainerRecreation = function (callback) {\n customCheckboxPrompt({\n title: 'Are you sure?',\n message:\n \"You're about to re-create this container, any non-persisted data will be lost. This container will be removed and another one will be created using the same configuration.\",\n inputOptions: [\n {\n text: 'Pull latest image<i></i>',\n value: '1',\n },\n ],\n buttons: {\n confirm: {\n label: 'Recreate',\n className: 'btn-danger',\n },\n },\n callback: callback,\n optionToggled: false,\n });\n };\n\n service.confirmEndpointSnapshot = function (callback) {\n service.confirm({\n title: 'Are you sure?',\n message: 'Triggering a manual refresh will poll each environment to retrieve its information, this may take a few moments.',\n buttons: {\n confirm: {\n label: 'Continue',\n className: 'btn-primary',\n },\n },\n callback: callback,\n });\n };\n\n service.confirmImageExport = function (callback) {\n service.confirm({\n title: 'Caution',\n message: 'The export may take several minutes, do not navigate away whilst the export is in progress.',\n buttons: {\n confirm: {\n label: 'Continue',\n className: 'btn-primary',\n },\n },\n callback: callback,\n });\n };\n\n service.confirmServiceForceUpdate = function (message, callback) {\n message = $sanitize(message);\n customCheckboxPrompt({\n title: 'Are you sure ?',\n message: message,\n inputOptions: [\n {\n text: 'Pull latest image version<i></i>',\n value: '1',\n },\n ],\n buttons: {\n confirm: {\n label: 'Update',\n className: 'btn-primary',\n },\n },\n callback: callback,\n optionToggled: false,\n });\n };\n\n service.selectRegistry = function (options) {\n var box = bootbox.prompt({\n title: 'Which registry do you want to use?',\n inputType: 'select',\n value: options.defaultValue,\n inputOptions: options.options,\n callback: options.callback,\n });\n applyBoxCSS(box);\n };\n\n service.confirmKubeconfigSelection = function (options, expiryMessage, callback) {\n const message = 'Select the kubernetes environment(s) to add to the kubeconfig file.</br>' + expiryMessage;\n customCheckboxPrompt({\n title: 'Download kubeconfig file',\n message: $sanitize(message),\n inputOptions: options,\n buttons: {\n confirm: {\n label: 'Download file',\n className: 'btn-primary',\n },\n },\n callback: callback,\n optionToggled: true,\n showCheck: true,\n });\n };\n\n return service;\n },\n]);\n","import angular from 'angular';\n\nangular.module('portainer.app').factory('NameValidator', NameValidatorFactory);\n/* @ngInject */\nfunction NameValidatorFactory(EndpointService, Notifications) {\n return {\n validateEnvironmentName,\n };\n\n async function validateEnvironmentName(environmentName) {\n try {\n const endpoints = await EndpointService.endpoints();\n const endpointArray = endpoints.value;\n const nameDuplicated = endpointArray.filter((item) => item.Name === environmentName);\n return nameDuplicated.length > 0;\n } catch (err) {\n Notifications.error('Failure', err, 'Unable to retrieve environment details');\n }\n }\n}\n","import _ from 'lodash-es';\nimport toastr from 'toastr';\nimport lodash from 'lodash-es';\n\nangular.module('portainer.app').factory('Notifications', [\n '$sanitize',\n function NotificationsFactory($sanitize) {\n 'use strict';\n var service = {};\n\n service.success = function (title, text) {\n toastr.success($sanitize(_.escape(text)), $sanitize(title));\n };\n\n service.warning = function (title, text) {\n toastr.warning($sanitize(_.escape(text)), $sanitize(title), { timeOut: 6000 });\n };\n\n function pickErrorMsg(e) {\n const props = [\n 'err.data.details',\n 'err.data.message',\n 'data.details',\n 'data.message',\n 'data.content',\n 'data.error',\n 'message',\n 'err.data[0].message',\n 'err.data.err',\n 'data.err',\n 'msg',\n ];\n\n let msg = '';\n\n lodash.forEach(props, (prop) => {\n const val = lodash.get(e, prop);\n if (typeof val === 'string') {\n msg = msg || val;\n }\n });\n\n return msg;\n }\n\n service.error = function (title, e, fallbackText) {\n const msg = pickErrorMsg(e) || fallbackText;\n\n // eslint-disable-next-line no-console\n console.error(e);\n\n if (msg !== 'Invalid JWT token') {\n toastr.error($sanitize(_.escape(msg)), $sanitize(title), { timeOut: 6000 });\n }\n };\n\n return service;\n },\n]);\n","angular.module('portainer.app').factory('PaginationService', [\n 'LocalStorage',\n 'PAGINATION_MAX_ITEMS',\n function PaginationServiceFactory(LocalStorage, PAGINATION_MAX_ITEMS) {\n 'use strict';\n\n var service = {};\n\n service.getPaginationLimit = function (key) {\n var paginationLimit = PAGINATION_MAX_ITEMS;\n\n var storedLimit = LocalStorage.getPaginationLimit(key);\n if (storedLimit !== null) {\n paginationLimit = storedLimit;\n }\n return '' + paginationLimit;\n };\n\n service.setPaginationLimit = function (key, limit) {\n LocalStorage.storePaginationLimit(key, limit);\n };\n\n return service;\n },\n]);\n","import _ from 'lodash-es';\nimport { RegistryGitlabProject } from '../models/gitlabRegistry';\nimport { RegistryRepositoryGitlabViewModel } from '../models/registryRepository';\n\nangular.module('portainer.app').factory('RegistryGitlabService', [\n '$async',\n 'Gitlab',\n function RegistryGitlabServiceFactory($async, Gitlab) {\n 'use strict';\n var service = {};\n\n /**\n * PROJECTS\n */\n\n async function _getProjectsPage(env, params, projects) {\n const response = await Gitlab(env).projects(params).$promise;\n projects = _.concat(projects, response.data);\n if (response.next) {\n params.page = response.next;\n projects = await _getProjectsPage(env, params, projects);\n }\n return projects;\n }\n\n async function projectsAsync(url, token) {\n try {\n const data = await _getProjectsPage({ url: url, token: token }, { page: 1 }, []);\n return _.map(data, (project) => new RegistryGitlabProject(project));\n } catch (error) {\n throw { msg: 'Unable to retrieve projects', err: error };\n }\n }\n\n /**\n * END PROJECTS\n */\n\n /**\n * REPOSITORIES\n */\n\n async function _getRepositoriesPage(params, repositories) {\n const response = await Gitlab().repositories(params).$promise;\n repositories = _.concat(repositories, response.data);\n if (response.next) {\n params.page = response.next;\n repositories = await _getRepositoriesPage(params, repositories);\n }\n return repositories;\n }\n\n async function repositoriesAsync(registry) {\n try {\n const params = {\n id: registry.Id,\n projectId: registry.Gitlab.ProjectId,\n page: 1,\n };\n const data = await _getRepositoriesPage(params, []);\n return _.map(data, (r) => new RegistryRepositoryGitlabViewModel(r));\n } catch (error) {\n throw { msg: 'Unable to retrieve repositories', err: error };\n }\n }\n\n /**\n * END REPOSITORIES\n */\n\n /**\n * SERVICE FUNCTIONS DECLARATION\n */\n\n function projects(url, token) {\n return $async(projectsAsync, url, token);\n }\n\n function repositories(registry) {\n return $async(repositoriesAsync, registry);\n }\n\n service.projects = projects;\n service.repositories = repositories;\n return service;\n },\n]);\n","import _ from 'lodash';\n\nangular.module('portainer.app').factory('RegistryModalService', ModalServiceFactory);\n\nfunction ModalServiceFactory($q, ModalService, RegistryService) {\n const service = {};\n\n function registries2Options(registries) {\n return registries.map((r) => ({\n text: r.Name,\n value: String(r.Id),\n }));\n }\n\n service.registryModal = async function (repository, registries) {\n const deferred = $q.defer();\n\n const options = registries2Options(registries);\n const registryModel = RegistryService.retrievePorRegistryModelFromRepositoryWithRegistries(repository, registries);\n const defaultValue = String(_.get(registryModel, 'Registry.Id', '0'));\n\n ModalService.selectRegistry({\n options,\n defaultValue,\n callback: (registryId) => {\n if (registryId) {\n const registryModel = RegistryService.retrievePorRegistryModelFromRepositoryWithRegistries(repository, registries, registryId);\n deferred.resolve(registryModel);\n } else {\n deferred.resolve(null);\n }\n },\n });\n\n return deferred.promise;\n };\n\n return service;\n}\n","import moment from 'moment';\n\nangular.module('portainer.app').factory('StateManager', [\n '$q',\n '$async',\n 'SystemService',\n 'InfoHelper',\n 'LocalStorage',\n 'SettingsService',\n 'StatusService',\n 'APPLICATION_CACHE_VALIDITY',\n 'AgentPingService',\n '$analytics',\n 'EndpointProvider',\n function StateManagerFactory(\n $q,\n $async,\n SystemService,\n InfoHelper,\n LocalStorage,\n SettingsService,\n StatusService,\n APPLICATION_CACHE_VALIDITY,\n AgentPingService,\n $analytics,\n EndpointProvider\n ) {\n var manager = {};\n\n var state = {\n loading: true,\n application: {},\n endpoint: {},\n UI: {\n dismissedInfoPanels: {},\n dismissedInfoHash: '',\n },\n extensions: [],\n };\n\n manager.setVersionInfo = function (versionInfo) {\n state.application.versionStatus = versionInfo;\n LocalStorage.storeApplicationState(state.application);\n };\n\n manager.dismissInformationPanel = function (id) {\n state.UI.dismissedInfoPanels[id] = true;\n LocalStorage.storeUIState(state.UI);\n };\n\n manager.dismissImportantInformation = function (hash) {\n state.UI.dismissedInfoHash = hash;\n LocalStorage.storeUIState(state.UI);\n };\n\n manager.getState = function () {\n return state;\n };\n\n manager.clean = function () {\n state.endpoint = {};\n state.application = {};\n };\n\n manager.cleanEndpoint = function () {\n state.endpoint = {};\n EndpointProvider.clean();\n };\n\n manager.updateLogo = function (logoURL) {\n state.application.logo = logoURL;\n LocalStorage.storeApplicationState(state.application);\n };\n\n manager.updateTheme = function (theme) {\n state.application.theme = theme;\n LocalStorage.storeApplicationState(state.application);\n };\n\n manager.updateSnapshotInterval = function (interval) {\n state.application.snapshotInterval = interval;\n LocalStorage.storeApplicationState(state.application);\n };\n\n manager.updateEnableEdgeComputeFeatures = function updateEnableEdgeComputeFeatures(enableEdgeComputeFeatures) {\n state.application.enableEdgeComputeFeatures = enableEdgeComputeFeatures;\n LocalStorage.storeApplicationState(state.application);\n };\n\n manager.updateEnableTelemetry = function updateEnableTelemetry(enableTelemetry) {\n state.application.enableTelemetry = enableTelemetry;\n $analytics.setOptOut(!enableTelemetry);\n LocalStorage.storeApplicationState(state.application);\n };\n\n function assignStateFromStatusAndSettings(status, settings) {\n state.application.version = status.Version;\n state.application.edition = status.Edition;\n state.application.instanceId = status.InstanceID;\n\n state.application.enableTelemetry = settings.EnableTelemetry;\n state.application.logo = settings.LogoURL;\n state.application.snapshotInterval = settings.SnapshotInterval;\n state.application.enableEdgeComputeFeatures = settings.EnableEdgeComputeFeatures;\n state.application.validity = moment().unix();\n }\n\n function loadApplicationState() {\n var deferred = $q.defer();\n\n $q.all({\n settings: SettingsService.publicSettings(),\n status: StatusService.status(),\n })\n .then(function success(data) {\n var status = data.status;\n var settings = data.settings;\n assignStateFromStatusAndSettings(status, settings);\n LocalStorage.storeApplicationState(state.application);\n deferred.resolve(state);\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to retrieve server settings and status', err: err });\n });\n\n return deferred.promise;\n }\n\n manager.initialize = initialize;\n async function initialize() {\n return $async(async () => {\n const UIState = LocalStorage.getUIState();\n if (UIState) {\n state.UI = UIState;\n }\n\n const endpointState = LocalStorage.getEndpointState();\n if (endpointState) {\n state.endpoint = endpointState;\n }\n\n const applicationState = LocalStorage.getApplicationState();\n if (isAppStateValid(applicationState)) {\n state.application = applicationState;\n } else {\n await loadApplicationState();\n }\n\n state.loading = false;\n $analytics.setPortainerStatus(state.application.instanceId, state.application.version);\n $analytics.setOptOut(!state.application.enableTelemetry);\n return state;\n });\n }\n\n function isAppStateValid(appState) {\n if (!appState || !appState.validity) {\n return false;\n }\n const now = moment().unix();\n const cacheValidity = now - appState.validity;\n return cacheValidity < APPLICATION_CACHE_VALIDITY;\n }\n\n function assignExtensions(endpointExtensions) {\n var extensions = [];\n\n for (var i = 0; i < endpointExtensions.length; i++) {\n var extension = endpointExtensions[i];\n if (extension.Type === 1) {\n extensions.push('storidge');\n }\n }\n\n return extensions;\n }\n\n manager.updateEndpointState = function (endpoint, extensions) {\n var deferred = $q.defer();\n\n if (endpoint.Type === 3) {\n state.endpoint.name = endpoint.Name;\n state.endpoint.mode = { provider: 'AZURE' };\n LocalStorage.storeEndpointState(state.endpoint);\n deferred.resolve();\n return deferred.promise;\n } else if (endpoint.Type === 5 || endpoint.Type === 6 || endpoint.Type === 7) {\n state.endpoint.name = endpoint.Name;\n state.endpoint.mode = { provider: 'KUBERNETES' };\n LocalStorage.storeEndpointState(state.endpoint);\n deferred.resolve();\n return deferred.promise;\n }\n\n const reload = endpoint.Status === 1 || !endpoint.Snaphosts || !endpoint.Snaphosts.length || !endpoint.Snapshots[0].SnapshotRaw;\n\n $q.all({\n version: reload ? SystemService.version() : $q.when(endpoint.Snapshots[0].SnapshotRaw.Version),\n info: reload ? SystemService.info() : $q.when(endpoint.Snapshots[0].SnapshotRaw.Info),\n })\n .then(function success(data) {\n var endpointMode = InfoHelper.determineEndpointMode(data.info, endpoint.Type);\n var endpointAPIVersion = parseFloat(data.version.ApiVersion);\n state.endpoint.mode = endpointMode;\n state.endpoint.name = endpoint.Name;\n state.endpoint.type = endpoint.Type;\n state.endpoint.apiVersion = endpointAPIVersion;\n state.endpoint.extensions = assignExtensions(extensions);\n\n if (endpointMode.agentProxy && endpoint.Status === 1) {\n return AgentPingService.ping().then(function onPingSuccess(data) {\n state.endpoint.agentApiVersion = data.version;\n });\n }\n })\n .then(function () {\n LocalStorage.storeEndpointState(state.endpoint);\n deferred.resolve();\n })\n .catch(function error(err) {\n deferred.reject({ msg: 'Unable to connect to the Docker environment', err: err });\n })\n .finally(function final() {\n state.loading = false;\n });\n\n return deferred.promise;\n };\n\n manager.getAgentApiVersion = function getAgentApiVersion() {\n return state.endpoint.agentApiVersion;\n };\n\n return manager;\n },\n]);\n","angular.module('portainer').service('TerminalWindow', function ($window) {\n const terminalHeight = 495;\n this.terminalopen = function () {\n const contentWrapperHeight = $window.innerHeight;\n const newContentWrapperHeight = contentWrapperHeight - terminalHeight;\n document.getElementById('content-wrapper').style.height = newContentWrapperHeight + 'px';\n document.getElementById('content-wrapper').style.overflowY = 'auto';\n document.getElementById('sidebar-wrapper').style.height = newContentWrapperHeight + 'px';\n };\n this.terminalclose = function () {\n const wrapperCSS = {\n height: '100%',\n overflowY: 'initial',\n };\n document.getElementById('content-wrapper').style.height = wrapperCSS.height;\n document.getElementById('content-wrapper').style.overflowY = wrapperCSS.overflowY;\n document.getElementById('sidebar-wrapper').style.height = wrapperCSS.height;\n };\n this.terminalresize = function () {\n const contentWrapperHeight = $window.innerHeight;\n const newContentWrapperHeight = contentWrapperHeight - terminalHeight;\n document.getElementById('content-wrapper').style.height = newContentWrapperHeight + 'px';\n document.getElementById('content-wrapper').style.overflowY = 'auto';\n document.getElementById('sidebar-wrapper').style.height = newContentWrapperHeight + 'px';\n };\n});\n","angular.module('portainer.app').service('ThemeManager', ThemeManager);\n\n/* @ngInject */\n\nexport function ThemeManager(StateManager) {\n return {\n setTheme,\n autoTheme,\n defaultTheme,\n };\n\n function setTheme(theme) {\n if (!theme) {\n document.documentElement.removeAttribute('theme');\n } else {\n document.documentElement.setAttribute('theme', theme);\n StateManager.updateTheme(theme);\n }\n }\n\n function autoTheme() {\n const systemTheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : '';\n this.setTheme(systemTheme);\n }\n\n function defaultTheme() {\n document.documentElement.removeAttribute('theme');\n }\n}\n","angular.module('portainer.app').controller('AccountController', [\n '$scope',\n '$state',\n 'Authentication',\n 'UserService',\n 'Notifications',\n 'SettingsService',\n 'StateManager',\n 'ThemeManager',\n 'ModalService',\n function ($scope, $state, Authentication, UserService, Notifications, SettingsService, StateManager, ThemeManager, ModalService) {\n $scope.formValues = {\n currentPassword: '',\n newPassword: '',\n confirmPassword: '',\n userTheme: '',\n };\n\n $scope.updatePassword = function () {\n UserService.updateUserPassword($scope.userID, $scope.formValues.currentPassword, $scope.formValues.newPassword)\n .then(function success() {\n Notifications.success('Success', 'Password successfully updated');\n $state.reload();\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, err.msg);\n });\n };\n\n $scope.removeAction = (selectedTokens) => {\n const msg = 'Do you want to remove the selected access token(s)? Any script or application using these tokens will no longer be able to invoke the Portainer API.';\n\n ModalService.confirmDeletion(msg, function (confirmed) {\n if (!confirmed) {\n return;\n }\n let actionCount = selectedTokens.length;\n selectedTokens.forEach((token) => {\n UserService.deleteAccessToken($scope.userID, token.id)\n .then(() => {\n Notifications.success('Token successfully removed');\n var index = $scope.tokens.indexOf(token);\n $scope.tokens.splice(index, 1);\n })\n .catch((err) => {\n Notifications.error('Failure', err, 'Unable to remove token');\n })\n .finally(() => {\n --actionCount;\n if (actionCount === 0) {\n $state.reload();\n }\n });\n });\n });\n };\n\n // Update DOM for theme attribute & LocalStorage\n $scope.setTheme = function (theme) {\n ThemeManager.setTheme(theme);\n StateManager.updateTheme(theme);\n };\n\n // Rest API Call to update theme with userID in DB\n $scope.updateTheme = function () {\n UserService.updateUserTheme($scope.userID, $scope.formValues.userTheme)\n .then(function success() {\n Notifications.success('Success', 'User theme successfully updated');\n $state.reload();\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, err.msg);\n });\n };\n\n async function initView() {\n $scope.userID = Authentication.getUserDetails().ID;\n\n const data = await UserService.user($scope.userID);\n\n $scope.formValues.userTheme = data.Usertheme;\n SettingsService.publicSettings()\n .then(function success(data) {\n $scope.AuthenticationMethod = data.AuthenticationMethod;\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve application settings');\n });\n\n UserService.getAccessTokens($scope.userID)\n .then(function success(data) {\n $scope.tokens = data;\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve user tokens');\n });\n }\n\n initView();\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./create-user-access-token.html');\n\nimport angular from 'angular';\nimport controller from './create-user-access-token.controller';\n\nangular.module('portainer.app').component('createUserAccessToken', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n});\n","var path = 'app/portainer/views/account/create-user-access-token/create-user-access-token.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Create access token\\\"></rd-header-title>\\n <rd-header-content> <a ui-sref=\\\"portainer.account\\\">User settings</a> > Add access token </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <!-- mount react feature/view -->\\n <create-access-token user-id=\\\"$ctrl.state.userId\\\" on-submit=\\\"($ctrl.onSubmit)\\\" on-success=\\\"($ctrl.onSuccess)\\\" on-error=\\\"($ctrl.onError)\\\"></create-access-token>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import angular from 'angular';\nimport uuidv4 from 'uuid/v4';\n\nclass AuthenticationController {\n /* @ngInject */\n constructor(\n $async,\n $analytics,\n $scope,\n $state,\n $stateParams,\n $window,\n Authentication,\n UserService,\n EndpointService,\n StateManager,\n Notifications,\n SettingsService,\n URLHelper,\n LocalStorage,\n StatusService\n ) {\n this.$async = $async;\n this.$analytics = $analytics;\n this.$scope = $scope;\n this.$state = $state;\n this.$stateParams = $stateParams;\n this.$window = $window;\n this.Authentication = Authentication;\n this.UserService = UserService;\n this.EndpointService = EndpointService;\n this.StateManager = StateManager;\n this.Notifications = Notifications;\n this.SettingsService = SettingsService;\n this.URLHelper = URLHelper;\n this.LocalStorage = LocalStorage;\n this.StatusService = StatusService;\n\n this.logo = this.StateManager.getState().application.logo;\n this.formValues = {\n Username: '',\n Password: '',\n };\n this.state = {\n showOAuthLogin: false,\n showStandardLogin: false,\n AuthenticationError: '',\n loginInProgress: true,\n OAuthProvider: '',\n };\n\n this.checkForEndpointsAsync = this.checkForEndpointsAsync.bind(this);\n this.checkForLatestVersionAsync = this.checkForLatestVersionAsync.bind(this);\n this.postLoginSteps = this.postLoginSteps.bind(this);\n\n this.oAuthLoginAsync = this.oAuthLoginAsync.bind(this);\n this.internalLoginAsync = this.internalLoginAsync.bind(this);\n\n this.authenticateUserAsync = this.authenticateUserAsync.bind(this);\n\n this.manageOauthCodeReturn = this.manageOauthCodeReturn.bind(this);\n this.authEnabledFlowAsync = this.authEnabledFlowAsync.bind(this);\n this.onInit = this.onInit.bind(this);\n }\n\n /**\n * UTILS FUNCTIONS SECTION\n */\n\n logout(error) {\n this.Authentication.logout();\n this.state.loginInProgress = false;\n this.generateOAuthLoginURI();\n this.LocalStorage.storeLogoutReason(error);\n this.$window.location.reload();\n }\n\n error(err, message) {\n this.state.AuthenticationError = message;\n if (!err) {\n err = {};\n }\n this.Notifications.error('Failure', err, message);\n this.state.loginInProgress = false;\n }\n\n determineOauthProvider(LoginURI) {\n if (LoginURI.indexOf('login.microsoftonline.com') !== -1) {\n return 'Microsoft';\n } else if (LoginURI.indexOf('accounts.google.com') !== -1) {\n return 'Google';\n } else if (LoginURI.indexOf('github.com') !== -1) {\n return 'Github';\n }\n return 'OAuth';\n }\n\n generateState() {\n const uuid = uuidv4();\n this.LocalStorage.storeLoginStateUUID(uuid);\n return '&state=' + uuid;\n }\n\n generateOAuthLoginURI() {\n this.OAuthLoginURI = this.state.OAuthLoginURI + this.generateState();\n }\n\n hasValidState(state) {\n const savedUUID = this.LocalStorage.getLoginStateUUID();\n return savedUUID && state && savedUUID === state;\n }\n\n /**\n * END UTILS FUNCTIONS SECTION\n */\n\n /**\n * POST LOGIN STEPS SECTION\n */\n\n async checkForEndpointsAsync() {\n try {\n const endpoints = await this.EndpointService.endpoints(0, 1);\n const isAdmin = this.Authentication.isAdmin();\n\n if (endpoints.value.length === 0 && isAdmin) {\n return this.$state.go('portainer.wizard');\n } else {\n return this.$state.go('portainer.home');\n }\n } catch (err) {\n this.error(err, 'Unable to retrieve environments');\n }\n }\n\n async checkForLatestVersionAsync() {\n let versionInfo = {\n UpdateAvailable: false,\n LatestVersion: '',\n };\n\n try {\n const versionStatus = await this.StatusService.version();\n if (versionStatus.UpdateAvailable) {\n versionInfo.UpdateAvailable = true;\n versionInfo.LatestVersion = versionStatus.LatestVersion;\n }\n } finally {\n this.StateManager.setVersionInfo(versionInfo);\n }\n }\n\n async postLoginSteps() {\n await this.StateManager.initialize();\n\n const isAdmin = this.Authentication.isAdmin();\n this.$analytics.setUserRole(isAdmin ? 'admin' : 'standard-user');\n\n await this.checkForEndpointsAsync();\n await this.checkForLatestVersionAsync();\n }\n /**\n * END POST LOGIN STEPS SECTION\n */\n\n /**\n * LOGIN METHODS SECTION\n */\n\n async oAuthLoginAsync(code) {\n try {\n await this.Authentication.OAuthLogin(code);\n this.URLHelper.cleanParameters();\n } catch (err) {\n this.error(err, 'Unable to login via OAuth');\n }\n }\n\n async internalLoginAsync(username, password) {\n await this.Authentication.login(username, password);\n await this.postLoginSteps();\n }\n\n /**\n * END LOGIN METHODS SECTION\n */\n\n /**\n * AUTHENTICATE USER SECTION\n */\n\n async authenticateUserAsync() {\n try {\n var username = this.formValues.Username;\n var password = this.formValues.Password;\n this.state.loginInProgress = true;\n await this.internalLoginAsync(username, password);\n } catch (err) {\n this.error(err, 'Unable to login');\n }\n }\n\n authenticateUser() {\n return this.$async(this.authenticateUserAsync);\n }\n\n /**\n * END AUTHENTICATE USER SECTION\n */\n\n /**\n * ON INIT SECTION\n */\n async manageOauthCodeReturn(code, state) {\n if (this.hasValidState(state)) {\n await this.oAuthLoginAsync(code);\n } else {\n this.error(null, 'Invalid OAuth state, try again.');\n }\n }\n\n async authEnabledFlowAsync() {\n try {\n const exists = await this.UserService.administratorExists();\n if (!exists) {\n this.$state.go('portainer.init.admin');\n }\n } catch (err) {\n this.error(err, 'Unable to verify administrator account existence');\n }\n }\n\n toggleStandardLogin() {\n this.state.showStandardLogin = !this.state.showStandardLogin;\n }\n\n async onInit() {\n try {\n const settings = await this.SettingsService.publicSettings();\n this.state.showOAuthLogin = settings.AuthenticationMethod === 3;\n this.state.showStandardLogin = !this.state.showOAuthLogin;\n this.state.OAuthLoginURI = settings.OAuthLoginURI;\n this.state.OAuthProvider = this.determineOauthProvider(settings.OAuthLoginURI);\n\n const code = this.URLHelper.getParameter('code');\n const state = this.URLHelper.getParameter('state');\n if (code && state) {\n await this.manageOauthCodeReturn(code, state);\n this.generateOAuthLoginURI();\n return;\n }\n if(!this.logo){\n await this.StateManager.initialize();\n this.logo = this.StateManager.getState().application.logo;\n }\n this.generateOAuthLoginURI();\n\n if (this.$stateParams.logout || this.$stateParams.error) {\n this.logout(this.$stateParams.error);\n return;\n }\n const error = this.LocalStorage.getLogoutReason();\n if (error) {\n this.state.AuthenticationError = error;\n this.LocalStorage.cleanLogoutReason();\n }\n\n if (this.Authentication.isAuthenticated()) {\n await this.postLoginSteps();\n }\n this.state.loginInProgress = false;\n\n await this.authEnabledFlowAsync();\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve public settings');\n }\n }\n\n $onInit() {\n return this.$async(this.onInit);\n }\n\n /**\n * END ON INIT SECTION\n */\n}\n\nexport default AuthenticationController;\nangular.module('portainer.app').controller('AuthenticationController', AuthenticationController);\n","const autoNgTemplateLoaderTemplate1 = require('./createCustomTemplateView.html');\n\nimport CreateCustomTemplateViewController from './createCustomTemplateViewController.js';\n\nangular.module('portainer.app').component('createCustomTemplateView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: CreateCustomTemplateViewController,\n});\n","var path = 'app/portainer/views/custom-templates/create-custom-template-view/createCustomTemplateView.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Create Custom template\\\"></rd-header-title>\\n <rd-header-content> <a ui-sref=\\\"docker.templates.custom\\\">Custom Templates</a> > Create Custom template </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\" ng-if=\\\"!$ctrl.state.loading\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\" name=\\\"customTemplateForm\\\">\\n <custom-template-common-fields\\n form-values=\\\"$ctrl.formValues\\\"\\n show-platform-field=\\\"true\\\"\\n show-type-field=\\\"true\\\"\\n name-regex=\\\"$ctrl.state.templateNameRegex\\\"\\n ></custom-template-common-fields>\\n\\n <!-- build-method -->\\n <div ng-if=\\\"!$ctrl.state.fromStack\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Build method\\n </div>\\n <div class=\\\"form-group\\\"></div>\\n <div class=\\\"form-group\\\" style=\\\"margin-bottom: 0;\\\">\\n <div class=\\\"boxselector_wrapper\\\">\\n <div>\\n <input type=\\\"radio\\\" id=\\\"method_editor\\\" ng-model=\\\"$ctrl.state.Method\\\" value=\\\"editor\\\" ng-change=\\\"$ctrl.onChangeMethod()\\\" />\\n <label for=\\\"method_editor\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-edit\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Web editor\\n </div>\\n <p>Use our Web editor</p>\\n </label>\\n </div>\\n <div>\\n <input type=\\\"radio\\\" id=\\\"method_upload\\\" ng-model=\\\"$ctrl.state.Method\\\" value=\\\"upload\\\" ng-change=\\\"$ctrl.onChangeMethod()\\\" />\\n <label for=\\\"method_upload\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-upload\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Upload\\n </div>\\n <p>Upload from your computer</p>\\n </label>\\n </div>\\n <div>\\n <input type=\\\"radio\\\" id=\\\"method_repository\\\" ng-model=\\\"$ctrl.state.Method\\\" value=\\\"repository\\\" ng-change=\\\"$ctrl.onChangeMethod()\\\" />\\n <label for=\\\"method_repository\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fab fa-git\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Repository\\n </div>\\n <p>Use a git repository</p>\\n </label>\\n </div>\\n </div>\\n </div>\\n </div>\\n <!-- !build-method -->\\n <!-- web-editor -->\\n <div ng-show=\\\"$ctrl.state.Method === 'editor'\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Web editor\\n </div>\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n You can get more information about Compose file format in the\\n <a href=\\\"https://docs.docker.com/compose/compose-file/\\\" target=\\\"_blank\\\">\\n official documentation\\n </a>\\n .\\n </span>\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <code-editor\\n identifier=\\\"custom-template-creation-editor\\\"\\n placeholder=\\\"# Define or paste the content of your docker-compose file here\\\"\\n yml=\\\"true\\\"\\n value=\\\"$ctrl.formValues.FileContent\\\"\\n on-change=\\\"($ctrl.editorUpdate)\\\"\\n ></code-editor>\\n </div>\\n </div>\\n </div>\\n <!-- !web-editor -->\\n <!-- upload -->\\n <div ng-show=\\\"$ctrl.state.Method === 'upload'\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Upload\\n </div>\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n You can upload a Compose file from your computer.\\n </span>\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ngf-select ng-model=\\\"$ctrl.formValues.File\\\">\\n Select file\\n </button>\\n <span style=\\\"margin-left: 5px;\\\">\\n {{ $ctrl.formValues.File.name }}\\n <i class=\\\"fa fa-times red-icon\\\" ng-if=\\\"!$ctrl.formValues.File\\\" aria-hidden=\\\"true\\\"></i>\\n </span>\\n </div>\\n </div>\\n </div>\\n <!-- !upload -->\\n <!-- repository -->\\n <git-form ng-if=\\\"$ctrl.state.Method === 'repository'\\\" model=\\\"$ctrl.formValues\\\" on-change=\\\"($ctrl.onChangeFormValues)\\\"></git-form>\\n <!-- !repository -->\\n <por-access-control-form form-data=\\\"$ctrl.formValues.AccessControlData\\\"></por-access-control-form>\\n\\n <!-- actions -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"$ctrl.state.actionInProgress || customTemplateForm.$invalid\\n || ($ctrl.state.Method === 'editor' && !$ctrl.formValues.FileContent)\\n || ($ctrl.state.Method === 'upload' && !$ctrl.formValues.File)\\n || ($ctrl.state.Method === 'repository' && ((!$ctrl.formValues.RepositoryURL || !$ctrl.formValues.ComposeFilePathInRepository) || ($ctrl.formValues.RepositoryAuthentication && (!$ctrl.formValues.RepositoryUsername || !$ctrl.formValues.RepositoryPassword))))\\n || !$ctrl.formValues.Title\\\"\\n ng-click=\\\"$ctrl.createCustomTemplate()\\\"\\n button-spinner=\\\"$ctrl.state.actionInProgress\\\"\\n >\\n <span ng-hide=\\\"$ctrl.state.actionInProgress\\\">Create custom template</span>\\n <span ng-show=\\\"$ctrl.state.actionInProgress\\\">Creation in progress...</span>\\n </button>\\n <span class=\\\"text-danger\\\" ng-if=\\\"$ctrl.state.formValidationError\\\" style=\\\"margin-left: 5px;\\\">\\n {{ $ctrl.state.formValidationError }}\\n </span>\\n </div>\\n </div>\\n <!-- !actions -->\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./customTemplatesView.html');\n\nimport CustomTemplatesViewController from './customTemplatesViewController.js';\n\nangular.module('portainer.app').component('customTemplatesView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: CustomTemplatesViewController,\n});\n","var path = 'app/portainer/views/custom-templates/custom-templates-view/customTemplatesView.html';\nvar html = \"<rd-header id=\\\"view-top\\\">\\n <rd-header-title title-text=\\\"Custom Templates\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"Refresh\\\" ui-sref=\\\"docker.templates.custom\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content>Custom Templates</rd-header-content>\\n</rd-header>\\n<div class=\\\"row\\\">\\n <stack-from-template-form\\n ng-if=\\\"$ctrl.state.selectedTemplate\\\"\\n template=\\\"$ctrl.state.selectedTemplate\\\"\\n form-values=\\\"$ctrl.formValues\\\"\\n name-regex=\\\"$ctrl.state.templateNameRegex\\\"\\n state=\\\"$ctrl.state\\\"\\n create-template=\\\"$ctrl.createStack\\\"\\n unselect-template=\\\"$ctrl.unselectTemplate\\\"\\n >\\n <advanced-form>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <a class=\\\"small interactive\\\" ng-show=\\\"!$ctrl.state.showAdvancedOptions\\\" ng-click=\\\"$ctrl.state.showAdvancedOptions = true;\\\">\\n <i class=\\\"fa fa-plus space-right\\\" aria-hidden=\\\"true\\\"></i> Customize stack\\n </a>\\n <a class=\\\"small interactive\\\" ng-show=\\\"$ctrl.state.showAdvancedOptions\\\" ng-click=\\\"$ctrl.state.showAdvancedOptions = false;\\\">\\n <i class=\\\"fa fa-minus space-right\\\" aria-hidden=\\\"true\\\"></i> Hide custom stack\\n </a>\\n </div>\\n </div>\\n <div ng-if=\\\"$ctrl.state.showAdvancedOptions\\\">\\n <!-- web-editor -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Web editor\\n </div>\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n You can get more information about Compose file format in the\\n <a href=\\\"https://docs.docker.com/compose/compose-file/\\\" target=\\\"_blank\\\">\\n official documentation\\n </a>\\n .\\n </span>\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <code-editor\\n identifier=\\\"custom-template-creation-editor\\\"\\n placeholder=\\\"# Define or paste the content of your docker-compose file here\\\"\\n yml=\\\"true\\\"\\n value=\\\"$ctrl.formValues.fileContent\\\"\\n on-change=\\\"($ctrl.editorUpdate)\\\"\\n ></code-editor>\\n </div>\\n </div>\\n <!-- !web-editor -->\\n </div>\\n </advanced-form>\\n </stack-from-template-form>\\n</div>\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <custom-templates-list\\n ng-if=\\\"$ctrl.templates\\\"\\n title-text=\\\"Templates\\\"\\n title-icon=\\\"fa-rocket\\\"\\n templates=\\\"$ctrl.templates\\\"\\n table-key=\\\"customTemplates\\\"\\n create-path=\\\"docker.templates.custom.new\\\"\\n edit-path=\\\"docker.templates.custom.edit\\\"\\n is-edit-allowed=\\\"$ctrl.isEditAllowed\\\"\\n on-select-click=\\\"($ctrl.selectTemplate)\\\"\\n on-delete-click=\\\"($ctrl.confirmDelete)\\\"\\n ></custom-templates-list>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./editCustomTemplateView.html');\n\nimport EditCustomTemplateViewController from './editCustomTemplateViewController.js';\n\nangular.module('portainer.app').component('editCustomTemplateView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: EditCustomTemplateViewController,\n});\n","var path = 'app/portainer/views/custom-templates/edit-custom-template-view/editCustomTemplateView.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Edit Custom Template\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"Refresh\\\" ui-sref=\\\"docker.templates.custom.edit({id:$ctrl.formValues.Id})\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content> <a ui-sref=\\\"docker.templates.custom\\\">Custom templates</a> > {{ $ctrl.formValues.Title }} </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\" ng-if=\\\"$ctrl.formValues\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\" name=\\\"customTemplateForm\\\">\\n <custom-template-common-fields form-values=\\\"$ctrl.formValues\\\" show-platform-field=\\\"true\\\" show-type-field=\\\"true\\\"></custom-template-common-fields>\\n\\n <!-- web-editor -->\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Web editor\\n </div>\\n <div class=\\\"form-group\\\">\\n <span class=\\\"col-sm-12 text-muted small\\\">\\n You can get more information about Compose file format in the\\n <a href=\\\"https://docs.docker.com/compose/compose-file/\\\" target=\\\"_blank\\\">\\n official documentation\\n </a>\\n .\\n </span>\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <code-editor\\n identifier=\\\"custom-template-creation-editor\\\"\\n placeholder=\\\"# Define or paste the content of your docker-compose file here\\\"\\n yml=\\\"true\\\"\\n value=\\\"$ctrl.formValues.FileContent\\\"\\n on-change=\\\"($ctrl.editorUpdate)\\\"\\n ></code-editor>\\n </div>\\n </div>\\n <!-- !web-editor -->\\n\\n <por-access-control-form form-data=\\\"$ctrl.formValues.AccessControlData\\\" resource-control=\\\"$ctrl.formValues.ResourceControl\\\"></por-access-control-form>\\n\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Actions\\n </div>\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"button\\\"\\n class=\\\"btn btn-primary btn-sm\\\"\\n ng-disabled=\\\"$ctrl.actionInProgress || customTemplateForm.$invalid\\n || !$ctrl.formValues.Title\\n || !$ctrl.formValues.FileContent\\\"\\n ng-click=\\\"$ctrl.submitAction()\\\"\\n button-spinner=\\\"$ctrl.actionInProgress\\\"\\n >\\n <span ng-hide=\\\"$ctrl.actionInProgress\\\">Update the template</span>\\n <span ng-show=\\\"$ctrl.actionInProgress\\\">Update in progress...</span>\\n </button>\\n <span class=\\\"text-danger\\\" ng-if=\\\"$ctrl.state.formValidationError\\\" style=\\\"margin-left: 5px;\\\">\\n {{ $ctrl.state.formValidationError }}\\n </span>\\n </div>\\n </div>\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./registries.html');\n\nangular.module('portainer.app').component('endpointRegistriesView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'EndpointRegistriesController',\n bindings: {\n endpoint: '<',\n },\n});\n","var path = 'app/portainer/views/endpoint-registries/registries.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Environment registries\\\">\\n <a data-toggle=\\\"tooltip\\\" title=\\\"Refresh\\\" ui-sref=\\\"docker.registries\\\" ui-sref-opts=\\\"{reload: true}\\\">\\n <i class=\\\"fa fa-sync\\\" aria-hidden=\\\"true\\\"></i>\\n </a>\\n </rd-header-title>\\n <rd-header-content>Manage registry access inside this environment</rd-header-content>\\n</rd-header>\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <registries-datatable\\n title-text=\\\"Registries\\\"\\n title-icon=\\\"fa-database\\\"\\n dataset=\\\"$ctrl.registries\\\"\\n table-key=\\\"endpointRegistries\\\"\\n order-by=\\\"Name\\\"\\n endpoint-type=\\\"$ctrl.endpointType\\\"\\n can-manage-access=\\\"$ctrl.canManageAccess\\\"\\n ></registries-datatable>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import { RegistryTypes } from 'Portainer/models/registryTypes';\n\nclass EndpointRegistriesController {\n /* @ngInject */\n constructor($async, Notifications, EndpointService) {\n this.$async = $async;\n this.Notifications = Notifications;\n this.EndpointService = EndpointService;\n\n this.canManageAccess = this.canManageAccess.bind(this);\n }\n\n canManageAccess(item) {\n return item.Type !== RegistryTypes.ANONYMOUS;\n }\n\n getRegistries() {\n return this.$async(async () => {\n try {\n const registries = await this.EndpointService.registries(this.endpointId);\n this.registries = registries;\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve registries');\n }\n });\n }\n\n $onInit() {\n return this.$async(async () => {\n this.state = {\n viewReady: false,\n };\n\n try {\n this.endpointType = this.endpoint.Type;\n this.endpointId = this.endpoint.Id;\n await this.getRegistries();\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve registries');\n } finally {\n this.state.viewReady = true;\n }\n });\n }\n}\n\nexport default EndpointRegistriesController;\nangular.module('portainer.app').controller('EndpointRegistriesController', EndpointRegistriesController);\n","import angular from 'angular';\n\nimport { RBAC_ROLES } from '@/portainer/feature-flags/feature-ids';\n\nclass EndpointAccessController {\n /* @ngInject */\n constructor($state, $transition$, Notifications, EndpointService, GroupService, $async) {\n this.$state = $state;\n this.$transition$ = $transition$;\n this.Notifications = Notifications;\n this.EndpointService = EndpointService;\n this.GroupService = GroupService;\n this.$async = $async;\n\n this.limitedFeature = RBAC_ROLES;\n\n this.updateAccess = this.updateAccess.bind(this);\n this.updateAccessAsync = this.updateAccessAsync.bind(this);\n }\n\n async $onInit() {\n this.state = { actionInProgress: false };\n try {\n this.endpoint = await this.EndpointService.endpoint(this.$transition$.params().id);\n this.group = await this.GroupService.group(this.endpoint.GroupId);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve environment information');\n }\n }\n\n updateAccess() {\n return this.$async(this.updateAccessAsync);\n }\n\n async updateAccessAsync() {\n try {\n this.state.actionInProgress = true;\n await this.EndpointService.updateEndpoint(this.$transition$.params().id, this.endpoint);\n this.Notifications.success('Access successfully updated');\n this.$state.reload(this.$state.current);\n } catch (err) {\n this.state.actionInProgress = false;\n this.Notifications.error('Failure', err, 'Unable to update accesses');\n }\n }\n}\n\nexport default EndpointAccessController;\nangular.module('portainer.app').controller('EndpointAccessController', EndpointAccessController);\n","import { PortainerEndpointCreationTypes, PortainerEndpointTypes } from 'Portainer/models/endpoint/models';\nimport { getAgentShortVersion } from 'Portainer/views/endpoints/helpers';\nimport { EndpointSecurityFormData } from '../../../components/endpointSecurity/porEndpointSecurityModel';\n\nangular\n .module('portainer.app')\n .controller('CreateEndpointController', function CreateEndpointController(\n $async,\n $analytics,\n $q,\n $scope,\n $state,\n $filter,\n clipboard,\n EndpointService,\n GroupService,\n TagService,\n SettingsService,\n Notifications,\n Authentication,\n StateManager\n ) {\n $scope.state = {\n EnvironmentType: 'agent',\n PlatformType: 'linux',\n actionInProgress: false,\n deploymentTab: 0,\n allowCreateTag: Authentication.isAdmin(),\n availableEdgeAgentCheckinOptions: [\n { key: 'Use default interval', value: 0 },\n {\n key: '5 seconds',\n value: 5,\n },\n {\n key: '10 seconds',\n value: 10,\n },\n {\n key: '30 seconds',\n value: 30,\n },\n { key: '5 minutes', value: 300 },\n { key: '1 hour', value: 3600 },\n { key: '1 day', value: 86400 },\n ],\n };\n\n const agentVersion = StateManager.getState().application.version;\n const agentShortVersion = getAgentShortVersion(agentVersion);\n\n const deployCommands = {\n kubeLoadBalancer: `curl -L https://downloads.portainer.io/portainer-agent-ce${agentShortVersion}-k8s-lb.yaml -o portainer-agent-k8s.yaml; kubectl apply -f portainer-agent-k8s.yaml`,\n kubeNodePort: `curl -L https://downloads.portainer.io/portainer-agent-ce${agentShortVersion}-k8s-nodeport.yaml -o portainer-agent-k8s.yaml; kubectl apply -f portainer-agent-k8s.yaml`,\n agentLinux: `curl -L https://downloads.portainer.io/agent-stack-ce${agentShortVersion}.yml -o agent-stack.yml && docker stack deploy --compose-file=agent-stack.yml portainer-agent`,\n agentWindows: `curl -L https://downloads.portainer.io/agent-stack-ce${agentShortVersion}-windows.yml -o agent-stack-windows.yml && docker stack deploy --compose-file=agent-stack-windows.yml portainer-agent`,\n };\n $scope.deployCommands = deployCommands;\n\n $scope.formValues = {\n Name: '',\n URL: '',\n PublicURL: '',\n GroupId: 1,\n SecurityFormData: new EndpointSecurityFormData(),\n AzureApplicationId: '',\n AzureTenantId: '',\n AzureAuthenticationKey: '',\n TagIds: [],\n CheckinInterval: $scope.state.availableEdgeAgentCheckinOptions[0].value,\n };\n\n $scope.copyAgentCommand = function () {\n if ($scope.state.deploymentTab === 2 && $scope.state.PlatformType === 'linux') {\n clipboard.copyText(deployCommands.agentLinux);\n } else if ($scope.state.deploymentTab === 2 && $scope.state.PlatformType === 'windows') {\n clipboard.copyText(deployCommands.agentWindows);\n } else if ($scope.state.deploymentTab === 1) {\n clipboard.copyText(deployCommands.kubeNodePort);\n } else {\n clipboard.copyText(deployCommands.kubeLoadBalancer);\n }\n $('#copyNotification').show().fadeOut(2500);\n };\n\n $scope.setDefaultPortainerInstanceURL = function () {\n $scope.formValues.URL = window.location.origin;\n };\n\n $scope.resetEndpointURL = function () {\n $scope.formValues.URL = '';\n };\n\n $scope.onCreateTag = function onCreateTag(tagName) {\n return $async(onCreateTagAsync, tagName);\n };\n\n async function onCreateTagAsync(tagName) {\n try {\n const tag = await TagService.createTag(tagName);\n $scope.availableTags = $scope.availableTags.concat(tag);\n $scope.formValues.TagIds = $scope.formValues.TagIds.concat(tag.Id);\n } catch (err) {\n Notifications.error('Failure', err, 'Unable to create tag');\n }\n }\n\n $scope.addDockerEndpoint = function () {\n var name = $scope.formValues.Name;\n var URL = $filter('stripprotocol')($scope.formValues.URL);\n var publicURL = $scope.formValues.PublicURL;\n var groupId = $scope.formValues.GroupId;\n var tagIds = $scope.formValues.TagIds;\n\n if ($scope.formValues.ConnectSocket) {\n URL = $scope.formValues.SocketPath;\n $scope.state.actionInProgress = true;\n EndpointService.createLocalEndpoint(name, URL, publicURL, groupId, tagIds)\n .then(function success() {\n Notifications.success('Environment created', name);\n $state.go('portainer.endpoints', {}, { reload: true });\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to create environment');\n })\n .finally(function final() {\n $scope.state.actionInProgress = false;\n });\n } else {\n if (publicURL === '') {\n publicURL = URL.split(':')[0];\n }\n\n var securityData = $scope.formValues.SecurityFormData;\n var TLS = securityData.TLS;\n var TLSMode = securityData.TLSMode;\n var TLSSkipVerify = TLS && (TLSMode === 'tls_client_noca' || TLSMode === 'tls_only');\n var TLSSkipClientVerify = TLS && (TLSMode === 'tls_ca' || TLSMode === 'tls_only');\n var TLSCAFile = TLSSkipVerify ? null : securityData.TLSCACert;\n var TLSCertFile = TLSSkipClientVerify ? null : securityData.TLSCert;\n var TLSKeyFile = TLSSkipClientVerify ? null : securityData.TLSKey;\n\n addEndpoint(\n name,\n PortainerEndpointCreationTypes.LocalDockerEnvironment,\n URL,\n publicURL,\n groupId,\n tagIds,\n TLS,\n TLSSkipVerify,\n TLSSkipClientVerify,\n TLSCAFile,\n TLSCertFile,\n TLSKeyFile\n );\n }\n };\n\n $scope.addKubernetesEndpoint = function () {\n var name = $scope.formValues.Name;\n var tagIds = $scope.formValues.TagIds;\n $scope.state.actionInProgress = true;\n EndpointService.createLocalKubernetesEndpoint(name, tagIds)\n .then(function success(result) {\n Notifications.success('Environment created', name);\n $state.go('portainer.k8sendpoint.kubernetesConfig', { id: result.Id });\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to create environment');\n })\n .finally(function final() {\n $scope.state.actionInProgress = false;\n });\n };\n\n $scope.addAgentEndpoint = addAgentEndpoint;\n async function addAgentEndpoint() {\n return $async(async () => {\n const name = $scope.formValues.Name;\n const URL = $scope.formValues.URL;\n const publicURL = $scope.formValues.PublicURL === '' ? URL.split(':')[0] : $scope.formValues.PublicURL;\n const groupId = $scope.formValues.GroupId;\n const tagIds = $scope.formValues.TagIds;\n\n const endpoint = await addEndpoint(name, PortainerEndpointCreationTypes.AgentEnvironment, URL, publicURL, groupId, tagIds, true, true, true, null, null, null);\n $analytics.eventTrack('portainer-endpoint-creation', { category: 'portainer', metadata: { type: 'agent', platform: platformLabel(endpoint.Type) } });\n });\n\n function platformLabel(type) {\n switch (type) {\n case PortainerEndpointTypes.DockerEnvironment:\n case PortainerEndpointTypes.AgentOnDockerEnvironment:\n case PortainerEndpointTypes.EdgeAgentOnDockerEnvironment:\n return 'docker';\n case PortainerEndpointTypes.KubernetesLocalEnvironment:\n case PortainerEndpointTypes.AgentOnKubernetesEnvironment:\n case PortainerEndpointTypes.EdgeAgentOnKubernetesEnvironment:\n return 'kubernetes';\n }\n }\n }\n\n $scope.addEdgeAgentEndpoint = function () {\n var name = $scope.formValues.Name;\n var groupId = $scope.formValues.GroupId;\n var tagIds = $scope.formValues.TagIds;\n var URL = $scope.formValues.URL;\n\n addEndpoint(name, PortainerEndpointCreationTypes.EdgeAgentEnvironment, URL, '', groupId, tagIds, false, false, false, null, null, null, $scope.formValues.CheckinInterval);\n };\n\n $scope.addAzureEndpoint = function () {\n var name = $scope.formValues.Name;\n var applicationId = $scope.formValues.AzureApplicationId;\n var tenantId = $scope.formValues.AzureTenantId;\n var authenticationKey = $scope.formValues.AzureAuthenticationKey;\n var groupId = $scope.formValues.GroupId;\n var tagIds = $scope.formValues.TagIds;\n\n createAzureEndpoint(name, applicationId, tenantId, authenticationKey, groupId, tagIds);\n };\n\n function createAzureEndpoint(name, applicationId, tenantId, authenticationKey, groupId, tagIds) {\n $scope.state.actionInProgress = true;\n EndpointService.createAzureEndpoint(name, applicationId, tenantId, authenticationKey, groupId, tagIds)\n .then(function success() {\n Notifications.success('Environment created', name);\n $state.go('portainer.endpoints', {}, { reload: true });\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to create environment');\n })\n .finally(function final() {\n $scope.state.actionInProgress = false;\n });\n }\n\n async function addEndpoint(name, creationType, URL, PublicURL, groupId, tagIds, TLS, TLSSkipVerify, TLSSkipClientVerify, TLSCAFile, TLSCertFile, TLSKeyFile, CheckinInterval) {\n return $async(async () => {\n $scope.state.actionInProgress = true;\n try {\n const endpoint = await EndpointService.createRemoteEndpoint(\n name,\n creationType,\n URL,\n PublicURL,\n groupId,\n tagIds,\n TLS,\n TLSSkipVerify,\n TLSSkipClientVerify,\n TLSCAFile,\n TLSCertFile,\n TLSKeyFile,\n CheckinInterval\n );\n\n Notifications.success('Environment created', name);\n switch (endpoint.Type) {\n case PortainerEndpointTypes.EdgeAgentOnDockerEnvironment:\n case PortainerEndpointTypes.EdgeAgentOnKubernetesEnvironment:\n $state.go('portainer.endpoints.endpoint', { id: endpoint.Id });\n break;\n case PortainerEndpointTypes.AgentOnKubernetesEnvironment:\n $state.go('portainer.k8sendpoint.kubernetesConfig', { id: endpoint.Id });\n break;\n default:\n $state.go('portainer.endpoints', {}, { reload: true });\n break;\n }\n\n return endpoint;\n } catch (err) {\n Notifications.error('Failure', err, 'Unable to create environment');\n } finally {\n $scope.state.actionInProgress = false;\n }\n });\n }\n\n function initView() {\n $q.all({\n groups: GroupService.groups(),\n tags: TagService.tags(),\n settings: SettingsService.settings(),\n })\n .then(function success(data) {\n $scope.groups = data.groups;\n $scope.availableTags = data.tags;\n\n const settings = data.settings;\n $scope.state.availableEdgeAgentCheckinOptions[0].key += ` (${settings.EdgeAgentCheckinInterval} seconds)`;\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to load groups');\n });\n }\n\n initView();\n });\n","import _ from 'lodash-es';\nimport uuidv4 from 'uuid/v4';\n\nimport { PortainerEndpointTypes } from '@/portainer/models/endpoint/models';\nimport { EndpointSecurityFormData } from '@/portainer/components/endpointSecurity/porEndpointSecurityModel';\nimport { getAgentShortVersion } from 'Portainer/views/endpoints/helpers';\n\nangular.module('portainer.app').controller('EndpointController', EndpointController);\n\n/* @ngInject */\nfunction EndpointController(\n $async,\n $q,\n $scope,\n $state,\n $transition$,\n $filter,\n clipboard,\n EndpointService,\n GroupService,\n TagService,\n EndpointProvider,\n Notifications,\n Authentication,\n SettingsService,\n ModalService,\n StateManager\n) {\n const DEPLOYMENT_TABS = {\n SWARM: 'swarm',\n STANDALONE: 'standalone',\n KUBERNETES: 'kubernetes',\n };\n\n const PLATFORM_TYPES = {\n WINDOWS: 'windows',\n LINUX: 'linux',\n };\n\n $scope.state = {\n uploadInProgress: false,\n actionInProgress: false,\n deploymentTab: DEPLOYMENT_TABS.KUBERNETES,\n platformType: PLATFORM_TYPES.LINUX,\n azureEndpoint: false,\n kubernetesEndpoint: false,\n agentEndpoint: false,\n edgeEndpoint: false,\n allowCreate: Authentication.isAdmin(),\n availableEdgeAgentCheckinOptions: [\n { key: 'Use default interval', value: 0 },\n {\n key: '5 seconds',\n value: 5,\n },\n {\n key: '10 seconds',\n value: 10,\n },\n {\n key: '30 seconds',\n value: 30,\n },\n { key: '5 minutes', value: 300 },\n { key: '1 hour', value: 3600 },\n { key: '1 day', value: 86400 },\n ],\n allowSelfSignedCerts: true,\n };\n\n $scope.agentVersion = StateManager.getState().application.version;\n $scope.agentShortVersion = getAgentShortVersion($scope.agentVersion);\n\n $scope.dockerCommands = {\n [DEPLOYMENT_TABS.STANDALONE]: {\n [PLATFORM_TYPES.LINUX]: buildLinuxStandaloneCommand,\n [PLATFORM_TYPES.WINDOWS]: buildWindowsStandaloneCommand,\n },\n [DEPLOYMENT_TABS.SWARM]: {\n [PLATFORM_TYPES.LINUX]: buildLinuxSwarmCommand,\n [PLATFORM_TYPES.WINDOWS]: buildWindowsSwarmCommand,\n },\n [DEPLOYMENT_TABS.KUBERNETES]: {\n [PLATFORM_TYPES.LINUX]: buildKubernetesCommand,\n [PLATFORM_TYPES.WINDOWS]: () => '',\n },\n };\n\n $scope.formValues = {\n SecurityFormData: new EndpointSecurityFormData(),\n };\n\n $scope.copyEdgeAgentDeploymentCommand = copyEdgeAgentDeploymentCommand;\n function copyEdgeAgentDeploymentCommand() {\n const command = $scope.dockerCommands[$scope.state.deploymentTab][$scope.state.platformType](\n $scope.agentVersion,\n $scope.agentShortVersion,\n $scope.randomEdgeID,\n $scope.endpoint.EdgeKey,\n $scope.state.allowSelfSignedCerts\n );\n clipboard.copyText(command.trim());\n $('#copyNotificationDeploymentCommand').show().fadeOut(2500);\n }\n\n $scope.copyEdgeAgentKey = function () {\n clipboard.copyText($scope.endpoint.EdgeKey);\n $('#copyNotificationEdgeKey').show().fadeOut(2500);\n };\n\n $scope.onCreateTag = function onCreateTag(tagName) {\n return $async(onCreateTagAsync, tagName);\n };\n\n async function onCreateTagAsync(tagName) {\n try {\n const tag = await TagService.createTag(tagName);\n $scope.availableTags = $scope.availableTags.concat(tag);\n $scope.endpoint.TagIds = $scope.endpoint.TagIds.concat(tag.Id);\n } catch (err) {\n Notifications.error('Failue', err, 'Unable to create tag');\n }\n }\n\n $scope.onDeassociateEndpoint = async function () {\n ModalService.confirmDeassociate((confirmed) => {\n if (confirmed) {\n deassociateEndpoint();\n }\n });\n };\n\n async function deassociateEndpoint() {\n var endpoint = $scope.endpoint;\n\n try {\n $scope.state.actionInProgress = true;\n await EndpointService.deassociateEndpoint(endpoint.Id);\n Notifications.success('Environment de-associated', $scope.endpoint.Name);\n $state.reload();\n } catch (err) {\n Notifications.error('Failure', err, 'Unable to de-associate environment');\n } finally {\n $scope.state.actionInProgress = false;\n }\n }\n\n $scope.updateEndpoint = function () {\n var endpoint = $scope.endpoint;\n var securityData = $scope.formValues.SecurityFormData;\n var TLS = securityData.TLS;\n var TLSMode = securityData.TLSMode;\n var TLSSkipVerify = TLS && (TLSMode === 'tls_client_noca' || TLSMode === 'tls_only');\n var TLSSkipClientVerify = TLS && (TLSMode === 'tls_ca' || TLSMode === 'tls_only');\n\n var payload = {\n Name: endpoint.Name,\n PublicURL: endpoint.PublicURL,\n GroupID: endpoint.GroupId,\n TagIds: endpoint.TagIds,\n EdgeCheckinInterval: endpoint.EdgeCheckinInterval,\n TLS: TLS,\n TLSSkipVerify: TLSSkipVerify,\n TLSSkipClientVerify: TLSSkipClientVerify,\n TLSCACert: TLSSkipVerify || securityData.TLSCACert === endpoint.TLSConfig.TLSCACert ? null : securityData.TLSCACert,\n TLSCert: TLSSkipClientVerify || securityData.TLSCert === endpoint.TLSConfig.TLSCert ? null : securityData.TLSCert,\n TLSKey: TLSSkipClientVerify || securityData.TLSKey === endpoint.TLSConfig.TLSKey ? null : securityData.TLSKey,\n AzureApplicationID: endpoint.AzureCredentials.ApplicationID,\n AzureTenantID: endpoint.AzureCredentials.TenantID,\n AzureAuthenticationKey: endpoint.AzureCredentials.AuthenticationKey,\n };\n\n if (\n $scope.endpointType !== 'local' &&\n endpoint.Type !== PortainerEndpointTypes.AzureEnvironment &&\n endpoint.Type !== PortainerEndpointTypes.KubernetesLocalEnvironment &&\n endpoint.Type !== PortainerEndpointTypes.AgentOnKubernetesEnvironment\n ) {\n payload.URL = 'tcp://' + endpoint.URL;\n }\n\n if (endpoint.Type === PortainerEndpointTypes.AgentOnKubernetesEnvironment) {\n payload.URL = endpoint.URL;\n }\n\n if (endpoint.Type === PortainerEndpointTypes.KubernetesLocalEnvironment) {\n payload.URL = 'https://' + endpoint.URL;\n }\n\n $scope.state.actionInProgress = true;\n EndpointService.updateEndpoint(endpoint.Id, payload).then(\n function success() {\n Notifications.success('Environment updated', $scope.endpoint.Name);\n EndpointProvider.setEndpointPublicURL(endpoint.PublicURL);\n $state.go('portainer.endpoints', {}, { reload: true });\n },\n function error(err) {\n Notifications.error('Failure', err, 'Unable to update environment');\n $scope.state.actionInProgress = false;\n },\n function update(evt) {\n if (evt.upload) {\n $scope.state.uploadInProgress = evt.upload;\n }\n }\n );\n };\n\n function decodeEdgeKey(key) {\n let keyInformation = {};\n\n if (key === '') {\n return keyInformation;\n }\n\n let decodedKey = _.split(atob(key), '|');\n keyInformation.instanceURL = decodedKey[0];\n keyInformation.tunnelServerAddr = decodedKey[1];\n\n return keyInformation;\n }\n\n function configureState() {\n if (\n $scope.endpoint.Type === PortainerEndpointTypes.KubernetesLocalEnvironment ||\n $scope.endpoint.Type === PortainerEndpointTypes.AgentOnKubernetesEnvironment ||\n $scope.endpoint.Type === PortainerEndpointTypes.EdgeAgentOnKubernetesEnvironment\n ) {\n $scope.state.kubernetesEndpoint = true;\n }\n if ($scope.endpoint.Type === PortainerEndpointTypes.EdgeAgentOnDockerEnvironment || $scope.endpoint.Type === PortainerEndpointTypes.EdgeAgentOnKubernetesEnvironment) {\n $scope.state.edgeEndpoint = true;\n }\n if ($scope.endpoint.Type === PortainerEndpointTypes.AzureEnvironment) {\n $scope.state.azureEndpoint = true;\n }\n if (\n $scope.endpoint.Type === PortainerEndpointTypes.AgentOnDockerEnvironment ||\n $scope.endpoint.Type === PortainerEndpointTypes.EdgeAgentOnDockerEnvironment ||\n $scope.endpoint.Type === PortainerEndpointTypes.AgentOnKubernetesEnvironment ||\n $scope.endpoint.Type === PortainerEndpointTypes.EdgeAgentOnKubernetesEnvironment\n ) {\n $scope.state.agentEndpoint = true;\n }\n }\n\n async function initView() {\n return $async(async () => {\n try {\n const [endpoint, groups, tags, settings] = await Promise.all([\n EndpointService.endpoint($transition$.params().id),\n GroupService.groups(),\n TagService.tags(),\n SettingsService.settings(),\n ]);\n\n if (endpoint.URL.indexOf('unix://') === 0 || endpoint.URL.indexOf('npipe://') === 0) {\n $scope.endpointType = 'local';\n } else {\n $scope.endpointType = 'remote';\n }\n\n endpoint.URL = $filter('stripprotocol')(endpoint.URL);\n\n if (endpoint.Type === PortainerEndpointTypes.EdgeAgentOnDockerEnvironment || endpoint.Type === PortainerEndpointTypes.EdgeAgentOnKubernetesEnvironment) {\n $scope.edgeKeyDetails = decodeEdgeKey(endpoint.EdgeKey);\n $scope.randomEdgeID = uuidv4();\n\n $scope.state.availableEdgeAgentCheckinOptions[0].key += ` (${settings.EdgeAgentCheckinInterval} seconds)`;\n }\n\n $scope.endpoint = endpoint;\n $scope.groups = groups;\n $scope.availableTags = tags;\n\n configureState();\n } catch (err) {\n Notifications.error('Failure', err, 'Unable to retrieve environment details');\n }\n });\n }\n\n function buildLinuxStandaloneCommand(agentVersion, agentShortVersion, edgeId, edgeKey, allowSelfSignedCerts) {\n return `\ndocker run -d \\\\\n -v /var/run/docker.sock:/var/run/docker.sock \\\\\n -v /var/lib/docker/volumes:/var/lib/docker/volumes \\\\\n -v /:/host \\\\\n -v portainer_agent_data:/data \\\\\n --restart always \\\\\n -e EDGE=1 \\\\\n -e EDGE_ID=${edgeId} \\\\\n -e EDGE_KEY=${edgeKey} \\\\\n -e CAP_HOST_MANAGEMENT=1 \\\\\n -e EDGE_INSECURE_POLL=${allowSelfSignedCerts ? 1 : 0} \\\\\n --name portainer_edge_agent \\\\\n portainer/agent:${agentVersion}`;\n }\n\n function buildWindowsStandaloneCommand(agentVersion, agentShortVersion, edgeId, edgeKey, allowSelfSignedCerts) {\n return `\ndocker run -d \\\\\n --mount type=npipe,src=\\\\\\\\.\\\\pipe\\\\docker_engine,dst=\\\\\\\\.\\\\pipe\\\\docker_engine \\\\\n --mount type=bind,src=C:\\\\ProgramData\\\\docker\\\\volumes,dst=C:\\\\ProgramData\\\\docker\\\\volumes \\\\\n --mount type=volume,src=portainer_agent_data,dst=C:\\\\data \\\\\n --restart always \\\\\n -e EDGE=1 \\\\\n -e EDGE_ID=${edgeId} \\\\\n -e EDGE_KEY=${edgeKey} \\\\\n -e CAP_HOST_MANAGEMENT=1 \\\\\n -e EDGE_INSECURE_POLL=${allowSelfSignedCerts ? 1 : 0} \\\\\n --name portainer_edge_agent \\\\\n portainer/agent:${agentVersion}`;\n }\n\n function buildLinuxSwarmCommand(agentVersion, agentShortVersion, edgeId, edgeKey, allowSelfSignedCerts) {\n return `\ndocker network create \\\\\n --driver overlay \\\\\n portainer_agent_network;\n\ndocker service create \\\\\n --name portainer_edge_agent \\\\\n --network portainer_agent_network \\\\\n -e AGENT_CLUSTER_ADDR=tasks.portainer_edge_agent \\\\\n -e EDGE=1 \\\\\n -e EDGE_ID=${edgeId} \\\\\n -e EDGE_KEY=${edgeKey} \\\\\n -e CAP_HOST_MANAGEMENT=1 \\\\\n -e EDGE_INSECURE_POLL=${allowSelfSignedCerts ? 1 : 0} \\\\\n --mode global \\\\\n --constraint 'node.platform.os == linux' \\\\\n --mount type=bind,src=//var/run/docker.sock,dst=/var/run/docker.sock \\\\\n --mount type=bind,src=//var/lib/docker/volumes,dst=/var/lib/docker/volumes \\\\\n --mount type=bind,src=//,dst=/host \\\\\n --mount type=volume,src=portainer_agent_data,dst=/data \\\\\n portainer/agent:${agentVersion}`;\n }\n\n function buildWindowsSwarmCommand(agentVersion, agentShortVersion, edgeId, edgeKey, allowSelfSignedCerts) {\n return `\ndocker network create \\\\\n --driver overlay \\\\\n portainer_edge_agent_network && \\\\\ndocker service create \\\\\n --name portainer_edge_agent \\\\\n --network portainer_edge_agent_network \\\\\n -e AGENT_CLUSTER_ADDR=tasks.portainer_edge_agent \\\\\n -e EDGE=1 \\\\\n -e EDGE_ID=${edgeId} \\\\\n -e EDGE_KEY=${edgeKey} \\\\\n -e CAP_HOST_MANAGEMENT=1 \\\\\n -e EDGE_INSECURE_POLL=${allowSelfSignedCerts ? 1 : 0} \\\\\n --mode global \\\\\n --constraint node.platform.os==windows \\\\\n --mount type=npipe,src=\\\\\\\\.\\\\pipe\\\\docker_engine,dst=\\\\\\\\.\\\\pipe\\\\docker_engine \\\\\n --mount type=bind,src=C:\\\\ProgramData\\\\docker\\\\volumes,dst=C:\\\\ProgramData\\\\docker\\\\volumes \\\\\n --mount type=volume,src=portainer_agent_data,dst=C:\\\\data \\\\\n portainer/agent:${agentVersion}`;\n }\n\n function buildKubernetesCommand(agentVersion, agentShortVersion, edgeId, edgeKey, allowSelfSignedCerts) {\n return `\ncurl https://downloads.portainer.io/portainer-ce${agentShortVersion}-edge-agent-setup.sh | bash -s -- ${edgeId} ${edgeKey} ${allowSelfSignedCerts ? '1' : ''}\n`;\n }\n\n initView();\n}\n","import angular from 'angular';\nimport EndpointHelper from 'Portainer/helpers/endpointHelper';\n\nangular.module('portainer.app').controller('EndpointsController', EndpointsController);\n\nfunction EndpointsController($q, $scope, $state, $async, EndpointService, GroupService, ModalService, Notifications, EndpointProvider, StateManager) {\n $scope.removeAction = removeAction;\n\n function removeAction(endpoints) {\n ModalService.confirmDeletion('This action will remove all configurations associated to your environment(s). Continue?', (confirmed) => {\n if (!confirmed) {\n return;\n }\n return $async(removeActionAsync, endpoints);\n });\n }\n\n async function removeActionAsync(endpoints) {\n for (let endpoint of endpoints) {\n try {\n await EndpointService.deleteEndpoint(endpoint.Id);\n\n Notifications.success('Environment successfully removed', endpoint.Name);\n } catch (err) {\n Notifications.error('Failure', err, 'Unable to remove environment');\n }\n }\n\n const endpointId = EndpointProvider.endpointID();\n // If the current endpoint was deleted, then clean endpoint store\n if (endpoints.some((item) => item.Id === endpointId)) {\n StateManager.cleanEndpoint();\n // trigger sidebar rerender\n $scope.applicationState.endpoint = {};\n }\n\n $state.reload();\n }\n\n $scope.getPaginatedEndpoints = getPaginatedEndpoints;\n function getPaginatedEndpoints(lastId, limit, search) {\n const deferred = $q.defer();\n $q.all({\n endpoints: EndpointService.endpoints(lastId, limit, { search }),\n groups: GroupService.groups(),\n })\n .then(function success(data) {\n var endpoints = data.endpoints.value;\n var groups = data.groups;\n EndpointHelper.mapGroupNameToEndpoint(endpoints, groups);\n deferred.resolve({ endpoints: endpoints, totalCount: data.endpoints.totalCount });\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve environment information');\n });\n return deferred.promise;\n }\n}\n","import { RBAC_ROLES } from '@/portainer/feature-flags/feature-ids';\n\nangular.module('portainer.app').controller('GroupAccessController', [\n '$scope',\n '$state',\n '$transition$',\n 'GroupService',\n 'Notifications',\n function ($scope, $state, $transition$, GroupService, Notifications) {\n $scope.limitedFeature = RBAC_ROLES;\n\n $scope.updateAccess = function () {\n $scope.state.actionInProgress = true;\n GroupService.updateGroup($scope.group, $scope.group.AssociatedEndpoints)\n .then(() => {\n Notifications.success('Access successfully updated');\n $state.reload();\n })\n .catch((err) => {\n $scope.state.actionInProgress = false;\n Notifications.error('Failure', err, 'Unable to update accesses');\n });\n };\n\n function initView() {\n var groupId = $transition$.params().id;\n\n $scope.state = { actionInProgress: false };\n GroupService.group(groupId)\n .then(function success(data) {\n $scope.group = data;\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to load view');\n });\n }\n\n initView();\n },\n]);\n","import { EndpointGroupDefaultModel } from '../../../models/group';\n\nangular.module('portainer.app').controller('CreateGroupController', function CreateGroupController($async, $scope, $state, GroupService, TagService, Notifications) {\n $scope.state = {\n actionInProgress: false,\n };\n\n $scope.create = function () {\n var model = $scope.model;\n\n var associatedEndpoints = [];\n for (var i = 0; i < $scope.associatedEndpoints.length; i++) {\n var endpoint = $scope.associatedEndpoints[i];\n associatedEndpoints.push(endpoint.Id);\n }\n\n $scope.state.actionInProgress = true;\n GroupService.createGroup(model, associatedEndpoints)\n .then(function success() {\n Notifications.success('Group successfully created');\n $state.go('portainer.groups', {}, { reload: true });\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to create group');\n })\n .finally(function final() {\n $scope.state.actionInProgress = false;\n });\n };\n\n $scope.onCreateTag = function onCreateTag(tagName) {\n return $async(onCreateTagAsync, tagName);\n };\n\n async function onCreateTagAsync(tagName) {\n try {\n const tag = await TagService.createTag(tagName);\n $scope.availableTags = $scope.availableTags.concat(tag);\n $scope.model.TagIds = $scope.model.TagIds.concat(tag.Id);\n } catch (err) {\n Notifications.error('Failue', err, 'Unable to create tag');\n }\n }\n\n function initView() {\n TagService.tags()\n .then((tags) => {\n $scope.availableTags = tags;\n $scope.associatedEndpoints = [];\n $scope.model = new EndpointGroupDefaultModel();\n $scope.loaded = true;\n })\n .catch((err) => {\n Notifications.error('Failure', err, 'Unable to retrieve tags');\n });\n }\n\n initView();\n});\n","angular.module('portainer.app').controller('GroupController', function GroupController($q, $async, $scope, $state, $transition$, GroupService, TagService, Notifications) {\n $scope.state = {\n actionInProgress: false,\n };\n\n $scope.update = function () {\n var model = $scope.group;\n\n $scope.state.actionInProgress = true;\n GroupService.updateGroup(model)\n .then(function success() {\n Notifications.success('Group successfully updated');\n $state.go('portainer.groups', {}, { reload: true });\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to update group');\n })\n .finally(function final() {\n $scope.state.actionInProgress = false;\n });\n };\n\n $scope.onCreateTag = function onCreateTag(tagName) {\n return $async(onCreateTagAsync, tagName);\n };\n\n async function onCreateTagAsync(tagName) {\n try {\n const tag = await TagService.createTag(tagName);\n $scope.availableTags = $scope.availableTags.concat(tag);\n $scope.group.TagIds = $scope.group.TagIds.concat(tag.Id);\n } catch (err) {\n Notifications.error('Failue', err, 'Unable to create tag');\n }\n }\n\n function initView() {\n var groupId = $transition$.params().id;\n\n $q.all({\n group: GroupService.group(groupId),\n tags: TagService.tags(),\n })\n .then(function success(data) {\n $scope.group = data.group;\n $scope.availableTags = data.tags;\n $scope.loaded = true;\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to load group details');\n });\n }\n\n initView();\n});\n","import angular from 'angular';\nimport _ from 'lodash-es';\n\nangular.module('portainer.app').controller('GroupsController', GroupsController);\n\nfunction GroupsController($scope, $state, $async, GroupService, Notifications) {\n $scope.removeAction = removeAction;\n\n function removeAction(selectedItems) {\n return $async(removeActionAsync, selectedItems);\n }\n\n async function removeActionAsync(selectedItems) {\n for (let group of selectedItems) {\n try {\n await GroupService.deleteGroup(group.Id);\n\n Notifications.success('Environment group successfully removed', group.Name);\n _.remove($scope.groups, group);\n } catch (err) {\n Notifications.error('Failure', err, 'Unable to remove group');\n }\n }\n\n $state.reload();\n }\n\n function initView() {\n GroupService.groups()\n .then(function success(data) {\n $scope.groups = data;\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve environment groups');\n $scope.groups = [];\n });\n }\n\n initView();\n}\n","import EndpointHelper from 'Portainer/helpers/endpointHelper';\n\nangular\n .module('portainer.app')\n .controller('HomeController', function (\n $q,\n $scope,\n $state,\n TagService,\n Authentication,\n EndpointService,\n GroupService,\n Notifications,\n EndpointProvider,\n StateManager,\n ModalService,\n MotdService\n ) {\n $scope.state = {\n connectingToEdgeEndpoint: false,\n homepageLoadTime: '',\n };\n\n $scope.goToEdit = function (id) {\n $state.go('portainer.endpoints.endpoint', { id: id });\n };\n\n $scope.goToDashboard = function (endpoint) {\n if (endpoint.Type === 3) {\n $state.go('azure.dashboard', { endpointId: endpoint.Id });\n return;\n }\n if (endpoint.Type === 4 || endpoint.Type === 7) {\n if (!endpoint.EdgeID) {\n $state.go('portainer.endpoints.endpoint', { id: endpoint.Id });\n return;\n }\n $scope.state.connectingToEdgeEndpoint = true;\n }\n if (endpoint.Type === 5 || endpoint.Type === 6 || endpoint.Type === 7) {\n $state.go('kubernetes.dashboard', { endpointId: endpoint.Id });\n return;\n }\n $state.go('docker.dashboard', { endpointId: endpoint.Id });\n };\n\n $scope.dismissImportantInformation = function (hash) {\n StateManager.dismissImportantInformation(hash);\n };\n\n $scope.dismissInformationPanel = function (id) {\n StateManager.dismissInformationPanel(id);\n };\n\n $scope.triggerSnapshot = function () {\n ModalService.confirmEndpointSnapshot(function (result) {\n if (!result) {\n return;\n }\n triggerSnapshot();\n });\n };\n\n function triggerSnapshot() {\n EndpointService.snapshotEndpoints()\n .then(function success() {\n Notifications.success('Success', 'Environments updated');\n $state.reload();\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'An error occured during environment snapshot');\n });\n }\n\n $scope.getPaginatedEndpoints = getPaginatedEndpoints;\n function getPaginatedEndpoints(lastId, limit, search) {\n const deferred = $q.defer();\n $q.all({\n endpoints: EndpointService.endpoints(lastId, limit, { search }),\n groups: GroupService.groups(),\n })\n .then(function success(data) {\n var endpoints = data.endpoints.value;\n var groups = data.groups;\n EndpointHelper.mapGroupNameToEndpoint(endpoints, groups);\n EndpointProvider.setEndpoints(endpoints);\n deferred.resolve({ endpoints: endpoints, totalCount: data.endpoints.totalCount });\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve environment information');\n });\n return deferred.promise;\n }\n\n async function initView() {\n $scope.state.homepageLoadTime = Math.floor(Date.now() / 1000);\n $scope.isAdmin = Authentication.isAdmin();\n\n MotdService.motd().then(function success(data) {\n $scope.motd = data;\n });\n\n try {\n const tags = TagService.tags();\n $scope.tags = tags;\n } catch (err) {\n Notifications.error('Failed loading page data', err);\n }\n }\n\n initView();\n });\n","angular.module('portainer.app').controller('InitAdminController', [\n '$scope',\n '$state',\n 'Notifications',\n 'Authentication',\n 'StateManager',\n 'SettingsService',\n 'UserService',\n 'EndpointService',\n 'BackupService',\n 'StatusService',\n function ($scope, $state, Notifications, Authentication, StateManager, SettingsService, UserService, EndpointService, BackupService, StatusService) {\n $scope.uploadBackup = uploadBackup;\n\n $scope.logo = StateManager.getState().application.logo;\n\n $scope.formValues = {\n Username: 'admin',\n Password: '',\n ConfirmPassword: '',\n enableTelemetry: process.env.NODE_ENV === 'production',\n };\n\n $scope.state = {\n actionInProgress: false,\n showInitPassword: true,\n showRestorePortainer: false,\n };\n\n createAdministratorFlow();\n\n $scope.togglePanel = function () {\n $scope.state.showInitPassword = !$scope.state.showInitPassword;\n $scope.state.showRestorePortainer = !$scope.state.showRestorePortainer;\n };\n\n $scope.createAdminUser = function () {\n var username = $scope.formValues.Username;\n var password = $scope.formValues.Password;\n\n $scope.state.actionInProgress = true;\n UserService.initAdministrator(username, password)\n .then(function success() {\n return Authentication.login(username, password);\n })\n .then(function success() {\n return SettingsService.update({ enableTelemetry: $scope.formValues.enableTelemetry });\n })\n .then(() => {\n return StateManager.initialize();\n })\n .then(function () {\n return EndpointService.endpoints(0, 100);\n })\n .then(function success(data) {\n if (data.value.length === 0) {\n $state.go('portainer.wizard');\n } else {\n $state.go('portainer.home');\n }\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to create administrator user');\n })\n .finally(function final() {\n $scope.state.actionInProgress = false;\n });\n };\n\n function createAdministratorFlow() {\n UserService.administratorExists()\n .then(function success(exists) {\n if (exists) {\n $state.go('portainer.wizard');\n }\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to verify administrator account existence');\n });\n }\n\n async function uploadBackup() {\n $scope.state.backupInProgress = true;\n\n const file = $scope.formValues.BackupFile;\n const password = $scope.formValues.Password;\n\n restoreAndRefresh(() => BackupService.uploadBackup(file, password));\n }\n\n async function restoreAndRefresh(restoreAsyncFn) {\n $scope.state.backupInProgress = true;\n\n try {\n await restoreAsyncFn();\n } catch (err) {\n Notifications.error('Failure', err, 'Unable to restore the backup');\n $scope.state.backupInProgress = false;\n\n return;\n }\n\n try {\n await waitPortainerRestart();\n Notifications.success('The backup has successfully been restored');\n $state.go('portainer.auth');\n } catch (err) {\n Notifications.error('Failure', err, 'Unable to check for status');\n await wait(2);\n location.reload();\n }\n\n $scope.state.backupInProgress = false;\n }\n\n async function waitPortainerRestart() {\n for (let i = 0; i < 10; i++) {\n await wait(5);\n try {\n const status = await StatusService.status();\n if (status && status.Version) {\n return;\n }\n } catch (e) {\n // pass\n }\n }\n throw new Error('Timeout to wait for Portainer restarting');\n }\n },\n]);\n\nfunction wait(seconds = 0) {\n return new Promise((resolve) => setTimeout(resolve, seconds * 1000));\n}\n","import _ from 'lodash-es';\nimport angular from 'angular';\nimport { PortainerEndpointInitFormValueEndpointSections, PortainerEndpointInitFormValues } from 'Portainer/models/endpoint/formValues';\nimport { PortainerEndpointConnectionTypes, PortainerEndpointCreationTypes, PortainerEndpointTypes } from 'Portainer/models/endpoint/models';\n\nrequire('./includes/localDocker.html');\nrequire('./includes/localKubernetes.html');\nrequire('./includes/agent.html');\n\nclass InitEndpointController {\n /* @ngInject */\n constructor($async, $scope, $state, EndpointService, EndpointProvider, StateManager, Notifications) {\n this.$async = $async;\n this.$scope = $scope;\n this.$state = $state;\n this.EndpointService = EndpointService;\n this.EndpointProvider = EndpointProvider;\n this.StateManager = StateManager;\n this.Notifications = Notifications;\n\n this.createLocalEndpointAsync = this.createLocalEndpointAsync.bind(this);\n this.createLocalKubernetesEndpointAsync = this.createLocalKubernetesEndpointAsync.bind(this);\n this.createAgentEndpointAsync = this.createAgentEndpointAsync.bind(this);\n }\n\n $onInit() {\n if (!_.isEmpty(this.$scope.applicationState.endpoint)) {\n this.$state.go('portainer.home');\n }\n this.logo = this.StateManager.getState().application.logo;\n\n this.state = {\n uploadInProgress: false,\n actionInProgress: false,\n };\n\n this.formValues = new PortainerEndpointInitFormValues();\n this.endpointSections = PortainerEndpointInitFormValueEndpointSections;\n this.PortainerEndpointConnectionTypes = PortainerEndpointConnectionTypes;\n }\n\n isConnectButtonDisabled() {\n switch (this.formValues.ConnectionType) {\n case PortainerEndpointConnectionTypes.DOCKER_LOCAL:\n return this.state.actionInProgress;\n case PortainerEndpointConnectionTypes.KUBERNETES_LOCAL:\n return this.state.actionInProgress;\n case PortainerEndpointConnectionTypes.AGENT:\n return this.state.actionInProgress || !this.formValues.Name || !this.formValues.URL;\n default:\n break;\n }\n }\n\n createEndpoint() {\n switch (this.formValues.ConnectionType) {\n case PortainerEndpointConnectionTypes.DOCKER_LOCAL:\n return this.createLocalEndpoint();\n case PortainerEndpointConnectionTypes.KUBERNETES_LOCAL:\n return this.createLocalKubernetesEndpoint();\n case PortainerEndpointConnectionTypes.AGENT:\n return this.createAgentEndpoint();\n default:\n this.Notifications.error('Failure', null, 'Unable to determine which action to do to create environment');\n }\n }\n\n skipEndpointCreation() {\n this.$state.go('portainer.home');\n }\n\n /**\n * DOCKER_LOCAL (1)\n */\n async createLocalEndpointAsync() {\n try {\n this.state.actionInProgress = true;\n await this.EndpointService.createLocalEndpoint();\n this.$state.go('portainer.home');\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to connect to the Docker environment');\n } finally {\n this.state.actionInProgress = false;\n }\n }\n\n createLocalEndpoint() {\n return this.$async(this.createLocalEndpointAsync);\n }\n\n /**\n * KUBERNETES_LOCAL (5)\n */\n async createLocalKubernetesEndpointAsync() {\n try {\n this.state.actionInProgress = true;\n const endpoint = await this.EndpointService.createLocalKubernetesEndpoint();\n this.$state.go('portainer.k8sendpoint.kubernetesConfig', { id: endpoint.Id });\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to connect to the Kubernetes environment');\n } finally {\n this.state.actionInProgress = false;\n }\n }\n\n createLocalKubernetesEndpoint() {\n return this.$async(this.createLocalKubernetesEndpointAsync);\n }\n\n /**\n * DOCKER / KUBERNETES AGENT (2 / 6)\n */\n async createAgentEndpointAsync() {\n try {\n this.state.actionInProgress = true;\n const name = this.formValues.Name;\n const URL = this.formValues.URL;\n const PublicURL = URL.split(':')[0];\n\n const endpoint = await this.EndpointService.createRemoteEndpoint(\n name,\n PortainerEndpointCreationTypes.AgentEnvironment,\n URL,\n PublicURL,\n 1,\n [],\n true,\n true,\n true,\n null,\n null,\n null\n );\n const routeName = endpoint.Type === PortainerEndpointTypes.AgentOnKubernetesEnvironment ? 'portainer.k8sendpoint.kubernetesConfig' : 'portainer.home';\n this.$state.go(routeName, { id: endpoint.Id });\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to connect to the Docker environment');\n } finally {\n this.state.actionInProgress = false;\n }\n }\n\n createAgentEndpoint() {\n return this.$async(this.createAgentEndpointAsync);\n }\n}\n\nexport default InitEndpointController;\nangular.module('portainer.app').controller('InitEndpointController', InitEndpointController);\n","var path = 'app/portainer/views/init/endpoint/includes/localDocker.html';\nvar html = \"<div class=\\\"col-sm-12 form-section-title\\\">\\n Information\\n</div>\\n<div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <span class=\\\"small\\\">\\n <p class=\\\"text-primary\\\">\\n Manage the Docker environment where Portainer is running.\\n </p>\\n <p class=\\\"text-muted\\\">\\n <i class=\\\"fa fa-exclamation-circle orange-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Ensure that you have started the Portainer container with the following Docker flag:\\n </p>\\n <p class=\\\"text-muted\\\"> <code>-v \\\"/var/run/docker.sock:/var/run/docker.sock\\\"</code> (Linux). </p>\\n <p class=\\\"text-muted\\\">\\n or\\n </p>\\n <p class=\\\"text-muted\\\"> <code>-v \\\\\\\\.\\\\pipe\\\\docker_engine:\\\\\\\\.\\\\pipe\\\\docker_engine</code> (Windows). </p>\\n </span>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/views/init/endpoint/includes/localKubernetes.html';\nvar html = \"<div class=\\\"col-sm-12 form-section-title\\\">\\n Information\\n</div>\\n<div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <span class=\\\"small\\\">\\n <p class=\\\"text-primary\\\">\\n Manage the Kubernetes environment where Portainer is running.\\n </p>\\n </span>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/views/init/endpoint/includes/agent.html';\nvar html = \"<div class=\\\"col-sm-12 form-section-title\\\">\\n Information\\n</div>\\n<div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <span class=\\\"small\\\">\\n <p class=\\\"text-primary\\\">\\n Connect directly to a Portainer agent running inside a Docker or Kubernetes environment.\\n </p>\\n </span>\\n </div>\\n</div>\\n<div class=\\\"col-sm-12 form-section-title\\\">\\n Environment\\n</div>\\n<!-- name-input -->\\n<div class=\\\"form-group\\\">\\n <label for=\\\"endpoint_name\\\" class=\\\"col-sm-4 col-lg-3 control-label text-left\\\">Name</label>\\n <div class=\\\"col-sm-8 col-lg-9\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"endpoint_name\\\" ng-model=\\\"ctrl.formValues.Name\\\" placeholder=\\\"e.g. prod-cluster-01\\\" />\\n </div>\\n</div>\\n<!-- !name-input -->\\n<!-- endpoint-url-input -->\\n<div class=\\\"form-group\\\">\\n <label for=\\\"endpoint_url\\\" class=\\\"col-sm-4 col-lg-3 control-label text-left\\\">\\n Agent URL\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"URL or IP address of a Portainer agent.\\\"> </portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-8 col-lg-9\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" id=\\\"endpoint_url\\\" ng-model=\\\"ctrl.formValues.URL\\\" placeholder=\\\"e.g. 10.0.0.10:9001\\\" />\\n </div>\\n</div>\\n<!-- !endpoint-url-input -->\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import angular from 'angular';\n\nclass LogoutController {\n /* @ngInject */\n constructor($async, $state, $transition$, $window, Authentication, StateManager, Notifications, LocalStorage, SettingsService) {\n this.$async = $async;\n this.$state = $state;\n this.$transition$ = $transition$;\n this.$window = $window;\n\n this.Authentication = Authentication;\n this.StateManager = StateManager;\n this.Notifications = Notifications;\n this.LocalStorage = LocalStorage;\n this.SettingsService = SettingsService;\n\n this.logo = this.StateManager.getState().application.logo;\n this.logoutAsync = this.logoutAsync.bind(this);\n\n this.onInit = this.onInit.bind(this);\n }\n\n /**\n * UTILS FUNCTIONS SECTION\n */\n async logoutAsync() {\n const error = this.$transition$.params().error;\n const performApiLogout = this.$transition$.params().performApiLogout;\n const settings = await this.SettingsService.publicSettings();\n\n try {\n await this.Authentication.logout(performApiLogout);\n } finally {\n this.LocalStorage.storeLogoutReason(error);\n if (settings.OAuthLogoutURI && this.Authentication.getUserDetails().ID !== 1) {\n this.$window.location.href = settings.OAuthLogoutURI;\n } else {\n this.$state.go('portainer.auth', { reload: true });\n }\n }\n }\n\n logout() {\n return this.$async(this.logoutAsync);\n }\n\n /**\n * END UTILS FUNCTIONS SECTION\n */\n\n async onInit() {\n try {\n await this.logout();\n } catch (err) {\n this.Notifications.error('Failure', err, 'An error occured during logout');\n }\n }\n\n $onInit() {\n return this.$async(this.onInit);\n }\n\n /**\n * END ON INIT SECTION\n */\n}\n\nexport default LogoutController;\nangular.module('portainer.app').controller('LogoutController', LogoutController);\n","angular.module('portainer.app').controller('MainController', [\n '$scope',\n 'LocalStorage',\n 'StateManager',\n 'EndpointProvider',\n 'ThemeManager',\n function ($scope, LocalStorage, StateManager, EndpointProvider, ThemeManager) {\n /**\n * Sidebar Toggle & Cookie Control\n */\n var mobileView = 992;\n $scope.getWidth = function () {\n return window.innerWidth;\n };\n\n $scope.applicationState = StateManager.getState();\n $scope.endpointState = EndpointProvider.endpoint();\n\n $scope.$watch($scope.getWidth, function (newValue) {\n if (newValue >= mobileView) {\n const toggleValue = LocalStorage.getToolbarToggle();\n $scope.toggle = typeof toggleValue === 'boolean' ? toggleValue : true;\n } else {\n $scope.toggle = false;\n }\n });\n\n $scope.toggleSidebar = function () {\n $scope.toggle = !$scope.toggle;\n LocalStorage.storeToolbarToggle($scope.toggle);\n };\n\n window.onresize = function () {\n $scope.$apply();\n };\n\n ThemeManager.autoTheme();\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./createRegistry.html');\n\nimport angular from 'angular';\nimport CreateRegistryController from './createRegistryController';\n\nangular.module('portainer.app').component('createRegistry', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: CreateRegistryController,\n bindings: {\n $transition$: '<',\n },\n});\n","var path = 'app/portainer/views/registries/create/createRegistry.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Create registry\\\"></rd-header-title>\\n <rd-header-content> <a ui-sref=\\\"portainer.registries\\\">Registries</a> > Add registry </rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-body>\\n <form class=\\\"form-horizontal\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Registry provider\\n </div>\\n\\n <div class=\\\"form-group\\\"></div>\\n\\n <div class=\\\"form-group\\\" style=\\\"margin-bottom: 0;\\\">\\n <div class=\\\"boxselector_wrapper\\\">\\n <div>\\n <input type=\\\"radio\\\" id=\\\"registry_dockerhub\\\" ng-model=\\\"$ctrl.model.Type\\\" ng-value=\\\"$ctrl.RegistryTypes.DOCKERHUB\\\" />\\n <label for=\\\"registry_dockerhub\\\" ng-click=\\\"$ctrl.selectDockerHub()\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-database\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n DockerHub\\n </div>\\n <p>DockerHub authenticated account</p>\\n </label>\\n </div>\\n <div>\\n <input type=\\\"radio\\\" id=\\\"registry_aws_ecr\\\" ng-model=\\\"$ctrl.model.Type\\\" ng-value=\\\"$ctrl.RegistryTypes.ECR\\\" />\\n <label for=\\\"registry_aws_ecr\\\" ng-click=\\\"$ctrl.selectEcr()\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fab fa-aws\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n AWS ECR\\n </div>\\n <p>Amazon elastic container registry</p>\\n </label>\\n </div>\\n <div>\\n <input type=\\\"radio\\\" id=\\\"registry_quay\\\" ng-model=\\\"$ctrl.model.Type\\\" ng-value=\\\"$ctrl.RegistryTypes.QUAY\\\" />\\n <label for=\\\"registry_quay\\\" ng-click=\\\"$ctrl.selectQuayRegistry()\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-database\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Quay.io\\n </div>\\n <p>Quay container registry</p>\\n </label>\\n </div>\\n <div>\\n <input type=\\\"radio\\\" id=\\\"registry_proget\\\" ng-model=\\\"$ctrl.model.Type\\\" ng-value=\\\"$ctrl.RegistryTypes.PROGET\\\" />\\n <label for=\\\"registry_proget\\\" ng-click=\\\"$ctrl.selectProGetRegistry()\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-database\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n ProGet\\n </div>\\n <p>ProGet container registry</p>\\n </label>\\n </div>\\n <div>\\n <input type=\\\"radio\\\" id=\\\"registry_azure\\\" ng-model=\\\"$ctrl.model.Type\\\" ng-value=\\\"$ctrl.RegistryTypes.AZURE\\\" />\\n <label for=\\\"registry_azure\\\" ng-click=\\\"$ctrl.selectAzureRegistry()\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fab fa-microsoft\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Azure\\n </div>\\n <p>Azure container registry</p>\\n </label>\\n </div>\\n <div>\\n <input type=\\\"radio\\\" id=\\\"registry_gitlab\\\" ng-model=\\\"$ctrl.model.Type\\\" ng-value=\\\"$ctrl.RegistryTypes.GITLAB\\\" />\\n <label for=\\\"registry_gitlab\\\" ng-click=\\\"$ctrl.selectGitlabRegistry()\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fab fa-gitlab\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Gitlab\\n </div>\\n <p>Gitlab container registry</p>\\n </label>\\n </div>\\n <div>\\n <input type=\\\"radio\\\" id=\\\"registry_custom\\\" ng-model=\\\"$ctrl.model.Type\\\" ng-value=\\\"$ctrl.RegistryTypes.CUSTOM\\\" />\\n <label for=\\\"registry_custom\\\" ng-click=\\\"$ctrl.selectCustomRegistry()\\\">\\n <div class=\\\"boxselector_header\\\">\\n <i class=\\\"fa fa-database\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i>\\n Custom registry\\n </div>\\n <p>Define your own registry</p>\\n </label>\\n </div>\\n </div>\\n </div>\\n\\n <registry-form-quay\\n ng-if=\\\"$ctrl.model.Type === $ctrl.RegistryTypes.QUAY\\\"\\n model=\\\"$ctrl.model\\\"\\n form-action=\\\"$ctrl.createRegistry\\\"\\n form-action-label=\\\"Add registry\\\"\\n action-in-progress=\\\"$ctrl.state.actionInProgress\\\"\\n ></registry-form-quay>\\n\\n <registry-form-azure\\n ng-if=\\\"$ctrl.model.Type === $ctrl.RegistryTypes.AZURE\\\"\\n model=\\\"$ctrl.model\\\"\\n form-action=\\\"$ctrl.createRegistry\\\"\\n form-action-label=\\\"Add registry\\\"\\n action-in-progress=\\\"$ctrl.state.actionInProgress\\\"\\n ></registry-form-azure>\\n\\n <registry-form-custom\\n ng-if=\\\"$ctrl.model.Type === $ctrl.RegistryTypes.CUSTOM\\\"\\n model=\\\"$ctrl.model\\\"\\n form-action=\\\"$ctrl.createRegistry\\\"\\n form-action-label=\\\"Add registry\\\"\\n action-in-progress=\\\"$ctrl.state.actionInProgress\\\"\\n ></registry-form-custom>\\n\\n <registry-form-ecr\\n ng-if=\\\"$ctrl.model.Type === $ctrl.RegistryTypes.ECR\\\"\\n model=\\\"$ctrl.model\\\"\\n form-action=\\\"$ctrl.createRegistry\\\"\\n form-action-label=\\\"Add registry\\\"\\n action-in-progress=\\\"$ctrl.state.actionInProgress\\\"\\n ></registry-form-ecr>\\n\\n <registry-form-proget\\n ng-if=\\\"$ctrl.model.Type === $ctrl.RegistryTypes.PROGET\\\"\\n model=\\\"$ctrl.model\\\"\\n form-action=\\\"$ctrl.createRegistry\\\"\\n form-action-label=\\\"Add registry\\\"\\n action-in-progress=\\\"$ctrl.state.actionInProgress\\\"\\n ></registry-form-proget>\\n\\n <registry-form-gitlab\\n ng-if=\\\"$ctrl.model.Type === $ctrl.RegistryTypes.GITLAB\\\"\\n model=\\\"$ctrl.model\\\"\\n retrieve-registries=\\\"$ctrl.retrieveGitlabRegistries\\\"\\n create-registries=\\\"$ctrl.createGitlabRegistries\\\"\\n projects=\\\"$ctrl.gitlabProjects\\\"\\n state=\\\"$ctrl.state\\\"\\n action-in-progress=\\\"$ctrl.state.actionInProgress\\\"\\n reset-defaults=\\\"$ctrl.useDefaultGitlabConfiguration\\\"\\n ></registry-form-gitlab>\\n\\n <registry-form-dockerhub\\n ng-if=\\\"$ctrl.model.Type === $ctrl.RegistryTypes.DOCKERHUB\\\"\\n model=\\\"$ctrl.model\\\"\\n form-action=\\\"$ctrl.createRegistry\\\"\\n form-action-label=\\\"Add registry\\\"\\n action-in-progress=\\\"$ctrl.state.actionInProgress\\\"\\n ></registry-form-dockerhub>\\n </form>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import { RegistryTypes } from '@/portainer/models/registryTypes';\n\nangular.module('portainer.app').controller('RegistryController', [\n '$scope',\n '$state',\n 'RegistryService',\n 'Notifications',\n function ($scope, $state, RegistryService, Notifications) {\n $scope.state = {\n actionInProgress: false,\n };\n\n $scope.formValues = {\n Password: '',\n };\n\n $scope.RegistryTypes = RegistryTypes;\n\n $scope.updateRegistry = function () {\n var registry = $scope.registry;\n registry.Password = $scope.formValues.Password;\n $scope.state.actionInProgress = true;\n RegistryService.updateRegistry(registry)\n .then(function success() {\n Notifications.success('Registry successfully updated');\n $state.go('portainer.registries');\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to update registry');\n })\n .finally(function final() {\n $scope.state.actionInProgress = false;\n });\n };\n\n function initView() {\n var registryID = $state.params.id;\n RegistryService.registry(registryID)\n .then(function success(data) {\n $scope.registry = data;\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve registry details');\n });\n }\n\n initView();\n },\n]);\n","import _ from 'lodash-es';\nimport { RegistryTypes } from 'Portainer/models/registryTypes';\n\nangular.module('portainer.app').controller('RegistriesController', [\n '$q',\n '$scope',\n '$state',\n 'RegistryService',\n 'ModalService',\n 'Notifications',\n function ($q, $scope, $state, RegistryService, ModalService, Notifications) {\n $scope.state = {\n actionInProgress: false,\n };\n\n const nonBrowsableTypes = [RegistryTypes.ANONYMOUS, RegistryTypes.DOCKERHUB, RegistryTypes.QUAY];\n\n $scope.canBrowse = function (item) {\n return !_.includes(nonBrowsableTypes, item.Type);\n };\n\n $scope.removeAction = function (selectedItems) {\n const regAttrMsg = selectedItems.length > 1 ? 'hese' : 'his';\n const registriesMsg = selectedItems.length > 1 ? 'registries' : 'registry';\n const msg = `T${regAttrMsg} ${registriesMsg} might be used by applications inside one or more environments. Removing the ${registriesMsg} could lead to a service interruption for the applications using t${regAttrMsg} ${registriesMsg}. Do you want to remove the selected ${registriesMsg}?`;\n\n ModalService.confirmDeletion(msg, function onConfirm(confirmed) {\n if (!confirmed) {\n return;\n }\n deleteSelectedRegistries(selectedItems);\n });\n };\n\n function deleteSelectedRegistries(selectedItems) {\n var actionCount = selectedItems.length;\n angular.forEach(selectedItems, function (registry) {\n RegistryService.deleteRegistry(registry.Id)\n .then(function success() {\n Notifications.success('Registry successfully removed', registry.Name);\n var index = $scope.registries.indexOf(registry);\n $scope.registries.splice(index, 1);\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to remove registry');\n })\n .finally(function final() {\n --actionCount;\n if (actionCount === 0) {\n $state.reload();\n }\n });\n });\n }\n\n function initView() {\n $q.all({\n registries: RegistryService.registries(),\n })\n .then(function success(data) {\n $scope.registries = data.registries;\n })\n .catch(function error(err) {\n $scope.registries = [];\n Notifications.error('Failure', err, 'Unable to retrieve registries');\n });\n }\n\n initView();\n },\n]);\n","import angular from 'angular';\nimport _ from 'lodash-es';\n\nimport { HIDE_INTERNAL_AUTH } from '@/portainer/feature-flags/feature-ids';\nimport { buildLdapSettingsModel, buildAdSettingsModel } from '@/portainer/settings/authentication/ldap/ldap-settings.model';\n\nangular.module('portainer.app').controller('SettingsAuthenticationController', SettingsAuthenticationController);\n\nfunction SettingsAuthenticationController($q, $scope, $state, Notifications, SettingsService, FileUploadService, TeamService, LDAPService) {\n $scope.state = {\n uploadInProgress: false,\n actionInProgress: false,\n availableUserSessionTimeoutOptions: [\n {\n key: '1 hour',\n value: '1h',\n },\n {\n key: '4 hours',\n value: '4h',\n },\n {\n key: '8 hours',\n value: '8h',\n },\n {\n key: '24 hours',\n value: '24h',\n },\n { key: '1 week', value: `${24 * 7}h` },\n { key: '1 month', value: `${24 * 30}h` },\n { key: '6 months', value: `${24 * 30 * 6}h` },\n { key: '1 year', value: `${24 * 30 * 12}h` },\n ],\n };\n\n $scope.formValues = {\n UserSessionTimeout: $scope.state.availableUserSessionTimeoutOptions[0],\n TLSCACert: '',\n ldap: {\n serverType: 0,\n adSettings: buildAdSettingsModel(),\n ldapSettings: buildLdapSettingsModel(),\n },\n };\n\n $scope.authOptions = [\n { id: 'auth_internal', icon: 'fa fa-users', label: 'Internal', description: 'Internal authentication mechanism', value: 1 },\n { id: 'auth_ldap', icon: 'fa fa-users', label: 'LDAP', description: 'LDAP authentication', value: 2 },\n { id: 'auth_ad', icon: 'fab fa-microsoft', label: 'Microsoft Active Directory', description: 'AD authentication', value: 4, feature: HIDE_INTERNAL_AUTH },\n { id: 'auth_oauth', icon: 'fa fa-users', label: 'OAuth', description: 'OAuth authentication', value: 3 },\n ];\n\n $scope.onChangeAuthMethod = function onChangeAuthMethod(value) {\n if (value === 4) {\n $scope.settings.AuthenticationMethod = 2;\n $scope.formValues.ldap.serverType = 2;\n return;\n }\n\n if (value === 2) {\n $scope.settings.AuthenticationMethod = 2;\n $scope.formValues.ldap.serverType = $scope.formValues.ldap.ldapSettings.ServerType;\n return;\n }\n\n $scope.settings.AuthenticationMethod = value;\n };\n\n $scope.authenticationMethodSelected = function authenticationMethodSelected(value) {\n if (!$scope.settings) {\n return false;\n }\n\n if (value === 4) {\n return $scope.settings.AuthenticationMethod === 2 && $scope.formValues.ldap.serverType === 2;\n }\n\n if (value === 2) {\n return $scope.settings.AuthenticationMethod === 2 && $scope.formValues.ldap.serverType !== 2;\n }\n\n return $scope.settings.AuthenticationMethod === value;\n };\n\n $scope.isOauthEnabled = function isOauthEnabled() {\n return $scope.settings && $scope.settings.AuthenticationMethod === 3;\n };\n\n $scope.LDAPConnectivityCheck = LDAPConnectivityCheck;\n function LDAPConnectivityCheck() {\n const settings = angular.copy($scope.settings);\n\n const { settings: ldapSettings, uploadRequired, tlscaFile } = prepareLDAPSettings();\n settings.LDAPSettings = ldapSettings;\n $scope.state.uploadInProgress = uploadRequired;\n\n $scope.state.connectivityCheckInProgress = true;\n\n $q.when(!uploadRequired || FileUploadService.uploadLDAPTLSFiles(tlscaFile, null, null))\n .then(function success() {\n return LDAPService.check(settings.LDAPSettings);\n })\n .then(function success() {\n $scope.state.failedConnectivityCheck = false;\n $scope.state.successfulConnectivityCheck = true;\n Notifications.success('Connection to LDAP successful');\n })\n .catch(function error(err) {\n $scope.state.failedConnectivityCheck = true;\n $scope.state.successfulConnectivityCheck = false;\n Notifications.error('Failure', err, 'Connection to LDAP failed');\n })\n .finally(function final() {\n $scope.state.uploadInProgress = false;\n $scope.state.connectivityCheckInProgress = false;\n });\n }\n\n $scope.saveSettings = function () {\n const settings = angular.copy($scope.settings);\n\n const { settings: ldapSettings, uploadRequired, tlscaFile } = prepareLDAPSettings();\n settings.LDAPSettings = ldapSettings;\n $scope.state.uploadInProgress = uploadRequired;\n\n $scope.state.actionInProgress = true;\n\n $q.when(!uploadRequired || FileUploadService.uploadLDAPTLSFiles(tlscaFile, null, null))\n .then(function success() {\n return SettingsService.update(settings);\n })\n .then(function success() {\n Notifications.success('Authentication settings updated');\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to update authentication settings');\n })\n .finally(function final() {\n $scope.state.uploadInProgress = false;\n $scope.state.actionInProgress = false;\n });\n };\n\n function prepareLDAPSettings() {\n const tlscaCert = $scope.formValues.TLSCACert;\n\n const tlscaFile = tlscaCert !== $scope.settings.LDAPSettings.TLSConfig.TLSCACert ? tlscaCert : null;\n\n const isADServer = $scope.formValues.ldap.serverType === 2;\n\n const settings = isADServer ? $scope.formValues.ldap.adSettings : $scope.formValues.ldap.ldapSettings;\n\n if (settings.AnonymousMode && !isADServer) {\n settings.ReaderDN = '';\n settings.Password = '';\n }\n\n if (isADServer) {\n settings.AnonymousMode = false;\n }\n\n settings.URLs = settings.URLs.map((url) => {\n if (url.includes(':')) {\n return url;\n }\n return url + (settings.TLSConfig.TLS ? ':636' : ':389');\n });\n\n const uploadRequired = (settings.TLSConfig.TLS || settings.StartTLS) && !settings.TLSConfig.TLSSkipVerify;\n\n settings.URL = settings.URLs[0];\n\n return { settings, uploadRequired, tlscaFile };\n }\n\n $scope.isLDAPFormValid = isLDAPFormValid;\n function isLDAPFormValid() {\n const ldapSettings = $scope.formValues.ldap.serverType === 2 ? $scope.formValues.ldap.adSettings : $scope.formValues.ldap.ldapSettings;\n const isTLSMode = ldapSettings.TLSConfig.TLS || ldapSettings.StartTLS;\n\n return (\n _.compact(ldapSettings.URLs).length &&\n (ldapSettings.AnonymousMode || (ldapSettings.ReaderDN && ldapSettings.Password)) &&\n (!isTLSMode || $scope.formValues.TLSCACert || ldapSettings.TLSConfig.TLSSkipVerify) &&\n (!$scope.settings.LDAPSettings.AdminAutoPopulate || ($scope.settings.LDAPSettings.AdminAutoPopulate && $scope.formValues.selectedAdminGroups.length > 0))\n );\n }\n\n $scope.isOAuthTeamMembershipFormValid = isOAuthTeamMembershipFormValid;\n function isOAuthTeamMembershipFormValid() {\n if ($scope.settings && $scope.settings.OAuthSettings.OAuthAutoMapTeamMemberships && $scope.settings.OAuthSettings.TeamMemberships) {\n if (!$scope.settings.OAuthSettings.TeamMemberships.OAuthClaimName) {\n return false;\n }\n\n const hasInvalidMapping = $scope.settings.OAuthSettings.TeamMemberships.OAuthClaimMappings.some((m) => !(m.ClaimValRegex && m.Team));\n if (hasInvalidMapping) {\n return false;\n }\n }\n return true;\n }\n\n function initView() {\n $q.all({\n settings: SettingsService.settings(),\n teams: TeamService.teams(),\n })\n .then(function success(data) {\n var settings = data.settings;\n $scope.teams = data.teams;\n $scope.settings = settings;\n\n $scope.OAuthSettings = settings.OAuthSettings;\n $scope.authMethod = settings.AuthenticationMethod;\n if (settings.AuthenticationMethod === 2 && settings.LDAPSettings.ServerType === 2) {\n $scope.authMethod = 4;\n }\n\n $scope.formValues.ldap.serverType = settings.LDAPSettings.ServerType;\n if (settings.LDAPSettings.ServerType === 2) {\n $scope.formValues.ldap.adSettings = settings.LDAPSettings;\n } else {\n $scope.formValues.ldap.ldapSettings = Object.assign($scope.formValues.ldap.ldapSettings, settings.LDAPSettings);\n }\n\n if (settings.LDAPSettings.URL) {\n settings.LDAPSettings.URLs = [settings.LDAPSettings.URL];\n }\n if (!settings.LDAPSettings.URLs) {\n settings.LDAPSettings.URLs = [];\n }\n if (!settings.LDAPSettings.URLs.length) {\n settings.LDAPSettings.URLs.push('');\n }\n if (!settings.LDAPSettings.ServerType) {\n settings.LDAPSettings.ServerType = 0;\n }\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve application settings');\n });\n }\n\n initView();\n}\n","import angular from 'angular';\n\nimport { buildOption } from '@/portainer/components/box-selector';\nimport { S3_BACKUP_SETTING } from '@/portainer/feature-flags/feature-ids';\n\nangular.module('portainer.app').controller('SettingsController', [\n '$scope',\n '$state',\n 'Notifications',\n 'SettingsService',\n 'StateManager',\n 'BackupService',\n 'FileSaver',\n 'Blob',\n function ($scope, $state, Notifications, SettingsService, StateManager, BackupService, FileSaver) {\n $scope.s3BackupFeatureId = S3_BACKUP_SETTING;\n $scope.backupOptions = [\n buildOption('backup_file', 'fa fa-download', 'Download backup file', '', 'file'),\n buildOption('backup_s3', 'fa fa-upload', 'Store in S3', 'Define a cron schedule', 's3', S3_BACKUP_SETTING),\n ];\n\n $scope.state = {\n actionInProgress: false,\n availableEdgeAgentCheckinOptions: [\n {\n key: '5 seconds',\n value: 5,\n },\n {\n key: '10 seconds',\n value: 10,\n },\n {\n key: '30 seconds',\n value: 30,\n },\n ],\n availableKubeconfigExpiryOptions: [\n {\n key: '1 day',\n value: '24h',\n },\n {\n key: '7 days',\n value: `${24 * 7}h`,\n },\n {\n key: '30 days',\n value: `${24 * 30}h`,\n },\n {\n key: '1 year',\n value: `${24 * 30 * 12}h`,\n },\n {\n key: 'No expiry',\n value: '0',\n },\n ],\n backupInProgress: false,\n featureLimited: false,\n };\n\n $scope.BACKUP_FORM_TYPES = { S3: 's3', FILE: 'file' };\n\n $scope.formValues = {\n customLogo: false,\n labelName: '',\n labelValue: '',\n enableEdgeComputeFeatures: false,\n enableTelemetry: false,\n passwordProtect: false,\n password: '',\n backupFormType: $scope.BACKUP_FORM_TYPES.FILE,\n };\n\n $scope.onBackupOptionsChange = function (type, limited) {\n $scope.formValues.backupFormType = type;\n $scope.state.featureLimited = limited;\n };\n\n $scope.removeFilteredContainerLabel = function (index) {\n var settings = $scope.settings;\n settings.BlackListedLabels.splice(index, 1);\n\n updateSettings(settings);\n };\n\n $scope.addFilteredContainerLabel = function () {\n var settings = $scope.settings;\n var label = {\n name: $scope.formValues.labelName,\n value: $scope.formValues.labelValue,\n };\n settings.BlackListedLabels.push(label);\n\n updateSettings(settings);\n };\n\n $scope.downloadBackup = function () {\n const payload = {};\n if ($scope.formValues.passwordProtect) {\n payload.password = $scope.formValues.password;\n }\n\n $scope.state.backupInProgress = true;\n\n BackupService.downloadBackup(payload)\n .then(function success(data) {\n const downloadData = new Blob([data.file], { type: 'application/gzip' });\n FileSaver.saveAs(downloadData, data.name);\n Notifications.success('Backup successfully downloaded');\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to download backup');\n })\n .finally(function final() {\n $scope.state.backupInProgress = false;\n });\n };\n\n $scope.saveApplicationSettings = function () {\n var settings = $scope.settings;\n\n if (!$scope.formValues.customLogo) {\n settings.LogoURL = '';\n }\n\n settings.EnableEdgeComputeFeatures = $scope.formValues.enableEdgeComputeFeatures;\n settings.EnableTelemetry = $scope.formValues.enableTelemetry;\n\n $scope.state.actionInProgress = true;\n updateSettings(settings);\n };\n\n function updateSettings(settings) {\n SettingsService.update(settings)\n .then(function success() {\n Notifications.success('Settings updated');\n StateManager.updateLogo(settings.LogoURL);\n StateManager.updateSnapshotInterval(settings.SnapshotInterval);\n StateManager.updateEnableEdgeComputeFeatures(settings.EnableEdgeComputeFeatures);\n StateManager.updateEnableTelemetry(settings.EnableTelemetry);\n $state.reload();\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to update settings');\n })\n .finally(function final() {\n $scope.state.actionInProgress = false;\n });\n }\n\n function initView() {\n SettingsService.settings()\n .then(function success(data) {\n var settings = data;\n $scope.settings = settings;\n\n if (settings.LogoURL !== '') {\n $scope.formValues.customLogo = true;\n }\n $scope.formValues.enableEdgeComputeFeatures = settings.EnableEdgeComputeFeatures;\n $scope.formValues.enableTelemetry = settings.EnableTelemetry;\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve application settings');\n });\n }\n\n initView();\n },\n]);\n","angular.module('portainer.app').controller('SidebarController', SidebarController);\n\nfunction SidebarController($rootScope, $scope, $transitions, StateManager, Notifications, Authentication, UserService, EndpointProvider) {\n $scope.applicationState = StateManager.getState();\n $scope.endpointState = EndpointProvider.endpoint();\n\n function checkPermissions(memberships) {\n var isLeader = false;\n angular.forEach(memberships, function (membership) {\n if (membership.Role === 1) {\n isLeader = true;\n }\n });\n $scope.isTeamLeader = isLeader;\n }\n\n function isClusterAdmin() {\n return Authentication.isAdmin();\n }\n\n async function initView() {\n $scope.uiVersion = StateManager.getState().application.version;\n $scope.logo = StateManager.getState().application.logo;\n\n $scope.endpointId = EndpointProvider.endpointID();\n $scope.showStacks = shouldShowStacks();\n\n const userDetails = Authentication.getUserDetails();\n const isAdmin = isClusterAdmin();\n $scope.isAdmin = isAdmin;\n\n if (!isAdmin) {\n try {\n const memberships = await UserService.userMemberships(userDetails.ID);\n checkPermissions(memberships);\n } catch (err) {\n Notifications.error('Failure', err, 'Unable to retrieve user memberships');\n }\n }\n }\n\n initView();\n\n function shouldShowStacks() {\n if (isClusterAdmin()) {\n return true;\n }\n\n const endpoint = EndpointProvider.currentEndpoint();\n if (!endpoint || !endpoint.SecuritySettings) {\n return false;\n }\n\n return endpoint.SecuritySettings.allowStackManagementForRegularUsers;\n }\n\n $transitions.onEnter({}, async () => {\n $scope.endpointId = EndpointProvider.endpointID();\n $scope.showStacks = shouldShowStacks();\n $scope.isAdmin = isClusterAdmin();\n\n if ($scope.applicationState.endpoint.name) {\n document.title = `${$rootScope.defaultTitle} | ${$scope.applicationState.endpoint.name}`;\n }\n });\n}\n","import angular from 'angular';\nimport uuidv4 from 'uuid/v4';\n\nimport { AccessControlFormData } from '@/portainer/components/accessControlForm/porAccessControlFormModel';\nimport { STACK_NAME_VALIDATION_REGEX } from '@/constants';\nimport { RepositoryMechanismTypes } from '@/kubernetes/models/deploy';\n\nangular\n .module('portainer.app')\n .controller('CreateStackController', function (\n $scope,\n $state,\n $async,\n $window,\n ModalService,\n StackService,\n Authentication,\n Notifications,\n FormValidator,\n ResourceControlService,\n FormHelper,\n EndpointProvider,\n StackHelper,\n ContainerHelper,\n CustomTemplateService,\n ContainerService,\n WebhookHelper,\n clipboard\n ) {\n $scope.onChangeTemplateId = onChangeTemplateId;\n $scope.buildAnalyticsProperties = buildAnalyticsProperties;\n\n $scope.STACK_NAME_VALIDATION_REGEX = STACK_NAME_VALIDATION_REGEX;\n\n $scope.formValues = {\n Name: '',\n StackFileContent: '',\n StackFile: null,\n RepositoryURL: '',\n RepositoryReferenceName: '',\n RepositoryAuthentication: false,\n RepositoryUsername: '',\n RepositoryPassword: '',\n Env: [],\n AdditionalFiles: [],\n ComposeFilePathInRepository: 'docker-compose.yml',\n AccessControlData: new AccessControlFormData(),\n RepositoryAutomaticUpdates: true,\n RepositoryMechanism: RepositoryMechanismTypes.INTERVAL,\n RepositoryFetchInterval: '5m',\n RepositoryWebhookURL: WebhookHelper.returnStackWebhookUrl(uuidv4()),\n };\n\n $scope.state = {\n Method: 'editor',\n formValidationError: '',\n actionInProgress: false,\n StackType: null,\n editorYamlValidationError: '',\n uploadYamlValidationError: '',\n isEditorDirty: false,\n selectedTemplate: null,\n selectedTemplateId: null,\n };\n\n $window.onbeforeunload = () => {\n if ($scope.state.Method === 'editor' && $scope.formValues.StackFileContent && $scope.state.isEditorDirty) {\n return '';\n }\n };\n\n $scope.$on('$destroy', function () {\n $scope.state.isEditorDirty = false;\n });\n\n $scope.onChangeFormValues = onChangeFormValues;\n\n $scope.addAdditionalFiles = function () {\n $scope.formValues.AdditionalFiles.push('');\n };\n\n $scope.removeAdditionalFiles = function (index) {\n $scope.formValues.AdditionalFiles.splice(index, 1);\n };\n\n function buildAnalyticsProperties() {\n const metadata = { type: methodLabel($scope.state.Method) };\n\n if ($scope.state.Method === 'repository') {\n metadata.automaticUpdates = 'off';\n if ($scope.formValues.RepositoryAutomaticUpdates) {\n metadata.automaticUpdates = autoSyncLabel($scope.formValues.RepositoryMechanism);\n }\n metadata.auth = $scope.formValues.RepositoryAuthentication;\n }\n\n if ($scope.state.Method === 'template') {\n metadata.templateName = $scope.state.selectedTemplate.Title;\n }\n\n return { metadata };\n\n function methodLabel(method) {\n switch (method) {\n case 'editor':\n return 'web-editor';\n case 'repository':\n return 'git';\n case 'upload':\n return 'file-upload';\n case 'template':\n return 'custom-template';\n }\n }\n\n function autoSyncLabel(type) {\n switch (type) {\n case RepositoryMechanismTypes.INTERVAL:\n return 'polling';\n case RepositoryMechanismTypes.WEBHOOK:\n return 'webhook';\n }\n return 'off';\n }\n }\n\n function validateForm(accessControlData, isAdmin) {\n $scope.state.formValidationError = '';\n var error = '';\n error = FormValidator.validateAccessControl(accessControlData, isAdmin);\n\n if (error) {\n $scope.state.formValidationError = error;\n return false;\n }\n return true;\n }\n\n function createSwarmStack(name, method) {\n var env = FormHelper.removeInvalidEnvVars($scope.formValues.Env);\n const endpointId = +$state.params.endpointId;\n\n if (method === 'template' || method === 'editor') {\n var stackFileContent = $scope.formValues.StackFileContent;\n return StackService.createSwarmStackFromFileContent(name, stackFileContent, env, endpointId);\n }\n\n if (method === 'upload') {\n var stackFile = $scope.formValues.StackFile;\n return StackService.createSwarmStackFromFileUpload(name, stackFile, env, endpointId);\n }\n\n if (method === 'repository') {\n var repositoryOptions = {\n AdditionalFiles: $scope.formValues.AdditionalFiles,\n RepositoryURL: $scope.formValues.RepositoryURL,\n RepositoryReferenceName: $scope.formValues.RepositoryReferenceName,\n ComposeFilePathInRepository: $scope.formValues.ComposeFilePathInRepository,\n RepositoryAuthentication: $scope.formValues.RepositoryAuthentication,\n RepositoryUsername: $scope.formValues.RepositoryUsername,\n RepositoryPassword: $scope.formValues.RepositoryPassword,\n };\n\n getAutoUpdatesProperty(repositoryOptions);\n\n return StackService.createSwarmStackFromGitRepository(name, repositoryOptions, env, endpointId);\n }\n }\n\n function getAutoUpdatesProperty(repositoryOptions) {\n if ($scope.formValues.RepositoryAutomaticUpdates) {\n repositoryOptions.AutoUpdate = {};\n if ($scope.formValues.RepositoryMechanism === RepositoryMechanismTypes.INTERVAL) {\n repositoryOptions.AutoUpdate.Interval = $scope.formValues.RepositoryFetchInterval;\n } else if ($scope.formValues.RepositoryMechanism === RepositoryMechanismTypes.WEBHOOK) {\n repositoryOptions.AutoUpdate.Webhook = $scope.formValues.RepositoryWebhookURL.split('/').reverse()[0];\n }\n }\n }\n\n function createComposeStack(name, method) {\n var env = FormHelper.removeInvalidEnvVars($scope.formValues.Env);\n const endpointId = +$state.params.endpointId;\n\n if (method === 'editor' || method === 'template') {\n var stackFileContent = $scope.formValues.StackFileContent;\n return StackService.createComposeStackFromFileContent(name, stackFileContent, env, endpointId);\n } else if (method === 'upload') {\n var stackFile = $scope.formValues.StackFile;\n return StackService.createComposeStackFromFileUpload(name, stackFile, env, endpointId);\n } else if (method === 'repository') {\n var repositoryOptions = {\n AdditionalFiles: $scope.formValues.AdditionalFiles,\n RepositoryURL: $scope.formValues.RepositoryURL,\n RepositoryReferenceName: $scope.formValues.RepositoryReferenceName,\n ComposeFilePathInRepository: $scope.formValues.ComposeFilePathInRepository,\n RepositoryAuthentication: $scope.formValues.RepositoryAuthentication,\n RepositoryUsername: $scope.formValues.RepositoryUsername,\n RepositoryPassword: $scope.formValues.RepositoryPassword,\n };\n\n getAutoUpdatesProperty(repositoryOptions);\n\n return StackService.createComposeStackFromGitRepository(name, repositoryOptions, env, endpointId);\n }\n }\n\n $scope.copyWebhook = function () {\n clipboard.copyText($scope.formValues.RepositoryWebhookURL);\n $('#copyNotification').show();\n $('#copyNotification').fadeOut(2000);\n };\n\n $scope.handleEnvVarChange = handleEnvVarChange;\n function handleEnvVarChange(value) {\n $scope.formValues.Env = value;\n }\n\n $scope.deployStack = function () {\n var name = $scope.formValues.Name;\n var method = $scope.state.Method;\n\n var accessControlData = $scope.formValues.AccessControlData;\n var userDetails = Authentication.getUserDetails();\n var isAdmin = Authentication.isAdmin();\n\n if (method === 'editor' && $scope.formValues.StackFileContent === '') {\n $scope.state.formValidationError = 'Stack file content must not be empty';\n return;\n }\n\n if (!validateForm(accessControlData, isAdmin)) {\n return;\n }\n\n var type = $scope.state.StackType;\n var action = createSwarmStack;\n if (type === 2) {\n action = createComposeStack;\n }\n $scope.state.actionInProgress = true;\n action(name, method)\n .then(function success(data) {\n if (data.data) {\n data = data.data;\n }\n const userId = userDetails.ID;\n const resourceControl = data.ResourceControl;\n return ResourceControlService.applyResourceControl(userId, accessControlData, resourceControl);\n })\n .then(function success() {\n Notifications.success('Stack successfully deployed');\n $scope.state.isEditorDirty = false;\n $state.go('docker.stacks');\n })\n .catch(function error(err) {\n Notifications.error('Deployment error', err, 'Unable to deploy stack');\n })\n .finally(function final() {\n $scope.state.actionInProgress = false;\n });\n };\n\n $scope.onChangeFileContent = function onChangeFileContent(value) {\n $scope.formValues.StackFileContent = value;\n $scope.state.editorYamlValidationError = StackHelper.validateYAML($scope.formValues.StackFileContent, $scope.containerNames);\n $scope.state.isEditorDirty = true;\n };\n\n async function onFileLoadAsync(event) {\n $scope.state.uploadYamlValidationError = StackHelper.validateYAML(event.target.result, $scope.containerNames);\n }\n\n function onFileLoad(event) {\n return $async(onFileLoadAsync, event);\n }\n\n $scope.uploadFile = function (file) {\n $scope.formValues.StackFile = file;\n\n if (file) {\n const temporaryFileReader = new FileReader();\n temporaryFileReader.fileName = file.name;\n temporaryFileReader.onload = onFileLoad;\n temporaryFileReader.readAsText(file);\n }\n };\n\n function onChangeTemplateId(templateId, template) {\n return $async(async () => {\n try {\n $scope.state.selectedTemplateId = templateId;\n $scope.state.selectedTemplate = template;\n\n const fileContent = await CustomTemplateService.customTemplateFile(templateId);\n $scope.onChangeFileContent(fileContent);\n } catch (err) {\n this.Notifications.error('Failure', err, 'Unable to retrieve Custom Template file');\n }\n });\n }\n\n async function initView() {\n var endpointMode = $scope.applicationState.endpoint.mode;\n $scope.state.StackType = 2;\n if (endpointMode.provider === 'DOCKER_SWARM_MODE' && endpointMode.role === 'MANAGER') {\n $scope.state.StackType = 1;\n }\n\n try {\n const endpoint = EndpointProvider.currentEndpoint();\n $scope.composeSyntaxMaxVersion = endpoint.ComposeSyntaxMaxVersion;\n } catch (err) {\n Notifications.error('Failure', err, 'Unable to retrieve the ComposeSyntaxMaxVersion');\n }\n\n try {\n const containers = await ContainerService.containers(true);\n $scope.containerNames = ContainerHelper.getContainerNames(containers);\n } catch (err) {\n Notifications.error('Failure', err, 'Unable to retrieve Containers');\n }\n }\n\n this.uiCanExit = async function () {\n if ($scope.state.Method === 'editor' && $scope.formValues.StackFileContent && $scope.state.isEditorDirty) {\n return ModalService.confirmWebEditorDiscard();\n }\n };\n\n initView();\n\n function onChangeFormValues(newValues) {\n $scope.formValues = newValues;\n }\n });\n","import { AccessControlFormData } from 'Portainer/components/accessControlForm/porAccessControlFormModel';\n\nangular.module('portainer.app').controller('StackController', [\n '$async',\n '$q',\n '$scope',\n '$state',\n '$window',\n '$transition$',\n 'StackService',\n 'NodeService',\n 'ServiceService',\n 'TaskService',\n 'ContainerService',\n 'ServiceHelper',\n 'TaskHelper',\n 'Notifications',\n 'FormHelper',\n 'EndpointProvider',\n 'EndpointService',\n 'GroupService',\n 'ModalService',\n 'StackHelper',\n 'ResourceControlService',\n 'Authentication',\n 'ContainerHelper',\n function (\n $async,\n $q,\n $scope,\n $state,\n $window,\n $transition$,\n StackService,\n NodeService,\n ServiceService,\n TaskService,\n ContainerService,\n ServiceHelper,\n TaskHelper,\n Notifications,\n FormHelper,\n EndpointProvider,\n EndpointService,\n GroupService,\n ModalService,\n StackHelper,\n ResourceControlService,\n Authentication,\n ContainerHelper\n ) {\n $scope.state = {\n actionInProgress: false,\n migrationInProgress: false,\n showEditorTab: false,\n yamlError: false,\n isEditorDirty: false,\n };\n\n $scope.formValues = {\n Prune: false,\n Endpoint: null,\n AccessControlData: new AccessControlFormData(),\n Env: [],\n };\n\n $window.onbeforeunload = () => {\n if ($scope.stackFileContent && $scope.state.isEditorDirty) {\n return '';\n }\n };\n\n $scope.$on('$destroy', function () {\n $scope.state.isEditorDirty = false;\n });\n\n $scope.handleEnvVarChange = handleEnvVarChange;\n function handleEnvVarChange(value) {\n $scope.formValues.Env = value;\n }\n\n $scope.duplicateStack = function duplicateStack(name, endpointId) {\n var stack = $scope.stack;\n var env = FormHelper.removeInvalidEnvVars($scope.formValues.Env);\n EndpointProvider.setEndpointID(endpointId);\n\n return StackService.duplicateStack(name, $scope.stackFileContent, env, endpointId, stack.Type).then(onDuplicationSuccess).catch(notifyOnError);\n\n function onDuplicationSuccess() {\n Notifications.success('Stack successfully duplicated');\n $state.go('docker.stacks', {}, { reload: true });\n EndpointProvider.setEndpointID(stack.EndpointId);\n }\n\n function notifyOnError(err) {\n Notifications.error('Failure', err, 'Unable to duplicate stack');\n }\n };\n\n $scope.showEditor = function () {\n $scope.state.showEditorTab = true;\n };\n\n $scope.migrateStack = function (name, endpointId) {\n return $q(function (resolve) {\n ModalService.confirm({\n title: 'Are you sure?',\n message:\n 'This action will deploy a new instance of this stack on the target environment, please note that this does NOT relocate the content of any persistent volumes that may be attached to this stack.',\n buttons: {\n confirm: {\n label: 'Migrate',\n className: 'btn-danger',\n },\n },\n callback: function onConfirm(confirmed) {\n if (!confirmed) {\n return resolve();\n }\n return resolve(migrateStack(name, endpointId));\n },\n });\n });\n };\n\n $scope.removeStack = function () {\n ModalService.confirmDeletion('Do you want to remove the stack? Associated services will be removed as well.', function onConfirm(confirmed) {\n if (!confirmed) {\n return;\n }\n deleteStack();\n });\n };\n\n function migrateStack(name, endpointId) {\n var stack = $scope.stack;\n var targetEndpointId = endpointId;\n\n var migrateRequest = StackService.migrateSwarmStack;\n if (stack.Type === 2) {\n migrateRequest = StackService.migrateComposeStack;\n }\n\n // TODO: this is a work-around for stacks created with Portainer version >= 1.17.1\n // The EndpointID property is not available for these stacks, we can pass\n // the current endpoint identifier as a part of the migrate request. It will be used if\n // the EndpointID property is not defined on the stack.\n var originalEndpointId = EndpointProvider.endpointID();\n if (stack.EndpointId === 0) {\n stack.EndpointId = originalEndpointId;\n }\n\n $scope.state.migrationInProgress = true;\n return migrateRequest(stack, targetEndpointId, name)\n .then(function success() {\n Notifications.success('Stack successfully migrated', stack.Name);\n $state.go('docker.stacks', {}, { reload: true });\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to migrate stack');\n })\n .finally(function final() {\n $scope.state.migrationInProgress = false;\n });\n }\n\n function deleteStack() {\n var endpointId = +$state.params.endpointId;\n var stack = $scope.stack;\n\n StackService.remove(stack, $transition$.params().external, endpointId)\n .then(function success() {\n Notifications.success('Stack successfully removed', stack.Name);\n $state.go('docker.stacks');\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to remove stack ' + stack.Name);\n });\n }\n\n $scope.associateStack = function () {\n var endpointId = +$state.params.endpointId;\n var stack = $scope.stack;\n var accessControlData = $scope.formValues.AccessControlData;\n $scope.state.actionInProgress = true;\n\n StackService.associate(stack, endpointId, $scope.orphanedRunning)\n .then(function success(data) {\n const resourceControl = data.ResourceControl;\n const userDetails = Authentication.getUserDetails();\n const userId = userDetails.ID;\n return ResourceControlService.applyResourceControl(userId, accessControlData, resourceControl);\n })\n .then(function success() {\n Notifications.success('Stack successfully associated', stack.Name);\n $state.go('docker.stacks');\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to associate stack ' + stack.Name);\n })\n .finally(function final() {\n $scope.state.actionInProgress = false;\n });\n };\n\n $scope.deployStack = function () {\n var stackFile = $scope.stackFileContent;\n var env = FormHelper.removeInvalidEnvVars($scope.formValues.Env);\n var prune = $scope.formValues.Prune;\n var stack = $scope.stack;\n\n // TODO: this is a work-around for stacks created with Portainer version >= 1.17.1\n // The EndpointID property is not available for these stacks, we can pass\n // the current endpoint identifier as a part of the update request. It will be used if\n // the EndpointID property is not defined on the stack.\n var endpointId = EndpointProvider.endpointID();\n if (stack.EndpointId === 0) {\n stack.EndpointId = endpointId;\n }\n\n $scope.state.actionInProgress = true;\n StackService.updateStack(stack, stackFile, env, prune)\n .then(function success() {\n Notifications.success('Stack successfully deployed');\n $scope.state.isEditorDirty = false;\n $state.reload();\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to create stack');\n })\n .finally(function final() {\n $scope.state.actionInProgress = false;\n });\n };\n\n $scope.editorUpdate = function (cm) {\n if ($scope.stackFileContent.replace(/(\\r\\n|\\n|\\r)/gm, '') !== cm.getValue().replace(/(\\r\\n|\\n|\\r)/gm, '')) {\n $scope.state.isEditorDirty = true;\n $scope.stackFileContent = cm.getValue();\n $scope.state.yamlError = StackHelper.validateYAML($scope.stackFileContent, $scope.containerNames);\n }\n };\n\n $scope.stopStack = stopStack;\n function stopStack() {\n return $async(stopStackAsync);\n }\n async function stopStackAsync() {\n const confirmed = await ModalService.confirmAsync({\n title: 'Are you sure?',\n message: 'Are you sure you want to stop this stack?',\n buttons: { confirm: { label: 'Stop', className: 'btn-danger' } },\n });\n if (!confirmed) {\n return;\n }\n\n $scope.state.actionInProgress = true;\n try {\n await StackService.stop($scope.stack.Id);\n $state.reload();\n } catch (err) {\n Notifications.error('Failure', err, 'Unable to stop stack');\n }\n $scope.state.actionInProgress = false;\n }\n\n $scope.startStack = startStack;\n function startStack() {\n return $async(startStackAsync);\n }\n async function startStackAsync() {\n $scope.state.actionInProgress = true;\n const id = $scope.stack.Id;\n try {\n await StackService.start(id);\n $state.reload();\n } catch (err) {\n Notifications.error('Failure', err, 'Unable to start stack');\n }\n $scope.state.actionInProgress = false;\n }\n\n function loadStack(id) {\n var agentProxy = $scope.applicationState.endpoint.mode.agentProxy;\n\n EndpointService.endpoints()\n .then(function success(data) {\n $scope.endpoints = data.value;\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve environments');\n });\n\n $q.all({\n stack: StackService.stack(id),\n groups: GroupService.groups(),\n containers: ContainerService.containers(true),\n })\n .then(function success(data) {\n var stack = data.stack;\n $scope.groups = data.groups;\n $scope.stack = stack;\n $scope.containerNames = ContainerHelper.getContainerNames(data.containers);\n\n $scope.formValues.Env = $scope.stack.Env;\n\n let resourcesPromise = Promise.resolve({});\n if (!stack.Status || stack.Status === 1) {\n resourcesPromise = stack.Type === 1 ? retrieveSwarmStackResources(stack.Name, agentProxy) : retrieveComposeStackResources(stack.Name);\n }\n\n return $q.all({\n stackFile: StackService.getStackFile(id),\n resources: resourcesPromise,\n });\n })\n .then(function success(data) {\n const isSwarm = $scope.stack.Type === 1;\n $scope.stackFileContent = data.stackFile;\n // workaround for missing status, if stack has resources, set the status to 1 (active), otherwise to 2 (inactive) (https://github.com/portainer/portainer/issues/4422)\n if (!$scope.stack.Status) {\n $scope.stack.Status = data.resources && ((isSwarm && data.resources.services.length) || data.resources.containers.length) ? 1 : 2;\n }\n\n if ($scope.stack.Status === 1) {\n if (isSwarm) {\n assignSwarmStackResources(data.resources, agentProxy);\n } else {\n assignComposeStackResources(data.resources);\n }\n }\n\n $scope.state.yamlError = StackHelper.validateYAML($scope.stackFileContent, $scope.containerNames);\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve stack details');\n });\n }\n\n function retrieveSwarmStackResources(stackName, agentProxy) {\n var stackFilter = {\n label: ['com.docker.stack.namespace=' + stackName],\n };\n\n return $q.all({\n services: ServiceService.services(stackFilter),\n tasks: TaskService.tasks(stackFilter),\n containers: agentProxy ? ContainerService.containers(1) : [],\n nodes: NodeService.nodes(),\n });\n }\n\n function assignSwarmStackResources(resources, agentProxy) {\n var services = resources.services;\n var tasks = resources.tasks;\n\n if (agentProxy) {\n var containers = resources.containers;\n for (var j = 0; j < tasks.length; j++) {\n var task = tasks[j];\n TaskHelper.associateContainerToTask(task, containers);\n }\n }\n\n for (var i = 0; i < services.length; i++) {\n var service = services[i];\n ServiceHelper.associateTasksToService(service, tasks);\n }\n\n $scope.nodes = resources.nodes;\n $scope.tasks = tasks;\n $scope.services = services;\n }\n\n function retrieveComposeStackResources(stackName) {\n var stackFilter = {\n label: ['com.docker.compose.project=' + stackName],\n };\n\n return $q.all({\n containers: ContainerService.containers(1, stackFilter),\n });\n }\n\n function assignComposeStackResources(resources) {\n $scope.containers = resources.containers;\n }\n\n function loadExternalStack(name) {\n var stackType = $transition$.params().type;\n if (!stackType || (stackType !== '1' && stackType !== '2')) {\n Notifications.error('Failure', null, 'Invalid type URL parameter.');\n return;\n }\n\n if (stackType === '1') {\n loadExternalSwarmStack(name);\n } else {\n loadExternalComposeStack(name);\n }\n }\n\n function loadExternalSwarmStack(name) {\n var agentProxy = $scope.applicationState.endpoint.mode.agentProxy;\n\n retrieveSwarmStackResources(name, agentProxy)\n .then(function success(data) {\n assignSwarmStackResources(data, agentProxy);\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve stack details');\n });\n }\n\n function loadExternalComposeStack(name) {\n retrieveComposeStackResources(name)\n .then(function success(data) {\n assignComposeStackResources(data);\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve stack details');\n });\n }\n\n this.uiCanExit = async function () {\n if ($scope.stackFileContent && $scope.state.isEditorDirty) {\n return ModalService.confirmWebEditorDiscard();\n }\n };\n\n async function initView() {\n var stackName = $transition$.params().name;\n $scope.stackName = stackName;\n\n $scope.currentEndpointId = EndpointProvider.endpointID();\n\n const regular = $transition$.params().regular == 'true';\n $scope.regular = regular;\n\n var external = $transition$.params().external == 'true';\n $scope.external = external;\n\n const orphaned = $transition$.params().orphaned == 'true';\n $scope.orphaned = orphaned;\n\n const orphanedRunning = $transition$.params().orphanedRunning == 'true';\n $scope.orphanedRunning = orphanedRunning;\n\n if (external || (orphaned && orphanedRunning)) {\n loadExternalStack(stackName);\n }\n\n if (regular || orphaned) {\n const stackId = $transition$.params().id;\n loadStack(stackId);\n }\n\n try {\n const endpoint = EndpointProvider.currentEndpoint();\n $scope.composeSyntaxMaxVersion = endpoint.ComposeSyntaxMaxVersion;\n } catch (err) {\n Notifications.error('Failure', err, 'Unable to retrieve the ComposeSyntaxMaxVersion');\n }\n\n $scope.stackType = $transition$.params().type;\n }\n\n initView();\n },\n]);\n","angular.module('portainer.app').controller('StacksController', StacksController);\n\n/* @ngInject */\nfunction StacksController($scope, $state, Notifications, StackService, ModalService, EndpointProvider, Authentication, endpoint) {\n $scope.removeAction = function (selectedItems) {\n ModalService.confirmDeletion('Do you want to remove the selected stack(s)? Associated services will be removed as well.', function onConfirm(confirmed) {\n if (!confirmed) {\n return;\n }\n deleteSelectedStacks(selectedItems);\n });\n };\n\n function deleteSelectedStacks(stacks) {\n var endpointId = EndpointProvider.endpointID();\n var actionCount = stacks.length;\n angular.forEach(stacks, function (stack) {\n StackService.remove(stack, stack.External, endpointId)\n .then(function success() {\n Notifications.success('Stack successfully removed', stack.Name);\n var index = $scope.stacks.indexOf(stack);\n $scope.stacks.splice(index, 1);\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to remove stack ' + stack.Name);\n })\n .finally(function final() {\n --actionCount;\n if (actionCount === 0) {\n $state.reload();\n }\n });\n });\n }\n\n $scope.offlineMode = false;\n $scope.createEnabled = false;\n\n $scope.getStacks = getStacks;\n\n function getStacks() {\n var endpointMode = $scope.applicationState.endpoint.mode;\n var endpointId = EndpointProvider.endpointID();\n\n const includeOrphanedStacks = Authentication.isAdmin();\n StackService.stacks(true, endpointMode.provider === 'DOCKER_SWARM_MODE' && endpointMode.role === 'MANAGER', endpointId, includeOrphanedStacks)\n .then(function success(data) {\n var stacks = data;\n $scope.stacks = stacks;\n $scope.offlineMode = EndpointProvider.offlineMode();\n })\n .catch(function error(err) {\n $scope.stacks = [];\n Notifications.error('Failure', err, 'Unable to retrieve stacks');\n });\n }\n\n async function loadCreateEnabled() {\n return endpoint.SecuritySettings.allowStackManagementForRegularUsers || Authentication.isAdmin();\n }\n\n async function initView() {\n getStacks();\n $scope.createEnabled = await loadCreateEnabled();\n }\n\n initView();\n}\n","import angular from 'angular';\nimport _ from 'lodash-es';\n\nangular.module('portainer.app').controller('TagsController', TagsController);\n\nfunction TagsController($scope, $state, $async, TagService, Notifications) {\n $scope.state = {\n actionInProgress: false,\n };\n\n $scope.formValues = {\n Name: '',\n };\n\n $scope.checkNameValidity = function (form) {\n var valid = true;\n for (var i = 0; i < $scope.tags.length; i++) {\n if ($scope.formValues.Name === $scope.tags[i].Name) {\n valid = false;\n break;\n }\n }\n form.name.$setValidity('validName', valid);\n };\n\n $scope.removeAction = removeAction;\n\n function removeAction(tags) {\n return $async(removeActionAsync, tags);\n }\n\n async function removeActionAsync(tags) {\n for (let tag of tags) {\n try {\n await TagService.deleteTag(tag.Id);\n\n Notifications.success('Tag successfully removed', tag.Name);\n _.remove($scope.tags, tag);\n } catch (err) {\n Notifications.error('Failure', err, 'Unable to remove tag');\n }\n }\n\n $state.reload();\n }\n\n $scope.createTag = function () {\n var tagName = $scope.formValues.Name;\n TagService.createTag(tagName)\n .then(function success() {\n Notifications.success('Tag successfully created', tagName);\n $state.reload();\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to create tag');\n });\n };\n\n function initView() {\n TagService.tags()\n .then(function success(data) {\n $scope.tags = data;\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve tags');\n $scope.tags = [];\n });\n }\n\n initView();\n}\n","angular.module('portainer.app').controller('TeamController', [\n '$q',\n '$scope',\n '$state',\n '$transition$',\n 'TeamService',\n 'UserService',\n 'TeamMembershipService',\n 'ModalService',\n 'Notifications',\n 'PaginationService',\n 'Authentication',\n function ($q, $scope, $state, $transition$, TeamService, UserService, TeamMembershipService, ModalService, Notifications, PaginationService, Authentication) {\n $scope.state = {\n pagination_count_users: PaginationService.getPaginationLimit('team_available_users'),\n pagination_count_members: PaginationService.getPaginationLimit('team_members'),\n };\n\n $scope.sortTypeUsers = 'Username';\n $scope.sortReverseUsers = true;\n $scope.users = [];\n $scope.teamMembers = [];\n $scope.leaderCount = 0;\n\n $scope.orderUsers = function (sortType) {\n $scope.sortReverseUsers = $scope.sortTypeUsers === sortType ? !$scope.sortReverseUsers : false;\n $scope.sortTypeUsers = sortType;\n };\n\n $scope.changePaginationCountUsers = function () {\n PaginationService.setPaginationLimit('team_available_users', $scope.state.pagination_count_users);\n };\n\n $scope.sortTypeGroupMembers = 'TeamRole';\n $scope.sortReverseGroupMembers = false;\n\n $scope.orderGroupMembers = function (sortType) {\n $scope.sortReverseGroupMembers = $scope.sortTypeGroupMembers === sortType ? !$scope.sortReverseGroupMembers : false;\n $scope.sortTypeGroupMembers = sortType;\n };\n\n $scope.changePaginationCountGroupMembers = function () {\n PaginationService.setPaginationLimit('team_members', $scope.state.pagination_count_members);\n };\n\n $scope.deleteTeam = function () {\n ModalService.confirmDeletion('Do you want to delete this team? Users in this team will not be deleted.', function onConfirm(confirmed) {\n if (!confirmed) {\n return;\n }\n deleteTeam();\n });\n };\n\n $scope.promoteToLeader = function (user) {\n TeamMembershipService.updateMembership(user.MembershipId, user.Id, $scope.team.Id, 1)\n .then(function success() {\n $scope.leaderCount++;\n user.TeamRole = 'Leader';\n Notifications.success('User is now team leader', user.Username);\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to update user role');\n });\n };\n\n $scope.demoteToMember = function (user) {\n TeamMembershipService.updateMembership(user.MembershipId, user.Id, $scope.team.Id, 2)\n .then(function success() {\n user.TeamRole = 'Member';\n $scope.leaderCount--;\n Notifications.success('User is now team member', user.Username);\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to update user role');\n });\n };\n\n $scope.addAllUsers = function () {\n var teamMembershipQueries = [];\n angular.forEach($scope.users, function (user) {\n teamMembershipQueries.push(TeamMembershipService.createMembership(user.Id, $scope.team.Id, 2));\n });\n $q.all(teamMembershipQueries)\n .then(function success(data) {\n var users = $scope.users;\n for (var i = 0; i < users.length; i++) {\n var user = users[i];\n user.MembershipId = data[i].Id;\n user.TeamRole = 'Member';\n }\n $scope.teamMembers = $scope.teamMembers.concat(users);\n $scope.users = [];\n Notifications.success('All users successfully added');\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to update team members');\n });\n };\n\n $scope.addUser = function (user) {\n TeamMembershipService.createMembership(user.Id, $scope.team.Id, 2)\n .then(function success(data) {\n removeUserFromArray(user.Id, $scope.users);\n user.TeamRole = 'Member';\n user.MembershipId = data.Id;\n $scope.teamMembers.push(user);\n Notifications.success('User added to team', user.Username);\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to update team members');\n });\n };\n\n $scope.removeAllUsers = function () {\n var teamMembershipQueries = [];\n angular.forEach($scope.teamMembers, function (user) {\n teamMembershipQueries.push(TeamMembershipService.deleteMembership(user.MembershipId));\n });\n $q.all(teamMembershipQueries)\n .then(function success() {\n $scope.users = $scope.users.concat($scope.teamMembers);\n $scope.teamMembers = [];\n $scope.leaderCount = 0;\n Notifications.success('All users successfully removed');\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to update team members');\n });\n };\n\n $scope.removeUser = function (user) {\n TeamMembershipService.deleteMembership(user.MembershipId)\n .then(function success() {\n removeUserFromArray(user.Id, $scope.teamMembers);\n if (user.TeamRole === 'Leader') {\n $scope.leaderCount--;\n }\n $scope.users.push(user);\n Notifications.success('User removed from team', user.Username);\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to update team members');\n });\n };\n\n function deleteTeam() {\n TeamService.deleteTeam($scope.team.Id)\n .then(function success() {\n Notifications.success('Team successfully deleted', $scope.team.Name);\n $state.go('portainer.teams');\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to remove team');\n });\n }\n\n function removeUserFromArray(id, users) {\n for (var i = 0, l = users.length; i < l; i++) {\n if (users[i].Id === id) {\n users.splice(i, 1);\n return;\n }\n }\n }\n\n function assignUsersAndMembers(users, memberships) {\n for (var i = 0; i < users.length; i++) {\n var user = users[i];\n var member = false;\n for (var j = 0; j < memberships.length; j++) {\n var membership = memberships[j];\n if (user.Id === membership.UserId) {\n member = true;\n if (membership.Role === 1) {\n user.TeamRole = 'Leader';\n $scope.leaderCount++;\n } else {\n user.TeamRole = 'Member';\n }\n user.MembershipId = membership.Id;\n $scope.teamMembers.push(user);\n break;\n }\n }\n if (!member) {\n $scope.users.push(user);\n }\n }\n }\n\n function initView() {\n $scope.isAdmin = Authentication.isAdmin();\n $q.all({\n team: TeamService.team($transition$.params().id),\n users: UserService.users(false),\n memberships: TeamService.userMemberships($transition$.params().id),\n })\n .then(function success(data) {\n var users = data.users;\n $scope.team = data.team;\n assignUsersAndMembers(users, data.memberships);\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve team details');\n });\n }\n\n initView();\n },\n]);\n","import _ from 'lodash-es';\n\nangular.module('portainer.app').controller('TeamsController', [\n '$q',\n '$scope',\n '$state',\n 'TeamService',\n 'UserService',\n 'ModalService',\n 'Notifications',\n 'Authentication',\n function ($q, $scope, $state, TeamService, UserService, ModalService, Notifications, Authentication) {\n $scope.state = {\n actionInProgress: false,\n };\n\n $scope.formValues = {\n Name: '',\n Leaders: [],\n };\n\n $scope.checkNameValidity = function (form) {\n var valid = true;\n for (var i = 0; i < $scope.teams.length; i++) {\n if ($scope.formValues.Name === $scope.teams[i].Name) {\n valid = false;\n break;\n }\n }\n form.team_name.$setValidity('validName', valid);\n };\n\n $scope.addTeam = function () {\n var teamName = $scope.formValues.Name;\n var leaderIds = [];\n angular.forEach($scope.formValues.Leaders, function (user) {\n leaderIds.push(user.Id);\n });\n\n $scope.state.actionInProgress = true;\n TeamService.createTeam(teamName, leaderIds)\n .then(function success() {\n Notifications.success('Team successfully created', teamName);\n $state.reload();\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to create team');\n })\n .finally(function final() {\n $scope.state.actionInProgress = false;\n });\n };\n\n $scope.removeAction = function (selectedItems) {\n ModalService.confirmDeletion('Do you want to delete the selected team(s)? Users in the team(s) will not be deleted.', function onConfirm(confirmed) {\n if (!confirmed) {\n return;\n }\n deleteSelectedTeams(selectedItems);\n });\n };\n\n function deleteSelectedTeams(selectedItems) {\n var actionCount = selectedItems.length;\n angular.forEach(selectedItems, function (team) {\n TeamService.deleteTeam(team.Id)\n .then(function success() {\n Notifications.success('Team successfully removed', team.Name);\n var index = $scope.teams.indexOf(team);\n $scope.teams.splice(index, 1);\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to remove team');\n })\n .finally(function final() {\n --actionCount;\n if (actionCount === 0) {\n $state.reload();\n }\n });\n });\n }\n\n function initView() {\n var userDetails = Authentication.getUserDetails();\n var isAdmin = Authentication.isAdmin();\n $scope.isAdmin = isAdmin;\n $q.all({\n users: UserService.users(false),\n teams: isAdmin ? TeamService.teams() : UserService.userLeadingTeams(userDetails.ID),\n })\n .then(function success(data) {\n var teams = data.teams;\n $scope.teams = teams;\n $scope.users = _.orderBy(data.users, 'Username', 'asc');\n })\n .catch(function error(err) {\n $scope.teams = [];\n $scope.users = [];\n Notifications.error('Failure', err, 'Unable to retrieve teams');\n });\n }\n\n initView();\n },\n]);\n","import _ from 'lodash-es';\nimport { AccessControlFormData } from '../../components/accessControlForm/porAccessControlFormModel';\n\nangular.module('portainer.app').controller('TemplatesController', [\n '$scope',\n '$q',\n '$state',\n '$anchorScroll',\n 'ContainerService',\n 'ImageService',\n 'NetworkService',\n 'TemplateService',\n 'TemplateHelper',\n 'VolumeService',\n 'Notifications',\n 'ResourceControlService',\n 'Authentication',\n 'FormValidator',\n 'StackService',\n 'endpoint',\n function (\n $scope,\n $q,\n $state,\n $anchorScroll,\n ContainerService,\n ImageService,\n NetworkService,\n TemplateService,\n TemplateHelper,\n VolumeService,\n Notifications,\n ResourceControlService,\n Authentication,\n FormValidator,\n StackService,\n endpoint\n ) {\n const DOCKER_STANDALONE = 'DOCKER_STANDALONE';\n const DOCKER_SWARM_MODE = 'DOCKER_SWARM_MODE';\n\n $scope.state = {\n selectedTemplate: null,\n showAdvancedOptions: false,\n formValidationError: '',\n actionInProgress: false,\n };\n\n $scope.formValues = {\n network: '',\n name: '',\n AccessControlData: new AccessControlFormData(),\n };\n\n $scope.addVolume = function () {\n $scope.state.selectedTemplate.Volumes.push({ containerPath: '', bind: '', readonly: false, type: 'auto' });\n };\n\n $scope.removeVolume = function (index) {\n $scope.state.selectedTemplate.Volumes.splice(index, 1);\n };\n\n $scope.addPortBinding = function () {\n $scope.state.selectedTemplate.Ports.push({ hostPort: '', containerPort: '', protocol: 'tcp' });\n };\n\n $scope.removePortBinding = function (index) {\n $scope.state.selectedTemplate.Ports.splice(index, 1);\n };\n\n $scope.addExtraHost = function () {\n $scope.state.selectedTemplate.Hosts.push('');\n };\n\n $scope.removeExtraHost = function (index) {\n $scope.state.selectedTemplate.Hosts.splice(index, 1);\n };\n\n $scope.addLabel = function () {\n $scope.state.selectedTemplate.Labels.push({ name: '', value: '' });\n };\n\n $scope.removeLabel = function (index) {\n $scope.state.selectedTemplate.Labels.splice(index, 1);\n };\n\n function validateForm(accessControlData, isAdmin) {\n $scope.state.formValidationError = '';\n var error = '';\n error = FormValidator.validateAccessControl(accessControlData, isAdmin);\n\n if (error) {\n $scope.state.formValidationError = error;\n return false;\n }\n return true;\n }\n\n function createContainerFromTemplate(template, userId, accessControlData) {\n var templateConfiguration = createTemplateConfiguration(template);\n var generatedVolumeCount = TemplateHelper.determineRequiredGeneratedVolumeCount(template.Volumes);\n var generatedVolumeIds = [];\n VolumeService.createXAutoGeneratedLocalVolumes(generatedVolumeCount)\n .then(function success(data) {\n angular.forEach(data, function (volume) {\n var volumeId = volume.Id;\n generatedVolumeIds.push(volumeId);\n });\n TemplateService.updateContainerConfigurationWithVolumes(templateConfiguration, template, data);\n return ImageService.pullImage(template.RegistryModel, true);\n })\n .then(function success() {\n return ContainerService.createAndStartContainer(templateConfiguration);\n })\n .then(function success(data) {\n const resourceControl = data.Portainer.ResourceControl;\n return ResourceControlService.applyResourceControl(userId, accessControlData, resourceControl, generatedVolumeIds);\n })\n .then(function success() {\n Notifications.success('Container successfully created');\n $state.go('docker.containers', {}, { reload: true });\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, err.msg);\n })\n .finally(function final() {\n $scope.state.actionInProgress = false;\n });\n }\n\n function createComposeStackFromTemplate(template, userId, accessControlData) {\n var stackName = $scope.formValues.name;\n\n for (var i = 0; i < template.Env.length; i++) {\n var envvar = template.Env[i];\n if (envvar.preset) {\n envvar.value = envvar.default;\n }\n }\n\n var repositoryOptions = {\n RepositoryURL: template.Repository.url,\n ComposeFilePathInRepository: template.Repository.stackfile,\n };\n\n const endpointId = +$state.params.endpointId;\n StackService.createComposeStackFromGitRepository(stackName, repositoryOptions, template.Env, endpointId)\n .then(function success(data) {\n const resourceControl = data.ResourceControl;\n return ResourceControlService.applyResourceControl(userId, accessControlData, resourceControl);\n })\n .then(function success() {\n Notifications.success('Stack successfully deployed');\n $state.go('docker.stacks');\n })\n .catch(function error(err) {\n Notifications.error('Deployment error', err);\n })\n .finally(function final() {\n $scope.state.actionInProgress = false;\n });\n }\n\n function createStackFromTemplate(template, userId, accessControlData) {\n var stackName = $scope.formValues.name;\n var env = _.filter(\n _.map(template.Env, function transformEnvVar(envvar) {\n return {\n name: envvar.name,\n value: envvar.preset || !envvar.value ? envvar.default : envvar.value,\n };\n }),\n function removeUndefinedVars(envvar) {\n return envvar.value && envvar.name;\n }\n );\n\n var repositoryOptions = {\n RepositoryURL: template.Repository.url,\n ComposeFilePathInRepository: template.Repository.stackfile,\n };\n\n const endpointId = +$state.params.endpointId;\n\n StackService.createSwarmStackFromGitRepository(stackName, repositoryOptions, env, endpointId)\n .then(function success(data) {\n const resourceControl = data.ResourceControl;\n return ResourceControlService.applyResourceControl(userId, accessControlData, resourceControl);\n })\n .then(function success() {\n Notifications.success('Stack successfully deployed');\n $state.go('docker.stacks');\n })\n .catch(function error(err) {\n Notifications.error('Deployment error', err);\n })\n .finally(function final() {\n $scope.state.actionInProgress = false;\n });\n }\n\n $scope.createTemplate = function () {\n var userDetails = Authentication.getUserDetails();\n var userId = userDetails.ID;\n var accessControlData = $scope.formValues.AccessControlData;\n\n if (!validateForm(accessControlData, $scope.isAdmin)) {\n return;\n }\n\n var template = $scope.state.selectedTemplate;\n\n $scope.state.actionInProgress = true;\n if (template.Type === 2) {\n createStackFromTemplate(template, userId, accessControlData);\n } else if (template.Type === 3) {\n createComposeStackFromTemplate(template, userId, accessControlData);\n } else {\n createContainerFromTemplate(template, userId, accessControlData);\n }\n };\n\n $scope.unselectTemplate = function (template) {\n template.Selected = false;\n $scope.state.selectedTemplate = null;\n };\n\n $scope.selectTemplate = function (template) {\n if ($scope.state.selectedTemplate) {\n $scope.unselectTemplate($scope.state.selectedTemplate);\n }\n\n template.Selected = true;\n if (template.Network) {\n $scope.formValues.network = _.find($scope.availableNetworks, function (o) {\n return o.Name === template.Network;\n });\n } else {\n $scope.formValues.network = _.find($scope.availableNetworks, function (o) {\n return o.Name === 'bridge';\n });\n }\n\n $scope.formValues.name = template.Name ? template.Name : '';\n $scope.state.selectedTemplate = template;\n $scope.state.deployable = isDeployable($scope.applicationState.endpoint, template.Type);\n $anchorScroll('view-top');\n };\n\n function isDeployable(endpoint, templateType) {\n let deployable = false;\n switch (templateType) {\n case 1:\n deployable = endpoint.mode.provider === DOCKER_SWARM_MODE || endpoint.mode.provider === DOCKER_STANDALONE;\n break;\n case 2:\n deployable = endpoint.mode.provider === DOCKER_SWARM_MODE;\n break;\n case 3:\n deployable = endpoint.mode.provider === DOCKER_STANDALONE;\n break;\n }\n return deployable;\n }\n\n function createTemplateConfiguration(template) {\n var network = $scope.formValues.network;\n var name = $scope.formValues.name;\n return TemplateService.createTemplateConfiguration(template, name, network);\n }\n\n function initView() {\n $scope.isAdmin = Authentication.isAdmin();\n\n var endpointMode = $scope.applicationState.endpoint.mode;\n var apiVersion = $scope.applicationState.endpoint.apiVersion;\n\n $q.all({\n templates: TemplateService.templates(),\n volumes: VolumeService.getVolumes(),\n networks: NetworkService.networks(\n endpointMode.provider === 'DOCKER_STANDALONE' || endpointMode.provider === 'DOCKER_SWARM_MODE',\n false,\n endpointMode.provider === 'DOCKER_SWARM_MODE' && apiVersion >= 1.25\n ),\n })\n .then(function success(data) {\n var templates = data.templates;\n $scope.templates = templates;\n $scope.availableVolumes = _.orderBy(data.volumes.Volumes, [(volume) => volume.Name.toLowerCase()], ['asc']);\n var networks = data.networks;\n $scope.availableNetworks = networks;\n $scope.allowBindMounts = endpoint.SecuritySettings.allowBindMountsForRegularUsers;\n })\n .catch(function error(err) {\n $scope.templates = [];\n Notifications.error('Failure', err, 'An error occured during apps initialization.');\n });\n }\n\n initView();\n },\n]);\n","angular.module('portainer.app').controller('UserController', [\n '$q',\n '$scope',\n '$state',\n '$transition$',\n 'UserService',\n 'ModalService',\n 'Notifications',\n 'SettingsService',\n 'Authentication',\n function ($q, $scope, $state, $transition$, UserService, ModalService, Notifications, SettingsService, Authentication) {\n $scope.state = {\n updatePasswordError: '',\n };\n\n $scope.formValues = {\n username: '',\n newPassword: '',\n confirmPassword: '',\n Administrator: false,\n };\n\n $scope.deleteUser = function () {\n ModalService.confirmDeletion('Do you want to remove this user? This user will not be able to login into Portainer anymore.', function onConfirm(confirmed) {\n if (!confirmed) {\n return;\n }\n deleteUser();\n });\n };\n\n $scope.updateUser = async function () {\n const role = $scope.formValues.Administrator ? 1 : 2;\n const oldUsername = $scope.user.Username;\n const username = $scope.formValues.username;\n let promise = Promise.resolve(true);\n if (username != oldUsername) {\n promise = new Promise((resolve) =>\n ModalService.confirm({\n title: 'Are you sure?',\n message: `Are you sure you want to rename the user ${oldUsername} to ${username}?`,\n buttons: {\n confirm: {\n label: 'Update',\n className: 'btn-primary',\n },\n },\n callback: resolve,\n })\n );\n }\n const confirmed = await promise;\n if (!confirmed) {\n return;\n }\n UserService.updateUser($scope.user.Id, { role, username })\n .then(function success() {\n Notifications.success('User successfully updated');\n $state.reload();\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to update user permissions');\n });\n };\n\n $scope.updatePassword = function () {\n UserService.updateUser($scope.user.Id, { password: $scope.formValues.newPassword })\n .then(function success() {\n Notifications.success('Password successfully updated');\n $state.reload();\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to update user password');\n });\n };\n\n function deleteUser() {\n UserService.deleteUser($scope.user.Id)\n .then(function success() {\n Notifications.success('User successfully deleted', $scope.user.Username);\n $state.go('portainer.users');\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to remove user');\n });\n }\n\n $scope.isSubmitEnabled = isSubmitEnabled;\n function isSubmitEnabled() {\n const { user, formValues } = $scope;\n return user && (user.Username !== formValues.username || (formValues.Administrator && user.Role !== 1) || (!formValues.Administrator && user.Role === 1));\n }\n\n $scope.isDeleteDisabled = isDeleteDisabled;\n function isDeleteDisabled() {\n const { user } = $scope;\n return user && user.Id === 1;\n }\n\n function initView() {\n $scope.isAdmin = Authentication.isAdmin();\n\n $q.all({\n user: UserService.user($transition$.params().id),\n settings: SettingsService.publicSettings(),\n })\n .then(function success(data) {\n var user = data.user;\n $scope.user = user;\n $scope.formValues.Administrator = user.Role === 1;\n $scope.formValues.username = user.Username;\n $scope.AuthenticationMethod = data.settings.AuthenticationMethod;\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve user information');\n });\n }\n\n initView();\n },\n]);\n","import _ from 'lodash-es';\n\nangular.module('portainer.app').controller('UsersController', [\n '$q',\n '$scope',\n '$state',\n 'UserService',\n 'TeamService',\n 'TeamMembershipService',\n 'ModalService',\n 'Notifications',\n 'Authentication',\n 'SettingsService',\n function ($q, $scope, $state, UserService, TeamService, TeamMembershipService, ModalService, Notifications, Authentication, SettingsService) {\n $scope.state = {\n userCreationError: '',\n validUsername: false,\n actionInProgress: false,\n };\n\n $scope.formValues = {\n Username: '',\n Password: '',\n ConfirmPassword: '',\n Administrator: false,\n Teams: [],\n };\n\n $scope.checkUsernameValidity = function () {\n var valid = true;\n for (var i = 0; i < $scope.users.length; i++) {\n if ($scope.formValues.Username.toLocaleLowerCase() === $scope.users[i].Username.toLocaleLowerCase()) {\n valid = false;\n break;\n }\n }\n $scope.state.validUsername = valid;\n $scope.state.userCreationError = valid ? '' : 'Username already taken';\n };\n\n $scope.addUser = function () {\n $scope.state.actionInProgress = true;\n $scope.state.userCreationError = '';\n var username = $scope.formValues.Username;\n var password = $scope.formValues.Password;\n var role = $scope.formValues.Administrator ? 1 : 2;\n var teamIds = [];\n angular.forEach($scope.formValues.Teams, function (team) {\n teamIds.push(team.Id);\n });\n UserService.createUser(username, password, role, teamIds)\n .then(function success() {\n Notifications.success('User successfully created', username);\n $state.reload();\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to create user');\n })\n .finally(function final() {\n $scope.state.actionInProgress = false;\n });\n };\n\n function deleteSelectedUsers(selectedItems) {\n var actionCount = selectedItems.length;\n angular.forEach(selectedItems, function (user) {\n UserService.deleteUser(user.Id)\n .then(function success() {\n Notifications.success('User successfully removed', user.Username);\n var index = $scope.users.indexOf(user);\n $scope.users.splice(index, 1);\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to remove user');\n })\n .finally(function final() {\n --actionCount;\n if (actionCount === 0) {\n $state.reload();\n }\n });\n });\n }\n\n $scope.removeAction = function (selectedItems) {\n ModalService.confirmDeletion('Do you want to remove the selected users? They will not be able to login into Portainer anymore.', function onConfirm(confirmed) {\n if (!confirmed) {\n return;\n }\n deleteSelectedUsers(selectedItems);\n });\n };\n\n function assignTeamLeaders(users, memberships) {\n for (var i = 0; i < users.length; i++) {\n var user = users[i];\n user.isTeamLeader = false;\n for (var j = 0; j < memberships.length; j++) {\n var membership = memberships[j];\n if (user.Id === membership.UserId && membership.Role === 1) {\n user.isTeamLeader = true;\n user.RoleName = 'team leader';\n break;\n }\n }\n }\n }\n\n function initView() {\n var userDetails = Authentication.getUserDetails();\n var isAdmin = Authentication.isAdmin();\n $scope.isAdmin = isAdmin;\n $q.all({\n users: UserService.users(true),\n teams: isAdmin ? TeamService.teams() : UserService.userLeadingTeams(userDetails.ID),\n memberships: TeamMembershipService.memberships(),\n settings: SettingsService.publicSettings(),\n })\n .then(function success(data) {\n var users = data.users;\n assignTeamLeaders(users, data.memberships);\n $scope.users = users;\n $scope.teams = _.orderBy(data.teams, 'Name', 'asc');\n $scope.AuthenticationMethod = data.settings.AuthenticationMethod;\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve users and teams');\n $scope.users = [];\n $scope.teams = [];\n });\n }\n\n initView();\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./wizard-view.html');\n\nimport angular from 'angular';\nimport controller from './wizard-view.controller.js';\n\nangular.module('portainer.app').component('wizardView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n});\n","var path = 'app/portainer/views/wizard/wizard-view.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Quick Setup\\\"></rd-header-title>\\n <rd-header-content>Environment Wizard</rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-magic\\\" title-text=\\\"Environment Wizard\\\"> </rd-widget-header>\\n <rd-widget-body>\\n <div class=\\\"row\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Welcome to Portainer\\n </div>\\n <div>\\n <span class=\\\"text-muted small\\\" ng-show=\\\"$ctrl.state.endpoint.added\\\">\\n We have connected your local environment of {{ $ctrl.state.endpoint.connected }} to Portainer. <br\\n /></span>\\n <span class=\\\"text-muted small\\\" ng-show=\\\"!$ctrl.state.endpoint.loading && !$ctrl.state.endpoint.added\\\">\\n We could not connect your local environment to Portainer. <br />\\n Please ensure your environment is correctly exposed. For help with installation vist\\n <a href=\\\"https://documentation.portainer.io/quickstart/\\\">https://documentation.portainer.io/quickstart</a><br />\\n </span>\\n <span class=\\\"text-muted small\\\">\\n Get started below with your local portainer or connect more container environments.\\n </span>\\n </div>\\n\\n <wizard-link\\n ng-show=\\\"$ctrl.state.endpoint.added\\\"\\n icon=\\\"$ctrl.state.local.icon\\\"\\n title=\\\"Get Started\\\"\\n link-title=\\\"Get Started\\\"\\n description=\\\"Proceed using the local environment which Portainer is running in\\\"\\n ui-sref=\\\"portainer.home\\\"\\n analytics-on\\n analytics-category=\\\"portainer\\\"\\n analytics-event=\\\"endpoint-wizard-endpoint-select\\\"\\n analytics-properties=\\\"{ metadata: { environment: 'Get-started-local-environment' }}\\\"\\n ></wizard-link>\\n <wizard-link\\n title=\\\"Add Environments\\\"\\n link-title=\\\"Add Environments\\\"\\n icon=\\\"$ctrl.state.remote.icon\\\"\\n description=\\\"Connect to other environments\\\"\\n ui-sref=\\\"portainer.wizard.endpoints\\\"\\n ></wizard-link>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/views/wizard/wizard-endpoints/wizard-endpoints.html';\nvar html = \"<rd-header>\\n <rd-header-title title-text=\\\"Quick Setup\\\"></rd-header-title>\\n <rd-header-content>Environment Wizard</rd-header-content>\\n</rd-header>\\n\\n<div class=\\\"wizard-wrapper\\\" ng-if=\\\"$ctrl.state.currentStep !== 0\\\">\\n <div class=\\\"wizard-main\\\">\\n <div class=\\\"row\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-magic\\\" title-text=\\\"Environment Wizard\\\"> </rd-widget-header>\\n <rd-widget-body>\\n <!-- Stepper -->\\n <wizard-stepper endpoint-selections=\\\"$ctrl.state.selections\\\"></wizard-stepper>\\n <!-- Stepper -->\\n\\n <div class=\\\"col-sm-12 form-section-title wizard-main-title\\\"> Connect to your {{ $ctrl.state.section }} environment </div>\\n\\n <div ng-switch=\\\"$ctrl.state.section\\\" class=\\\"wizard-endpoint-section\\\">\\n <wizard-docker ng-switch-when=\\\"docker\\\" on-update=\\\"($ctrl.updateEndpoint)\\\" on-analytics=\\\"($ctrl.addAnalytics)\\\"></wizard-docker>\\n <wizard-aci ng-switch-when=\\\"aci\\\" on-update=\\\"($ctrl.updateEndpoint)\\\" on-analytics=\\\"($ctrl.addAnalytics)\\\"></wizard-aci>\\n <wizard-kubernetes ng-switch-when=\\\"kubernetes\\\" on-update=\\\"($ctrl.updateEndpoint)\\\" on-analytics=\\\"($ctrl.addAnalytics)\\\"></wizard-kubernetes>\\n </div>\\n\\n <div class=\\\"wizard-step-action\\\">\\n <button\\n ng-click=\\\"$ctrl.previousStep()\\\"\\n ng-show=\\\"$ctrl.state.currentStep !== 0\\\"\\n type=\\\"submit\\\"\\n class=\\\"btn btn-primary btn-sm previous-btn\\\"\\n ng-disabled=\\\"$ctrl.state.currentStep === 1\\\"\\n >\\n <i class=\\\"fas fa-arrow-left space-right\\\"></i>{{ $ctrl.state.previousStep }}\\n </button>\\n <button ng-click=\\\"$ctrl.nextStep()\\\" ng-show=\\\"$ctrl.state.currentStep !== 0\\\" type=\\\"submit\\\" class=\\\"btn btn-primary btn-sm next-btn\\\">\\n {{ $ctrl.state.nextStep }} <i class=\\\"fas fa-arrow-right space-left\\\"></i\\n ></button>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n </div>\\n </div>\\n <div class=\\\"wizard-aside\\\" ng-if=\\\"$ctrl.state.currentStep !== 0\\\">\\n <wizard-endpoint-list endpoint-list=\\\"$ctrl.endpoints\\\"></wizard-endpoint-list>\\n </div>\\n</div>\\n\\n<div class=\\\"row\\\" ng-if=\\\"$ctrl.state.currentStep === 0\\\">\\n <div class=\\\"col-sm-12\\\">\\n <rd-widget>\\n <rd-widget-header icon=\\\"fa-magic\\\" title-text=\\\"Environment Wizard\\\"> </rd-widget-header>\\n <rd-widget-body>\\n <div class=\\\"row\\\">\\n <div class=\\\"col-sm-12 form-section-title\\\">\\n Select your environment(s)\\n </div>\\n <div>\\n <span class=\\\"text-muted small\\\">You can onboard different types of environments, select all that apply.</span>\\n </div>\\n <div class=\\\"wizard-section\\\">\\n <wizard-endpoint-type\\n endpoint-title=\\\"Docker\\\"\\n description=\\\"Connect to Docker Standalone / Swarm via URL/IP, API or Socket\\\"\\n icon=\\\"fab fa-docker\\\"\\n active=\\\"$ctrl.state.dockerActive\\\"\\n ng-click=\\\"$ctrl.endpointSelect('docker')\\\"\\n ></wizard-endpoint-type>\\n\\n <wizard-endpoint-type\\n endpoint-title=\\\"Kubernetes\\\"\\n description=\\\"Connect to a kubernetes environment via URL/IP\\\"\\n icon=\\\"fas fa-dharmachakra\\\"\\n active=\\\"$ctrl.state.kubernetesActive\\\"\\n ng-click=\\\"$ctrl.endpointSelect('kubernetes')\\\"\\n ></wizard-endpoint-type>\\n\\n <wizard-endpoint-type\\n endpoint-title=\\\"ACI\\\"\\n description=\\\"Connect to ACI environment via API\\\"\\n icon=\\\"fab fa-microsoft\\\"\\n active=\\\"$ctrl.state.aciActive\\\"\\n ng-click=\\\"$ctrl.endpointSelect('aci')\\\"\\n ></wizard-endpoint-type>\\n </div>\\n\\n <div class=\\\"wizard-section\\\">\\n <div class=\\\"wizard-section-action\\\">\\n <button ng-click=\\\"$ctrl.startWizard()\\\" ng-disabled=\\\"$ctrl.state.selections.length === 0\\\" type=\\\"submit\\\" class=\\\"btn btn-primary btn-sm no-margin\\\">Start Wizard</button>\\n </div>\\n </div>\\n </div>\\n </rd-widget-body>\\n </rd-widget>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./wizard-aci.html');\n\nimport angular from 'angular';\nimport controller from './wizard-aci.controller.js';\n\nangular.module('portainer.app').component('wizardAci', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n onUpdate: '<',\n onAnalytics: '<',\n },\n});\n","var path = 'app/portainer/views/wizard/wizard-endpoints/wizard-endpoint-aci/wizard-aci.html';\nvar html = \"<form class=\\\"form-horizontal\\\" name=\\\"aciWizardForm\\\">\\n <box-selector radio-name=\\\"ACI\\\" ng-model=\\\"$ctrl.state.endpointType\\\" options=\\\"$ctrl.state.availableOptions\\\"></box-selector>\\n <!-- docker form section-->\\n <div class=\\\"form-group wizard-form\\\">\\n <label for=\\\"acir_name\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Name<span class=\\\"wizard-form-required\\\">*</span></label>\\n <div class=\\\"col-sm-9 col-lg-10\\\" style=\\\"margin-bottom: 15px;\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" name=\\\"aci_name\\\" ng-model=\\\"$ctrl.formValues.name\\\" placeholder=\\\"e.g. docker-prod01 / kubernetes-cluster01\\\" required auto-focus />\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <label for=\\\"azure_credential_appid\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Application ID:<span class=\\\"wizard-form-required\\\">*</span></label>\\n <div class=\\\"col-sm-9 col-lg-10\\\" style=\\\"margin-bottom: 15px;\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n name=\\\"azure_credential_appid\\\"\\n ng-model=\\\"$ctrl.formValues.azureApplicationId\\\"\\n placeholder=\\\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\\\"\\n required\\n />\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <label for=\\\"azure_credential_tenantid\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Tenant ID:<span class=\\\"wizard-form-required\\\">*</span></label>\\n <div class=\\\"col-sm-9 col-lg-10\\\" style=\\\"margin-bottom: 15px;\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n name=\\\"azure_credential_tenantid\\\"\\n ng-model=\\\"$ctrl.formValues.azureTenantId\\\"\\n placeholder=\\\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\\\"\\n required\\n />\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <label for=\\\"azure_credential_authkey\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Authentication key<span class=\\\"wizard-form-required\\\">*</span></label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n name=\\\"azure_credential_authkey\\\"\\n ng-model=\\\"$ctrl.formValues.azureAuthenticationKey\\\"\\n placeholder=\\\"cOrXoK/1D35w8YQ8nH1/8ZGwzz45JIYD5jxHKXEQknk=\\\"\\n required\\n />\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"submit\\\"\\n class=\\\"btn btn-primary btn-sm wizard-connect-button\\\"\\n ng-disabled=\\\"!$ctrl.formValues.name || !$ctrl.formValues.azureApplicationId || !$ctrl.formValues.azureTenantId || !$ctrl.formValues.azureAuthenticationKey || $ctrl.state.actionInProgress\\\"\\n ng-click=\\\"$ctrl.addAciEndpoint()\\\"\\n button-spinner=\\\"$ctrl.state.actionInProgress\\\"\\n >\\n <span ng-hide=\\\"$ctrl.state.actionInProgress\\\"><i class=\\\"fa fa-plug\\\" style=\\\"margin-right: 5px;\\\"></i> Connect </span>\\n <span ng-show=\\\"$ctrl.state.actionInProgress\\\">Connecting environment...</span>\\n </button>\\n </div>\\n </div>\\n</form>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./wizard-docker.html');\n\nimport angular from 'angular';\nimport controller from './wizard-docker.controller.js';\n\nangular.module('portainer.app').component('wizardDocker', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n onUpdate: '<',\n onAnalytics: '<',\n },\n});\n","var path = 'app/portainer/views/wizard/wizard-endpoints/wizard-endpoint-docker/wizard-docker.html';\nvar html = \"<form class=\\\"form-horizontal\\\" name=\\\"dockerWizardForm\\\">\\n <!-- docker tab selection -->\\n <box-selector radio-name=\\\"Docker\\\" ng-click=\\\"$ctrl.clearForm()\\\" ng-model=\\\"$ctrl.state.endpointType\\\" options=\\\"$ctrl.state.availableOptions\\\"></box-selector>\\n <!-- docker tab selection -->\\n <div style=\\\"padding-left: 10px;\\\">\\n <div class=\\\"form-group\\\">\\n <div ng-if=\\\"$ctrl.state.endpointType === 'agent'\\\" class=\\\"wizard-code\\\">\\n <uib-tabset>\\n <uib-tab index=\\\"0\\\" heading=\\\"Linux\\\">\\n <code style=\\\"display: block; white-space: pre-wrap; padding: 16px 10px;\\\"\\n ><h6 style=\\\"color: #000;\\\">CLI script for installing agent on your Linux environment with Docker Swarm</h6>{{ $ctrl.command.linuxCommand\\n }}<i class=\\\"fas fa-copy wizard-copy-button\\\" ng-click=\\\"$ctrl.copyLinuxCommand()\\\"></i\\n ><i id=\\\"linuxCommandNotification\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-left: 7px; display: none;\\\"></i\\n ></code>\\n </uib-tab>\\n\\n <uib-tab index=\\\"1\\\" heading=\\\"Windows\\\">\\n <code style=\\\"display: block; white-space: pre-wrap; padding: 16px 10px;\\\"\\n ><h6 style=\\\"color: #000;\\\">CLI script for installing agent on your Windows environment with Docker Swarm</h6>{{ $ctrl.command.winCommand\\n }}<i class=\\\"fas fa-copy wizard-copy-button\\\" ng-click=\\\"$ctrl.copyWinCommand()\\\"></i\\n ><i id=\\\"winCommandNotification\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-left: 7px; display: none;\\\"></i\\n ></code>\\n </uib-tab>\\n </uib-tabset>\\n </div>\\n\\n <div ng-if=\\\"$ctrl.state.endpointType === 'api' || $ctrl.state.endpointType === 'socket'\\\" class=\\\"wizard-code\\\">\\n <uib-tabset active=\\\"state.deploymentTab\\\">\\n <uib-tab index=\\\"0\\\" heading=\\\"Linux\\\">\\n <code style=\\\"display: block; white-space: pre-wrap; padding: 16px 10px;\\\"\\n ><h6 style=\\\"color: #000;\\\">When using the socket, ensure that you have started the Portainer container with the following Docker flag on Linux</h6\\n >{{ $ctrl.command.linuxSocket }}<i class=\\\"fas fa-copy wizard-copy-button\\\" ng-click=\\\"$ctrl.copyLinuxSocket()\\\"></i\\n ><i id=\\\"linuxSocketNotification\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-left: 7px; display: none;\\\"></i\\n ></code>\\n </uib-tab>\\n\\n <uib-tab index=\\\"1\\\" heading=\\\"Windows\\\">\\n <code style=\\\"display: block; white-space: pre-wrap; padding: 16px 10px;\\\"\\n ><h6 style=\\\"color: #000;\\\">When using the socket, ensure that you have started the Portainer container with the following Docker flag on Windows</h6\\n >{{ $ctrl.command.winSocket }}<i class=\\\"fas fa-copy wizard-copy-button\\\" ng-click=\\\"$ctrl.copyWinSocket()\\\"></i\\n ><i id=\\\"winSocketNotification\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-left: 7px; display: none;\\\"></i\\n ></code>\\n </uib-tab>\\n </uib-tabset>\\n </div>\\n </div>\\n </div>\\n\\n <!-- docker form section-->\\n <div class=\\\"form-group wizard-form\\\">\\n <label for=\\\"endpoint_name\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Name<span class=\\\"wizard-form-required\\\">*</span></label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" name=\\\"endpoint_name\\\" ng-model=\\\"$ctrl.formValues.name\\\" placeholder=\\\"e.g. docker-prod01 / kubernetes-cluster01\\\" auto-focus />\\n </div>\\n </div>\\n\\n <div ng-if=\\\"$ctrl.state.endpointType === 'agent'\\\" class=\\\"form-group\\\">\\n <label for=\\\"endpoint_url\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\"> Environments URL<span class=\\\"wizard-form-required\\\">*</span> </label>\\n\\n <div class=\\\"col-sm-9 col-lg-10\\\" style=\\\"margin-bottom: 15px;\\\">\\n <input\\n ng-if=\\\"$ctrl.state.endpointType === 'agent'\\\"\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n name=\\\"endpoint_url\\\"\\n ng-model=\\\"$ctrl.formValues.url\\\"\\n placeholder=\\\"e.g. 10.0.0.10:9001 or tasks.portainer_agent:9001\\\"\\n />\\n </div>\\n </div>\\n\\n <div ng-if=\\\"$ctrl.state.endpointType === 'api'\\\">\\n <div class=\\\"form-group\\\">\\n <label for=\\\"dockerapi_url\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\"> Docker API URL<span class=\\\"wizard-form-required\\\">*</span> </label>\\n\\n <div class=\\\"col-sm-9 col-lg-10\\\" style=\\\"margin-bottom: 15px;\\\">\\n <input\\n ng-if=\\\"$ctrl.state.endpointType === 'api'\\\"\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n name=\\\"dockerapi_url\\\"\\n ng-model=\\\"$ctrl.formValues.url\\\"\\n placeholder=\\\"e.g. 10.0.0.10:2375 or mydocker.mydomain.com:2375\\\"\\n />\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\" style=\\\"padding-left: 15px; width: 15%;\\\">\\n <por-switch-field ng-model=\\\"$ctrl.formValues.tls\\\" name=\\\"connect_socket\\\" label=\\\"TLS\\\" label-class=\\\"col-sm-12 col-lg-4\\\"></por-switch-field>\\n </div>\\n\\n <div class=\\\"form-group\\\" style=\\\"padding-left: 15px; width: 40%;\\\">\\n <por-switch-field\\n ng-if=\\\"$ctrl.formValues.tls\\\"\\n ng-model=\\\"$ctrl.formValues.skipCertification\\\"\\n name=\\\"skip_certification\\\"\\n label=\\\"Skip Certification Verification\\\"\\n label-class=\\\"col-sm-12 col-lg-4\\\"\\n ></por-switch-field>\\n </div>\\n\\n <div>\\n <wizard-tls ng-if=\\\"!$ctrl.formValues.skipCertification && $ctrl.formValues.tls\\\" form-data=\\\"$ctrl.formValues.securityFormData\\\" onChange=\\\"($ctrl.onChangeFile)\\\"></wizard-tls>\\n </div>\\n </div>\\n\\n <div ng-if=\\\"$ctrl.state.endpointType === 'socket'\\\" class=\\\"form-group\\\" style=\\\"padding-left: 15px;\\\">\\n <div class=\\\"form-group\\\" style=\\\"padding-left: 15px;\\\">\\n <label for=\\\"override_socket\\\" class=\\\"col-sm_12 control-label text-left\\\">\\n Override default socket path\\n </label>\\n <label class=\\\"switch\\\" style=\\\"margin-left: 20px;\\\"> <input type=\\\"checkbox\\\" ng-model=\\\"$ctrl.formValues.overrideSocket\\\" /><i></i></label>\\n </div>\\n\\n <div ng-if=\\\"$ctrl.formValues.overrideSocket\\\">\\n <div class=\\\"form-group\\\">\\n <label for=\\\"socket_path\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">\\n Socket path\\n <portainer-tooltip position=\\\"bottom\\\" message=\\\"Path to the Docker socket. Remember to bind-mount the socket, see the important notice above for more information.\\\">\\n </portainer-tooltip>\\n </label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n name=\\\"socket_path\\\"\\n ng-model=\\\"$ctrl.formValues.socketPath\\\"\\n placeholder=\\\"e.g. /var/run/docker.sock (on Linux) or //./pipe/docker_engine (on Windows)\\\"\\n />\\n </div>\\n </div>\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n ng-if=\\\"$ctrl.state.endpointType === 'agent'\\\"\\n type=\\\"submit\\\"\\n class=\\\"btn btn-primary btn-sm wizard-connect-button\\\"\\n ng-disabled=\\\"!$ctrl.formValues.name || !$ctrl.formValues.url || $ctrl.state.actionInProgress\\\"\\n ng-click=\\\"$ctrl.connectEnvironment('agent')\\\"\\n button-spinner=\\\"$ctrl.state.actionInProgress\\\"\\n >\\n <span ng-hide=\\\"$ctrl.state.actionInProgress\\\"><i class=\\\"fa fa-plug\\\" style=\\\"margin-right: 5px;\\\"></i>Connect </span>\\n <span ng-show=\\\"$ctrl.state.actionInProgress\\\">Connecting environment...</span>\\n </button>\\n <button\\n ng-if=\\\"$ctrl.state.endpointType === 'api'\\\"\\n type=\\\"submit\\\"\\n class=\\\"btn btn-primary btn-sm wizard-connect-button\\\"\\n ng-disabled=\\\"!$ctrl.formValues.name || !$ctrl.formValues.url || $ctrl.state.actionInProgress\\\"\\n ng-click=\\\"$ctrl.connectEnvironment('api')\\\"\\n button-spinner=\\\"$ctrl.state.actionInProgress\\\"\\n >\\n <span ng-hide=\\\"$ctrl.state.actionInProgress\\\"><i class=\\\"fa fa-plug\\\" style=\\\"margin-right: 5px;\\\"></i>Connect </span>\\n <span ng-show=\\\"$ctrl.state.actionInProgress\\\">Connecting environment...</span>\\n </button>\\n <button\\n ng-if=\\\"$ctrl.state.endpointType === 'socket'\\\"\\n type=\\\"submit\\\"\\n class=\\\"btn btn-primary btn-sm wizard-connect-button\\\"\\n ng-disabled=\\\"!$ctrl.formValues.name || $ctrl.state.actionInProgress\\\"\\n ng-click=\\\"$ctrl.connectEnvironment('socket')\\\"\\n button-spinner=\\\"$ctrl.state.actionInProgress\\\"\\n >\\n <span ng-hide=\\\"$ctrl.state.actionInProgress\\\"><i class=\\\"fa fa-plug\\\" style=\\\"margin-right: 5px;\\\"></i>Connect </span>\\n <span ng-show=\\\"$ctrl.state.actionInProgress\\\">Connecting environment...</span>\\n </button>\\n </div>\\n </div>\\n</form>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./wizard-kubernetes.html');\n\nimport angular from 'angular';\nimport controller from './wizard-kubernetes.controller.js';\n\nangular.module('portainer.app').component('wizardKubernetes', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n onUpdate: '<',\n onAnalytics: '<',\n },\n});\n","var path = 'app/portainer/views/wizard/wizard-endpoints/wizard-endpoint-kubernetes/wizard-kubernetes.html';\nvar html = \"<form class=\\\"form-horizontal\\\" name=\\\"kubernetesWizardForm\\\">\\n <box-selector radio-name=\\\"Kubernetes\\\" ng-model=\\\"$ctrl.state.endpointType\\\" options=\\\"$ctrl.state.availableOptions\\\"></box-selector>\\n <!-- docker tab selection -->\\n <div style=\\\"padding-left: 10px;\\\">\\n <div class=\\\"form-group\\\">\\n <div class=\\\"wizard-code\\\">\\n <uib-tabset active=\\\"state.deploymentTab\\\">\\n <uib-tab index=\\\"0\\\" heading=\\\"Kubernetes via load balancer\\\">\\n <code style=\\\"display: block; white-space: pre-wrap; padding: 16px 10px;\\\"\\n ><h6 style=\\\"color: #000;\\\">CLI script for installing agent on your endpoint</h6>{{ $ctrl.command.loadBalancer\\n }}<i class=\\\"fas fa-copy wizard-copy-button\\\" ng-click=\\\"$ctrl.copyLoadBalancer()\\\"></i\\n ><i id=\\\"loadBalancerNotification\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-left: 7px; display: none;\\\"></i\\n ></code>\\n </uib-tab>\\n\\n <uib-tab index=\\\"1\\\" heading=\\\"Kubernetes via node port\\\">\\n <code style=\\\"display: block; white-space: pre-wrap; padding: 16px 10px;\\\"\\n ><h6 style=\\\"color: #000;\\\">CLI script for installing agent on your endpoint</h6>{{ $ctrl.command.nodePort\\n }}<i class=\\\"fas fa-copy wizard-copy-button\\\" ng-click=\\\"$ctrl.copyNodePort()\\\"></i\\n ><i id=\\\"nodePortNotification\\\" class=\\\"fa fa-check green-icon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-left: 7px; display: none;\\\"></i\\n ></code>\\n </uib-tab>\\n </uib-tabset>\\n </div>\\n </div>\\n </div>\\n\\n <div class=\\\"form-group wizard-form\\\">\\n <label for=\\\"endpoint_name\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">Name<span class=\\\"wizard-form-required\\\">*</span></label>\\n <div class=\\\"col-sm-9 col-lg-10\\\" style=\\\"margin-bottom: 15px;\\\">\\n <input\\n type=\\\"text\\\"\\n class=\\\"form-control\\\"\\n name=\\\"endpoint_name\\\"\\n ng-model=\\\"$ctrl.state.formValues.name\\\"\\n placeholder=\\\"e.g. docker-prod01 / kubernetes-cluster01\\\"\\n required\\n auto-focus\\n />\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <label for=\\\"endpoint_url\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\"> Environments URL<span class=\\\"wizard-form-required\\\">*</span> </label>\\n\\n <div class=\\\"col-sm-9 col-lg-10\\\" style=\\\"margin-bottom: 15px;\\\">\\n <input type=\\\"text\\\" class=\\\"form-control\\\" name=\\\"endpoint_url\\\" ng-model=\\\"$ctrl.state.formValues.url\\\" placeholder=\\\"e.g. 10.0.0.10:9001 or tasks.portainer_agent:9001\\\" required />\\n </div>\\n </div>\\n\\n <div class=\\\"form-group\\\">\\n <div class=\\\"col-sm-12\\\">\\n <button\\n type=\\\"submit\\\"\\n class=\\\"btn btn-primary btn-sm wizard-connect-button\\\"\\n ng-disabled=\\\"!$ctrl.state.formValues.name || !$ctrl.state.formValues.url || $ctrl.state.actionInProgress\\\"\\n ng-click=\\\"$ctrl.addKubernetesAgent()\\\"\\n button-spinner=\\\"$ctrl.state.actionInProgress\\\"\\n >\\n <span ng-hide=\\\"$ctrl.state.actionInProgress\\\"><i class=\\\"fa fa-plug\\\" style=\\\"margin-right: 5px;\\\"></i> Connect </span>\\n <span ng-show=\\\"$ctrl.state.actionInProgress\\\">Connecting environment...</span>\\n </button>\\n </div>\\n </div>\\n</form>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/views/wizard/wizard-endpoints/wizard-endpoint-list/wizard-endpoint-list.html';\nvar html = \"<rd-widget>\\n <rd-widget-header icon=\\\"fa-plug\\\" title-text=\\\"Connected Environments\\\"> </rd-widget-header>\\n <rd-widget-body>\\n <div class=\\\"wizard-list-wrapper\\\" ng-repeat=\\\"endpoint in $ctrl.endpointList\\\">\\n <div class=\\\"wizard-list-image\\\"><i ng-class=\\\"endpoint.Type | endpointtypeicon\\\" aria-hidden=\\\"true\\\" style=\\\"margin-right: 2px;\\\"></i></div>\\n <div class=\\\"wizard-list-title\\\">{{ endpoint.Name }}</div>\\n <div class=\\\"wizard-list-subtitle\\\">URL: {{ endpoint.URL | stripprotocol }}</div>\\n <div class=\\\"wizard-list-type\\\">Type: {{ endpoint.Type | endpointtypename }}</div>\\n </div>\\n </rd-widget-body>\\n</rd-widget>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/views/wizard/wizard-endpoints/wizard-stepper/wizard-stepper.html';\nvar html = \"<div class=\\\"stepper-wrapper\\\">\\n <div ng-repeat=\\\"selection in $ctrl.endpointSelections\\\" class=\\\"stepper-item {{ selection.stage }} \\\">\\n <div class=\\\"step-counter\\\">{{ $index + 1 }}</div>\\n <div class=\\\"step-name {{ selection.nameClass }}\\\">{{ selection.endpoint }}</div>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./wizard-endpoint-type.html');\n\nimport angular from 'angular';\n\nangular.module('portainer.app').component('wizardEndpointType', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n endpointTitle: '@',\n description: '@',\n icon: '@',\n active: '<',\n },\n});\n","var path = 'app/portainer/views/wizard/wizard-endpoints/wizard-stepper/wizard-endpoint-type/wizard-endpoint-type.html';\nvar html = \"<div>\\n <div ng-click=\\\"$ctrl.endpointSelect('docker')\\\">\\n <div class=\\\"wizard-endpoints {{ $ctrl.active }}\\\">\\n <div style=\\\"text-align: center; padding: 10px;\\\"><i class=\\\"{{ $ctrl.icon }}\\\" style=\\\"font-size: 80px;\\\"></i></div>\\n\\n <div style=\\\"margin-top: 15px; text-align: center;\\\">\\n <h3>{{ $ctrl.endpointTitle }}</h3>\\n <h5>{{ $ctrl.description }}</h5>\\n </div>\\n </div>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'app/portainer/views/wizard/wizard-link/wizard-link.html';\nvar html = \"<div class=\\\"wizard-button\\\">\\n <div style=\\\"text-align: center; padding: 10px;\\\"><i class=\\\"{{ $ctrl.icon }}\\\" style=\\\"font-size: 80px;\\\"></i></div>\\n <div style=\\\"margin-top: 15px; text-align: center;\\\">\\n <h3>{{ $ctrl.linkTitle }}</h3>\\n <h5>{{ $ctrl.description }}</h5>\\n </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","const autoNgTemplateLoaderTemplate1 = require('./wizard-tls.html');\n\nimport angular from 'angular';\n\nangular.module('portainer.app').component('wizardTls', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n formData: '<',\n onChange: '<',\n },\n});\n","var path = 'app/portainer/views/wizard/wizard-tls/wizard-tls.html';\nvar html = \"<div>\\n <div>\\n <!-- tls-file-ca -->\\n <div class=\\\"form-group\\\">\\n <label class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">TLS CA certificate</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ngf-select=\\\"$ctrl.onChange($file)\\\" ng-model=\\\"$ctrl.formData.TLSCACert\\\">Select file</button>\\n <span class=\\\"space-left\\\">\\n {{ $ctrl.formData.TLSCACert.name }}\\n <i class=\\\"fa fa-check green-icon\\\" ng-if=\\\"$ctrl.formData.TLSCACert\\\" aria-hidden=\\\"true\\\"></i>\\n <i class=\\\"fa fa-times red-icon\\\" ng-if=\\\"!$ctrl.formData.TLSCACert\\\" aria-hidden=\\\"true\\\"></i>\\n </span>\\n </div>\\n </div>\\n <!-- !tls-file-ca -->\\n\\n <!-- tls-files-cert-key -->\\n <div>\\n <!-- tls-file-cert -->\\n <div class=\\\"form-group\\\">\\n <label for=\\\"tls_cert\\\" class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">TLS certificate</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ngf-select=\\\"$ctrl.onChange($file)\\\" ng-model=\\\"$ctrl.formData.TLSCert\\\">Select file</button>\\n <span class=\\\"space-left\\\">\\n {{ $ctrl.formData.TLSCert.name }}\\n <i class=\\\"fa fa-check green-icon\\\" ng-if=\\\"$ctrl.formData.TLSCert\\\" aria-hidden=\\\"true\\\"></i>\\n <i class=\\\"fa fa-times red-icon\\\" ng-if=\\\"!$ctrl.formData.TLSCert\\\" aria-hidden=\\\"true\\\"></i>\\n </span>\\n </div>\\n </div>\\n <!-- !tls-file-cert -->\\n <!-- tls-file-key -->\\n <div class=\\\"form-group\\\">\\n <label class=\\\"col-sm-3 col-lg-2 control-label text-left\\\">TLS key</label>\\n <div class=\\\"col-sm-9 col-lg-10\\\">\\n <button type=\\\"button\\\" class=\\\"btn btn-sm btn-primary\\\" ngf-select=\\\"$ctrl.onChange($file)\\\" ng-model=\\\"$ctrl.formData.TLSKey\\\">Select file</button>\\n <span class=\\\"space-left\\\">\\n {{ $ctrl.formData.TLSKey.name }}\\n <i class=\\\"fa fa-check green-icon\\\" ng-if=\\\"$ctrl.formData.TLSKey\\\" aria-hidden=\\\"true\\\"></i>\\n <i class=\\\"fa fa-times red-icon\\\" ng-if=\\\"!$ctrl.formData.TLSKey\\\" aria-hidden=\\\"true\\\"></i>\\n </span>\\n </div>\\n </div>\\n <!-- !tls-file-key -->\\n </div>\\n <!-- tls-files-cert-key -->\\n </div>\\n <!-- !tls-file-upload -->\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import 'regenerator-runtime/runtime';\n\nexport default function setupTests() {\n // pass\n}\n","import angular from 'angular';\nimport 'moment';\nimport 'ui-select';\nimport 'angular-sanitize';\nimport 'ng-file-upload';\nimport 'angular-messages';\nimport 'angular-resource';\nimport 'angular-utils-pagination';\nimport 'angular-local-storage';\nimport 'angular-jwt';\nimport 'angular-json-tree';\nimport 'angular-loading-bar';\nimport 'angular-clipboard';\nimport 'angular-file-saver';\nimport 'angularjs-scroll-glue';\nimport 'angularjs-slider';\nimport 'bootstrap/dist/js/bootstrap.js';\nimport 'js-yaml/dist/js-yaml.js';\nimport 'angular-ui-bootstrap';\nimport 'angular-moment-picker';\nimport 'angular-multiselect/isteven-multi-select.js';\nimport 'angulartics/dist/angulartics.min.js';\n\nwindow.angular = angular;\n","import _ from 'lodash-es';\n\nimport { PorImageRegistryModel } from 'Docker/models/porImageRegistry';\n\nimport * as envVarsUtils from '@/portainer/helpers/env-vars';\nimport { ContainerCapabilities, ContainerCapability } from '../../../models/containerCapabilities';\nimport { AccessControlFormData } from '../../../../portainer/components/accessControlForm/porAccessControlFormModel';\nimport { ContainerDetailsViewModel } from '../../../models/container';\n\nimport './createcontainer.css';\n\nangular.module('portainer.docker').controller('CreateContainerController', [\n '$q',\n '$scope',\n '$async',\n '$state',\n '$timeout',\n '$transition$',\n '$filter',\n 'Container',\n 'ContainerHelper',\n 'Image',\n 'ImageHelper',\n 'Volume',\n 'NetworkService',\n 'ResourceControlService',\n 'Authentication',\n 'Notifications',\n 'ContainerService',\n 'ImageService',\n 'FormValidator',\n 'ModalService',\n 'RegistryService',\n 'SystemService',\n 'PluginService',\n 'HttpRequestHelper',\n 'endpoint',\n function (\n $q,\n $scope,\n $async,\n $state,\n $timeout,\n $transition$,\n $filter,\n Container,\n ContainerHelper,\n Image,\n ImageHelper,\n Volume,\n NetworkService,\n ResourceControlService,\n Authentication,\n Notifications,\n ContainerService,\n ImageService,\n FormValidator,\n ModalService,\n RegistryService,\n SystemService,\n PluginService,\n HttpRequestHelper,\n endpoint\n ) {\n $scope.create = create;\n $scope.update = update;\n $scope.endpoint = endpoint;\n\n $scope.formValues = {\n alwaysPull: true,\n Console: 'none',\n Volumes: [],\n NetworkContainer: null,\n Labels: [],\n ExtraHosts: [],\n MacAddress: '',\n IPv4: '',\n IPv6: '',\n DnsPrimary: '',\n DnsSecondary: '',\n AccessControlData: new AccessControlFormData(),\n CpuLimit: 0,\n MemoryLimit: 0,\n MemoryReservation: 0,\n CmdMode: 'default',\n EntrypointMode: 'default',\n Env: [],\n NodeName: null,\n capabilities: [],\n Sysctls: [],\n LogDriverName: '',\n LogDriverOpts: [],\n RegistryModel: new PorImageRegistryModel(),\n };\n\n $scope.extraNetworks = {};\n\n $scope.state = {\n formValidationError: '',\n actionInProgress: false,\n mode: '',\n pullImageValidity: true,\n settingUnlimitedResources: false,\n };\n\n $scope.handleEnvVarChange = handleEnvVarChange;\n function handleEnvVarChange(value) {\n $scope.formValues.Env = value;\n }\n\n $scope.refreshSlider = function () {\n $timeout(function () {\n $scope.$broadcast('rzSliderForceRender');\n });\n };\n\n $scope.onImageNameChange = function () {\n $scope.formValues.CmdMode = 'default';\n $scope.formValues.EntrypointMode = 'default';\n };\n\n $scope.setPullImageValidity = setPullImageValidity;\n function setPullImageValidity(validity) {\n if (!validity) {\n $scope.formValues.alwaysPull = false;\n }\n $scope.state.pullImageValidity = validity;\n }\n\n $scope.config = {\n Image: '',\n Env: [],\n Cmd: '',\n MacAddress: '',\n ExposedPorts: {},\n Entrypoint: '',\n HostConfig: {\n RestartPolicy: {\n Name: 'no',\n },\n PortBindings: [],\n PublishAllPorts: false,\n Binds: [],\n AutoRemove: false,\n NetworkMode: 'bridge',\n Privileged: false,\n Init: false,\n Runtime: null,\n ExtraHosts: [],\n Devices: [],\n CapAdd: [],\n CapDrop: [],\n Sysctls: {},\n },\n NetworkingConfig: {\n EndpointsConfig: {},\n },\n Labels: {},\n };\n\n $scope.addVolume = function () {\n $scope.formValues.Volumes.push({ name: '', containerPath: '', readOnly: false, type: 'volume' });\n };\n\n $scope.removeVolume = function (index) {\n $scope.formValues.Volumes.splice(index, 1);\n };\n\n $scope.addPortBinding = function () {\n $scope.config.HostConfig.PortBindings.push({ hostPort: '', containerPort: '', protocol: 'tcp' });\n };\n\n $scope.removePortBinding = function (index) {\n $scope.config.HostConfig.PortBindings.splice(index, 1);\n };\n\n $scope.addLabel = function () {\n $scope.formValues.Labels.push({ name: '', value: '' });\n };\n\n $scope.removeLabel = function (index) {\n $scope.formValues.Labels.splice(index, 1);\n };\n\n $scope.addExtraHost = function () {\n $scope.formValues.ExtraHosts.push({ value: '' });\n };\n\n $scope.removeExtraHost = function (index) {\n $scope.formValues.ExtraHosts.splice(index, 1);\n };\n\n $scope.addDevice = function () {\n $scope.config.HostConfig.Devices.push({ pathOnHost: '', pathInContainer: '' });\n };\n\n $scope.removeDevice = function (index) {\n $scope.config.HostConfig.Devices.splice(index, 1);\n };\n\n $scope.addSysctl = function () {\n $scope.formValues.Sysctls.push({ name: '', value: '' });\n };\n\n $scope.removeSysctl = function (index) {\n $scope.formValues.Sysctls.splice(index, 1);\n };\n\n $scope.addLogDriverOpt = function () {\n $scope.formValues.LogDriverOpts.push({ name: '', value: '' });\n };\n\n $scope.removeLogDriverOpt = function (index) {\n $scope.formValues.LogDriverOpts.splice(index, 1);\n };\n\n $scope.fromContainerMultipleNetworks = false;\n\n function prepareImageConfig(config) {\n const imageConfig = ImageHelper.createImageConfigForContainer($scope.formValues.RegistryModel);\n config.Image = imageConfig.fromImage;\n }\n\n function preparePortBindings(config) {\n const bindings = ContainerHelper.preparePortBindings(config.HostConfig.PortBindings);\n config.ExposedPorts = {};\n _.forEach(bindings, (_, key) => (config.ExposedPorts[key] = {}));\n config.HostConfig.PortBindings = bindings;\n }\n\n function prepareConsole(config) {\n var value = $scope.formValues.Console;\n var openStdin = true;\n var tty = true;\n if (value === 'tty') {\n openStdin = false;\n } else if (value === 'interactive') {\n tty = false;\n } else if (value === 'none') {\n openStdin = false;\n tty = false;\n }\n config.OpenStdin = openStdin;\n config.Tty = tty;\n }\n\n function prepareCmd(config) {\n if (_.isEmpty(config.Cmd) || $scope.formValues.CmdMode == 'default') {\n delete config.Cmd;\n } else {\n config.Cmd = ContainerHelper.commandStringToArray(config.Cmd);\n }\n }\n\n function prepareEntrypoint(config) {\n if ($scope.formValues.EntrypointMode == 'default' || (_.isEmpty(config.Cmd) && _.isEmpty(config.Entrypoint))) {\n config.Entrypoint = null;\n }\n }\n\n function prepareEnvironmentVariables(config) {\n config.Env = envVarsUtils.convertToArrayOfStrings($scope.formValues.Env);\n }\n\n function prepareVolumes(config) {\n var binds = [];\n var volumes = {};\n\n $scope.formValues.Volumes.forEach(function (volume) {\n var name = volume.name;\n var containerPath = volume.containerPath;\n if (name && containerPath) {\n var bind = name + ':' + containerPath;\n volumes[containerPath] = {};\n if (volume.readOnly) {\n bind += ':ro';\n }\n binds.push(bind);\n }\n });\n config.HostConfig.Binds = binds;\n config.Volumes = volumes;\n }\n\n function prepareNetworkConfig(config) {\n var mode = config.HostConfig.NetworkMode;\n var container = $scope.formValues.NetworkContainer;\n var containerName = container;\n if (container && typeof container === 'object') {\n containerName = $filter('trimcontainername')(container.Names[0]);\n }\n var networkMode = mode;\n if (containerName) {\n networkMode += ':' + containerName;\n config.Hostname = '';\n }\n config.HostConfig.NetworkMode = networkMode;\n config.MacAddress = $scope.formValues.MacAddress;\n\n config.NetworkingConfig.EndpointsConfig[networkMode] = {\n IPAMConfig: {\n IPv4Address: $scope.formValues.IPv4,\n IPv6Address: $scope.formValues.IPv6,\n },\n };\n\n if (networkMode && _.get($scope.config.NetworkingConfig.EndpointsConfig[networkMode], 'Aliases')) {\n var aliases = $scope.config.NetworkingConfig.EndpointsConfig[networkMode].Aliases;\n config.NetworkingConfig.EndpointsConfig[networkMode].Aliases = _.filter(aliases, (o) => {\n return !_.startsWith($scope.fromContainer.Id, o);\n });\n }\n\n var dnsServers = [];\n if ($scope.formValues.DnsPrimary) {\n dnsServers.push($scope.formValues.DnsPrimary);\n }\n if ($scope.formValues.DnsSecondary) {\n dnsServers.push($scope.formValues.DnsSecondary);\n }\n config.HostConfig.Dns = dnsServers;\n\n config.HostConfig.ExtraHosts = _.map(\n _.filter($scope.formValues.ExtraHosts, (v) => v.value),\n 'value'\n );\n }\n\n function prepareLabels(config) {\n var labels = {};\n $scope.formValues.Labels.forEach(function (label) {\n if (label.name) {\n if (label.value) {\n labels[label.name] = label.value;\n } else {\n labels[label.name] = '';\n }\n }\n });\n config.Labels = labels;\n }\n\n function prepareDevices(config) {\n var path = [];\n config.HostConfig.Devices.forEach(function (p) {\n if (p.pathOnHost) {\n if (p.pathInContainer === '') {\n p.pathInContainer = p.pathOnHost;\n }\n path.push({ PathOnHost: p.pathOnHost, PathInContainer: p.pathInContainer, CgroupPermissions: 'rwm' });\n }\n });\n config.HostConfig.Devices = path;\n }\n\n function prepareSysctls(config) {\n var sysctls = {};\n $scope.formValues.Sysctls.forEach(function (sysctl) {\n if (sysctl.name && sysctl.value) {\n sysctls[sysctl.name] = sysctl.value;\n }\n });\n config.HostConfig.Sysctls = sysctls;\n }\n\n function prepareResources(config) {\n // Memory Limit - Round to 0.125\n if ($scope.formValues.MemoryLimit >= 0) {\n var memoryLimit = (Math.round($scope.formValues.MemoryLimit * 8) / 8).toFixed(3);\n memoryLimit *= 1024 * 1024;\n config.HostConfig.Memory = memoryLimit;\n }\n\n // Memory Resevation - Round to 0.125\n if ($scope.formValues.MemoryReservation >= 0) {\n var memoryReservation = (Math.round($scope.formValues.MemoryReservation * 8) / 8).toFixed(3);\n memoryReservation *= 1024 * 1024;\n config.HostConfig.MemoryReservation = memoryReservation;\n }\n\n // CPU Limit\n if ($scope.formValues.CpuLimit >= 0) {\n config.HostConfig.NanoCpus = $scope.formValues.CpuLimit * 1000000000;\n }\n }\n\n function prepareLogDriver(config) {\n var logOpts = {};\n if ($scope.formValues.LogDriverName) {\n config.HostConfig.LogConfig = { Type: $scope.formValues.LogDriverName };\n if ($scope.formValues.LogDriverName !== 'none') {\n $scope.formValues.LogDriverOpts.forEach(function (opt) {\n if (opt.name) {\n logOpts[opt.name] = opt.value;\n }\n });\n if (Object.keys(logOpts).length !== 0 && logOpts.constructor === Object) {\n config.HostConfig.LogConfig.Config = logOpts;\n }\n }\n }\n }\n\n function prepareCapabilities(config) {\n var allowed = $scope.formValues.capabilities.filter(function (item) {\n return item.allowed === true;\n });\n var notAllowed = $scope.formValues.capabilities.filter(function (item) {\n return item.allowed === false;\n });\n\n var getCapName = function (item) {\n return item.capability;\n };\n config.HostConfig.CapAdd = allowed.map(getCapName);\n config.HostConfig.CapDrop = notAllowed.map(getCapName);\n }\n\n function prepareConfiguration() {\n var config = angular.copy($scope.config);\n prepareCmd(config);\n prepareEntrypoint(config);\n prepareNetworkConfig(config);\n prepareImageConfig(config);\n preparePortBindings(config);\n prepareConsole(config);\n prepareEnvironmentVariables(config);\n prepareVolumes(config);\n prepareLabels(config);\n prepareDevices(config);\n prepareResources(config);\n prepareLogDriver(config);\n prepareCapabilities(config);\n prepareSysctls(config);\n return config;\n }\n\n function loadFromContainerCmd() {\n if ($scope.config.Cmd) {\n $scope.config.Cmd = ContainerHelper.commandArrayToString($scope.config.Cmd);\n $scope.formValues.CmdMode = 'override';\n }\n }\n\n function loadFromContainerEntrypoint() {\n if (_.has($scope.config, 'Entrypoint')) {\n if ($scope.config.Entrypoint == null) {\n $scope.config.Entrypoint = '';\n }\n $scope.formValues.EntrypointMode = 'override';\n }\n }\n\n function loadFromContainerPortBindings() {\n const bindings = ContainerHelper.sortAndCombinePorts($scope.config.HostConfig.PortBindings);\n $scope.config.HostConfig.PortBindings = bindings;\n }\n\n function loadFromContainerVolumes(d) {\n for (var v in d.Mounts) {\n if ({}.hasOwnProperty.call(d.Mounts, v)) {\n var mount = d.Mounts[v];\n var volume = {\n type: mount.Type,\n name: mount.Name || mount.Source,\n containerPath: mount.Destination,\n readOnly: mount.RW === false,\n };\n $scope.formValues.Volumes.push(volume);\n }\n }\n }\n\n $scope.resetNetworkConfig = function () {\n $scope.config.NetworkingConfig = {\n EndpointsConfig: {},\n };\n };\n\n function loadFromContainerNetworkConfig(d) {\n $scope.config.NetworkingConfig = {\n EndpointsConfig: {},\n };\n var networkMode = d.HostConfig.NetworkMode;\n if (networkMode === 'default') {\n $scope.config.HostConfig.NetworkMode = 'bridge';\n if (!_.find($scope.availableNetworks, { Name: 'bridge' })) {\n $scope.config.HostConfig.NetworkMode = 'nat';\n }\n }\n if ($scope.config.HostConfig.NetworkMode.indexOf('container:') === 0) {\n var netContainer = $scope.config.HostConfig.NetworkMode.split(/^container:/)[1];\n $scope.config.HostConfig.NetworkMode = 'container';\n for (var c in $scope.runningContainers) {\n if ($scope.runningContainers[c].Id == netContainer) {\n $scope.formValues.NetworkContainer = $scope.runningContainers[c];\n }\n }\n }\n $scope.fromContainerMultipleNetworks = Object.keys(d.NetworkSettings.Networks).length >= 2;\n if (d.NetworkSettings.Networks[$scope.config.HostConfig.NetworkMode]) {\n if (d.NetworkSettings.Networks[$scope.config.HostConfig.NetworkMode].IPAMConfig) {\n if (d.NetworkSettings.Networks[$scope.config.HostConfig.NetworkMode].IPAMConfig.IPv4Address) {\n $scope.formValues.IPv4 = d.NetworkSettings.Networks[$scope.config.HostConfig.NetworkMode].IPAMConfig.IPv4Address;\n }\n if (d.NetworkSettings.Networks[$scope.config.HostConfig.NetworkMode].IPAMConfig.IPv6Address) {\n $scope.formValues.IPv6 = d.NetworkSettings.Networks[$scope.config.HostConfig.NetworkMode].IPAMConfig.IPv6Address;\n }\n }\n }\n $scope.config.NetworkingConfig.EndpointsConfig[$scope.config.HostConfig.NetworkMode] = d.NetworkSettings.Networks[$scope.config.HostConfig.NetworkMode];\n if (Object.keys(d.NetworkSettings.Networks).length > 1) {\n var firstNetwork = d.NetworkSettings.Networks[Object.keys(d.NetworkSettings.Networks)[0]];\n $scope.config.NetworkingConfig.EndpointsConfig[$scope.config.HostConfig.NetworkMode] = firstNetwork;\n $scope.extraNetworks = angular.copy(d.NetworkSettings.Networks);\n delete $scope.extraNetworks[Object.keys(d.NetworkSettings.Networks)[0]];\n }\n $scope.formValues.MacAddress = d.Config.MacAddress;\n\n if (d.HostConfig.Dns && d.HostConfig.Dns[0]) {\n $scope.formValues.DnsPrimary = d.HostConfig.Dns[0];\n if (d.HostConfig.Dns[1]) {\n $scope.formValues.DnsSecondary = d.HostConfig.Dns[1];\n }\n }\n\n // ExtraHosts\n if ($scope.config.HostConfig.ExtraHosts) {\n var extraHosts = $scope.config.HostConfig.ExtraHosts;\n for (var i = 0; i < extraHosts.length; i++) {\n var host = extraHosts[i];\n $scope.formValues.ExtraHosts.push({ value: host });\n }\n $scope.config.HostConfig.ExtraHosts = [];\n }\n }\n\n function loadFromContainerEnvironmentVariables() {\n $scope.formValues.Env = envVarsUtils.parseArrayOfStrings($scope.config.Env);\n }\n\n function loadFromContainerLabels() {\n for (var l in $scope.config.Labels) {\n if ({}.hasOwnProperty.call($scope.config.Labels, l)) {\n $scope.formValues.Labels.push({ name: l, value: $scope.config.Labels[l] });\n }\n }\n }\n\n function loadFromContainerConsole() {\n if ($scope.config.OpenStdin && $scope.config.Tty) {\n $scope.formValues.Console = 'both';\n } else if (!$scope.config.OpenStdin && $scope.config.Tty) {\n $scope.formValues.Console = 'tty';\n } else if ($scope.config.OpenStdin && !$scope.config.Tty) {\n $scope.formValues.Console = 'interactive';\n } else if (!$scope.config.OpenStdin && !$scope.config.Tty) {\n $scope.formValues.Console = 'none';\n }\n }\n\n function loadFromContainerDevices() {\n var path = [];\n for (var dev in $scope.config.HostConfig.Devices) {\n if ({}.hasOwnProperty.call($scope.config.HostConfig.Devices, dev)) {\n var device = $scope.config.HostConfig.Devices[dev];\n path.push({ pathOnHost: device.PathOnHost, pathInContainer: device.PathInContainer });\n }\n }\n $scope.config.HostConfig.Devices = path;\n }\n\n function loadFromContainerSysctls() {\n for (var s in $scope.config.HostConfig.Sysctls) {\n if ({}.hasOwnProperty.call($scope.config.HostConfig.Sysctls, s)) {\n $scope.formValues.Sysctls.push({ name: s, value: $scope.config.HostConfig.Sysctls[s] });\n }\n }\n }\n\n function loadFromContainerImageConfig() {\n RegistryService.retrievePorRegistryModelFromRepository($scope.config.Image, endpoint.Id)\n .then((model) => {\n $scope.formValues.RegistryModel = model;\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve registry');\n });\n }\n\n function loadFromContainerResources(d) {\n if (d.HostConfig.NanoCpus) {\n $scope.formValues.CpuLimit = d.HostConfig.NanoCpus / 1000000000;\n }\n if (d.HostConfig.Memory) {\n $scope.formValues.MemoryLimit = d.HostConfig.Memory / 1024 / 1024;\n }\n if (d.HostConfig.MemoryReservation) {\n $scope.formValues.MemoryReservation = d.HostConfig.MemoryReservation / 1024 / 1024;\n }\n }\n\n function loadFromContainerCapabilities(d) {\n if (d.HostConfig.CapAdd) {\n d.HostConfig.CapAdd.forEach(function (cap) {\n $scope.formValues.capabilities.push(new ContainerCapability(cap, true));\n });\n }\n if (d.HostConfig.CapDrop) {\n d.HostConfig.CapDrop.forEach(function (cap) {\n $scope.formValues.capabilities.push(new ContainerCapability(cap, false));\n });\n }\n\n function hasCapability(item) {\n return item.capability === cap.capability;\n }\n\n var capabilities = new ContainerCapabilities();\n for (var i = 0; i < capabilities.length; i++) {\n var cap = capabilities[i];\n if (!_.find($scope.formValues.capabilities, hasCapability)) {\n $scope.formValues.capabilities.push(cap);\n }\n }\n\n $scope.formValues.capabilities.sort(function (a, b) {\n return a.capability < b.capability ? -1 : 1;\n });\n }\n\n function loadFromContainerSpec() {\n // Get container\n Container.get({ id: $transition$.params().from })\n .$promise.then(function success(d) {\n var fromContainer = new ContainerDetailsViewModel(d);\n if (fromContainer.ResourceControl && fromContainer.ResourceControl.Public) {\n $scope.formValues.AccessControlData.AccessControlEnabled = false;\n }\n $scope.fromContainer = fromContainer;\n $scope.state.mode = 'duplicate';\n $scope.config = ContainerHelper.configFromContainer(fromContainer.Model);\n loadFromContainerCmd(d);\n loadFromContainerEntrypoint(d);\n loadFromContainerLogging(d);\n loadFromContainerPortBindings(d);\n loadFromContainerVolumes(d);\n loadFromContainerNetworkConfig(d);\n loadFromContainerEnvironmentVariables(d);\n loadFromContainerLabels(d);\n loadFromContainerConsole(d);\n loadFromContainerDevices(d);\n loadFromContainerImageConfig(d);\n loadFromContainerResources(d);\n loadFromContainerCapabilities(d);\n loadFromContainerSysctls(d);\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve container');\n });\n }\n\n function loadFromContainerLogging(config) {\n var logConfig = config.HostConfig.LogConfig;\n $scope.formValues.LogDriverName = logConfig.Type;\n $scope.formValues.LogDriverOpts = _.map(logConfig.Config, function (value, name) {\n return {\n name: name,\n value: value,\n };\n });\n }\n\n async function initView() {\n var nodeName = $transition$.params().nodeName;\n $scope.formValues.NodeName = nodeName;\n HttpRequestHelper.setPortainerAgentTargetHeader(nodeName);\n\n $scope.isAdmin = Authentication.isAdmin();\n $scope.showDeviceMapping = await shouldShowDevices();\n $scope.showSysctls = await shouldShowSysctls();\n $scope.areContainerCapabilitiesEnabled = await checkIfContainerCapabilitiesEnabled();\n $scope.isAdminOrEndpointAdmin = Authentication.isAdmin();\n\n Volume.query(\n {},\n function (d) {\n $scope.availableVolumes = d.Volumes.sort((vol1, vol2) => {\n return vol1.Name.localeCompare(vol2.Name);\n });\n },\n function (e) {\n Notifications.error('Failure', e, 'Unable to retrieve volumes');\n }\n );\n\n var provider = $scope.applicationState.endpoint.mode.provider;\n var apiVersion = $scope.applicationState.endpoint.apiVersion;\n NetworkService.networks(provider === 'DOCKER_STANDALONE' || provider === 'DOCKER_SWARM_MODE', false, provider === 'DOCKER_SWARM_MODE' && apiVersion >= 1.25)\n .then(function success(networks) {\n networks.push({ Name: 'container' });\n $scope.availableNetworks = networks.sort((a, b) => a.Name.localeCompare(b.Name));\n\n if (_.find(networks, { Name: 'nat' })) {\n $scope.config.HostConfig.NetworkMode = 'nat';\n }\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve networks');\n });\n\n Container.query(\n {},\n function (d) {\n var containers = d;\n $scope.runningContainers = containers;\n if ($transition$.params().from) {\n loadFromContainerSpec();\n } else {\n $scope.fromContainer = {};\n $scope.formValues.capabilities = $scope.areContainerCapabilitiesEnabled ? new ContainerCapabilities() : [];\n }\n },\n function (e) {\n Notifications.error('Failure', e, 'Unable to retrieve running containers');\n }\n );\n\n SystemService.info()\n .then(function success(data) {\n $scope.availableRuntimes = data.Runtimes ? Object.keys(data.Runtimes) : [];\n $scope.state.sliderMaxCpu = 32;\n if (data.NCPU) {\n $scope.state.sliderMaxCpu = data.NCPU;\n }\n $scope.state.sliderMaxMemory = 32768;\n if (data.MemTotal) {\n $scope.state.sliderMaxMemory = Math.floor(data.MemTotal / 1000 / 1000);\n }\n })\n .catch(function error(err) {\n Notifications.error('Failure', err, 'Unable to retrieve engine details');\n });\n\n $scope.allowBindMounts = $scope.isAdminOrEndpointAdmin || endpoint.SecuritySettings.allowBindMountsForRegularUsers;\n $scope.allowPrivilegedMode = endpoint.SecuritySettings.allowPrivilegedModeForRegularUsers;\n\n PluginService.loggingPlugins(apiVersion < 1.25).then(function success(loggingDrivers) {\n $scope.availableLoggingDrivers = loggingDrivers;\n });\n }\n\n function validateForm(accessControlData, isAdmin) {\n $scope.state.formValidationError = '';\n var error = '';\n error = FormValidator.validateAccessControl(accessControlData, isAdmin);\n\n if (error) {\n $scope.state.formValidationError = error;\n return false;\n }\n return true;\n }\n\n $scope.handleResourceChange = handleResourceChange;\n function handleResourceChange() {\n $scope.state.settingUnlimitedResources = false;\n if (\n ($scope.config.HostConfig.Memory > 0 && $scope.formValues.MemoryLimit === 0) ||\n ($scope.config.HostConfig.MemoryReservation > 0 && $scope.formValues.MemoryReservation === 0) ||\n ($scope.config.HostConfig.NanoCpus > 0 && $scope.formValues.CpuLimit === 0)\n ) {\n $scope.state.settingUnlimitedResources = true;\n }\n }\n\n async function updateLimits(config) {\n try {\n if ($scope.state.settingUnlimitedResources) {\n create();\n } else {\n await ContainerService.updateLimits($transition$.params().from, config);\n $scope.config = config;\n Notifications.success('Limits updated');\n }\n } catch (err) {\n Notifications.error('Failure', err, 'Update Limits fail');\n }\n }\n\n async function update() {\n $scope.state.actionInProgress = true;\n var config = angular.copy($scope.config);\n prepareResources(config);\n await updateLimits(config);\n $scope.state.actionInProgress = false;\n }\n\n function create() {\n var oldContainer = null;\n HttpRequestHelper.setPortainerAgentTargetHeader($scope.formValues.NodeName);\n return findCurrentContainer().then(setOldContainer).then(confirmCreateContainer).then(startCreationProcess).catch(notifyOnError).finally(final);\n\n function final() {\n $scope.state.actionInProgress = false;\n }\n\n function setOldContainer(container) {\n oldContainer = container;\n return container;\n }\n\n function findCurrentContainer() {\n return Container.query({ all: 1, filters: { name: ['^/' + $scope.config.name + '$'] } })\n .$promise.then(function onQuerySuccess(containers) {\n if (!containers.length) {\n return;\n }\n return containers[0];\n })\n .catch(notifyOnError);\n\n function notifyOnError(err) {\n Notifications.error('Failure', err, 'Unable to retrieve containers');\n }\n }\n\n function startCreationProcess(confirmed) {\n if (!confirmed) {\n return $q.when();\n }\n if (!validateAccessControl()) {\n return $q.when();\n }\n $scope.state.actionInProgress = true;\n return pullImageIfNeeded()\n .then(stopAndRenameContainer)\n .then(createNewContainer)\n .then(applyResourceControl)\n .then(connectToExtraNetworks)\n .then(removeOldContainer)\n .then(onSuccess)\n .catch(onCreationProcessFail);\n }\n\n function onCreationProcessFail(error) {\n var deferred = $q.defer();\n removeNewContainer()\n .then(restoreOldContainerName)\n .then(function () {\n deferred.reject(error);\n })\n .catch(function (restoreError) {\n deferred.reject(restoreError);\n });\n return deferred.promise;\n }\n\n function removeNewContainer() {\n return findCurrentContainer().then(function onContainerLoaded(container) {\n if (container && (!oldContainer || container.Id !== oldContainer.Id)) {\n return ContainerService.remove(container, true);\n }\n });\n }\n\n function restoreOldContainerName() {\n if (!oldContainer) {\n return;\n }\n return ContainerService.renameContainer(oldContainer.Id, oldContainer.Names[0].substring(1));\n }\n\n function confirmCreateContainer(container) {\n if (!container) {\n return $q.when(true);\n }\n\n return showConfirmationModal();\n\n function showConfirmationModal() {\n var deferred = $q.defer();\n\n ModalService.confirm({\n title: 'Are you sure ?',\n message: 'A container with the same name already exists. Portainer can automatically remove it and re-create one. Do you want to replace it?',\n buttons: {\n confirm: {\n label: 'Replace',\n className: 'btn-danger',\n },\n },\n callback: function onConfirm(confirmed) {\n deferred.resolve(confirmed);\n },\n });\n\n return deferred.promise;\n }\n }\n\n function stopAndRenameContainer() {\n if (!oldContainer) {\n return $q.when();\n }\n return stopContainerIfNeeded(oldContainer).then(renameContainer);\n }\n\n function stopContainerIfNeeded(oldContainer) {\n if (oldContainer.State !== 'running') {\n return $q.when();\n }\n return ContainerService.stopContainer(oldContainer.Id);\n }\n\n function renameContainer() {\n return ContainerService.renameContainer(oldContainer.Id, oldContainer.Names[0].substring(1) + '-old');\n }\n\n function pullImageIfNeeded() {\n return $q.when($scope.formValues.alwaysPull && ImageService.pullImage($scope.formValues.RegistryModel, true));\n }\n\n function createNewContainer() {\n return $async(async () => {\n const config = prepareConfiguration();\n return await ContainerService.createAndStartContainer(config);\n });\n }\n\n function applyResourceControl(newContainer) {\n const userId = Authentication.getUserDetails().ID;\n const resourceControl = newContainer.Portainer.ResourceControl;\n const containerId = newContainer.Id;\n const accessControlData = $scope.formValues.AccessControlData;\n\n return ResourceControlService.applyResourceControl(userId, accessControlData, resourceControl).then(function onApplyResourceControlSuccess() {\n return containerId;\n });\n }\n\n function connectToExtraNetworks(newContainerId) {\n if (!$scope.extraNetworks) {\n return $q.when();\n }\n\n var connectionPromises = _.forOwn($scope.extraNetworks, function (network, networkName) {\n if (_.has(network, 'Aliases')) {\n var aliases = _.filter(network.Aliases, (o) => {\n return !_.startsWith($scope.fromContainer.Id, o);\n });\n }\n return NetworkService.connectContainer(networkName, newContainerId, aliases);\n });\n\n return $q.all(connectionPromises);\n }\n\n function removeOldContainer() {\n var deferred = $q.defer();\n\n if (!oldContainer) {\n deferred.resolve();\n return;\n }\n\n ContainerService.remove(oldContainer, true).then(notifyOnRemoval).catch(notifyOnRemoveError);\n\n return deferred.promise;\n\n function notifyOnRemoval() {\n Notifications.success('Container Removed', oldContainer.Id);\n deferred.resolve();\n }\n\n function notifyOnRemoveError(err) {\n deferred.reject({ msg: 'Unable to remove container', err: err });\n }\n }\n\n function notifyOnError(err) {\n Notifications.error('Failure', err, 'Unable to create container');\n }\n\n function validateAccessControl() {\n var accessControlData = $scope.formValues.AccessControlData;\n return validateForm(accessControlData, $scope.isAdmin);\n }\n\n function onSuccess() {\n Notifications.success('Container successfully created');\n $state.go('docker.containers', {}, { reload: true });\n }\n }\n\n async function shouldShowDevices() {\n return endpoint.SecuritySettings.allowDeviceMappingForRegularUsers || Authentication.isAdmin();\n }\n\n async function shouldShowSysctls() {\n return endpoint.SecuritySettings.allowSysctlSettingForRegularUsers || Authentication.isAdmin();\n }\n\n async function checkIfContainerCapabilitiesEnabled() {\n return endpoint.SecuritySettings.allowContainerCapabilitiesForRegularUsers || Authentication.isAdmin();\n }\n\n initView();\n },\n]);\n","const autoNgTemplateLoaderTemplate1 = require('./edgeJobResultsDatatable.html');\n\nimport angular from 'angular';\n\nimport { EdgeJobResultsDatatableController } from './edgeJobResultsDatatableController';\nimport './edgeJobResultsDatatable.css';\n\nangular.module('portainer.edge').component('edgeJobResultsDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: EdgeJobResultsDatatableController,\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n onDownloadLogsClick: '<',\n onCollectLogsClick: '<',\n onClearLogsClick: '<',\n refreshCallback: '<',\n },\n});\n","const autoNgTemplateLoaderTemplate1 = require('./edgeStackStatus.html');\n\nimport angular from 'angular';\n\nimport { EdgeStackStatusController } from './edgeStackStatusController';\nimport './edgeStackStatus.css';\n\nangular.module('portainer.edge').component('edgeStackStatus', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: EdgeStackStatusController,\n bindings: {\n stackStatus: '<',\n },\n});\n","const autoNgTemplateLoaderTemplate1 = require('./applications-datatable-url.html');\n\nimport angular from 'angular';\nimport './applications-datatable-url.css';\n\nangular.module('portainer.kubernetes').component('kubernetesApplicationsDatatableUrl', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n publishedUrl: '@',\n },\n});\n","const autoNgTemplateLoaderTemplate1 = require('./applicationsDatatable.html');\n\nimport './applicationsDatatable.css';\n\nangular.module('portainer.kubernetes').component('kubernetesApplicationsDatatable', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller: 'KubernetesApplicationsDatatableController',\n bindings: {\n titleText: '@',\n titleIcon: '@',\n dataset: '<',\n tableKey: '@',\n settingsKey: '@',\n orderBy: '@',\n reverseOrder: '<',\n removeAction: '<',\n refreshCallback: '<',\n onPublishingModeClick: '<',\n isPrimary: '<',\n },\n});\n","const autoNgTemplateLoaderTemplate1 = require('./helm-templates-list-item.html');\n\nimport angular from 'angular';\nimport './helm-templates-list-item.css';\n\nangular.module('portainer.kubernetes').component('helmTemplatesListItem', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n model: '<',\n onSelect: '<',\n },\n transclude: {\n actions: '?templateItemActions',\n },\n});\n","const autoNgTemplateLoaderTemplate1 = require('./kubectl-shell.html');\n\nimport angular from 'angular';\nimport controller from './kubectl-shell.controller';\nimport './kubectl-shell.css';\n\nangular.module('portainer.kubernetes').component('kubectlShell', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n});\n","const autoNgTemplateLoaderTemplate1 = require('./helm.html');\n\nimport angular from 'angular';\nimport controller from './helm.controller';\nimport './helm.css';\n\nangular.module('portainer.kubernetes').component('kubernetesHelmApplicationView', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n endpoint: '<',\n },\n});\n","const autoNgTemplateLoaderTemplate1 = require('./be-feature-indicator.html');\n\nimport angular from 'angular';\nimport controller from './be-feature-indicator.controller.js';\n\nimport './be-feature-indicator.css';\n\nexport const beFeatureIndicator = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n feature: '<',\n },\n transclude: true,\n};\n\nangular.module('portainer.app').component('beFeatureIndicator', beFeatureIndicator);\n","const autoNgTemplateLoaderTemplate1 = require('./box-selector-item.html');\n\nimport angular from 'angular';\n\nimport './box-selector-item.css';\n\nimport controller from './box-selector-item.controller';\n\nangular.module('portainer.app').component('boxSelectorItem', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n require: {\n formCtrl: '^^form',\n },\n bindings: {\n radioName: '@',\n isChecked: '<',\n option: '<',\n onChange: '<',\n disabled: '<',\n tooltip: '<',\n },\n});\n","const autoNgTemplateLoaderTemplate1 = require('./copy-button.html');\n\nimport angular from 'angular';\nimport controller from './copy-button.controller';\nimport './copy-button.css';\n\nangular.module('portainer.app').component('copyButton', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n value: '<',\n },\n});\n","const autoNgTemplateLoaderTemplate1 = require('./environment-variables-simple-mode.html');\n\nimport angular from 'angular';\n\nimport './environment-variables-simple-mode.css';\n\nimport controller from './environment-variables-simple-mode.controller';\n\nangular.module('portainer.app').component('environmentVariablesSimpleMode', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n ngModel: '<',\n onSwitchModeClick: '<',\n onChange: '<',\n },\n});\n","const autoNgTemplateLoaderTemplate1 = require('./environment-variables-panel.html');\n\nimport angular from 'angular';\n\nimport './environment-variables-panel.css';\n\nimport controller from './environment-variables-panel.controller.js';\n\nangular.module('portainer.app').component('environmentVariablesPanel', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n ngModel: '<',\n explanation: '@',\n onChange: '<',\n },\n});\n","const autoNgTemplateLoaderTemplate1 = require('./por-switch.html');\n\nimport angular from 'angular';\nimport controller from './por-switch.controller';\n\nimport './por-switch.css';\n\nconst porSwitch = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n bindings: {\n ngModel: '=',\n id: '@',\n className: '@',\n name: '@',\n ngDataCy: '@',\n disabled: '<',\n onChange: '<',\n feature: '<', // feature id\n },\n};\n\nangular.module('portainer.app').component('porSwitch', porSwitch);\n","const autoNgTemplateLoaderTemplate1 = require('./sensitive-details.html');\n\nimport angular from 'angular';\nimport './sensitive-details.css';\n\nangular.module('portainer.app').component('sensitiveDetails', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n key: '@',\n value: '@',\n },\n});\n","const autoNgTemplateLoaderTemplate1 = require('./status-indicator.html');\n\nimport angular from 'angular';\n\nimport './status-indicator.css';\n\nexport const statusIndicator = {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n ok: '<',\n },\n};\n\nangular.module('portainer.app').component('statusIndicator', statusIndicator);\n","const autoNgTemplateLoaderTemplate1 = require('./templateItem.html');\n\nimport angular from 'angular';\n\nimport './template-item.css';\n\nangular.module('portainer.app').component('templateItem', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n model: '<',\n typeLabel: '@',\n onSelect: '<',\n },\n transclude: {\n actions: '?templateItemActions',\n },\n});\n","const autoNgTemplateLoaderTemplate1 = require('./wizard-endpoints.html');\n\nimport angular from 'angular';\nimport controller from './wizard-endpoints.controller.js';\nimport './wizard-endpoints.css';\n\nangular.module('portainer.app').component('wizardEndpoints', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n controller,\n});\n","const autoNgTemplateLoaderTemplate1 = require('./wizard-endpoint-list.html');\n\nimport angular from 'angular';\nimport './wizard-endpoint-list.css';\n\nangular.module('portainer.app').component('wizardEndpointList', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n endpointList: '<',\n },\n});\n","const autoNgTemplateLoaderTemplate1 = require('./wizard-stepper.html');\n\nimport angular from 'angular';\nimport './wizard-stepper.css';\n\nangular.module('portainer.app').component('wizardStepper', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n endpointSelections: '<',\n },\n});\n","const autoNgTemplateLoaderTemplate1 = require('./wizard-link.html');\n\nimport angular from 'angular';\nimport './wizard-link.css';\n\nangular.module('portainer.app').component('wizardLink', {\n templateUrl: autoNgTemplateLoaderTemplate1,\n bindings: {\n linkTitle: '@',\n description: '@',\n icon: '<',\n },\n});\n"],"sourceRoot":""}