feat(ui): kube app list ui styling EE-3464 (#7247)

* feat(ui): apply app datatable changes EE-3464
pull/7266/head
Ali 2022-07-13 21:21:26 +12:00 committed by GitHub
parent ad7055ee01
commit 0da4e3ae63
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 784 additions and 652 deletions

View File

@ -1,4 +1,4 @@
<div class="col-xs-12 form-section-title"> Secrets </div> <div class="col-xs-12 text-[13px] !px-0 !py-1"> Secrets </div>
<table style="width: 50%"> <table style="width: 50%">
<tbody> <tbody>
<tr> <tr>

View File

@ -1,15 +1,60 @@
<div class="datatable"> <div class="datatable">
<rd-widget> <!-- toolbar header actions and settings -->
<rd-widget-body classes="no-padding"> <div ng-if="$ctrl.isPrimary" class="toolBar !flex-col gap-1">
<div ng-if="$ctrl.isPrimary" class="toolBar"> <div class="toolBar vertical-center !gap-x-5 !gap-y-1 flex-wrap !p-0 w-full">
<div class="toolBarTitle"> <i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px"></i> {{ $ctrl.titleText }} </div> <div class="toolBarTitle vertical-center">
<span class="small text-muted" style="float: left; margin-top: 5px" ng-if="$ctrl.isAdmin && !$ctrl.settings.showSystem"> <pr-icon icon="'box'" feather="true" class-name="'icon-nested-blue'" mode="'primary'"></pr-icon>
<i class="fa fa-info-circle blue-icon" aria-hidden="true" style="margin-right: 2px"></i> Applications
System resources are hidden, this can be changed in the table settings. </div>
</span> <div class="searchBar vertical-center">
<pr-icon icon="'search'" feather="true"></pr-icon>
<input
type="text"
class="searchInput"
ng-model="$ctrl.state.textFilter"
ng-change="$ctrl.onTextFilterChange()"
placeholder="Search for an application..."
auto-focus
ng-model-options="{ debounce: 300 }"
data-cy="k8sApp-searchApplicationsInput"
/>
</div>
<div class="actionBar !gap-3 !mr-0" ng-if="!$ctrl.offlineMode">
<button
ng-if="$ctrl.isPrimary"
type="button"
class="btn btn-sm btn-dangerlight h-fit vertical-center !ml-0"
ng-disabled="$ctrl.state.selectedItemCount === 0"
ng-click="$ctrl.removeAction($ctrl.state.selectedItems)"
data-cy="k8sApp-removeAppButton"
>
<pr-icon icon="'trash-2'" feather="true"></pr-icon>
Remove
</button>
<button
ng-if="$ctrl.isPrimary"
type="button"
class="btn btn-sm btn-secondary h-fit vertical-center !ml-0"
ui-sref="kubernetes.applications.new"
data-cy="k8sApp-addApplicationButton"
>
<pr-icon icon="'plus'" feather="true" class-name="'!h-3'"></pr-icon>Add with form
</button>
<button
ng-if="$ctrl.isPrimary"
type="button"
class="btn btn-sm btn-primary h-fit vertical-center !ml-0"
ui-sref="kubernetes.deploy"
data-cy="k8sApp-deployFromManifestButton"
>
<pr-icon icon="'plus'" feather="true" class-name="'!h-3'"></pr-icon>Create from manifest
</button>
</div>
<div class="settings" data-cy="k8sApp-tableSettings"> <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 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><i class="fa fa-cog" aria-hidden="true"></i> Table settings</span> <span uib-dropdown-toggle aria-label="Settings">
<pr-icon icon="'more-vertical'" feather="true" class-name="'!mr-0 !h-4'"></pr-icon>
</span>
<div class="dropdown-menu dropdown-menu-right" uib-dropdown-menu> <div class="dropdown-menu dropdown-menu-right" uib-dropdown-menu>
<div class="tableMenu"> <div class="tableMenu">
<div class="menuHeader"> Table settings </div> <div class="menuHeader"> Table settings </div>
@ -45,101 +90,92 @@
<option value="300">5min</option> <option value="300">5min</option>
</select> </select>
<span> <span>
<i id="refreshRateChange" class="fa fa-check green-icon" aria-hidden="true" style="margin-top: 7px; display: none"></i> <pr-icon id="refreshRateChange" icon="'check'" feather="true" mode="'success'" size="'sm'"></pr-icon>
</span> </span>
</div> </div>
</div> </div>
</div> </div>
<div> <div>
<a type="button" class="btn btn-default btn-sm" ng-click="$ctrl.settings.open = false;" data-cy="k8sApp-tableSettingsCloseButton">Close</a> <a type="button" class="btn btn-sm btn-default btn-sm" ng-click="$ctrl.settings.open = false;" data-cy="k8sApp-tableSettingsCloseButton">Close</a>
</div> </div>
</div> </div>
</div> </div>
</span> </span>
</div> </div>
</div> </div>
<div ng-if="$ctrl.isPrimary" class="actionBar"> <div class="flex flex-row w-full">
<button <span class="small text-muted mt-1" ng-if="$ctrl.isAdmin && !$ctrl.settings.showSystem">
type="button" <pr-icon icon="'info'" feather="true" class-name="'icon'"></pr-icon>
class="btn btn-sm btn-danger" System resources are hidden, this can be changed in the table settings.
ng-disabled="$ctrl.state.selectedItemCount === 0" </span>
ng-click="$ctrl.removeAction($ctrl.state.selectedItems)"
data-cy="k8sApp-removeAppButton"
>
<i class="fa fa-trash-alt space-right" aria-hidden="true"></i>Remove
</button>
<button type="button" class="btn btn-sm btn-primary" ui-sref="kubernetes.applications.new" data-cy="k8sApp-addApplicationButton">
<i class="fa fa-plus space-right" aria-hidden="true"></i>Add application with form
</button>
<button type="button" class="btn btn-sm btn-primary" ui-sref="kubernetes.deploy" data-cy="k8sApp-deployFromManifestButton">
<i class="fa fa-plus space-right" aria-hidden="true"></i>Create from manifest
</button>
</div> </div>
<div ng-if="$ctrl.isPrimary" class="searchBar">
<i class="fa fa-search searchIcon" aria-hidden="true"></i>
<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>
<!-- data table content -->
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-hover nowrap-cells" data-cy="k8sApp-appTable"> <table class="table table-hover table-filters nowrap-cells" data-cy="k8sApp-appTable">
<thead ng-class="{ 'secondary-heading': !$ctrl.isPrimary }"> <thead ng-class="{ 'secondary-heading': !$ctrl.isPrimary }">
<tr> <tr role="row">
<th class="datatable-wide"> <th role="columnheader" class="datatable-wide dropdown">
<span ng-if="$ctrl.isPrimary"> <div ng-if="$ctrl.isPrimary" class="flex no-wrap min-w-max">
<span class="md-checkbox"> <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" /> <input id="select_all" type="checkbox" ng-model="$ctrl.state.selectAll" ng-change="$ctrl.selectAll()" data-cy="k8sApp-selectAllCheckbox" />
<label for="select_all"></label> <label for="select_all"></label>
</span> </span>
<a ng-click="$ctrl.expandAll()"> <div class="cursor-pointer vertical-center" ng-click="$ctrl.expandAll()">
<i ng-class="{ 'fas fa-angle-down': $ctrl.state.expandAll, 'fas fa-angle-right': !$ctrl.state.expandAll }" aria-hidden="true"></i> <pr-icon ng-if="$ctrl.state.expandAll" icon="'chevron-down'" feather="true" class-name="'icon'"></pr-icon>
</a> <pr-icon ng-if="!$ctrl.state.expandAll" icon="'chevron-right'" feather="true" class-name="'icon'"></pr-icon>
</span> </div>
</div>
</th> </th>
<th> <th>
<a ng-click="$ctrl.changeOrderBy('Name')"> <table-column-header
Name col-title="'Name'"
<i class="fa fa-sort-alpha-down" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'Name' && !$ctrl.state.reverseOrder"></i> can-sort="true"
<i class="fa fa-sort-alpha-up" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder"></i> is-sorted="$ctrl.state.orderBy === 'Name'"
</a> is-sorted-desc="$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder"
ng-click="$ctrl.changeOrderBy('Name')"
></table-column-header>
</th> </th>
<th> <th>
<a ng-click="$ctrl.changeOrderBy('StackName')"> <table-column-header
Stack col-title="'Stack'"
<i class="fa fa-sort-alpha-down" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'StackName' && !$ctrl.state.reverseOrder"></i> can-sort="true"
<i class="fa fa-sort-alpha-up" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'StackName' && $ctrl.state.reverseOrder"></i> is-sorted="$ctrl.state.orderBy === 'StackName'"
</a> is-sorted-desc="$ctrl.state.orderBy === 'StackName' && $ctrl.state.reverseOrder"
ng-click="$ctrl.changeOrderBy('StackName')"
></table-column-header>
</th> </th>
<th> <th>
<a ng-click="$ctrl.changeOrderBy('ResourcePool')"> <table-column-header
Namespace col-title="'Namespace'"
<i class="fa fa-sort-alpha-down" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'ResourcePool' && !$ctrl.state.reverseOrder"></i> can-sort="true"
<i class="fa fa-sort-alpha-up" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'ResourcePool' && $ctrl.state.reverseOrder"></i> is-sorted="$ctrl.state.orderBy === 'ResourcePool'"
</a> is-sorted-desc="$ctrl.state.orderBy === 'ResourcePool' && $ctrl.state.reverseOrder"
ng-click="$ctrl.changeOrderBy('ResourcePool')"
></table-column-header>
</th> </th>
<th> <th>
<a ng-click="$ctrl.changeOrderBy('Image')"> <table-column-header
Image col-title="'Image'"
<i class="fa fa-sort-alpha-down" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'Image' && !$ctrl.state.reverseOrder"></i> can-sort="true"
<i class="fa fa-sort-alpha-up" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'Image' && $ctrl.state.reverseOrder"></i> is-sorted="$ctrl.state.orderBy === 'Image'"
</a> is-sorted-desc="$ctrl.state.orderBy === 'Image' && $ctrl.state.reverseOrder"
ng-click="$ctrl.changeOrderBy('Image')"
></table-column-header>
</th> </th>
<th uib-dropdown dropdown-append-to-body auto-close="disabled" is-open="$ctrl.filters.state.open"> <th uib-dropdown dropdown-append-to-body auto-close="disabled" is-open="$ctrl.filters.state.open">
<a ng-click="$ctrl.changeOrderBy('ApplicationType')"> <div class="flex flex-row no-wrap gap-2">
Application Type <table-column-header
<i class="fa fa-sort-alpha-down" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'ApplicationType' && !$ctrl.state.reverseOrder"></i> col-title="'Application Type'"
<i class="fa fa-sort-alpha-up" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'ApplicationType' && $ctrl.state.reverseOrder"></i> can-sort="true"
</a> is-sorted="$ctrl.state.orderBy === 'ApplicationType'"
<div> is-sorted-desc="$ctrl.state.orderBy === 'ApplicationType' && $ctrl.state.reverseOrder"
<span uib-dropdown-toggle class="table-filter" ng-if="!$ctrl.filters.state.enabled">Filter <i class="fa fa-filter" aria-hidden="true"></i></span> ng-click="$ctrl.changeOrderBy('ApplicationType')"
<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> ></table-column-header>
<div class="flex flex-row no-wrap gap-1 items-center" uib-dropdown-toggle>
<span class="table-filter">Filters</span>
<pr-icon ng-if="!$ctrl.filters.state.enabled" icon="'filter'" class-name="'icon'" feather="true"></pr-icon>
<pr-icon ng-if="$ctrl.filters.state.enabled" icon="'check'" class-name="'icon'" feather="true"></pr-icon>
</div> </div>
<div class="dropdown-menu" uib-dropdown-menu> <div class="dropdown-menu" uib-dropdown-menu>
<div class="tableMenu"> <div class="tableMenu">
@ -151,19 +187,28 @@
</div> </div>
</div> </div>
<div> <div>
<a type="button" class="btn btn-default btn-sm" ng-click="$ctrl.filters.state.open = false;">Close</a> <a type="button" class="btn btn-sm btn-default btn-sm" ng-click="$ctrl.filters.state.open = false;">Close</a>
</div>
</div> </div>
</div> </div>
</div> </div>
</th> </th>
<th> Status </th>
<th> Published </th>
<th> <th>
<a ng-click="$ctrl.changeOrderBy('CreationDate')"> <table-column-header col-title="'Status'" can-sort="false"></table-column-header>
Created <!-- Status -->
<i class="fa fa-sort-numeric-down" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'CreationDate' && !$ctrl.state.reverseOrder"></i> </th>
<i class="fa fa-sort-numeric-up" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'CreationDate' && $ctrl.state.reverseOrder"></i> <th>
</a> <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> </th>
</tr> </tr>
</thead> </thead>
@ -174,8 +219,8 @@
ng-class="{ active: item.Checked, interactive: $ctrl.isExpandable(item), 'secondary-body': !$ctrl.isPrimary }" ng-class="{ active: item.Checked, interactive: $ctrl.isExpandable(item), 'secondary-body': !$ctrl.isPrimary }"
pagination-id="$ctrl.tableKey" pagination-id="$ctrl.tableKey"
> >
<td> <td class="h-[50px]">
<span ng-if="$ctrl.isPrimary" class="md-checkbox"> <span ng-if="$ctrl.isPrimary" class="md-checkbox vertical-center">
<input <input
id="select_{{ $index }}" id="select_{{ $index }}"
type="checkbox" type="checkbox"
@ -185,9 +230,10 @@
/> />
<label for="select_{{ $index }}"></label> <label for="select_{{ $index }}"></label>
</span> </span>
<a ng-if="$ctrl.isExpandable(item)"> <div ng-if="$ctrl.isExpandable(item)" class="vertical-center">
<i ng-class="{ 'fas fa-angle-down': $ctrl.isItemExpanded(item), 'fas fa-angle-right': !$ctrl.isItemExpanded(item) }" class="space-right" aria-hidden="true"></i> <pr-icon ng-if="$ctrl.isItemExpanded(item)" icon="'chevron-down'" feather="true" class-name="'icon'"></pr-icon>
</a> <pr-icon ng-if="!$ctrl.isItemExpanded(item)" icon="'chevron-right'" feather="true" class-name="'icon'"></pr-icon>
</div>
</td> </td>
<td> <td>
<a ng-if="item.KubernetesApplications" ui-sref="kubernetes.helm({ name: item.Name, namespace: item.ResourcePool })" ng-click="$event.stopPropagation()" <a ng-if="item.KubernetesApplications" ui-sref="kubernetes.helm({ name: item.Name, namespace: item.ResourcePool })" ng-click="$event.stopPropagation()"
@ -214,9 +260,9 @@
<status-indicator ok="(item.TotalPodsCount > 0 && item.TotalPodsCount === item.RunningPodsCount) || item.Status === 'Ready'"></status-indicator> <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.REPLICATED">Replicated</span>
<span ng-if="item.DeploymentType === $ctrl.KubernetesApplicationDeploymentTypes.GLOBAL">Global</span> <span ng-if="item.DeploymentType === $ctrl.KubernetesApplicationDeploymentTypes.GLOBAL">Global</span>
<span ng-if="item.RunningPodsCount >= 0 && item.TotalPodsCount >= 0"> <span ng-if="item.RunningPodsCount >= 0 && item.TotalPodsCount >= 0"
<code>{{ item.RunningPodsCount }}</code> / <code>{{ item.TotalPodsCount }}</code> ><code>{{ item.RunningPodsCount }}</code> / <code>{{ item.TotalPodsCount }}</code></span
</span> >
<span ng-if="item.KubernetesApplications">{{ item.Status }}</span> <span ng-if="item.KubernetesApplications">{{ item.Status }}</span>
</td> </td>
<td ng-if="item.ApplicationType === $ctrl.KubernetesApplicationTypes.POD"> <td ng-if="item.ApplicationType === $ctrl.KubernetesApplicationTypes.POD">
@ -246,10 +292,7 @@
</kubernetes-applications-datatable> </kubernetes-applications-datatable>
</span> </span>
<span ng-if="!item.KubernetesApplications"> <span ng-if="!item.KubernetesApplications">
<kubernetes-applications-datatable-url <kubernetes-applications-datatable-url ng-if="$ctrl.getPublishedUrl(item)" published-url="{{ $ctrl.getPublishedUrl(item) }}"></kubernetes-applications-datatable-url>
ng-if="$ctrl.getPublishedUrl(item)"
published-url="{{ $ctrl.getPublishedUrl(item) }}"
></kubernetes-applications-datatable-url>
<kubernetes-applications-datatable-details <kubernetes-applications-datatable-details
ng-if="$ctrl.hasConfigurationSecrets(item)" ng-if="$ctrl.hasConfigurationSecrets(item)"
configurations="item.Configurations" configurations="item.Configurations"
@ -266,12 +309,12 @@
</tbody> </tbody>
</table> </table>
</div> </div>
<div ng-if="$ctrl.isPrimary" class="footer" ng-if="$ctrl.dataset"> <div ng-if="$ctrl.isPrimary" class="footer pl-5" ng-if="$ctrl.dataset">
<div class="infoBar" ng-if="$ctrl.state.selectedItemCount !== 0"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div> <div class="infoBar !ml-0" ng-if="$ctrl.state.selectedItemCount !== 0"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>
<div class="paginationControls"> <div class="paginationControls">
<form class="form-inline"> <form class="form-inline">
<span class="limitSelector"> <span class="limitSelector">
<span style="margin-right: 5px"> Items per page </span> <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"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
@ -284,6 +327,4 @@
</form> </form>
</div> </div>
</div> </div>
</rd-widget-body>
</rd-widget>
</div> </div>

View File

@ -1,31 +1,58 @@
<div class="datatable"> <div class="datatable">
<rd-widget> <!-- table title and action menu -->
<rd-widget-body classes="no-padding"> <div class="toolBar !flex-col gap-1">
<div class="toolBar"> <div class="toolBar vertical-center !gap-x-5 !gap-y-1 flex-wrap !p-0 w-full">
<div class="toolBarTitle"> <i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px"></i> {{ $ctrl.titleText }} </div> <!-- title -->
<span class="small text-muted" style="float: left; margin-top: 5px" ng-if="$ctrl.isAdmin && !$ctrl.settings.showSystem"> <div class="toolBarTitle vertical-center">
<i class="fa fa-info-circle blue-icon" aria-hidden="true" style="margin-right: 2px"></i> <pr-icon icon="'repeat'" feather="true" class-name="'icon-nested-blue'" mode="'primary'"></pr-icon>
System resources are hidden, this can be changed in the table settings. Port mappings
</span> </div>
<div class="settings"> <div class="searchBar vertical-center">
<pr-icon icon="'search'" feather="true" class-name="'icon !h-3'"></pr-icon>
<input
type="text"
class="searchInput"
ng-model="$ctrl.state.textFilter"
ng-change="$ctrl.onTextFilterChange()"
placeholder="Search for a port mapping..."
auto-focus
ng-model-options="{ debounce: 300 }"
/>
</div>
<!-- actions -->
<div data-cy="k8sApp-tableSettings" class="settings">
<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 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><i class="fa fa-cog" aria-hidden="true"></i> Table settings</span> <span uib-dropdown-toggle aria-label="Settings">
<pr-icon icon="'more-vertical'" feather="true" class-name="'icon !mr-0 !h-4'"></pr-icon>
</span>
<div class="dropdown-menu dropdown-menu-right" uib-dropdown-menu> <div class="dropdown-menu dropdown-menu-right" uib-dropdown-menu>
<div class="tableMenu"> <div class="tableMenu">
<div class="menuHeader"> Table settings </div> <div class="menuHeader"> Table settings </div>
<div class="menuContent"> <div class="menuContent">
<div> <div>
<div class="md-checkbox" ng-if="$ctrl.isAdmin"> <div class="md-checkbox" ng-if="$ctrl.isAdmin">
<input id="ports_setting_show_system" type="checkbox" ng-model="$ctrl.settings.showSystem" ng-change="$ctrl.onSettingsShowSystemChange()" /> <input id="applications_setting_show_system" type="checkbox" ng-model="$ctrl.settings.showSystem" ng-change="$ctrl.onSettingsShowSystemChange()" />
<label for="ports_setting_show_system">Show system resources</label> <label for="applications_setting_show_system">Show system resources</label>
</div> </div>
<div class="md-checkbox"> <div class="md-checkbox">
<input id="setting_auto_refresh" type="checkbox" ng-model="$ctrl.settings.repeater.autoRefresh" ng-change="$ctrl.onSettingsRepeaterChange()" /> <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> <label for="setting_auto_refresh">Auto refresh</label>
</div> </div>
<div ng-if="$ctrl.settings.repeater.autoRefresh"> <div ng-if="$ctrl.settings.repeater.autoRefresh">
<label for="settings_refresh_rate"> Refresh rate </label> <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"> <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="10">10s</option>
<option value="30">30s</option> <option value="30">30s</option>
<option value="60">1min</option> <option value="60">1min</option>
@ -33,63 +60,71 @@
<option value="300">5min</option> <option value="300">5min</option>
</select> </select>
<span> <span>
<i id="refreshRateChange" class="fa fa-check green-icon" aria-hidden="true" style="margin-top: 7px; display: none"></i> <pr-icon id="refreshRateChange" icon="'check'" feather="true" mode="'success'" size="'sm'"></pr-icon>
</span> </span>
</div> </div>
</div> </div>
</div> </div>
<div> <div>
<a type="button" class="btn btn-default btn-sm" ng-click="$ctrl.settings.open = false;">Close</a> <a type="button" class="btn btn-sm btn-default btn-sm" ng-click="$ctrl.settings.open = false;" data-cy="k8sApp-tableSettingsCloseButton">Close</a>
</div> </div>
</div> </div>
</div> </div>
</span> </span>
</div> </div>
</div> </div>
<div class="searchBar"> <!-- info text -->
<i class="fa fa-search searchIcon" aria-hidden="true"></i> <div class="flex flex-row w-full">
<input <span class="small text-muted mt-1" ng-if="$ctrl.isAdmin && !$ctrl.settings.showSystem">
type="text" <pr-icon icon="'info'" feather="true" class-name="'icon'"></pr-icon>
class="searchInput" System resources are hidden, this can be changed in the table settings.
ng-model="$ctrl.state.textFilter" </span>
ng-change="$ctrl.onTextFilterChange()"
placeholder="Search..."
auto-focus
ng-model-options="{ debounce: 300 }"
/>
</div> </div>
</div>
<!-- table -->
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-hover nowrap-cells"> <table class="table table-hover nowrap-cells">
<thead> <thead>
<tr> <tr>
<th> <th>
<a ng-click="$ctrl.expandAll()" ng-if="$ctrl.hasExpandableItems()"> <div class="cursor-pointer vertical-center" ng-click="$ctrl.expandAll()" ng-if="$ctrl.hasExpandableItems()" class="flex no-wrap min-w-max">
<i ng-class="{ 'fas fa-angle-down': $ctrl.state.expandAll, 'fas fa-angle-right': !$ctrl.state.expandAll }" aria-hidden="true"></i> <pr-icon ng-if="$ctrl.state.expandAll" icon="'chevron-down'" feather="true" class-name="'icon'"></pr-icon>
</a> <pr-icon ng-if="!$ctrl.state.expandAll" icon="'chevron-right'" feather="true" class-name="'icon'"></pr-icon>
</div>
</th> </th>
<th> <th>
<a ng-click="$ctrl.changeOrderBy('Name')"> <table-column-header
Application col-title="'Application'"
<i class="fa fa-sort-alpha-down" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'Name' && !$ctrl.state.reverseOrder"></i> can-sort="true"
<i class="fa fa-sort-alpha-up" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder"></i> is-sorted="$ctrl.state.orderBy === 'Name'"
</a> is-sorted-desc="$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder"
</th> ng-click="$ctrl.changeOrderBy('Name')"
<th> Publishing mode </th> ></table-column-header>
<th>
<a ng-click="$ctrl.changeOrderBy('TargetPort')">
Exposed port
<i class="fa fa-sort-numeric-down" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'TargetPort' && !$ctrl.state.reverseOrder"></i>
<i class="fa fa-sort-numeric-up" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'TargetPort' && $ctrl.state.reverseOrder"></i>
</a>
</th> </th>
<th> <th>
<a ng-click="$ctrl.changeOrderBy('Port')"> <table-column-header col-title="'Publishing mode'" can-sort="false"></table-column-header>
Container port </th>
<i class="fa fa-sort-numeric-down" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'Port' && !$ctrl.state.reverseOrder"></i> <th>
<i class="fa fa-sort-numeric-up" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'Port' && $ctrl.state.reverseOrder"></i> <table-column-header
</a> col-title="'Exposed port'"
can-sort="true"
is-sorted="$ctrl.state.orderBy === 'TargetPort'"
is-sorted-desc="$ctrl.state.orderBy === 'TargetPort' && $ctrl.state.reverseOrder"
ng-click="$ctrl.changeOrderBy('TargetPort')"
></table-column-header>
</th>
<th>
<table-column-header
col-title="'Container port'"
can-sort="true"
is-sorted="$ctrl.state.orderBy === 'Port'"
is-sorted-desc="$ctrl.state.orderBy === 'Port' && $ctrl.state.reverseOrder"
ng-click="$ctrl.changeOrderBy('Port')"
></table-column-header>
</th>
<th>
<table-column-header col-title="'HTTP route'" can-sort="false"></table-column-header>
</th> </th>
<th> HTTP route </th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -103,9 +138,10 @@
> >
<!-- expandable --> <!-- expandable -->
<td> <td>
<a ng-if="$ctrl.itemCanExpand(item)"> <div ng-if="$ctrl.itemCanExpand(item)">
<i ng-class="{ 'fas fa-angle-down': item.Expanded, 'fas fa-angle-right': !item.Expanded }" class="space-right" aria-hidden="true"></i> <pr-icon ng-if="item.Expanded" icon="'chevron-down'" feather="true" class-name="'icon'"></pr-icon>
</a> <pr-icon ng-if="!item.Expanded" icon="'chevron-right'" feather="true" class-name="'icon'"></pr-icon>
</div>
</td> </td>
<!-- Application --> <!-- Application -->
<td> <td>
@ -117,25 +153,23 @@
<td> <td>
<!-- LB --> <!-- LB -->
<span ng-if="item.ServiceType === $ctrl.KubernetesServiceTypes.LOAD_BALANCER"> <span ng-if="item.ServiceType === $ctrl.KubernetesServiceTypes.LOAD_BALANCER">
<span> <i class="fa fa-project-diagram" aria-hidden="true" style="margin-right: 2px"></i> LoadBalancer </span> <span><pr-icon icon="'share-2'" feather="true" class-name="'icon'"></pr-icon> LoadBalancer </span>
<span class="text-muted small" style="margin-left: 5px"> <span class="text-muted small ml-5">
<span ng-if="item.LoadBalancerIPAddress">{{ item.LoadBalancerIPAddress }}</span> <span ng-if="item.LoadBalancerIPAddress">{{ item.LoadBalancerIPAddress }}</span>
<span ng-if="!item.LoadBalancerIPAddress">pending</span> <span ng-if="!item.LoadBalancerIPAddress">pending</span>
</span> </span>
</span> </span>
<!-- Internal --> <!-- Internal -->
<span ng-if="item.ServiceType === $ctrl.KubernetesServiceTypes.CLUSTER_IP"> <span ng-if="item.ServiceType === $ctrl.KubernetesServiceTypes.CLUSTER_IP"> <i class="fa fa-list-alt mr-0.5" aria-hidden="true"></i> ClusterIP </span>
<i class="fa fa-list-alt" aria-hidden="true" style="margin-right: 2px"></i> ClusterIP
</span>
<!-- Cluster --> <!-- Cluster -->
<span ng-if="item.ServiceType === $ctrl.KubernetesServiceTypes.NODE_PORT"> <i class="fa fa-list" aria-hidden="true" style="margin-right: 2px"></i> NodePort </span> <span ng-if="item.ServiceType === $ctrl.KubernetesServiceTypes.NODE_PORT"> <pr-icon icon="'list'" feather="true" class-name="'icon'"></pr-icon> NodePort </span>
</td> </td>
<!-- Exposed port --> <!-- Exposed port -->
<td> <td>
<span ng-if="!$ctrl.itemCanExpand(item)"> <span ng-if="!$ctrl.itemCanExpand(item)">
{{ item.Ports[0].Port }} {{ item.Ports[0].Port }}
<a ng-if="item.LoadBalancerIPAddress" ng-href="http://{{ item.LoadBalancerIPAddress }}:{{ item.Ports[0].Port }}" target="_blank" style="margin-left: 5px"> <a class="vertical-center" ng-if="item.LoadBalancerIPAddress" ng-href="http://{{ item.LoadBalancerIPAddress }}:{{ item.Ports[0].Port }}" target="_blank" class="ml-1">
<i class="fa fa-external-link-alt" aria-hidden="true"></i> access <pr-icon icon="'external-link'" feather="true" class-name="'icon'"></pr-icon> access
</a> </a>
</span> </span>
</td> </td>
@ -150,12 +184,11 @@
<span ng-if="$ctrl.portHasIngressRules(item.Ports[0])"> <span ng-if="$ctrl.portHasIngressRules(item.Ports[0])">
<span <span
ng-if="!$ctrl.ruleCanBeDisplayed(item.Ports[0].IngressRules[0])" ng-if="!$ctrl.ruleCanBeDisplayed(item.Ports[0].IngressRules[0])"
class="text-muted" class="text-muted cursor-pointer"
tooltip-append-to-body="true" tooltip-append-to-body="true"
tooltip-placement="bottom" tooltip-placement="bottom"
tooltip-class="portainer-tooltip" tooltip-class="portainer-tooltip"
uib-tooltip="Ingress controller IP address not available yet" uib-tooltip="Ingress controller IP address not available yet"
style="cursor: pointer"
>pending >pending
</span> </span>
<span ng-if="$ctrl.ruleCanBeDisplayed(item.Ports[0].IngressRules[0])"> <span ng-if="$ctrl.ruleCanBeDisplayed(item.Ports[0].IngressRules[0])">
@ -174,8 +207,8 @@
<td ng-if="!$ctrl.portHasIngressRules(port)">-</td> <td ng-if="!$ctrl.portHasIngressRules(port)">-</td>
<td ng-if="!$ctrl.portHasIngressRules(port)"> <td ng-if="!$ctrl.portHasIngressRules(port)">
{{ port.Port }} {{ port.Port }}
<a ng-if="item.LoadBalancerIPAddress" ng-href="http://{{ item.LoadBalancerIPAddress }}:{{ port.Port }}" target="_blank" style="margin-left: 5px"> <a ng-if="item.LoadBalancerIPAddress" ng-href="http://{{ item.LoadBalancerIPAddress }}:{{ port.Port }}" target="_blank" class="ml-1">
<i class="fa fa-external-link-alt" aria-hidden="true"></i> access <pr-icon icon="'external-link'" feather="true"></pr-icon> access
</a> </a>
</td> </td>
<td ng-if="!$ctrl.portHasIngressRules(port)">{{ port.TargetPort }}/{{ port.Protocol }}</td> <td ng-if="!$ctrl.portHasIngressRules(port)">{{ port.TargetPort }}/{{ port.Protocol }}</td>
@ -192,20 +225,19 @@
<td>-</td> <td>-</td>
<td> <td>
{{ port.Port }} {{ port.Port }}
<a ng-if="item.LoadBalancerIPAddress" ng-href="http://{{ item.LoadBalancerIPAddress }}:{{ port.Port }}" target="_blank" style="margin-left: 5px"> <a ng-if="item.LoadBalancerIPAddress" ng-href="http://{{ item.LoadBalancerIPAddress }}:{{ port.Port }}" target="_blank" class="ml-1">
<i class="fa fa-external-link-alt" aria-hidden="true"></i> access <pr-icon icon="'external-link'" feather="true"></pr-icon>access
</a> </a>
</td> </td>
<td>{{ port.TargetPort }}/{{ port.Protocol }}</td> <td>{{ port.TargetPort }}/{{ port.Protocol }}</td>
<td> <td>
<span <span
ng-if="!$ctrl.ruleCanBeDisplayed(rule)" ng-if="!$ctrl.ruleCanBeDisplayed(rule)"
class="text-muted" class="text-muted cursor-pointer"
tooltip-append-to-body="true" tooltip-append-to-body="true"
tooltip-placement="bottom" tooltip-placement="bottom"
tooltip-class="portainer-tooltip" tooltip-class="portainer-tooltip"
uib-tooltip="Ingress controller IP address not available yet" uib-tooltip="Ingress controller IP address not available yet"
style="cursor: pointer"
>pending >pending
</span> </span>
<span ng-if="$ctrl.ruleCanBeDisplayed(rule)"> <span ng-if="$ctrl.ruleCanBeDisplayed(rule)">
@ -215,7 +247,7 @@
</span> </span>
</td> </td>
</tr> </tr>
<tr dir-paginate-end></tr> <tr class="!h-0" dir-paginate-end></tr>
<!-- no dataset --> <!-- no dataset -->
<tr ng-if="!$ctrl.dataset"> <tr ng-if="!$ctrl.dataset">
<td colspan="6" class="text-center text-muted">Loading...</td> <td colspan="6" class="text-center text-muted">Loading...</td>
@ -227,12 +259,12 @@
</tbody> </tbody>
</table> </table>
</div> </div>
<div class="footer" ng-if="$ctrl.dataset"> <div class="footer pl-5" ng-if="$ctrl.dataset">
<div class="infoBar" ng-if="$ctrl.state.selectedItemCount !== 0"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div> <div class="infoBar !ml-0" ng-if="$ctrl.state.selectedItemCount !== 0"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>
<div class="paginationControls"> <div class="paginationControls">
<form class="form-inline"> <form class="form-inline">
<span class="limitSelector"> <span class="limitSelector">
<span style="margin-right: 5px"> Items per page </span> <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"> <select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()" data-cy="component-paginationSelect">
<option value="0">All</option> <option value="0">All</option>
<option value="10">10</option> <option value="10">10</option>
@ -245,6 +277,4 @@
</form> </form>
</div> </div>
</div> </div>
</rd-widget-body>
</rd-widget>
</div> </div>

View File

@ -1,31 +1,69 @@
<div class="datatable"> <div class="datatable">
<rd-widget> <!-- table title and action menu -->
<rd-widget-body classes="no-padding"> <div class="toolBar !flex-col gap-1">
<div class="toolBar"> <div class="toolBar vertical-center !gap-x-5 !gap-y-1 flex-wrap !p-0 w-full">
<div class="toolBarTitle"> <i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px"></i> {{ $ctrl.titleText }} </div> <!-- title -->
<span class="small text-muted" style="float: left; margin-top: 5px" ng-if="$ctrl.isAdmin && !$ctrl.settings.showSystem"> <div class="toolBarTitle vertical-center">
<i class="fa fa-info-circle blue-icon" aria-hidden="true" style="margin-right: 2px"></i> <pr-icon icon="'list'" feather="true" class-name="'icon-nested-blue'" mode="'primary'"></pr-icon>
System resources are hidden, this can be changed in the table settings. Stacks
</span> </div>
<div class="settings"> <!-- actions -->
<div class="searchBar vertical-center">
<pr-icon icon="'search'" feather="true" class-name="'!h-3'"></pr-icon>
<input
type="text"
class="searchInput min-w-min self-start"
ng-model="$ctrl.state.textFilter"
ng-change="$ctrl.onTextFilterChange()"
placeholder="Search for a stack..."
auto-focus
ng-model-options="{ debounce: 300 }"
/>
</div>
<div class="actionBar !gap-3 !mr-0">
<button
type="button"
class="btn btn-sm btn-dangerlight h-fit vertical-center !ml-0"
ng-disabled="$ctrl.state.selectedItemCount === 0"
ng-click="$ctrl.removeAction($ctrl.state.selectedItems)"
data-cy="k8sApp-removeAppButton"
>
<pr-icon icon="'trash-2'" feather="true"></pr-icon>
Remove
</button>
<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 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><i class="fa fa-cog" aria-hidden="true"></i> Table settings</span> <span uib-dropdown-toggle>
<pr-icon icon="'more-vertical'" feather="true" class-name="'!mr-0 !h-4'"></pr-icon>
</span>
<div class="dropdown-menu dropdown-menu-right" uib-dropdown-menu> <div class="dropdown-menu dropdown-menu-right" uib-dropdown-menu>
<div class="tableMenu"> <div class="tableMenu">
<div class="menuHeader"> Table settings </div> <div class="menuHeader"> Table settings </div>
<div class="menuContent"> <div class="menuContent">
<div> <div>
<div class="md-checkbox" ng-if="$ctrl.isAdmin"> <div class="md-checkbox" ng-if="$ctrl.isAdmin">
<input id="stacks_setting_show_system" type="checkbox" ng-model="$ctrl.settings.showSystem" ng-change="$ctrl.onSettingsShowSystemChange()" /> <input id="applications_setting_show_system" type="checkbox" ng-model="$ctrl.settings.showSystem" ng-change="$ctrl.onSettingsShowSystemChange()" />
<label for="stacks_setting_show_system">Show system resources</label> <label for="applications_setting_show_system">Show system resources</label>
</div> </div>
<div class="md-checkbox"> <div class="md-checkbox">
<input id="setting_auto_refresh" type="checkbox" ng-model="$ctrl.settings.repeater.autoRefresh" ng-change="$ctrl.onSettingsRepeaterChange()" /> <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> <label for="setting_auto_refresh">Auto refresh</label>
</div> </div>
<div ng-if="$ctrl.settings.repeater.autoRefresh"> <div ng-if="$ctrl.settings.repeater.autoRefresh">
<label for="settings_refresh_rate"> Refresh rate </label> <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"> <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="10">10s</option>
<option value="30">30s</option> <option value="30">30s</option>
<option value="60">1min</option> <option value="60">1min</option>
@ -33,71 +71,74 @@
<option value="300">5min</option> <option value="300">5min</option>
</select> </select>
<span> <span>
<i id="refreshRateChange" class="fa fa-check green-icon" aria-hidden="true" style="margin-top: 7px; display: none"></i> <i id="refreshRateChange" class="fa fa-check green-icon mt-2" aria-hidden="true"></i>
</span> </span>
</div> </div>
</div> </div>
</div> </div>
<div> <div>
<a type="button" class="btn btn-default btn-sm" ng-click="$ctrl.settings.open = false;">Close</a> <a type="button" class="btn btn-sm btn-default btn-sm" ng-click="$ctrl.settings.open = false;" data-cy="k8sApp-tableSettingsCloseButton">Close</a>
</div> </div>
</div> </div>
</div> </div>
</span> </span>
</div> </div>
</div> </div>
<div class="actionBar">
<button type="button" class="btn btn-sm btn-danger" ng-disabled="$ctrl.state.selectedItemCount === 0" ng-click="$ctrl.removeAction($ctrl.state.selectedItems)">
<i class="fa fa-trash-alt space-right" aria-hidden="true"></i>Remove
</button>
</div> </div>
<div class="searchBar"> <!-- info text -->
<i class="fa fa-search searchIcon" aria-hidden="true"></i> <div class="flex flex-row">
<input <span class="small text-muted mt-1" ng-if="$ctrl.isAdmin && !$ctrl.settings.showSystem">
type="text" <pr-icon icon="'info'" feather="true"></pr-icon>
class="searchInput" System resources are hidden, this can be changed in the table settings.
ng-model="$ctrl.state.textFilter" </span>
ng-change="$ctrl.onTextFilterChange()" </div>
placeholder="Search..."
auto-focus
ng-model-options="{ debounce: 300 }"
/>
</div> </div>
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-hover nowrap-cells"> <table class="table table-hover nowrap-cells">
<thead> <thead>
<tr> <tr>
<th style="width: 55px"> <th class="w-20 dropdown">
<div class="flex no-wrap h-full items-center">
<span class="md-checkbox"> <span class="md-checkbox">
<input id="select_all" type="checkbox" ng-model="$ctrl.state.selectAll" ng-change="$ctrl.selectAll()" /> <input id="select_all" type="checkbox" ng-model="$ctrl.state.selectAll" ng-change="$ctrl.selectAll()" />
<label for="select_all"></label> <label for="select_all"></label>
</span> </span>
<a ng-click="$ctrl.expandAll()" ng-if="$ctrl.hasExpandableItems()"> <div class="cursor-pointer" ng-click="$ctrl.expandAll()" ng-if="$ctrl.hasExpandableItems()">
<i ng-class="{ 'fas fa-angle-down': $ctrl.state.expandAll, 'fas fa-angle-right': !$ctrl.state.expandAll }" aria-hidden="true"></i> <pr-icon ng-if="$ctrl.state.expandAll" icon="'chevron-down'" feather="true"></pr-icon>
</a> <pr-icon ng-if="!$ctrl.state.expandAll" icon="'chevron-right'" feather="true"></pr-icon>
</div>
</div>
</th> </th>
<th> <th>
<a ng-click="$ctrl.changeOrderBy('Name')"> <table-column-header
Stack col-title="'Stack'"
<i class="fa fa-sort-alpha-down" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'Name' && !$ctrl.state.reverseOrder"></i> can-sort="true"
<i class="fa fa-sort-alpha-up" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder"></i> is-sorted="$ctrl.state.orderBy === 'Name'"
</a> is-sorted-desc="$ctrl.state.orderBy === 'Name' && $ctrl.state.reverseOrder"
ng-click="$ctrl.changeOrderBy('Name')"
></table-column-header>
</th> </th>
<th> <th>
<a ng-click="$ctrl.changeOrderBy('ResourcePool')"> <table-column-header
Namespace col-title="'Namespace'"
<i class="fa fa-sort-alpha-down" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'ResourcePool' && !$ctrl.state.reverseOrder"></i> can-sort="true"
<i class="fa fa-sort-alpha-up" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'ResourcePool' && $ctrl.state.reverseOrder"></i> is-sorted="$ctrl.state.orderBy === 'ResourcePool'"
</a> is-sorted-desc="$ctrl.state.orderBy === 'ResourcePool' && $ctrl.state.reverseOrder"
ng-click="$ctrl.changeOrderBy('ResourcePool')"
></table-column-header>
</th> </th>
<th> <th>
<a ng-click="$ctrl.changeOrderBy('Applications.length')"> <table-column-header
Applications col-title="'Applications'"
<i class="fa fa-sort-numeric-down" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'Applications.length' && !$ctrl.state.reverseOrder"></i> can-sort="true"
<i class="fa fa-sort-numeric-up" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'Applications.length' && $ctrl.state.reverseOrder"></i> is-sorted="$ctrl.state.orderBy === 'Applications.length'"
</a> is-sorted-desc="$ctrl.state.orderBy === 'Applications.length' && $ctrl.state.reverseOrder"
ng-click="$ctrl.changeOrderBy('Applications.length')"
></table-column-header>
</th>
<th>
<table-column-header col-title="'Actions'" can-sort="false"></table-column-header>
</th> </th>
<th> Actions </th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -108,6 +149,7 @@
pagination-id="$ctrl.tableKey" pagination-id="$ctrl.tableKey"
> >
<td> <td>
<div class="flex no-wrap items-center">
<span class="md-checkbox"> <span class="md-checkbox">
<input <input
id="select_{{ $index }}" id="select_{{ $index }}"
@ -118,9 +160,11 @@
/> />
<label for="select_{{ $index }}"></label> <label for="select_{{ $index }}"></label>
</span> </span>
<a ng-if="$ctrl.itemCanExpand(item)"> <div ng-if="$ctrl.itemCanExpand(item)" class="vertical-center">
<i ng-class="{ 'fas fa-angle-down': item.Expanded, 'fas fa-angle-right': !item.Expanded }" class="space-right" aria-hidden="true"></i> <pr-icon ng-if="item.Expanded" icon="'chevron-down'" feather="true"></pr-icon>
</a> <pr-icon ng-if="!item.Expanded" icon="'chevron-right'" feather="true"></pr-icon>
</div>
</div>
</td> </td>
<td> <td>
{{ item.Name }} {{ item.Name }}
@ -131,7 +175,10 @@
</td> </td>
<td>{{ item.Applications.length }}</td> <td>{{ item.Applications.length }}</td>
<td> <td>
<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> <a class="vertical-center" ui-sref="kubernetes.stacks.stack.logs({ namespace: item.ResourcePool, name: item.Name })">
<pr-icon icon="'file-text'" size="'md'" title="Logs" feather="true"></pr-icon>
Logs
</a>
</td> </td>
</tr> </tr>
<tr <tr
@ -157,8 +204,8 @@
</tbody> </tbody>
</table> </table>
</div> </div>
<div class="footer" ng-if="$ctrl.dataset"> <div class="footer pl-5" ng-if="$ctrl.dataset">
<div class="infoBar" ng-if="$ctrl.state.selectedItemCount !== 0"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div> <div class="infoBar !ml-0" ng-if="$ctrl.state.selectedItemCount !== 0"> {{ $ctrl.state.selectedItemCount }} item(s) selected </div>
<div class="paginationControls"> <div class="paginationControls">
<form class="form-inline"> <form class="form-inline">
<span class="limitSelector"> <span class="limitSelector">
@ -175,6 +222,4 @@
</form> </form>
</div> </div>
</div> </div>
</rd-widget-body>
</rd-widget>
</div> </div>

View File

@ -9,7 +9,7 @@
<rd-widget-body classes="no-padding"> <rd-widget-body classes="no-padding">
<uib-tabset active="ctrl.state.activeTab" justified="true" type="pills"> <uib-tabset active="ctrl.state.activeTab" justified="true" type="pills">
<uib-tab index="0" classes="btn-sm" select="ctrl.selectTab(0)"> <uib-tab index="0" classes="btn-sm" select="ctrl.selectTab(0)">
<uib-tab-heading> <i class="fa fa-laptop-code space-right" aria-hidden="true"></i> Applications </uib-tab-heading> <uib-tab-heading class="vertical-center"> <pr-icon icon="'box'" feather="true"></pr-icon> Applications </uib-tab-heading>
<kubernetes-applications-datatable <kubernetes-applications-datatable
dataset="ctrl.state.applications" dataset="ctrl.state.applications"
table-key="kubernetes.applications" table-key="kubernetes.applications"
@ -23,12 +23,12 @@
</kubernetes-applications-datatable> </kubernetes-applications-datatable>
</uib-tab> </uib-tab>
<uib-tab index="1" classes="btn-sm" select="ctrl.selectTab(1)"> <uib-tab index="1" classes="btn-sm" select="ctrl.selectTab(1)">
<uib-tab-heading> <i class="fa fa-exchange-alt space-right" aria-hidden="true"></i> Port mappings </uib-tab-heading> <uib-tab-heading class="vertical-center"> <pr-icon icon="'repeat'" feather="true"></pr-icon> Port mappings </uib-tab-heading>
<kubernetes-applications-ports-datatable dataset="ctrl.state.ports" table-key="kubernetes.applications.ports" order-by="Name" refresh-callback="ctrl.getApplications"> <kubernetes-applications-ports-datatable dataset="ctrl.state.ports" table-key="kubernetes.applications.ports" order-by="Name" refresh-callback="ctrl.getApplications">
</kubernetes-applications-ports-datatable> </kubernetes-applications-ports-datatable>
</uib-tab> </uib-tab>
<uib-tab index="2" classes="btn-sm" select="ctrl.selectTab(2)"> <uib-tab index="2" classes="btn-sm" select="ctrl.selectTab(2)">
<uib-tab-heading> <i class="fa fa-th-list space-right" aria-hidden="true"></i> Stacks </uib-tab-heading> <uib-tab-heading class="vertical-center"> <pr-icon icon="'list'" feather="true"></pr-icon> Stacks </uib-tab-heading>
<kubernetes-applications-stacks-datatable <kubernetes-applications-stacks-datatable
dataset="ctrl.state.stacks" dataset="ctrl.state.stacks"
table-key="kubernetes.applications.stacks" table-key="kubernetes.applications.stacks"

View File

@ -1,4 +1,10 @@
<span> <span>
<button type="button" class="btn btn-link nopadding" ng-click="$ctrl.copyValueText()" title="Copy Value"> <i class="fa fa-copy"></i> Copy </button> <button type="button" class="btn btn-link nopadding" ng-click="$ctrl.copyValueText()" title="Copy Value">
<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> <pr-icon icon="'clipboard'" feather="true"></pr-icon>
Copy
</button>
<span ng-class="{ 'copy-button-fadeout': $ctrl.state.isFading }" class="copy-button-copy-text">
<pr-icon icon="'check'" feather="true"></pr-icon>
copied
</span>
</span> </span>

View File

@ -47,6 +47,10 @@
text-decoration: underline; text-decoration: underline;
} }
.datatable tr > td a.actions {
color: currentColor;
}
.toolBar .actionBar { .toolBar .actionBar {
display: inline-flex; display: inline-flex;
} }

View File

@ -4,6 +4,12 @@
</div> </div>
<button type="button" class="btn btn-link nopadding" ng-click="$ctrl.show = !$ctrl.show" title="Show/Hide value"> <button type="button" class="btn btn-link nopadding" ng-click="$ctrl.show = !$ctrl.show" title="Show/Hide value">
<div ng-if="!$ctrl.show"> <i class="fa fa-eye-slash"></i> Show</div> <div ng-if="!$ctrl.show">
<div ng-if="$ctrl.show"> <i class="fa fa-eye"></i> Hide</div> <pr-icon icon="'eye-off'" feather="true"></pr-icon>
Show</div
>
<div ng-if="$ctrl.show">
<pr-icon icon="'eye'" feather="true"></pr-icon>
Hide</div
>
</button> </button>