comindware.core.ui
Version:
Comindware Core UI provides the basic components like editors, lists, dropdowns, popups that we so desperately need while creating Marionette-based single-page applications.
102 lines (94 loc) • 4.79 kB
JavaScript
import { comparators, helpers } from 'utils';
import VirtualCollection from '../collections/VirtualCollection';
import GridView from './views/GridView';
export const getDefaultComparator = (columns = []) => {
const sortingColumn = columns.find(column => column.sorting);
let comparator;
if (sortingColumn) {
comparator = sortingColumn.sorting === 'asc' ? sortingColumn.sortAsc : sortingColumn.sortDesc;
if (!comparator) {
comparator = helpers.comparatorFor(comparators.getComparatorByDataType(sortingColumn.dataType || sortingColumn.type, sortingColumn.sorting), sortingColumn.key);
}
}
return comparator;
};
export const createWrappedCollection = options => {
const collection = options.collection;
const childrenAttribute = options.childrenAttribute;
const processCollection = (sourceCollection, parentModel = null) => {
sourceCollection.forEach(item => {
let children;
if (childrenAttribute) {
children = item.get(childrenAttribute);
if (Array.isArray(children)) {
children = new Backbone.Collection(children);
}
if (children && children.length) {
item.children = children;
processCollection(children, item);
}
}
item.parentModel = parentModel;
item.collapsed = !options.expandOnShow;
});
};
if (!(collection instanceof VirtualCollection)) {
if (!collection || Array.isArray(collection)) {
const adjustedCollection = new Backbone.Collection(collection);
processCollection(adjustedCollection);
return new VirtualCollection(adjustedCollection, options);
} else if (collection instanceof Backbone.Collection) {
processCollection(collection);
return new VirtualCollection(collection, options);
}
}
return collection;
};
const factory = {
/**
* @memberof module:core.nativeGrid.factory
* @method createDefaultGrid
* @description Метод для создания списка
* @param {Object} options Constructor options
* @param {Backbone.View} [options.emptyView] View используемый по умолчанию для отображения пустого списка (нет строк)
* @param {Object} options.gridViewOptions Опции списка
* @param {Object} [options.gridViewOptions.selectableBehavior] Выбора элементов в списке (none/single/multi)
* @param {Function} [options.onColumnSort] Обработчик oncColumnSort события
* @param {Backbone.View} [options.headerView] View, используемый для отображения заголовка списка
* @param {Backbone.View} [options.rowView] View строки списка
* @param {Function} [options.rowViewSelector] Функция для разрешения (resolve) View, используемого для отображения строки списка
* @returns {Backbone.View} NativeGridView View-списка
* */
createDefaultGrid(options) {
const collection = createWrappedCollection({
collection: options.collection,
childrenAttribute: options.gridViewOptions.childrenAttribute,
selectableBehavior: options.gridViewOptions.selectableBehavior,
isTree: options.gridViewOptions.isTree,
expandOnShow: options.gridViewOptions.expandOnShow,
isSliding: options.isSliding === false ? options.isSliding : true,
comparator: getDefaultComparator(options.columns || options.gridViewOptions.columns || [])
});
const gridViewOptions = {
collection,
onColumnSort: options.onColumnSort,
headerView: options.headerView,
childView: options.childView,
childViewSelector: options.childViewSelector,
...options.gridViewOptions
};
return new GridView(gridViewOptions);
},
/**
* @memberof module:core.list.factory
* @method createWrappedCollection
* @description Метод для Backbone-коллекции элементов списка
* @param {Object} options Constructor options
* @param {Array} options.collection Массив элементов
* @returns {Object}
* @returns {Backbone.Collection} collection Коллекция элементов списка
* */
createWrappedCollection,
getDefaultComparator
};
export default factory;