7690fda6ba
* chore: prettify gutter-menu * chore: add portal packages * styling: add styles sidebar and portal behavior * ui: sidebar component * ui: create and implement statechart for evals * ui: actor-relationship service and provider component * ui: d3 hierarchy computation * chore: add render-modifiers and curved arrows * ui: create evaluation actor div * fix related evaluations schema * ui: register/deregister evaluation divs * ui: handle resize behavior * bug: infinite re-render cycle * fix: conditional logic to prevent infinite render of flex resizing * ui: related evaluations schema and request param * ui: fix testing for evaluations * refact: make related-evals a proper has-many * chore: don't pauseTest * temp: debug d3 hierarchy * ui: move derived state logic into backing component class for detail * ui: deprecated related evaluations logic in statechart * ui: update evaluation models * ui: update logic to paint svg in non-viewable scroll region * ui: update styling * ui: testing for eval detail view * ui: delete detail from template directory * ui: break detail component down * ui: static data for /evaluation/:id endpoint * ui: fix styling of d3 viz * ui: add query parameter adapter for evals * ui: last minute design requests * wip: address browser updating detail view behavior * refact: handle query-state change in statechart * conditional class looking for currentEval equality (#12411) * F UI/evaluation detail sidebar rel evals (#12415) * ui: remove busy id alias from statechart * ui: edit related evaluations viz error message * ui: bug fixes on related evaluations view (#12423) * ui: remove busy id alias from statechart * ui: edit related evaluations viz error message * ui: update error state * ui: related evaluation outline styling * Related evaluation stylefile and non-link if it matches the active sidebar (#12428) * Adds tabbable and keyboard pressable evaluation table rows (#12433) * ui: fix failing eval list tests (#12437) * ui: move styling into classes (#12438) * fix test failures (#12444) * ui: move styling into classes * ui: eslint disable * ui: allocations have evaluations as async relationships * ui: fix evaluation refresh button (#12447) * ui: move styling into classes * ui: eslint disable * ui: allocations have evaluations as async relationships * ui: refresh bug * ui: final touches on sidebar (#12462) * chore: turn off template linting rules Temporarily turning off template linting because we dont have a set CSS convention and the release needs to go out ASAP. * doc: deprecate out of date comments and vars * ui: edit mirage server fetch logic * ui: style sidebar relative * Modification to mocked related evals and manually set 100% height on svg (#12460) * F UI/evaluation detail sidebar final touches (#12463) * chore: turn off template linting rules Temporarily turning off template linting because we dont have a set CSS convention and the release needs to go out ASAP. * doc: deprecate out of date comments and vars * ui: edit mirage server fetch logic * ui: style sidebar relative * ui: account for new related eval added to chain Co-authored-by: Michael Klein <michael@firstiwaslike.com> Co-authored-by: Phil Renaud <phil@riotindustries.com>
102 lines
2.1 KiB
JavaScript
102 lines
2.1 KiB
JavaScript
import Service from '@ember/service';
|
|
import { action } from '@ember/object';
|
|
import { tracked } from '@glimmer/tracking';
|
|
import { schedule } from '@ember/runloop';
|
|
import { getBoxToBoxArrow } from 'curved-arrows';
|
|
|
|
function boxToArrow(ra, rb) {
|
|
const bbA = ra;
|
|
const bbB = rb;
|
|
|
|
const [sx, sy, c1x, c1y, c2x, c2y, ex, ey, ae, as] = getBoxToBoxArrow(
|
|
bbA.offsetLeft,
|
|
bbA.offsetTop,
|
|
bbA.offsetWidth,
|
|
bbA.offsetHeight,
|
|
bbB.offsetLeft,
|
|
bbB.offsetTop,
|
|
bbB.offsetWidth,
|
|
bbB.offsetHeight
|
|
);
|
|
|
|
return {
|
|
sx,
|
|
sy,
|
|
c1x,
|
|
c1y,
|
|
c2x,
|
|
c2y,
|
|
ex,
|
|
ey,
|
|
ae,
|
|
as,
|
|
};
|
|
}
|
|
|
|
export default class ActorRelationshipService extends Service {
|
|
@tracked actors = [];
|
|
|
|
get fns() {
|
|
const { registerActor, deregisterActor, recalcCurves } = this;
|
|
return { registerActor, deregisterActor, recalcCurves };
|
|
}
|
|
|
|
get data() {
|
|
const { actors, relationships } = this;
|
|
return { actors, relationships };
|
|
}
|
|
|
|
@action registerActor(actor) {
|
|
schedule('actions', this, () => {
|
|
this.actors = [...this.actors, actor];
|
|
});
|
|
}
|
|
|
|
@action deregisterActor(actor) {
|
|
schedule('actions', this, () => {
|
|
this.actors = this.actors.filter((a) => a !== actor);
|
|
});
|
|
}
|
|
|
|
get rects() {
|
|
const { actors } = this;
|
|
|
|
return actors
|
|
.filter((e) => e.previousEval)
|
|
.map((e) => {
|
|
const { previousEval: pid, id } = e;
|
|
|
|
const eRectangle = document.querySelector(`[data-eval="${id}"]`);
|
|
const prevRectangle = document.querySelector(`[data-eval="${pid}"]`);
|
|
|
|
return [eRectangle, prevRectangle];
|
|
});
|
|
}
|
|
|
|
get relationships() {
|
|
const { rects } = this;
|
|
|
|
return rects.map(([eRectangle, prevRectangle]) => {
|
|
const { sx, sy, c1x, c1y, c2x, c2y, ex, ey } = boxToArrow(
|
|
eRectangle,
|
|
prevRectangle
|
|
);
|
|
|
|
return {
|
|
d: `M ${sx} ${sy} C ${c1x} ${c1y}, ${c2x} ${c2y}, ${ex} ${ey}`,
|
|
sx,
|
|
sy,
|
|
ex,
|
|
ey,
|
|
};
|
|
});
|
|
}
|
|
|
|
@action
|
|
recalcCurves() {
|
|
// retrigger the tracked getters by resetting dependent keys
|
|
/* eslint-disable-next-line */
|
|
this.actors = this.actors;
|
|
}
|
|
}
|