/*
* Copyright (C) eZ Systems AS. All rights reserved.
* For full copyright and license information view LICENSE file distributed with this source code.
*/
YUI.add('ez-subitemlistview', function (Y) {
"use strict";
/**
* Provides the subitem list view. This module is deprecated
*
* @module ez-subitemlistview
* @deprecated
*/
Y.namespace('eZ');
var IS_PAGE_LOADING = 'is-page-loading',
IS_DISABLED = 'is-disabled';
function linkIsDisabled(link) {
return link.hasClass(IS_DISABLED);
}
console.log('[DEPRECRATED] eZ.SubitemListView is deprecated');
console.log('[DEPRECRATED] it will be removed from PlatformUI 2.0');
console.log('[DEPRECRATED] use eZ.SubitemListMoreView instead');
/**
* The subitem list view.
*
* @namespace eZ
* @class SubitemListView
* @deprecated
* @constructor
* @extends eZ.SubitemBaseView
*/
Y.eZ.SubitemListView = Y.Base.create('subitemListView', Y.eZ.SubitemBaseView, [Y.eZ.AsynchronousView], {
events: {
'.ez-subitemlist-navigation-link': {
'tap': '_handlePagination',
},
},
initializer: function () {
this._set('identifier', 'list');
this._set('name', 'List view');
this._fireMethod = this._fireLocationSearch;
this._watchAttribute = 'subitems';
this.after(['subitemsChange', 'loadingErrorChange'], function (e) {
this._set('loading', false);
});
if ( this.get('loading') ) {
this._uiPageLoading();
}
this.after('loadingChange', function () {
if ( this.get('loading') ) {
this._uiPageLoading();
} else {
this._uiPageEndLoading();
}
});
this.after('offsetChange', this._refresh);
this.get('location').after(['hiddenChange', 'invisibleChange'], Y.bind(this._refresh, this));
/**
* Holds the displayed subitem list item view instances
*
* @property _itemViews
* @type {Array}
* @protected
*/
this._itemViews = [];
this.after('*:editingPriorityChange', function (e) {
if ( e.newVal ) {
this._lockPriorityEdit(e.target);
} else {
this._unlockPriorityEdit();
}
});
},
/**
* Restores the `canEditPriority` attribute so that the priority can be
* editing in all views
*
* @method _unlockPriorityEdit
* @protected
*/
_unlockPriorityEdit: function () {
this._itemViews.forEach(function (itemView) {
itemView.set('canEditPriority', true);
});
},
/**
* Makes sure only one priority can be edited at a time.
*
* @protected
* @method _lockPriorityEdit
* @param {View} view the view where the priority occurs
*/
_lockPriorityEdit: function (view) {
this._itemViews.forEach(function (itemView) {
itemView.set('canEditPriority', (itemView === view));
});
},
destructor: function () {
this._destroyItemViews();
},
/**
* Refreshes the subitem list
*
* @protected
* @method _refresh
*/
_refresh: function () {
if ( this.get('active') ) {
this._fireLocationSearch();
}
},
/**
* Sets the UI in the loading the state
*
* @protected
* @method _uiPageLoading
*/
_uiPageLoading: function () {
this.get('container').addClass(IS_PAGE_LOADING);
},
/**
* Removes the loading state of the UI
*
* @method _uiPageEndLoading
* @protected
*/
_uiPageEndLoading: function () {
this.get('container').removeClass(IS_PAGE_LOADING);
},
/**
* tap event handler on the navigation links. Changes the page if the
* link is not disabled
*
* @method _handlePagination
* @param {EventFacade} e
* @protected
*/
_handlePagination: function (e) {
var type = e.target.getAttribute('rel');
e.preventDefault();
if ( !linkIsDisabled(e.target) ) {
this._getGotoMethod(type).call(this);
}
},
/**
* Returns the *goto* function for the given type operation
*
* @method _getGotoMethod
* @private
* @param {String} type
* @return {Function}
*/
_getGotoMethod: function (type) {
return this['_goto' + type.charAt(0).toUpperCase() + type.substr(1)];
},
/**
* Go to the first page
*
* @method _gotoFirst
* @protected
*/
_gotoFirst: function () {
this.set('offset', 0);
},
/**
* Go to the next page
*
* @method _gotoNext
* @protected
*/
_gotoNext: function () {
this.set('offset', this.get('offset') + this.get('limit'));
},
/**
* Go to the previous page
*
* @method _gotoPrev
* @protected
*/
_gotoPrev: function () {
this.set('offset', this.get('offset') - this.get('limit'));
},
/**
* Go to the last page
*
* @method _gotoLast
* @protected
*/
_gotoLast: function () {
var limit = this.get('limit');
this.set('offset', (Math.ceil(this.get('location').get('childCount') / limit) - 1) * limit);
},
render: function () {
this.get('container').setHTML(this.template({
location: this.get('location').toJSON(),
subitems: this._convertToJSONList(),
loadingError: this.get('loadingError'),
isFirst: this._isFirstPage(),
isLast: this._isLastPage(),
hasPages: this._hasPages(),
columns: this._getColumns(),
}));
this._renderItems();
return this;
},
/**
* Returns an array of objects describing the columns to add to the
* list. Each object contains an `identifier` and a `name`.
*
* @method _getColumns
* @protected
* @return Array
*/
_getColumns: function () {
return this.get('displayedProperties').map(function (identifier) {
return {
name: this.get('propertyNames')[identifier],
identifier: identifier,
};
}, this);
},
/**
* Destroys the instantiated item views.
*
* @method _destroyItemViews
* @protected
*/
_destroyItemViews: function () {
this._itemViews.forEach(function(view) {
view.destroy();
});
this._itemViews = [];
},
/**
* Renders an item view per subitem.
*
* @protected
* @method _renderItems
*/
_renderItems: function () {
var contentNode = this.get('container').one('.ez-subitemlist-content'),
ItemView = this.get('itemViewConstructor');
if ( !this.get('subitems') ) {
return;
}
this._destroyItemViews();
this.get('subitems').forEach(function (struct) {
var view = new ItemView({
displayedProperties: this.get('displayedProperties'),
location: struct.location,
content: struct.content,
contentType: struct.contentType,
bubbleTargets: this,
});
this._itemViews.push(view);
contentNode.append(view.render().get('container'));
}, this);
},
/**
* Checks whether the pagination will be useful
*
* @method _hasPages
* @private
* @return {Boolean}
*/
_hasPages: function () {
return this.get('location').get('childCount') > this.get('limit');
},
/**
* Checks whether the user is on the first "page".
*
* @method _isFirstPage
* @private
* @return {Boolean}
*/
_isFirstPage: function () {
return (this.get('offset') === 0);
},
/**
* Checks whether the user is on the last "page".
*
* @method _isLastPage
* @private
* @return {Boolean}
*/
_isLastPage: function () {
return this.get('offset') >= (this.get('location').get('childCount') - this.get('limit'));
},
/**
* Converts the subitems array to JSON so that it can be used in the
* template.
* **Deprecated:** this method and the corresponding `subitems` template
* variable will be removed in PlatformUI 2.0
*
* @method _convertToJSONList
* @protected
* @deprecated in 1.3
* @return undefined|Array
*/
_convertToJSONList: function () {
if ( !this.get('subitems') ) {
return this.get('subitems');
}
return Y.Array.map(this.get('subitems'), function (locStruct) {
return locStruct.location.toJSON();
});
},
/**
* Fires the `locationSearch` event to fetch the subitems of the
* currently displayed Location.
*
* @method _fireLocationSearch
* @protected
*/
_fireLocationSearch: function () {
var location = this.get('location'),
locationId = location.get('locationId');
if ( !location.get('childCount') ) {
this._set('loading', false);
return;
}
this._set('loading', true);
this.fire('locationSearch', {
viewName: 'subitemlist-' + locationId,
resultAttribute: 'subitems',
loadContentType: true,
loadContent: true,
search: {
criteria: {
"ParentLocationIdCriterion": locationId,
},
offset: this.get('offset'),
limit: this.get('limit'),
/*
* @TODO see https://jira.ez.no/browse/EZP-24315
* this is not yet supported by the views in the REST API
sortClauses: {
SortClause: {
SortField: this.get('location').get('sortField'),
SortOrder: this.get('location').get('sortOrder'),
},
},
*/
},
});
},
}, {
ATTRS: {
/**
* Indicates the whether the subitem list is currently in loading.
* The default value depends on the number of subitems.
*
* @attribute loading
* @type {Boolean}
* @readOnly
*/
loading: {
valueFn: function () {
return this.get('location').get('childCount') > 0;
},
readOnly: true,
},
/**
* The max number of the Locations to display in the subitem list
* per "page".
*
* @attribute limit
* @default 10
* @type Number
*/
limit: {
value: 10,
},
/**
* The offset in the Location list.
*
* @attribute offset
* @default 0
* @type Number
*/
offset: {
value: 0,
},
/**
* The subitems list.
*
* @attribute subitems
* @type Array of {Object} array containing location structs
*/
subitems: {},
/**
* The properties to display
*
* @attribute displayedProperties
* @type Array
*/
displayedProperties: {
value: ['name', 'lastModificationDate', 'contentType', 'priority', 'translations'],
},
/**
* A key value object to store the human readable names of the
* columns.
*
* @attribute propertyNames
* @type {Object}
*/
propertyNames: {
value: {
'name': 'Name',
'lastModificationDate': 'Modified',
'contentType': 'Content type',
'priority': 'Priority',
'translations': 'Translations',
}
},
/**
* The constructor function to use to instance the item view
* instances.
*
* @attribute itemViewConstructor
* @type {Function}
* @default {Y.eZ.SubitemListItemView}
*/
itemViewConstructor: {
valueFn: function () {
return Y.eZ.SubitemListItemView;
},
},
}
});
});