@pb33f/cowboy-components 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/components/manage-ruleset/manage-ruleset.d.ts +5 -1
  2. package/dist/components/manage-ruleset/manage-ruleset.js +27 -5
  3. package/dist/components/model-renderer/rendered-node.css.d.ts +2 -0
  4. package/dist/components/model-renderer/rendered-node.css.js +96 -0
  5. package/dist/components/model-renderer/rendered-node.d.ts +8 -0
  6. package/dist/components/model-renderer/rendered-node.js +117 -0
  7. package/dist/components/model-renderer/rendered-property.css.d.ts +2 -0
  8. package/dist/components/model-renderer/rendered-property.css.js +118 -0
  9. package/dist/components/model-renderer/rendered-property.d.ts +14 -0
  10. package/dist/components/model-renderer/rendered-property.js +204 -0
  11. package/dist/components/model-tree/tree-item.d.ts +10 -0
  12. package/dist/components/model-tree/tree-item.js +37 -0
  13. package/dist/components/model-tree/tree.css.d.ts +2 -0
  14. package/dist/components/model-tree/tree.css.js +20 -0
  15. package/dist/components/model-tree/tree.d.ts +16 -0
  16. package/dist/components/model-tree/tree.js +103 -0
  17. package/dist/components/the-doctor/the-doctor.css.js +2 -2
  18. package/dist/components/the-doctor/the-doctor.d.ts +4 -2
  19. package/dist/components/the-doctor/the-doctor.js +42 -18
  20. package/dist/components/visualizer/explorer.d.ts +52 -0
  21. package/dist/components/visualizer/explorer.js +296 -0
  22. package/dist/components/visualizer/node.d.ts +11 -0
  23. package/dist/components/visualizer/node.js +27 -0
  24. package/dist/components/visualizer/operation.css.d.ts +2 -0
  25. package/dist/components/visualizer/operation.css.js +53 -0
  26. package/dist/components/visualizer/operation.d.ts +12 -0
  27. package/dist/components/visualizer/operation.js +52 -0
  28. package/dist/components/visualizer/visualizer.css.d.ts +2 -0
  29. package/dist/components/visualizer/visualizer.css.js +157 -0
  30. package/dist/components/visualizer/visualizer.d.ts +60 -0
  31. package/dist/components/visualizer/visualizer.js +137 -0
  32. package/dist/cowboy-components.d.ts +1 -0
  33. package/dist/cowboy-components.js +2 -0
  34. package/dist/cowboy-components.umd.cjs +950 -324
  35. package/dist/css/pb33f-theme.css +1 -1
  36. package/dist/events/doctor.d.ts +9 -0
  37. package/dist/events/doctor.js +3 -0
  38. package/dist/model/graph.d.ts +6 -0
  39. package/dist/model/graph.js +1 -0
  40. package/dist/services/model-service.d.ts +5 -0
  41. package/dist/services/model-service.js +30 -0
  42. package/dist/style.css +1 -1
  43. package/package.json +6 -3
@@ -0,0 +1,37 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import '@shoelace-style/shoelace/dist/components/tree-item/tree-item.js';
8
+ import { customElement, property } from "lit/decorators.js";
9
+ import { html } from "lit";
10
+ import { SlTreeItem } from "@shoelace-style/shoelace";
11
+ let ModelTreeItem = class ModelTreeItem extends SlTreeItem {
12
+ constructor(node, results) {
13
+ super();
14
+ this.node = node;
15
+ this.results = results;
16
+ }
17
+ render() {
18
+ return html `
19
+ <sl-tree-item expanded>
20
+ <sl-icon name="plus-square" slot="expand-icon"></sl-icon>
21
+ <sl-icon name="dash-square" slot="collapse-icon"></sl-icon>
22
+ ${this.node.label} (${this.node.nodePath})
23
+ ${this.results}
24
+ </sl-tree-item>
25
+ `;
26
+ }
27
+ };
28
+ __decorate([
29
+ property()
30
+ ], ModelTreeItem.prototype, "node", void 0);
31
+ __decorate([
32
+ property()
33
+ ], ModelTreeItem.prototype, "results", void 0);
34
+ ModelTreeItem = __decorate([
35
+ customElement("pb33f-model-treeitem")
36
+ ], ModelTreeItem);
37
+ export { ModelTreeItem };
@@ -0,0 +1,2 @@
1
+ declare const _default: import("lit").CSSResult;
2
+ export default _default;
@@ -0,0 +1,20 @@
1
+ import { css } from "lit";
2
+ export default css `
3
+
4
+ sl-tree {
5
+ --indent-guide-width: 1px;
6
+ --indent-guide-color: var(--secondary-color);
7
+ --indent-guide-style: dashed;
8
+
9
+
10
+ }
11
+ sl-tree-item {
12
+
13
+ }
14
+
15
+
16
+ sl-tree-item::part(expand-button) {
17
+ rotate: none;
18
+ }
19
+
20
+ `;
@@ -0,0 +1,16 @@
1
+ import '@shoelace-style/shoelace/dist/components/tree/tree.js';
2
+ import '@shoelace-style/shoelace/dist/components/tree-item/tree-item.js';
3
+ import { LitElement, TemplateResult } from "lit";
4
+ import { Node } from "../visualizer/visualizer.js";
5
+ import { SlTreeItem } from "@shoelace-style/shoelace";
6
+ export declare class ModelTree extends LitElement {
7
+ static styles: import("lit").CSSResult[];
8
+ node: Node;
9
+ nodeClicked(nodeHashId: string): void;
10
+ explorerClicked(nodeHashId: string): void;
11
+ collapse(evt: Event, node: Node): void;
12
+ expanded(evt: Event, node: Node): void;
13
+ buildTree(node: Node, depth: number): TemplateResult;
14
+ nodesSelected(treeItems: SlTreeItem[]): void;
15
+ render(): TemplateResult<1>;
16
+ }
@@ -0,0 +1,103 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import '@shoelace-style/shoelace/dist/components/tree/tree.js';
8
+ import '@shoelace-style/shoelace/dist/components/tree-item/tree-item.js';
9
+ import { customElement, property } from "lit/decorators.js";
10
+ import { html, LitElement } from "lit";
11
+ import treeCss from "./tree.css.js";
12
+ import { ModelTreeNodeClicked } from "../../events/doctor";
13
+ let ModelTree = class ModelTree extends LitElement {
14
+ nodeClicked(nodeHashId) {
15
+ this.dispatchEvent(new CustomEvent(ModelTreeNodeClicked, {
16
+ bubbles: true,
17
+ composed: true,
18
+ detail: {
19
+ nodeHashId: nodeHashId
20
+ }
21
+ }));
22
+ }
23
+ explorerClicked(nodeHashId) {
24
+ const treeItems = this.renderRoot.querySelectorAll(`sl-tree-item`);
25
+ let selected = null;
26
+ for (let i = 0; i < treeItems.length; i++) {
27
+ const item = treeItems[i];
28
+ item.selected = item.id === `model-${nodeHashId}`;
29
+ item.expanded = true;
30
+ if (item.selected) {
31
+ selected = item;
32
+ }
33
+ }
34
+ if (selected) {
35
+ requestAnimationFrame(() => {
36
+ selected?.scrollIntoView({ behavior: "smooth", block: "center", inline: "center" });
37
+ });
38
+ }
39
+ }
40
+ collapse(evt, node) {
41
+ evt.stopPropagation();
42
+ node.treeExpanded = false;
43
+ }
44
+ expanded(evt, node) {
45
+ evt.stopPropagation();
46
+ node.treeExpanded = true;
47
+ }
48
+ buildTree(node, depth) {
49
+ let results = [];
50
+ if (node.nodes && node.nodes.length > 0) {
51
+ for (let i = 0; i < node.nodes.length; i++) {
52
+ depth++;
53
+ results.push(this.buildTree(node.nodes[i], depth));
54
+ }
55
+ }
56
+ let expanded = node.treeExpanded;
57
+ if (depth < 2) {
58
+ expanded = true;
59
+ }
60
+ return html `
61
+ <sl-tree-item id="model-${node.idHash}" ?expanded="${expanded}"
62
+ @sl-expand="${(evt) => {
63
+ this.expanded(evt, node);
64
+ }}"
65
+ @sl-collapse="${(evt) => {
66
+ this.collapse(evt, node);
67
+ }}">
68
+ <sl-icon name="plus-square" slot="expand-icon"></sl-icon>
69
+ <sl-icon name="dash-square" slot="collapse-icon"></sl-icon>
70
+ <span >${node.label}</span>
71
+ ${results}
72
+ </sl-tree-item>
73
+ `;
74
+ }
75
+ nodesSelected(treeItems) {
76
+ for (let i = 0; i < treeItems.length; i++) {
77
+ this.nodeClicked(treeItems[i].id);
78
+ }
79
+ }
80
+ render() {
81
+ if (!this.node) {
82
+ return html ``;
83
+ }
84
+ return html `
85
+ <sl-tree @sl-selection-change="${(evt) => {
86
+ {
87
+ const selected = evt.detail.selection;
88
+ this.nodesSelected(selected);
89
+ }
90
+ }}">
91
+ ${this.buildTree(this.node, 0)}
92
+ </sl-tree>
93
+ `;
94
+ }
95
+ };
96
+ ModelTree.styles = [treeCss];
97
+ __decorate([
98
+ property()
99
+ ], ModelTree.prototype, "node", void 0);
100
+ ModelTree = __decorate([
101
+ customElement("pb33f-model-tree")
102
+ ], ModelTree);
103
+ export { ModelTree };
@@ -177,7 +177,7 @@ export default css `
177
177
 
178
178
  .spinner-draw-closed {
179
179
  top: 35px;
180
- right: 2px;
180
+ right: 8px;
181
181
  }
182
182
 
183
183
  pb33f-toast-manager {
@@ -219,7 +219,7 @@ export default css `
219
219
  }
220
220
  .collapse-side {
221
221
  position: absolute;
222
- right: 0;
222
+ right: 5px;
223
223
  top: 0;
224
224
  padding: 0;
225
225
  color: var(--secondary-color);
@@ -7,7 +7,7 @@ import '@shoelace-style/shoelace/dist/components/dialog/dialog.js';
7
7
  import '@shoelace-style/shoelace/dist/components/alert/alert.js';
8
8
  import '@shoelace-style/shoelace/dist/components/badge/badge.js';
9
9
  import { LitElement } from "lit";
10
- import { AddToastEvent, EditorUpdatedEvent, ProblemRuleFilterChangedEvent, RulesetSavedEvent, RuleClickedEvent } from "../../events/doctor.js";
10
+ import { AddToastEvent, EditorUpdatedEvent, ProblemRuleFilterChangedEvent, RulesetSavedEvent, RuleClickedEvent, NodeClickedEvent } from "../../events/doctor.js";
11
11
  import { ProblemDrawerEvent } from "../problem-list/details-drawer.js";
12
12
  import { SlDialog, SlIcon, SlRadioGroup, SlTab, SlTabGroup } from "@shoelace-style/shoelace";
13
13
  import { AttentionBox } from "../attention-box/attention-box.js";
@@ -87,6 +87,7 @@ export declare class TheDoctor extends LitElement {
87
87
  private selectedEditorTab;
88
88
  private sidebarClosed;
89
89
  constructor(doctorEndpoint?: string);
90
+ modelTreeNodeClicked(evt: CustomEvent<NodeClickedEvent>): void;
90
91
  exportRuleset(): void;
91
92
  addToastEvent(event: CustomEvent<AddToastEvent>): void;
92
93
  sendToast(toast: Toast): void;
@@ -108,7 +109,8 @@ export declare class TheDoctor extends LitElement {
108
109
  private fetchDocs;
109
110
  fetchRulesetMap(): void;
110
111
  ruleClicked(evt: CustomEvent<RuleClickedEvent>): void;
111
- rulesetChanged(): void;
112
+ builtInRulesetSelected(): void;
113
+ rulesetManuallyChanged(): void;
112
114
  specChanged(event: CustomEvent<EditorUpdatedEvent>): void;
113
115
  boostrap(): void;
114
116
  exportJSON(): void;
@@ -15,7 +15,7 @@ import '@shoelace-style/shoelace/dist/components/badge/badge.js';
15
15
  import { customElement, property, query, state } from "lit/decorators.js";
16
16
  import { html, LitElement } from "lit";
17
17
  import { SpecEditor } from "../editor/editor.js";
18
- import { ActiveView, AddToast, CustomRulesetEnabled, EditorClicked, EditorUpdated, ExportRuleset, OpenProblemDrawer, ProblemClicked, ProblemRuleFilterChangedManual, RuleViolationClicked, RulesetSaved, RuleClicked } from "../../events/doctor.js";
18
+ import { ActiveView, AddToast, CustomRulesetEnabled, EditorClicked, EditorUpdated, ExportRuleset, OpenProblemDrawer, ProblemClicked, ProblemRuleFilterChangedManual, RuleViolationClicked, RulesetSaved, RuleClicked, BuiltInRulesetChanged, } from "../../events/doctor.js";
19
19
  import { ProblemDetailsDrawer, ProblemDrawerEventType } from "../problem-list/details-drawer.js";
20
20
  import { CreateBagManager } from "@pb33f/saddlebag";
21
21
  import { LintingService } from "../../services/linting-service.js";
@@ -38,6 +38,7 @@ import dialogCss from "../../css/dialog.css.js";
38
38
  import buttonCss from "../../css/button.css.js";
39
39
  import radioGroupsCss from "../../css/radiogroups.css.js";
40
40
  import { MarkerSeverity } from "monaco-editor";
41
+ import { ModelService } from "../../services/model-service";
41
42
  export const DoctorDocumentBag = "pb33f-doctor-editor";
42
43
  export const HowToFixBag = "pb33f-doctor-howtofix";
43
44
  export const FunctionDocumentationBag = "pb33f-doctor-funcdocs";
@@ -110,6 +111,10 @@ let TheDoctor = class TheDoctor extends LitElement {
110
111
  this.addEventListener(ExportRuleset, this.exportRuleset);
111
112
  // @ts-ignore
112
113
  this.addEventListener(RuleClicked, this.ruleClicked);
114
+ // @ts-ignore
115
+ this.addEventListener(BuiltInRulesetChanged, this.builtInRulesetSelected);
116
+ // @ts-ignore
117
+ //this.addEventListener(ModelTreeNodeClicked, this.modelTreeNodeClicked)
113
118
  // hijack navigation buttons.
114
119
  window.addEventListener('popstate', (e) => {
115
120
  const state = e.state;
@@ -126,6 +131,10 @@ let TheDoctor = class TheDoctor extends LitElement {
126
131
  });
127
132
  //history.pushState({view: ActiveView.Overview}, "", ActiveView.Overview);
128
133
  }
134
+ modelTreeNodeClicked(evt) {
135
+ // TODO: this is a placeholder for now
136
+ console.log(evt);
137
+ }
129
138
  exportRuleset() {
130
139
  this.exportRulesetDialog.show();
131
140
  }
@@ -281,6 +290,13 @@ let TheDoctor = class TheDoctor extends LitElement {
281
290
  });
282
291
  }
283
292
  }
293
+ // update visualization
294
+ // TODO: this is a placeholder for now
295
+ // ModelService.createGraph(value).then((result) => {
296
+ // this.vis
297
+ //
298
+ //
299
+ // })
284
300
  }).catch((e) => {
285
301
  console.error("statistics service is down", e);
286
302
  this.platformUnavailable(e);
@@ -305,6 +321,8 @@ let TheDoctor = class TheDoctor extends LitElement {
305
321
  }
306
322
  platformUnavailable(error) {
307
323
  if (!this.unavailable) {
324
+ this.loadingOverlay.hide();
325
+ this.activitySpinner.hide();
308
326
  this.errorBanner.errorTitle = "The doctor is out.";
309
327
  if (!error) {
310
328
  this.errorBanner.errorMessage = "The clinic is <strong>closed!</strong> " +
@@ -371,6 +389,7 @@ let TheDoctor = class TheDoctor extends LitElement {
371
389
  LintingService.doctorEndpoint = this.doctorEndpoint;
372
390
  FeedbackService.doctorEndpoint = this.doctorEndpoint;
373
391
  RulesetService.doctorEndpoint = this.doctorEndpoint;
392
+ ModelService.doctorEndpoint = this.doctorEndpoint;
374
393
  this.docBag = this.bagManager.getBag(DoctorDocumentBag);
375
394
  if (this.docBag) {
376
395
  const doc = this.docBag.get(DefaultDocument);
@@ -459,6 +478,7 @@ let TheDoctor = class TheDoctor extends LitElement {
459
478
  this.sessionRulesetMapBag = this.bagManager.getBag(SessionRulesetMapBag);
460
479
  // fire off all network requests, then configure the ruleset management.
461
480
  Promise.all(promises).then(() => {
481
+ this.loadingOverlay.hide();
462
482
  // configure rule management
463
483
  this.manageRuleset.defaultRuleset = this.defaultRuleset;
464
484
  this.manageRuleset.owaspRuleset = this.OWASPRuleset;
@@ -471,17 +491,18 @@ let TheDoctor = class TheDoctor extends LitElement {
471
491
  else {
472
492
  this.manageRuleset.rulesetConfig = { ruleMapping: new Map(), allRulesSwitch: true };
473
493
  }
474
- this.manageRuleset.buildRulesets();
475
- if (this.CustomRuleset && this.CustomRuleset.rules.size > 0) {
476
- this.manageRuleset.customRuleset = this.CustomRuleset;
477
- }
478
- // do nothing with this for now. we just need to make sure the default ruleset
479
- // has a session.
480
- this.fetchSessionRulesetAsYaml().then((result) => {
481
- this.loadingOverlay.hide();
482
- this.rulesetEditor?.setValue(result, true);
483
- this.fetchRulesetMap();
484
- });
494
+ setTimeout(() => {
495
+ this.manageRuleset.buildRulesets();
496
+ if (this.CustomRuleset && this.CustomRuleset.rules.size > 0) {
497
+ this.manageRuleset.customRuleset = this.CustomRuleset;
498
+ }
499
+ this.fetchSessionRulesetAsYaml().then((result) => {
500
+ this.rulesetEditor?.setValue(result, true);
501
+ this.fetchRulesetMap();
502
+ }).catch((e) => {
503
+ this.platformUnavailable(e);
504
+ });
505
+ }, 50);
485
506
  });
486
507
  // refresh state for how to fix.
487
508
  this.fetchDocs();
@@ -535,12 +556,12 @@ let TheDoctor = class TheDoctor extends LitElement {
535
556
  }
536
557
  }
537
558
  async fetchSessionRulesetAsYaml() {
538
- return new Promise(async (resolve) => {
559
+ return new Promise(async (resolve, reject) => {
539
560
  RulesetService.getSessionRulesetAsYAML().then((result) => {
540
561
  resolve(result);
541
562
  }).catch((e) => {
542
563
  console.error("cannot fetch session ruleset: ", e.title);
543
- resolve("");
564
+ reject(e);
544
565
  });
545
566
  });
546
567
  }
@@ -668,7 +689,10 @@ let TheDoctor = class TheDoctor extends LitElement {
668
689
  }
669
690
  }
670
691
  }
671
- rulesetChanged() {
692
+ builtInRulesetSelected() {
693
+ // todo
694
+ }
695
+ rulesetManuallyChanged() {
672
696
  clearTimeout(this.bounceId);
673
697
  this.bounceId = window.setTimeout(() => {
674
698
  const ruleset = this.rulesetEditor.editor?.getValue();
@@ -747,7 +771,7 @@ let TheDoctor = class TheDoctor extends LitElement {
747
771
  specChanged(event) {
748
772
  const editor = this.editorMap.get(event.detail.id);
749
773
  if (editor && event.detail.id === 'ruleset') {
750
- this.rulesetChanged();
774
+ this.rulesetManuallyChanged();
751
775
  return;
752
776
  }
753
777
  if (this.docBag) {
@@ -844,8 +868,8 @@ let TheDoctor = class TheDoctor extends LitElement {
844
868
  if (splitPanel) {
845
869
  this.collapseButton.name = "chevron-bar-left";
846
870
  this.problemsDataDiv.style.display = "none";
847
- splitPanel.style.setProperty('--min', '50px');
848
- splitPanel.style.setProperty('--max', 'calc(100vw - 50px)');
871
+ splitPanel.style.setProperty('--min', '40px');
872
+ splitPanel.style.setProperty('--max', 'calc(100vw - 40px)');
849
873
  splitPanel.position = 100;
850
874
  splitPanel.disabled = true;
851
875
  this.splitDivider.style.display = "none";
@@ -0,0 +1,52 @@
1
+ import { LitElement } from "lit";
2
+ import { Direction, Edge, Node } from "./visualizer";
3
+ import { NodeComponent } from "./node";
4
+ export declare class ExplorerComponent extends LitElement {
5
+ static styles: import("lit").CSSResult[];
6
+ svgItem: SVGSVGElement;
7
+ svgGroup: SVGSVGElement;
8
+ ready: boolean;
9
+ elk: any;
10
+ graph: any;
11
+ nodes: Node[];
12
+ models: Node[];
13
+ edges: Edge[];
14
+ direction: Direction;
15
+ nodeComponents: NodeComponent[];
16
+ scale: number;
17
+ private grabbed;
18
+ nodeMap: Map<string, Node>;
19
+ private startX;
20
+ private startY;
21
+ private translateX;
22
+ private translateY;
23
+ constructor();
24
+ mouseMove(evt: MouseEvent): void;
25
+ mouseDown(evt: MouseEvent): void;
26
+ mouseUp(): void;
27
+ onWheel(evt: MouseEvent): void;
28
+ buildLayout(): void;
29
+ buildGraph(): any;
30
+ readyGo(): void;
31
+ reset(): void;
32
+ zoomIn(): void;
33
+ zoomOut(): void;
34
+ generateOptions(): {
35
+ 'spacing.nodeNodeBetweenLayers': number;
36
+ 'spacing.nodeNode': number;
37
+ 'elk.nodeLabels.placement': string;
38
+ 'elk.algorithm': string;
39
+ 'elk.direction': Direction;
40
+ 'org.eclipse.elk.edgeRouting': string;
41
+ 'elk.layered.unnecessaryBendpoints': string;
42
+ 'elk.layered.spacing.edgeNodeBetweenLayers': number;
43
+ 'org.eclipse.elk.layered.nodePlacement.bk.fixedAlignment': string;
44
+ 'org.eclipse.elk.layered.cycleBreaking.strategy': string;
45
+ 'nodePlacement.strategy': string;
46
+ 'org.eclipse.elk.spacing.edgeLabel': string;
47
+ 'org.eclipse.elk.spacing.edgeNode': string;
48
+ 'org.eclipse.elk.layered.edgeLabels.sideSelection': string;
49
+ 'org.eclipse.elk.spacing.portPort': string;
50
+ };
51
+ render(): import("lit-html").TemplateResult<1> | import("lit-html").TemplateResult<2>;
52
+ }