Skip to content

Commit 64d6e93

Browse files
authored
Merge pull request #125 from unisoncomputing/diff-libs
Update library dependency diff rendering
2 parents 75f8aba + 37b6394 commit 64d6e93

File tree

9 files changed

+645873
-78
lines changed

9 files changed

+645873
-78
lines changed

api-stubs/branch-diff-with-libs.json

Lines changed: 645673 additions & 0 deletions
Large diffs are not rendered by default.

elm-git.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"git-dependencies": {
33
"direct": {
4-
"https://github.com/unisonweb/ui-core": "d9cf0e30bbb75decac36f1b9f4e2855d5a69d1e0"
4+
"https://github.com/unisonweb/ui-core": "9518fe75925e2a2d3828a4a5c2415ed0eac5d661"
55
},
66
"indirect": {}
77
}

src/Code2/Workspace/WorkspaceCard.elm

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
module Code2.Workspace.WorkspaceCard exposing (..)
22

3-
import Code.ProjectDependency as ProjectDependency exposing (ProjectDependency)
43
import Code2.Workspace.WorkspaceCardTitlebarButton as TitlebarButton exposing (titlebarButton)
54
import Html exposing (Html, div, header, section, span, text)
65
import Html.Attributes exposing (class)
76
import Lib.OperatingSystem exposing (OperatingSystem)
87
import UI
98
import UI.Card as Card
109
import UI.Click as Click exposing (Click)
11-
import UI.ContextualTag as ContextualTag
1210
import UI.Icon as Icon exposing (Icon)
1311
import UI.KeyboardShortcut as KeyboardShortcut exposing (KeyboardShortcut(..), single)
1412
import UI.KeyboardShortcut.Key as Key exposing (letter)
@@ -186,18 +184,6 @@ map f card_ =
186184

187185

188186

189-
-- RELATED VIEW HELPERS
190-
191-
192-
viewLibraryTag : ProjectDependency -> Html msg
193-
viewLibraryTag dep =
194-
ContextualTag.contextualTag Icon.book (ProjectDependency.toString dep)
195-
|> ContextualTag.decorativePurple
196-
|> ContextualTag.withTooltipText "Library dependency"
197-
|> ContextualTag.view
198-
199-
200-
201187
-- VIEW
202188

203189

src/Code2/Workspace/WorkspaceDefinitionItemCard.elm

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import Code.Definition.Term as Term
77
import Code.Definition.Type as Type
88
import Code.FullyQualifiedName as FQN exposing (FQN)
99
import Code.Hash as Hash
10+
import Code.ProjectDependency as ProjectDependency
1011
import Code.Source.SourceViewConfig as SourceViewConfig
1112
import Code.Syntax.SyntaxConfig as SyntaxConfig
1213
import Code2.Workspace.DefinitionItem as DefinitionItem exposing (DefinitionItem(..))
@@ -254,7 +255,7 @@ titlebarLeft cfg =
254255
lib =
255256
cfg.item
256257
|> DefinitionItem.toLib
257-
|> Maybe.map WorkspaceCard.viewLibraryTag
258+
|> Maybe.map ProjectDependency.viewLibraryBadge
258259
|> Maybe.withDefault UI.nothing
259260

260261
copySourceToClipboard =

src/Code2/Workspace/WorkspaceDefinitionMatchesCard.elm

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import Code.Definition.Term as Term exposing (Term(..))
55
import Code.Definition.Type as Type exposing (Type(..))
66
import Code.DefinitionSummaryTooltip as DefinitionSummaryTooltip
77
import Code.FullyQualifiedName as FQN
8+
import Code.ProjectDependency as ProjectDependency
89
import Code.Syntax.SyntaxSegment as SyntaxSegment
910
import Code2.Workspace.DefinitionItem as DefinitionItem exposing (DefinitionItem)
1011
import Code2.Workspace.DefinitionMatch as DefinitionMatch exposing (DefinitionMatch(..))
@@ -328,7 +329,7 @@ view cfg =
328329
lib =
329330
cfg.contextItem
330331
|> DefinitionItem.toLib
331-
|> Maybe.map WorkspaceCard.viewLibraryTag
332+
|> Maybe.map ProjectDependency.viewLibraryBadge
332333
|> Maybe.withDefault UI.nothing
333334

334335
({ terms, types, tests, abilities, docs } as group) =

src/UnisonShare/BranchDiff/LibDep.elm

Lines changed: 63 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,87 @@
11
module UnisonShare.BranchDiff.LibDep exposing (..)
22

3+
import Code.FullyQualifiedName as FQN exposing (FQN)
4+
import Code.ProjectDependency as ProjectDependency exposing (ProjectDependency)
35
import Json.Decode as Decode
46
import Json.Decode.Pipeline exposing (required)
57
import Lib.Decode.Helpers exposing (failInvalid, whenTagIs)
8+
import List.Extra as ListE
69

710

811
type alias LibDepInfo =
9-
{ name : String }
12+
{ name : FQN, dep : ProjectDependency }
1013

1114

1215
type LibDep
1316
= Added LibDepInfo
1417
| Removed LibDepInfo
18+
| Updated { before : LibDepInfo, after : LibDepInfo }
19+
20+
21+
same : LibDep -> LibDep -> Bool
22+
same a b =
23+
ProjectDependency.same (projectDependency a) (projectDependency b)
24+
25+
26+
libDepInfo : LibDep -> LibDepInfo
27+
libDepInfo libDep =
28+
case libDep of
29+
Added info ->
30+
info
31+
32+
Removed info ->
33+
info
34+
35+
Updated { before } ->
36+
before
37+
38+
39+
projectDependency : LibDep -> ProjectDependency
40+
projectDependency libDep =
41+
libDep |> libDepInfo |> .dep
42+
43+
44+
mergeUpdated : List LibDep -> List LibDep
45+
mergeUpdated deps =
46+
let
47+
go lib acc =
48+
case ( List.filter (same lib) deps, ListE.find (same lib) acc ) of
49+
( [ Added addedInfo, Removed removedInfo ], Nothing ) ->
50+
Updated { before = removedInfo, after = addedInfo } :: acc
51+
52+
( [ Removed removedInfo, Added addedInfo ], Nothing ) ->
53+
Updated { before = removedInfo, after = addedInfo } :: acc
54+
55+
( [ Added _, Removed _ ], Just _ ) ->
56+
acc
57+
58+
( [ Removed _, Added _ ], Just _ ) ->
59+
acc
60+
61+
_ ->
62+
lib :: acc
63+
in
64+
List.foldr go [] deps
65+
66+
67+
68+
-- DECODE
1569

1670

1771
decodeMaybe : Decode.Decoder (Maybe LibDep)
1872
decodeMaybe =
1973
let
2074
makeAdded name =
21-
Added { name = name }
75+
Added
76+
{ name = FQN.fromString ("lib." ++ name)
77+
, dep = ProjectDependency.fromString name
78+
}
2279

2380
makeRemoved name =
24-
Removed { name = name }
81+
Removed
82+
{ name = FQN.fromString ("lib." ++ name)
83+
, dep = ProjectDependency.fromString name
84+
}
2585
in
2686
Decode.oneOf
2787
[ whenTagIs "Added"

src/UnisonShare/Page/ProjectContributionChangesPage.elm

Lines changed: 89 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@ import Code.Definition.Reference exposing (Reference)
55
import Code.FullyQualifiedName as FQN
66
import Code.Hash as Hash
77
import Code.Perspective as Perspective
8+
import Code.ProjectDependency as ProjectDependency
89
import Code.Syntax as Syntax
910
import Code.Syntax.SyntaxConfig as SyntaxConfig
11+
import Code.Version as Version
1012
import Html exposing (Html, br, code, div, h2, label, p, pre, span, strong, text)
1113
import Html.Attributes exposing (class, id, style)
1214
import Http
@@ -300,22 +302,28 @@ viewChangeIcon item =
300302
)
301303

302304

303-
viewChangeBadge : Int -> ChangeLine -> Html Msg
305+
viewChangeBadge : Int -> ChangeLine -> Html msg
304306
viewChangeBadge maxBadgeLength changeLine =
305307
let
306308
type_ =
307309
ChangeLine.toString changeLine
310+
in
311+
viewChangeBadge_ maxBadgeLength (changeIcon changeLine) type_
312+
308313

314+
viewChangeBadge_ : Int -> Icon msg -> String -> Html msg
315+
viewChangeBadge_ maxBadgeLength icon label_ =
316+
let
309317
width =
310318
String.fromInt maxBadgeLength
311319
in
312320
span [ class "change-badge_wrapper", style "width" (width ++ "ch") ]
313321
[ span
314322
[ class "change-badge"
315-
, class (String.toLower type_)
323+
, class (String.toLower label_)
316324
]
317-
[ Icon.view (changeIcon changeLine)
318-
, label [] [ text type_ ]
325+
[ Icon.view icon
326+
, label [] [ text label_ ]
319327
]
320328
]
321329

@@ -549,15 +557,9 @@ viewChangedDefinitionCard projectRef toggledChangeLines branchDiff maxBadgeLengt
549557
|> Card.view
550558

551559

552-
viewChangedDefinitionsCards : ProjectRef -> ToggledChangeLines -> BranchDiff -> List (Html Msg)
553-
viewChangedDefinitionsCards projectRef toggledChangeLines branchDiff =
560+
viewChangedDefinitionsCards : ProjectRef -> ToggledChangeLines -> Int -> BranchDiff -> List (Html Msg)
561+
viewChangedDefinitionsCards projectRef toggledChangeLines maxBadgeLength branchDiff =
554562
let
555-
maxBadgeLength =
556-
branchDiff.lines
557-
|> List.map (ChangeLine.toString >> String.length)
558-
|> List.maximum
559-
|> Maybe.withDefault 0
560-
561563
view_ =
562564
viewChangedDefinitionCard
563565
projectRef
@@ -665,64 +667,90 @@ viewChangedDefinitionsCards projectRef toggledChangeLines branchDiff =
665667
go branchDiff.lines
666668

667669

668-
viewLibDep : LibDep -> Html msg
669-
viewLibDep dep =
670+
viewLibDep : Int -> LibDep -> Html msg
671+
viewLibDep maxBadgeLength libDep =
670672
let
671673
viewCard content =
672674
Card.card
673-
[ div [ class "definition-change-header" ] [ div [ class "change-line" ] content ] ]
675+
[ div [ class "definition-change-header" ]
676+
[ div [ class "change-line" ] content ]
677+
]
674678
|> Card.withClassName "definition-change lib-dep"
675679
|> Card.asContained
676680
|> Card.view
677681

678-
changeIcon_ type_ icon =
679-
Tooltip.text type_
680-
|> Tooltip.tooltip
681-
|> Tooltip.withArrow Tooltip.Start
682-
|> Tooltip.view
683-
(span
684-
[ class "change-icon"
685-
, class (String.toLower type_)
686-
]
687-
[ Icon.view icon ]
688-
)
682+
badge icon type_ =
683+
viewChangeBadge_ maxBadgeLength icon type_
689684

690-
viewTitle name =
691-
let
692-
fqn =
693-
FQN.fromList [ "lib", name ]
694-
in
695-
div [ class "change-title" ] [ FQN.view fqn ]
685+
viewDepInfoBadge dep =
686+
div [ class "dep-info change-info" ]
687+
[ div [ class "change-title" ]
688+
[ ProjectDependency.viewLibraryBadge_ { withVersion = True, withTooltip = False } dep.dep
689+
, span [ class "lib-namespace-info" ] [ text "(", FQN.view dep.name, text ")" ]
690+
]
691+
]
696692
in
697-
case dep of
698-
LibDep.Added { name } ->
693+
case libDep of
694+
LibDep.Added dep ->
699695
viewCard
700-
[ changeIcon_ "Added" Icon.largePlus
701-
, div [ class "def-icon-anchor" ]
702-
[ Tooltip.text "Lib dependency"
703-
|> Tooltip.tooltip
704-
|> Tooltip.withArrow Tooltip.Start
705-
|> Tooltip.view (span [ class "def-icon" ] [ Icon.view Icon.book ])
706-
]
707-
, div [ class "change-info" ] [ viewTitle name ]
696+
[ badge Icon.largePlus "Added"
697+
, viewDepInfoBadge dep
698+
]
699+
700+
LibDep.Removed dep ->
701+
viewCard
702+
[ badge Icon.dash "Removed"
703+
, viewDepInfoBadge dep
708704
]
709705

710-
LibDep.Removed { name } ->
706+
LibDep.Updated { before, after } ->
707+
let
708+
toFrom =
709+
case ( before.dep.version, after.dep.version ) of
710+
( Just beforeV, Just afterV ) ->
711+
[ ProjectDependency.viewLibraryBadge_
712+
{ withVersion = False
713+
, withTooltip = False
714+
}
715+
before.dep
716+
, Version.view beforeV
717+
, Icon.view Icon.arrowRight
718+
, Version.view afterV
719+
, span [ class "lib-namespace-info" ]
720+
[ text "("
721+
, FQN.view before.name
722+
, Icon.view Icon.arrowRight
723+
, FQN.view after.name
724+
, text ")"
725+
]
726+
]
727+
728+
_ ->
729+
[ ProjectDependency.viewLibraryBadge before.dep
730+
, Icon.view Icon.arrowRight
731+
, ProjectDependency.viewLibraryBadge after.dep
732+
, span [ class "lib-namespace-info" ]
733+
[ text "("
734+
, FQN.view before.name
735+
, Icon.view Icon.arrowRight
736+
, FQN.view after.name
737+
, text ")"
738+
]
739+
]
740+
in
711741
viewCard
712-
[ changeIcon_ "Removed" Icon.dash
713-
, div [ class "def-icon-anchor" ]
714-
[ Tooltip.text "Lib dependency"
715-
|> Tooltip.tooltip
716-
|> Tooltip.withArrow Tooltip.Start
717-
|> Tooltip.view (span [ class "def-icon" ] [ Icon.view Icon.book ])
742+
[ badge Icon.refreshSmallBold "Updated"
743+
, div [ class "dep-info change-info" ]
744+
[ div [ class "change-title" ] toFrom
718745
]
719-
, div [ class "change-info" ] [ viewTitle name ]
720746
]
721747

722748

723-
viewLibDeps : List LibDep -> List (Html msg)
724-
viewLibDeps deps =
725-
List.map viewLibDep deps
749+
viewLibDeps : Int -> List LibDep -> List (Html msg)
750+
viewLibDeps maxBadgeLength deps =
751+
deps
752+
|> LibDep.mergeUpdated
753+
|> List.map (viewLibDep maxBadgeLength)
726754

727755

728756
viewBranchDiff : ProjectRef -> ToggledChangeLines -> BranchDiff -> Html Msg
@@ -731,6 +759,12 @@ viewBranchDiff projectRef toggledChangeLines diff =
731759
summary =
732760
BranchDiff.summary diff
733761

762+
maxBadgeLength =
763+
diff.lines
764+
|> List.map (ChangeLine.toString >> String.length)
765+
|> List.maximum
766+
|> Maybe.withDefault 0
767+
734768
-- There's no reason to show a tree with a single element...
735769
tree =
736770
if BranchDiff.size diff > 1 then
@@ -751,8 +785,8 @@ viewBranchDiff projectRef toggledChangeLines diff =
751785
, div [ class "branch-diff-content-cards" ]
752786
[ tree
753787
, div [ id "definition-changes", class "definition-changes" ]
754-
(viewLibDeps diff.libDeps
755-
++ viewChangedDefinitionsCards projectRef toggledChangeLines diff
788+
(viewLibDeps maxBadgeLength diff.libDeps
789+
++ viewChangedDefinitionsCards projectRef toggledChangeLines maxBadgeLength diff
756790
)
757791
]
758792
]

0 commit comments

Comments
 (0)