var ListView = angular.module("ListView", ['ngGrid', 'Permissions']); /* * directive defination */ ListView.directive("objectAction", function(){ function link(scope, element, attrs){ var object = scope.object; var action = scope.action; if ("route" in object){ element.attr("href", object.route); } else if ("action" in object) { element.on("click", object.action); } } // Actual object return { restrict: "A", scope: { object: "=" }, link: link }; }); /* * directive defination */ ListView.directive('listView', ["$filter", "gettext", "UserPermissions", function($filter, gettext, User) { function link(scope, element, attrs){ var ltr = is_ltr(); var _item_per_page = parseInt(scope.item_per_page, 10) || 10; var _current_page = 1; console.log("<<<<<<<<"); console.log(scope.tools_processor); scope.list_view = true; scope.grid_view = false; var use_permissions; if (scope.use_permissions === undefined) { use_permissions = true; } else { use_permissions = false; } scope.get_attr = function(object, attr_name, default_value) { if (typeof(object[attr_name]) == "function") { return object[attr_name](); } else if (object[attr_name] !== undefined) { return object[attr_name] || default_value; } else { var value = scope.title(object); if ( value == false) { throw "No attribute '" + attr_name + "' found for '" + object.toString() + "'"; } return value; } }; scope.title = function(object, t) { console.log(scope.title_attr); if (typeof(scope.title_attr) == "function") { return scope.title_attr(object); } if (object[scope.title_attr] !== undefined) { return object[scope.title_attr]; } else { return false; } }; var filtered_objects = function(){ var filterby = {}; if (typeof(scope.title_attr) == "function") { filterby = scope.title_attr; } else { filterby[scope.title_attr] = scope.searchterm; } var result = $filter('filter')(scope.objects, filterby, function(expected, actual){ var re = new RegExp(".*" + actual + ".*", "ig"); scope.go_to_first_page(); if( expected.match(re) ){ return true; } return false; }); // TODO: Double check this or condition return result || []; }; scope.grid_options = { data: 'objects', headerRowHeight: 30, rowHeight: 30, enablePaging: true, afterSelectionChange: function(rowitem, event){ console.dir(rowitem); console.dir(event); }, columnDefs: scope.column_defs }; var delete_method = scope.on_delete || function(x){ console.log( "undefined on delete method" ); }; scope.is_ltr = ltr; scope.handle_icon = "fa-eye"; scope.first_page_icon = ltr ? "fa-angle-double-left" : "fa-angle-double-right"; scope.last_page_icon = ltr ? "fa-angle-double-right" : "fa-angle-double-left"; scope.prev_page_icon = ltr ? "fa-angle-left" : "fa-angle-right"; scope.next_page_icon = ltr ? "fa-angle-right" : "fa-angle-left"; scope.hand_icon = ltr ? "fa-hand-o-right" : "fa-hand-o-left"; scope.is_all_selected = false; scope.handle_icon_expand = function(object){ if(scope.should_view(object)) { return "fa-eye-slash"; } return ""; }; // View an item details scope.toggle_details = function(object){ if (object['view_details'] !== undefined){ object.view_details = ! object.view_details; } else { object.view_details = true; } }; // Should we open details section scope.should_view = function(object){ if ((object !== undefined) && (object['view_details'] !== undefined)) { return object.view_details; } return false; }; scope.delete_items = function(){ var len = scope.selected_count(); var objects_to_delete = []; if( confirm(gettext("Are sure you want to delete ") + len + gettext(" item(s)?")) ){ var objects_list = filtered_objects(); for(var i = 0 ; i < objects_list.length; i++){ if (objects_list[i].is_selected === true) { objects_to_delete.push(objects_list[i]); } } delete_method(objects_to_delete); } }; // Selection related methods ----------------------------------- // Select a row in table scope.select_item = function(object) { if (object['is_selected'] !== undefined) { object.is_selected = ! object.is_selected; } else { object.is_selected = true; } }; scope.toggle_select = function (){ var objects_list = filtered_objects(); for(i = 0 ; i < objects_list.length; i++){ objects_list[i].is_selected = ! objects_list[i].is_selected; } }; scope.toggle_select = function (){ var objects_list = filtered_objects(); for(i = 0 ; i < objects_list.length; i++){ objects_list[i].is_selected = ! objects_list[i].is_selected; } }; scope.select_all = function (){ var objects_list = filtered_objects(); for(i = 0 ; i < objects_list.length; i++){ objects_list[i].is_selected = ! scope.is_all_selected; } scope.is_all_selected = ! scope.is_all_selected; }; scope.selected_count = function(){ var myobjects = filtered_objects(); var count = 0; for(var i = 0; i < myobjects.length; i++) { if(myobjects[i].is_selected !== undefined){ if(myobjects[i].is_selected) { count++; } } } return count; }; // Pagination methods --------------------------------- scope.has_pagination = function(){ return scope.total_pages() > 1 ? true : false; }; scope.total_pages = function(){ var len = filtered_objects().length; var pages = parseInt(len / _item_per_page, 10); if (len % _item_per_page > 0 || len < _item_per_page) { pages++; } return pages; }; scope.current_page = function(){ return _current_page; }; scope.go_to_next_page = function(){ if (_current_page < scope.total_pages()) { _current_page++; } else { _current_page = scope.total_pages(); } }; scope.go_to_prev_page = function(){ if (_current_page > 1) { _current_page--; } else { _current_page = 1; } }; scope.go_to_last_page = function(){ _current_page = scope.total_pages(); }; scope.go_to_first_page = function(){ _current_page = 1; }; scope.go_to_page = function($event, value){ if( $event.which == 13 ){ var page = parseInt(value, 10); if (page > 0 && page <= scope.total_pages()) { _current_page = page; } else { value = _current_page; } } }; scope.get_current_page = function(){ var start = (scope.current_page() * _item_per_page) - _item_per_page; var end = (scope.current_page() * _item_per_page); return filtered_objects().slice(start, end); }; scope.objects_count = function(){ return filtered_objects().length; }; scope.has_permission = function(button) { if (use_permissions === true) { if( button.permission !== undefined ){ if ((!("name" in button.permission)) || (!("model" in button.permission))) { console.log("Button permission should be an object and has 'name' and 'model' keys"); throw "Button permission should be an object and has 'name' and 'model' keys"; } return User.can(button.permission.name, button.permission.model); } } return true; }; scope.can = function(perm, model) { if (use_permissions === true) { return User.can(perm, model); } return true; }; } // Actual object of directive return { templateUrl: template("list-view/index"), restrict: "E", transclude: true, scope: { // Header section custom buttons buttons: "=buttons", // Objects which should listed objects: "=", // Object attribute which should show as title in main li title_attr: "=titleAttribute", // Template address for details section details_template: "=detailsTemplate", // Number of item per pages item_per_page: "=itemPerPage", // Search input search: "=", // Grid columns column_defs: "=columnDefs", // Permissions use_permissions: "=usePermissions", // Permission model permission_model: "=model", // On delete method on_delete: "=onDelete", // Title of list box list_title: '=listTitle', // Tools array to use/show for each row tools: '=tools', // Custom delete title method delete_title: "=deleteTitle", //Badge operation function badge_processor: '=badgeProcessor' }, link: link }; }]);