Merge pull request #534 from nextcloud/fix/noid/icondisplay

Fix/noid/icondisplay
This commit is contained in:
newhinton 2019-05-12 23:03:56 +02:00 committed by GitHub
commit 1d15d253de
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 97 additions and 54 deletions

View file

@ -78,6 +78,7 @@ return [
#Icons
['name' => 'icon#getSingleIcon', 'url' => '/api/v2/geticon/{base64Url}', 'verb' => 'GET'],
['name' => 'icon#getIcon', 'url' => '/api/v2/icon/{base64Url}', 'verb' => 'GET'],
['name' => 'icon#getIcon', 'url' => '/api/v2/icon/{base64Url}/{credentialId}', 'verb' => 'GET'],
['name' => 'icon#getLocalIconList', 'url' => '/api/v2/icon/list', 'verb' => 'GET'],

View file

@ -52,6 +52,28 @@ class IconController extends ApiController {
}
/**
* @NoAdminRequired
* @NoCSRFRequired
*/
public function getSingleIcon($base64Url) {
$url = base64_decode(str_replace('_','/', $base64Url));
if (!preg_match("~^(?:f|ht)tps?://~i", $url)) {
$url = "http://" . $url;
}
$icon = new IconService($url);
if ($icon->icoExists) {
$icon_json['type']= $icon->icoType;
$icon_json['content']= base64_encode($icon->icoData);
return new JSONResponse($icon_json);
}
return new JSONResponse();
}
/**
* @NoAdminRequired
* @NoCSRFRequired

View file

@ -143,6 +143,10 @@ class TranslationController extends ApiController {
'pick.icon.search' => $this->trans->t('Search icons'),
'pick.icon.custom.label' => $this->trans->t('Upload a custom icon:'),
'use.icon' => $this->trans->t('Use this icon'),
'use.icon.delete' => $this->trans->t('Delete current icon'),
'use.icon.refresh' => $this->trans->t('Get icon from page'),
'use.icon.refresh.trying' => $this->trans->t('This may take a few seconds...'),
'use.icon.refresh.error' => $this->trans->t('There was an error fetching the icon!'),
'selected.icon' => $this->trans->t('Selected icon'),
// templates/views/partials/edit_credential/custom_fields.html

View file

@ -370,19 +370,6 @@
$scope.updateExistingListWithCredential(updated_cred);
});
}
$scope.refreshListWithSaved();
};
$scope.refreshListWithSaved = function () {
var current_vault = $rootScope.vaultCache[$scope.active_vault.guid];
var cv_credentials = current_vault.credentials;
for (var i = 0; i < cv_credentials.length; i++) {
if (cv_credentials[i].credential_id === $scope.storedCredential.credential_id) {
cv_credentials[i] = $scope.storedCredential;
}
}
current_vault.credentials=cv_credentials;
$rootScope.vaultCache[$scope.active_vault.guid] = current_vault;
};
$scope.updateExistingListWithCredential = function (credential) {
@ -395,14 +382,13 @@
}
credential.tags_raw = credential.tags;
var found=false;
var credList=$rootScope.vaultCache[$scope.active_vault.guid].credentials;
for (var i = 0; i < credList.length; i++) {
if (credList[i].credential_id === credential.credential_id) {
if (credList[i].credential_id === credential.credential_id) {
$rootScope.vaultCache[$scope.active_vault.guid].credentials[i]=credential;
found=true;
}
}
}
if(!found){

View file

@ -30,7 +30,7 @@
* # passwordGen
*/
angular.module('passmanApp').directive('iconPicker', [
'$window', 'IconService', '$http', function($window, IconService, $http) {
'$window', 'IconService', '$http', 'NotificationService','$translate', function($window, IconService, $http, NotificationService, $translate) {
return {
templateUrl: 'views/partials/icon-picker.html',
restrict: 'A',
@ -95,8 +95,6 @@
};
$('#iconPicker-CustomIcon').on('change', function(ev) {
console.log("upload");
scope.customIcon = {};
var f = ev.target.files[0];
@ -110,26 +108,44 @@
fr.readAsDataURL(f);
});
scope.deleteIcon = function() {
delete scope.credential.icon.type;
delete scope.credential.icon.content;
delete scope.credential.icon;
$('#iconPicker').dialog('close');
};
scope.refreshUrlIcon = function(){
NotificationService.showNotification($translate.instant('use.icon.refresh.trying'), 5000);
var queryUrl = OC.generateUrl('apps/passman/api/v2/geticon/'+btoa(scope.credential.url));
$http.get(queryUrl).then(function (response) {
if(typeof response.data.content !== 'undefined'){
scope.customIcon = {};
scope.customIcon.data='data:image/'+response.data.type+';base64,'+response.data.content;
}else{
NotificationService.showNotification($translate.instant('use.icon.refresh.error'), 5000);
}
});
};
scope.useIcon = function() {
if(scope.customIcon){
var data = scope.customIcon.data;
scope.credential.icon.type = data.substring(data.lastIndexOf(":")+1,data.lastIndexOf(";"));
scope.credential.icon.content = data.substring(data.lastIndexOf(",")+1, data.length);
$('#iconPicker').dialog('close');
return;
}else{
$http.get(scope.selectedIcon.url).then(function(result) {
var base64Data = window.btoa(result.data);
var mimeType = 'svg+xml';
if(!scope.credential.icon){
scope.credential.icon = {};
}
scope.credential.icon.type = mimeType;
scope.credential.icon.content = base64Data;
});
}
$http.get(scope.selectedIcon.url).then(function(result) {
var base64Data = window.btoa(result.data);
var mimeType = 'svg+xml';
if(!scope.credential.icon){
scope.credential.icon = {};
}
scope.credential.icon.type = mimeType;
scope.credential.icon.content = base64Data;
$('#iconPicker').dialog('close');
});
$('#iconPicker').dialog('close');
};
$(element).click(function() {

View file

@ -696,8 +696,11 @@
.icon-label {
overflow: hidden;
display: flex;
input {
width: calc(100% - 28px) !important;
//width: calc(100% - 28px) !important;
//width: 100% !important;
//width: inherit !important;
float: left;
background: #fff;
color: #555;

View file

@ -1,6 +1,13 @@
<div class="cell icon-category-auth"></div>
<div class="cell icon-category-auth" ng-if="!credential.url && !credential.icon"></div>
<div class="cell" ng-if="credential.url || credential.icon">
<span class="icon">
<credential-icon credential="credential"></credential-icon>
</span>
</div>
<div style="display: none" id="iconPicker" title="{{ 'pick.icon' | translate }}">
<div class="iconList">
<div class="iconList">
<div ng-repeat="(groupName, icons) in iconGroups">
<div ng-click="expanded = !expanded" ng-init="expanded=true">
<div class="icon-triangle-s arrow" ng-class="{ 'icon-triangle-e': !expanded , 'icon-triangle-s': expanded }"></div>
@ -13,22 +20,26 @@
</div>
</div>
</div>
<div class="iconModifier">
<input id="iconPicker-Search" class="iconSearch" type="text" placeholder="{{ 'pick.icon.search' | translate }}">
<label for="iconPicker-CustomIcon">{{ 'pick.icon.custom.label' | translate }}<label>
<input id="iconPicker-CustomIcon" class="iconSearch" type="file"/>
<!--
<div ng-repeat="(groupName, icons) in iconGroups">
<a ng-click="jumpToGroup(groupName)">{{groupName}}</a>
</div>-->
<div ng-if="selectedIcon || customIcon">
{{ 'selected.icon' | translate}}: <br />
<div class="iconModifier">
<input id="iconPicker-Search" class="iconSearch" type="text" placeholder="{{ 'pick.icon.search' | translate }}">
<label for="iconPicker-CustomIcon">{{ 'pick.icon.custom.label' | translate }}</label>
<input id="iconPicker-CustomIcon" class="iconSearch" type="file"/>
<!--
<div ng-repeat="(groupName, icons) in iconGroups">
<a ng-click="jumpToGroup(groupName)">{{groupName}}</a>
</div>-->
<div ng-if="selectedIcon || customIcon">
{{ 'selected.icon' | translate}}: <br />
<img ng-src="{{selectedIcon.url}}" height="32" ng-if="!customIcon">
<img src="{{customIcon.data}}" height="32" ng-if="customIcon">
<br />
<button ng-click="useIcon()">{{ 'use.icon' | translate}}</button>
</div>
<img ng-src="{{selectedIcon.url}}" height="32" ng-if="!customIcon">
<img src="{{customIcon.data}}" height="32" ng-if="customIcon">
<br />
<button ng-click="useIcon()">{{ 'use.icon' | translate}}</button>
</div>
<div >
<button ng-click="deleteIcon()" ng-if="credential.icon">{{ 'use.icon.delete' | translate}}</button>
<button ng-click="refreshUrlIcon()">{{ 'use.icon.refresh' | translate}}</button>
</div>
</div>
</div>

View file

@ -48,10 +48,10 @@
<span class="tag" ng-repeat="tag in credential.tags_raw">{{ ::tag.text}}</span>
</span>
<span class="icon" ng-if="credential.url">
<span class="icon" ng-if="credential.url || credential.icon">
<credential-icon credential="credential"></credential-icon>
</span>
<span class="icon" ng-if="!credential.url">
<span class="icon" ng-if="!credential.url && !credential.icon">
<i class="fa fa-lock" ng-if="!credential.acl && !credential.shared_key"></i>
<i class="fa fa-share-alt" ng-if="credential.acl"></i>
<i class="fa fa-share-alt-square" ng-if="credential.shared_key"> </i>
@ -145,10 +145,10 @@
<span class="close icon-close" ng-click="closeSelected()" alt="Close"></span>
<div class="sidebar">
<span class="icon sidebar-icon" ng-if="selectedCredential.url">
<span class="icon sidebar-icon" ng-if="selectedCredential.url || credential.icon">
<credential-icon credential="selectedCredential"></credential-icon>
</span>
<span class="icon sidebar-icon" ng-if="!selectedCredential.url">
<span class="icon sidebar-icon" ng-if="!selectedCredential.url && !credential.icon">
<credential-icon credential="selectedCredential"></credential-icon>
</span>
<h2 class="sidebar-label">{{selectedCredential.label}}</h2>