Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
645,673 changes: 645,673 additions & 0 deletions api-stubs/branch-diff-with-libs.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion elm-git.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"git-dependencies": {
"direct": {
"https://github.com/unisonweb/ui-core": "d9cf0e30bbb75decac36f1b9f4e2855d5a69d1e0"
"https://github.com/unisonweb/ui-core": "9518fe75925e2a2d3828a4a5c2415ed0eac5d661"
},
"indirect": {}
}
Expand Down
14 changes: 0 additions & 14 deletions src/Code2/Workspace/WorkspaceCard.elm
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
module Code2.Workspace.WorkspaceCard exposing (..)

import Code.ProjectDependency as ProjectDependency exposing (ProjectDependency)
import Code2.Workspace.WorkspaceCardTitlebarButton as TitlebarButton exposing (titlebarButton)
import Html exposing (Html, div, header, section, span, text)
import Html.Attributes exposing (class)
import Lib.OperatingSystem exposing (OperatingSystem)
import UI
import UI.Card as Card
import UI.Click as Click exposing (Click)
import UI.ContextualTag as ContextualTag
import UI.Icon as Icon exposing (Icon)
import UI.KeyboardShortcut as KeyboardShortcut exposing (KeyboardShortcut(..), single)
import UI.KeyboardShortcut.Key as Key exposing (letter)
Expand Down Expand Up @@ -186,18 +184,6 @@ map f card_ =



-- RELATED VIEW HELPERS


viewLibraryTag : ProjectDependency -> Html msg
viewLibraryTag dep =
ContextualTag.contextualTag Icon.book (ProjectDependency.toString dep)
|> ContextualTag.decorativePurple
|> ContextualTag.withTooltipText "Library dependency"
|> ContextualTag.view



-- VIEW


Expand Down
3 changes: 2 additions & 1 deletion src/Code2/Workspace/WorkspaceDefinitionItemCard.elm
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import Code.Definition.Term as Term
import Code.Definition.Type as Type
import Code.FullyQualifiedName as FQN exposing (FQN)
import Code.Hash as Hash
import Code.ProjectDependency as ProjectDependency
import Code.Source.SourceViewConfig as SourceViewConfig
import Code.Syntax.SyntaxConfig as SyntaxConfig
import Code2.Workspace.DefinitionItem as DefinitionItem exposing (DefinitionItem(..))
Expand Down Expand Up @@ -254,7 +255,7 @@ titlebarLeft cfg =
lib =
cfg.item
|> DefinitionItem.toLib
|> Maybe.map WorkspaceCard.viewLibraryTag
|> Maybe.map ProjectDependency.viewLibraryBadge
|> Maybe.withDefault UI.nothing

copySourceToClipboard =
Expand Down
3 changes: 2 additions & 1 deletion src/Code2/Workspace/WorkspaceDefinitionMatchesCard.elm
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import Code.Definition.Term as Term exposing (Term(..))
import Code.Definition.Type as Type exposing (Type(..))
import Code.DefinitionSummaryTooltip as DefinitionSummaryTooltip
import Code.FullyQualifiedName as FQN
import Code.ProjectDependency as ProjectDependency
import Code.Syntax.SyntaxSegment as SyntaxSegment
import Code2.Workspace.DefinitionItem as DefinitionItem exposing (DefinitionItem)
import Code2.Workspace.DefinitionMatch as DefinitionMatch exposing (DefinitionMatch(..))
Expand Down Expand Up @@ -328,7 +329,7 @@ view cfg =
lib =
cfg.contextItem
|> DefinitionItem.toLib
|> Maybe.map WorkspaceCard.viewLibraryTag
|> Maybe.map ProjectDependency.viewLibraryBadge
|> Maybe.withDefault UI.nothing

({ terms, types, tests, abilities, docs } as group) =
Expand Down
66 changes: 63 additions & 3 deletions src/UnisonShare/BranchDiff/LibDep.elm
Original file line number Diff line number Diff line change
@@ -1,27 +1,87 @@
module UnisonShare.BranchDiff.LibDep exposing (..)

import Code.FullyQualifiedName as FQN exposing (FQN)
import Code.ProjectDependency as ProjectDependency exposing (ProjectDependency)
import Json.Decode as Decode
import Json.Decode.Pipeline exposing (required)
import Lib.Decode.Helpers exposing (failInvalid, whenTagIs)
import List.Extra as ListE


type alias LibDepInfo =
{ name : String }
{ name : FQN, dep : ProjectDependency }


type LibDep
= Added LibDepInfo
| Removed LibDepInfo
| Updated { before : LibDepInfo, after : LibDepInfo }


same : LibDep -> LibDep -> Bool
same a b =
ProjectDependency.same (projectDependency a) (projectDependency b)


libDepInfo : LibDep -> LibDepInfo
libDepInfo libDep =
case libDep of
Added info ->
info

Removed info ->
info

Updated { before } ->
before


projectDependency : LibDep -> ProjectDependency
projectDependency libDep =
libDep |> libDepInfo |> .dep


mergeUpdated : List LibDep -> List LibDep
mergeUpdated deps =
let
go lib acc =
case ( List.filter (same lib) deps, ListE.find (same lib) acc ) of
( [ Added addedInfo, Removed removedInfo ], Nothing ) ->
Updated { before = removedInfo, after = addedInfo } :: acc

( [ Removed removedInfo, Added addedInfo ], Nothing ) ->
Updated { before = removedInfo, after = addedInfo } :: acc

( [ Added _, Removed _ ], Just _ ) ->
acc

( [ Removed _, Added _ ], Just _ ) ->
acc

_ ->
lib :: acc
in
List.foldr go [] deps



-- DECODE


decodeMaybe : Decode.Decoder (Maybe LibDep)
decodeMaybe =
let
makeAdded name =
Added { name = name }
Added
{ name = FQN.fromString ("lib." ++ name)
, dep = ProjectDependency.fromString name
}

makeRemoved name =
Removed { name = name }
Removed
{ name = FQN.fromString ("lib." ++ name)
, dep = ProjectDependency.fromString name
}
in
Decode.oneOf
[ whenTagIs "Added"
Expand Down
144 changes: 89 additions & 55 deletions src/UnisonShare/Page/ProjectContributionChangesPage.elm
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@ import Code.Definition.Reference exposing (Reference)
import Code.FullyQualifiedName as FQN
import Code.Hash as Hash
import Code.Perspective as Perspective
import Code.ProjectDependency as ProjectDependency
import Code.Syntax as Syntax
import Code.Syntax.SyntaxConfig as SyntaxConfig
import Code.Version as Version
import Html exposing (Html, br, code, div, h2, label, p, pre, span, strong, text)
import Html.Attributes exposing (class, id, style)
import Http
Expand Down Expand Up @@ -300,22 +302,28 @@ viewChangeIcon item =
)


viewChangeBadge : Int -> ChangeLine -> Html Msg
viewChangeBadge : Int -> ChangeLine -> Html msg
viewChangeBadge maxBadgeLength changeLine =
let
type_ =
ChangeLine.toString changeLine
in
viewChangeBadge_ maxBadgeLength (changeIcon changeLine) type_


viewChangeBadge_ : Int -> Icon msg -> String -> Html msg
viewChangeBadge_ maxBadgeLength icon label_ =
let
width =
String.fromInt maxBadgeLength
in
span [ class "change-badge_wrapper", style "width" (width ++ "ch") ]
[ span
[ class "change-badge"
, class (String.toLower type_)
, class (String.toLower label_)
]
[ Icon.view (changeIcon changeLine)
, label [] [ text type_ ]
[ Icon.view icon
, label [] [ text label_ ]
]
]

Expand Down Expand Up @@ -549,15 +557,9 @@ viewChangedDefinitionCard projectRef toggledChangeLines branchDiff maxBadgeLengt
|> Card.view


viewChangedDefinitionsCards : ProjectRef -> ToggledChangeLines -> BranchDiff -> List (Html Msg)
viewChangedDefinitionsCards projectRef toggledChangeLines branchDiff =
viewChangedDefinitionsCards : ProjectRef -> ToggledChangeLines -> Int -> BranchDiff -> List (Html Msg)
viewChangedDefinitionsCards projectRef toggledChangeLines maxBadgeLength branchDiff =
let
maxBadgeLength =
branchDiff.lines
|> List.map (ChangeLine.toString >> String.length)
|> List.maximum
|> Maybe.withDefault 0

view_ =
viewChangedDefinitionCard
projectRef
Expand Down Expand Up @@ -665,64 +667,90 @@ viewChangedDefinitionsCards projectRef toggledChangeLines branchDiff =
go branchDiff.lines


viewLibDep : LibDep -> Html msg
viewLibDep dep =
viewLibDep : Int -> LibDep -> Html msg
viewLibDep maxBadgeLength libDep =
let
viewCard content =
Card.card
[ div [ class "definition-change-header" ] [ div [ class "change-line" ] content ] ]
[ div [ class "definition-change-header" ]
[ div [ class "change-line" ] content ]
]
|> Card.withClassName "definition-change lib-dep"
|> Card.asContained
|> Card.view

changeIcon_ type_ icon =
Tooltip.text type_
|> Tooltip.tooltip
|> Tooltip.withArrow Tooltip.Start
|> Tooltip.view
(span
[ class "change-icon"
, class (String.toLower type_)
]
[ Icon.view icon ]
)
badge icon type_ =
viewChangeBadge_ maxBadgeLength icon type_

viewTitle name =
let
fqn =
FQN.fromList [ "lib", name ]
in
div [ class "change-title" ] [ FQN.view fqn ]
viewDepInfoBadge dep =
div [ class "dep-info change-info" ]
[ div [ class "change-title" ]
[ ProjectDependency.viewLibraryBadge_ { withVersion = True, withTooltip = False } dep.dep
, span [ class "lib-namespace-info" ] [ text "(", FQN.view dep.name, text ")" ]
]
]
in
case dep of
LibDep.Added { name } ->
case libDep of
LibDep.Added dep ->
viewCard
[ changeIcon_ "Added" Icon.largePlus
, div [ class "def-icon-anchor" ]
[ Tooltip.text "Lib dependency"
|> Tooltip.tooltip
|> Tooltip.withArrow Tooltip.Start
|> Tooltip.view (span [ class "def-icon" ] [ Icon.view Icon.book ])
]
, div [ class "change-info" ] [ viewTitle name ]
[ badge Icon.largePlus "Added"
, viewDepInfoBadge dep
]

LibDep.Removed dep ->
viewCard
[ badge Icon.dash "Removed"
, viewDepInfoBadge dep
]

LibDep.Removed { name } ->
LibDep.Updated { before, after } ->
let
toFrom =
case ( before.dep.version, after.dep.version ) of
( Just beforeV, Just afterV ) ->
[ ProjectDependency.viewLibraryBadge_
{ withVersion = False
, withTooltip = False
}
before.dep
, Version.view beforeV
, Icon.view Icon.arrowRight
, Version.view afterV
, span [ class "lib-namespace-info" ]
[ text "("
, FQN.view before.name
, Icon.view Icon.arrowRight
, FQN.view after.name
, text ")"
]
]

_ ->
[ ProjectDependency.viewLibraryBadge before.dep
, Icon.view Icon.arrowRight
, ProjectDependency.viewLibraryBadge after.dep
, span [ class "lib-namespace-info" ]
[ text "("
, FQN.view before.name
, Icon.view Icon.arrowRight
, FQN.view after.name
, text ")"
]
]
in
viewCard
[ changeIcon_ "Removed" Icon.dash
, div [ class "def-icon-anchor" ]
[ Tooltip.text "Lib dependency"
|> Tooltip.tooltip
|> Tooltip.withArrow Tooltip.Start
|> Tooltip.view (span [ class "def-icon" ] [ Icon.view Icon.book ])
[ badge Icon.refreshSmallBold "Updated"
, div [ class "dep-info change-info" ]
[ div [ class "change-title" ] toFrom
]
, div [ class "change-info" ] [ viewTitle name ]
]


viewLibDeps : List LibDep -> List (Html msg)
viewLibDeps deps =
List.map viewLibDep deps
viewLibDeps : Int -> List LibDep -> List (Html msg)
viewLibDeps maxBadgeLength deps =
deps
|> LibDep.mergeUpdated
|> List.map (viewLibDep maxBadgeLength)


viewBranchDiff : ProjectRef -> ToggledChangeLines -> BranchDiff -> Html Msg
Expand All @@ -731,6 +759,12 @@ viewBranchDiff projectRef toggledChangeLines diff =
summary =
BranchDiff.summary diff

maxBadgeLength =
diff.lines
|> List.map (ChangeLine.toString >> String.length)
|> List.maximum
|> Maybe.withDefault 0

-- There's no reason to show a tree with a single element...
tree =
if BranchDiff.size diff > 1 then
Expand All @@ -751,8 +785,8 @@ viewBranchDiff projectRef toggledChangeLines diff =
, div [ class "branch-diff-content-cards" ]
[ tree
, div [ id "definition-changes", class "definition-changes" ]
(viewLibDeps diff.libDeps
++ viewChangedDefinitionsCards projectRef toggledChangeLines diff
(viewLibDeps maxBadgeLength diff.libDeps
++ viewChangedDefinitionsCards projectRef toggledChangeLines maxBadgeLength diff
)
]
]
Expand Down
Loading
Loading