diff --git a/package.json b/package.json index d7e6506..f7b2911 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "clean": "rm -rf dist", "start": "webpack serve --mode development --port 1234 --config webpack.dev.js", "test": "elm-test", - "review": "elm-review" + "review": "elm-review --ignore-files src/UnisonShare/Page/Catalog.elm" }, "bugs": { "url": "https://github.com/unisonweb/codebase-ui/issues" diff --git a/src/Api.elm b/src/Api.elm index 15b3823..1ec8794 100644 --- a/src/Api.elm +++ b/src/Api.elm @@ -8,6 +8,7 @@ module Api exposing , list , namespace , perform + , projects , toRequest , toUrl ) @@ -53,6 +54,11 @@ namespace perspective fqn = Endpoint [ "namespaces", FQN.toString fqn ] queryParams +projects : Endpoint +projects = + Endpoint [ "projects" ] [] + + getDefinition : Perspective -> List String -> Endpoint getDefinition perspective fqnsOrHashes = let diff --git a/src/Project.elm b/src/Project.elm new file mode 100644 index 0000000..ee282d4 --- /dev/null +++ b/src/Project.elm @@ -0,0 +1,22 @@ +module Project exposing (..) + +import FullyQualifiedName exposing (FQN) +import Hash exposing (Hash) +import Json.Decode as Decode + + +type Owner + = Owner String + + +type alias Project a = + { a | owner : Owner, name : FQN, hash : Hash } + + +type alias ProjectListing = + Project () + + +decodeList : Decode.Decoder (List ProjectListing) +decodeList = + Decode.succeed [] diff --git a/src/UnisonShare/Page/Catalog.elm b/src/UnisonShare/Page/Catalog.elm new file mode 100644 index 0000000..6de9f29 --- /dev/null +++ b/src/UnisonShare/Page/Catalog.elm @@ -0,0 +1,109 @@ +module UnisonShare.Page.Catalog exposing (..) + +import Api +import Dict exposing (Dict) +import Env exposing (Env) +import Html exposing (Html, div, text) +import Html.Attributes exposing (class) +import Http +import Project exposing (ProjectListing) +import RemoteData exposing (RemoteData(..), WebData) +import UI + + + +-- MODEL + + +type Category + = Category String + + +type Catalog + = Catalog (Dict Category ProjectListing) + + +type alias LoadedModel = + { query : String + , catalog : Catalog + } + + +type alias Model = + WebData LoadedModel + + +init : Env -> ( Model, Cmd Msg ) +init env = + let + fetchCmd = + Api.projects + |> Api.toRequest Project.decodeList FetchProjectsFinished + |> Api.perform env.apiBasePath + in + ( Loading, fetchCmd ) + + + +-- UPDATE + + +type Msg + = UpdateQuery String + | ClearQuery + | FetchProjectsFinished (Result Http.Error (List ProjectListing)) + + +update : Msg -> Model -> ( Model, Cmd Msg ) +update msg model = + case ( msg, model ) of + ( FetchProjectsFinished projectsResult, _ ) -> + case projectsResult of + Err e -> + ( Failure e, Cmd.none ) + + Ok projects -> + let + catalog = + projectsToCatalog projects + in + ( Success { query = "", catalog = catalog }, Cmd.none ) + + ( UpdateQuery query, Success m ) -> + ( Success { m | query = query }, Cmd.none ) + + ( ClearQuery, Success m ) -> + ( Success { m | query = "" }, Cmd.none ) + + _ -> + ( model, Cmd.none ) + + +projectsToCatalog : List ProjectListing -> Catalog +projectsToCatalog _ = + Catalog Dict.empty + + + +-- VIEW + + +viewLoaded : LoadedModel -> Html Msg +viewLoaded _ = + div [] [ text "Catalog" ] + + +view : Model -> Html Msg +view model = + case model of + NotAsked -> + UI.nothing + + Loading -> + UI.nothing + + Failure _ -> + div [ class "" ] [ text "Error..." ] + + Success m -> + viewLoaded m