2018-06-14 15:46:55 +02:00
<!-- Modal postinstall confirm -->
2024-01-16 13:54:42 +01:00
< div class = "modal fade" id = "appsPostInstallConfirmModal" tabindex = "-1" role = "dialog" >
2018-06-14 15:46:55 +02:00
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
< img ng-src = "{{appPostInstallConfirm.app.iconUrl}}" onerror = "this.onerror=null;this.src='img/appicon_fallback.png'" class = "app-info-icon" / >
2024-06-20 15:57:45 +02:00
< div class = "app-info-title" >
{{ appPostInstallConfirm.app.manifest.title }}< br / >
< span class = "text-muted text-small" > {{ 'app.appInfo.package' | tr }} < a ng-href = "/#/appstore/{{appPostInstallConfirm.app.manifest.id}}?version={{appPostInstallConfirm.app.manifest.version}}" > v{{ appPostInstallConfirm.app.manifest.version }}< / a > < / span >
2018-08-05 21:36:40 -07:00
< br / >
2024-06-20 15:57:45 +02:00
< span ng-show = "appPostInstallConfirm.app.manifest.documentationUrl" class = "text-small" > < a target = "_blank" ng-href = "{{appPostInstallConfirm.app.manifest.documentationUrl}}" > {{ 'app.docsAction' | tr }}< / a > < / span >
2018-08-05 21:36:40 -07:00
< br / >
2024-06-20 15:57:45 +02:00
< / div >
2018-06-14 15:46:55 +02:00
< / div >
< div class = "modal-body" >
2024-06-25 16:56:33 +02:00
<!--
< p ng-show = "appPostInstallConfirm.app.manifest.addons.email" > {{ 'app.appInfo.ssoEmail' | tr }}< / p >
< p ng-show = "appPostInstallConfirm.app.sso && !appPostInstallConfirm.app.manifest.addons.email" > {{ 'app.appInfo.sso' | tr }}< / p >
-->
< div ng-bind-html = "appPostInstallConfirm.message | markdown2html" > < / div >
< div ng-show = "appPostInstallConfirm.app.manifest.documentationUrl" ng-bind-html = "'app.appInfo.appDocsUrl' | tr:{ docsUrl: appPostInstallConfirm.app.manifest.documentationUrl, title: appPostInstallConfirm.app.manifest.title, forumUrl: (appPostInstallConfirm.app.manifest.forumUrl || 'https://forum.cloudron.io') }" > < / div >
2024-08-20 19:00:19 +02:00
< div style = "margin-top: 10px; margin-bottom: 5px;" ng-show = "pendingChecklistItems(appPostInstallConfirm.app)" >
< label class = "control-label" > {{ 'app.appInfo.checklist' | tr }}< / label >
< / div >
2024-05-20 18:04:02 +02:00
< div ng-repeat = "item in appPostInstallConfirm.app.checklist" >
< div class = "checklist-item" ng-hide = "item.acknowledged" >
2024-07-30 09:47:06 +02:00
< span ng-bind-html = "item.message | markdown2html" > < / span >
2024-05-20 18:04:02 +02:00
< / div >
< / div >
2018-06-14 15:46:55 +02:00
< / div >
< div class = "modal-footer" >
2020-11-17 13:58:05 +01:00
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > {{ 'main.dialog.close' | tr }}< / button >
2024-06-25 16:56:33 +02:00
< a class = "btn btn-success" ng-href = "{{ 'https://' + appPostInstallConfirm.app.fqdn }}" target = "_blank" ng-click = "appPostInstallConfirm.submit()" > {{ 'app.appInfo.openAction' | tr:{ app: appPostInstallConfirm.app.manifest.title } }}< / a >
2018-06-14 15:46:55 +02:00
< / div >
< / div >
< / div >
< / div >
2022-07-07 16:25:04 +02:00
<!-- Modal applinks edit -->
< div class = "modal fade" id = "applinksEditModal" tabindex = "-1" role = "dialog" >
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2022-07-11 17:24:07 +02:00
< h4 class = "modal-title" > {{ 'app.editApplinkDialog.title' | tr }}< / h4 >
2022-07-07 16:25:04 +02:00
< / div >
< div class = "modal-body" >
< form name = "applinksEditForm" role = "form" ng-submit = "applinksEdit.submit()" autocomplete = "off" >
< div class = "form-group" ng-class = "{ 'has-error': (applinksEditForm.upstreamUri.$dirty && applinksEditForm.upstreamUri.$invalid) || (!applinksEditForm.upstreamUri.$dirty && applinksEdit.error.upstreamUri) }" >
2022-07-11 17:24:07 +02:00
< label class = "control-label" > {{ 'app.applinks.upstreamUri' | tr }}< / label >
2022-07-07 16:25:04 +02:00
< input type = "text" class = "form-control" ng-model = "applinksEdit.upstreamUri" name = "upstreamUri" id = "inputUpstreamUri" autofocus autocomplete = "off" required >
2022-10-06 20:03:22 +02:00
< span class = "text-danger" ng-show = "applinksEdit.error.upstreamUri" > {{ applinksEdit.error.upstreamUri }}< / span >
2022-07-07 16:25:04 +02:00
< / div >
2022-07-07 18:53:14 +02:00
< div class = "form-group" >
2022-07-11 17:24:07 +02:00
< label class = "control-label" > {{ 'app.applinks.label' | tr }}< / label >
2022-07-07 18:53:14 +02:00
< input type = "text" class = "form-control" ng-model = "applinksEdit.label" name = "label" id = "inputLabel" autocomplete = "off" >
< / div >
2022-07-08 17:44:20 +02:00
< div class = "form-group" >
< div >
< label class = "control-label" > {{ 'app.display.icon' | tr }}< / label >
< / div >
< div id = "previewIcon" class = "app-custom-icon" ng-click = "applinksEdit.showCustomIconSelector()" >
< img ng-src = "{{ applinksEdit.iconUrl() || 'img/appicon_fallback.png' }}" fallback-icon = "img/appicon_fallback.png" onerror = "imageErrorHandler(this)" / >
2024-04-08 16:28:38 +02:00
< i class = "picture-edit-indicator fa fa-pencil-alt" > < / i >
2022-07-08 17:44:20 +02:00
< / div >
2022-10-06 19:29:35 +02:00
< a href = "" style = "font-weight: normal;" ng-click = "applinksEdit.resetCustomIcon()" > {{ 'app.applinks.clearIconAction' | tr }}< / a > - < span class = "text-small" > {{ 'app.applinks.clearIconDescription' | tr }}< / span >
2022-07-08 17:44:20 +02:00
< input type = "file" id = "applinksEditIconFileInput" style = "display: none" accept = "image/png" / >
< / div >
2022-07-07 19:11:54 +02:00
< div class = "form-group" >
< label class = "control-label" > {{ 'app.display.tags' | tr }}< / label >
< tag-input class = "form-control" placeholder = "{{ 'app.display.tagsPlaceholder' | tr }}" taglist = "applinksEdit.tags" name = "tags" uib-tooltip = "{{ 'app.display.tagsTooltip' | tr }}" > < / tag-input >
< / div >
2022-07-08 15:09:02 +02:00
< label class = "control-label" > {{ 'app.accessControl.userManagement.dashboardVisibility' | tr }} < sup > < a ng-href = "https://docs.cloudron.io/apps/#dashboard-visibility" class = "help" target = "_blank" > < i class = "fa fa-question-circle" > < / i > < / a > < / sup > < / label >
2022-07-07 19:45:13 +02:00
< div class = "radio" >
< label >
< input type = "radio" ng-model = "applinksEdit.accessRestrictionOption" value = "any" >
< span > {{ 'app.accessControl.userManagement.visibleForAllUsers' | tr }}< / span >
< / label >
< / div >
< div class = "radio" >
< label >
< input type = "radio" ng-model = "applinksEdit.accessRestrictionOption" value = "groups" >
< span > {{ 'app.accessControl.userManagement.visibleForSelected' | tr }}< / span >
< span class = "label label-danger" ng-show = "applinksEdit.accessRestrictionOption === 'groups' && !applinksEdit.isAccessRestrictionValid()" > {{ 'appstore.installDialog.errorUserManagementSelectAtLeastOne' | tr }}< / span >
< / label >
< / div >
< div >
2022-07-08 15:09:02 +02:00
< div style = "margin-left: 20px; display: flex;" >
< div >
2022-07-07 19:45:13 +02:00
{{ 'appstore.installDialog.users' | tr }}: < multiselect name = "accessUsersSelect" class = "input-sm stretch" ng-model = "applinksEdit.accessRestriction.users" ng-disabled = "applinksEdit.accessRestrictionOption !== 'groups'" options = "(user.username || user.email) for user in allUsers" data-multiple = "true" filter-after-rows = "5" scroll-after-rows = "10" > < / multiselect >
< / div >
2022-07-08 15:09:02 +02:00
< div >
2022-07-07 19:45:13 +02:00
{{ 'appstore.installDialog.groups' | tr }}: < multiselect name = "accessGroupsSelect" class = "input-sm stretch" ng-model = "applinksEdit.accessRestriction.groups" ng-disabled = "applinksEdit.accessRestrictionOption !== 'groups'" options = "group.name for group in allGroups" data-multiple = "true" filter-after-rows = "5" scroll-after-rows = "10" > < / multiselect >
< / div >
< / div >
< / div >
2022-07-07 16:41:12 +02:00
< input class = "ng-hide" type = "submit" ng-disabled = "applinksEditForm.$invalid || applinksEdit.busyEdit || applinks.busyRemove" / >
2022-07-07 16:25:04 +02:00
< / form >
< / div >
< div class = "modal-footer" >
2022-07-11 17:24:07 +02:00
< button type = "button" class = "btn btn-danger pull-left" ng-click = "applinksEdit.remove()" ng-disabled = "applinksEdit.busyRemove || applinksEdit.busyEdit" > < i class = "fa fa-circle-notch fa-spin" ng-show = "applinksEdit.busyRemove" > < / i > {{ 'app.editApplinkDialog.deleteAction' | tr }}< / button >
2022-07-07 16:25:04 +02:00
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > {{ 'main.dialog.close' | tr }}< / button >
2022-07-07 16:41:12 +02:00
< button type = "button" class = "btn btn-success" ng-click = "applinksEdit.submit()" ng-disabled = "applinksEditForm.$invalid || applinksEdit.busyRemove || applinksEdit.busyEdit" > < i class = "fa fa-circle-notch fa-spin" ng-show = "applinksEdit.busyEdit" > < / i > {{ 'main.dialog.save' | tr }}< / button >
2022-07-07 16:25:04 +02:00
< / div >
< / div >
< / div >
< / div >
2018-01-22 13:01:38 -08:00
< div class = "content content-large" >
<!-- Workaround for select - all issue, see commit message -->
< div style = "font-size: 1px;" > < / div >
2020-02-24 12:56:13 +01:00
< div class = "animateMeOpacity ng-hide" ng-show = "installedApps.length === 0 && user.isAtLeastAdmin" >
2020-11-17 16:29:53 +01:00
< div class = "col-md-12" style = "text-align: center;" >
< br / > < br / > < br / > < br / >
< h1 > < i class = "fa fa-cloud-download fa-fw" > < / i > {{ 'apps.noApps.title' | tr }}< / h1 >
< br / > < / br >
< h3 ng-bind-html = "'apps.noApps.description' | tr:{ appStoreLink: '#/appstore' }" > < / h3 >
< / div >
2018-01-22 13:01:38 -08:00
< / div >
2020-02-24 12:56:13 +01:00
< div class = "animateMeOpacity ng-hide" ng-show = "installedApps.length === 0 && !user.isAtLeastAdmin" >
2020-11-17 16:29:53 +01:00
< div class = "col-md-12" style = "text-align: center;" >
< br / > < br / > < br / > < br / >
< h1 > {{ 'apps.noAccess.title' | tr }}< / h1 >
< br / > < / br >
< h3 > {{ 'apps.noAccess.description' | tr }}< / h3 >
< / div >
2018-01-22 13:01:38 -08:00
< / div >
2024-09-25 21:36:37 +02:00
< h1 class = "view-header" ng-show = "installedApps.length > 0" >
2022-10-03 21:28:49 +02:00
{{ 'apps.title' | tr }}
< div class = "view-header-search-bar" >
< form class = "form-inline" >
2022-10-13 22:27:35 +02:00
< div class = "input-group" >
2024-10-07 16:48:31 +02:00
< input type = "text" class = "form-control" placeholder = "{{ 'apps.searchPlaceholder' | tr }} ( / )" id = "appSearch" ng-model = "appSearch" / >
2022-10-03 21:28:49 +02:00
< span class = "input-group-btn" >
2024-06-21 15:39:02 +02:00
< button class = "btn btn-default" type = "button" ng-class = "{ 'active': showFilter }" ng-click = "toggleFilter()" > < i class = "fas fa-filter" > < / i > < / button >
2022-10-03 21:28:49 +02:00
< / span >
< / div >
2024-10-07 16:48:31 +02:00
< button class = "btn btn-default" style = "margin-left: 10px;" type = "button" ng-click = "toggleView()" > < i class = "fas" ng-class = "{ 'fa-list': view === VIEWS.GRID, 'fa-grip': view === VIEWS.LIST }" > < / i > < / button >
2022-10-03 21:28:49 +02:00
< / form >
< / div >
< / h1 >
2019-04-12 11:06:56 +02:00
2024-04-10 12:24:45 +02:00
< div ng-show = "showFilter" class = "view-header-filter-bar" >
< form class = "form-inline" >
< multiselect ng-model = "selectedGroup" ng-show = "user.isAtLeastAdmin && groups.length > 1" ms-header = "{{ selectedGroup.name }}" options = "group.name for group in groups" data-multiple = "false" filter-after-rows = "5" scroll-after-rows = "10" > < / multiselect >
< multiselect ng-model = "selectedState" ng-show = "user.isAtLeastAdmin" ms-header = "{{ 'apps.stateFilterHeader' | tr }}" ms-selected = "{{ selectedState }}" options = "state.label for state in states" data-multiple = "false" > < / multiselect >
< multiselect ng-model = "selectedTags" ng-show = "user.isAtLeastAdmin && tags.length > 0" ms-header = "{{ 'apps.tagsFilterHeaderAll' | tr }}" ms-selected = "{{ 'apps.tagsFilterHeader' | tr:{ tags: selectedTags.join(', ') } }}" options = "tag for tag in tags" data-multiple = "true" filter-after-rows = "5" scroll-after-rows = "10" > < / multiselect >
< multiselect ng-model = "selectedDomain" data-compare-by = "domain" ms-selected = "{{ selectedDomain.domain }}" options = "domain.domain for domain in filterDomains" data-multiple = "false" filter-after-rows = "5" scroll-after-rows = "10" > < / multiselect >
<!-- <button class="btn btn - primary" ng - disabled="!selectedTags.length && !selectedState.state && selectedGroup._unset && selectedDomain._alldomains" ng - click="clearAllFilter()">{{ 'apps.filter.clearAll' | tr }}</button> -->
< / form >
< / div >
2018-01-22 13:01:38 -08:00
< div class = "animateMeOpacity ng-hide" ng-show = "installedApps.length > 0" >
2024-04-29 09:32:00 +02:00
< div class = "app-grid" ng-show = "view === VIEWS.GRID" >
2024-04-09 13:51:43 +02:00
< div class = "grid-item" ng-class = "{ 'stopped': app.runState === 'stopped' }" ng-repeat = "app in installedApps | selectedGroupAccessFilter:selectedGroup | selectedStateFilter:selectedState | selectedTagFilter:selectedTags | selectedDomainFilter:selectedDomain | appSearchFilter:appSearch | orderBy:orderByFilter" >
2024-06-27 13:49:20 +02:00
< div class = "grid-item-content" uib-tooltip = "{{ app.fqdn }}" tooltip-append-to-body = "true" >
2024-04-11 13:45:34 +02:00
< a ng-show = "app.type !== APP_TYPES.LINK && isOperator(app)" ng-href = "#/app/{{ app.id}}/info" class = "btn btn-lg btn-default grid-item-action" > < i class = "fas fa-cog" > < / i > < / a >
2022-07-11 17:24:07 +02:00
< div ng-show = "app.type === APP_TYPES.LINK && isOperator(app)" ng-click = "applinksEdit.show(app)" class = "btn btn-lg btn-default grid-item-action" > < i class = "fas fa-cog" > < / i > < / div >
2022-09-11 17:40:59 +02:00
< a ng-href = "{{ app | applicationLink }}" ng-click = "onAppClick(app, $event)" target = "_blank" >
2019-04-15 14:31:12 +02:00
< div class = "grid-item-top" >
< div class = "row" >
< div class = "col-xs-12 text-center" style = "padding-left: 5px; padding-right: 5px;" >
2019-09-18 18:10:51 +02:00
< img ng-src = "{{ app.iconUrl || 'img/appicon_fallback.png' }}" fallback-icon = "img/appicon_fallback.png" onerror = "imageErrorHandler(this)" class = "app-icon" / >
2019-04-15 14:31:12 +02:00
< / div >
< / div >
< br / >
< div class = "row" >
< div class = "col-xs-12 text-center" >
2022-01-16 18:29:32 -08:00
< div class = "grid-item-top-title" data-fittext > {{ app.label || app.subdomain || app.fqdn }}< / div >
2021-03-30 13:31:24 +02:00
< div class = "text-muted status" style = "text-overflow: ellipsis; white-space: nowrap; overflow: hidden" uib-tooltip = "{{ app | appProgressMessage }}" >
2020-05-12 21:30:57 -07:00
{{ app | installationStateLabel }}
2019-04-15 14:31:12 +02:00
< / div >
2021-09-21 15:26:05 -07:00
< div class = "status" ng-style = "{ 'visibility': isOperator(app) && (app | installationActive) ? 'visible' : 'hidden' }" >
2019-04-15 14:31:12 +02:00
< div class = "progress progress-striped active" >
< div class = "progress-bar progress-bar-success" role = "progressbar" style = "width: {{ app.progress }}%" > < / div >
2019-03-25 10:42:31 +01:00
< / div >
2018-01-22 13:01:38 -08:00
< / div >
2019-03-25 10:42:31 +01:00
< / div >
< / div >
2021-04-20 20:43:37 +02:00
2022-09-08 23:37:33 +02:00
< div class = "usermanagement-indicator" ng-show = "app.type !== APP_TYPES.LINK" >
2023-09-27 16:13:29 +02:00
< i class = "fa-brands fa-openid" ng-show = "app.ssoAuth && app.manifest.addons.oidc" uib-tooltip = "{{ 'apps.auth.openid' | tr }}" tooltip-placement = "right" > < / i >
< i class = "fas fa-user" ng-show = "app.ssoAuth && (!app.manifest.addons.oidc && !app.manifest.addons.email)" uib-tooltip = "{{ 'apps.auth.sso' | tr }}" tooltip-placement = "right" > < / i >
2021-07-07 21:08:23 +02:00
< i class = "far fa-user" ng-show = "!app.ssoAuth && !app.manifest.addons.email" uib-tooltip = "{{ 'apps.auth.nosso' | tr }}" tooltip-placement = "right" > < / i >
< i class = "fas fa-envelope" ng-show = "app.manifest.addons.email" uib-tooltip = "{{ 'apps.auth.email' | tr }}" tooltip-placement = "right" > < / i >
2021-04-20 20:43:37 +02:00
< / div >
2019-04-15 14:31:12 +02:00
< / div >
2018-01-22 13:01:38 -08:00
2021-04-06 18:27:59 +02:00
< / a >
2024-06-18 16:37:21 +02:00
< / div >
2021-06-30 16:06:32 +02:00
2024-06-18 16:37:21 +02:00
<!-- we check the version here because the box updater does not know when an app gets updated -->
2024-12-19 12:36:47 +01:00
<!-- update info is available to app users. but we should show update indicator only for operators since normal users cannot update -->
< div class = "app-update-badge" ng-click = "showAppConfigure(app, 'updates')" ng-show = "isOperator(app) && config.update[app.id].manifest.version && config.update[app.id].manifest.version !== app.manifest.version && (app | installSuccess) && !(app.error || app.runState === 'stopped')" uib-tooltip = "Update Available" >
2024-06-18 16:37:21 +02:00
< i class = "fa fa-arrow-up fa-inverse" > < / i >
< / div >
2024-06-25 20:38:24 +02:00
< div class = "app-checklist-badge" ng-click = "showAppConfigure(app, 'info')" ng-show = "pendingChecklistItems(app)" >
{{ pendingChecklistItems(app) }}
2021-04-06 18:27:59 +02:00
< / div >
2018-01-22 13:01:38 -08:00
< / div >
2019-03-25 10:42:31 +01:00
< / div >
2024-04-06 12:30:44 +02:00
2024-04-29 09:32:00 +02:00
< div class = "app-list card card-large" ng-show = "view === VIEWS.LIST" >
2024-04-06 12:30:44 +02:00
< table class = "table table-hover" style = "margin: 0;" >
< thead >
< tr >
2024-06-21 21:17:05 +02:00
< th style = "width: 32px" class = "hand" ng-click = "setOrderBy('status')" > < i ng-show = "orderBy === 'status'" class = "fas fa-arrow-{{ orderByReverse ? 'up' : 'down' }}-long" > < / i > < / th >
2024-04-06 12:30:44 +02:00
< th style = "width: 32px" > < / th >
2024-06-25 20:38:24 +02:00
< th style = "width: 35%" class = "hand" ng-click = "setOrderBy('location')" > {{ 'app.display.label' | tr }} < i ng-show = "orderBy === 'location'" class = "fas fa-arrow-{{ orderByReverse ? 'up' : 'down' }}-long" > < / i > < / th >
2024-06-21 21:17:05 +02:00
< th style = "width: 30%" class = "hand hide-mobile" ng-click = "setOrderBy('app')" > App Title< i ng-show = "orderBy === 'app'" class = "fas fa-arrow-{{ orderByReverse ? 'up' : 'down' }}-long" > < / i > < / th >
2024-10-07 16:53:31 +02:00
< th style = "width: 32px" class = "hide-mobile" > < / th >
2024-06-21 21:17:05 +02:00
< th style = "width: 32px" class = "hand hide-mobile text-center" ng-click = "setOrderBy('sso')" > < i class = "fas fa-user-lock" > < / i > < i ng-show = "orderBy === 'sso'" class = "fas fa-arrow-{{ orderByReverse ? 'up' : 'down' }}-long" > < / i > < / th >
2024-06-25 20:38:24 +02:00
< th style = "width:160px" class = "text-right" > {{ 'main.actions' | tr }}< / th >
2024-04-06 12:30:44 +02:00
< / tr >
< / thead >
< tbody >
2024-04-09 13:51:43 +02:00
< tr class = "app-list-item" ng-repeat = "app in installedApps | selectedGroupAccessFilter:selectedGroup | selectedStateFilter:selectedState | selectedTagFilter:selectedTags | selectedDomainFilter:selectedDomain | appSearchFilter:appSearch | orderBy:orderByFilter:orderByReverse" uib-tooltip = "{{ app | appProgressMessage }}" >
2024-06-21 21:17:05 +02:00
< td class = "elide-table-cell" >
< i class = "fa fa-circle" ng-class = "app | installationStateClass" uib-tooltip = "{{ app | installationStateLabel }}" > < / i >
< / td >
2024-04-06 16:12:08 +02:00
< td class = "elide-table-cell app-list-app-link-cell" >
2024-04-06 15:47:46 +02:00
< a ng-href = "{{ app | applicationLink }}" ng-click = "onAppClick(app, $event)" target = "_blank" class = "app-list-app-link" >
2024-04-06 12:30:44 +02:00
< img ng-src = "{{ app.iconUrl || 'img/appicon_fallback.png' }}" fallback-icon = "img/appicon_fallback.png" onerror = "imageErrorHandler(this)" class = "app-list-item-icon" / >
< / a >
< / td >
2024-04-06 16:12:08 +02:00
< td class = "elide-table-cell app-list-app-link-cell" >
2024-04-06 12:30:44 +02:00
< a ng-href = "{{ app | applicationLink }}" ng-click = "onAppClick(app, $event)" target = "_blank" class = "app-list-app-link" >
2024-06-21 21:17:05 +02:00
< span style = "font-size: 16px;" > {{ app.label || app.subdomain || app.fqdn }}< / span > < br / >
< span class = "text-muted text-small" > {{ app.fqdn.indexOf('http') === 0 ? app.fqdn : 'https://'+app.fqdn }}< / span >
2024-04-06 12:30:44 +02:00
< / a >
< / td >
2024-04-09 13:51:43 +02:00
< td class = "elide-table-cell hide-mobile" > {{ app.manifest.title || 'App Link' }}< / td >
2024-06-25 20:38:24 +02:00
< td class = "elide-table-cell hide-mobile text-center" >
< a class = "badge badge-danger" ng-show = "pendingChecklistItems(app)" ng-href = "#/app/{{ app.id}}/info" > {{ pendingChecklistItems(app) }}< / a >
< / td >
2024-06-21 21:17:05 +02:00
< td class = "elide-table-cell hide-mobile text-center" >
2024-04-06 12:30:44 +02:00
< div ng-show = "app.type !== APP_TYPES.LINK" >
< i class = "fa-brands fa-openid" ng-show = "app.ssoAuth && app.manifest.addons.oidc" uib-tooltip = "{{ 'apps.auth.openid' | tr }}" > < / i >
< i class = "fas fa-user" ng-show = "app.ssoAuth && (!app.manifest.addons.oidc && !app.manifest.addons.email)" uib-tooltip = "{{ 'apps.auth.sso' | tr }}" > < / i >
< i class = "far fa-user" ng-show = "!app.ssoAuth && !app.manifest.addons.email" uib-tooltip = "{{ 'apps.auth.nosso' | tr }}" > < / i >
< i class = "fas fa-envelope" ng-show = "app.manifest.addons.email" uib-tooltip = "{{ 'apps.auth.email' | tr }}" > < / i >
< / div >
< / td >
2024-12-04 18:15:28 +01:00
< td class = "text-right" style = "vertical-align: middle; white-space: nowrap;" >
2024-04-08 16:44:15 +02:00
< span ng-show = "isOperator(app)" >
< a class = "btn btn-xs btn-success" style = "padding: 1px 7px;" ng-show = "config.update[app.id].manifest.version && config.update[app.id].manifest.version !== app.manifest.version && (app | installSuccess) && !(app.error || app.runState === 'stopped')" ng-href = "#/app/{{ app.id}}/updates" uib-tooltip = "Update Available" > < i class = "fa fa-arrow-up" > < / i > < / a >
2024-04-06 15:47:46 +02:00
2024-06-25 20:38:24 +02:00
< div class = "btn-group btn-group-xs" role = "group" >
2024-10-04 20:47:49 +02:00
< a class = "btn btn-xs btn-default" ng-show = "app.type !== APP_TYPES.LINK" ng-href = "{{ '/logs.html?appId=' + app.id }}" target = "_blank" tooltip-append-to-body = "true" uib-tooltip = "{{ 'app.logsActionTooltip' | tr }}" > < i class = "fas fa-align-left" > < / i > < / a >
2024-10-04 21:04:08 +02:00
< a class = "btn btn-xs btn-default" ng-show = "app.type !== APP_TYPES.PROXIED && app.type !== APP_TYPES.LINK" ng-href = "{{ '/terminal.html?id=' + app.id }}" target = "_blank" tooltip-append-to-body = "true" uib-tooltip = "{{ 'app.terminalActionTooltip' | tr }}" > < i class = "fa fa-terminal" > < / i > < / a >
2024-10-04 21:37:17 +02:00
< a class = "btn btn-xs btn-default" ng-show = "app.manifest.addons.localstorage" ng-href = "{{ '/filemanager.html#/home/app/' + app.id }}" target = "_blank" tooltip-append-to-body = "true" uib-tooltip = "{{ 'app.filemanagerActionTooltip' | tr }}" > < i class = "fas fa-folder" > < / i > < / a >
2024-06-25 20:38:24 +02:00
< / div >
2024-04-06 12:30:44 +02:00
2024-04-08 16:44:15 +02:00
< button class = "btn btn-xs btn-default" ng-show = "app.type === APP_TYPES.LINK" ng-click = "applinksEdit.show(app)" uib-tooltip = "Configure Applink" > < i class = "fa fa-cog" > < / i > < / button >
2024-04-11 13:45:34 +02:00
< a class = "btn btn-xs btn-default" ng-show = "app.type !== APP_TYPES.LINK" ng-href = "#/app/{{ app.id}}/info" uib-tooltip = "Configure App" > < i class = "fa fa-cog" > < / i > < / a >
2024-04-08 16:44:15 +02:00
< / span >
2024-04-06 12:30:44 +02:00
< / td >
< / tr >
< / tbody >
< / table >
2024-04-12 14:12:03 +02:00
< br / >
< div >
{{ 'apps.apps.count' | tr:{ count: (installedApps | selectedGroupAccessFilter:selectedGroup | selectedStateFilter:selectedState | selectedTagFilter:selectedTags | selectedDomainFilter:selectedDomain | appSearchFilter:appSearch).length } }}
< / div >
2024-04-06 12:30:44 +02:00
< / div >
2018-01-22 13:01:38 -08:00
< / div >
< / div >