mirror of
https://github.com/nextcloud/server.git
synced 2026-06-11 09:42:09 -04:00
chore: remove old favorites view
Signed-off-by: John Molakvoæ <skjnldsv@protonmail.com>
This commit is contained in:
parent
7929ad4a93
commit
e3bac437c2
12 changed files with 0 additions and 1020 deletions
|
|
@ -128,11 +128,6 @@ $application->registerRoutes(
|
|||
'url' => '/api/v1/showgridview',
|
||||
'verb' => 'GET'
|
||||
],
|
||||
[
|
||||
'name' => 'Api#getNodeType',
|
||||
'url' => '/api/v1/quickaccess/get/NodeType',
|
||||
'verb' => 'GET',
|
||||
],
|
||||
[
|
||||
'name' => 'DirectEditingView#edit',
|
||||
'url' => '/directEditing/{token}',
|
||||
|
|
|
|||
|
|
@ -1,102 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com>
|
||||
*
|
||||
* This file is licensed under the Affero General Public License version 3
|
||||
* or later.
|
||||
*
|
||||
* See the COPYING-README file.
|
||||
*
|
||||
*/
|
||||
|
||||
// HACK: this piece needs to be loaded AFTER the files app (for unit tests)
|
||||
window.addEventListener('DOMContentLoaded', function() {
|
||||
(function(OCA) {
|
||||
/**
|
||||
* @class OCA.Files.FavoritesFileList
|
||||
* @augments OCA.Files.FavoritesFileList
|
||||
*
|
||||
* @classdesc Favorites file list.
|
||||
* Displays the list of files marked as favorites
|
||||
*
|
||||
* @param $el container element with existing markup for the .files-controls
|
||||
* and a table
|
||||
* @param [options] map of options, see other parameters
|
||||
*/
|
||||
var FavoritesFileList = function($el, options) {
|
||||
this.initialize($el, options);
|
||||
};
|
||||
FavoritesFileList.prototype = _.extend({}, OCA.Files.FileList.prototype,
|
||||
/** @lends OCA.Files.FavoritesFileList.prototype */ {
|
||||
id: 'favorites',
|
||||
appName: t('files','Favorites'),
|
||||
|
||||
_clientSideSort: true,
|
||||
_allowSelection: false,
|
||||
|
||||
/**
|
||||
* @private
|
||||
*/
|
||||
initialize: function($el, options) {
|
||||
OCA.Files.FileList.prototype.initialize.apply(this, arguments);
|
||||
if (this.initialized) {
|
||||
return;
|
||||
}
|
||||
OC.Plugins.attach('OCA.Files.FavoritesFileList', this);
|
||||
},
|
||||
|
||||
updateEmptyContent: function() {
|
||||
var dir = this.getCurrentDirectory();
|
||||
if (dir === '/') {
|
||||
// root has special permissions
|
||||
this.$el.find('.emptyfilelist.emptycontent').toggleClass('hidden', !this.isEmpty);
|
||||
this.$el.find('.files-filestable thead th').toggleClass('hidden', this.isEmpty);
|
||||
}
|
||||
else {
|
||||
OCA.Files.FileList.prototype.updateEmptyContent.apply(this, arguments);
|
||||
}
|
||||
},
|
||||
|
||||
getDirectoryPermissions: function() {
|
||||
return OC.PERMISSION_READ | OC.PERMISSION_DELETE;
|
||||
},
|
||||
|
||||
updateStorageStatistics: function() {
|
||||
// no op because it doesn't have
|
||||
// storage info like free space / used space
|
||||
},
|
||||
|
||||
reload: function() {
|
||||
this.showMask();
|
||||
if (this._reloadCall?.abort) {
|
||||
this._reloadCall.abort();
|
||||
}
|
||||
|
||||
// there is only root
|
||||
this._setCurrentDir('/', false);
|
||||
|
||||
this._reloadCall = this.filesClient.getFilteredFiles(
|
||||
{
|
||||
favorite: true
|
||||
},
|
||||
{
|
||||
properties: this._getWebdavProperties()
|
||||
}
|
||||
);
|
||||
var callBack = this.reloadCallback.bind(this);
|
||||
return this._reloadCall.then(callBack, callBack);
|
||||
},
|
||||
|
||||
reloadCallback: function(status, result) {
|
||||
if (result) {
|
||||
// prepend empty dir info because original handler
|
||||
result.unshift({});
|
||||
}
|
||||
|
||||
return OCA.Files.FileList.prototype.reloadCallback.call(this, status, result);
|
||||
},
|
||||
});
|
||||
|
||||
OCA.Files.FavoritesFileList = FavoritesFileList;
|
||||
})(OCA);
|
||||
});
|
||||
|
||||
|
|
@ -1,120 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com>
|
||||
*
|
||||
* This file is licensed under the Affero General Public License version 3
|
||||
* or later.
|
||||
*
|
||||
* See the COPYING-README file.
|
||||
*
|
||||
*/
|
||||
|
||||
(function(OCA) {
|
||||
/**
|
||||
* Registers the favorites file list from the files app sidebar.
|
||||
*
|
||||
* @namespace OCA.Files.FavoritesPlugin
|
||||
*/
|
||||
OCA.Files.FavoritesPlugin = {
|
||||
name: 'Favorites',
|
||||
|
||||
/**
|
||||
* @type OCA.Files.FavoritesFileList
|
||||
*/
|
||||
favoritesFileList: null,
|
||||
|
||||
attach: function() {
|
||||
var self = this;
|
||||
$('#app-content-favorites').on('show.plugin-favorites', function(e) {
|
||||
self.showFileList($(e.target));
|
||||
});
|
||||
$('#app-content-favorites').on('hide.plugin-favorites', function() {
|
||||
self.hideFileList();
|
||||
});
|
||||
},
|
||||
|
||||
detach: function() {
|
||||
if (this.favoritesFileList) {
|
||||
this.favoritesFileList.destroy();
|
||||
OCA.Files.fileActions.off('setDefault.plugin-favorites', this._onActionsUpdated);
|
||||
OCA.Files.fileActions.off('registerAction.plugin-favorites', this._onActionsUpdated);
|
||||
$('#app-content-favorites').off('.plugin-favorites');
|
||||
this.favoritesFileList = null;
|
||||
}
|
||||
},
|
||||
|
||||
showFileList: function($el) {
|
||||
if (!this.favoritesFileList) {
|
||||
this.favoritesFileList = this._createFavoritesFileList($el);
|
||||
}
|
||||
return this.favoritesFileList;
|
||||
},
|
||||
|
||||
hideFileList: function() {
|
||||
if (this.favoritesFileList) {
|
||||
this.favoritesFileList.$fileList.empty();
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Creates the favorites file list.
|
||||
*
|
||||
* @param $el container for the file list
|
||||
* @return {OCA.Files.FavoritesFileList} file list
|
||||
*/
|
||||
_createFavoritesFileList: function($el) {
|
||||
var fileActions = this._createFileActions();
|
||||
// register favorite list for sidebar section
|
||||
return new OCA.Files.FavoritesFileList(
|
||||
$el, {
|
||||
fileActions: fileActions,
|
||||
// The file list is created when a "show" event is handled,
|
||||
// so it should be marked as "shown" like it would have been
|
||||
// done if handling the event with the file list already
|
||||
// created.
|
||||
shown: true
|
||||
}
|
||||
);
|
||||
},
|
||||
|
||||
_createFileActions: function() {
|
||||
// inherit file actions from the files app
|
||||
var fileActions = new OCA.Files.FileActions();
|
||||
// note: not merging the legacy actions because legacy apps are not
|
||||
// compatible with the sharing overview and need to be adapted first
|
||||
fileActions.registerDefaultActions();
|
||||
fileActions.merge(OCA.Files.fileActions);
|
||||
|
||||
if (!this._globalActionsInitialized) {
|
||||
// in case actions are registered later
|
||||
this._onActionsUpdated = _.bind(this._onActionsUpdated, this);
|
||||
OCA.Files.fileActions.on('setDefault.plugin-favorites', this._onActionsUpdated);
|
||||
OCA.Files.fileActions.on('registerAction.plugin-favorites', this._onActionsUpdated);
|
||||
this._globalActionsInitialized = true;
|
||||
}
|
||||
|
||||
// when the user clicks on a folder, redirect to the corresponding
|
||||
// folder in the files app instead of opening it directly
|
||||
fileActions.register('dir', 'Open', OC.PERMISSION_READ, '', function (filename, context) {
|
||||
OCA.Files.App.setActiveView('files', {silent: true});
|
||||
OCA.Files.App.fileList.changeDirectory(OC.joinPaths(context.$file.attr('data-path'), filename), true, true);
|
||||
});
|
||||
fileActions.setDefault('dir', 'Open');
|
||||
return fileActions;
|
||||
},
|
||||
|
||||
_onActionsUpdated: function(ev) {
|
||||
if (ev.action) {
|
||||
this.favoritesFileList.fileActions.registerAction(ev.action);
|
||||
} else if (ev.defaultAction) {
|
||||
this.favoritesFileList.fileActions.setDefault(
|
||||
ev.defaultAction.mime,
|
||||
ev.defaultAction.name
|
||||
);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
})(OCA);
|
||||
|
||||
OC.Plugins.register('OCA.Files.App', OCA.Files.FavoritesPlugin);
|
||||
|
||||
|
|
@ -4,8 +4,6 @@
|
|||
"detailfileinfoview.js",
|
||||
"detailsview.js",
|
||||
"detailtabview.js",
|
||||
"favoritesfilelist.js",
|
||||
"favoritesplugin.js",
|
||||
"file-upload.js",
|
||||
"fileactions.js",
|
||||
"fileactionsmenu.js",
|
||||
|
|
|
|||
|
|
@ -1,347 +0,0 @@
|
|||
/*
|
||||
* @Copyright 2014 Vincent Petry <pvince81@owncloud.com>
|
||||
*
|
||||
* @author Vincent Petry
|
||||
* @author Felix Nüsse <felix.nuesse@t-online.de>
|
||||
*
|
||||
*
|
||||
* This file is licensed under the Affero General Public License version 3
|
||||
* or later.
|
||||
*
|
||||
* See the COPYING-README file.
|
||||
*
|
||||
*/
|
||||
|
||||
(function () {
|
||||
|
||||
/**
|
||||
* @class OCA.Files.Navigation
|
||||
* @classdesc Navigation control for the files app sidebar.
|
||||
*
|
||||
* @param $el element containing the navigation
|
||||
*/
|
||||
var Navigation = function ($el) {
|
||||
this.initialize($el);
|
||||
};
|
||||
|
||||
/**
|
||||
* @memberof OCA.Files
|
||||
*/
|
||||
Navigation.prototype = {
|
||||
|
||||
/**
|
||||
* Currently selected item in the list
|
||||
*/
|
||||
_activeItem: null,
|
||||
|
||||
/**
|
||||
* Currently selected container
|
||||
*/
|
||||
$currentContent: null,
|
||||
|
||||
/**
|
||||
* Key for the quick-acces-list
|
||||
*/
|
||||
$quickAccessListKey: 'sublist-favorites',
|
||||
/**
|
||||
* Initializes the navigation from the given container
|
||||
*
|
||||
* @private
|
||||
* @param $el element containing the navigation
|
||||
*/
|
||||
initialize: function ($el) {
|
||||
this.$el = $el;
|
||||
this._activeItem = null;
|
||||
this.$currentContent = null;
|
||||
this._setupEvents();
|
||||
|
||||
this.setInitialQuickaccessSettings();
|
||||
},
|
||||
|
||||
/**
|
||||
* Setup UI events
|
||||
*/
|
||||
_setupEvents: function () {
|
||||
this.$el.on('click', 'li a', _.bind(this._onClickItem, this));
|
||||
this.$el.on('click', 'li button', _.bind(this._onClickMenuButton, this));
|
||||
|
||||
var trashBinElement = $('.nav-trashbin');
|
||||
trashBinElement.droppable({
|
||||
over: function (event, ui) {
|
||||
trashBinElement.addClass('dropzone-background');
|
||||
},
|
||||
out: function (event, ui) {
|
||||
trashBinElement.removeClass('dropzone-background');
|
||||
},
|
||||
activate: function (event, ui) {
|
||||
var element = trashBinElement.find('a').first();
|
||||
element.addClass('nav-icon-trashbin-starred').removeClass('nav-icon-trashbin');
|
||||
},
|
||||
deactivate: function (event, ui) {
|
||||
var element = trashBinElement.find('a').first();
|
||||
element.addClass('nav-icon-trashbin').removeClass('nav-icon-trashbin-starred');
|
||||
},
|
||||
drop: function (event, ui) {
|
||||
trashBinElement.removeClass('dropzone-background');
|
||||
|
||||
var $selectedFiles = $(ui.draggable);
|
||||
|
||||
// FIXME: when there are a lot of selected files the helper
|
||||
// contains only a subset of them; the list of selected
|
||||
// files should be gotten from the file list instead to
|
||||
// ensure that all of them are removed.
|
||||
var item = ui.helper.find('tr');
|
||||
for (var i = 0; i < item.length; i++) {
|
||||
$selectedFiles.trigger('droppedOnTrash', item[i].getAttribute('data-file'), item[i].getAttribute('data-dir'));
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns the container of the currently active app.
|
||||
*
|
||||
* @return app container
|
||||
*/
|
||||
getActiveContainer: function () {
|
||||
return this.$currentContent;
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns the currently active item
|
||||
*
|
||||
* @return item ID
|
||||
*/
|
||||
getActiveItem: function () {
|
||||
return this._activeItem;
|
||||
},
|
||||
|
||||
/**
|
||||
* Switch the currently selected item, mark it as selected and
|
||||
* make the content container visible, if any.
|
||||
*
|
||||
* @param string itemId id of the navigation item to select
|
||||
* @param array options "silent" to not trigger event
|
||||
*/
|
||||
setActiveItem: function (itemId, options) {
|
||||
var currentItem = this.$el.find('li[data-id="' + itemId + '"]');
|
||||
var itemDir = currentItem.data('dir');
|
||||
var itemView = currentItem.data('view');
|
||||
var oldItemId = this._activeItem;
|
||||
if (itemId === this._activeItem) {
|
||||
if (!options || !options.silent) {
|
||||
this.$el.trigger(
|
||||
new $.Event('itemChanged', {
|
||||
itemId: itemId,
|
||||
previousItemId: oldItemId,
|
||||
dir: itemDir,
|
||||
view: itemView
|
||||
})
|
||||
);
|
||||
}
|
||||
return;
|
||||
}
|
||||
this.$el.find('li a').removeClass('active').removeAttr('aria-current');
|
||||
if (this.$currentContent) {
|
||||
this.$currentContent.addClass('hidden');
|
||||
this.$currentContent.trigger(jQuery.Event('hide'));
|
||||
}
|
||||
this._activeItem = itemId;
|
||||
currentItem.children('a').addClass('active').attr('aria-current', 'page');
|
||||
this.$currentContent = $('#app-content-' + (typeof itemView === 'string' && itemView !== '' ? itemView : itemId));
|
||||
this.$currentContent.removeClass('hidden');
|
||||
if (!options || !options.silent) {
|
||||
this.$currentContent.trigger(jQuery.Event('show', {
|
||||
itemId: itemId,
|
||||
previousItemId: oldItemId,
|
||||
dir: itemDir,
|
||||
view: itemView
|
||||
}));
|
||||
this.$el.trigger(
|
||||
new $.Event('itemChanged', {
|
||||
itemId: itemId,
|
||||
previousItemId: oldItemId,
|
||||
dir: itemDir,
|
||||
view: itemView
|
||||
})
|
||||
);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns whether a given item exists
|
||||
*/
|
||||
itemExists: function (itemId) {
|
||||
return this.$el.find('li[data-id="' + itemId + '"]').length;
|
||||
},
|
||||
|
||||
/**
|
||||
* Event handler for when clicking on an item.
|
||||
*/
|
||||
_onClickItem: function (ev) {
|
||||
var $target = $(ev.target);
|
||||
var itemId = $target.closest('li').attr('data-id');
|
||||
if (!_.isUndefined(itemId)) {
|
||||
this.setActiveItem(itemId);
|
||||
}
|
||||
ev.preventDefault();
|
||||
},
|
||||
|
||||
/**
|
||||
* Event handler for clicking a button
|
||||
*/
|
||||
_onClickMenuButton: function (ev) {
|
||||
var $target = $(ev.target);
|
||||
var $menu = $target.parent('li');
|
||||
var itemId = $target.closest('button').attr('id');
|
||||
|
||||
var collapsibleToggles = [];
|
||||
var dotmenuToggles = [];
|
||||
|
||||
if ($menu.hasClass('collapsible') && $menu.data('expandedstate')) {
|
||||
$menu.toggleClass('open');
|
||||
var targetAriaExpanded = $target.attr('aria-expanded');
|
||||
if (targetAriaExpanded === 'false') {
|
||||
$target.attr('aria-expanded', 'true');
|
||||
} else if (targetAriaExpanded === 'true') {
|
||||
$target.attr('aria-expanded', 'false');
|
||||
}
|
||||
$menu.toggleAttr('data-expanded', 'true', 'false');
|
||||
var show = $menu.hasClass('open') ? 1 : 0;
|
||||
var key = $menu.data('expandedstate');
|
||||
$.post(OC.generateUrl("/apps/files/api/v1/toggleShowFolder/" + key), {show: show});
|
||||
}
|
||||
|
||||
dotmenuToggles.forEach(function foundToggle (item) {
|
||||
if (item[0] === ("#" + itemId)) {
|
||||
document.getElementById(item[1]).classList.toggle('open');
|
||||
}
|
||||
});
|
||||
|
||||
ev.preventDefault();
|
||||
},
|
||||
|
||||
/**
|
||||
* Sort initially as setup of sidebar for QuickAccess
|
||||
*/
|
||||
setInitialQuickaccessSettings: function () {
|
||||
var quickAccessKey = this.$quickAccessListKey;
|
||||
var quickAccessMenu = document.getElementById(quickAccessKey);
|
||||
if (quickAccessMenu) {
|
||||
var list = quickAccessMenu.getElementsByTagName('li');
|
||||
this.QuickSort(list, 0, list.length - 1);
|
||||
}
|
||||
|
||||
var favoritesListElement = $(quickAccessMenu).parent();
|
||||
favoritesListElement.droppable({
|
||||
over: function (event, ui) {
|
||||
favoritesListElement.addClass('dropzone-background');
|
||||
},
|
||||
out: function (event, ui) {
|
||||
favoritesListElement.removeClass('dropzone-background');
|
||||
},
|
||||
activate: function (event, ui) {
|
||||
var element = favoritesListElement.find('a').first();
|
||||
element.addClass('nav-icon-favorites-starred').removeClass('nav-icon-favorites');
|
||||
},
|
||||
deactivate: function (event, ui) {
|
||||
var element = favoritesListElement.find('a').first();
|
||||
element.addClass('nav-icon-favorites').removeClass('nav-icon-favorites-starred');
|
||||
},
|
||||
drop: function (event, ui) {
|
||||
favoritesListElement.removeClass('dropzone-background');
|
||||
|
||||
var $selectedFiles = $(ui.draggable);
|
||||
|
||||
if (ui.helper.find('tr').size() === 1) {
|
||||
var $tr = $selectedFiles.closest('tr');
|
||||
if ($tr.attr("data-favorite")) {
|
||||
return;
|
||||
}
|
||||
$selectedFiles.trigger('droppedOnFavorites', $tr.attr('data-file'));
|
||||
} else {
|
||||
// FIXME: besides the issue described for dropping on
|
||||
// the trash bin, for favoriting it is not possible to
|
||||
// use the data from the helper; due to some bugs the
|
||||
// tags are not always added to the selected files, and
|
||||
// thus that data can not be accessed through the helper
|
||||
// to prevent triggering the favorite action on an
|
||||
// already favorited file (which would remove it from
|
||||
// favorites).
|
||||
OC.Notification.showTemporary(t('files', 'You can only favorite a single file or folder at a time'));
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Sorting-Algorithm for QuickAccess
|
||||
*/
|
||||
QuickSort: function (list, start, end) {
|
||||
var lastMatch;
|
||||
if (list.length > 1) {
|
||||
lastMatch = this.quicksort_helper(list, start, end);
|
||||
if (start < lastMatch - 1) {
|
||||
this.QuickSort(list, start, lastMatch - 1);
|
||||
}
|
||||
if (lastMatch < end) {
|
||||
this.QuickSort(list, lastMatch, end);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Sorting-Algorithm-Helper for QuickAccess
|
||||
*/
|
||||
quicksort_helper: function (list, start, end) {
|
||||
var pivot = Math.floor((end + start) / 2);
|
||||
var pivotElement = this.getCompareValue(list, pivot);
|
||||
var i = start;
|
||||
var j = end;
|
||||
|
||||
while (i <= j) {
|
||||
while (this.getCompareValue(list, i) < pivotElement) {
|
||||
i++;
|
||||
}
|
||||
while (this.getCompareValue(list, j) > pivotElement) {
|
||||
j--;
|
||||
}
|
||||
if (i <= j) {
|
||||
this.swap(list, i, j);
|
||||
i++;
|
||||
j--;
|
||||
}
|
||||
}
|
||||
return i;
|
||||
},
|
||||
|
||||
/**
|
||||
* Sorting-Algorithm-Helper for QuickAccess
|
||||
* This method allows easy access to the element which is sorted by.
|
||||
*/
|
||||
getCompareValue: function (nodes, int, strategy) {
|
||||
return nodes[int].getElementsByTagName('a')[0].innerHTML.toLowerCase();
|
||||
},
|
||||
|
||||
/**
|
||||
* Sorting-Algorithm-Helper for QuickAccess
|
||||
* This method allows easy swapping of elements.
|
||||
*/
|
||||
swap: function (list, j, i) {
|
||||
var before = function(node, insertNode) {
|
||||
node.parentNode.insertBefore(insertNode, node);
|
||||
}
|
||||
before(list[i], list[j]);
|
||||
before(list[j], list[i]);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
OCA.Files.Navigation = Navigation;
|
||||
|
||||
})();
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -52,82 +52,6 @@
|
|||
$favoriteMarkEl.toggleClass('permanent', state);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove Item from Quickaccesslist
|
||||
*
|
||||
* @param {String} appfolder folder to be removed
|
||||
*/
|
||||
function removeFavoriteFromList (appfolder) {
|
||||
var quickAccessList = 'sublist-favorites';
|
||||
var listULElements = document.getElementById(quickAccessList);
|
||||
if (!listULElements) {
|
||||
return;
|
||||
}
|
||||
|
||||
var apppath=appfolder;
|
||||
if(appfolder.startsWith("//")){
|
||||
apppath=appfolder.substring(1, appfolder.length);
|
||||
}
|
||||
|
||||
$(listULElements).find('[data-dir="' + _.escape(apppath) + '"]').remove();
|
||||
|
||||
if (listULElements.childElementCount === 0) {
|
||||
var collapsibleButton = $(listULElements).parent().find('button.collapse');
|
||||
collapsibleButton.hide();
|
||||
$("#button-collapse-parent-favorites").removeClass('collapsible');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add Item to Quickaccesslist
|
||||
*
|
||||
* @param {String} appfolder folder to be added
|
||||
*/
|
||||
function addFavoriteToList (appfolder) {
|
||||
var quickAccessList = 'sublist-favorites';
|
||||
var listULElements = document.getElementById(quickAccessList);
|
||||
if (!listULElements) {
|
||||
return;
|
||||
}
|
||||
var listLIElements = listULElements.getElementsByTagName('li');
|
||||
|
||||
var appName = appfolder.substring(appfolder.lastIndexOf("/") + 1, appfolder.length);
|
||||
var apppath = appfolder;
|
||||
|
||||
if(appfolder.startsWith("//")){
|
||||
apppath = appfolder.substring(1, appfolder.length);
|
||||
}
|
||||
var url = OC.generateUrl('/apps/files/?dir=' + apppath + '&view=files');
|
||||
|
||||
var innerTagA = document.createElement('A');
|
||||
innerTagA.setAttribute("href", url);
|
||||
innerTagA.setAttribute("class", "nav-icon-files svg");
|
||||
innerTagA.innerHTML = _.escape(appName);
|
||||
|
||||
var length = listLIElements.length + 1;
|
||||
var innerTagLI = document.createElement('li');
|
||||
innerTagLI.setAttribute("data-id", apppath.replace('/', '-'));
|
||||
innerTagLI.setAttribute("data-dir", apppath);
|
||||
innerTagLI.setAttribute("data-view", 'files');
|
||||
innerTagLI.setAttribute("class", "nav-" + appName);
|
||||
innerTagLI.setAttribute("folderpos", length.toString());
|
||||
innerTagLI.appendChild(innerTagA);
|
||||
|
||||
$.get(OC.generateUrl("/apps/files/api/v1/quickaccess/get/NodeType"),{folderpath: apppath}, function (data, status) {
|
||||
if (data === "dir") {
|
||||
if (listULElements.childElementCount <= 0) {
|
||||
listULElements.appendChild(innerTagLI);
|
||||
var collapsibleButton = $(listULElements).parent().find('button.collapse');
|
||||
collapsibleButton.show();
|
||||
$(listULElements).parent().addClass('collapsible');
|
||||
} else {
|
||||
listLIElements[listLIElements.length - 1].after(innerTagLI);
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
OCA.Files = OCA.Files || {};
|
||||
|
||||
/**
|
||||
|
|
@ -205,12 +129,10 @@
|
|||
if (isFavorite) {
|
||||
// remove tag from list
|
||||
tags = _.without(tags, OC.TAG_FAVORITE);
|
||||
removeFavoriteFromList(dir + '/' + fileName);
|
||||
// vue compatibility
|
||||
window._nc_event_bus.emit('files:favorites:removed', node)
|
||||
} else {
|
||||
tags.push(OC.TAG_FAVORITE);
|
||||
addFavoriteToList(dir + '/' + fileName);
|
||||
// vue compatibility
|
||||
window._nc_event_bus.emit('files:favorites:added', node)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -172,15 +172,6 @@ class Application extends App implements IBootstrap {
|
|||
'name' => $l10n->t('Recent')
|
||||
];
|
||||
});
|
||||
\OCA\Files\App::getNavigationManager()->add(function () use ($l10n) {
|
||||
return [
|
||||
'id' => 'favorites',
|
||||
'appname' => 'files',
|
||||
'script' => 'simplelist.php',
|
||||
'order' => 5,
|
||||
'name' => $l10n->t('Favorites'),
|
||||
];
|
||||
});
|
||||
}
|
||||
|
||||
private function registerHooks(): void {
|
||||
|
|
|
|||
|
|
@ -383,20 +383,6 @@ class ApiController extends Controller {
|
|||
return new JSONResponse(['gridview' => $status]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get sorting-order for custom sorting
|
||||
*
|
||||
* @NoAdminRequired
|
||||
*
|
||||
* @param string $folderpath
|
||||
* @return string
|
||||
* @throws \OCP\Files\NotFoundException
|
||||
*/
|
||||
public function getNodeType($folderpath) {
|
||||
$node = $this->userFolder->get($folderpath);
|
||||
return $node->getType();
|
||||
}
|
||||
|
||||
/**
|
||||
* @NoAdminRequired
|
||||
* @NoCSRFRequired
|
||||
|
|
|
|||
|
|
@ -202,37 +202,8 @@ class ViewController extends Controller {
|
|||
$favElements['folders'] = [];
|
||||
}
|
||||
|
||||
$collapseClasses = '';
|
||||
if (count($favElements['folders']) > 0) {
|
||||
$collapseClasses = 'collapsible';
|
||||
}
|
||||
|
||||
$favoritesSublistArray = [];
|
||||
|
||||
$navBarPositionPosition = 6;
|
||||
foreach ($favElements['folders'] as $favElement) {
|
||||
$element = [
|
||||
'id' => str_replace('/', '-', $favElement),
|
||||
'dir' => $favElement,
|
||||
'order' => $navBarPositionPosition,
|
||||
'name' => basename($favElement),
|
||||
'icon' => 'folder',
|
||||
'params' => [
|
||||
'view' => 'files',
|
||||
'dir' => $favElement,
|
||||
],
|
||||
];
|
||||
|
||||
array_push($favoritesSublistArray, $element);
|
||||
$navBarPositionPosition++;
|
||||
}
|
||||
|
||||
$navItems = \OCA\Files\App::getNavigationManager()->getAll();
|
||||
|
||||
// add the favorites entry in menu
|
||||
$navItems['favorites']['sublist'] = $favoritesSublistArray;
|
||||
$navItems['favorites']['classes'] = $collapseClasses;
|
||||
|
||||
// parse every menu and add the expanded user value
|
||||
foreach ($navItems as $key => $item) {
|
||||
$navItems[$key]['expanded'] = $this->config->getUserValue($userId, 'files', 'show_' . $item['id'], '0') === '1';
|
||||
|
|
|
|||
|
|
@ -199,65 +199,6 @@ class ViewControllerTest extends TestCase {
|
|||
'expanded' => false,
|
||||
'unread' => 0,
|
||||
],
|
||||
'favorites' => [
|
||||
'id' => 'favorites',
|
||||
'appname' => 'files',
|
||||
'script' => 'simplelist.php',
|
||||
'order' => 5,
|
||||
'name' => \OC::$server->getL10N('files')->t('Favorites'),
|
||||
'active' => false,
|
||||
'icon' => '',
|
||||
'type' => 'link',
|
||||
'classes' => 'collapsible',
|
||||
'sublist' => [
|
||||
[
|
||||
'id' => '-test1',
|
||||
'dir' => '/test1',
|
||||
'order' => 6,
|
||||
'name' => 'test1',
|
||||
'icon' => 'folder',
|
||||
'params' => [
|
||||
'view' => 'files',
|
||||
'dir' => '/test1',
|
||||
],
|
||||
],
|
||||
[
|
||||
'name' => 'test2',
|
||||
'id' => '-test2-',
|
||||
'dir' => '/test2/',
|
||||
'order' => 7,
|
||||
'icon' => 'folder',
|
||||
'params' => [
|
||||
'view' => 'files',
|
||||
'dir' => '/test2/',
|
||||
],
|
||||
],
|
||||
[
|
||||
'name' => 'sub4',
|
||||
'id' => '-test3-sub4',
|
||||
'dir' => '/test3/sub4',
|
||||
'order' => 8,
|
||||
'icon' => 'folder',
|
||||
'params' => [
|
||||
'view' => 'files',
|
||||
'dir' => '/test3/sub4',
|
||||
],
|
||||
],
|
||||
[
|
||||
'name' => 'sub6',
|
||||
'id' => '-test5-sub6-',
|
||||
'dir' => '/test5/sub6/',
|
||||
'order' => 9,
|
||||
'icon' => 'folder',
|
||||
'params' => [
|
||||
'view' => 'files',
|
||||
'dir' => '/test5/sub6/',
|
||||
],
|
||||
],
|
||||
],
|
||||
'expanded' => false,
|
||||
'unread' => 0,
|
||||
],
|
||||
'systemtagsfilter' => [
|
||||
'id' => 'systemtagsfilter',
|
||||
'appname' => 'systemtags',
|
||||
|
|
@ -347,10 +288,6 @@ class ViewControllerTest extends TestCase {
|
|||
'id' => 'recent',
|
||||
'content' => null,
|
||||
],
|
||||
'favorites' => [
|
||||
'id' => 'favorites',
|
||||
'content' => null,
|
||||
],
|
||||
'systemtagsfilter' => [
|
||||
'id' => 'systemtagsfilter',
|
||||
'content' => null,
|
||||
|
|
@ -379,22 +316,6 @@ class ViewControllerTest extends TestCase {
|
|||
'id' => 'shareoverview',
|
||||
'content' => null,
|
||||
],
|
||||
'-test1' => [
|
||||
'id' => '-test1',
|
||||
'content' => '',
|
||||
],
|
||||
'-test2-' => [
|
||||
'id' => '-test2-',
|
||||
'content' => '',
|
||||
],
|
||||
'-test3-sub4' => [
|
||||
'id' => '-test3-sub4',
|
||||
'content' => '',
|
||||
],
|
||||
'-test5-sub6-' => [
|
||||
'id' => '-test5-sub6-',
|
||||
'content' => '',
|
||||
],
|
||||
],
|
||||
'hiddenFields' => [],
|
||||
'showgridview' => null
|
||||
|
|
|
|||
|
|
@ -1,116 +0,0 @@
|
|||
/**
|
||||
* Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com>
|
||||
*
|
||||
* @author Christoph Wurst <christoph@winzerhof-wurst.at>
|
||||
* @author Jan-Christoph Borchardt <hey@jancborchardt.net>
|
||||
* @author Vincent Petry <vincent@nextcloud.com>
|
||||
*
|
||||
* @license AGPL-3.0-or-later
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
describe('OCA.Files.FavoritesFileList tests', function() {
|
||||
var fileList;
|
||||
|
||||
beforeEach(function() {
|
||||
// init parameters and test table elements
|
||||
$('#testArea').append(
|
||||
'<div id="app-content">' +
|
||||
// init horrible parameters
|
||||
'<input type="hidden" id="permissions" value="31"></input>' +
|
||||
// dummy controls
|
||||
'<div class="files-controls">' +
|
||||
' <div class="actions creatable"></div>' +
|
||||
' <div class="notCreatable"></div>' +
|
||||
'</div>' +
|
||||
// dummy table
|
||||
// TODO: at some point this will be rendered by the fileList class itself!
|
||||
'<table class="files-filestable list-container view-grid">' +
|
||||
'<thead><tr>' +
|
||||
'<th class="hidden column-name">' +
|
||||
'<a class="name columntitle" data-sort="name"><span>Name</span><span class="sort-indicator"></span></a>' +
|
||||
'</th>' +
|
||||
'<th class="hidden column-mtime">' +
|
||||
'<a class="columntitle" data-sort="mtime"><span class="sort-indicator"></span></a>' +
|
||||
'</th>' +
|
||||
'</tr></thead>' +
|
||||
'<tbody class="files-fileList"></tbody>' +
|
||||
'<tfoot></tfoot>' +
|
||||
'</table>' +
|
||||
'<div class="emptyfilelist emptycontent">Empty content message</div>' +
|
||||
'</div>'
|
||||
);
|
||||
});
|
||||
|
||||
describe('loading file list', function() {
|
||||
var fetchStub;
|
||||
|
||||
beforeEach(function() {
|
||||
fileList = new OCA.Files.FavoritesFileList(
|
||||
$('#app-content')
|
||||
);
|
||||
OCA.Files.FavoritesPlugin.attach(fileList);
|
||||
|
||||
fetchStub = sinon.stub(fileList.filesClient, 'getFilteredFiles');
|
||||
});
|
||||
afterEach(function() {
|
||||
fetchStub.restore();
|
||||
fileList.destroy();
|
||||
fileList = undefined;
|
||||
});
|
||||
it('render files', function(done) {
|
||||
var deferred = $.Deferred();
|
||||
fetchStub.returns(deferred.promise());
|
||||
|
||||
fileList.reload();
|
||||
|
||||
expect(fetchStub.calledOnce).toEqual(true);
|
||||
|
||||
deferred.resolve(207, [{
|
||||
id: 7,
|
||||
name: 'test.txt',
|
||||
path: '/somedir',
|
||||
size: 123,
|
||||
mtime: 11111000,
|
||||
tags: [OC.TAG_FAVORITE],
|
||||
permissions: OC.PERMISSION_ALL,
|
||||
mimetype: 'text/plain'
|
||||
}]);
|
||||
|
||||
setTimeout(function() {
|
||||
var $rows = fileList.$el.find('tbody tr');
|
||||
var $tr = $rows.eq(0);
|
||||
expect($rows.length).toEqual(1);
|
||||
expect($tr.attr('data-id')).toEqual('7');
|
||||
expect($tr.attr('data-type')).toEqual('file');
|
||||
expect($tr.attr('data-file')).toEqual('test.txt');
|
||||
expect($tr.attr('data-path')).toEqual('/somedir');
|
||||
expect($tr.attr('data-size')).toEqual('123');
|
||||
expect(parseInt($tr.attr('data-permissions'), 10))
|
||||
.toEqual(OC.PERMISSION_ALL);
|
||||
expect($tr.attr('data-mime')).toEqual('text/plain');
|
||||
expect($tr.attr('data-mtime')).toEqual('11111000');
|
||||
expect($tr.find('a.name').attr('href')).toEqual(
|
||||
OC.getRootPath() +
|
||||
'/remote.php/webdav/somedir/test.txt'
|
||||
);
|
||||
expect($tr.find('.nametext').text().trim()).toEqual('test.txt');
|
||||
|
||||
done();
|
||||
}, 0);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
@ -1,119 +0,0 @@
|
|||
/**
|
||||
* Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com>
|
||||
*
|
||||
* @author John Molakvoæ <skjnldsv@protonmail.com>
|
||||
* @author Vincent Petry <vincent@nextcloud.com>
|
||||
*
|
||||
* @license AGPL-3.0-or-later
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
describe('OCA.Files.FavoritesPlugin tests', function() {
|
||||
var Plugin = OCA.Files.FavoritesPlugin;
|
||||
var fileList;
|
||||
|
||||
beforeEach(function() {
|
||||
$('#testArea').append(
|
||||
'<div id="content">' +
|
||||
'<div id="app-navigation">' +
|
||||
'<ul><li data-id="files"><a>Files</a></li>' +
|
||||
'<li data-id="sharingin"><a></a></li>' +
|
||||
'<li data-id="sharingout"><a></a></li>' +
|
||||
'</ul></div>' +
|
||||
'<div id="app-content">' +
|
||||
'<div id="app-content-files" class="hidden">' +
|
||||
'</div>' +
|
||||
'<div id="app-content-favorites" class="hidden">' +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'</div>' +
|
||||
'</div>'
|
||||
);
|
||||
OC.Plugins.attach('OCA.Files.App', Plugin);
|
||||
fileList = Plugin.showFileList($('#app-content-favorites'));
|
||||
});
|
||||
afterEach(function() {
|
||||
OC.Plugins.detach('OCA.Files.App', Plugin);
|
||||
});
|
||||
|
||||
describe('initialization', function() {
|
||||
it('inits favorites list on show', function() {
|
||||
expect(fileList).toBeDefined();
|
||||
});
|
||||
});
|
||||
describe('file actions', function() {
|
||||
it('provides default file actions', function() {
|
||||
var fileActions = fileList.fileActions;
|
||||
|
||||
expect(fileActions.actions.all).toBeDefined();
|
||||
expect(fileActions.actions.all.Delete).toBeDefined();
|
||||
expect(fileActions.actions.all.Rename).toBeDefined();
|
||||
expect(fileActions.actions.all.Download).toBeDefined();
|
||||
|
||||
expect(fileActions.defaults.dir).toEqual('Open');
|
||||
});
|
||||
it('provides custom file actions', function() {
|
||||
var actionStub = sinon.stub();
|
||||
// regular file action
|
||||
OCA.Files.fileActions.register(
|
||||
'all',
|
||||
'RegularTest',
|
||||
OC.PERMISSION_READ,
|
||||
OC.imagePath('core', 'actions/shared'),
|
||||
actionStub
|
||||
);
|
||||
|
||||
Plugin.favoritesFileList = null;
|
||||
fileList = Plugin.showFileList($('#app-content-favorites'));
|
||||
|
||||
expect(fileList.fileActions.actions.all.RegularTest).toBeDefined();
|
||||
});
|
||||
it('redirects to files app when opening a directory', function() {
|
||||
var oldList = OCA.Files.App.fileList;
|
||||
// dummy new list to make sure it exists
|
||||
OCA.Files.App.fileList = new OCA.Files.FileList($('<table><thead></thead><tbody></tbody></table>'));
|
||||
|
||||
var setActiveViewStub = sinon.stub(OCA.Files.App, 'setActiveView');
|
||||
// create dummy table so we can click the dom
|
||||
var $table = '<table><thead></thead><tbody class="files-fileList"></tbody></table>';
|
||||
$('#app-content-favorites').append($table);
|
||||
|
||||
Plugin.favoritesFileList = null;
|
||||
fileList = Plugin.showFileList($('#app-content-favorites'));
|
||||
|
||||
fileList.setFiles([{
|
||||
name: 'testdir',
|
||||
type: 'dir',
|
||||
path: '/somewhere/inside/subdir',
|
||||
counterParts: ['user2'],
|
||||
shareOwner: 'user2'
|
||||
}]);
|
||||
|
||||
fileList.findFileEl('testdir').find('td .nametext').click();
|
||||
|
||||
expect(OCA.Files.App.fileList.getCurrentDirectory()).toEqual('/somewhere/inside/subdir/testdir');
|
||||
|
||||
expect(setActiveViewStub.calledOnce).toEqual(true);
|
||||
expect(setActiveViewStub.calledWith('files')).toEqual(true);
|
||||
|
||||
setActiveViewStub.restore();
|
||||
|
||||
// restore old list
|
||||
OCA.Files.App.fileList = oldList;
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Loading…
Reference in a new issue