2020-07-05 23:21:03 +00:00
< div class = "datatable" >
2022-07-13 09:21:26 +00:00
<!-- toolbar header actions and settings -->
2023-03-22 19:20:30 +00:00
< div ng-if = "$ctrl.isPrimary" class = "toolBar !flex-col !gap-0" >
< div class = "toolBar w-full !items-start !gap-x-5 !p-0" >
2022-07-13 09:21:26 +00:00
< div class = "toolBarTitle vertical-center" >
2022-08-10 04:12:20 +00:00
< div class = "widget-icon space-right" >
2022-11-28 02:00:28 +00:00
< pr-icon icon = "'box'" > < / pr-icon >
2022-08-10 04:12:20 +00:00
< / div >
2022-07-13 09:21:26 +00:00
Applications
2020-07-05 23:21:03 +00:00
< / div >
2023-03-22 19:20:30 +00:00
<!-- use row reverse to make the left most items wrap first to the right side in the next line -->
< div class = "inline-flex flex-row-reverse flex-wrap !gap-x-5 gap-y-3" >
< div class = "settings" data-cy = "k8sApp-tableSettings" >
< span class = "setting" ng-class = "{ 'setting-active': $ctrl.settings.open }" uib-dropdown dropdown-append-to-body auto-close = "disabled" is-open = "$ctrl.settings.open" >
< span uib-dropdown-toggle aria-label = "Settings" >
< pr-icon icon = "'more-vertical'" class-name = "'!mr-0 !h-4'" > < / pr-icon >
< / span >
< div class = "dropdown-menu dropdown-menu-right" uib-dropdown-menu >
< div class = "tableMenu" >
< div class = "menuHeader" > Table settings < / div >
< div class = "menuContent" >
< div >
< div class = "md-checkbox" ng-if = "$ctrl.isAdmin" >
< input id = "applications_setting_show_system" type = "checkbox" ng-model = "$ctrl.settings.showSystem" ng-change = "$ctrl.onSettingsShowSystemChange()" / >
< label for = "applications_setting_show_system" > Show system resources< / label >
< / div >
< div class = "md-checkbox" >
< input
id="setting_auto_refresh"
type="checkbox"
ng-model="$ctrl.settings.repeater.autoRefresh"
ng-change="$ctrl.onSettingsRepeaterChange()"
data-cy="k8sApp-autoRefreshCheckbox"
/>
< label for = "setting_auto_refresh" > Auto refresh< / label >
< / div >
< div ng-if = "$ctrl.settings.repeater.autoRefresh" >
< label for = "settings_refresh_rate" > Refresh rate < / label >
< select
id="settings_refresh_rate"
ng-model="$ctrl.settings.repeater.refreshRate"
ng-change="$ctrl.onSettingsRepeaterChange()"
class="small-select"
data-cy="k8sApp-refreshRateDropdown"
>
< option value = "10" > 10s< / option >
< option value = "30" > 30s< / option >
< option value = "60" > 1min< / option >
< option value = "120" > 2min< / option >
< option value = "300" > 5min< / option >
< / select >
< span >
< pr-icon id = "refreshRateChange" icon = "'check'" mode = "'success'" style = "display: none" > < / pr-icon >
< / span >
< / div >
2022-07-13 09:21:26 +00:00
< / div >
2021-09-30 02:53:03 +00:00
< / div >
2023-03-22 19:20:30 +00:00
< div >
< a type = "button" class = "btn btn-sm btn-default btn-sm" ng-click = "$ctrl.settings.open = false;" data-cy = "k8sApp-tableSettingsCloseButton" > Close< / a >
< / div >
2022-07-13 09:21:26 +00:00
< / div >
< / div >
2023-03-22 19:20:30 +00:00
< / span >
< / div >
< div class = "actionBar !mr-0 !gap-3" >
< button
ng-if="$ctrl.isPrimary"
type="button"
class="btn btn-sm btn-dangerlight vertical-center !ml-0 h-fit"
ng-disabled="$ctrl.state.selectedItemCount === 0"
ng-click="$ctrl.removeAction($ctrl.state.selectedItems)"
data-cy="k8sApp-removeAppButton"
>
< pr-icon icon = "'trash-2'" > < / pr-icon >
Remove
< / button >
< button
ng-if="$ctrl.isPrimary"
hide-deployment-option="form"
type="button"
class="btn btn-sm btn-secondary vertical-center !ml-0 h-fit"
ui-sref="kubernetes.applications.new"
data-cy="k8sApp-addApplicationButton"
>
< pr-icon icon = "'plus'" class-name = "'!h-3'" > < / pr-icon > Add with form
< / button >
< button
ng-if="$ctrl.isPrimary"
type="button"
class="btn btn-sm btn-primary vertical-center !ml-0 h-fit"
2023-04-25 23:23:15 +00:00
ui-sref="kubernetes.deploy({ referrer: 'kubernetes.applications' })"
2023-03-22 19:20:30 +00:00
data-cy="k8sApp-deployFromManifestButton"
>
< pr-icon icon = "'plus'" class-name = "'!h-3'" > < / pr-icon > Create from manifest
< / button >
< / div >
< div class = "searchBar" >
< pr-icon icon = "'search'" class-name = "'searchIcon'" > < / pr-icon >
< input
type="text"
class="searchInput"
ng-model="$ctrl.state.textFilter"
ng-change="$ctrl.onTextFilterChange()"
placeholder="Search..."
auto-focus
ng-model-options="{ debounce: 300 }"
data-cy="k8sApp-searchApplicationsInput"
/>
< / div >
< div class = "form-group namespaces !mb-0 !mr-0 !h-[30px] min-w-[140px]" >
< div class = "input-group" >
< span class = "input-group-addon" >
< pr-icon icon = "'filter'" size = "'sm'" > < / pr-icon >
Namespace
< / span >
< select
class="form-control !h-[30px] !py-1"
ng-model="$ctrl.state.namespace"
ng-change="$ctrl.onChangeNamespace()"
data-cy="component-namespaceSelect"
ng-options="o.Value as (o.Name + (o.IsSystem ? ' - system' : '')) for o in $ctrl.state.namespaces"
>
< / select >
2022-07-13 09:21:26 +00:00
< / div >
2023-03-22 19:20:30 +00:00
< / div >
2022-07-13 09:21:26 +00:00
< / div >
< / div >
2023-02-12 21:04:24 +00:00
< div class = "flex w-full flex-row" ng-if = "$ctrl.isAdmin && !$ctrl.settings.showSystem" >
< span class = "small text-muted vertical-center mt-1" >
2023-03-22 19:20:30 +00:00
< pr-icon icon = "'info'" mode = "'primary'" > < / pr-icon >
2022-08-12 18:22:45 +00:00
System resources are hidden, this can be changed in the table settings.
2022-07-13 09:21:26 +00:00
< / span >
< / div >
2023-03-22 19:20:30 +00:00
< div class = "w-full" >
< div class = "w-fit" >
< insights-box class-name = "'mt-2'" type = "'slim'" header = "'From 2.18 on, you can filter this view by namespace.'" insight-close-id = "'k8s-namespace-filtering'" > < / insights-box >
< / div >
< / div >
2022-07-13 09:21:26 +00:00
< / div >
<!-- data table content -->
2022-08-16 17:59:01 +00:00
< div ng-class = "{ 'table-responsive': $ctrl.isPrimary, 'inner-datatable': !$ctrl.isPrimary }" >
2023-02-12 21:04:24 +00:00
< table class = "table-hover table-filters nowrap-cells table" data-cy = "k8sApp-appTable" >
2022-07-13 09:21:26 +00:00
< thead ng-class = "{ 'secondary-heading': !$ctrl.isPrimary }" >
< tr role = "row" >
< th role = "columnheader" class = "datatable-wide dropdown" >
2023-02-12 21:04:24 +00:00
< div ng-if = "$ctrl.isPrimary" class = "no-wrap flex min-w-max" >
2022-07-13 09:21:26 +00:00
< span class = "md-checkbox vertical-center" >
< input id = "select_all" type = "checkbox" ng-model = "$ctrl.state.selectAll" ng-change = "$ctrl.selectAll()" data-cy = "k8sApp-selectAllCheckbox" / >
< label for = "select_all" > < / label >
< / span >
2023-02-12 21:04:24 +00:00
< div class = "vertical-center cursor-pointer" ng-click = "$ctrl.expandAll()" >
2022-11-28 02:00:28 +00:00
< pr-icon ng-if = "$ctrl.state.expandAll" icon = "'chevron-down'" > < / pr-icon >
< pr-icon ng-if = "!$ctrl.state.expandAll" icon = "'chevron-right'" > < / pr-icon >
2022-07-13 09:21:26 +00:00
< / div >
< / div >
< / th >
< th >
< table-column-header
col-title="'Name'"
can-sort="true"
is-sorted="$ctrl.state.orderBy === 'Name'"
is-sorted-desc="$ctrl.state.orderBy === 'Name' & & $ctrl.state.reverseOrder"
ng-click="$ctrl.changeOrderBy('Name')"
>< / table-column-header >
< / th >
< th >
< table-column-header
col-title="'Stack'"
can-sort="true"
is-sorted="$ctrl.state.orderBy === 'StackName'"
is-sorted-desc="$ctrl.state.orderBy === 'StackName' & & $ctrl.state.reverseOrder"
ng-click="$ctrl.changeOrderBy('StackName')"
>< / table-column-header >
< / th >
< th >
< table-column-header
col-title="'Namespace'"
can-sort="true"
is-sorted="$ctrl.state.orderBy === 'ResourcePool'"
is-sorted-desc="$ctrl.state.orderBy === 'ResourcePool' & & $ctrl.state.reverseOrder"
ng-click="$ctrl.changeOrderBy('ResourcePool')"
>< / table-column-header >
< / th >
< th >
< table-column-header
col-title="'Image'"
can-sort="true"
is-sorted="$ctrl.state.orderBy === 'Image'"
is-sorted-desc="$ctrl.state.orderBy === 'Image' & & $ctrl.state.reverseOrder"
ng-click="$ctrl.changeOrderBy('Image')"
>< / table-column-header >
< / th >
< th uib-dropdown dropdown-append-to-body auto-close = "disabled" is-open = "$ctrl.filters.state.open" >
2023-02-12 21:04:24 +00:00
< div class = "no-wrap flex flex-row gap-2" >
2022-07-13 09:21:26 +00:00
< table-column-header
col-title="'Application Type'"
can-sort="true"
is-sorted="$ctrl.state.orderBy === 'ApplicationType'"
is-sorted-desc="$ctrl.state.orderBy === 'ApplicationType' & & $ctrl.state.reverseOrder"
ng-click="$ctrl.changeOrderBy('ApplicationType')"
>< / table-column-header >
2023-02-12 21:04:24 +00:00
< div class = "no-wrap flex flex-row items-center gap-1" uib-dropdown-toggle >
2022-07-13 09:21:26 +00:00
< span class = "table-filter" > Filters< / span >
2022-11-28 02:00:28 +00:00
< pr-icon ng-if = "!$ctrl.filters.state.enabled" icon = "'filter'" > < / pr-icon >
< pr-icon ng-if = "$ctrl.filters.state.enabled" icon = "'check'" > < / pr-icon >
2022-07-13 09:21:26 +00:00
< / div >
< div class = "dropdown-menu" uib-dropdown-menu >
< div class = "tableMenu" >
< div class = "menuHeader" > Filter by application type < / div >
< div class = "menuContent" >
< div class = "md-checkbox" ng-repeat = "filter in $ctrl.filters.state.values track by $index" >
< input id = "filter_state_{{ $index }}" type = "checkbox" ng-model = "filter.display" ng-change = "$ctrl.onStateFilterChange()" / >
< label for = "filter_state_{{ $index }}" > {{ filter.type | kubernetesApplicationTypeText }}< / label >
2021-09-30 02:53:03 +00:00
< / div >
< / div >
2022-07-13 09:21:26 +00:00
< div >
< a type = "button" class = "btn btn-sm btn-default btn-sm" ng-click = "$ctrl.filters.state.open = false;" > Close< / a >
< / div >
2021-09-30 02:53:03 +00:00
< / div >
2022-07-13 09:21:26 +00:00
< / div >
< / div >
< / th >
< th >
< table-column-header col-title = "'Status'" can-sort = "false" > < / table-column-header >
<!-- Status -->
< / th >
< th >
< table-column-header col-title = "'Published'" can-sort = "false" > < / table-column-header >
<!-- Published -->
< / th >
< th >
< table-column-header
col-title="'Created'"
can-sort="true"
is-sorted="$ctrl.state.orderBy === 'CreationDate'"
is-sorted-desc="$ctrl.state.orderBy === 'CreationDate' & & $ctrl.state.reverseOrder"
ng-click="$ctrl.changeOrderBy('CreationDate')"
>< / table-column-header >
< / th >
< / tr >
< / thead >
< tbody >
< tr
2023-03-31 00:24:57 +00:00
ng-show="!$ctrl.isAppsLoading"
2022-07-13 09:21:26 +00:00
ng-click="$ctrl.expandItem(item, !$ctrl.isItemExpanded(item))"
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))"
ng-class="{ active: item.Checked, interactive: $ctrl.isExpandable(item), 'secondary-body': !$ctrl.isPrimary }"
pagination-id="$ctrl.tableKey"
>
< td class = "h-[50px]" >
< span ng-if = "$ctrl.isPrimary" class = "md-checkbox vertical-center" >
< input
id="select_{{ $index }}"
type="checkbox"
ng-model="item.Checked"
ng-click="$ctrl.selectItem(item, $event); $event.stopPropagation()"
ng-disabled="$ctrl.isSystemNamespace(item)"
/>
< label for = "select_{{ $index }}" > < / label >
< / span >
< div ng-if = "$ctrl.isExpandable(item)" class = "vertical-center" >
2022-11-28 02:00:28 +00:00
< pr-icon ng-if = "$ctrl.isItemExpanded(item)" icon = "'chevron-down'" > < / pr-icon >
< pr-icon ng-if = "!$ctrl.isItemExpanded(item)" icon = "'chevron-right'" > < / pr-icon >
2022-07-13 09:21:26 +00:00
< / div >
< / td >
< td >
2022-08-24 04:40:50 +00:00
< a
ng-if="item.KubernetesApplications"
ui-sref="kubernetes.helm({ name: item.Name, namespace: item.ResourcePool })"
ng-click="$event.stopPropagation()"
class="hyperlink"
2022-07-13 09:21:26 +00:00
>{{ item.Name }}
< / a >
< a
ng-if="!item.KubernetesApplications"
2023-05-03 03:55:25 +00:00
ui-sref="kubernetes.applications.application({ name: item.Name, namespace: item.ResourcePool, 'resource-type': $ctrl.applicationTypeEnumToParamMap[item.ApplicationType] })"
2022-07-13 09:21:26 +00:00
ng-click="$event.stopPropagation()"
2022-08-24 04:40:50 +00:00
class="hyperlink"
2022-07-13 09:21:26 +00:00
>{{ item.Name }}
< / a >
< span class = "label label-info image-tag label-margins" ng-if = "$ctrl.isSystemNamespace(item)" > system< / span >
< span class = "label label-primary image-tag label-margins" ng-if = "!$ctrl.isSystemNamespace(item) && $ctrl.isExternalApplication(item)" > external< / span >
< / td >
< td > {{ item.StackName || '-' }}< / td >
< td >
< a ui-sref = "kubernetes.resourcePools.resourcePool({ id: item.ResourcePool })" ng-click = "$event.stopPropagation()" > {{ item.ResourcePool }}< / a >
< / td >
< td title = "{{ item.Image }}"
2023-02-12 21:04:24 +00:00
>{{ item.Image | truncate : 64 }} < span ng-if = "item.Containers.length > 1" > + {{ item.Containers.length - 1 }}< / span > < /td
2022-07-13 09:21:26 +00:00
>
< td > {{ item.ApplicationType | kubernetesApplicationTypeText }}< / td >
< td ng-if = "item.ApplicationType !== $ctrl.KubernetesApplicationTypes.POD" >
< status-indicator ok = "(item.TotalPodsCount > 0 && item.TotalPodsCount === item.RunningPodsCount) || item.Status === 'Ready'" > < / status-indicator >
< span ng-if = "item.DeploymentType === $ctrl.KubernetesApplicationDeploymentTypes.REPLICATED" > Replicated< / span >
< span ng-if = "item.DeploymentType === $ctrl.KubernetesApplicationDeploymentTypes.GLOBAL" > Global< / span >
< span ng-if = "item.RunningPodsCount >= 0 && item.TotalPodsCount >= 0"
>< code > {{ item.RunningPodsCount }}< / code > / < code > {{ item.TotalPodsCount }}< / code > < /span
2020-07-05 23:21:03 +00:00
>
2022-07-13 09:21:26 +00:00
< span ng-if = "item.KubernetesApplications" > {{ item.Status }}< / span >
< / td >
< td ng-if = "item.ApplicationType === $ctrl.KubernetesApplicationTypes.POD" >
{{ item.Pods[0].Status }}
< / td >
< td >
< span >
{{ item.Services.length === 0 ? 'No' : 'Yes' }}
< / span >
< / td >
< td > {{ item.CreationDate | getisodate }} {{ item.ApplicationOwner ? 'by ' + item.ApplicationOwner : '' }}< / td >
< / tr >
< tr dir-paginate-end ng-show = "$ctrl.isExpandable(item) && $ctrl.isItemExpanded(item)" ng-class = "{ 'secondary-body': $ctrl.isPrimary && !item.KubernetesApplications }" >
< td > < / td >
< td colspan = "8" class = "datatable-padding-vertical" >
< span ng-if = "item.KubernetesApplications" >
< kubernetes-applications-datatable
dataset="item.KubernetesApplications"
table-key="{{ item.Id }}_table"
settings-key="{{ $ctrl.tableKey }}"
order-by="Name"
remove-action="$ctrl.removeAction"
refresh-callback="$ctrl.refreshCallback"
on-publishing-mode-click="($ctrl.onPublishingModeClick)"
is-primary="false"
2020-08-13 23:27:10 +00:00
>
2022-07-13 09:21:26 +00:00
< / kubernetes-applications-datatable >
2020-07-05 23:21:03 +00:00
< / span >
2022-07-13 09:21:26 +00:00
< span ng-if = "!item.KubernetesApplications" >
< kubernetes-applications-datatable-url ng-if = "$ctrl.getPublishedUrl(item)" published-url = "{{ $ctrl.getPublishedUrl(item) }}" > < / kubernetes-applications-datatable-url >
< kubernetes-applications-datatable-details
ng-if="$ctrl.hasConfigurationSecrets(item)"
configurations="item.Configurations"
>< / kubernetes-applications-datatable-details >
< / span >
< / td >
< / tr >
2023-03-31 00:24:57 +00:00
< tr ng-if = "$ctrl.isAppsLoading" >
2023-02-12 21:04:24 +00:00
< td colspan = "8" class = "text-muted text-center" > Loading...< / td >
2022-07-13 09:21:26 +00:00
< / tr >
2023-03-31 00:24:57 +00:00
< tr ng-if = "$ctrl.state.filteredDataSet.length === 0 && !$ctrl.isAppsLoading" >
2023-02-12 21:04:24 +00:00
< td colspan = "8" class = "text-muted text-center" > No application available.< / td >
2022-07-13 09:21:26 +00:00
< / tr >
< / tbody >
< / table >
< / div >
2023-03-31 00:24:57 +00:00
< div class = "footer pl-5" ng-if = "$ctrl.isPrimary && $ctrl.dataset" >
2022-07-13 09:21:26 +00:00
< div class = "infoBar !ml-0" ng-if = "$ctrl.state.selectedItemCount !== 0" > {{ $ctrl.state.selectedItemCount }} item(s) selected < / div >
< div class = "paginationControls" >
< form class = "form-inline" >
< span class = "limitSelector" >
< span class = "mr-1" > Items per page < / span >
< select class = "form-control" ng-model = "$ctrl.state.paginatedItemLimit" ng-change = "$ctrl.changePaginationLimit()" data-cy = "component-paginationSelect" >
< option value = "0" > All< / option >
< option value = "10" > 10< / option >
< option value = "25" > 25< / option >
< option value = "50" > 50< / option >
< option value = "100" > 100< / option >
< / select >
< / span >
< dir-pagination-controls max-size = "5" pagination-id = "$ctrl.tableKey" > < / dir-pagination-controls >
< / form >
< / div >
< / div >
2020-07-05 23:21:03 +00:00
< / div >