Фильтрация эпопей с доски Канбан - PullRequest
1 голос
/ 03 апреля 2012

Я хотел бы начать с того, что прочитал Rally Kanban - скрывая Epic Stories , но у меня все еще возникают проблемы с реализацией моего фильтра на основе процесса фильтрации из приложения Оценочная доска.В настоящее время я пытаюсь добавить фильтр элементов в свой объект запроса для моего картона.Объект запроса вызывает this._getItems для возврата массива элементов для фильтрации.Насколько я могу судить, запрос вызывает функцию, загружается на секунду или две, а затем не показывает результатов.Любые предложения, предложения или альтернативные решения приветствуются.

Вот мой код

$that._redisplayBoard = function() {


            that._getAndStorePrefData(displayBoard);

            this._getItems = function(callback) {

            //Build types based on checkbox selections
            var queries = [];

                    queries.push({key:"HierarchicalRequirement",
                        type: "HierarchicalRequirement",
                        fetch: "Name,FormattedID,Owner,ObjectID,Rank,PlanEstimate,Children,Ready,Blocked",
                        order: "Rank"

                    });



            function bucketItems(results) {
                var items = [];

                rally.forEach(queries, function(query) {
                    if (results[query.key]) {
                        rally.forEach(results[query.key], function(item) {
                            //exclude epic stories since estimates cannot be altered
                            if ((item._type !== 'HierarchicalRequirement') ||
                                    (item._type === 'HierarchicalRequirement' && item.Children.length === 0)) {
                                items = items.concat(item);

                            }
                        });
      }
                });


               callback(items);
                }

                 rallyDataSource.findAll(queries, bucketItems);

            };

            function displayBoard() {

                artifactTypes = [];



                var cardboardConfig = {

                    types: [],

                    items: that._getItems,

                    attribute: kanbanField,

                    sortAscending: true,

                    maxCardsPerColumn: 200,

                    order: "Rank",

                    cardRenderer: KanbanCardRenderer,

                    cardOptions: {

                        showTaskCompletion: showTaskCompletion,

                        showAgeAfter: showAgeAfter

                    },

                    columnRenderer: KanbanColumnRenderer,

                    columns: columns,

                    fetch: "Name,FormattedID,Owner,ObjectID,Rank,Ready,Blocked,LastUpdateDate,Tags,State,Priority,StoryType,Children"

                };



                if (showTaskCompletion) {

                    cardboardConfig.fetch += ",Tasks";

                }



                if (hideLastColumnIfReleased) {

                    cardboardConfig.query = new rally.sdk.util.Query("Release = null").or(kanbanField + " != " + '"' + lastState + '"');

                }



                if (filterByTagsDropdown && filterByTagsDropdown.getDisplayedValue()) {

                    cardboardConfig.cardOptions.filterBy = { field: FILTER_FIELD, value: filterByTagsDropdown.getDisplayedValue() };

                }



                cardboardConfig.types.push("HierarchicalRequirement");



                if (cardboard) {

                    cardboard.destroy();

                }



                artifactTypes = cardboardConfig.types;






                cardboard = new rally.sdk.ui.CardBoard(cardboardConfig, rallyDataSource);




                cardboard.addEventListener("preUpdate", that._onBeforeItemUpdated); 
                cardboard.addEventListener("onDataRetrieved", function(cardboard,args){ console.log(args.items); }); 

                cardboard.display("kanbanBoard");

            }

        };


        that.display = function(element) {



            //Build app layout

            this._createLayout(element);



            //Redisplay the board

            this._redisplayBoard();

        };

    };

Ответы [ 3 ]

2 голосов
/ 05 апреля 2012

За Чарльз 'подсказка в Ралли Канбан - сокрытие Эпических историй

Вот как я подошел к этому после намека Чарльза на каталог ралли Канбан. Во-первых, измените оператор fetch внутриboardConfig, чтобы он включал коллекцию Children, таким образом:

      fetch: "Name,FormattedID,Children,Owner,ObjectID,Rank,Ready,Blocked,LastUpdateDate,Tags,State"

Далее, между этим утверждением:

      cardboard.addEventListener("preUpdate", that._onBeforeItemUpdated);   

И это утверждение:

     cardboard.display("kanbanBoard");

Добавьте следующий прослушиватель событий и обратный вызов:

    cardboard.addEventListener("onDataRetrieved", 
        function(cardboard, args){
            // Grab items hash
            filteredItems = args.items;

            // loop through hash keys (states)
            for (var key in filteredItems) {

                // Grab the workproducts objects (Stories, defects)                 
                workproducts = filteredItems[key];
                // Array to hold filtered results, childless work products
                childlessWorkProducts = new Array();
                // loop through 'em and filter for the childless
                for (i=0;i<workproducts.length;i++) {
                    thisWorkProduct = workproducts[i];                      
                    // Check first if it's a User Story, since Defects don't have children
                    if (thisWorkProduct._type == "HierarchicalRequirement") {
                        if (thisWorkProduct.Children.length === 0 ) {
                            childlessWorkProducts.push(thisWorkProduct);
                        }
                    } else {
                        // If it's a Defect, it has no children so push it
                        childlessWorkProducts.push(thisWorkProduct);
                    } 
                }
                filteredItems[key] = childlessWorkProducts;
            }
            // un-necessary call to cardboard.setItems() was here - removed
        }
    );

Этот обратный вызов должен фильтровать только для элементов конечного узла.

1 голос
/ 05 апреля 2012

Ответ Марка вызвал неясный сбой при вызовеboard.setItems (FilterItems). Однако, поскольку код фильтрации фактически манипулирует реальными ссылками, оказывается, что метод setItems () на самом деле не нужен. Я вытащил его, и теперь он фильтруется правильно.

1 голос
/ 04 апреля 2012

Не уверен, что это ваша проблема, но ваша картонная конфигурация не устанавливает поле запроса.Выборка - это тип всех данных, которые нужно извлечь. Если вы хотите отфильтровать их, вы добавляете значение «query:» в объект конфигурации.Примерно так:

        var cardboardConfig = {
         types: ["PortfolioItem", "HierarchicalRequirement", "Feature"],
         attribute: dropdownAttribute,
         fetch:"Name,FormattedID,Owner,ObjectID,ClassofService",
         query : fullQuery,
         cardRenderer: PriorityCardRenderer
    };

Где fullQuery может быть создан с использованием объекта запроса Rally.Вы найдете его, выполнив поиск в SDK.Надеюсь, что это может помочь.

...