archsight 0.1.4 → 0.2.0
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.
- checksums.yaml +4 -4
- data/Dockerfile +5 -4
- data/README.md +44 -59
- data/chart/archsight/Chart.yaml +6 -0
- data/chart/archsight/README.md +3 -0
- data/chart/archsight/templates/NOTES.txt +22 -0
- data/chart/archsight/templates/_helpers.tpl +62 -0
- data/chart/archsight/templates/deployment.yaml +114 -0
- data/chart/archsight/templates/ingress.yaml +56 -0
- data/chart/archsight/templates/resources-configmap.yaml +10 -0
- data/chart/archsight/templates/resources-pvc.yaml +23 -0
- data/chart/archsight/templates/service.yaml +15 -0
- data/chart/archsight/templates/serviceaccount.yaml +12 -0
- data/chart/archsight/values.yaml +162 -0
- data/docs/architecture.md +39 -0
- data/docs/docker.md +49 -0
- data/{lib/archsight/web/doc → docs}/import.md +10 -2
- data/{lib/archsight/web/doc → docs}/index.md.erb +3 -1
- data/docs/kubernetes.md +149 -0
- data/docs/licenses.md +307 -0
- data/lib/archsight/analysis/executor.rb +0 -10
- data/lib/archsight/annotations/annotation.rb +85 -36
- data/lib/archsight/annotations/architecture_annotations.rb +1 -34
- data/lib/archsight/annotations/computed.rb +1 -1
- data/lib/archsight/annotations/generated_annotations.rb +6 -3
- data/lib/archsight/annotations/git_annotations.rb +8 -4
- data/lib/archsight/annotations/interface_annotations.rb +35 -0
- data/lib/archsight/cli.rb +4 -2
- data/lib/archsight/editor/content_hasher.rb +37 -0
- data/lib/archsight/editor/file_writer.rb +79 -0
- data/lib/archsight/editor.rb +237 -0
- data/lib/archsight/graph.rb +1 -51
- data/lib/archsight/helpers.rb +0 -20
- data/lib/archsight/import/handlers/github.rb +16 -6
- data/lib/archsight/import/handlers/gitlab.rb +28 -10
- data/lib/archsight/import/handlers/repository.rb +56 -6
- data/lib/archsight/import/handlers/rest_api.rb +13 -1
- data/lib/archsight/import/license_analyzer.rb +650 -0
- data/lib/archsight/import/team_matcher.rb +111 -61
- data/lib/archsight/linter.rb +1 -1
- data/lib/archsight/mcp/base.rb +11 -0
- data/lib/archsight/mcp/execute_analysis_tool.rb +100 -0
- data/lib/archsight/mcp.rb +1 -0
- data/lib/archsight/renderer.rb +4 -4
- data/lib/archsight/resources/analysis.rb +1 -17
- data/lib/archsight/resources/application_interface.rb +1 -5
- data/lib/archsight/resources/base.rb +14 -14
- data/lib/archsight/resources/business_actor.rb +18 -3
- data/lib/archsight/resources/technology_artifact.rb +48 -0
- data/lib/archsight/resources/technology_interface.rb +1 -1
- data/lib/archsight/resources/technology_service.rb +5 -0
- data/lib/archsight/version.rb +1 -1
- data/lib/archsight/web/api/docs.rb +37 -2
- data/lib/archsight/web/api/json_helpers.rb +79 -13
- data/lib/archsight/web/api/openapi/spec.yaml +699 -0
- data/lib/archsight/web/api/routes.rb +23 -0
- data/lib/archsight/web/application.rb +48 -128
- data/lib/archsight/web/editor/form_builder.rb +100 -0
- data/lib/archsight/web/editor/helpers.rb +150 -0
- data/lib/archsight/web/editor/routes.rb +166 -0
- data/lib/archsight/web/public/vue/ApiDocsPage-B1RqTNqh.js +1 -0
- data/lib/archsight/web/public/vue/ApiDocsPage-DhNTOH4o.css +1 -0
- data/lib/archsight/web/public/vue/DocPage-DzwBgBd4.js +1 -0
- data/lib/archsight/web/public/vue/EditorPage-D_miHSv4.js +34 -0
- data/lib/archsight/web/public/vue/EditorPage-Dq0MuTnp.css +1 -0
- data/lib/archsight/web/public/vue/ErrorPage-CQQtPey3.js +2 -0
- data/lib/archsight/web/public/vue/ErrorPage-CwPT3JUr.css +1 -0
- data/lib/archsight/web/public/vue/GraphView-DRcIqAiR.css +1 -0
- data/lib/archsight/web/public/vue/GraphView-T9jFH_qg.js +1 -0
- data/lib/archsight/web/public/vue/InstanceRouter-1Sm-CRhf.js +2 -0
- data/lib/archsight/web/public/vue/InstanceRouter-BJkDRXZY.css +1 -0
- data/lib/archsight/web/public/vue/KindList-JA_L_-Cz.js +1 -0
- data/lib/archsight/web/public/vue/ResourceList-8iqavWdg.js +1 -0
- data/lib/archsight/web/public/vue/ResourceList-DP-z-j71.css +1 -0
- data/lib/archsight/web/public/vue/SearchResults-BGHbg48-.css +1 -0
- data/lib/archsight/web/public/vue/SearchResults-BdgFeHcm.js +1 -0
- data/lib/archsight/web/public/vue/_basePickBy-CVgieyx-.js +1 -0
- data/lib/archsight/web/public/vue/_baseUniq-BNfrOSaP.js +1 -0
- data/lib/archsight/web/public/vue/architectureDiagram-VXUJARFQ-CJXNpTr5.js +36 -0
- data/lib/archsight/web/public/vue/blockDiagram-VD42YOAC-B5488Hes.js +122 -0
- data/lib/archsight/web/public/vue/c4Diagram-YG6GDRKO-eYY3hprM.js +10 -0
- data/lib/archsight/web/public/vue/chunk-4BX2VUAB-ZoXeL4D1.js +1 -0
- data/lib/archsight/web/public/vue/chunk-55IACEB6-rNtQYnu_.js +1 -0
- data/lib/archsight/web/public/vue/chunk-B4BG7PRW-DolAeVV9.js +165 -0
- data/lib/archsight/web/public/vue/chunk-DI55MBZ5-DnN0f_hj.js +220 -0
- data/lib/archsight/web/public/vue/chunk-FMBD7UC4-BQWOCMuR.js +15 -0
- data/lib/archsight/web/public/vue/chunk-QN33PNHL-DId301Kb.js +1 -0
- data/lib/archsight/web/public/vue/chunk-QZHKN3VN-xbY0NLgv.js +1 -0
- data/lib/archsight/web/public/vue/chunk-TZMSLE5B-CgF9_37b.js +1 -0
- data/lib/archsight/web/public/vue/classDiagram-2ON5EDUG-jGlvI-Za.js +1 -0
- data/lib/archsight/web/public/vue/classDiagram-v2-WZHVMYZB-jGlvI-Za.js +1 -0
- data/lib/archsight/web/public/vue/clone-6iRPe1-W.js +1 -0
- data/lib/archsight/web/public/vue/cose-bilkent-S5V4N54A-CB9Zfu50.js +1 -0
- data/lib/archsight/web/public/vue/cytoscape.esm-5J0xJHOV.js +321 -0
- data/lib/archsight/web/public/vue/dagre-6UL2VRFP-BqkmE-LI.js +4 -0
- data/lib/archsight/web/public/vue/diagram-PSM6KHXK-CKBfqtw3.js +24 -0
- data/lib/archsight/web/public/vue/diagram-QEK2KX5R-B78rOlvK.js +43 -0
- data/lib/archsight/web/public/vue/diagram-S2PKOQOG-BlXC6Cia.js +24 -0
- data/lib/archsight/web/public/vue/erDiagram-Q2GNP2WA-BnliyziJ.js +60 -0
- data/lib/archsight/web/public/vue/flowDiagram-NV44I4VS-wuqPowTd.js +162 -0
- data/lib/archsight/web/public/vue/ganttDiagram-JELNMOA3-GSffAIH3.js +267 -0
- data/lib/archsight/web/public/vue/gitGraphDiagram-V2S2FVAM-OA7VyugW.js +65 -0
- data/lib/archsight/web/public/vue/graph-BXHAtA0S.js +1 -0
- data/lib/archsight/web/public/vue/graphviz-CJms5bxZ.js +13 -0
- data/lib/archsight/web/public/vue/index-DsEsN0_K.js +2 -0
- data/lib/archsight/web/public/vue/index-Tiu4C-Sb.css +1 -0
- data/lib/archsight/web/public/vue/infoDiagram-HS3SLOUP-nlVe2qgv.js +2 -0
- data/lib/archsight/web/public/vue/journeyDiagram-XKPGCS4Q-CtTIcKwf.js +139 -0
- data/lib/archsight/web/public/vue/kanban-definition-3W4ZIXB7-837KX0sW.js +89 -0
- data/lib/archsight/web/public/vue/katex-C-M49wc6.js +261 -0
- data/lib/archsight/web/public/vue/layout-DtE0QdL6.js +1 -0
- data/lib/archsight/web/public/vue/mermaid-DpPHPFQh.js +250 -0
- data/lib/archsight/web/public/vue/mindmap-definition-VGOIOE7T-9gLF2AoY.js +68 -0
- data/lib/archsight/web/public/vue/pieDiagram-ADFJNKIX-CyCNgw3u.js +30 -0
- data/lib/archsight/web/public/vue/quadrantDiagram-AYHSOK5B-CkPh8g02.js +7 -0
- data/lib/archsight/web/public/vue/requirementDiagram-UZGBJVZJ-Dkt6OSlY.js +64 -0
- data/lib/archsight/web/public/vue/sankeyDiagram-TZEHDZUN-BqprTk8x.js +10 -0
- data/lib/archsight/web/public/vue/sequenceDiagram-WL72ISMW-CTmTe1FQ.js +145 -0
- data/lib/archsight/web/public/vue/stateDiagram-FKZM4ZOC-CphqmkEU.js +1 -0
- data/lib/archsight/web/public/vue/stateDiagram-v2-4FDKWEC3-CxaDW5sW.js +1 -0
- data/lib/archsight/web/public/vue/timeline-definition-IT6M3QCI-CSQUZkyE.js +61 -0
- data/lib/archsight/web/public/vue/treemap-GDKQZRPO-DTojm7Yr.js +162 -0
- data/lib/archsight/web/public/{css/graph.css → vue/useGraphviz-A5s4h76R.js} +2 -1
- data/lib/archsight/web/public/vue/useHighlight-C6Kb5G3l.js +10 -0
- data/lib/archsight/web/public/vue/useMermaid-DqxTrLRB.js +1 -0
- data/lib/archsight/web/public/vue/usePanZoom-BybZ_rfh.js +11 -0
- data/lib/archsight/web/public/vue/xychartDiagram-PRI3JC2R-B1ZJZtDC.js +7 -0
- data/lib/archsight/web/public/vue.html +15 -0
- data/media/artifact.jpg +0 -0
- data/media/service.jpg +0 -0
- metadata +104 -77
- data/lib/archsight/web/public/css/artifact.css +0 -995
- data/lib/archsight/web/public/css/base.css +0 -201
- data/lib/archsight/web/public/css/highlight.min.css +0 -10
- data/lib/archsight/web/public/css/iconoir.css +0 -22
- data/lib/archsight/web/public/css/instance.css +0 -818
- data/lib/archsight/web/public/css/layout.css +0 -421
- data/lib/archsight/web/public/css/mermaid-layers.css +0 -188
- data/lib/archsight/web/public/css/pico.min.css +0 -4
- data/lib/archsight/web/public/img/archimate.png +0 -0
- data/lib/archsight/web/public/img/togaf-high-level.png +0 -0
- data/lib/archsight/web/public/js/graph-zoom.js +0 -18
- data/lib/archsight/web/public/js/highlight.min.js +0 -3899
- data/lib/archsight/web/public/js/htmx.min.js +0 -1
- data/lib/archsight/web/public/js/mermaid-init.js +0 -88
- data/lib/archsight/web/public/js/mermaid.min.js +0 -2811
- data/lib/archsight/web/public/js/sparkline.js +0 -42
- data/lib/archsight/web/public/js/svg-pan-zoom.min.js +0 -3
- data/lib/archsight/web/public/js/svg-zoom-controls.js +0 -93
- data/lib/archsight/web/views/api_docs.erb +0 -19
- data/lib/archsight/web/views/index.haml +0 -12
- data/lib/archsight/web/views/partials/artifact/_activity.haml +0 -55
- data/lib/archsight/web/views/partials/artifact/_agentic.haml +0 -25
- data/lib/archsight/web/views/partials/artifact/_deployment.haml +0 -29
- data/lib/archsight/web/views/partials/artifact/_git_info.haml +0 -16
- data/lib/archsight/web/views/partials/artifact/_language_stats.haml +0 -53
- data/lib/archsight/web/views/partials/artifact/_links.haml +0 -24
- data/lib/archsight/web/views/partials/artifact/_project_estimate.haml +0 -32
- data/lib/archsight/web/views/partials/artifact/_repositories.haml +0 -55
- data/lib/archsight/web/views/partials/artifact/_team.haml +0 -83
- data/lib/archsight/web/views/partials/artifact/_workflow.haml +0 -69
- data/lib/archsight/web/views/partials/components/_activity.haml +0 -37
- data/lib/archsight/web/views/partials/components/_git.haml +0 -17
- data/lib/archsight/web/views/partials/components/_jira.haml +0 -18
- data/lib/archsight/web/views/partials/components/_languages.haml +0 -29
- data/lib/archsight/web/views/partials/components/_owner.haml +0 -15
- data/lib/archsight/web/views/partials/components/_repositories.haml +0 -37
- data/lib/archsight/web/views/partials/components/_status.haml +0 -23
- data/lib/archsight/web/views/partials/instance/_analysis_detail.haml +0 -74
- data/lib/archsight/web/views/partials/instance/_analysis_result.haml +0 -64
- data/lib/archsight/web/views/partials/instance/_detail.haml +0 -103
- data/lib/archsight/web/views/partials/instance/_graph.haml +0 -6
- data/lib/archsight/web/views/partials/instance/_import_detail.haml +0 -87
- data/lib/archsight/web/views/partials/instance/_list.haml +0 -84
- data/lib/archsight/web/views/partials/instance/_relations.haml +0 -43
- data/lib/archsight/web/views/partials/instance/_requirements.haml +0 -41
- data/lib/archsight/web/views/partials/instance/_view_detail.haml +0 -57
- data/lib/archsight/web/views/partials/layout/_content.haml +0 -44
- data/lib/archsight/web/views/partials/layout/_error.haml +0 -22
- data/lib/archsight/web/views/partials/layout/_head.haml +0 -24
- data/lib/archsight/web/views/partials/layout/_navigation.haml +0 -21
- data/lib/archsight/web/views/partials/layout/_sidebar.haml +0 -27
- data/lib/archsight/web/views/search.haml +0 -53
- /data/{lib/archsight/web/doc → docs}/archimate.md +0 -0
- /data/{lib/archsight/web/doc → docs}/computed_annotations.md +0 -0
- /data/{lib/archsight/web/doc → docs}/icons.md +0 -0
- /data/{lib/archsight/web/doc → docs}/modeling.md +0 -0
- /data/{lib/archsight/web/doc → docs}/search.md +0 -0
- /data/{lib/archsight/web/doc → docs}/togaf.md +0 -0
- /data/{lib/archsight/web/doc → docs}/tool.md +0 -0
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
-# Parameters:
|
|
2
|
-
-# instances: Array of resource instances to display
|
|
3
|
-
-# omit_kind: Boolean - hide kind column (default: false)
|
|
4
|
-
-# fields: Array of annotation keys to display as columns (optional, overrides list_annotations)
|
|
5
|
-
- omit_kind ||= false
|
|
6
|
-
- fields ||= nil
|
|
7
|
-
- if instances.nil? || instances.empty?
|
|
8
|
-
%p.empty-state
|
|
9
|
-
%i No resources found
|
|
10
|
-
- else
|
|
11
|
-
- sample_class = instances.first.class
|
|
12
|
-
-# Determine which annotations to show as columns
|
|
13
|
-
- if fields
|
|
14
|
-
-# Use provided fields - convert to annotation-like objects
|
|
15
|
-
-# Always create wrapper with the actual field key to ensure correct value lookups
|
|
16
|
-
-# (pattern annotations like scc/language/*/loc have the pattern as key, not the actual field)
|
|
17
|
-
- field_annotation = Struct.new(:key, :title, :description, :type)
|
|
18
|
-
- list_annotations = fields.map do |field|
|
|
19
|
-
- if field.start_with?('@')
|
|
20
|
-
-# Component field - renders a partial from partials/components/
|
|
21
|
-
- component_name = field[1..-1]
|
|
22
|
-
- field_annotation.new(field, component_name.capitalize, "Component: #{component_name}", :component)
|
|
23
|
-
- else
|
|
24
|
-
- annotation_def = sample_class.annotation_matching(field)
|
|
25
|
-
- segments = field.split('/')
|
|
26
|
-
-# Generate title: for paths like scc/language/C/loc, use "C Loc" (language name + last segment)
|
|
27
|
-
- if segments.length >= 2
|
|
28
|
-
- title = "#{segments[-2]} #{segments[-1]}".split(/(?=[A-Z])/).map(&:capitalize).join(' ')
|
|
29
|
-
- else
|
|
30
|
-
- title = segments.last.split(/(?=[A-Z])/).map(&:capitalize).join(' ')
|
|
31
|
-
- field_annotation.new(field, title, annotation_def&.description, annotation_def&.type)
|
|
32
|
-
- list_annotations.compact!
|
|
33
|
-
- elsif omit_kind
|
|
34
|
-
-# Auto-detect from list: true annotations
|
|
35
|
-
- list_annotations = sample_class.list_annotations
|
|
36
|
-
- if list_annotations.empty?
|
|
37
|
-
- tags_annotation = sample_class.annotation_matching('architecture/tags')
|
|
38
|
-
- list_annotations = [tags_annotation] if tags_annotation
|
|
39
|
-
- else
|
|
40
|
-
- list_annotations = []
|
|
41
|
-
- if list_annotations.any?
|
|
42
|
-
%table.resource-list-table
|
|
43
|
-
%thead
|
|
44
|
-
%tr
|
|
45
|
-
%th.col-name Name
|
|
46
|
-
- unless omit_kind
|
|
47
|
-
%th.col-kind Kind
|
|
48
|
-
- list_annotations.each do |annotation|
|
|
49
|
-
%th.col-annotation{title: annotation.description}= annotation.title
|
|
50
|
-
%tbody
|
|
51
|
-
- instances.each do |instance|
|
|
52
|
-
%tr.resource-list-row
|
|
53
|
-
%td.col-name
|
|
54
|
-
%a.instance-name{href: "/kinds/#{instance.klass}/instances/#{instance.name}"}
|
|
55
|
-
%i{class: "iconoir-#{instance.class.icon} icon-#{instance.class.layer}"}
|
|
56
|
-
= instance.name
|
|
57
|
-
- unless omit_kind
|
|
58
|
-
%td.col-kind
|
|
59
|
-
%span.instance-kind= instance.klass
|
|
60
|
-
- list_annotations.each do |annotation|
|
|
61
|
-
%td.col-annotation
|
|
62
|
-
- if annotation.type == :component
|
|
63
|
-
- component_name = annotation.key[1..-1]
|
|
64
|
-
!= haml :"partials/components/_#{component_name}", locals: { instance: instance }
|
|
65
|
-
- else
|
|
66
|
-
- value = instance.annotations[annotation.key] || instance.computed_annotation_value(annotation.key)
|
|
67
|
-
- if value
|
|
68
|
-
- if annotation.type == Time
|
|
69
|
-
- time_value = value.is_a?(Time) ? value : Time.parse(value.to_s)
|
|
70
|
-
%span{title: time_value.strftime("%Y-%m-%d %H:%M:%S")}= time_ago(value)
|
|
71
|
-
- else
|
|
72
|
-
= value
|
|
73
|
-
- else
|
|
74
|
-
%span.empty-value —
|
|
75
|
-
- else
|
|
76
|
-
%ul.search-instance-list
|
|
77
|
-
- instances.each do |instance|
|
|
78
|
-
%li.search-instance-item
|
|
79
|
-
.instance-main
|
|
80
|
-
%a.instance-name{href: "/kinds/#{instance.klass}/instances/#{instance.name}"}
|
|
81
|
-
%i{ class: "iconoir-#{instance.class.icon} icon-#{instance.class.layer}" }
|
|
82
|
-
= instance.name
|
|
83
|
-
- unless omit_kind
|
|
84
|
-
%span.instance-kind= instance.klass
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
- return unless instance.has_relations? || instance.references.any?
|
|
2
|
-
%article.relations-section
|
|
3
|
-
%header
|
|
4
|
-
%h2 Relations
|
|
5
|
-
.relations-grid
|
|
6
|
-
.relations-column.relations-outgoing
|
|
7
|
-
%h3
|
|
8
|
-
Outgoing
|
|
9
|
-
%i.iconoir-arrow-right
|
|
10
|
-
- if instance.has_relations?
|
|
11
|
-
- instance.relations_grouped.each do |verb, kinds|
|
|
12
|
-
- kinds.each do |kind, instances|
|
|
13
|
-
- kind_class = Archsight::Resources[kind]
|
|
14
|
-
.relation-group
|
|
15
|
-
.relation-kind
|
|
16
|
-
%i{class: "iconoir-#{kind_class&.icon || 'cube'} icon-#{kind_class&.layer || 'technology'}"}
|
|
17
|
-
%span= "#{kind} (#{instances.size})"
|
|
18
|
-
.relation-verb= "#{verb} (#{instances.size})"
|
|
19
|
-
.instance-badges
|
|
20
|
-
- instances.sort_by(&:name).each do |item|
|
|
21
|
-
%a.badge.badge-info{href: "/kinds/#{item.klass}/instances/#{item.name}"}
|
|
22
|
-
= item.name
|
|
23
|
-
- else
|
|
24
|
-
.relations-empty None
|
|
25
|
-
.relations-column.relations-incoming
|
|
26
|
-
%h3
|
|
27
|
-
%i.iconoir-arrow-right
|
|
28
|
-
Incoming
|
|
29
|
-
- if instance.references.any?
|
|
30
|
-
- instance.references_grouped.each do |kind, verbs|
|
|
31
|
-
- kind_class = Archsight::Resources[kind]
|
|
32
|
-
- verbs.each do |verb, instances|
|
|
33
|
-
.relation-group
|
|
34
|
-
.relation-kind
|
|
35
|
-
%i{class: "iconoir-#{kind_class&.icon || 'cube'} icon-#{kind_class&.layer || 'technology'}"}
|
|
36
|
-
%span= "#{kind} (#{instances.size})"
|
|
37
|
-
.relation-verb= "#{verb || 'references'} (#{instances.size})"
|
|
38
|
-
.instance-badges
|
|
39
|
-
- instances.sort_by(&:name).each do |item|
|
|
40
|
-
%a.badge.badge-info{ href: "/kinds/#{item.klass}/instances/#{item.name}" }
|
|
41
|
-
= item.name
|
|
42
|
-
- else
|
|
43
|
-
.relations-empty None
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
- return unless instance
|
|
2
|
-
- realized = instance.relations(:realizes, :businessRequirements).map { |r| [r, 'implemented'] }
|
|
3
|
-
- partial = instance.relations(:partiallyRealizes, :businessRequirements).map { |r| [r, 'partial'] }
|
|
4
|
-
- planned = instance.relations(:plans, :businessRequirements).map { |r| [r, 'planned'] }
|
|
5
|
-
- all_requirements = realized + partial + planned
|
|
6
|
-
- if all_requirements.any?
|
|
7
|
-
%article.requirements-section
|
|
8
|
-
%header
|
|
9
|
-
%h2 Business Requirements
|
|
10
|
-
%table.requirements-table
|
|
11
|
-
%thead
|
|
12
|
-
%tr
|
|
13
|
-
%th
|
|
14
|
-
%th Name
|
|
15
|
-
%th Priority
|
|
16
|
-
%th Story
|
|
17
|
-
%tbody
|
|
18
|
-
- all_requirements.each do |req, status|
|
|
19
|
-
- status_icon = case status
|
|
20
|
-
- when 'implemented' then 'check-circle'
|
|
21
|
-
- when 'partial' then 'half-moon'
|
|
22
|
-
- when 'planned' then 'calendar'
|
|
23
|
-
- else 'circle'
|
|
24
|
-
- status_title = status.capitalize
|
|
25
|
-
%tr
|
|
26
|
-
%td.requirement-status
|
|
27
|
-
%i.requirement-status-icon{class: "iconoir-#{status_icon} status-#{status}", title: status_title}
|
|
28
|
-
%td
|
|
29
|
-
%a{href: "/kinds/BusinessRequirement/instances/#{req.name}"}= req.name
|
|
30
|
-
%td
|
|
31
|
-
- priority = req.annotations["requirement/priority"]
|
|
32
|
-
- if priority
|
|
33
|
-
%a.badge.badge-info{**search_link_attrs("BusinessRequirement: <- \"#{instance.name}\" & requirement/priority == \"#{priority}\"")}= priority
|
|
34
|
-
- else
|
|
35
|
-
%span.view-empty-value -
|
|
36
|
-
%td.requirement-story
|
|
37
|
-
- story = req.annotations["requirement/story"]
|
|
38
|
-
- if story
|
|
39
|
-
!= markdown(story)
|
|
40
|
-
- else
|
|
41
|
-
%span.view-empty-value -
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
- view_instance = db.instance_by_kind(@kind, @instance)
|
|
2
|
-
- return unless view_instance
|
|
3
|
-
- view_query = view_instance.annotations['view/query']
|
|
4
|
-
- view_description = view_instance.annotations['architecture/description']
|
|
5
|
-
- view_fields_raw = view_instance.annotations['view/fields'] || ''
|
|
6
|
-
- view_fields = view_fields_raw.split(',').map(&:strip).reject(&:empty?)
|
|
7
|
-
- view_type = view_instance.annotations['view/type'] || 'list:name+kind'
|
|
8
|
-
- show_kind = view_type == 'list:name+kind'
|
|
9
|
-
- view_sort_raw = view_instance.annotations['view/sort'] || ''
|
|
10
|
-
- view_sort_fields = view_sort_raw.split(',').map(&:strip).reject(&:empty?)
|
|
11
|
-
|
|
12
|
-
%article.view-header
|
|
13
|
-
%header
|
|
14
|
-
%h2
|
|
15
|
-
%i{class: "iconoir-#{view_instance.class.icon} icon-#{view_instance.class.layer}"}
|
|
16
|
-
= @instance
|
|
17
|
-
- if view_description
|
|
18
|
-
.view-description
|
|
19
|
-
!= markdown(view_description)
|
|
20
|
-
- if view_query
|
|
21
|
-
.view-query-display
|
|
22
|
-
%p.query-item
|
|
23
|
-
%span.label Query:
|
|
24
|
-
%code.query-value= view_query
|
|
25
|
-
|
|
26
|
-
- if view_query
|
|
27
|
-
- begin
|
|
28
|
-
- start_time = Time.now
|
|
29
|
-
- parsed_query = Archsight::Query.parse(view_query)
|
|
30
|
-
- results = parsed_query.filter(db)
|
|
31
|
-
- results = sort_instances(results, view_sort_fields)
|
|
32
|
-
- search_time_ms = ((Time.now - start_time) * 1000).round(2)
|
|
33
|
-
-# Hide kind if view_type is not 'list:name+kind' OR if query filters by a specific kind (redundant)
|
|
34
|
-
- show_kind = show_kind && parsed_query.kind_filter.nil?
|
|
35
|
-
|
|
36
|
-
%article.view-results
|
|
37
|
-
%header
|
|
38
|
-
%h3 Results
|
|
39
|
-
%span.view-result-meta
|
|
40
|
-
= results.size
|
|
41
|
-
= results.size == 1 ? "item" : "items"
|
|
42
|
-
in #{search_time_ms} ms
|
|
43
|
-
|
|
44
|
-
!= haml :"partials/instance/_list", locals: { instances: results, omit_kind: !show_kind, fields: view_fields.any? ? view_fields : nil }
|
|
45
|
-
|
|
46
|
-
- rescue Archsight::Query::QueryError => e
|
|
47
|
-
.search-error
|
|
48
|
-
.search-error-header
|
|
49
|
-
%i.iconoir-warning-triangle
|
|
50
|
-
Query Error
|
|
51
|
-
.search-error-message= e.message
|
|
52
|
-
.search-error-query
|
|
53
|
-
Query:
|
|
54
|
-
%code= view_query
|
|
55
|
-
- else
|
|
56
|
-
%p.view-empty-state
|
|
57
|
-
%em No query defined
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
.content
|
|
2
|
-
- if @doc_content
|
|
3
|
-
%article
|
|
4
|
-
!= @doc_content
|
|
5
|
-
- elsif @instances
|
|
6
|
-
!= haml :search
|
|
7
|
-
- elsif @kind && @instance
|
|
8
|
-
- if !Archsight::Resources[@kind]
|
|
9
|
-
%article
|
|
10
|
-
%header
|
|
11
|
-
%h2 Kind Not Found
|
|
12
|
-
%p
|
|
13
|
-
Kind
|
|
14
|
-
%strong= @kind
|
|
15
|
-
does not exist.
|
|
16
|
-
- elsif @kind == "View"
|
|
17
|
-
!= haml :'partials/instance/_view_detail'
|
|
18
|
-
- elsif @kind == "Analysis"
|
|
19
|
-
!= haml :'partials/instance/_analysis_detail'
|
|
20
|
-
- elsif @kind == "Import"
|
|
21
|
-
!= haml :'partials/instance/_import_detail'
|
|
22
|
-
- else
|
|
23
|
-
!= haml :'partials/instance/_detail'
|
|
24
|
-
- elsif @kind && !@instance
|
|
25
|
-
- if !Archsight::Resources[@kind]
|
|
26
|
-
%article
|
|
27
|
-
%header
|
|
28
|
-
%h2 Kind Not Found
|
|
29
|
-
%p
|
|
30
|
-
Kind
|
|
31
|
-
%strong= @kind
|
|
32
|
-
does not exist.
|
|
33
|
-
- else
|
|
34
|
-
- kind_snake = @kind.gsub(/([a-z])([A-Z])/, '\1_\2').downcase
|
|
35
|
-
%article
|
|
36
|
-
%header
|
|
37
|
-
%h2
|
|
38
|
-
%i{class: "iconoir-#{Archsight::Resources[@kind].icon} icon-#{Archsight::Resources[@kind].layer}"}
|
|
39
|
-
= @kind
|
|
40
|
-
%a.kind-help{href: "/doc/resources/#{kind_snake}", title: "Documentation for #{@kind}"}
|
|
41
|
-
%i.iconoir-help-circle
|
|
42
|
-
!= haml :"partials/instance/_list", locals: { instances: db.instances_by_kind(@kind).values.sort_by(&:name), omit_kind: true }
|
|
43
|
-
- elsif !@kind
|
|
44
|
-
!= haml :"partials/instance/_graph"
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
%header.container
|
|
2
|
-
%article.error-header
|
|
3
|
-
%h3
|
|
4
|
-
%i.iconoir-warning-triangle
|
|
5
|
-
Error
|
|
6
|
-
%p.error-message= @error.message
|
|
7
|
-
%p.error-location
|
|
8
|
-
%i.iconoir-page
|
|
9
|
-
= relative_error_path(@error.ref.path)
|
|
10
|
-
%span.error-line-badge Line #{@error.ref.line_no}
|
|
11
|
-
%a.reload-btn{href: "/reload?redirect=#{params["redirect"]}"}
|
|
12
|
-
%i.iconoir-refresh
|
|
13
|
-
Reload
|
|
14
|
-
|
|
15
|
-
%main.container
|
|
16
|
-
.error-code-block
|
|
17
|
-
%pre
|
|
18
|
-
%code
|
|
19
|
-
- error_context_lines(@error.ref.path, @error.ref.line_no).each do |line|
|
|
20
|
-
- line_class = line[:selected] ? "error-line" : "code-line"
|
|
21
|
-
- escaped_content = ERB::Util.html_escape(line[:content])
|
|
22
|
-
!= "<span class='#{line_class}'><span class='line-number'>#{line[:line_no].to_s.rjust(4)}</span>#{escaped_content}</span>\n"
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
%head
|
|
2
|
-
%meta{content: 'text/html; charset=UTF-8', 'http-equiv' => 'Content-Type'}/
|
|
3
|
-
%meta{charset: 'UTF-8'}/
|
|
4
|
-
%meta{content: 'width=device-width, initial-scale=1', name: 'viewport'}/
|
|
5
|
-
%title IONOS Architecture
|
|
6
|
-
%link{href: asset_path('/css/pico.min.css'), rel: 'stylesheet'}/
|
|
7
|
-
%link{href: asset_path('/css/base.css'), rel: 'stylesheet'}/
|
|
8
|
-
%link{href: asset_path('/css/layout.css'), rel: 'stylesheet'}/
|
|
9
|
-
%link{href: asset_path('/css/instance.css'), rel: 'stylesheet'}/
|
|
10
|
-
%link{href: asset_path('/css/artifact.css'), rel: 'stylesheet'}/
|
|
11
|
-
%link{href: asset_path('/css/iconoir.css'), rel: 'stylesheet'}/
|
|
12
|
-
%link{href: asset_path('/css/highlight.min.css'), rel: 'stylesheet'}/
|
|
13
|
-
%link{href: asset_path('/css/mermaid-layers.css'), rel: 'stylesheet'}/
|
|
14
|
-
%link{href: asset_path('/css/graph.css'), rel: 'stylesheet'}/
|
|
15
|
-
%script{src: asset_path('/js/htmx.min.js')}
|
|
16
|
-
%script{src: asset_path('/js/mermaid.min.js')}
|
|
17
|
-
%script{src: asset_path('/js/svg-pan-zoom.min.js')}
|
|
18
|
-
%script{src: asset_path('/js/svg-zoom-controls.js')}
|
|
19
|
-
%script{src: asset_path('/js/graph-zoom.js')}
|
|
20
|
-
%script{src: asset_path("/js/mermaid-init.js")}
|
|
21
|
-
%script{ src: asset_path("/js/highlight.min.js") }
|
|
22
|
-
%script{ src: asset_path("/js/sparkline.js") }
|
|
23
|
-
:javascript
|
|
24
|
-
hljs.highlightAll();
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
%nav.container-fluid
|
|
2
|
-
%ul
|
|
3
|
-
%li
|
|
4
|
-
%strong
|
|
5
|
-
%a{href: "/"}
|
|
6
|
-
%i.iconoir-home
|
|
7
|
-
Archsight
|
|
8
|
-
- if reload_enabled?
|
|
9
|
-
%li
|
|
10
|
-
%a{href: "/reload?redirect=#{request.path_info}"}
|
|
11
|
-
%i.iconoir-reload-window
|
|
12
|
-
Reload
|
|
13
|
-
%ul
|
|
14
|
-
%li.search-container
|
|
15
|
-
%a.search-help{ href: "/doc/index", "hx-get": "/doc/index", "hx-target": ".content", "hx-swap": "innerHTML", "hx-push-url": "true", title: "Help" }
|
|
16
|
-
%i.iconoir-help-circle
|
|
17
|
-
%input#search-input.search{ placeholder: "Query: kubernetes, activity/status == \"active\"", name: "q",
|
|
18
|
-
"hx-post": "/search", "hx-swap": "innerHTML", "hx-target": ".content",
|
|
19
|
-
"hx-indicator": ".search-spinner" }
|
|
20
|
-
%span.search-spinner.htmx-indicator
|
|
21
|
-
%i.iconoir-refresh.spinning
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
%aside.sidebar
|
|
2
|
-
.sidebar-section
|
|
3
|
-
%h4.sidebar-heading
|
|
4
|
-
%i.iconoir-folder
|
|
5
|
-
Kinds
|
|
6
|
-
%nav.kind-filter
|
|
7
|
-
%ul
|
|
8
|
-
- Archsight::Resources.each do |item|
|
|
9
|
-
%li
|
|
10
|
-
%a{href: "/kinds/#{item}", 'aria-current': (item.to_s == @kind ? "page" : nil)}
|
|
11
|
-
%span.kind-name= item
|
|
12
|
-
%span.kind-count= db.instances_by_kind(item).each_key.size
|
|
13
|
-
- if @kind
|
|
14
|
-
- filters = db.filters_for_kind(@kind)
|
|
15
|
-
- if filters.any?
|
|
16
|
-
.sidebar-section
|
|
17
|
-
%h4.sidebar-heading
|
|
18
|
-
%i.iconoir-filter
|
|
19
|
-
Filters
|
|
20
|
-
%nav.annotation-filter
|
|
21
|
-
- filters.each do |annotation, values|
|
|
22
|
-
.filter-group
|
|
23
|
-
.filter-label{title: annotation.description}= annotation.title
|
|
24
|
-
.filter-chips
|
|
25
|
-
- values.each do |value|
|
|
26
|
-
%a.filter-chip{ **filter_link_attrs(annotation.key, value, "==", @kind) }
|
|
27
|
-
= value
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
- if @query_error
|
|
2
|
-
.search-error
|
|
3
|
-
.search-error-header
|
|
4
|
-
%i.iconoir-warning-triangle
|
|
5
|
-
Query Syntax Error
|
|
6
|
-
.search-error-message= @query_error.message
|
|
7
|
-
.search-error-query
|
|
8
|
-
Query:
|
|
9
|
-
%code= @q
|
|
10
|
-
|
|
11
|
-
%article.search-context
|
|
12
|
-
%header
|
|
13
|
-
%h3 Search Query
|
|
14
|
-
.search-query-display
|
|
15
|
-
%p.query-item
|
|
16
|
-
%span.label Query:
|
|
17
|
-
%code.query-value= @q
|
|
18
|
-
- if @tag
|
|
19
|
-
- new_method = @method == '==' ? '!=' : '=='
|
|
20
|
-
- title_text = @method == '==' ? "Switch to != (NOT equal)" : "Switch to == (equal)"
|
|
21
|
-
- attrs = filter_link_attrs(@tag, @value, new_method, @kind).merge(title: title_text)
|
|
22
|
-
%a.link-light.query-toggle{**attrs}
|
|
23
|
-
%i.iconoir-flip
|
|
24
|
-
- if @kind
|
|
25
|
-
%p.query-item
|
|
26
|
-
%span.label Kind:
|
|
27
|
-
%code.kind-value= @kind
|
|
28
|
-
- unless @query_error
|
|
29
|
-
%p.query-item
|
|
30
|
-
%span.label Results:
|
|
31
|
-
%span.result-count
|
|
32
|
-
= (@instances || []).size
|
|
33
|
-
= (@instances || []).size == 1 ? "item" : "items"
|
|
34
|
-
%p.query-item
|
|
35
|
-
%span.label Time:
|
|
36
|
-
%span.search-time= "#{@search_time_ms} ms"
|
|
37
|
-
|
|
38
|
-
- unless @query_error
|
|
39
|
-
%article.search-results
|
|
40
|
-
%header
|
|
41
|
-
%h3 Results
|
|
42
|
-
- if (@instances || []).empty?
|
|
43
|
-
%p
|
|
44
|
-
%em No results found
|
|
45
|
-
- else
|
|
46
|
-
!= haml :"partials/instance/_list", locals: { instances: @instances, omit_kind: !@kind.nil? }
|
|
47
|
-
|
|
48
|
-
-# Out-of-band swap to update search input with current query
|
|
49
|
-
%input#search-input.search{ placeholder: "Query: kubernetes, activity/status == \"active\"", name: "q",
|
|
50
|
-
value: @q,
|
|
51
|
-
"hx-post": "/search", "hx-swap": "innerHTML", "hx-target": ".content",
|
|
52
|
-
"hx-indicator": ".search-spinner",
|
|
53
|
-
"hx-swap-oob": "true" }
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|