Skip to content

Commit

Permalink
child jql and release filtering
Browse files Browse the repository at this point in the history
  • Loading branch information
justinbmeyer committed Aug 29, 2024
1 parent 168b5a1 commit f21d397
Show file tree
Hide file tree
Showing 16 changed files with 6,124 additions and 7,138 deletions.
480 changes: 240 additions & 240 deletions public/dist/connect-main.min.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion public/dist/connect-main.min.js.map

Large diffs are not rendered by default.

12,147 changes: 5,566 additions & 6,581 deletions public/dist/hosted-main.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion public/dist/hosted-main.js.map

Large diffs are not rendered by default.

454 changes: 227 additions & 227 deletions public/dist/hosted-main.min.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion public/dist/hosted-main.min.js.map

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion public/dist/production.css

Large diffs are not rendered by default.

24 changes: 13 additions & 11 deletions public/gantt-timeline.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,12 +47,13 @@ export class GanttTimeline extends StacheElement {
get quartersAndMonths(){

// handle if there are no issues
const endDates = this.issues.map((issue)=> {
const endDates = this.primaryIssuesOrReleases.map((issue)=> {
debugger;
return {dateData: {rollup: {
start: issue.dateData.rollup.due,
startFrom: issue.dateData.rollup.dueTo,
due: issue.dateData.rollup.due,
dueTo: issue.dateData.rollup.dueTo
start: issue.rollupDates.due,
startFrom: issue.rollupDates.dueTo,
due: issue.rollupDates.due,
dueTo: issue.rollupDates.dueTo
}}}
})
const {start, due} = rollupDatesFromRollups(endDates);
Expand All @@ -68,7 +69,8 @@ export class GanttTimeline extends StacheElement {
return (new Date() - firstDay - 1000 * 60 * 60 * 24 * 2) / totalTime * 100;
}
get calendarData() {
const {start, due} = rollupDatesFromRollups(this.issues);
debugger;
const {start, due} = rollupDatesFromRollups(this.primaryIssuesOrReleases);
return getCalendarHtml(new Date(), due);
}
get calendarHTML() {
Expand All @@ -77,7 +79,7 @@ export class GanttTimeline extends StacheElement {
get rows() {
const { firstDay, lastDay } = this.quartersAndMonths;
const totalTime = (lastDay - firstDay);
const issuesWithDates = this.issues.filter( issue => issue.dateData.rollup.due )
const issuesWithDates = this.primaryIssuesOrReleases.filter( issue => issue.rollupDates.due )
const rows = calculate({
issues: issuesWithDates,
firstDay,
Expand All @@ -102,11 +104,11 @@ export class GanttTimeline extends StacheElement {
zIndex: "10",
maxWidth: "300px"
})
text.appendChild(document.createTextNode(release.shortVersion || release.Summary))
text.appendChild(document.createTextNode(release?.names?.shortVersion || release.summary))
div.appendChild(text);

const tick = document.createElement("div");
tick.className = "color-text-and-bg-" + release.dateData.rollup.status
tick.className = "color-text-and-bg-" + release.rollupStatuses.rollup.status
Object.assign( tick.style, {
height: "10px",
width: "10px",
Expand All @@ -120,7 +122,7 @@ export class GanttTimeline extends StacheElement {

for(let row of rows) {
for(let item of row.items) {
item.element.style.right = ( (totalTime - (item.issue.dateData.rollup.due - firstDay)) / totalTime * 100) + "%";
item.element.style.right = ( (totalTime - (item.issue.rollupStatuses.rollup.due - firstDay)) / totalTime * 100) + "%";
}
}

Expand Down Expand Up @@ -163,7 +165,7 @@ function calculate({widthOfArea = 1230, issues, makeElementForIssue, firstDay, t
const element = makeElementForIssue(issue),
width = getWidth(element),
widthInPercent = width * 100 / widthOfArea,
rightPercentEnd = Math.ceil( (issue.dateData.rollup.due - firstDay) / totalTime * 100),
rightPercentEnd = Math.ceil( (issue.rollupStatuses.rollup.due - firstDay) / totalTime * 100),
leftPercentStart = rightPercentEnd - widthInPercent;

element.setAttribute("measured-width", width);
Expand Down
22 changes: 17 additions & 5 deletions public/jira/releases/normalize.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,25 @@
* @param {Array<import("../normalized/normalize").NormalizedIssue>} normalizedIssues
* @return {Array<import("../normalized/normalize").NormalizedRelease>}
*/
export function normalizeReleases(normalizedIssues){
export function normalizeReleases(normalizedIssues, rollupTimingLevelsAndCalculations){
const releaseIndex = rollupTimingLevelsAndCalculations.findIndex( calc => calc.type === "Release");
if(releaseIndex === -1) {
return [];
}
const followingCalc = rollupTimingLevelsAndCalculations[releaseIndex+1];
if(!followingCalc) {
return [];
}
const followingType = followingCalc.type;

const nameToRelease = {};
for(let normalizedIssue of normalizedIssues) {
const releases = normalizedIssue.releases;
for(let release of releases) {
if(!nameToRelease[release.name]) {
nameToRelease[release.name] = release;
if(normalizedIssue.type === followingType) {
const releases = normalizedIssue.releases;
for(let release of releases) {
if(!nameToRelease[release.name]) {
nameToRelease[release.name] = release;
}
}
}
}
Expand Down
3 changes: 2 additions & 1 deletion public/jira/rolledup-and-rolledback/rollup-and-rollback.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,8 @@ export function rollupAndRollback(derivedIssues, configuration, rollupTimingLeve
}

function addRollups(derivedIssues, rollupTimingLevelsAndCalculations) {
const normalizedReleases = normalizeReleases(derivedIssues)

const normalizedReleases = normalizeReleases(derivedIssues, rollupTimingLevelsAndCalculations)
const releases = deriveReleases(normalizedReleases);
const reporting = addReportingHierarchy([...releases,...derivedIssues], rollupTimingLevelsAndCalculations);
const rolledUpDates = addRollupDates(reporting, rollupTimingLevelsAndCalculations);
Expand Down
34 changes: 7 additions & 27 deletions public/src/jira-oidc-helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ export default function (
type RootMethod = (params: Params, progress: Progress) => Promise<Issue[]>;

function makeDeepChildrenLoaderUsingNamedFields(rootMethod: RootMethod){

// Makes child requests in batches of 40
//
// params - base params
Expand All @@ -132,7 +132,7 @@ export default function (

const batchedResponses = issuesToQuery.map( issues => {
const keys = issues.map( issue => issue.key);
const jql = `parent in (${keys.join(", ")})`;
const jql = `parent in (${keys.join(", ")}) ${params.childJQL || ""}`;
return rootMethod({
...params,
jql
Expand Down Expand Up @@ -162,6 +162,9 @@ export default function (
}

return async function fetchAllDeepChildren(params: Params, progress: Progress = {} as any){
console.log("generated from root method", params);
debugger;

const fields = await fieldsRequest;
const newParams = {
...params,
Expand Down Expand Up @@ -571,38 +574,15 @@ export default function (
(data: ProgressData): void;
} = () => {}
) {
const fields = await fieldsRequest;
const newParams = {
...params,
fields: params.fields.map(f => fields.nameMap[f] || f)
}

progress.data = progress.data || {
issuesRequested: 0,
issuesReceived: 0,
changeLogsRequested: 0,
changeLogsReceived: 0
};
const parentIssues = await jiraHelpers.fetchAllJiraIssuesWithJQLAndFetchAllChangelog(newParams, progress);

// go get the children
const allChildrenIssues = await this.fetchDeepChildren(newParams, parentIssues, progress);
const combined = parentIssues.concat(allChildrenIssues);
return combined.map((issue) => {
return {
...issue,
fields: mapIdsToNames(issue.fields, fields)
}
});
// change the parms
console.warn("THIS METHOD SHOULD BE IMPOSSIBLE TO CALL");
return Promise.resolve(null as any);
},
fetchChildrenResponses(
params: { fields: string[]; [key: string]: any },
parentIssues: Issue[],
progress: (data: ProgressData) => void = () => {}
) {
const issuesToQuery = chunkArray(parentIssues, 40);

const batchedResponses = issuesToQuery.map( issues => {
const keys = issues.map( issue => issue.key);
const jql = `parent in (${keys.join(", ")})`;
Expand Down
6 changes: 3 additions & 3 deletions public/timeline-configuration/state-helpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ export function csvToRawIssues(csvIssues){
return res;
}

export function rawIssuesRequestData({jql, isLoggedIn, loadChildren, jiraHelpers},{listenTo, resolve}) {
export function rawIssuesRequestData({jql, childJQL, isLoggedIn, loadChildren, jiraHelpers},{listenTo, resolve}) {

const progressData = value.with(null);

Expand All @@ -49,6 +49,7 @@ export function rawIssuesRequestData({jql, isLoggedIn, loadChildren, jiraHelpers

return loadIssues({
jql: jql.value,
childJQL: childJQL.value ? " and "+childJQL.value : "",
fields: ["summary",
"Rank",
"Start date",
Expand All @@ -59,8 +60,7 @@ export function rawIssuesRequestData({jql, isLoggedIn, loadChildren, jiraHelpers
"Story points median",
"Confidence",
"Story points confidence",
"Product Target Release", // TODO comment this out ...
"Labels", "Status", "Sprint", "Epic Link", "Created","Parent"],
"Labels", "Status", "Sprint", "Created","Parent"],
expand: ["changelog"]
}, (receivedProgressData)=> {
progressData.value = {...receivedProgressData};
Expand Down
2 changes: 2 additions & 0 deletions public/timeline-configuration/state-helpers.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import { expect, test } from 'vitest'

test("rawIssuesRequestData", function(assert){
const jql = value.with(""),
childJQL = value.with(""),
isLoggedIn = value.with(true),
serverInfo = value.with({
"baseUrl": "https://mistech.atlassian.net"
Expand All @@ -58,6 +59,7 @@ test("rawIssuesRequestData", function(assert){
const requestData = new ResolverObservable(function(hooks){
return rawIssuesRequestData({
jql,
childJQL,
isLoggedIn,
serverInfo,
teamData,
Expand Down
36 changes: 24 additions & 12 deletions public/timeline-configuration/timeline-configuration.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,7 @@ export class TimelineConfiguration extends StacheElement {
<input class="w-full-border-box mt-2 form-border p-1 text-yellow-300" value="Sample data. Connect to Jira to specify." disabled/>
{{/ if}}
</p>
{{# if(this.rawIssuesRequestData.issuesPromise.isPending) }}
{{# if(this.rawIssuesRequestData.progressData.issuesRequested)}}
<p class="text-xs text-right">Loaded {{this.rawIssuesRequestData.progressData.issuesReceived}} of {{this.rawIssuesRequestData.progressData.issuesRequested}} issues</p>
{{ else }}
<p class="text-xs text-right">Loading issues ...</p>
{{/ if}}
{{/ if }}
{{# if(this.rawIssuesRequestData.issuesPromise.isRejected) }}
<div class="border-solid-1px-slate-900 border-box block overflow-hidden color-text-and-bg-blocked p-1">
<p>There was an error loading from Jira!</p>
Expand All @@ -51,13 +45,29 @@ export class TimelineConfiguration extends StacheElement {
{{/ if }}
<div class="flex justify-between mt-1">
<p class="text-xs"><input type='checkbox'
class='self-start align-middle' checked:bind='this.loadChildren'/> <span class="align-middle">Load all children of JQL specified issues</span>
<p class="text-xs flex">
<input type='checkbox'
class='self-start align-middle h-6 mr-0.5' checked:bind='this.loadChildren'/>
<div class="align-middle h-6" style="line-height: 26px">
Load children.
{{# if(this.loadChildren) }}
Optional children JQL filters: <input type='text' class="form-border p-1 h-5" value:bind="this.childJQL"/>
{{/ if }}
</div>
</p>
<p class="text-xs" style="line-height: 26px;">
{{# if(this.rawIssuesRequestData.issuesPromise.isPending) }}
{{# if(this.rawIssuesRequestData.progressData.issuesRequested)}}
Loaded {{this.rawIssuesRequestData.progressData.issuesReceived}} of {{this.rawIssuesRequestData.progressData.issuesRequested}} issues
{{ else }}
Loading issues ...
{{/ if}}
{{/ if }}
{{# if(this.rawIssuesRequestData.issuesPromise.isResolved) }}
Loaded {{this.rawIssuesRequestData.issuesPromise.value.length}} issues
{{/ if }}
</p>
{{# if(this.rawIssuesRequestData.issuesPromise.isResolved) }}
<p class="text-xs">Loaded {{this.rawIssuesRequestData.issuesPromise.value.length}} issues</p>
{{/ if }}
</div>
Expand Down Expand Up @@ -236,6 +246,7 @@ export class TimelineConfiguration extends StacheElement {
// "base" values that do not change when other value change
jql: saveJSONToUrl("jql", "", String, {parse: x => ""+x, stringify: x => ""+x}),
loadChildren: saveJSONToUrl("loadChildren", false, Boolean, booleanParsing),
childJQL: saveJSONToUrl("childJQL", "", String, {parse: x => ""+x, stringify: x => ""+x}),
secondaryReportType: saveJSONToUrl("secondaryReportType", "none", String, {parse: x => ""+x, stringify: x => ""+x}),
primaryReportType: saveJSONToUrl("primaryReportType", "start-due", String, {parse: x => ""+x, stringify: x => ""+x}),
showPercentComplete: saveJSONToUrl("showPercentComplete", false, Boolean, booleanParsing),
Expand All @@ -248,6 +259,7 @@ export class TimelineConfiguration extends StacheElement {
value({listenTo, resolve}) {
return rawIssuesRequestData({
jql: value.from(this, "jql"),
childJQL: value.from(this,"childJQL"),
loadChildren: value.from(this, "loadChildren"),
isLoggedIn: value.from(this, "isLoggedIn"),
jiraHelpers: this.jiraHelpers
Expand Down
43 changes: 17 additions & 26 deletions public/timeline-report.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,7 @@
import { StacheElement, type, ObservableObject, ObservableArray } from "./can.js";
import { StacheElement, type } from "./can.js";

import { derivedToCSVFormat } from "./jira/derived/work-timing/work-timing.js";

import {releasesAndInitiativesWithPriorTiming,
rawIssuesToBaseIssueFormat, filterOutInitiativeStatuses, filterQAWork, filterPartnerReviewWork} from "./prepare-issues/prepare-issues.js";

import semverReleases from "./jira/releases/semver-releases.js";
import sortedByLastEpicReleases from "./sorted-by-last-epic-releases.js";

import bitoviTrainingData from "./examples/bitovi-training.js";


Expand Down Expand Up @@ -111,7 +105,7 @@ export class TimelineReport extends StacheElement {
<div class="my-2 p-2 h-780 border-solid-1px-slate-900 border-box block overflow-hidden color-bg-white drop-shadow-md">Configure a JQL in the sidebar on the left to get started.</div>
{{ /and }}
{{# and(this.cvsIssuesPromise.value, this.releases) }}
{{# and(this.derivedIssuesRequestData.issuesPromise.isResolved, this.primaryIssuesOrReleases.length) }}
<div class="my-2 border-solid-1px-slate-900 border-box block overflow-hidden color-bg-white drop-shadow-md">
{{# or( eq(this.primaryReportType, "start-due"), eq(this.primaryReportType, "breakdown") ) }}
Expand All @@ -122,12 +116,12 @@ export class TimelineReport extends StacheElement {
showPercentComplete:from="this.showPercentComplete"
></gantt-grid>
{{ else }}
<gantt-timeline issues:from="this.primaryIssues"
<gantt-timeline
primaryIssuesOrReleases:from="this.primaryIssuesOrReleases"></gantt-timeline>
{{/ or }}
{{# or( eq(this.secondaryReportType, "status"), eq(this.secondaryReportType, "breakdown") ) }}
<status-report primaryIssues:from="this.primaryIssues"
<status-report
breakdown:from="eq(this.secondaryReportType, 'breakdown')"
planningIssues:from="this.planningIssues"
primaryIssuesOrReleases:from="this.primaryIssuesOrReleases"
Expand All @@ -146,6 +140,12 @@ export class TimelineReport extends StacheElement {
</div>
</div>
{{/ and }}
{{# and(this.derivedIssuesRequestData.issuesPromise.isResolved, not(this.primaryIssuesOrReleases.length) ) }}
<div class="my-2 p-2 h-780 border-solid-1px-slate-900 border-box block overflow-hidden color-text-and-bg-blocked drop-shadow-md">
<p>No issues of type {{this.primaryIssueType}}</p>
<p>Please check your JQL is correct!</p>
</div>
{{/}}
{{# if(this.cvsIssuesPromise.isPending) }}
<div class="my-2 p-2 h-780 border-solid-1px-slate-900 border-box block overflow-hidden color-bg-white drop-shadow-md">
<p>Loading ...<p>
Expand Down Expand Up @@ -259,6 +259,9 @@ export class TimelineReport extends StacheElement {
return this.cvsIssuesPromise;
}
},
get issuesPromise(){
return this.derivedIssuesRequestData?.issuesPromise;
},
derivedIssues: {
async(resolve){
this.derivedIssuesRequestData?.issuesPromise.then(resolve)
Expand Down Expand Up @@ -288,8 +291,9 @@ export class TimelineReport extends StacheElement {
return statuses;
}


/*
get releasesAndInitiativesWithPriorTiming(){
console.log("YES I AM CALLED")
if(!this.csvIssues || ! this.timingCalculationMethods) {
return {releases: [], initiatives: []}
}
Expand Down Expand Up @@ -342,6 +346,7 @@ export class TimelineReport extends StacheElement {
return {releases, initiatives};
}
}
get initiativesWithAStartAndEndDate(){
var initiatives = this.releasesAndInitiativesWithPriorTiming.initiatives;
Expand All @@ -365,14 +370,7 @@ export class TimelineReport extends StacheElement {
}
const data = this.sortedIncompleteReleasesInitiativesAndEpics;
return data;
}
get primaryIssues(){
if(this.primaryIssueType === "Release") {
return this.releases;
} else {
return this.initiativesWithAStartAndEndDate;
}
}
}*/
get groupedParentDownHierarchy(){
if(!this.rolledupAndRolledBackIssuesAndReleases || !this.rollupTimingLevelsAndCalculations) {
return [];
Expand Down Expand Up @@ -517,13 +515,6 @@ function mapReleasesToIssues(issues, getReleaseValue) {



function getChildWorkBreakdown(children = []) {
const qaWork = new Set(filterQAWork(children));
const uatWork = new Set(filterPartnerReviewWork(children));
const devWork = children.filter(epic => !qaWork.has(epic) && !uatWork.has(epic));
return {qaWork, uatWork, devWork}
}


function sortReadyFirst(initiatives) {
return initiatives.sort((a, b) => {
Expand Down
Loading

0 comments on commit f21d397

Please sign in to comment.