[{"status": "merged", "task_statuses": [{"count": 0, "key": "review"}, {"count": 0, "key": "todo"}, {"count": 2, "key": "invalid"}, {"count": 24, "key": "merged"}, {"count": 0, "key": "inprogress"}], "description": "It would be good to be able to create ordered lists of tasks and stories. These lists could be used to represent priorities from different perspectives for example. A worklist should also be able to be created such that its contents are automatically updated based on some criteria.\n\nIt would also be useful to arrange multiple lists in a \"board\" to provide a kanban workflow if desired.\n\n### Links\n\n* [\"Task lists\" plan](https://wiki.openstack.org/wiki/StoryBoard/Task_Lists)\n* [Proposed spec](https://review.openstack.org/#/c/202989/)", "title": "Worklists and Boards in StoryBoard", "created_at": "2015-07-17T11:21:21+00:00", "tags": ["storyboard-feature-request", "storyboard-worklists"], "updated_at": "2019-05-02T21:09:33+00:00", "private": false, "teams": [], "is_bug": true, "creator_id": 935, "story_type_id": 1, "security": null, "id": 2000322, "users": []}, {"status": "active", "task_statuses": [{"count": 0, "key": "review"}, {"count": 1, "key": "todo"}, {"count": 0, "key": "invalid"}, {"count": 0, "key": "merged"}, {"count": 0, "key": "inprogress"}], "description": "Fulltext indexes are only supported when using the InnoDB engine from MySQL version 5.6 and higher. Also, other database backends (eg MariaDB) aren't thought about by the migrations which add these indexes, so they are sometimes not created.\n\nWhen the indexes are missing, search gives a confusing error about not being able to find fulltext indexes, but it should really fall back to a different search method somehow.", "title": "Search should fall back on something other than fulltext indexes", "created_at": "2015-11-24T12:47:30+00:00", "tags": ["storyboard-feature-request"], "updated_at": "2019-05-02T20:23:26+00:00", "private": false, "teams": [], "is_bug": true, "creator_id": 935, "story_type_id": 1, "security": null, "id": 2000429, "users": []}, {"status": "active", "task_statuses": [{"count": 0, "key": "review"}, {"count": 8, "key": "todo"}, {"count": 0, "key": "invalid"}, {"count": 4, "key": "merged"}, {"count": 0, "key": "inprogress"}], "description": "The current boards UI is satisfactory for basic use, but requires improvements to really be useful.\n\n## Card details\n\nIn most kanban implementations, clicking on a card will display detailed information about the card. In StoryBoard, doing that will take you to the story page. That is a similar thing, but it means you need to navigate back to the board when you've looked at card details, and also isn't the greatest way to approach this with tasks.\n\nInstead, we should display a modal detailing information about the card (such as assignee(s) and due dates, when due-dates become a thing). Cards which are stories should show the tasks in that story on the modal. The modal should also allow editing of all the information displayed.\n\n## Due date\n\nThere also needs to be some way of displaying the due date of a task on the card, perhaps a colour-coded hint?\n\n## Metadata hints\n\n* Story tags should maybe cause some kind of hint on the cards in the UI?\n* Cards which are tasks in the same story should have a hint to show the connection\n    * Story name somewhere?\n* The assignee of cards should be indicated somewhere\n\n## Ease of adding cards\n\nIt is now fairly easy to add existing tasks and stories to a board, but creating an entirely new story/task to add to a board is annoyingly convoluted (create story, create tasks, go to board, find story/tasks, add them). The \"Add card\" UI should allow users to create new stories and new tasks in an existing story with minimal clicks and renavigation.\n\nWe should also make it possible to add stories/tasks to a board from the story detail page.\n\n## Bugs\n\nInteracting with lanes long enough to have a scroll bar isn't very fun, dragging cards to the top and bottom of the lane should cause it to scroll.\n\nShould it be possible to set permissions when creating the board?", "title": "Improve kanban board UI", "created_at": "2016-01-15T12:39:22+00:00", "tags": ["low-hanging-fruit", "storyboard-feature-request", "storyboard-worklists"], "updated_at": "2016-01-16T00:40:01+00:00", "private": false, "teams": [], "is_bug": true, "creator_id": 935, "story_type_id": 1, "security": null, "id": 2000464, "users": []}, {"status": "active", "task_statuses": [{"count": 0, "key": "review"}, {"count": 3, "key": "todo"}, {"count": 1, "key": "invalid"}, {"count": 3, "key": "merged"}, {"count": 0, "key": "inprogress"}], "description": "<small class=\"text-muted\">Edit this description to see the old version, which the commments up to and including the one from `2016-02-03 at 11:25:48` are referring to.</small>\n\n## Use cases\n\n* A project manager wants to assign due dates to tasks in a project kanban, according to some set of deadlines she has planned.\n* A project manager wants to assign a task to a user (eg. assign someone from Purchasing to a \"purchase hardware\" task), and set a due date for the completion of the order.\n* A manager at company A needs feature X of some open project P fixed by some date. They set a due date for it in the kanban their team is using in P's StoryBoard instance. A manager at company B needs feature X by a different date, and sets a due date on feature X which matches their expectations, and sets their own kanban to show the due date they created.\n* A developer needs to update the due date for a particular task by moving it from one named due date for the board to another.\n\n## Proposed Implementation\n\n### Database\n\nA new table, `due_dates`:\n\n* `id` <span class=\"text-muted\">(auto-generated, primary key)</span>: The ID of the due date.\n* `name` <span class=\"text-muted\">(optional)</span>: The name of the due date, for easily identifying what the due date is for.\n* `date`: The actual due date.\n* `private`: Whether or not the due date is visible **only** to those with the correct permissions.\n* `created_at`: The date the due date was created at.\n* `updated_at`: The date the due date was last updated.\n\nNew mapping tables:\n\n* `due_date_permissions`: Maps due dates to their permissions, will work similarly to the boards permissions.\n* `board_due_dates`: Maps boards to the due dates that are available for use/displayed in them.\n* `worklist_due_dates`: Maps worklists to the due dates that are available for use/displayed in them.\n* `task_due_dates`: Maps tasks to the set of due dates they have been asserted to have.\n* `story_due_dates`: As above, but with stories.\n\n### Webclient\n\nDue dates can be created either on a story detail page or on the board/worklist detail page. If created on the story detail page, the permissions default to the creator being the only owner, with no-one set to have read-only permissions. If created on the board/worklist detail page, the permissions default to match the board/worklist permissions.\n\nDue dates can be \"added\" for use/display in a board. If one card has more than one due date available to display in the board, it will display the closest date by default, with an indication that there are other due dates asserted in the board. Clicking on the card [should display a modal]( https://storyboard.openstack.org/#!/story/2000464) which contains a list of all due dates (as well as the other card data).\n\nThe view of board/worklist contents should be able to be filtered by due date, with all contents shown by default.\n\nThe board/worklist detail page should display a list of all due dates available in the board, and allow them to be edited in place by those with the right permissions. This list should also indicate how many cards are related to each due date.\n\n\n<!-- Old description is here, do not delete.\n\nThe kanban boards would be more useful for assisting with the management of projects if there was a way to display when cards in the board have a deadline date.\n\nThis deadline date could be per-board, or it could be a hard deadline by which the task must be completed (eg. a thing is happening on such-a-date, this task must be done by then at the absolute latest).\n\nThis means:\n* It should be possible to create a **deadline** for a task, which is associated with the underlying task, not a card.\n    * The **deadline** should be something caused by a real hard limit, such as \"we are delivering this task's outcome on that date\".\n* It should be possible to create a **target date** for a card, which can be different in different boards.\n    * The **target date** must not be able to be any later than the underlying task's **deadline**, if it has one.\n    * The **target date** should be caused by a human deciding they want to have the task done by the date, not a limit which affects multiple people.\n* It should be possible to associate a **target name** with a **target date**, to allow easy understanding of why **target dates** are the dates they are, and also to provide a simple way to change the date across multiple cards.\n* The board detail page needs to show a list of the targets/deadlines associated with cards in the board, and also the number of cards associated with each target/deadline.\n\n-->", "title": "Show due dates on cards in kanban boards", "created_at": "2016-01-29T17:13:23+00:00", "tags": ["low-hanging-fruit"], "updated_at": "2021-03-26T18:57:29+00:00", "private": false, "teams": [], "is_bug": true, "creator_id": 935, "story_type_id": 1, "security": null, "id": 2000476, "users": []}, {"status": "active", "task_statuses": [{"count": 0, "key": "review"}, {"count": 1, "key": "todo"}, {"count": 0, "key": "invalid"}, {"count": 0, "key": "merged"}, {"count": 0, "key": "inprogress"}], "description": "StoryBoard now sends basic notification emails to subscribers to a resource, when the resource in question (or any \"child\" resource; e.g. tasks in stories, tasks in projects, stories related to projects via tasks) is changed in some way.\n\nPeople who receive such emails should be able to respond to them in some way, such as to leave a comment on a newly created story for example. This should be possible by replying directly to the email, as well as by navigating to the story in the webclient and leaving a comment there.", "title": "StoryBoard should allow replies to its notification emails", "created_at": "2016-04-25T19:08:09+00:00", "tags": [], "updated_at": null, "private": false, "teams": [], "is_bug": true, "creator_id": 935, "story_type_id": 1, "security": null, "id": 2000564, "users": []}, {"status": "merged", "task_statuses": [{"count": 0, "key": "review"}, {"count": 0, "key": "todo"}, {"count": 0, "key": "invalid"}, {"count": 2, "key": "merged"}, {"count": 0, "key": "inprogress"}], "description": "The filtering is currently kind of weird, and uses an sql query before further manipulating the result. This should be changed to only use an sql query, which should speed things up a small amount, and also make extending the code much less annoying.\n\nWhilst this is done, the remaining post-sql processing behaviour should change, in order to allow one request to get the list of boards/worklists containing any task in a story, given the story ID.", "title": "Improve filtering of boards and worklists", "created_at": "2016-04-27T11:59:00+00:00", "tags": [], "updated_at": null, "private": false, "teams": [], "is_bug": true, "creator_id": 935, "story_type_id": 1, "security": null, "id": 2000565, "users": []}, {"status": "active", "task_statuses": [{"count": 0, "key": "review"}, {"count": 4, "key": "todo"}, {"count": 0, "key": "invalid"}, {"count": 10, "key": "merged"}, {"count": 0, "key": "inprogress"}], "description": "Some stories may contain information that cannot be shared publicly, for example bugs which lead to security vulnerabilities. StoryBoard needs the ability to mark a story as \"private\", such that it can only be seen by a configurable list of people. This list of people will need to be different per-story and may change over the life of the story.\n\nThe contents (and existence of) private stories and the tasks contained therein *must* be invisible to anyone not in the permission list in all the places stories/tasks can be found, including due dates, worklists, boards, API, and so on. Addition of a very visible warning banner is also preferred, to warn viewers the bug is private.\n\nIt is understood that the existence of _a_ private bug can be determined by enumerating bug ID numbers, so as long as the contents are not accessible this is acceptable (at least not a regression from Launchpad).", "title": "Stories should be able to be private", "created_at": "2016-04-29T16:20:43+00:00", "tags": ["storyboard-feature-request"], "updated_at": "2019-06-21T17:53:21+00:00", "private": false, "teams": [], "is_bug": true, "creator_id": 935, "story_type_id": 1, "security": null, "id": 2000568, "users": []}, {"status": "merged", "task_statuses": [{"count": 0, "key": "review"}, {"count": 0, "key": "todo"}, {"count": 0, "key": "invalid"}, {"count": 1, "key": "merged"}, {"count": 0, "key": "inprogress"}], "description": "Logging in produces an error when running StoryBoard with Python 3.5:\n\n    Traceback (most recent call last):\n      File \"/usr/lib/python3.5/wsgiref/handlers.py\", line 137, in run\n        self.result = application(self.environ, self.start_response)\n      File \"/home/codethink/storyboard/storyboard/api/middleware/token_middleware.py\", line 49, in __call__\n        return self.app(env, start_response)\n      File \"/home/codethink/storyboard/.tox/venv/lib/python3.5/site-packages/pecan/middleware/recursive.py\", line 56, in __call__\n        return self.application(environ, start_response)\n      File \"/home/codethink/storyboard/.tox/venv/lib/python3.5/site-packages/pecan/core.py\", line 829, in __call__\n        return super(Pecan, self).__call__(environ, start_response)\n      File \"/home/codethink/storyboard/.tox/venv/lib/python3.5/site-packages/pecan/core.py\", line 678, in __call__\n        self.invoke_controller(controller, args, kwargs, state)\n      File \"/home/codethink/storyboard/.tox/venv/lib/python3.5/site-packages/pecan/core.py\", line 572, in invoke_controller\n        result = controller(*args, **kwargs)\n      File \"/home/codethink/storyboard/storyboard/common/decorators.py\", line 43, in decorate\n        return func(self, *args, **kwargs)\n      File \"/home/codethink/storyboard/storyboard/api/v1/auth.py\", line 64, in authorize_return\n        openid_client.verify_openid(request)\n      File \"/home/codethink/storyboard/storyboard/api/auth/openid_client.py\", line 138, in verify_openid\n        for token in verify_data_tokens)\n      File \"/home/codethink/storyboard/storyboard/api/auth/openid_client.py\", line 138, in <genexpr>\n        for token in verify_data_tokens)\n    TypeError: a bytes-like object is required, not 'str'", "title": "Logging in to StoryBoard doesn't work in python 3.5", "created_at": "2016-05-09T14:50:16+00:00", "tags": [], "updated_at": "2018-03-05T17:22:41+00:00", "private": false, "teams": [], "is_bug": true, "creator_id": 935, "story_type_id": 1, "security": null, "id": 2000576, "users": []}, {"status": "merged", "task_statuses": [{"count": 0, "key": "review"}, {"count": 0, "key": "todo"}, {"count": 0, "key": "invalid"}, {"count": 1, "key": "merged"}, {"count": 0, "key": "inprogress"}], "description": "At the moment, adding `Story: $id` in the commit message of a gerrit change creates a link back to the story. We should be using the task id instead, since tasks map directly to commits (and stories do not). This will allow us to parse the commit message and update the status/assignee/notes of the referenced task.\n\n<img src=\"http://i.imgur.com/4F74ro9.jpg\" width=\"100%\" />\n\nWIP Proof of Concept for how things should work: https://review.openstack.org/#/c/302912/1\n\nSee also: \n\nhttps://storyboard.openstack.org/#!/story/2000012", "title": "Gerrit should use task ids instead of story ids in its commit syntax", "created_at": "2016-05-16T11:42:57+00:00", "tags": [], "updated_at": "2016-05-16T16:18:33+00:00", "private": false, "teams": [], "is_bug": true, "creator_id": 935, "story_type_id": 1, "security": null, "id": 2000584, "users": []}, {"status": "merged", "task_statuses": [{"count": 0, "key": "review"}, {"count": 0, "key": "todo"}, {"count": 0, "key": "invalid"}, {"count": 1, "key": "merged"}, {"count": 0, "key": "inprogress"}], "description": "If two people open a given story view, and both edit different fields of a task, the change by the person who finishes later will be the only change reflected in the database. The earlier change is fully overwritten because updating one task field in the UI updates them all to match the UI state in the database.", "title": "Concurrent editing of tasks isn't possible", "created_at": "2016-06-03T13:40:14+00:00", "tags": [], "updated_at": null, "private": false, "teams": [], "is_bug": true, "creator_id": 935, "story_type_id": 1, "security": null, "id": 2000625, "users": []}, {"status": "merged", "task_statuses": [{"count": 0, "key": "review"}, {"count": 0, "key": "todo"}, {"count": 0, "key": "invalid"}, {"count": 3, "key": "merged"}, {"count": 0, "key": "inprogress"}], "description": "It should be possible to subscribe to a worklist. It may one day be useful to receive notifications about items being moved in worklists, but this should be configurable as soon as it is implemented, since we want to use subscription to worklists as a generic expression of interest in the worklist.", "title": "Allow subscription to worklists", "created_at": "2016-06-03T14:01:35+00:00", "tags": [], "updated_at": null, "private": false, "teams": [], "is_bug": true, "creator_id": 935, "story_type_id": 1, "security": null, "id": 2000626, "users": []}, {"status": "active", "task_statuses": [{"count": 0, "key": "review"}, {"count": 2, "key": "todo"}, {"count": 0, "key": "invalid"}, {"count": 2, "key": "merged"}, {"count": 0, "key": "inprogress"}], "description": "We should allow people who are subscribed to worklists and/or boards to elect to receive notifications for changes in the boards/worklists.", "title": "Notifications from worklists and boards", "created_at": "2016-06-14T10:15:12+00:00", "tags": ["storyboard-notifications"], "updated_at": "2019-06-07T17:41:58+00:00", "private": false, "teams": [], "is_bug": true, "creator_id": 935, "story_type_id": 1, "security": null, "id": 2000644, "users": []}, {"status": "active", "task_statuses": [{"count": 0, "key": "review"}, {"count": 1, "key": "todo"}, {"count": 0, "key": "invalid"}, {"count": 1, "key": "merged"}, {"count": 0, "key": "inprogress"}], "description": "Archived cards in a lane cause other cards to have non-sequential positions, which could cause trouble when deleting cards then moving others into what the web UI sees as that position.\n\nThe same is true of cards of tasks from stories that have been deleted.", "title": "Certain types of cards cause card position to be inconsistent", "created_at": "2016-06-30T15:51:07+00:00", "tags": ["storyboard-worklists"], "updated_at": "2019-06-21T18:09:16+00:00", "private": false, "teams": [], "is_bug": true, "creator_id": 935, "story_type_id": 1, "security": null, "id": 2000666, "users": []}, {"status": "active", "task_statuses": [{"count": 0, "key": "review"}, {"count": 3, "key": "todo"}, {"count": 0, "key": "invalid"}, {"count": 0, "key": "merged"}, {"count": 0, "key": "inprogress"}], "description": "It would be useful to be able to filter tasks based on tags that their stories have, particularly when using automatic worklists.\n\nSpecifically, an automatic worklist containing `Tasks matching status:todo and not matching tag:triaged ...` will be useful for folk who wish to triage incoming/outstanding tasks in their project. Tasks are used rather than stories because status (and project) are related to tasks, rather than stories.", "title": "Allow tasks to be filtered based on their story's tags", "created_at": "2017-04-12T14:36:29+00:00", "tags": ["storyboard-worklists", "storyboard-searching-enhancements"], "updated_at": "2019-06-21T18:11:21+00:00", "private": false, "teams": [], "is_bug": true, "creator_id": 935, "story_type_id": 1, "security": null, "id": 2000982, "users": []}, {"status": "active", "task_statuses": [{"count": 0, "key": "review"}, {"count": 1, "key": "todo"}, {"count": 0, "key": "invalid"}, {"count": 0, "key": "merged"}, {"count": 0, "key": "inprogress"}], "description": "When creating a story:\n\n    500: POST /api/v1/tasks: (InternalError) (1213, u'Deadlock found when trying to get lock; try restarting transaction') u'UPDATE stories SET updated_at=%(updated_at)s WHERE stories.id = %(stories_id)s' {'updated_at': datetime.datetime(2017, 4, 12, 14, 36, 29, 506355), 'stories_id': 2000982}\n\nThis resulted in one of the tasks not being created.", "title": "Investigate mitigating deadlock issues", "created_at": "2017-04-12T14:39:12+00:00", "tags": [], "updated_at": "2019-06-24T23:39:44+00:00", "private": false, "teams": [], "is_bug": true, "creator_id": 935, "story_type_id": 1, "security": null, "id": 2000983, "users": []}, {"status": "merged", "task_statuses": [{"count": 0, "key": "review"}, {"count": 0, "key": "todo"}, {"count": 0, "key": "invalid"}, {"count": 1, "key": "merged"}, {"count": 0, "key": "inprogress"}], "description": "A few people have hit an issue where login fails with `invalid_grant` and little other useful information. We should work out what is causing this and fix it.\n\n    23:58 < johnsom> Ha, so I log out, log back in and after the ubuntuone login page:\n    23:58 < johnsom> 401: POST /api/v1/openid/token?grant_type=authorization_code&code=undefined: No error details available.\n    23:58 < johnsom> Oh no!\n    23:58 < johnsom> We encountered an unexpected error while trying to log you in. The error message below should be helpful, though if it's not you can contact our engineers in #storyboard on Freenode .\n    23:58 < johnsom> Error Code:\n    23:58 < johnsom> invalid_grant\n    23:58 < johnsom> Error Description:\n    23:58 < johnsom> No description received from server.\n    23:58 < johnsom> So, yeah, locked out now evidently....\n    23:59 < johnsom> Hmm, retry and I got in", "title": "Investigate invalid_grant login issue", "created_at": "2017-10-10T22:01:56+00:00", "tags": [], "updated_at": "2019-05-02T22:04:26+00:00", "private": false, "teams": [], "is_bug": true, "creator_id": 935, "story_type_id": 1, "security": null, "id": 2001227, "users": []}, {"status": "active", "task_statuses": [{"count": 0, "key": "review"}, {"count": 1, "key": "todo"}, {"count": 0, "key": "invalid"}, {"count": 0, "key": "merged"}, {"count": 0, "key": "inprogress"}], "description": "When browsing tasks by (for example) story ID and task status, a 400 error is produced rather than useful results.\n\n    400: GET /api/v1/tasks: Unknown argument: \"offset\"\n\nNote that browsing just by story ID works as expected. An example: https://storyboard.openstack.org/#!/search?story_id=2001546&status=inprogress", "title": "Browsing tasks on the search view sometimes gives an error", "created_at": "2018-09-05T08:39:14+00:00", "tags": ["bug", "low-hanging-fruit"], "updated_at": "2019-03-12T15:44:17+00:00", "private": false, "teams": [], "is_bug": true, "creator_id": 935, "story_type_id": 1, "security": null, "id": 2003663, "users": []}, {"status": "active", "task_statuses": [{"count": 0, "key": "review"}, {"count": 1, "key": "todo"}, {"count": 0, "key": "invalid"}, {"count": 0, "key": "merged"}, {"count": 0, "key": "inprogress"}], "description": "The distinction between \"Owner\" and \"User\" with no further information is probably only obvious to StoryBoard devs. The meaning of these two permission levels should be documented in the user interface somewhere, preferably when modifying them.", "title": "Worklist/Board permissions should be documented in the UI", "created_at": "2019-02-06T23:11:40+00:00", "tags": ["low-hanging-fruit"], "updated_at": "2019-05-03T16:54:30+00:00", "private": false, "teams": [], "is_bug": true, "creator_id": 935, "story_type_id": 1, "security": null, "id": 2004955, "users": []}, {"status": "active", "task_statuses": [{"count": 0, "key": "review"}, {"count": 7, "key": "todo"}, {"count": 0, "key": "invalid"}, {"count": 0, "key": "merged"}, {"count": 0, "key": "inprogress"}], "description": "There are various places in StoryBoard where one can view a list of things, most frequently Stories. All of these places have subtly or not-so-subtly different UI layouts, which as well as implying a lack of sensible code reuse makes StoryBoard more frustrating to use than it needs to be.\n\nA side effect of some of these UI choices means that the ability to filter lists in some views is limited at best.\n\n## Stories\n\nWe should treat the \"story list\" view (https://storyboard.openstack.org/#!/story/list) as the canonical way of displaying Stories, and the following views should be modified to conform to it (at least the manner in which stories, column headers, etc. are displayed).\n\n### Project detail view\n- https://storyboard.openstack.org/#!/project/opendev/storyboard-webclient for example\n- Contains a list of stories organised by status, separated by tabs\n- For this story, we should make these organised stories be displayed in the same way as stories in\n  the story list view\n\n### Project Group detail view\n- https://storyboard.openstack.org/#!/project_group/storyboard for example\n- Contains a list of stories filtered by one or more statuses, controlled by checkboxes\n- For this story, we should:\n  - Use tabs instead of checkboxes, as on the project page\n  - Make the displayed stories be the same as in the story list view\n\nWe should also consider making both of these views filterable in the same way as the story list view, but that belongs in a different Story (TODO: link that here).\n\n\n## Projects\n\nProjects are displayed consistently in the two relevant places (project group detail and also projects list), however they should have more information visible to be consistent with the kinds of things made visible for Stories.\n\n\n## Project Groups\n\nThe Project Group list view has a similar issue to the Project list view; it needs more information to be visible to sort by, in the form of column headers.\n\n\n## Worklists/Boards\n\nAll of the list views have one object per view, except worklists and boards which has two. We should split this into two views with a submenu to switch between the two, similar to the dashboard submenu.\n\n\n## Search\n\nThe general-purpose \"advanced\" search view displays all relevant types of object. It doesn't have column headers, and it should.", "title": "Make UI for lists of things consistent across different views", "created_at": "2019-05-03T20:39:36+00:00", "tags": ["storyboard-searching-enhancements"], "updated_at": "2019-06-21T17:55:02+00:00", "private": false, "teams": [], "is_bug": true, "creator_id": 935, "story_type_id": 1, "security": null, "id": 2005559, "users": []}, {"status": "active", "task_statuses": [{"count": 0, "key": "review"}, {"count": 4, "key": "todo"}, {"count": 0, "key": "invalid"}, {"count": 0, "key": "merged"}, {"count": 0, "key": "inprogress"}], "description": "Currently email preferences have one option: on or off. This is sufficient for basic functionality, but we should make this configuration richer to allow users to express which types of changes to enable email for, and to choose between an email per change and a daily digest email of all relevant changes.", "title": "Make email preferences more configurable", "created_at": "2019-05-03T21:24:42+00:00", "tags": ["storyboard-emails"], "updated_at": "2019-05-03T21:29:54+00:00", "private": false, "teams": [], "is_bug": true, "creator_id": 935, "story_type_id": 1, "security": null, "id": 2005560, "users": []}, {"status": "active", "task_statuses": [{"count": 0, "key": "review"}, {"count": 1, "key": "todo"}, {"count": 0, "key": "invalid"}, {"count": 0, "key": "merged"}, {"count": 0, "key": "inprogress"}], "description": "When searching (rather than browsing, so only when adding a \"Text\" item which puts `q=whatever` in the URL), the page controls say things like \"1 to 0 of 16\", instead of the expected \"1 to 10 of 16\" or similar.", "title": "Result paging information is wrong when searching", "created_at": "2019-05-03T21:48:23+00:00", "tags": ["storyboard-searching-enhancements"], "updated_at": "2019-05-03T21:49:24+00:00", "private": false, "teams": [], "is_bug": true, "creator_id": 935, "story_type_id": 1, "security": null, "id": 2005561, "users": []}, {"status": "active", "task_statuses": [{"count": 0, "key": "review"}, {"count": 1, "key": "todo"}, {"count": 0, "key": "invalid"}, {"count": 0, "key": "merged"}, {"count": 0, "key": "inprogress"}], "description": "The current implementation of searching is confusing for users, and not expressive enough to create complex searches. Additionally, the code itself is confusing thanks to there being two possible paths which are exercised depending on which types of search filters are selected.\n\nAfter lots of discussion in various places, we have decided that search should be implemented using a single API endpoint for each object type, and supporting a detailed syntax which allows logical expressions on object metadata (ie AND, OR, NOT for all attributes). Ideally this syntax should look and work similar to that provided by Gerrit, to help provide a familiar experience since most users of StoryBoard are also users of Gerrit.\n\nThis should supersede the following stories, but they are tracked separately thanks to being smaller and potentially done first:\n\n- https://storyboard.openstack.org/#!/story/2001677\n- https://storyboard.openstack.org/#!/story/2001642\n- https://storyboard.openstack.org/#!/story/2000913", "title": "Replace search/browse implementation with a Gerrit-like query syntax", "created_at": "2019-05-03T22:26:29+00:00", "tags": ["storyboard-searching-enhancements"], "updated_at": "2019-05-03T22:43:58+00:00", "private": false, "teams": [], "is_bug": true, "creator_id": 935, "story_type_id": 1, "security": null, "id": 2005564, "users": []}, {"status": "active", "task_statuses": [{"count": 0, "key": "review"}, {"count": 3, "key": "todo"}, {"count": 0, "key": "invalid"}, {"count": 0, "key": "merged"}, {"count": 0, "key": "inprogress"}], "description": "Currently, the StoryBoard webclient and API are tested independently of each other, with nothing to verify that they can actually work together other than manual testing of changes. There was some work done in the past to support integration testing, but it isn't fully functional and there are no tests implemented that make use of it. The spec for that existing work is [here](https://specs.openstack.org/openstack-infra/infra-specs/specs/storyboard_integration_tests.html), but it is pretty old and may be outdated.\n\nThis probably needs some thought into what the best way to do this testing is, along with work to recreate the jobs to run the integration tests and some useful tests actually being written.", "title": "Implement integration tests for StoryBoard", "created_at": "2019-06-07T17:25:40+00:00", "tags": ["storyboard-testing"], "updated_at": "2019-06-21T17:19:25+00:00", "private": false, "teams": [], "is_bug": true, "creator_id": 935, "story_type_id": 1, "security": false, "id": 2005844, "users": []}, {"status": "active", "task_statuses": [{"count": 1, "key": "review"}, {"count": 0, "key": "todo"}, {"count": 0, "key": "invalid"}, {"count": 0, "key": "merged"}, {"count": 0, "key": "inprogress"}], "description": "The StoryBoard API allows events to be filtered by type, and by the story/worklist/board the event is for, but not by the user who created the event. This is a pretty annoying limitation which makes it hard to find the events recently caused by a given user.\n\nWe should add an `author_id` parameter to the events browse endpoint which filters the events by the event author.", "title": "Add a way to filter timeline events by author", "created_at": "2020-05-07T23:24:08+00:00", "tags": [], "updated_at": "2020-05-08T14:36:13+00:00", "private": false, "teams": [], "is_bug": true, "creator_id": 935, "story_type_id": 1, "security": false, "id": 2007641, "users": []}, {"status": "active", "task_statuses": [{"count": 0, "key": "review"}, {"count": 1, "key": "todo"}, {"count": 0, "key": "invalid"}, {"count": 0, "key": "merged"}, {"count": 0, "key": "inprogress"}], "description": "We need to be able to view boards in a kanban-like UI.", "title": "Implement a board detail view", "created_at": "2021-03-25T18:23:24+00:00", "tags": [], "updated_at": "2021-03-25T18:23:29+00:00", "private": false, "teams": [], "is_bug": true, "creator_id": 935, "story_type_id": 1, "security": false, "id": 2008755, "users": []}, {"status": "active", "task_statuses": [{"count": 0, "key": "review"}, {"count": 1, "key": "todo"}, {"count": 0, "key": "invalid"}, {"count": 0, "key": "merged"}, {"count": 0, "key": "inprogress"}], "description": "The existing webclient has a useful about page. We should have something similar in the new client.", "title": "Implement an About view", "created_at": "2021-03-25T18:24:51+00:00", "tags": [], "updated_at": "2021-03-25T18:24:56+00:00", "private": false, "teams": [], "is_bug": true, "creator_id": 935, "story_type_id": 1, "security": false, "id": 2008756, "users": []}, {"status": "active", "task_statuses": [{"count": 0, "key": "review"}, {"count": 1, "key": "todo"}, {"count": 0, "key": "invalid"}, {"count": 0, "key": "merged"}, {"count": 0, "key": "inprogress"}], "description": "This should be a publically visible list, something which is missing in the existing client.", "title": "Implement a Team list view", "created_at": "2021-03-25T18:27:12+00:00", "tags": [], "updated_at": "2021-03-25T18:27:17+00:00", "private": false, "teams": [], "is_bug": true, "creator_id": 935, "story_type_id": 1, "security": false, "id": 2008757, "users": []}, {"status": "active", "task_statuses": [{"count": 0, "key": "review"}, {"count": 1, "key": "todo"}, {"count": 0, "key": "invalid"}, {"count": 0, "key": "merged"}, {"count": 0, "key": "inprogress"}], "description": "We should have a view which displays membership and related projects for teams. This should be publically visible, unlike the admin-only team detail view in the current client.", "title": "Implement a Team detail view", "created_at": "2021-03-25T18:28:47+00:00", "tags": [], "updated_at": "2021-03-25T18:28:51+00:00", "private": false, "teams": [], "is_bug": true, "creator_id": 935, "story_type_id": 1, "security": false, "id": 2008758, "users": []}, {"status": "active", "task_statuses": [{"count": 0, "key": "review"}, {"count": 1, "key": "todo"}, {"count": 0, "key": "invalid"}, {"count": 0, "key": "merged"}, {"count": 0, "key": "inprogress"}], "description": "We have a board list, we also need a worklist list. In the current client they're together on the same view, but we should have them on separate views in the new client.", "title": "Implement a Worklist list view", "created_at": "2021-03-25T18:33:02+00:00", "tags": [], "updated_at": "2021-03-25T18:33:07+00:00", "private": false, "teams": [], "is_bug": true, "creator_id": 935, "story_type_id": 1, "security": false, "id": 2008759, "users": []}, {"status": "active", "task_statuses": [{"count": 0, "key": "review"}, {"count": 1, "key": "todo"}, {"count": 0, "key": "invalid"}, {"count": 0, "key": "merged"}, {"count": 0, "key": "inprogress"}], "description": "A worklist is like one lane in a board, but can be used independently as a priority list or to-do list.", "title": "Implement a Worklist detail view", "created_at": "2021-03-26T17:13:18+00:00", "tags": [], "updated_at": "2021-03-26T17:13:23+00:00", "private": false, "teams": [], "is_bug": true, "creator_id": 935, "story_type_id": 1, "security": false, "id": 2008765, "users": []}, {"status": "active", "task_statuses": [{"count": 0, "key": "review"}, {"count": 1, "key": "todo"}, {"count": 0, "key": "invalid"}, {"count": 0, "key": "merged"}, {"count": 0, "key": "inprogress"}], "description": "When logged in, we should provide a dashboard which has similar functionality to the existing dashboard in the current client", "title": "Implement a dashboard view", "created_at": "2021-03-26T17:22:31+00:00", "tags": [], "updated_at": "2021-03-26T17:22:35+00:00", "private": false, "teams": [], "is_bug": true, "creator_id": 935, "story_type_id": 1, "security": false, "id": 2008767, "users": []}, {"status": "active", "task_statuses": [{"count": 0, "key": "review"}, {"count": 1, "key": "todo"}, {"count": 0, "key": "invalid"}, {"count": 0, "key": "merged"}, {"count": 0, "key": "inprogress"}], "description": "StoryBoard supports adding attachments to stories. When we can log into the Vue client, it should also support uploading attachments to a Swift service with credentials provided by the StoryBoard API.", "title": "Add support for uploading attachments to Stories", "created_at": "2021-03-26T17:26:43+00:00", "tags": [], "updated_at": "2021-03-26T17:26:48+00:00", "private": false, "teams": [], "is_bug": true, "creator_id": 935, "story_type_id": 1, "security": false, "id": 2008769, "users": []}, {"status": "active", "task_statuses": [{"count": 0, "key": "review"}, {"count": 1, "key": "todo"}, {"count": 0, "key": "invalid"}, {"count": 0, "key": "merged"}, {"count": 0, "key": "inprogress"}], "description": "In addition to the attachments support described in https://storyboard.openstack.org/#!/story/2008769, we need to be able to update other story-related data.\n\n- Add comments\n- Add/edit tasks\n- Add/remove tags\n- Edit description", "title": "Make the Story detail view interactive", "created_at": "2021-03-26T17:30:43+00:00", "tags": [], "updated_at": "2021-03-26T17:30:47+00:00", "private": false, "teams": [], "is_bug": true, "creator_id": 935, "story_type_id": 1, "security": false, "id": 2008771, "users": []}, {"status": "active", "task_statuses": [{"count": 0, "key": "review"}, {"count": 1, "key": "todo"}, {"count": 0, "key": "invalid"}, {"count": 0, "key": "merged"}, {"count": 0, "key": "inprogress"}], "description": "There are a few rough edges here still.\n\n- Timestamps need to be rendered more nicely\n- Some timeline events probably aren't handled as nicely as they can be\n- Timeline UI in general needs tightening up\n- Tasks list needs extra bits (notably task notes/links)", "title": "Finish off the read-only Story UI", "created_at": "2021-03-26T17:55:17+00:00", "tags": [], "updated_at": "2021-03-26T17:55:21+00:00", "private": false, "teams": [], "is_bug": true, "creator_id": 935, "story_type_id": 1, "security": false, "id": 2008773, "users": []}, {"status": "active", "task_statuses": [{"count": 0, "key": "review"}, {"count": 1, "key": "todo"}, {"count": 0, "key": "invalid"}, {"count": 0, "key": "merged"}, {"count": 0, "key": "inprogress"}], "description": "Currently \"how does this work\" isn't really documented anywhere, we should at least provide some documentation of the various reusable components.", "title": "Document the existing prototype codebase", "created_at": "2021-03-26T18:25:15+00:00", "tags": [], "updated_at": "2021-03-26T18:25:19+00:00", "private": false, "teams": [], "is_bug": true, "creator_id": 935, "story_type_id": 1, "security": false, "id": 2008775, "users": []}, {"status": "active", "task_statuses": [{"count": 0, "key": "review"}, {"count": 1, "key": "todo"}, {"count": 0, "key": "invalid"}, {"count": 0, "key": "merged"}, {"count": 0, "key": "inprogress"}], "description": "We already have most of a read-only project view.\n\nWe should make this editable by admin users.", "title": "Implement a Project detail view", "created_at": "2021-03-26T18:33:28+00:00", "tags": [], "updated_at": "2021-03-26T18:33:32+00:00", "private": false, "teams": [], "is_bug": true, "creator_id": 935, "story_type_id": 1, "security": false, "id": 2008776, "users": []}, {"status": "active", "task_statuses": [{"count": 0, "key": "review"}, {"count": 1, "key": "todo"}, {"count": 0, "key": "invalid"}, {"count": 0, "key": "merged"}, {"count": 0, "key": "inprogress"}], "description": "We have a prototype read-only view. We should make sure it has parity with the existing view and allow admin users to edit it.", "title": "Implement a Project Group detail view", "created_at": "2021-03-26T18:35:29+00:00", "tags": [], "updated_at": "2022-09-08T16:07:42+00:00", "private": false, "teams": [], "is_bug": true, "creator_id": 935, "story_type_id": 1, "security": false, "id": 2008777, "users": []}, {"status": "active", "task_statuses": [{"count": 0, "key": "review"}, {"count": 1, "key": "todo"}, {"count": 0, "key": "invalid"}, {"count": 0, "key": "merged"}, {"count": 0, "key": "inprogress"}], "description": "The current prototype Board list view doesn't support filtering by anything. We should add that functionality using the existing filtering components.", "title": "Add filtering to the Board list view", "created_at": "2021-03-26T18:38:41+00:00", "tags": [], "updated_at": "2021-03-26T18:38:46+00:00", "private": false, "teams": [], "is_bug": true, "creator_id": 935, "story_type_id": 1, "security": false, "id": 2008778, "users": []}]