From b95338e7449434bfa560180e78fae781e1735f6b Mon Sep 17 00:00:00 2001 From: Eike Kettner Date: Tue, 9 Mar 2021 20:16:05 +0100 Subject: [PATCH 1/3] Remove old ui code in frontend --- modules/webapp/src/main/elm/App/View.elm | 335 ----- .../webapp/src/main/elm/Comp/AddressForm.elm | 47 - .../src/main/elm/Comp/AttachmentMeta.elm | 156 --- .../src/main/elm/Comp/BasicSizeField.elm | 28 - .../src/main/elm/Comp/CalEventInput.elm | 148 -- .../src/main/elm/Comp/ChangePasswordForm.elm | 69 - .../main/elm/Comp/ClassifierSettingsForm.elm | 58 - .../main/elm/Comp/CollectiveSettingsForm.elm | 143 -- .../webapp/src/main/elm/Comp/ColorTagger.elm | 85 +- .../webapp/src/main/elm/Comp/ContactField.elm | 65 - .../src/main/elm/Comp/CustomFieldForm.elm | 118 -- .../src/main/elm/Comp/CustomFieldInput.elm | 113 -- .../src/main/elm/Comp/CustomFieldManage.elm | 80 +- .../main/elm/Comp/CustomFieldMultiInput.elm | 84 +- .../src/main/elm/Comp/CustomFieldTable.elm | 54 - .../webapp/src/main/elm/Comp/DateInput.elm | 4 - .../webapp/src/main/elm/Comp/DetailEdit.elm | 155 +-- modules/webapp/src/main/elm/Comp/Dropdown.elm | 174 --- modules/webapp/src/main/elm/Comp/Dropzone.elm | 41 +- .../webapp/src/main/elm/Comp/EmailInput.elm | 65 - .../src/main/elm/Comp/EmailSettingsForm.elm | 106 +- .../src/main/elm/Comp/EmailSettingsManage.elm | 95 -- .../src/main/elm/Comp/EmailSettingsTable.elm | 42 - .../src/main/elm/Comp/EquipmentForm.elm | 22 - .../src/main/elm/Comp/EquipmentManage.elm | 108 +- .../src/main/elm/Comp/EquipmentTable.elm | 36 - .../src/main/elm/Comp/FieldListSelect.elm | 31 - .../src/main/elm/Comp/FixedDropdown.elm | 68 +- .../webapp/src/main/elm/Comp/FolderDetail.elm | 147 +- .../webapp/src/main/elm/Comp/FolderManage.elm | 82 +- .../webapp/src/main/elm/Comp/FolderSelect.elm | 90 +- .../webapp/src/main/elm/Comp/FolderTable.elm | 60 - .../src/main/elm/Comp/ImapSettingsForm.elm | 95 +- .../src/main/elm/Comp/ImapSettingsManage.elm | 95 -- .../src/main/elm/Comp/ImapSettingsTable.elm | 40 - modules/webapp/src/main/elm/Comp/IntField.elm | 43 - modules/webapp/src/main/elm/Comp/ItemCard.elm | 420 ------ .../webapp/src/main/elm/Comp/ItemCardList.elm | 53 +- .../webapp/src/main/elm/Comp/ItemDetail.elm | 7 - .../elm/Comp/ItemDetail/AttachmentTabMenu.elm | 181 --- .../elm/Comp/ItemDetail/MultiEditMenu.elm | 248 +--- .../src/main/elm/Comp/ItemDetail/View.elm | 1221 ----------------- modules/webapp/src/main/elm/Comp/ItemList.elm | 285 ---- modules/webapp/src/main/elm/Comp/ItemMail.elm | 86 +- .../webapp/src/main/elm/Comp/MappingForm.elm | 181 --- .../src/main/elm/Comp/MarkdownInput.elm | 133 -- modules/webapp/src/main/elm/Comp/MenuBar.elm | 3 +- .../src/main/elm/Comp/NotificationForm.elm | 167 +-- .../src/main/elm/Comp/NotificationList.elm | 62 - .../src/main/elm/Comp/NotificationManage.elm | 55 +- modules/webapp/src/main/elm/Comp/OrgForm.elm | 46 - .../webapp/src/main/elm/Comp/OrgManage.elm | 108 +- modules/webapp/src/main/elm/Comp/OrgTable.elm | 45 - .../src/main/elm/Comp/PasswordInput.elm | 31 - .../webapp/src/main/elm/Comp/PersonForm.elm | 55 - .../webapp/src/main/elm/Comp/PersonManage.elm | 119 +- .../webapp/src/main/elm/Comp/PersonTable.elm | 60 - .../src/main/elm/Comp/PowerSearchInput.elm | 1 - .../src/main/elm/Comp/ScanMailboxForm.elm | 433 +----- .../src/main/elm/Comp/ScanMailboxList.elm | 73 - .../src/main/elm/Comp/ScanMailboxManage.elm | 54 +- .../webapp/src/main/elm/Comp/SearchMenu.elm | 302 +--- .../src/main/elm/Comp/SearchStatsView.elm | 73 - .../webapp/src/main/elm/Comp/SentMails.elm | 83 -- .../webapp/src/main/elm/Comp/SourceForm.elm | 136 -- .../webapp/src/main/elm/Comp/SourceManage.elm | 202 +-- .../webapp/src/main/elm/Comp/SourceTable.elm | 75 - .../src/main/elm/Comp/StringListInput.elm | 40 - modules/webapp/src/main/elm/Comp/TagForm.elm | 27 +- .../webapp/src/main/elm/Comp/TagManage.elm | 111 +- .../webapp/src/main/elm/Comp/TagSelect.elm | 224 --- modules/webapp/src/main/elm/Comp/TagTable.elm | 40 - .../src/main/elm/Comp/UiSettingsForm.elm | 258 +--- .../src/main/elm/Comp/UiSettingsManage.elm | 33 +- modules/webapp/src/main/elm/Comp/UserForm.elm | 56 - .../webapp/src/main/elm/Comp/UserManage.elm | 85 +- .../webapp/src/main/elm/Comp/UserTable.elm | 51 - .../webapp/src/main/elm/Comp/YesNoDimmer.elm | 38 +- modules/webapp/src/main/elm/Data/Flags.elm | 1 - modules/webapp/src/main/elm/Main.elm | 8 +- .../main/elm/Page/CollectiveSettings/View.elm | 230 ---- .../webapp/src/main/elm/Page/Home/View.elm | 395 ------ .../src/main/elm/Page/ItemDetail/View.elm | 15 - .../webapp/src/main/elm/Page/Login/View.elm | 112 -- .../src/main/elm/Page/ManageData/View.elm | 185 --- .../src/main/elm/Page/NewInvite/View.elm | 114 -- .../webapp/src/main/elm/Page/Queue/View.elm | 282 ---- .../src/main/elm/Page/Register/View.elm | 166 --- .../webapp/src/main/elm/Page/Upload/View.elm | 252 ---- .../src/main/elm/Page/UserSettings/View.elm | 185 --- 90 files changed, 50 insertions(+), 11038 deletions(-) delete mode 100644 modules/webapp/src/main/elm/App/View.elm delete mode 100644 modules/webapp/src/main/elm/Comp/DateInput.elm delete mode 100644 modules/webapp/src/main/elm/Comp/ItemDetail/AttachmentTabMenu.elm delete mode 100644 modules/webapp/src/main/elm/Comp/ItemDetail/View.elm delete mode 100644 modules/webapp/src/main/elm/Comp/ItemList.elm delete mode 100644 modules/webapp/src/main/elm/Comp/MappingForm.elm delete mode 100644 modules/webapp/src/main/elm/Page/CollectiveSettings/View.elm delete mode 100644 modules/webapp/src/main/elm/Page/Home/View.elm delete mode 100644 modules/webapp/src/main/elm/Page/ItemDetail/View.elm delete mode 100644 modules/webapp/src/main/elm/Page/Login/View.elm delete mode 100644 modules/webapp/src/main/elm/Page/ManageData/View.elm delete mode 100644 modules/webapp/src/main/elm/Page/NewInvite/View.elm delete mode 100644 modules/webapp/src/main/elm/Page/Queue/View.elm delete mode 100644 modules/webapp/src/main/elm/Page/Register/View.elm delete mode 100644 modules/webapp/src/main/elm/Page/Upload/View.elm delete mode 100644 modules/webapp/src/main/elm/Page/UserSettings/View.elm diff --git a/modules/webapp/src/main/elm/App/View.elm b/modules/webapp/src/main/elm/App/View.elm deleted file mode 100644 index e3bfa466..00000000 --- a/modules/webapp/src/main/elm/App/View.elm +++ /dev/null @@ -1,335 +0,0 @@ -module App.View exposing (view) - -import App.Data exposing (..) -import Data.Flags -import Html exposing (..) -import Html.Attributes exposing (..) -import Html.Events exposing (onClick) -import Page exposing (Page(..)) -import Page.CollectiveSettings.View -import Page.Home.Data -import Page.Home.View -import Page.ItemDetail.View -import Page.Login.View -import Page.ManageData.View -import Page.NewInvite.View -import Page.Queue.View -import Page.Register.View -import Page.Upload.View -import Page.UserSettings.View - - -view : Model -> Html Msg -view model = - case model.page of - LoginPage _ -> - loginLayout model - - RegisterPage -> - registerLayout model - - _ -> - defaultLayout model - - -registerLayout : Model -> Html Msg -registerLayout model = - div [ class "register-layout" ] - [ viewRegister model - , footer model - ] - - -loginLayout : Model -> Html Msg -loginLayout model = - div [ class "login-layout" ] - [ viewLogin model - , footer model - ] - - -defaultLayout : Model -> Html Msg -defaultLayout model = - div [ class "default-layout" ] - [ div [ class "ui fixed top sticky attached large menu top-menu" ] - [ div [ class "ui fluid container" ] - [ a - [ class "header item narrow-item" - , Page.href HomePage - ] - [ img - [ class "image" - , src (model.flags.config.docspellAssetPath ++ "/img/logo-96.png") - ] - [] - , div [ class "content" ] - [ text model.flags.config.appName - ] - ] - , loginInfo model - ] - ] - , div - [ class "main-content" - , id "main-content" - ] - [ case model.page of - HomePage -> - viewHome model - - LoginPage _ -> - viewLogin model - - ManageDataPage -> - viewManageData model - - CollectiveSettingPage -> - viewCollectiveSettings model - - UserSettingPage -> - viewUserSettings model - - QueuePage -> - viewQueue model - - RegisterPage -> - viewRegister model - - UploadPage mid -> - viewUpload mid model - - NewInvitePage -> - viewNewInvite model - - ItemDetailPage id -> - viewItemDetail id model - ] - , footer model - ] - - -viewItemDetail : String -> Model -> Html Msg -viewItemDetail id model = - let - inav = - Page.Home.Data.itemNav id model.homeModel - in - Html.map ItemDetailMsg (Page.ItemDetail.View.view inav model.uiSettings model.itemDetailModel) - - -viewNewInvite : Model -> Html Msg -viewNewInvite model = - Html.map NewInviteMsg (Page.NewInvite.View.view model.flags model.newInviteModel) - - -viewUpload : Maybe String -> Model -> Html Msg -viewUpload mid model = - Html.map UploadMsg (Page.Upload.View.view mid model.uploadModel) - - -viewRegister : Model -> Html Msg -viewRegister model = - Html.map RegisterMsg (Page.Register.View.view model.flags model.registerModel) - - -viewQueue : Model -> Html Msg -viewQueue model = - Html.map QueueMsg (Page.Queue.View.view model.queueModel) - - -viewUserSettings : Model -> Html Msg -viewUserSettings model = - Html.map UserSettingsMsg (Page.UserSettings.View.view model.flags model.uiSettings model.userSettingsModel) - - -viewCollectiveSettings : Model -> Html Msg -viewCollectiveSettings model = - Html.map CollSettingsMsg - (Page.CollectiveSettings.View.view model.flags - model.uiSettings - model.collSettingsModel - ) - - -viewManageData : Model -> Html Msg -viewManageData model = - Html.map ManageDataMsg - (Page.ManageData.View.view model.flags - model.uiSettings - model.manageDataModel - ) - - -viewLogin : Model -> Html Msg -viewLogin model = - Html.map LoginMsg (Page.Login.View.view model.flags model.loginModel) - - -viewHome : Model -> Html Msg -viewHome model = - Html.map HomeMsg (Page.Home.View.view model.flags model.uiSettings model.homeModel) - - -menuEntry : Model -> Page -> List (Html Msg) -> Html Msg -menuEntry model page children = - a - [ classList - [ ( "icon item", True ) - , ( "active", model.page == page ) - ] - , Page.href page - ] - children - - -loginInfo : Model -> Html Msg -loginInfo model = - div [ class "right menu" ] - (case model.flags.account of - Just acc -> - [ div - [ class "ui dropdown icon link item" - , href "#" - , onClick ToggleUserMenu - , title ("Logged in as " ++ Data.Flags.accountString acc) - ] - [ i [ class "user alternate icon" ] [] - , div - [ classList - [ ( "left menu", True ) - , ( "transition visible", model.userMenuOpen ) - , ( "transition hidden", not model.userMenuOpen ) - ] - ] - [ div [ class "header" ] - [ i [ class "user outline icon" ] [] - , Data.Flags.accountString acc |> text - ] - , div [ class "ui divider" ] [] - , menuEntry model - CollectiveSettingPage - [ i [ class "users circle icon" ] [] - , text "Collective Profile" - ] - , menuEntry model - UserSettingPage - [ i [ class "user circle icon" ] [] - , text "User Profile" - ] - , div [ class "divider" ] [] - , a - [ class "icon item" - , href "#" - , onClick Logout - ] - [ i [ class "sign out icon" ] [] - , text "Logout" - ] - ] - ] - , div - [ class "ui dropdown icon link item" - , onClick ToggleNavMenu - , href "#" - ] - [ i [ class "ui bars icon" ] [] - , div - [ classList - [ ( "left menu", True ) - , ( "transition visible", model.navMenuOpen ) - , ( "transition hidden", not model.navMenuOpen ) - ] - ] - [ menuEntry model - HomePage - [ img - [ class "image icon" - , src (model.flags.config.docspellAssetPath ++ "/img/logo-mc-96.png") - ] - [] - , text "Items" - ] - , div [ class "divider" ] [] - , menuEntry model - ManageDataPage - [ i [ class "cubes icon" ] [] - , text "Manage Data" - ] - , div [ class "divider" ] [] - , menuEntry model - (UploadPage Nothing) - [ i [ class "upload icon" ] [] - , text "Upload files" - ] - , menuEntry model - QueuePage - [ i [ class "tachometer alternate icon" ] [] - , text "Processing Queue" - ] - , div - [ classList - [ ( "divider", True ) - , ( "invisible", model.flags.config.signupMode /= "invite" ) - ] - ] - [] - , a - [ classList - [ ( "icon item", True ) - , ( "invisible", model.flags.config.signupMode /= "invite" ) - ] - , Page.href NewInvitePage - ] - [ i [ class "key icon" ] [] - , text "New Invites" - ] - , div [ class "divider" ] [] - , a - [ class "item" - , href "https://docspell.org/docs" - , target "_new" - , title "Opens https://docspell.org/docs" - ] - [ i [ class "help icon" ] [] - , text "Help" - , span [ class "ui right floated" ] - [ i [ class "external link icon" ] [] - ] - ] - ] - ] - ] - - Nothing -> - [ a - [ class "item" - , Page.href (Page.loginPage model.page) - ] - [ text "Login" - ] - , a - [ class "item" - , Page.href RegisterPage - ] - [ text "Register" - ] - ] - ) - - -footer : Model -> Html Msg -footer model = - div [ class "ui footer" ] - [ div [ class "ui center aligned container" ] - [ a [ href "https://github.com/eikek/docspell" ] - [ i [ class "ui github icon" ] [] - ] - , span [] - [ text "Docspell " - , text model.version.version - , text " (#" - , String.left 8 model.version.gitCommit |> text - , text ")" - ] - ] - ] diff --git a/modules/webapp/src/main/elm/Comp/AddressForm.elm b/modules/webapp/src/main/elm/Comp/AddressForm.elm index dc581b5f..8b7a439d 100644 --- a/modules/webapp/src/main/elm/Comp/AddressForm.elm +++ b/modules/webapp/src/main/elm/Comp/AddressForm.elm @@ -4,7 +4,6 @@ module Comp.AddressForm exposing , emptyModel , getAddress , update - , view , view2 ) @@ -109,52 +108,6 @@ update msg model = ( { model | country = m1 }, Cmd.map CountryMsg c1 ) -view : UiSettings -> Model -> Html Msg -view settings model = - div [ class "ui form" ] - [ div - [ class "field" - ] - [ label [] [ text "Street" ] - , input - [ type_ "text" - , onInput SetStreet - , placeholder "Street" - , value model.street - ] - [] - ] - , div - [ class "field" - ] - [ label [] [ text "Zip Code" ] - , input - [ type_ "text" - , onInput SetZip - , placeholder "Zip" - , value model.zip - ] - [] - ] - , div - [ class "field" - ] - [ label [] [ text "City" ] - , input - [ type_ "text" - , onInput SetCity - , placeholder "City" - , value model.city - ] - [] - ] - , div [ class "field" ] - [ label [] [ text "Country" ] - , Html.map CountryMsg (Comp.Dropdown.view settings model.country) - ] - ] - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/AttachmentMeta.elm b/modules/webapp/src/main/elm/Comp/AttachmentMeta.elm index cc6d3c7f..780e4561 100644 --- a/modules/webapp/src/main/elm/Comp/AttachmentMeta.elm +++ b/modules/webapp/src/main/elm/Comp/AttachmentMeta.elm @@ -3,7 +3,6 @@ module Comp.AttachmentMeta exposing , Msg , init , update - , view , view2 ) @@ -62,161 +61,6 @@ update msg model = ---- View - - -view : Model -> Html Msg -view model = - div [] - [ h3 [ class "ui header" ] - [ text "Extracted Meta Data" - ] - , case model.meta of - NotAvailable -> - div [ class "ui active dimmer" ] - [ div [ class "ui loader" ] - [] - ] - - Failure msg -> - div [ class "ui error message" ] - [ text msg - ] - - Success data -> - viewData data - ] - - -viewData : AttachmentMeta -> Html Msg -viewData meta = - div [] - [ div [ class "ui dividing header" ] - [ text "Content" - ] - , div [ class "extracted-text" ] - [ text meta.content - ] - , div [ class "ui dividing header" ] - [ text "Labels" - ] - , div [] - [ div [ class "ui horizontal list" ] - (List.map renderLabelItem meta.labels) - ] - , div [ class "ui dividing header" ] - [ text "Proposals" - ] - , viewProposals meta.proposals - ] - - -viewProposals : ItemProposals -> Html Msg -viewProposals props = - let - mkItem n lbl = - div [ class "item" ] - [ div [ class "ui label" ] - [ text lbl.name - , div [ class "detail" ] - [ (String.fromInt (n + 1) ++ ".") - |> text - ] - ] - ] - - mkTimeItem ms = - div [ class "item" ] - [ div [ class "ui label" ] - [ Util.Time.formatDateShort ms |> text - ] - ] - in - div [] - [ div [ class "ui small header" ] - [ text "Correspondent Organization" - ] - , div [ class "ui horizontal list" ] - (List.indexedMap mkItem props.corrOrg) - , div [ class "ui small header" ] - [ text "Correspondent Person" - ] - , div [ class "ui horizontal list" ] - (List.indexedMap mkItem props.corrPerson) - , div [ class "ui small header" ] - [ text "Concerning Person" - ] - , div [ class "ui horizontal list" ] - (List.indexedMap mkItem props.concPerson) - , div [ class "ui small header" ] - [ text "Concerning Equipment" - ] - , div [ class "ui horizontal list" ] - (List.indexedMap mkItem props.concEquipment) - , div [ class "ui small header" ] - [ text "Item Date" - ] - , div [ class "ui horizontal list" ] - (List.map mkTimeItem props.itemDate) - , div [ class "ui small header" ] - [ text "Item Due Date" - ] - , div [ class "ui horizontal list" ] - (List.map mkTimeItem props.dueDate) - ] - - -renderLabelItem : Label -> Html Msg -renderLabelItem label = - div [ class "item" ] - [ renderLabel label - ] - - -renderLabel : Label -> Html Msg -renderLabel label = - let - icon = - case label.labelType of - "organization" -> - "factory icon" - - "person" -> - "user icon" - - "location" -> - "map marker icon" - - "date" -> - "calendar alternate icon" - - "misc" -> - "help icon" - - "email" -> - "at icon" - - "website" -> - "external alternate icon" - - _ -> - "tag icon" - in - div - [ class "ui basic label" - , title label.labelType - ] - [ i [ class icon ] [] - , text label.label - , div [ class "detail" ] - [ String.fromInt label.beginPos |> text - , text "-" - , String.fromInt label.endPos |> text - ] - ] - - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/BasicSizeField.elm b/modules/webapp/src/main/elm/Comp/BasicSizeField.elm index 97a8fe55..590682fd 100644 --- a/modules/webapp/src/main/elm/Comp/BasicSizeField.elm +++ b/modules/webapp/src/main/elm/Comp/BasicSizeField.elm @@ -1,7 +1,6 @@ module Comp.BasicSizeField exposing ( Msg , update - , view , view2 ) @@ -24,33 +23,6 @@ update msg = ---- View - - -view : String -> BasicSize -> Html Msg -view labelTxt current = - div [ class "grouped fields" ] - (label [] [ text labelTxt ] - :: List.map (makeField current) Data.BasicSize.all - ) - - -makeField : BasicSize -> BasicSize -> Html Msg -makeField current element = - div [ class "field" ] - [ div [ class "ui radio checkbox" ] - [ input - [ type_ "radio" - , checked (current == element) - , onCheck (\_ -> Toggle element) - ] - [] - , label [] [ text (Data.BasicSize.label element) ] - ] - ] - - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/CalEventInput.elm b/modules/webapp/src/main/elm/Comp/CalEventInput.elm index 3ffbd7b0..f69fb809 100644 --- a/modules/webapp/src/main/elm/Comp/CalEventInput.elm +++ b/modules/webapp/src/main/elm/Comp/CalEventInput.elm @@ -4,7 +4,6 @@ module Comp.CalEventInput exposing , init , initDefault , update - , view , view2 ) @@ -127,153 +126,6 @@ update flags ev msg model = ---- View - - -view : String -> CalEvent -> Model -> Html Msg -view extraClasses ev model = - let - yearLen = - Basics.max 4 (String.length ev.year) - - otherLen str = - Basics.max 2 (String.length str) - in - div - [ classList - [ ( extraClasses, True ) - ] - ] - [ div [ class "calevent-input" ] - [ div [] - [ label [] [ text "Weekday" ] - , input - [ type_ "text" - , class "time-input" - , size - (Maybe.map otherLen ev.weekday - |> Maybe.withDefault 4 - ) - , Maybe.withDefault "" ev.weekday - |> value - , onInput SetWeekday - ] - [] - ] - , div [] - [ label [] [ text "Year" ] - , input - [ type_ "text" - , class "time-input" - , size yearLen - , value ev.year - , onInput SetYear - ] - [] - ] - , div [ class "date separator" ] - [ text "–" - ] - , div [] - [ label [] [ text "Month" ] - , input - [ type_ "text" - , class "time-input" - , size (otherLen ev.month) - , value ev.month - , onInput SetMonth - ] - [] - ] - , div [ class "date separator" ] - [ text "–" - ] - , div [] - [ label [] [ text "Day" ] - , input - [ type_ "text" - , class "time-input" - , size (otherLen ev.day) - , value ev.day - , onInput SetDay - ] - [] - ] - , div [ class "datetime separator" ] - [ text " " - ] - , div [] - [ label [] [ text "Hour" ] - , input - [ type_ "text" - , class "time-input" - , size (otherLen ev.hour) - , value ev.hour - , onInput SetHour - ] - [] - ] - , div [ class "time separator" ] - [ text ":" - ] - , div [] - [ label [] [ text "Minute" ] - , input - [ type_ "text" - , class "time-input" - , size (otherLen ev.minute) - , value ev.minute - , onInput SetMinute - ] - [] - ] - ] - , div - [ classList - [ ( "ui basic red pointing label", True ) - , ( "hidden invisible", not (isCheckError model) ) - ] - ] - [ text "Error: " - , Maybe.map .message model.checkResult - |> Maybe.withDefault "" - |> text - ] - , div - [ classList - [ ( "ui message", True ) - , ( "hidden invisible" - , model.checkResult == Nothing || isCheckError model - ) - ] - ] - [ dl [] - [ dt [] - [ text "Schedule: " - ] - , dd [] - [ code [] - [ Maybe.andThen .event model.checkResult - |> Maybe.withDefault "" - |> text - ] - ] - , dt [] - [ text "Next: " - ] - , dd [] - (Maybe.map .next model.checkResult - |> Maybe.withDefault [] - |> List.map Util.Time.formatDateTime - |> List.map text - |> List.intersperse (br [] []) - ) - ] - ] - ] - - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/ChangePasswordForm.elm b/modules/webapp/src/main/elm/Comp/ChangePasswordForm.elm index 757ee5a6..6c2e9410 100644 --- a/modules/webapp/src/main/elm/Comp/ChangePasswordForm.elm +++ b/modules/webapp/src/main/elm/Comp/ChangePasswordForm.elm @@ -3,7 +3,6 @@ module Comp.ChangePasswordForm exposing , Msg(..) , emptyModel , update - , view , view2 ) @@ -177,74 +176,6 @@ update flags msg model = ---- View - - -view : Model -> Html Msg -view model = - div - [ classList - [ ( "ui form", True ) - , ( "error", List.isEmpty model.errors |> not ) - , ( "success", model.successMsg /= "" ) - ] - ] - [ div - [ classList - [ ( "required field", True ) - , ( "error", model.current == Nothing ) - ] - ] - [ label [] [ text "Current Password" ] - , Html.map SetCurrent (Comp.PasswordInput.view model.current model.currentModel) - ] - , div - [ classList - [ ( "required field", True ) - , ( "error", model.newPass1 == Nothing ) - ] - ] - [ label [] [ text "New Password" ] - , Html.map SetNew1 (Comp.PasswordInput.view model.newPass1 model.pass1Model) - ] - , div - [ classList - [ ( "required field", True ) - , ( "error", model.newPass2 == Nothing ) - ] - ] - [ label [] [ text "New Password (repeat)" ] - , Html.map SetNew2 (Comp.PasswordInput.view model.newPass2 model.pass2Model) - ] - , div [ class "ui horizontal divider" ] [] - , div [ class "ui success message" ] - [ text model.successMsg - ] - , div [ class "ui error message" ] - [ case model.errors of - a :: [] -> - text a - - _ -> - ul [ class "ui list" ] - (List.map (\em -> li [] [ text em ]) model.errors) - ] - , div [ class "ui horizontal divider" ] [] - , button [ class "ui primary button", onClick Submit ] - [ text "Submit" - ] - , div - [ classList - [ ( "ui dimmer", True ) - , ( "active", model.loading ) - ] - ] - [ div [ class "ui loader" ] [] - ] - ] - - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/ClassifierSettingsForm.elm b/modules/webapp/src/main/elm/Comp/ClassifierSettingsForm.elm index e03a87a6..3850dab2 100644 --- a/modules/webapp/src/main/elm/Comp/ClassifierSettingsForm.elm +++ b/modules/webapp/src/main/elm/Comp/ClassifierSettingsForm.elm @@ -4,7 +4,6 @@ module Comp.ClassifierSettingsForm exposing , getSettings , init , update - , view , view2 ) @@ -181,63 +180,6 @@ update flags msg model = ---- View - - -view : UiSettings -> Model -> Html Msg -view settings model = - let - catListTypeItem = - Comp.FixedDropdown.Item - model.categoryListType - (Data.ListType.label model.categoryListType) - in - div [] - [ Markdown.toHtml [ class "ui basic segment" ] - """ - -Auto-tagging works by learning from existing documents. The more -documents you have correctly tagged, the better. Learning is done -periodically based on a schedule. You can specify tag-groups that -should either be used (whitelist) or not used (blacklist) for -learning. - -Use an empty whitelist to disable auto tagging. - - """ - , div [ class "field" ] - [ label [] [ text "Is the following a blacklist or whitelist?" ] - , Html.map CategoryListTypeMsg - (Comp.FixedDropdown.view (Just catListTypeItem) model.categoryListTypeModel) - ] - , div [ class "field" ] - [ label [] - [ case model.categoryListType of - Data.ListType.Whitelist -> - text "Include tag categories for learning" - - Data.ListType.Blacklist -> - text "Exclude tag categories from learning" - ] - , Html.map CategoryListMsg - (Comp.Dropdown.view settings model.categoryListModel) - ] - , Html.map ItemCountMsg - (Comp.IntField.viewWithInfo - "The maximum number of items to learn from, order by date newest first. Use 0 to mean all." - model.itemCount - "field" - model.itemCountModel - ) - , div [ class "field" ] - [ label [] [ text "Schedule" ] - , Html.map ScheduleMsg - (Comp.CalEventInput.view "" (Data.Validated.value model.schedule) model.scheduleModel) - ] - ] - - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/CollectiveSettingsForm.elm b/modules/webapp/src/main/elm/Comp/CollectiveSettingsForm.elm index 5062e010..5b28bb4e 100644 --- a/modules/webapp/src/main/elm/Comp/CollectiveSettingsForm.elm +++ b/modules/webapp/src/main/elm/Comp/CollectiveSettingsForm.elm @@ -4,7 +4,6 @@ module Comp.CollectiveSettingsForm exposing , getSettings , init , update - , view , view2 ) @@ -198,148 +197,6 @@ update flags msg model = ---- View - - -view : Flags -> UiSettings -> Model -> Html Msg -view flags settings model = - div - [ classList - [ ( "ui form error success", True ) - , ( "error", Maybe.map .success model.fullTextReIndexResult == Just False ) - , ( "success", Maybe.map .success model.fullTextReIndexResult == Just True ) - ] - ] - [ h3 [ class "ui dividing header" ] - [ text "Document Language" - ] - , div [ class "field" ] - [ label [] [ text "Document Language" ] - , Html.map LangDropdownMsg (Comp.Dropdown.view settings model.langModel) - , span [ class "small-info" ] - [ text "The language of your documents. This helps text recognition (OCR) and text analysis." - ] - ] - , h3 - [ classList - [ ( "ui dividing header", True ) - , ( "invisible hidden", not flags.config.integrationEnabled ) - ] - ] - [ text "Integration Endpoint" - ] - , div - [ classList - [ ( "field", True ) - , ( "invisible hidden", not flags.config.integrationEnabled ) - ] - ] - [ div [ class "ui checkbox" ] - [ input - [ type_ "checkbox" - , onCheck (\_ -> ToggleIntegrationEndpoint) - , checked model.intEnabled - ] - [] - , label [] [ text "Enable integration endpoint" ] - , span [ class "small-info" ] - [ text "The integration endpoint allows (local) applications to submit files. " - , text "You can choose to disable it for your collective." - ] - ] - ] - , h3 - [ classList - [ ( "ui dividing header", True ) - , ( "invisible hidden", not flags.config.fullTextSearchEnabled ) - ] - ] - [ text "Full-Text Search" - ] - , div - [ classList - [ ( "inline field", True ) - , ( "invisible hidden", not flags.config.fullTextSearchEnabled ) - ] - ] - [ div [ class "ui action input" ] - [ input - [ type_ "text" - , value model.fullTextConfirmText - , onInput SetFullTextConfirm - ] - [] - , button - [ class "ui primary right labeled icon button" - , onClick TriggerReIndex - ] - [ i [ class "refresh icon" ] [] - , text "Re-Index All Data" - ] - ] - , div [ class "small-info" ] - [ text "This starts a task that clears the full-text index and re-indexes all your data again." - , text "You must type OK before clicking the button to avoid accidental re-indexing." - ] - , renderResultMessage model.fullTextReIndexResult - ] - , h3 - [ classList - [ ( "ui dividing header", True ) - , ( "invisible hidden", not flags.config.showClassificationSettings ) - ] - ] - [ text "Auto-Tagging" - ] - , div - [ classList - [ ( "field", True ) - , ( "invisible hidden", not flags.config.showClassificationSettings ) - ] - ] - [ Html.map ClassifierSettingMsg - (Comp.ClassifierSettingsForm.view settings model.classifierModel) - , div [ class "ui vertical segment" ] - [ button - [ class "ui small secondary basic button" - , title "Starts a task to train a classifier" - , onClick StartClassifierTask - ] - [ text "Start now" - ] - , renderResultMessage model.startClassifierResult - ] - ] - , div [ class "ui divider" ] [] - , button - [ classList - [ ( "ui primary button", True ) - , ( "disabled", getSettings model |> Data.Validated.isInvalid ) - ] - , onClick SaveSettings - ] - [ text "Save" - ] - ] - - -renderResultMessage : Maybe BasicResult -> Html msg -renderResultMessage result = - div - [ classList - [ ( "ui message", True ) - , ( "error", Maybe.map .success result == Just False ) - , ( "success", Maybe.map .success result == Just True ) - , ( "hidden invisible", result == Nothing ) - ] - ] - [ Maybe.map .message result - |> Maybe.withDefault "" - |> text - ] - - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/ColorTagger.elm b/modules/webapp/src/main/elm/Comp/ColorTagger.elm index 46745f81..a606b337 100644 --- a/modules/webapp/src/main/elm/Comp/ColorTagger.elm +++ b/modules/webapp/src/main/elm/Comp/ColorTagger.elm @@ -4,7 +4,6 @@ module Comp.ColorTagger exposing , ViewOpts , init , update - , view , view2 ) @@ -85,7 +84,7 @@ update msg model = ---- View +--- View2 type alias ViewOpts = @@ -95,88 +94,6 @@ type alias ViewOpts = } -view : FormData -> ViewOpts -> Model -> Html Msg -view data opts model = - div [ class "field" ] - [ label [] [ text opts.label ] - , div [ class "inline field" ] - [ Html.map LeftMsg - (Comp.FixedDropdown.viewString - model.leftSelect - model.leftDropdown - ) - ] - , div [ class "field" ] - [ chooseColor - (AddPair data) - Data.Color.all - Nothing - ] - , renderFormData opts data - , span - [ classList - [ ( "small-info", True ) - , ( "invisible hidden", opts.description == Nothing ) - ] - ] - [ Maybe.withDefault "" opts.description - |> text - ] - ] - - -renderFormData : ViewOpts -> FormData -> Html Msg -renderFormData opts data = - let - values = - Dict.toList data - - renderItem ( k, v ) = - div [ class "item" ] - [ a - [ class "link icon" - , href "#" - , onClick (DeleteItem data k) - ] - [ i [ class "trash icon" ] [] - ] - , a - [ class "link icon" - , href "#" - , onClick (EditItem k v) - ] - [ i [ class "edit icon" ] [] - ] - , opts.renderItem ( k, v ) - ] - in - div [ class "ui list" ] - (List.map renderItem values) - - -chooseColor : (Color -> msg) -> List Color -> Maybe String -> Html msg -chooseColor tagger colors mtext = - let - renderLabel color = - a - [ class ("ui large label " ++ Data.Color.toString color) - , href "#" - , onClick (tagger color) - ] - [ Maybe.withDefault - (Data.Color.toString color) - mtext - |> text - ] - in - div [ class "ui labels" ] <| - List.map renderLabel colors - - - ---- View2 - - view2 : FormData -> ViewOpts -> Model -> Html Msg view2 data opts model = div [ class "flex flex-col" ] diff --git a/modules/webapp/src/main/elm/Comp/ContactField.elm b/modules/webapp/src/main/elm/Comp/ContactField.elm index c91946e8..986d94de 100644 --- a/modules/webapp/src/main/elm/Comp/ContactField.elm +++ b/modules/webapp/src/main/elm/Comp/ContactField.elm @@ -4,8 +4,6 @@ module Comp.ContactField exposing , emptyModel , getContacts , update - , view - , view1 , view2 ) @@ -119,69 +117,6 @@ update msg model = ) -view : UiSettings -> Model -> Html Msg -view settings model = - view1 settings False model - - -view1 : UiSettings -> Bool -> Model -> Html Msg -view1 _ compact model = - div [] - [ div [ classList [ ( "fields", not compact ) ] ] - [ div - [ classList - [ ( "field", True ) - , ( "four wide", not compact ) - ] - ] - [ Html.map TypeMsg - (Comp.FixedDropdown.view - (Maybe.map makeDropdownItem model.selectedKind) - model.kind - ) - ] - , div - [ classList - [ ( "twelve wide", not compact ) - , ( "field", True ) - ] - ] - [ div [ class "ui action input" ] - [ input - [ type_ "text" - , onInput SetValue - , value model.value - ] - [] - , a [ class "ui button", onClick AddContact, href "#" ] - [ text "Add" - ] - ] - ] - ] - , div - [ classList - [ ( "field", True ) - , ( "invisible", List.isEmpty model.items ) - ] - ] - [ div [ class "ui vertical secondary fluid menu" ] - (List.map renderItem model.items) - ] - ] - - -renderItem : Contact -> Html Msg -renderItem contact = - div [ class "link item", onClick (Select contact) ] - [ i [ class "delete icon" ] [] - , div [ class "ui blue label" ] - [ text contact.kind - ] - , text contact.value - ] - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/CustomFieldForm.elm b/modules/webapp/src/main/elm/Comp/CustomFieldForm.elm index 4bf5ed3b..2881a4dc 100644 --- a/modules/webapp/src/main/elm/Comp/CustomFieldForm.elm +++ b/modules/webapp/src/main/elm/Comp/CustomFieldForm.elm @@ -2,12 +2,10 @@ module Comp.CustomFieldForm exposing ( Model , Msg , ViewSettings - , fullViewSettings , init , initEmpty , makeField , update - , view , view2 ) @@ -195,122 +193,6 @@ type alias ViewSettings = } -fullViewSettings : ViewSettings -fullViewSettings = - { classes = "ui error form segment" - , showControls = True - } - - -view : ViewSettings -> Model -> Html Msg -view viewSettings model = - let - mkItem cft = - Comp.FixedDropdown.Item cft (Data.CustomFieldType.label cft) - in - div [ class viewSettings.classes ] - ([ Html.map DeleteMsg (Comp.YesNoDimmer.view model.deleteDimmer) - , if model.field.id == "" then - div [] - [ text "Create a new custom field." - ] - - else - div [] - [ text "Modify this custom field. Note that changing the format may " - , text "result in invisible values in the ui, if they don't comply to the new format!" - ] - , div - [ classList - [ ( "ui message", True ) - , ( "invisible hidden", model.result == Nothing ) - , ( "error", Maybe.map .success model.result == Just False ) - , ( "success", Maybe.map .success model.result == Just True ) - ] - ] - [ Maybe.map .message model.result - |> Maybe.withDefault "" - |> text - ] - , div [ class "required field" ] - [ label [] [ text "Name" ] - , input - [ type_ "text" - , onInput SetName - , model.name - |> Maybe.withDefault "" - |> value - ] - [] - , div [ class "small-info" ] - [ text "The name uniquely identifies this field. It must be a valid " - , text "identifier, not contain spaces or weird characters." - ] - ] - , div [ class "required field" ] - [ label [] [ text "Field Format" ] - , Html.map FTypeMsg - (Comp.FixedDropdown.view - (Maybe.map mkItem model.ftype) - model.ftypeModel - ) - , div [ class "small-info" ] - [ text "A field must have a format. Values are validated " - , text "according to this format." - ] - ] - , div [ class "field" ] - [ label [] [ text "Label" ] - , input - [ type_ "text" - , onInput SetLabel - , model.label - |> Maybe.withDefault "" - |> value - ] - [] - , div [ class "small-info" ] - [ text "The user defined label for this field. This is used to represent " - , text "this field in the ui. If not present, the name is used." - ] - ] - ] - ++ (if viewSettings.showControls then - viewButtons model - - else - [] - ) - ) - - -viewButtons : Model -> List (Html Msg) -viewButtons model = - [ div [ class "ui divider" ] [] - , button - [ class "ui primary button" - , onClick SubmitForm - ] - [ text "Submit" - ] - , button - [ class "ui button" - , onClick GoBack - ] - [ text "Back" - ] - , button - [ classList - [ ( "ui red button", True ) - , ( "invisible hidden", model.field.id == "" ) - ] - , onClick RequestDelete - ] - [ text "Delete" - ] - ] - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/CustomFieldInput.elm b/modules/webapp/src/main/elm/Comp/CustomFieldInput.elm index 6ba20508..f725c66d 100644 --- a/modules/webapp/src/main/elm/Comp/CustomFieldInput.elm +++ b/modules/webapp/src/main/elm/Comp/CustomFieldInput.elm @@ -7,7 +7,6 @@ module Comp.CustomFieldInput exposing , initWith , update , updateSearch - , view , view2 ) @@ -329,118 +328,6 @@ hasWildCards msg = ---- View - - -removeButton : String -> Html Msg -removeButton classes = - a - [ class "ui icon button" - , class classes - , href "#" - , title "Remove this value" - , onClick Remove - ] - [ i [ class "trash alternate outline icon" ] [] - ] - - -view : String -> Maybe String -> Model -> Html Msg -view classes icon model = - let - error = - errorMsg model - in - div - [ class classes - , classList - [ ( "error", error /= Nothing ) - ] - ] - [ label [] - [ mkLabel model |> text - ] - , makeInput icon model - , div - [ class "ui red pointing basic label" - , classList - [ ( "invisible hidden", error == Nothing ) - ] - ] - [ Maybe.withDefault "" error |> text - ] - ] - - -makeInput : Maybe String -> Model -> Html Msg -makeInput icon model = - let - iconOr c = - Maybe.withDefault c icon - in - case model.fieldModel of - TextField v -> - div [ class "ui action left icon input" ] - [ input - [ type_ "text" - , Maybe.withDefault "" v |> value - , onInput SetText - ] - [] - , removeButton "" - , i [ class (iconOr <| Icons.customFieldType Data.CustomFieldType.Text) ] [] - ] - - NumberField nm -> - div [ class "ui action left icon input" ] - [ input - [ type_ "text" - , value nm.input - , onInput NumberMsg - ] - [] - , removeButton "" - , i [ class (iconOr <| Icons.customFieldType Data.CustomFieldType.Numeric) ] [] - ] - - MoneyField nm -> - div [ class "ui action left icon input" ] - [ input - [ type_ "text" - , value nm.input - , onInput MoneyMsg - ] - [] - , removeButton "" - , i [ class (iconOr <| Icons.customFieldType Data.CustomFieldType.Money) ] [] - ] - - BoolField b -> - div [ class "ui container" ] - [ div [ class "ui checkbox" ] - [ input - [ type_ "checkbox" - , onCheck (\_ -> ToggleBool) - , checked b - ] - [] - , label [] - [ text (mkLabel model) - ] - ] - , removeButton "right floated" - ] - - DateField v dp -> - div [ class "ui action left icon input" ] - [ Html.map DateMsg - (Comp.DatePicker.view v Comp.DatePicker.defaultSettings dp) - , removeButton "" - , i [ class (iconOr <| Icons.customFieldType Data.CustomFieldType.Date) ] [] - ] - - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/CustomFieldManage.elm b/modules/webapp/src/main/elm/Comp/CustomFieldManage.elm index a056186f..b6c596da 100644 --- a/modules/webapp/src/main/elm/Comp/CustomFieldManage.elm +++ b/modules/webapp/src/main/elm/Comp/CustomFieldManage.elm @@ -4,7 +4,6 @@ module Comp.CustomFieldManage exposing , empty , init , update - , view , view2 ) @@ -133,73 +132,6 @@ update flags msg model = ---- View - - -view : Flags -> Model -> Html Msg -view flags model = - case model.detailModel of - Just dm -> - viewDetail flags dm - - Nothing -> - viewTable model - - -viewDetail : Flags -> Comp.CustomFieldForm.Model -> Html Msg -viewDetail flags detailModel = - let - viewSettings = - Comp.CustomFieldForm.fullViewSettings - in - div [] - [ Html.map DetailMsg (Comp.CustomFieldForm.view viewSettings detailModel) - ] - - -viewTable : Model -> Html Msg -viewTable model = - div [] - [ div [ class "ui secondary menu" ] - [ div [ class "horizontally fitted item" ] - [ div [ class "ui icon input" ] - [ input - [ type_ "text" - , onInput SetQuery - , value model.query - , placeholder "Search…" - ] - [] - , i [ class "ui search icon" ] - [] - ] - ] - , div [ class "right menu" ] - [ div [ class "item" ] - [ a - [ class "ui primary button" - , href "#" - , onClick InitNewCustomField - ] - [ i [ class "plus icon" ] [] - , text "New CustomField" - ] - ] - ] - ] - , Html.map TableMsg (Comp.CustomFieldTable.view model.tableModel model.fields) - , div - [ classList - [ ( "ui dimmer", True ) - , ( "active", model.loading ) - ] - ] - [ div [ class "ui loader" ] [] - ] - ] - - - --- View2 @@ -217,15 +149,17 @@ viewDetail2 : Flags -> Comp.CustomFieldForm.Model -> Html Msg viewDetail2 _ detailModel = let viewSettings = - Comp.CustomFieldForm.fullViewSettings + { showControls = True + , classes = "" + } in div [] - ([ if detailModel.field.id == "" then + ((if detailModel.field.id == "" then h3 [ class S.header2 ] [ text "Create new custom field" ] - else + else h3 [ class S.header2 ] [ Util.CustomField.nameOrLabel detailModel.field |> text , div [ class "opacity-50 text-sm" ] @@ -233,8 +167,8 @@ viewDetail2 _ detailModel = , text detailModel.field.id ] ] - ] - ++ List.map (Html.map DetailMsg) (Comp.CustomFieldForm.view2 viewSettings detailModel) + ) + :: List.map (Html.map DetailMsg) (Comp.CustomFieldForm.view2 viewSettings detailModel) ) diff --git a/modules/webapp/src/main/elm/Comp/CustomFieldMultiInput.elm b/modules/webapp/src/main/elm/Comp/CustomFieldMultiInput.elm index 394ee489..73c8981a 100644 --- a/modules/webapp/src/main/elm/Comp/CustomFieldMultiInput.elm +++ b/modules/webapp/src/main/elm/Comp/CustomFieldMultiInput.elm @@ -12,7 +12,6 @@ module Comp.CustomFieldMultiInput exposing , setValues , update , updateSearch - , view , view2 ) @@ -214,18 +213,9 @@ update1 forSearch flags msg model = fSelect = mkFieldSelect (currentOptions model.allFields visible) - -- have to re-state the open menu when this is invoked - -- from a click in the dropdown - -- this hack is only required for the semantic-ui version - fSelectDropdown = - fSelect.dropdown - - dropdownOpen = - { fSelectDropdown | menuOpen = flags.config.uiVersion /= 2 } - model_ = { model - | fieldSelect = { fSelect | dropdown = dropdownOpen } + | fieldSelect = fSelect , visibleFields = visible } @@ -321,7 +311,7 @@ update1 forSearch flags msg model = ---- View +--- View2 type alias ViewSettings = @@ -331,76 +321,6 @@ type alias ViewSettings = } - ---- View - - -view : ViewSettings -> Model -> Html Msg -view viewSettings model = - div [ class viewSettings.classes ] - (viewMenuBar viewSettings model - :: List.map (viewCustomField viewSettings model) (visibleFields model) - ) - - -viewMenuBar : ViewSettings -> Model -> Html Msg -viewMenuBar viewSettings model = - let - { dropdown, selected } = - model.fieldSelect - in - div - [ classList - [ ( "field", True ) - , ( "ui action input", viewSettings.showAddButton ) - ] - ] - (Html.map FieldSelectMsg - (Comp.FixedDropdown.viewStyled "fluid" (Maybe.map mkItem selected) dropdown) - :: (if viewSettings.showAddButton then - [ addFieldLink "" model - ] - - else - [] - ) - ) - - -viewCustomField : ViewSettings -> Model -> CustomField -> Html Msg -viewCustomField viewSettings model field = - let - visibleField = - Dict.get field.name model.visibleFields - in - case visibleField of - Just vf -> - Html.map (CustomFieldInputMsg field) - (Comp.CustomFieldInput.view "field" - (viewSettings.fieldIcon vf.field) - vf.inputModel - ) - - Nothing -> - span [] [] - - -addFieldLink : String -> Model -> Html Msg -addFieldLink classes _ = - a - [ class ("ui icon button " ++ classes) - , href "#" - , onClick CreateNewField - , title "Create a new custom field" - ] - [ i [ class "plus link icon" ] [] - ] - - - ---- View2 - - view2 : DS.DropdownStyle -> ViewSettings -> Model -> Html Msg view2 ddstyle viewSettings model = div [ class viewSettings.classes ] diff --git a/modules/webapp/src/main/elm/Comp/CustomFieldTable.elm b/modules/webapp/src/main/elm/Comp/CustomFieldTable.elm index aba42a2c..890fc0d1 100644 --- a/modules/webapp/src/main/elm/Comp/CustomFieldTable.elm +++ b/modules/webapp/src/main/elm/Comp/CustomFieldTable.elm @@ -4,7 +4,6 @@ module Comp.CustomFieldTable exposing , Msg , init , update - , view , view2 ) @@ -43,59 +42,6 @@ update msg model = ---- View - - -view : Model -> List CustomField -> Html Msg -view _ items = - div [] - [ table [ class "ui very basic aligned table" ] - [ thead [] - [ tr [] - [ th [ class "collapsing" ] [] - , th [] [ text "Name/Label" ] - , th [] [ text "Format" ] - , th [] [ text "#Usage" ] - , th [] [ text "Created" ] - ] - ] - , tbody [] - (List.map viewItem items) - ] - ] - - -viewItem : CustomField -> Html Msg -viewItem item = - tr [] - [ td [ class "collapsing" ] - [ a - [ href "#" - , class "ui basic small blue label" - , onClick (EditItem item) - ] - [ i [ class "edit icon" ] [] - , text "Edit" - ] - ] - , td [] - [ text <| Maybe.withDefault item.name item.label - ] - , td [] - [ text item.ftype - ] - , td [] - [ String.fromInt item.usages - |> text - ] - , td [] - [ Util.Time.formatDateShort item.created - |> text - ] - ] - - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/DateInput.elm b/modules/webapp/src/main/elm/Comp/DateInput.elm deleted file mode 100644 index cfc8602d..00000000 --- a/modules/webapp/src/main/elm/Comp/DateInput.elm +++ /dev/null @@ -1,4 +0,0 @@ -module Comp.DateInput exposing (..) - -import Html exposing (..) -import Html.Attributes exposing (..) diff --git a/modules/webapp/src/main/elm/Comp/DetailEdit.elm b/modules/webapp/src/main/elm/Comp/DetailEdit.elm index e0fe0212..83950bff 100644 --- a/modules/webapp/src/main/elm/Comp/DetailEdit.elm +++ b/modules/webapp/src/main/elm/Comp/DetailEdit.elm @@ -14,9 +14,7 @@ module Comp.DetailEdit exposing , initTag , initTagByName , update - , view , view2 - , viewModal , viewModal2 ) @@ -638,151 +636,6 @@ update flags msg model = ---- View - - -customFieldFormSettings : Comp.CustomFieldForm.ViewSettings -customFieldFormSettings = - { classes = "ui error form" - , showControls = False - } - - -viewButtons : Model -> List (Html Msg) -viewButtons model = - [ button - [ class "ui primary button" - , href "#" - , onClick Submit - , disabled (model.submitting || model.loading) - ] - [ if model.submitting || model.loading then - i [ class "ui spinner loading icon" ] [] - - else - text "Submit" - ] - , button - [ class "ui button" - , href "#" - , onClick Cancel - ] - [ text "Cancel" - ] - ] - - -viewIntern : UiSettings -> Bool -> Model -> List (Html Msg) -viewIntern settings withButtons model = - [ div - [ classList - [ ( "ui message", True ) - , ( "error", Maybe.map .success model.result == Just False ) - , ( "success", Maybe.map .success model.result == Just True ) - , ( "invisible hidden", model.result == Nothing ) - ] - ] - [ Maybe.map .message model.result - |> Maybe.withDefault "" - |> text - ] - , case model.form of - TM tm -> - Html.map TagMsg (Comp.TagForm.view tm) - - PMR pm -> - Html.map PersonMsg (Comp.PersonForm.view1 settings True pm) - - PMC pm -> - Html.map PersonMsg (Comp.PersonForm.view1 settings True pm) - - OM om -> - Html.map OrgMsg (Comp.OrgForm.view1 settings True om) - - EM em -> - Html.map EquipMsg (Comp.EquipmentForm.view em) - - CFM fm -> - Html.map CustomFieldMsg (Comp.CustomFieldForm.view customFieldFormSettings fm) - ] - ++ (if withButtons then - div [ class "ui divider" ] [] :: viewButtons model - - else - [] - ) - - -view : UiSettings -> Model -> Html Msg -view settings model = - div [] - (viewIntern settings True model) - - -viewModal : UiSettings -> Maybe Model -> Html Msg -viewModal settings mm = - let - hidden = - mm == Nothing - - heading = - fold (\_ -> "Add Tag") - (\_ -> "Add Person") - (\_ -> "Add Organization") - (\_ -> "Add Equipment") - (\_ -> "Add Custom Field") - - headIcon = - fold (\_ -> Icons.tagIcon "") - (\_ -> Icons.personIcon "") - (\_ -> Icons.organizationIcon "") - (\_ -> Icons.equipmentIcon "") - (\_ -> Icons.customFieldIcon "") - in - div - [ classList - [ ( "ui inverted dimmer keep-small", True ) - , ( "invisibe hidden", hidden ) - , ( "active", not hidden ) - ] - , style "display" "flex !important" - ] - [ div - [ classList - [ ( "ui modal keep-small", True ) - , ( "active", not hidden ) - ] - ] - [ div [ class "header" ] - [ Maybe.map .form mm - |> Maybe.map headIcon - |> Maybe.withDefault (i [] []) - , Maybe.map .form mm - |> Maybe.map heading - |> Maybe.withDefault "" - |> text - ] - , div [ class "scrolling content" ] - (case mm of - Just model -> - viewIntern settings False model - - Nothing -> - [] - ) - , div [ class "actions" ] - (case mm of - Just model -> - viewButtons model - - Nothing -> - [] - ) - ] - ] - - - --- View2 @@ -900,10 +753,6 @@ viewButtons2 model = viewIntern2 : UiSettings -> Bool -> Model -> List (Html Msg) viewIntern2 settings withButtons model = - let - viewSettings = - Comp.CustomFieldForm.fullViewSettings - in [ div [ classList [ ( S.errorMessage, Maybe.map .success model.result == Just False ) @@ -935,7 +784,9 @@ viewIntern2 settings withButtons model = div [] (List.map (Html.map CustomFieldMsg) (Comp.CustomFieldForm.view2 - customFieldFormSettings + { classes = "" + , showControls = False + } fm ) ) diff --git a/modules/webapp/src/main/elm/Comp/Dropdown.elm b/modules/webapp/src/main/elm/Comp/Dropdown.elm index 9e1dfbaf..5da93ae2 100644 --- a/modules/webapp/src/main/elm/Comp/Dropdown.elm +++ b/modules/webapp/src/main/elm/Comp/Dropdown.elm @@ -13,9 +13,7 @@ module Comp.Dropdown exposing , orgDropdown , setMkOption , update - , view , view2 - , viewSingle , viewSingle2 ) @@ -462,178 +460,6 @@ update msg model = --- View - - -view : UiSettings -> Model a -> Html (Msg a) -view settings model = - if model.multiple then - viewMultiple settings model - - else - viewSingle model - - -viewSingle : Model a -> Html (Msg a) -viewSingle model = - let - renderClosed item = - div - [ class "message" - , style "display" "inline-block !important" - ] - [ i - [ class "delete icon" - , onClick (RemoveItem item) - ] - [] - , text item.option.text - ] - - renderDefault = - [ List.head model.selected - |> Maybe.map renderClosed - |> Maybe.withDefault (renderPlaceholder model) - , renderMenu model - ] - - openSearch = - [ input - [ class "search" - , placeholder "Search…" - , onInput Filter - , value model.filterString - ] - [] - , renderMenu model - ] - in - div - (classList - [ ( "ui search dropdown selection", True ) - , ( "open", model.menuOpen ) - ] - :: (if model.menuOpen then - [ tabindex 0 - , onKeyUp KeyPress - ] - - else - [ onClick ToggleMenu - , tabindex 0 - , onKeyUp KeyPress - ] - ) - ) - (List.append - [ i - (class "dropdown icon" - :: (if model.menuOpen then - [ onClick ToggleMenu ] - - else - [] - ) - ) - [] - ] - <| - if model.menuOpen && isSearchable model then - openSearch - - else - renderDefault - ) - - -viewMultiple : UiSettings -> Model a -> Html (Msg a) -viewMultiple settings model = - let - renderSelectMultiple : Item a -> Html (Msg a) - renderSelectMultiple item = - div - [ classList - [ ( "ui label", True ) - , ( model.labelColor item.value settings, True ) - ] - , style "display" "inline-block !important" - , onClick (RemoveItem item) - ] - [ text item.option.text - , i [ class "delete icon" ] [] - ] - in - div - [ classList - [ ( "ui search dropdown multiple selection", True ) - , ( "open", model.menuOpen ) - ] - , tabindex 0 - , onKeyUp KeyPress - ] - (List.concat - [ [ i [ class "dropdown icon", onClick ToggleMenu ] [] - ] - , List.map renderSelectMultiple model.selected - , if isSearchable model then - [ input - [ class "search" - , placeholder "Search…" - , onInput Filter - , value model.filterString - ] - [] - ] - - else - [] - , [ renderMenu model - ] - ] - ) - - -renderMenu : Model a -> Html (Msg a) -renderMenu model = - div - [ classList - [ ( "menu", True ) - , ( "transition visible", model.menuOpen ) - ] - ] - (getOptions model |> List.map renderOption) - - -renderPlaceholder : Model a -> Html (Msg a) -renderPlaceholder model = - div - [ classList - [ ( "placeholder-message", True ) - , ( "text", model.multiple ) - ] - , style "display" "inline-block !important" - ] - [ text model.placeholder - ] - - -renderOption : Item a -> Html (Msg a) -renderOption item = - div - [ classList - [ ( "item", True ) - , ( "active", item.active || item.selected ) - ] - , onClick (AddItem item) - ] - [ text item.option.text - , span [ class "small-info right-float" ] - [ text item.option.additional - ] - ] - - - -- View2 diff --git a/modules/webapp/src/main/elm/Comp/Dropzone.elm b/modules/webapp/src/main/elm/Comp/Dropzone.elm index 5f746260..e8a8b71a 100644 --- a/modules/webapp/src/main/elm/Comp/Dropzone.elm +++ b/modules/webapp/src/main/elm/Comp/Dropzone.elm @@ -9,7 +9,6 @@ module Comp.Dropzone exposing , init , setActive , update - , view , view2 ) @@ -108,42 +107,6 @@ update msg model = ( { model | state = ns }, Cmd.none, newFiles ) -view : Settings -> Model -> Html Msg -view settings model = - div - [ classList (settings.classList model.state) - , onDragEnter DragEnter - , onDragOver DragEnter - , onDragLeave DragLeave - , onDropFiles GotFiles - ] - [ div [ class "ui icon header" ] - [ i [ class "mouse pointer icon" ] [] - , text "Drop files here" - ] - , div [ class "ui horizontal divider" ] - [ text "Or" - ] - , a - [ classList - [ ( "ui basic primary button", True ) - , ( "disabled", not model.state.active ) - ] - , onClick PickFiles - , href "#" - ] - [ i [ class "folder open icon" ] [] - , text "Select ..." - ] - , div [ class "ui center aligned text container" ] - [ span [ class "small-info" ] - [ text "Choose document files (pdf, docx, txt, html, …). " - , text "Archives (zip and eml) are extracted." - ] - ] - ] - - filterMime : Model -> List File -> List File filterMime model files = let @@ -157,6 +120,10 @@ filterMime model files = List.filter pred files + +--- View2 + + view2 : Model -> Html Msg view2 model = div diff --git a/modules/webapp/src/main/elm/Comp/EmailInput.elm b/modules/webapp/src/main/elm/Comp/EmailInput.elm index 905a32d2..67cfe6a9 100644 --- a/modules/webapp/src/main/elm/Comp/EmailInput.elm +++ b/modules/webapp/src/main/elm/Comp/EmailInput.elm @@ -3,13 +3,11 @@ module Comp.EmailInput exposing , Msg , init , update - , view , view2 ) import Api import Api.Model.ContactList exposing (ContactList) -import Comp.Dropdown import Data.ContactType import Data.DropdownStyle as DS import Data.Flags exposing (Flags) @@ -136,69 +134,6 @@ update flags current msg model = ---- View - - -view : List String -> Model -> Html Msg -view values model = - div - [ classList - [ ( "ui search dropdown multiple selection", True ) - , ( "open", model.menuOpen ) - ] - ] - (List.map renderValue values - ++ [ input - [ type_ "text" - , class "search long-search" - , placeholder "Recipients…" - , onKeyUp KeyPress - , onInput SetInput - , value model.input - ] - [] - , renderMenu model - ] - ) - - -renderValue : String -> Html Msg -renderValue str = - a - [ class "ui label" - , href "#" - , onClick (RemoveEmail str) - ] - [ text str - , i [ class "delete icon" ] [] - ] - - -renderMenu : Model -> Html Msg -renderMenu model = - let - mkItem v = - a - [ classList - [ ( "item", True ) - , ( "active", model.active == Just v ) - ] - , href "#" - , onClick (AddEmail v) - ] - [ text v - ] - in - div - [ classList - [ ( "menu", True ) - , ( "transition visible", model.menuOpen ) - ] - ] - (List.map mkItem model.candidates) - - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/EmailSettingsForm.elm b/modules/webapp/src/main/elm/Comp/EmailSettingsForm.elm index 8402fafb..3045d045 100644 --- a/modules/webapp/src/main/elm/Comp/EmailSettingsForm.elm +++ b/modules/webapp/src/main/elm/Comp/EmailSettingsForm.elm @@ -6,7 +6,6 @@ module Comp.EmailSettingsForm exposing , init , isValid , update - , view , view2 ) @@ -21,7 +20,7 @@ import Data.SSLType exposing (SSLType) import Data.UiSettings exposing (UiSettings) import Html exposing (..) import Html.Attributes exposing (..) -import Html.Events exposing (onCheck, onInput) +import Html.Events exposing (onInput) import Styles as S import Util.Maybe @@ -182,109 +181,6 @@ update msg model = ---- View - - -view : UiSettings -> Model -> Html Msg -view settings model = - div - [ classList - [ ( "ui form", True ) - , ( "error", not (isValid model) ) - , ( "success", isValid model ) - ] - ] - [ div [ class "required field" ] - [ label [] [ text "Name" ] - , input - [ type_ "text" - , value model.name - , onInput SetName - , placeholder "Connection name, e.g. 'gmail.com'" - ] - [] - , div [ class "ui info message" ] - [ text "The connection name must not contain whitespace or special characters." - ] - ] - , div [ class "fields" ] - [ div [ class "thirteen wide required field" ] - [ label [] [ text "SMTP Host" ] - , input - [ type_ "text" - , placeholder "SMTP host name, e.g. 'mail.gmail.com'" - , value model.host - , onInput SetHost - ] - [] - ] - , Html.map PortMsg - (Comp.IntField.view model.portNum - "three wide field" - model.portField - ) - ] - , div [ class "two fields" ] - [ div [ class "field" ] - [ label [] [ text "SMTP User" ] - , input - [ type_ "text" - , placeholder "SMTP Username, e.g. 'your.name@gmail.com'" - , Maybe.withDefault "" model.user |> value - , onInput SetUser - ] - [] - ] - , div [ class "field" ] - [ label [] [ text "SMTP Password" ] - , Html.map PassMsg (Comp.PasswordInput.view model.password model.passField) - ] - ] - , div [ class "two fields" ] - [ div [ class "required field" ] - [ label [] [ text "From Address" ] - , input - [ type_ "text" - , placeholder "Sender E-Mail address" - , value model.from - , onInput SetFrom - ] - [] - ] - , div [ class "field" ] - [ label [] [ text "Reply-To" ] - , input - [ type_ "text" - , placeholder "Optional reply-to E-Mail address" - , Maybe.withDefault "" model.replyTo |> value - , onInput SetReplyTo - ] - [] - ] - ] - , div [ class "two fields" ] - [ div [ class "inline field" ] - [ div [ class "ui checkbox" ] - [ input - [ type_ "checkbox" - , checked model.ignoreCertificates - , onCheck (\_ -> ToggleCheckCert) - ] - [] - , label [] [ text "Ignore certificate check" ] - ] - ] - ] - , div [ class "two fields" ] - [ div [ class "field" ] - [ label [] [ text "SSL" ] - , Html.map SSLTypeMsg (Comp.Dropdown.view settings model.sslType) - ] - ] - ] - - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/EmailSettingsManage.elm b/modules/webapp/src/main/elm/Comp/EmailSettingsManage.elm index 15007387..97c5c46d 100644 --- a/modules/webapp/src/main/elm/Comp/EmailSettingsManage.elm +++ b/modules/webapp/src/main/elm/Comp/EmailSettingsManage.elm @@ -4,7 +4,6 @@ module Comp.EmailSettingsManage exposing , emptyModel , init , update - , view , view2 ) @@ -21,7 +20,6 @@ import Data.Flags exposing (Flags) import Data.UiSettings exposing (UiSettings) import Html exposing (..) import Html.Attributes exposing (..) -import Html.Events exposing (onClick, onInput) import Http import Styles as S import Util.Http @@ -205,99 +203,6 @@ update flags msg model = ---- View - - -view : UiSettings -> Model -> Html Msg -view settings model = - case model.viewMode of - Table -> - viewTable model - - Form -> - viewForm settings model - - -viewTable : Model -> Html Msg -viewTable model = - div [] - [ div [ class "ui secondary menu" ] - [ div [ class "horizontally fitted item" ] - [ div [ class "ui icon input" ] - [ input - [ type_ "text" - , onInput SetQuery - , value model.query - , placeholder "Search…" - ] - [] - , i [ class "ui search icon" ] - [] - ] - ] - , div [ class "right menu" ] - [ div [ class "item" ] - [ a - [ class "ui primary button" - , href "#" - , onClick InitNew - ] - [ i [ class "plus icon" ] [] - , text "New Settings" - ] - ] - ] - ] - , Html.map TableMsg (Comp.EmailSettingsTable.view model.tableModel) - ] - - -viewForm : UiSettings -> Model -> Html Msg -viewForm settings model = - div [ class "ui segment" ] - [ Html.map YesNoMsg (Comp.YesNoDimmer.view model.deleteConfirm) - , Html.map FormMsg (Comp.EmailSettingsForm.view settings model.formModel) - , div - [ classList - [ ( "ui error message", True ) - , ( "invisible", model.formError == Nothing ) - ] - ] - [ Maybe.withDefault "" model.formError |> text - ] - , div [ class "ui divider" ] [] - , button - [ class "ui primary button" - , onClick Submit - , href "#" - ] - [ text "Submit" - ] - , a - [ class "ui secondary button" - , onClick (SetViewMode Table) - , href "#" - ] - [ text "Cancel" - ] - , if model.formModel.settings.name /= "" then - a [ class "ui right floated red button", href "#", onClick RequestDelete ] - [ text "Delete" ] - - else - span [] [] - , div - [ classList - [ ( "ui dimmer", True ) - , ( "active", model.loading ) - ] - ] - [ div [ class "ui loader" ] [] - ] - ] - - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/EmailSettingsTable.elm b/modules/webapp/src/main/elm/Comp/EmailSettingsTable.elm index a846636d..4cf15b04 100644 --- a/modules/webapp/src/main/elm/Comp/EmailSettingsTable.elm +++ b/modules/webapp/src/main/elm/Comp/EmailSettingsTable.elm @@ -4,7 +4,6 @@ module Comp.EmailSettingsTable exposing , emptyModel , init , update - , view , view2 ) @@ -12,7 +11,6 @@ import Api.Model.EmailSettings exposing (EmailSettings) import Comp.Basic as B import Html exposing (..) import Html.Attributes exposing (..) -import Html.Events exposing (onClick) import Styles as S @@ -46,46 +44,6 @@ update msg model = ---- View - - -view : Model -> Html Msg -view model = - table [ class "ui selectable pointer table" ] - [ thead [] - [ tr [] - [ th [ class "collapsible" ] [ text "Name" ] - , th [] [ text "Host/Port" ] - , th [] [ text "From" ] - ] - ] - , tbody [] - (List.map (renderLine model) model.emailSettings) - ] - - -renderLine : Model -> EmailSettings -> Html Msg -renderLine model ems = - let - hostport = - case ems.smtpPort of - Just p -> - ems.smtpHost ++ ":" ++ String.fromInt p - - Nothing -> - ems.smtpHost - in - tr - [ classList [ ( "active", model.selected == Just ems ) ] - , onClick (Select ems) - ] - [ td [ class "collapsible" ] [ text ems.name ] - , td [] [ text hostport ] - , td [] [ text ems.from ] - ] - - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/EquipmentForm.elm b/modules/webapp/src/main/elm/Comp/EquipmentForm.elm index 3e0ab5eb..6783212c 100644 --- a/modules/webapp/src/main/elm/Comp/EquipmentForm.elm +++ b/modules/webapp/src/main/elm/Comp/EquipmentForm.elm @@ -5,7 +5,6 @@ module Comp.EquipmentForm exposing , getEquipment , isValid , update - , view , view2 ) @@ -73,27 +72,6 @@ update _ msg model = ( { model | notes = Util.Maybe.fromString str }, Cmd.none ) -view : Model -> Html Msg -view model = - div [ class "ui form" ] - [ div - [ classList - [ ( "field", True ) - , ( "error", not (isValid model) ) - ] - ] - [ label [] [ text "Name*" ] - , input - [ type_ "text" - , onInput SetName - , placeholder "Name" - , value model.name - ] - [] - ] - ] - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/EquipmentManage.elm b/modules/webapp/src/main/elm/Comp/EquipmentManage.elm index 17065b30..27df512b 100644 --- a/modules/webapp/src/main/elm/Comp/EquipmentManage.elm +++ b/modules/webapp/src/main/elm/Comp/EquipmentManage.elm @@ -3,7 +3,6 @@ module Comp.EquipmentManage exposing , Msg(..) , emptyModel , update - , view , view2 ) @@ -19,7 +18,7 @@ import Comp.YesNoDimmer import Data.Flags exposing (Flags) import Html exposing (..) import Html.Attributes exposing (..) -import Html.Events exposing (onClick, onInput, onSubmit) +import Html.Events exposing (onSubmit) import Http import Styles as S import Util.Http @@ -201,111 +200,6 @@ update flags msg model = ( m, Api.getEquipments flags str EquipmentResp ) -view : Model -> Html Msg -view model = - if model.viewMode == Table then - viewTable model - - else - viewForm model - - -viewTable : Model -> Html Msg -viewTable model = - div [] - [ div [ class "ui secondary menu" ] - [ div [ class "horizontally fitted item" ] - [ div [ class "ui icon input" ] - [ input - [ type_ "text" - , onInput SetQuery - , value model.query - , placeholder "Search…" - ] - [] - , i [ class "ui search icon" ] - [] - ] - ] - , div [ class "right menu" ] - [ div [ class "item" ] - [ a - [ class "ui primary button" - , href "#" - , onClick InitNewEquipment - ] - [ i [ class "plus icon" ] [] - , text "New Equipment" - ] - ] - ] - ] - , Html.map TableMsg (Comp.EquipmentTable.view model.tableModel) - , div - [ classList - [ ( "ui dimmer", True ) - , ( "active", model.loading ) - ] - ] - [ div [ class "ui loader" ] [] - ] - ] - - -viewForm : Model -> Html Msg -viewForm model = - let - newEquipment = - model.formModel.equipment.id == "" - in - Html.form [ class "ui segment", onSubmit Submit ] - [ Html.map YesNoMsg (Comp.YesNoDimmer.view model.deleteConfirm) - , if newEquipment then - h3 [ class "ui dividing header" ] - [ text "Create new equipment" - ] - - else - h3 [ class "ui dividing header" ] - [ text ("Edit equipment: " ++ model.formModel.equipment.name) - , div [ class "sub header" ] - [ text "Id: " - , text model.formModel.equipment.id - ] - ] - , Html.map FormMsg (Comp.EquipmentForm.view model.formModel) - , div - [ classList - [ ( "ui error message", True ) - , ( "invisible", Util.Maybe.isEmpty model.formError ) - ] - ] - [ Maybe.withDefault "" model.formError |> text - ] - , div [ class "ui horizontal divider" ] [] - , button [ class "ui primary button", type_ "submit" ] - [ text "Submit" - ] - , a [ class "ui secondary button", onClick (SetViewMode Table), href "#" ] - [ text "Cancel" - ] - , if not newEquipment then - a [ class "ui right floated red button", href "#", onClick RequestDelete ] - [ text "Delete" ] - - else - span [] [] - , div - [ classList - [ ( "ui dimmer", True ) - , ( "active", model.loading ) - ] - ] - [ div [ class "ui loader" ] [] - ] - ] - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/EquipmentTable.elm b/modules/webapp/src/main/elm/Comp/EquipmentTable.elm index ab2c90df..3524e3f9 100644 --- a/modules/webapp/src/main/elm/Comp/EquipmentTable.elm +++ b/modules/webapp/src/main/elm/Comp/EquipmentTable.elm @@ -3,7 +3,6 @@ module Comp.EquipmentTable exposing , Msg(..) , emptyModel , update - , view , view2 ) @@ -48,41 +47,6 @@ update _ msg model = ( { model | selected = Nothing }, Cmd.none ) -view : Model -> Html Msg -view model = - table [ class "ui very basic aligned table" ] - [ thead [] - [ tr [] - [ th [ class "collapsing" ] [] - , th [] [ text "Name" ] - ] - ] - , tbody [] - (List.map (renderEquipmentLine model) model.equips) - ] - - -renderEquipmentLine : Model -> Equipment -> Html Msg -renderEquipmentLine model equip = - tr - [ classList [ ( "active", model.selected == Just equip ) ] - ] - [ td [ class "collapsing" ] - [ a - [ href "#" - , class "ui basic small blue label" - , onClick (Select equip) - ] - [ i [ class "edit icon" ] [] - , text "Edit" - ] - ] - , td [] - [ text equip.name - ] - ] - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/FieldListSelect.elm b/modules/webapp/src/main/elm/Comp/FieldListSelect.elm index 274a03e8..7cfc20a9 100644 --- a/modules/webapp/src/main/elm/Comp/FieldListSelect.elm +++ b/modules/webapp/src/main/elm/Comp/FieldListSelect.elm @@ -2,7 +2,6 @@ module Comp.FieldListSelect exposing ( Model , Msg , update - , view , view2 ) @@ -10,7 +9,6 @@ import Comp.MenuBar as MB import Data.Fields exposing (Field) import Html exposing (..) import Html.Attributes exposing (..) -import Html.Events exposing (onCheck) type alias Model = @@ -48,35 +46,6 @@ addField selected field = ---- View - - -view : Model -> Html Msg -view selected = - div [ class "grouped fields" ] - (List.map (fieldCheckbox selected) Data.Fields.all) - - -fieldCheckbox : Model -> Field -> Html Msg -fieldCheckbox selected field = - let - isChecked = - List.member field selected - in - div [ class "field" ] - [ div [ class "ui checkbox" ] - [ input - [ type_ "checkbox" - , checked isChecked - , onCheck (\_ -> Toggle field) - ] - [] - , label [] [ text (Data.Fields.label field) ] - ] - ] - - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/FixedDropdown.elm b/modules/webapp/src/main/elm/Comp/FixedDropdown.elm index 88b4b57b..5d94d369 100644 --- a/modules/webapp/src/main/elm/Comp/FixedDropdown.elm +++ b/modules/webapp/src/main/elm/Comp/FixedDropdown.elm @@ -7,10 +7,7 @@ module Comp.FixedDropdown exposing , initString , initTuple , update - , view , view2 - , viewString - , viewStyled , viewStyled2 ) @@ -37,8 +34,7 @@ type alias Model a = type Msg a - = SelectItem (Item a) - | SelectItem2 (Item a) + = SelectItem2 (Item a) | ToggleMenu | KeyPress (Maybe KeyCode) @@ -124,9 +120,6 @@ update msg model = ToggleMenu -> ( { model | menuOpen = not model.menuOpen }, Nothing ) - SelectItem item -> - ( model, Just item.id ) - SelectItem2 item -> ( { model | menuOpen = False }, Just item.id ) @@ -170,65 +163,6 @@ update msg model = ( model, Nothing ) -viewStyled : String -> Maybe (Item a) -> Model a -> Html (Msg a) -viewStyled classes selected model = - div - [ classList - [ ( "ui selection dropdown", True ) - , ( classes, True ) - , ( "open", model.menuOpen ) - ] - , tabindex 0 - , onClick ToggleMenu - , onKeyUpCode KeyPress - ] - [ input [ type_ "hidden" ] [] - , i [ class "dropdown icon" ] [] - , div - [ classList - [ ( "default", selected == Nothing ) - , ( "text", True ) - ] - ] - [ Maybe.map .display selected - |> Maybe.withDefault "Select…" - |> text - ] - , div - [ classList - [ ( "menu transition", True ) - , ( "hidden", not model.menuOpen ) - , ( "visible", model.menuOpen ) - ] - ] - <| - List.map (renderItems model) model.options - ] - - -view : Maybe (Item a) -> Model a -> Html (Msg a) -view selected model = - viewStyled "" selected model - - -viewString : Maybe String -> Model String -> Html (Msg String) -viewString selected model = - view (Maybe.map (\s -> Item s s) selected) model - - -renderItems : Model a -> Item a -> Html (Msg a) -renderItems model item = - div - [ classList - [ ( "item", True ) - , ( "selected", isSelected model item ) - ] - , onClick (SelectItem item) - ] - [ text item.display - ] - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/FolderDetail.elm b/modules/webapp/src/main/elm/Comp/FolderDetail.elm index f8105f40..5e4a38af 100644 --- a/modules/webapp/src/main/elm/Comp/FolderDetail.elm +++ b/modules/webapp/src/main/elm/Comp/FolderDetail.elm @@ -4,7 +4,6 @@ module Comp.FolderDetail exposing , init , initEmpty , update - , view , view2 ) @@ -273,128 +272,7 @@ update flags msg model = ---- View - - -view : Flags -> Model -> Html Msg -view flags model = - let - isOwner = - Maybe.map .user flags.account - |> Maybe.map ((==) model.folder.owner.name) - |> Maybe.withDefault False - in - div [] - ([ Html.map DeleteMsg (Comp.YesNoDimmer.view model.deleteDimmer) - , if model.folder.id == "" then - div [] - [ text "Create a new folder. You are automatically set as owner of this new folder." - ] - - else - div [] - [ text "Modify this folder by changing the name or add/remove members." - ] - , if model.folder.id /= "" && not isOwner then - div [ class "ui info message" ] - [ text "You are not the owner of this folder and therefore are not allowed to edit it." - ] - - else - div [] [] - , div - [ classList - [ ( "ui message", True ) - , ( "invisible hidden", model.result == Nothing ) - , ( "error", Maybe.map .success model.result == Just False ) - , ( "success", Maybe.map .success model.result == Just True ) - ] - ] - [ Maybe.map .message model.result - |> Maybe.withDefault "" - |> text - ] - , div [ class "ui header" ] - [ text "Owner" - ] - , div [ class "" ] - [ text model.folder.owner.name - ] - , div [ class "ui header" ] - [ text "Name" - ] - , div [ class "ui action input" ] - [ input - [ type_ "text" - , onInput SetName - , Maybe.withDefault "" model.name - |> value - ] - [] - , button - [ class "ui icon button" - , onClick SaveName - ] - [ i [ class "save icon" ] [] - ] - ] - ] - ++ viewMembers model - ++ viewButtons model - ) - - -viewButtons : Model -> List (Html Msg) -viewButtons model = - [ div [ class "ui divider" ] [] - , button - [ class "ui button" - , onClick GoBack - ] - [ text "Back" - ] - , button - [ classList - [ ( "ui red button", True ) - , ( "invisible hidden", model.folder.id == "" ) - ] - , onClick RequestDelete - ] - [ text "Delete" - ] - ] - - -viewMembers : Model -> List (Html Msg) -viewMembers model = - if model.folder.id == "" then - [] - - else - [ div [ class "ui header" ] - [ text "Members" - ] - , div [ class "ui form" ] - [ div [ class "inline field" ] - [ Html.map MemberDropdownMsg - (Comp.FixedDropdown.view - (Maybe.map makeItem model.selectedMember) - model.memberDropdown - ) - , button - [ class "ui primary button" - , title "Add a new member" - , onClick AddMember - ] - [ text "Add" - ] - ] - ] - , div - [ class "ui list" - ] - (List.map viewMember model.members) - ] +--- View2 makeItem : IdName -> Comp.FixedDropdown.Item IdName @@ -402,29 +280,6 @@ makeItem idn = Comp.FixedDropdown.Item idn idn.name -viewMember : IdName -> Html Msg -viewMember member = - div - [ class "item" - ] - [ a - [ class "link icon" - , href "#" - , title "Remove this member" - , onClick (RemoveMember member) - ] - [ i [ class "red trash icon" ] [] - ] - , span [] - [ text member.name - ] - ] - - - ---- View2 - - view2 : Flags -> Model -> Html Msg view2 flags model = let diff --git a/modules/webapp/src/main/elm/Comp/FolderManage.elm b/modules/webapp/src/main/elm/Comp/FolderManage.elm index bd0b32dc..cedb2c17 100644 --- a/modules/webapp/src/main/elm/Comp/FolderManage.elm +++ b/modules/webapp/src/main/elm/Comp/FolderManage.elm @@ -4,7 +4,6 @@ module Comp.FolderManage exposing , empty , init , update - , view , view2 ) @@ -20,7 +19,6 @@ import Comp.MenuBar as MB import Data.Flags exposing (Flags) import Html exposing (..) import Html.Attributes exposing (..) -import Html.Events exposing (onCheck, onClick, onInput) import Http import Styles as S @@ -139,13 +137,13 @@ update flags msg model = UserListResp (Ok ul) -> ( { model | users = ul.items }, Cmd.none ) - UserListResp (Err err) -> + UserListResp (Err _) -> ( model, Cmd.none ) FolderListResp (Ok sl) -> ( { model | folders = sl.items }, Cmd.none ) - FolderListResp (Err err) -> + FolderListResp (Err _) -> ( model, Cmd.none ) FolderDetailResp (Ok sd) -> @@ -153,7 +151,7 @@ update flags msg model = , Cmd.none ) - FolderDetailResp (Err err) -> + FolderDetailResp (Err _) -> ( model, Cmd.none ) InitNewFolder -> @@ -167,80 +165,6 @@ update flags msg model = ---- View - - -view : Flags -> Model -> Html Msg -view flags model = - case model.detailModel of - Just dm -> - viewDetail flags dm - - Nothing -> - viewTable model - - -viewDetail : Flags -> Comp.FolderDetail.Model -> Html Msg -viewDetail flags detailModel = - div [] - [ Html.map DetailMsg (Comp.FolderDetail.view flags detailModel) - ] - - -viewTable : Model -> Html Msg -viewTable model = - div [] - [ div [ class "ui secondary menu" ] - [ div [ class "horizontally fitted item" ] - [ div [ class "ui icon input" ] - [ input - [ type_ "text" - , onInput SetQuery - , value model.query - , placeholder "Search…" - ] - [] - , i [ class "ui search icon" ] - [] - ] - ] - , div [ class "item" ] - [ div [ class "ui checkbox" ] - [ input - [ type_ "checkbox" - , onCheck (\_ -> ToggleOwningOnly) - , checked model.owningOnly - ] - [] - , label [] [ text "Show owning folders only" ] - ] - ] - , div [ class "right menu" ] - [ div [ class "item" ] - [ a - [ class "ui primary button" - , href "#" - , onClick InitNewFolder - ] - [ i [ class "plus icon" ] [] - , text "New Folder" - ] - ] - ] - ] - , Html.map TableMsg (Comp.FolderTable.view model.tableModel model.folders) - , div - [ classList - [ ( "ui dimmer", True ) - , ( "active", model.loading ) - ] - ] - [ div [ class "ui loader" ] [] - ] - ] - - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/FolderSelect.elm b/modules/webapp/src/main/elm/Comp/FolderSelect.elm index 5e164adb..3b65eff9 100644 --- a/modules/webapp/src/main/elm/Comp/FolderSelect.elm +++ b/modules/webapp/src/main/elm/Comp/FolderSelect.elm @@ -7,8 +7,6 @@ module Comp.FolderSelect exposing , setSelected , update , updateDrop - , view - , viewDrop , viewDrop2 ) @@ -133,50 +131,7 @@ selectedFolder model = ---- View - - -view : Int -> Model -> Html Msg -view = - viewDrop DD.init - - -viewDrop : DD.Model -> Int -> Model -> Html Msg -viewDrop dropModel constr model = - let - highlightDrop = - DD.getDropId dropModel == Just DD.FolderRemove - in - div [ class "ui list" ] - [ div [ class "item" ] - [ i [ class "folder open icon" ] [] - , div [ class "content" ] - [ div - (classList - [ ( "header", True ) - , ( "current-drop-target", highlightDrop ) - ] - :: DD.droppable FolderDDMsg DD.FolderRemove - ) - [ text "Folders" - ] - , div [ class "ui relaxed list" ] - (renderItems dropModel constr model) - ] - ] - ] - - -renderItems : DD.Model -> Int -> Model -> List (Html Msg) -renderItems dropModel constr model = - if constr <= 0 then - List.map (viewItem dropModel model) model.all - - else if model.expanded then - List.map (viewItem dropModel model) model.all ++ collapseToggle constr model - - else - List.map (viewItem dropModel model) (List.take constr model.all) ++ expandToggle constr model +--- View2 expandToggle : Int -> Model -> List (Html Msg) @@ -195,49 +150,6 @@ collapseToggle max model = ToggleExpand -viewItem : DD.Model -> Model -> FolderStats -> Html Msg -viewItem dropModel model item = - let - selected = - Just item.id == model.selected - - icon = - if selected then - "folder outline open icon" - - else - "folder outline icon" - - highlightDrop = - DD.getDropId dropModel == Just (DD.Folder item.id) - in - a - ([ classList - [ ( "item", True ) - , ( "active", selected ) - , ( "current-drop-target", highlightDrop ) - ] - , href "#" - , onClick (Toggle item) - ] - ++ DD.droppable FolderDDMsg (DD.Folder item.id) - ) - [ i [ class icon ] [] - , div [ class "content" ] - [ div [ class "description" ] - [ text item.name - , div [ class "ui right floated circular label" ] - [ text (String.fromInt item.count) - ] - ] - ] - ] - - - ---- View2 - - viewDrop2 : DD.Model -> Int -> Model -> Html Msg viewDrop2 dropModel constr model = let diff --git a/modules/webapp/src/main/elm/Comp/FolderTable.elm b/modules/webapp/src/main/elm/Comp/FolderTable.elm index 9c540b11..7fa2ecf4 100644 --- a/modules/webapp/src/main/elm/Comp/FolderTable.elm +++ b/modules/webapp/src/main/elm/Comp/FolderTable.elm @@ -4,7 +4,6 @@ module Comp.FolderTable exposing , Msg , init , update - , view , view2 ) @@ -12,9 +11,7 @@ import Api.Model.FolderItem exposing (FolderItem) import Comp.Basic as B import Html exposing (..) import Html.Attributes exposing (..) -import Html.Events exposing (onClick) import Styles as S -import Util.Html import Util.Time @@ -44,63 +41,6 @@ update msg model = ---- View - - -view : Model -> List FolderItem -> Html Msg -view _ items = - div [] - [ table [ class "ui very basic aligned table" ] - [ thead [] - [ tr [] - [ th [ class "collapsing" ] [] - , th [] [ text "Name" ] - , th [] [ text "Owner" ] - , th [ class "collapsing" ] [ text "Owner or Member" ] - , th [ class "collapsing" ] [ text "#Member" ] - , th [ class "collapsing" ] [ text "Created" ] - ] - ] - , tbody [] - (List.map viewItem items) - ] - ] - - -viewItem : FolderItem -> Html Msg -viewItem item = - tr [] - [ td [ class "collapsing" ] - [ a - [ href "#" - , class "ui basic small blue label" - , onClick (EditItem item) - ] - [ i [ class "edit icon" ] [] - , text "Edit" - ] - ] - , td [] - [ text item.name - ] - , td [] - [ text item.owner.name - ] - , td [ class "center aligned" ] - [ Util.Html.checkbox item.isMember - ] - , td [ class "center aligned" ] - [ String.fromInt item.memberCount - |> text - ] - , td [ class "center aligned" ] - [ Util.Time.formatDateShort item.created - |> text - ] - ] - - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/ImapSettingsForm.elm b/modules/webapp/src/main/elm/Comp/ImapSettingsForm.elm index 42fd5412..8027b80f 100644 --- a/modules/webapp/src/main/elm/Comp/ImapSettingsForm.elm +++ b/modules/webapp/src/main/elm/Comp/ImapSettingsForm.elm @@ -6,7 +6,6 @@ module Comp.ImapSettingsForm exposing , init , isValid , update - , view , view2 ) @@ -21,7 +20,7 @@ import Data.SSLType exposing (SSLType) import Data.UiSettings exposing (UiSettings) import Html exposing (..) import Html.Attributes exposing (..) -import Html.Events exposing (onCheck, onInput) +import Html.Events exposing (onInput) import Styles as S import Util.Maybe @@ -174,98 +173,6 @@ update msg model = ---- View - - -view : UiSettings -> Model -> Html Msg -view settings model = - div - [ classList - [ ( "ui form", True ) - , ( "info error", not (isValid model) ) - , ( "info success", isValid model ) - ] - ] - [ div [ class "required field" ] - [ label [] [ text "Name" ] - , input - [ type_ "text" - , value model.name - , onInput SetName - , placeholder "Connection name, e.g. 'gmail.com'" - ] - [] - , div [ class "ui info message" ] - [ text "The connection name must not contain whitespace or special characters." - ] - ] - , div [ class "fields" ] - [ div [ class "thirteen wide required field" ] - [ label [] [ text "IMAP Host" ] - , input - [ type_ "text" - , placeholder "IMAP host name, e.g. 'mail.gmail.com'" - , value model.host - , onInput SetHost - ] - [] - ] - , Html.map PortMsg - (Comp.IntField.view model.portNum - "three wide field" - model.portField - ) - ] - , div [ class "two fields" ] - [ div [ class "field" ] - [ label [] [ text "IMAP User" ] - , input - [ type_ "text" - , placeholder "IMAP Username, e.g. 'your.name@gmail.com'" - , Maybe.withDefault "" model.user |> value - , onInput SetUser - ] - [] - ] - , div [ class "field" ] - [ label [] [ text "IMAP Password" ] - , Html.map PassMsg (Comp.PasswordInput.view model.password model.passField) - ] - ] - , div [ class "two fields" ] - [ div [ class "inline field" ] - [ div [ class "ui checkbox" ] - [ input - [ type_ "checkbox" - , checked model.ignoreCertificates - , onCheck (\_ -> ToggleCheckCert) - ] - [] - , label [] [ text "Ignore certificate check" ] - ] - ] - , div [ class "inline field" ] - [ div [ class "ui checkbox" ] - [ input - [ type_ "checkbox" - , checked model.useOAuthToken - , onCheck (\_ -> ToggleUseOAuth) - ] - [] - , label [] [ text "Enable OAuth2 authentication using the password as access token" ] - ] - ] - ] - , div [ class "two fields" ] - [ div [ class "field" ] - [ label [] [ text "SSL" ] - , Html.map SSLTypeMsg (Comp.Dropdown.view settings model.sslType) - ] - ] - ] - - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/ImapSettingsManage.elm b/modules/webapp/src/main/elm/Comp/ImapSettingsManage.elm index e6073bc0..a36dfb58 100644 --- a/modules/webapp/src/main/elm/Comp/ImapSettingsManage.elm +++ b/modules/webapp/src/main/elm/Comp/ImapSettingsManage.elm @@ -4,7 +4,6 @@ module Comp.ImapSettingsManage exposing , emptyModel , init , update - , view , view2 ) @@ -21,7 +20,6 @@ import Data.Flags exposing (Flags) import Data.UiSettings exposing (UiSettings) import Html exposing (..) import Html.Attributes exposing (..) -import Html.Events exposing (onClick, onInput) import Http import Styles as S import Util.Http @@ -205,99 +203,6 @@ update flags msg model = ---- View - - -view : UiSettings -> Model -> Html Msg -view settings model = - case model.viewMode of - Table -> - viewTable model - - Form -> - viewForm settings model - - -viewTable : Model -> Html Msg -viewTable model = - div [] - [ div [ class "ui secondary menu" ] - [ div [ class "horizontally fitted item" ] - [ div [ class "ui icon input" ] - [ input - [ type_ "text" - , onInput SetQuery - , value model.query - , placeholder "Search…" - ] - [] - , i [ class "ui search icon" ] - [] - ] - ] - , div [ class "right menu" ] - [ div [ class "item" ] - [ a - [ class "ui primary button" - , href "#" - , onClick InitNew - ] - [ i [ class "plus icon" ] [] - , text "New Settings" - ] - ] - ] - ] - , Html.map TableMsg (Comp.ImapSettingsTable.view model.tableModel) - ] - - -viewForm : UiSettings -> Model -> Html Msg -viewForm settings model = - div [ class "ui segment" ] - [ Html.map YesNoMsg (Comp.YesNoDimmer.view model.deleteConfirm) - , Html.map FormMsg (Comp.ImapSettingsForm.view settings model.formModel) - , div - [ classList - [ ( "ui error message", True ) - , ( "invisible", model.formError == Nothing ) - ] - ] - [ Maybe.withDefault "" model.formError |> text - ] - , div [ class "ui divider" ] [] - , button - [ class "ui primary button" - , onClick Submit - , href "#" - ] - [ text "Submit" - ] - , a - [ class "ui secondary button" - , onClick (SetViewMode Table) - , href "#" - ] - [ text "Cancel" - ] - , if model.formModel.settings.name /= "" then - a [ class "ui right floated red button", href "#", onClick RequestDelete ] - [ text "Delete" ] - - else - span [] [] - , div - [ classList - [ ( "ui dimmer", True ) - , ( "active", model.loading ) - ] - ] - [ div [ class "ui loader" ] [] - ] - ] - - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/ImapSettingsTable.elm b/modules/webapp/src/main/elm/Comp/ImapSettingsTable.elm index 19a9829f..e6a708e7 100644 --- a/modules/webapp/src/main/elm/Comp/ImapSettingsTable.elm +++ b/modules/webapp/src/main/elm/Comp/ImapSettingsTable.elm @@ -4,7 +4,6 @@ module Comp.ImapSettingsTable exposing , emptyModel , init , update - , view , view2 ) @@ -12,7 +11,6 @@ import Api.Model.ImapSettings exposing (ImapSettings) import Comp.Basic as B import Html exposing (..) import Html.Attributes exposing (..) -import Html.Events exposing (onClick) import Styles as S @@ -46,44 +44,6 @@ update msg model = ---- View - - -view : Model -> Html Msg -view model = - table [ class "ui selectable pointer table" ] - [ thead [] - [ tr [] - [ th [ class "collapsible" ] [ text "Name" ] - , th [] [ text "Host/Port" ] - ] - ] - , tbody [] - (List.map (renderLine model) model.emailSettings) - ] - - -renderLine : Model -> ImapSettings -> Html Msg -renderLine model ems = - let - hostport = - case ems.imapPort of - Just p -> - ems.imapHost ++ ":" ++ String.fromInt p - - Nothing -> - ems.imapHost - in - tr - [ classList [ ( "active", model.selected == Just ems ) ] - , onClick (Select ems) - ] - [ td [ class "collapsible" ] [ text ems.name ] - , td [] [ text hostport ] - ] - - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/IntField.elm b/modules/webapp/src/main/elm/Comp/IntField.elm index 4f504974..986f40da 100644 --- a/modules/webapp/src/main/elm/Comp/IntField.elm +++ b/modules/webapp/src/main/elm/Comp/IntField.elm @@ -3,8 +3,6 @@ module Comp.IntField exposing , Msg , init , update - , view - , viewWithInfo , viewWithInfo2 ) @@ -96,47 +94,6 @@ update msg model = ) -view : Maybe Int -> String -> Model -> Html Msg -view = - viewWithInfo "" - - -viewWithInfo : String -> Maybe Int -> String -> Model -> Html Msg -viewWithInfo info nval classes model = - div - [ classList - [ ( classes, True ) - , ( "error", model.error /= Nothing ) - ] - ] - [ label [] [ text model.label ] - , input - [ type_ "text" - , Maybe.map String.fromInt nval - |> Maybe.withDefault model.lastInput - |> value - , onInput SetValue - ] - [] - , span - [ classList - [ ( "small-info", True ) - , ( "hidden invisible", info == "" ) - ] - ] - [ Markdown.toHtml [] info - ] - , div - [ classList - [ ( "ui pointing red basic label", True ) - , ( "hidden", model.error == Nothing ) - ] - ] - [ Maybe.withDefault "" model.error |> text - ] - ] - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/ItemCard.elm b/modules/webapp/src/main/elm/Comp/ItemCard.elm index 2c440bf9..b361830f 100644 --- a/modules/webapp/src/main/elm/Comp/ItemCard.elm +++ b/modules/webapp/src/main/elm/Comp/ItemCard.elm @@ -5,7 +5,6 @@ module Comp.ItemCard exposing , ViewConfig , init , update - , view , view2 ) @@ -137,425 +136,6 @@ update ddm msg model = --- View - - -view : ViewConfig -> UiSettings -> Model -> ItemLight -> Html Msg -view cfg settings model item = - let - isConfirmed = - item.state /= "created" - - cardColor = - if not isConfirmed then - "blue" - - else - "" - - fieldHidden f = - Data.UiSettings.fieldHidden settings f - - cardAction = - case cfg.selection of - Data.ItemSelection.Inactive -> - [ Page.href (ItemDetailPage item.id) - ] - - Data.ItemSelection.Active ids -> - [ onClick (ToggleSelectItem ids item.id) - , href "#" - ] - - selectedDimmer = - div - [ classList - [ ( "ui light dimmer", True ) - , ( "active", isSelected cfg item.id ) - ] - ] - [ div [ class "content" ] - [ a - cardAction - [ i [ class "huge icons purple" ] - [ i [ class "big circle outline icon" ] [] - , i [ class "check icon" ] [] - ] - ] - ] - ] - in - div - ([ classList - [ ( "ui fluid card", True ) - , ( cardColor, True ) - , ( cfg.extraClasses, True ) - ] - , id item.id - ] - ++ DD.draggable ItemDDMsg item.id - ) - ((if fieldHidden Data.Fields.PreviewImage then - [] - - else - [ selectedDimmer - , previewMenu settings model item (currentAttachment model item) - , previewImage settings cardAction model item - ] - ) - ++ [ mainContent cardAction cardColor isConfirmed settings cfg item - , notesContent settings item - , metaDataContent settings item - , fulltextResultsContent item - ] - ) - - -fulltextResultsContent : ItemLight -> Html Msg -fulltextResultsContent item = - div - [ classList - [ ( "content search-highlight", True ) - , ( "invisible hidden", item.highlighting == [] ) - ] - ] - [ div [ class "ui list" ] - (List.map renderHighlightEntry item.highlighting) - ] - - -metaDataContent : UiSettings -> ItemLight -> Html Msg -metaDataContent settings item = - let - fieldHidden f = - Data.UiSettings.fieldHidden settings f - - dueDate = - IT.render IT.dueDateShort item - in - div [ class "content" ] - [ div [ class "ui horizontal link list" ] - [ div - [ classList - [ ( "link item", True ) - , ( "invisible hidden" - , fieldHidden Data.Fields.CorrOrg - && fieldHidden Data.Fields.CorrPerson - ) - ] - , title "Correspondent" - ] - (Icons.correspondentIcon "" - :: Comp.LinkTarget.makeCorrLink item [] SetLinkTarget - ) - , div - [ classList - [ ( "item", True ) - , ( "invisible hidden" - , fieldHidden Data.Fields.ConcPerson - && fieldHidden Data.Fields.ConcEquip - ) - ] - , title "Concerning" - ] - (Icons.concernedIcon - :: Comp.LinkTarget.makeConcLink item [] SetLinkTarget - ) - , div - [ classList - [ ( "item", True ) - , ( "invisible hidden", fieldHidden Data.Fields.Folder ) - ] - , title "Folder" - ] - [ Icons.folderIcon "" - , Comp.LinkTarget.makeFolderLink item [] SetLinkTarget - ] - ] - , div [ class "right floated meta" ] - [ div [ class "ui horizontal link list" ] - [ Comp.LinkTarget.makeSourceLink - [ ( "item", True ) ] - SetLinkTarget - (IT.render IT.source item) - , div - [ classList - [ ( "item", True ) - , ( "invisible hidden" - , item.dueDate - == Nothing - || fieldHidden Data.Fields.DueDate - ) - ] - , title ("Due on " ++ dueDate) - ] - [ div - [ class "ui basic grey label" - ] - [ Icons.dueDateIcon "" - , text (" " ++ dueDate) - ] - ] - ] - ] - ] - - -notesContent : UiSettings -> ItemLight -> Html Msg -notesContent settings item = - div - [ classList - [ ( "content", True ) - , ( "invisible hidden" - , settings.itemSearchNoteLength - <= 0 - || Util.String.isNothingOrBlank item.notes - ) - ] - ] - [ span [ class "small-info" ] - [ Maybe.withDefault "" item.notes - |> Util.String.ellipsis settings.itemSearchNoteLength - |> text - ] - ] - - -mainContent : List (Attribute Msg) -> String -> Bool -> UiSettings -> ViewConfig -> ItemLight -> Html Msg -mainContent cardAction cardColor isConfirmed settings _ item = - let - dirIcon = - i [ class (Data.Direction.iconFromMaybe item.direction) ] [] - - fieldHidden f = - Data.UiSettings.fieldHidden settings f - - titlePattern = - settings.cardTitleTemplate.template - - subtitlePattern = - settings.cardSubtitleTemplate.template - in - a - (class "content" :: cardAction) - [ if fieldHidden Data.Fields.Direction then - div [ class "header" ] - [ IT.render titlePattern item |> text - ] - - else - div - [ class "header" - , IT.render IT.direction item |> title - ] - [ dirIcon - , IT.render titlePattern item |> text - ] - , div - [ classList - [ ( "ui right corner label", True ) - , ( cardColor, True ) - , ( "invisible", isConfirmed ) - ] - , title "New" - ] - [ i [ class "exclamation icon" ] [] - ] - , div - [ classList - [ ( "meta", True ) - , ( "invisible hidden", fieldHidden Data.Fields.Date ) - ] - ] - [ IT.render subtitlePattern item |> text - ] - , div [ class "meta description" ] - [ mainTagsAndFields settings item - ] - ] - - -mainTagsAndFields : UiSettings -> ItemLight -> Html Msg -mainTagsAndFields settings item = - let - fieldHidden f = - Data.UiSettings.fieldHidden settings f - - hideTags = - item.tags == [] || fieldHidden Data.Fields.Tag - - hideFields = - item.customfields == [] || fieldHidden Data.Fields.CustomFields - - showTag tag = - div - [ classList - [ ( "ui basic label", True ) - , ( Data.UiSettings.tagColorString tag settings, True ) - ] - ] - [ i [ class "tag icon" ] [] - , div [ class "detail" ] - [ text tag.name - ] - ] - - showField fv = - Util.CustomField.renderValue "ui basic label" fv - - renderFields = - if hideFields then - [] - - else - List.sortBy Util.CustomField.nameOrLabel item.customfields - |> List.map showField - - renderTags = - if hideTags then - [] - - else - List.map showTag item.tags - in - div - [ classList - [ ( "ui right floated tiny labels", True ) - , ( "invisible hidden", hideTags && hideFields ) - ] - ] - (renderFields ++ renderTags) - - -previewImage : UiSettings -> List (Attribute Msg) -> Model -> ItemLight -> Html Msg -previewImage settings cardAction model item = - let - mainAttach = - currentAttachment model item - - previewUrl = - Maybe.map .id mainAttach - |> Maybe.map Api.attachmentPreviewURL - |> Maybe.withDefault (Api.itemBasePreviewURL item.id) - in - a - ([ class "image ds-card-image" - , Data.UiSettings.cardPreviewSize settings - ] - ++ cardAction - ) - [ img - [ class "preview-image" - , src previewUrl - , Data.UiSettings.cardPreviewSize settings - ] - [] - ] - - -previewMenu : UiSettings -> Model -> ItemLight -> Maybe AttachmentLight -> Html Msg -previewMenu settings model item mainAttach = - let - pageCount = - Maybe.andThen .pageCount mainAttach - |> Maybe.withDefault 0 - - mkAttachUrl id = - if settings.nativePdfPreview then - Api.fileURL id - - else - Api.fileURL id ++ "/view" - - attachUrl = - Maybe.map .id mainAttach - |> Maybe.map mkAttachUrl - |> Maybe.withDefault "/api/v1/sec/attachment/none" - - gotoFileBtn = - a - [ class "ui compact basic icon button" - , href attachUrl - , target "_self" - , title "Open attachment file" - ] - [ i [ class "eye icon" ] [] - ] - in - if pageCount == 0 || (List.length item.attachments == 1 && pageCount == 1) then - div [ class "card-attachment-nav" ] - [ gotoFileBtn - ] - - else if List.length item.attachments == 1 then - div [ class "card-attachment-nav" ] - [ div [ class "ui small top attached basic icon buttons" ] - [ gotoFileBtn - ] - , div [ class "ui attached basic fitted center aligned blue segment" ] - [ span - [ title "Number of pages" - ] - [ text (String.fromInt pageCount) - , text "p." - ] - ] - ] - - else - div [ class "card-attachment-nav" ] - [ div [ class "ui small top attached basic icon buttons" ] - [ gotoFileBtn - , a - [ class "ui compact icon button" - , href "#" - , onClick (CyclePreview item) - ] - [ i [ class "arrow right icon" ] [] - ] - ] - , div [ class "ui attached basic blue fitted center aligned segment" ] - [ currentPosition model item - |> String.fromInt - |> text - , text "/" - , text (List.length item.attachments |> String.fromInt) - , text ", " - , text (String.fromInt pageCount) - , text "p." - ] - ] - - -renderHighlightEntry : HighlightEntry -> Html Msg -renderHighlightEntry entry = - let - stripWhitespace str = - String.trim str - |> String.replace "```" "" - |> String.replace "\t" " " - |> String.replace "\n\n" "\n" - |> String.lines - |> List.map String.trim - |> String.join "\n" - in - div [ class "item" ] - [ div [ class "content" ] - (div [ class "header" ] - [ i [ class "caret right icon" ] [] - , text (entry.name ++ ":") - ] - :: List.map - (\str -> - Markdown.toHtml [ class "description" ] <| - (stripWhitespace str ++ "…") - ) - entry.lines - ) - ] - - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/ItemCardList.elm b/modules/webapp/src/main/elm/Comp/ItemCardList.elm index fb9f78a3..e3432c19 100644 --- a/modules/webapp/src/main/elm/Comp/ItemCardList.elm +++ b/modules/webapp/src/main/elm/Comp/ItemCardList.elm @@ -7,7 +7,6 @@ module Comp.ItemCardList exposing , prevItem , update , updateDrag - , view , view2 ) @@ -140,7 +139,7 @@ updateDrag dm _ msg model = ---- View +--- View2 type alias ViewConfig = @@ -149,56 +148,6 @@ type alias ViewConfig = } -view : ViewConfig -> UiSettings -> Model -> Html Msg -view cfg settings model = - div - [ classList - [ ( "ui container", True ) - , ( "multi-select-mode", isMultiSelectMode cfg ) - ] - ] - (List.map (viewGroup model cfg settings) model.results.groups) - - -viewGroup : Model -> ViewConfig -> UiSettings -> ItemLightGroup -> Html Msg -viewGroup model cfg settings group = - div [ class "item-group" ] - [ div [ class "ui horizontal divider header item-list" ] - [ i [ class "calendar alternate outline icon" ] [] - , text group.name - ] - , div [ class "ui stackable three cards" ] - (List.map (viewItem model cfg settings) group.items) - ] - - -viewItem : Model -> ViewConfig -> UiSettings -> ItemLight -> Html Msg -viewItem model cfg settings item = - let - currentClass = - if cfg.current == Just item.id then - "current" - - else - "" - - vvcfg = - Comp.ItemCard.ViewConfig cfg.selection currentClass - - cardModel = - Dict.get item.id model.itemCards - |> Maybe.withDefault Comp.ItemCard.init - - cardHtml = - Comp.ItemCard.view vvcfg settings cardModel item - in - Html.map (ItemCardMsg item) cardHtml - - - ---- View2 - - view2 : ViewConfig -> UiSettings -> Model -> Html Msg view2 cfg settings model = div diff --git a/modules/webapp/src/main/elm/Comp/ItemDetail.elm b/modules/webapp/src/main/elm/Comp/ItemDetail.elm index 02a246d4..b295c7a9 100644 --- a/modules/webapp/src/main/elm/Comp/ItemDetail.elm +++ b/modules/webapp/src/main/elm/Comp/ItemDetail.elm @@ -2,14 +2,12 @@ module Comp.ItemDetail exposing ( Model , emptyModel , update - , view , view2 ) import Browser.Navigation as Nav import Comp.ItemDetail.Model exposing (Msg(..), UpdateResult) import Comp.ItemDetail.Update -import Comp.ItemDetail.View import Comp.ItemDetail.View2 import Data.Flags exposing (Flags) import Data.ItemNav exposing (ItemNav) @@ -32,11 +30,6 @@ update = Comp.ItemDetail.Update.update -view : ItemNav -> UiSettings -> Model -> Html Msg -view = - Comp.ItemDetail.View.view - - view2 : ItemNav -> UiSettings -> Model -> Html Msg view2 = Comp.ItemDetail.View2.view diff --git a/modules/webapp/src/main/elm/Comp/ItemDetail/AttachmentTabMenu.elm b/modules/webapp/src/main/elm/Comp/ItemDetail/AttachmentTabMenu.elm deleted file mode 100644 index 9f7765fb..00000000 --- a/modules/webapp/src/main/elm/Comp/ItemDetail/AttachmentTabMenu.elm +++ /dev/null @@ -1,181 +0,0 @@ -module Comp.ItemDetail.AttachmentTabMenu exposing (view) - -import Api -import Api.Model.Attachment exposing (Attachment) -import Comp.ItemDetail.Model exposing (Model, Msg(..)) -import Comp.SentMails -import Html exposing (Html, a, div, i, img, text) -import Html.Attributes exposing (class, classList, href, src, title) -import Html.Events exposing (onClick) -import Html5.DragDrop as DD -import Util.List -import Util.Maybe -import Util.String - - -view : Model -> List (Html Msg) -view model = - [ div [ class "ui top attached tabular menu" ] - (activeAttach model - :: selectMenu model - ++ sentMailsTab model - ) - , div - [ classList - [ ( "ui attached segment", model.attachMenuOpen ) - , ( "invisible hidden", not model.attachMenuOpen ) - ] - ] - [ div [ class "ui doubling small cards" ] - (List.indexedMap (menuItem model) model.item.attachments) - ] - ] - - -activeAttach : Model -> Html Msg -activeAttach model = - let - attachM = - Util.Maybe.or - [ Util.List.get model.item.attachments model.visibleAttach - |> Maybe.map (Tuple.pair model.visibleAttach) - , List.head model.item.attachments - |> Maybe.map (Tuple.pair 0) - ] - - visible = - not model.sentMailsOpen - in - case attachM of - Just ( pos, attach ) -> - a - ([ classList - [ ( "active", visible ) - , ( "item", True ) - ] - , title (Maybe.withDefault "No Name" attach.name) - , href "#" - ] - ++ (if visible then - [] - - else - [ onClick (SetActiveAttachment pos) ] - ) - ) - [ Maybe.map (Util.String.ellipsis 30) attach.name - |> Maybe.withDefault "No Name" - |> text - , a - [ classList - [ ( "right-tab-icon-link", True ) - , ( "invisible hidden", not visible ) - ] - , href "#" - , onClick (EditAttachNameStart attach.id) - ] - [ i [ class "grey edit link icon" ] [] - ] - ] - - Nothing -> - div [] [] - - -selectMenu : Model -> List (Html Msg) -selectMenu model = - case model.item.attachments of - [] -> - [] - - [ _ ] -> - [] - - _ -> - [ a - [ class "ui dropdown item" - , href "#" - , onClick ToggleAttachMenu - ] - [ i - [ classList - [ ( "large ellipsis icon", True ) - , ( "horizontal", not model.attachMenuOpen ) - , ( "vertical", model.attachMenuOpen ) - ] - ] - [] - ] - ] - - -menuItem : Model -> Int -> Attachment -> Html Msg -menuItem model pos attach = - let - highlight = - let - dropId = - DD.getDropId model.attachDD - - dragId = - DD.getDragId model.attachDD - - enable = - Just attach.id == dropId && dropId /= dragId - in - [ ( "current-drop-target", enable ) - ] - - active = - model.visibleAttach == pos - in - a - ([ classList <| - [ ( "ui card", True ) - , ( "blue", pos == 0 ) - ] - ++ highlight - , href "#" - , onClick (SetActiveAttachment pos) - ] - ++ DD.draggable AttachDDMsg attach.id - ++ DD.droppable AttachDDMsg attach.id - ) - [ div - [ classList [ ( "invisible hidden", not active ) ] - , class "ui corner icon label" - ] - [ i [ class "check icon" ] [] - ] - , div [ class "image" ] - [ img - [ src (Api.attachmentPreviewURL attach.id) - ] - [] - ] - , div [ class "content" ] - [ div [ class "description" ] - [ Maybe.map (Util.String.ellipsis 60) attach.name - |> Maybe.withDefault "No Name" - |> text - ] - ] - ] - - -sentMailsTab : Model -> List (Html Msg) -sentMailsTab model = - if Comp.SentMails.isEmpty model.sentMails then - [] - - else - [ div - [ classList - [ ( "right item", True ) - , ( "active", model.sentMailsOpen ) - ] - , onClick ToggleSentMails - ] - [ text "E-Mails" - ] - ] diff --git a/modules/webapp/src/main/elm/Comp/ItemDetail/MultiEditMenu.elm b/modules/webapp/src/main/elm/Comp/ItemDetail/MultiEditMenu.elm index 575d4607..5a4703b9 100644 --- a/modules/webapp/src/main/elm/Comp/ItemDetail/MultiEditMenu.elm +++ b/modules/webapp/src/main/elm/Comp/ItemDetail/MultiEditMenu.elm @@ -6,7 +6,6 @@ module Comp.ItemDetail.MultiEditMenu exposing , init , loadModel , update - , view , view2 ) @@ -626,257 +625,12 @@ type alias ViewConfig = defaultViewConfig : ViewConfig defaultViewConfig = - { menuClass = "ui vertical segment" + { menuClass = "" , nameState = SaveSuccess , customFieldState = \_ -> SaveSuccess } -view : ViewConfig -> UiSettings -> Model -> Html Msg -view = - renderEditForm - - -renderEditForm : ViewConfig -> UiSettings -> Model -> Html Msg -renderEditForm cfg settings model = - let - fieldVisible field = - Data.UiSettings.fieldVisible settings field - - optional fields html = - if - List.map fieldVisible fields - |> List.foldl (||) False - then - html - - else - span [ class "invisible hidden" ] [] - - tagModeIcon = - case model.tagEditMode of - AddTags -> - i [ class "grey plus link icon" ] [] - - RemoveTags -> - i [ class "grey eraser link icon" ] [] - - ReplaceTags -> - i [ class "grey redo alternate link icon" ] [] - - tagModeMsg = - case model.tagEditMode of - AddTags -> - "Tags chosen here are *added* to all selected items." - - RemoveTags -> - "Tags chosen here are *removed* from all selected items." - - ReplaceTags -> - "Tags chosen here *replace* those on selected items." - - customFieldIcon field = - case cfg.customFieldState field.id of - SaveSuccess -> - Nothing - - SaveFailed -> - Just "red exclamation triangle icon" - - Saving -> - Just "refresh loading icon" - - customFieldSettings = - Comp.CustomFieldMultiInput.ViewSettings - False - "field" - customFieldIcon - in - div [ class cfg.menuClass ] - [ div [ class "ui form warning" ] - [ div [ class "field" ] - [ div - [ class "ui fluid buttons" - ] - [ button - [ class "ui primary button" - , onClick (ConfirmMsg True) - ] - [ text "Confirm" - ] - , div [ class "or" ] [] - , button - [ class "ui secondary button" - , onClick (ConfirmMsg False) - ] - [ text "Unconfirm" - ] - ] - ] - , optional [ Data.Fields.Tag ] <| - div [ class "field" ] - [ label [] - [ Icons.tagsIcon "grey" - , text "Tags" - , a - [ class "right-float" - , href "#" - , title "Change tag edit mode" - , onClick ToggleTagEditMode - ] - [ tagModeIcon - ] - ] - , Html.map TagDropdownMsg (Comp.Dropdown.view settings model.tagModel) - , Markdown.toHtml [ class "small-info" ] tagModeMsg - ] - , div [ class " field" ] - [ label [] [ text "Name" ] - , div [ class "ui icon input" ] - [ input [ type_ "text", value model.nameModel, onInput SetName ] [] - , i - [ classList - [ ( "green check icon", cfg.nameState == SaveSuccess ) - , ( "red exclamation triangle icon", cfg.nameState == SaveFailed ) - , ( "sync loading icon", cfg.nameState == Saving ) - ] - ] - [] - ] - ] - , optional [ Data.Fields.Folder ] <| - div [ class "field" ] - [ label [] - [ Icons.folderIcon "grey" - , text "Folder" - ] - , Html.map FolderDropdownMsg (Comp.Dropdown.view settings model.folderModel) - , div - [ classList - [ ( "ui warning message", True ) - , ( "hidden", isFolderMember model ) - ] - ] - [ Markdown.toHtml [] """ -You are **not a member** of this folder. This item will be **hidden** -from any search now. Use a folder where you are a member of to make this -item visible. This message will disappear then. - """ - ] - ] - , optional [ Data.Fields.CustomFields ] <| - h4 [ class "ui dividing header" ] - [ Icons.customFieldIcon "" - , text "Custom Fields" - ] - , optional [ Data.Fields.CustomFields ] <| - Html.map CustomFieldMsg - (Comp.CustomFieldMultiInput.view customFieldSettings model.customFieldModel) - , optional [ Data.Fields.Date, Data.Fields.DueDate ] <| - h4 [ class "ui dividing header" ] - [ Icons.itemDatesIcon "" - , text "Item Dates" - ] - , optional [ Data.Fields.Date ] <| - div [ class "field" ] - [ label [] - [ Icons.dateIcon "grey" - , text "Date" - ] - , div [ class "ui left icon action input" ] - [ Html.map ItemDatePickerMsg - (Comp.DatePicker.viewTime - model.itemDate - actionInputDatePicker - model.itemDatePicker - ) - , a [ class "ui icon button", href "#", onClick RemoveDate ] - [ i [ class "trash alternate outline icon" ] [] - ] - , Icons.dateIcon "" - ] - ] - , optional [ Data.Fields.DueDate ] <| - div [ class " field" ] - [ label [] - [ Icons.dueDateIcon "grey" - , text "Due Date" - ] - , div [ class "ui left icon action input" ] - [ Html.map DueDatePickerMsg - (Comp.DatePicker.viewTime - model.dueDate - actionInputDatePicker - model.dueDatePicker - ) - , a [ class "ui icon button", href "#", onClick RemoveDueDate ] - [ i [ class "trash alternate outline icon" ] [] ] - , Icons.dueDateIcon "" - ] - ] - , optional [ Data.Fields.CorrOrg, Data.Fields.CorrPerson ] <| - h4 [ class "ui dividing header" ] - [ Icons.correspondentIcon "" - , text "Correspondent" - ] - , optional [ Data.Fields.CorrOrg ] <| - div [ class "field" ] - [ label [] - [ Icons.organizationIcon "grey" - , text "Organization" - ] - , Html.map OrgDropdownMsg (Comp.Dropdown.view settings model.corrOrgModel) - ] - , optional [ Data.Fields.CorrPerson ] <| - div [ class "field" ] - [ label [] - [ Icons.personIcon "grey" - , text "Person" - ] - , Html.map CorrPersonMsg (Comp.Dropdown.view settings model.corrPersonModel) - ] - , optional [ Data.Fields.ConcPerson, Data.Fields.ConcEquip ] <| - h4 [ class "ui dividing header" ] - [ Icons.concernedIcon - , text "Concerning" - ] - , optional [ Data.Fields.ConcPerson ] <| - div [ class "field" ] - [ label [] - [ Icons.personIcon "grey" - , text "Person" - ] - , Html.map ConcPersonMsg (Comp.Dropdown.view settings model.concPersonModel) - ] - , optional [ Data.Fields.ConcEquip ] <| - div [ class "field" ] - [ label [] - [ Icons.equipmentIcon "grey" - , text "Equipment" - ] - , Html.map ConcEquipMsg (Comp.Dropdown.view settings model.concEquipModel) - ] - , optional [ Data.Fields.Direction ] <| - div [ class "field" ] - [ label [] - [ Icons.directionIcon "grey" - , text "Direction" - ] - , Html.map DirDropdownMsg (Comp.Dropdown.view settings model.directionModel) - ] - ] - ] - - -actionInputDatePicker : DatePicker.Settings -actionInputDatePicker = - let - ds = - Comp.DatePicker.defaultSettings - in - { ds | containerClassList = [ ( "ui action input", True ) ] } - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/ItemDetail/View.elm b/modules/webapp/src/main/elm/Comp/ItemDetail/View.elm deleted file mode 100644 index 016583e3..00000000 --- a/modules/webapp/src/main/elm/Comp/ItemDetail/View.elm +++ /dev/null @@ -1,1221 +0,0 @@ -module Comp.ItemDetail.View exposing (view) - -import Api -import Api.Model.Attachment exposing (Attachment) -import Api.Model.IdName exposing (IdName) -import Comp.AttachmentMeta -import Comp.CustomFieldMultiInput -import Comp.DatePicker -import Comp.DetailEdit -import Comp.Dropdown -import Comp.Dropzone -import Comp.ItemDetail.AttachmentTabMenu -import Comp.ItemDetail.Model - exposing - ( Model - , Msg(..) - , NotesField(..) - , SaveNameState(..) - , personMatchesOrg - ) -import Comp.ItemMail -import Comp.KeyInput -import Comp.LinkTarget -import Comp.MarkdownInput -import Comp.SentMails -import Comp.YesNoDimmer -import Data.Direction -import Data.Fields -import Data.Icons as Icons -import Data.ItemNav exposing (ItemNav) -import Data.UiSettings exposing (UiSettings) -import DatePicker -import Dict -import File exposing (File) -import Html exposing (..) -import Html.Attributes exposing (..) -import Html.Events exposing (onCheck, onClick, onInput) -import Markdown -import Page exposing (Page(..)) -import Set -import Util.File exposing (makeFileId) -import Util.Folder -import Util.List -import Util.Maybe -import Util.Size -import Util.String -import Util.Time - - -view : ItemNav -> UiSettings -> Model -> Html Msg -view inav settings model = - div - [] - [ renderItemInfo settings model - , renderDetailMenu settings inav model - , renderMailForm settings model - , renderAddFilesForm model - , div [ class "ui grid" ] - [ Html.map DeleteItemConfirm (Comp.YesNoDimmer.view model.deleteItemConfirm) - , div - [ classList - [ ( "sixteen wide mobile six wide tablet five wide computer column", True ) - , ( "invisible", not model.menuOpen ) - ] - ] - (if model.menuOpen then - renderEditMenu settings model - - else - [] - ) - , div - [ classList - [ ( "sixteen wide mobile ten wide tablet eleven wide computer column", model.menuOpen ) - , ( "sixteen", not model.menuOpen ) - , ( "wide column", True ) - ] - ] - <| - List.concat - [ if settings.itemDetailNotesPosition == Data.UiSettings.Top then - [ renderNotes model ] - - else - [] - , renderAttachmentsTabMenu model - , renderAttachmentsTabBody settings model - , renderIdInfo model - , if settings.itemDetailNotesPosition == Data.UiSettings.Bottom then - [ renderNotes model ] - - else - [] - ] - ] - ] - - - ---- Helper - - -renderDetailMenu : UiSettings -> ItemNav -> Model -> Html Msg -renderDetailMenu settings inav model = - let - keyDescr name = - if settings.itemDetailShortcuts && model.menuOpen then - " Key '" ++ name ++ "'." - - else - "" - in - div - [ classList - [ ( "ui ablue-comp menu", True ) - , ( "top attached" - , model.mailOpen - || model.addFilesOpen - ) - ] - ] - [ a [ class "item", Page.href HomePage ] - [ i [ class "arrow left icon" ] [] - ] - , a - [ classList - [ ( "item", True ) - , ( "disabled", inav.prev == Nothing ) - ] - , Maybe.map ItemDetailPage inav.prev - |> Maybe.map Page.href - |> Maybe.withDefault (href "#") - , title ("Previous item." ++ keyDescr "Ctrl-,") - ] - [ i [ class "caret square left outline icon" ] [] - ] - , a - [ classList - [ ( "item", True ) - , ( "disabled", inav.next == Nothing ) - ] - , Maybe.map ItemDetailPage inav.next - |> Maybe.map Page.href - |> Maybe.withDefault (href "#") - , title ("Next item." ++ keyDescr "Ctrl-.") - ] - [ i [ class "caret square right outline icon" ] [] - ] - , a - [ classList - [ ( "toggle item", True ) - , ( "active", model.menuOpen ) - ] - , title "Edit Metadata" - , onClick ToggleMenu - , href "#" - ] - [ i [ class "edit icon" ] [] - ] - , a - [ classList - [ ( "toggle item", True ) - , ( "active", model.mailOpen ) - ] - , title "Send Mail" - , onClick ToggleMail - , href "#" - ] - [ i [ class "mail outline icon" ] [] - ] - , a - [ classList - [ ( "toggle item", True ) - , ( "active", model.addFilesOpen ) - ] - , if model.addFilesOpen then - title "Close" - - else - title "Add Files" - , onClick AddFilesToggle - , href "#" - ] - [ Icons.addFilesIcon - ] - ] - - -actionInputDatePicker : DatePicker.Settings -actionInputDatePicker = - Comp.DatePicker.defaultSettings - - -renderIdInfo : Model -> List (Html msg) -renderIdInfo model = - [ div [ class "ui bottom attached segment" ] - [ div [ class "ui center aligned container" ] - [ div [ class "ui bulleted mini horizontal list small-info" ] - [ div [ class "item" ] - [ i [ class "bullseye icon" ] [] - , text model.item.id - ] - , div [ class "item" ] - [ i [ class "sun outline icon" ] [] - , Util.Time.formatDateTime model.item.created |> text - ] - , div [ class "item" ] - [ i [ class "pencil alternate icon" ] [] - , Util.Time.formatDateTime model.item.updated |> text - ] - ] - ] - ] - ] - - -renderNotes : Model -> Html Msg -renderNotes model = - case model.notesField of - ViewNotes -> - div [ class "ui segments" ] - [ div [ class "ui segment" ] - [ div [ class "ui two column grid" ] - [ div [ class "column" ] - [ p [ class "ui header" ] - [ text "Notes" - ] - ] - , div [ class "right aligned column" ] - [ a - [ class "ui basic icon link" - , onClick ToggleEditNotes - , href "#" - ] - [ i [ class "edit icon" ] [] - ] - ] - ] - ] - , div [ class "ui segment" ] - [ Markdown.toHtml [] (Maybe.withDefault "" model.item.notes) - ] - ] - - EditNotes mm -> - let - classes act = - classList - [ ( "item", True ) - , ( "active", act ) - ] - in - div [ class "ui segments" ] - [ div [ class "ui segment" ] - [ div [ class "ui grid" ] - [ div [ class "two wide column" ] - [ p [ class "ui header" ] - [ text "Notes" - ] - ] - , div [ class "eleven wide center aligned column" ] - [ div [ class "ui horizontal bulleted link list" ] - [ Html.map NotesEditMsg - (Comp.MarkdownInput.viewEditLink classes mm) - , Html.map NotesEditMsg - (Comp.MarkdownInput.viewPreviewLink classes mm) - , Html.map NotesEditMsg - (Comp.MarkdownInput.viewSplitLink classes mm) - ] - ] - , div [ class "right aligned three wide column" ] - [ div [ class "ui horizontal link list" ] - [ Comp.MarkdownInput.viewCheatLink "item" mm - ] - ] - ] - ] - , div [ class "ui segment" ] - [ Html.map NotesEditMsg - (Comp.MarkdownInput.viewContent - (Maybe.withDefault "" model.notesModel) - mm - ) - , div [ class "ui secondary menu" ] - [ a - [ class "link item" - , href "#" - , onClick SaveNotes - ] - [ i [ class "save outline icon" ] [] - , text "Save" - ] - , a - [ classList - [ ( "link item", True ) - , ( "invisible hidden", Util.String.isNothingOrBlank model.item.notes ) - ] - , href "#" - , onClick ToggleEditNotes - ] - [ i [ class "cancel icon" ] [] - , text "Cancel" - ] - ] - ] - ] - - -attachmentVisible : Model -> Int -> Bool -attachmentVisible model pos = - not model.sentMailsOpen - && (if model.visibleAttach >= List.length model.item.attachments then - pos == 0 - - else - model.visibleAttach == pos - ) - - -renderAttachmentsTabMenu : Model -> List (Html Msg) -renderAttachmentsTabMenu model = - Comp.ItemDetail.AttachmentTabMenu.view model - - -renderAttachmentView : UiSettings -> Model -> Int -> Attachment -> Html Msg -renderAttachmentView settings model pos attach = - let - fileUrl = - Api.fileURL attach.id - - attachName = - Maybe.withDefault "No name" attach.name - - hasArchive = - List.map .id model.item.archives - |> List.member attach.id - in - div - [ classList - [ ( "ui attached tab segment", True ) - , ( "active", attachmentVisible model pos ) - ] - ] - [ Html.map (DeleteAttachConfirm attach.id) (Comp.YesNoDimmer.view model.deleteAttachConfirm) - , renderEditAttachmentName model attach - , div [ class "ui small secondary menu" ] - [ div [ class "horizontally fitted item" ] - [ i [ class "file outline icon" ] [] - , text attachName - , text " (" - , text (Util.Size.bytesReadable Util.Size.B (toFloat attach.size)) - , text ")" - ] - , div [ class "item" ] - [ div [ class "ui slider checkbox" ] - [ input - [ type_ "checkbox" - , onCheck (\_ -> TogglePdfNativeView settings.nativePdfPreview) - , checked (Maybe.withDefault settings.nativePdfPreview model.pdfNativeView) - ] - [] - , label [] [ text "Native view" ] - ] - ] - , div [ class "right menu" ] - [ a - [ classList - [ ( "item", True ) - ] - , title "Delete this file permanently" - , href "#" - , onClick (RequestDeleteAttachment attach.id) - ] - [ i [ class "red trash icon" ] [] - ] - , a - [ classList - [ ( "item", True ) - , ( "invisible", not hasArchive ) - ] - , title "Download the original archive file." - , href (fileUrl ++ "/archive") - , target "_new" - ] - [ i [ class "file archive outline icon" ] [] - ] - , a - [ classList - [ ( "item", True ) - , ( "disabled", not attach.converted ) - ] - , title - (if attach.converted then - case Util.List.find (\s -> s.id == attach.id) model.item.sources of - Just src -> - "Goto original: " - ++ Maybe.withDefault "" src.name - - Nothing -> - "Goto original file" - - else - "The file was not converted." - ) - , href (fileUrl ++ "/original") - , target "_new" - ] - [ i [ class "external square alternate icon" ] [] - ] - , a - [ classList - [ ( "toggle item", True ) - , ( "active", isAttachMetaOpen model attach.id ) - ] - , title "Show extracted data" - , onClick (AttachMetaClick attach.id) - , href "#" - ] - [ i [ class "info icon" ] [] - ] - , a - [ class "item" - , title "Download PDF to disk" - , download attachName - , href fileUrl - ] - [ i [ class "download icon" ] [] - ] - ] - ] - , div - [ classList - [ ( "ui 4:3 embed doc-embed", True ) - , ( "invisible hidden", isAttachMetaOpen model attach.id ) - ] - ] - [ iframe - [ if Maybe.withDefault settings.nativePdfPreview model.pdfNativeView then - src fileUrl - - else - src (fileUrl ++ "/view") - ] - [] - ] - , div - [ classList - [ ( "ui basic segment", True ) - , ( "invisible hidden", not (isAttachMetaOpen model attach.id) ) - ] - ] - [ case Dict.get attach.id model.attachMeta of - Just am -> - Html.map (AttachMetaMsg attach.id) - (Comp.AttachmentMeta.view am) - - Nothing -> - span [] [] - ] - ] - - -isAttachMetaOpen : Model -> String -> Bool -isAttachMetaOpen model id = - model.attachMetaOpen && (Dict.get id model.attachMeta /= Nothing) - - -renderAttachmentsTabBody : UiSettings -> Model -> List (Html Msg) -renderAttachmentsTabBody settings model = - let - mailTab = - if Comp.SentMails.isEmpty model.sentMails then - [] - - else - [ div - [ classList - [ ( "ui attached tab segment", True ) - , ( "active", model.sentMailsOpen ) - ] - ] - [ h3 [ class "ui header" ] - [ text "Sent E-Mails" - ] - , Html.map SentMailsMsg (Comp.SentMails.view model.sentMails) - ] - ] - in - List.indexedMap (renderAttachmentView settings model) model.item.attachments - ++ mailTab - - -renderItemInfo : UiSettings -> Model -> Html Msg -renderItemInfo settings model = - let - date = - ( div - [ class "item" - , title "Item Date" - ] - [ Maybe.withDefault model.item.created model.item.itemDate - |> Util.Time.formatDate - |> text - ] - , Data.UiSettings.fieldVisible settings Data.Fields.Date - ) - - duedate = - ( div - [ class "item" - , title "Due Date" - ] - [ Icons.dueDateIcon "grey" - , Maybe.map Util.Time.formatDate model.item.dueDate - |> Maybe.withDefault "" - |> text - ] - , Data.UiSettings.fieldVisible settings Data.Fields.DueDate - && Util.Maybe.nonEmpty model.item.dueDate - ) - - corr = - ( div - [ class "item" - , title "Correspondent" - ] - (Icons.correspondentIcon "" - :: Comp.LinkTarget.makeCorrLink model.item [] SetLinkTarget - ) - , Data.UiSettings.fieldVisible settings Data.Fields.CorrOrg - || Data.UiSettings.fieldVisible settings Data.Fields.CorrPerson - ) - - conc = - ( div - [ class "item" - , title "Concerning" - ] - (Icons.concernedIcon - :: Comp.LinkTarget.makeConcLink model.item [] SetLinkTarget - ) - , Data.UiSettings.fieldVisible settings Data.Fields.ConcEquip - || Data.UiSettings.fieldVisible settings Data.Fields.ConcPerson - ) - - itemfolder = - ( div - [ class "item" - , title "Folder" - ] - [ Icons.folderIcon "" - , Comp.LinkTarget.makeFolderLink model.item [] SetLinkTarget - ] - , Data.UiSettings.fieldVisible settings Data.Fields.Folder - ) - - src = - ( div - [ class "item" - , title "Source" - ] - [ Icons.sourceIcon "" - , Comp.LinkTarget.makeSourceLink [] SetLinkTarget model.item.source - ] - , True - ) - in - div [ class "ui fluid container" ] - (h2 - [ class "ui header" - ] - [ i - [ classList - [ ( Data.Direction.iconFromString model.item.direction, True ) - , ( "hidden invisible", Data.UiSettings.fieldHidden settings Data.Fields.Direction ) - ] - , title model.item.direction - ] - [] - , div [ class "content" ] - [ text model.item.name - , div - [ classList - [ ( "ui teal label", True ) - , ( "invisible", model.item.state /= "created" ) - ] - ] - [ text "New!" - ] - , div [ class "sub header" ] - [ div [ class "ui horizontal bulleted link list" ] - (List.filter Tuple.second - [ date - , corr - , conc - , itemfolder - , src - , duedate - ] - |> List.map Tuple.first - ) - ] - ] - ] - :: renderTagsAndFields settings model - ) - - -renderTagsAndFields : UiSettings -> Model -> List (Html Msg) -renderTagsAndFields settings model = - [ div [ class "ui fluid right aligned container" ] - (renderTags settings model ++ renderCustomValues settings model) - ] - - -renderTags : UiSettings -> Model -> List (Html Msg) -renderTags settings model = - let - tagView t = - Comp.LinkTarget.makeTagLink - (IdName t.id t.name) - [ ( "ui tag label", True ) - , ( Data.UiSettings.tagColorString t settings, True ) - ] - SetLinkTarget - in - if Data.UiSettings.fieldHidden settings Data.Fields.Tag || model.item.tags == [] then - [] - - else - List.map tagView model.item.tags - - -renderCustomValues : UiSettings -> Model -> List (Html Msg) -renderCustomValues settings model = - let - fieldView cv = - Comp.LinkTarget.makeCustomFieldLink - cv - [ ( "ui secondary basic label", True ) ] - SetLinkTarget - - labelThenName cv = - Maybe.withDefault cv.name cv.label - in - if Data.UiSettings.fieldHidden settings Data.Fields.CustomFields || model.item.customfields == [] then - [] - - else - List.map fieldView (List.sortBy labelThenName model.item.customfields) - - -renderEditMenu : UiSettings -> Model -> List (Html Msg) -renderEditMenu settings model = - [ Html.map ModalEditMsg (Comp.DetailEdit.viewModal settings model.modalEdit) - , div - (if settings.itemDetailShortcuts then - Comp.KeyInput.eventsM KeyInputMsg - - else - [] - ) - [ renderEditButtons settings model - , renderEditForm settings model - ] - ] - - -renderEditButtons : UiSettings -> Model -> Html Msg -renderEditButtons settings model = - let - keyDescr name = - if settings.itemDetailShortcuts then - " Key '" ++ name ++ "'." - - else - "" - in - div [ class "ui top attached icon ablue-comp menu" ] - [ a - [ classList - [ ( "borderless item", True ) - , ( "invisible", model.item.state /= "created" ) - ] - , title ("Confirm metadata." ++ keyDescr "Ctrl-c") - , href "#" - , onClick ConfirmItem - ] - [ i [ class "check icon" ] [] - ] - , a - [ classList - [ ( "borderless item", True ) - , ( "invisible", model.item.state /= "confirmed" ) - ] - , href "#" - , title ("Unconfirm metadata." ++ keyDescr "Ctrl-c") - , onClick UnconfirmItem - ] - [ i [ class "eye slash outline icon" ] [] - ] - , div [ class "right floated menu" ] - [ a - [ class "borderless item" - , onClick RequestDelete - , href "#" - , title "Delete the item" - ] - [ i [ class "red trash icon" ] [] - ] - ] - ] - - -renderEditForm : UiSettings -> Model -> Html Msg -renderEditForm settings model = - let - addIconLink tip m = - a - [ class "right-float" - , href "#" - , title tip - , onClick m - ] - [ i [ class "grey plus link icon" ] [] - ] - - editIconLink tip dm m = - a - [ classList - [ ( "right-float", True ) - , ( "invisible hidden", Comp.Dropdown.notSelected dm ) - ] - , href "#" - , title tip - , onClick m - ] - [ i [ class "grey pencil alternate link icon" ] [] - ] - - fieldVisible field = - Data.UiSettings.fieldVisible settings field - - optional fields html = - if - List.map fieldVisible fields - |> List.foldl (||) False - then - html - - else - span [ class "invisible hidden" ] [] - - showCustomFields = - fieldVisible Data.Fields.CustomFields - - customFieldSettings = - Comp.CustomFieldMultiInput.ViewSettings - True - "field" - (\f -> Dict.get f.id model.customFieldSavingIcon) - in - div [ class "ui attached segment" ] - [ div [ class "ui form warning" ] - [ div [ class " field" ] - [ label [] [ text "Name" ] - , div [ class "ui icon input" ] - [ input [ type_ "text", value model.nameModel, onInput SetName ] [] - , i - [ classList - [ ( "green check icon", model.nameState == SaveSuccess ) - , ( "red exclamation triangle icon", model.nameState == SaveFailed ) - , ( "sync loading icon", model.nameState == Saving ) - ] - ] - [] - ] - ] - , optional [ Data.Fields.Tag ] <| - div [ class "field" ] - [ label [] - [ Icons.tagsIcon "grey" - , text "Tags" - , addIconLink "Add new tag" StartTagModal - ] - , Html.map TagDropdownMsg (Comp.Dropdown.view settings model.tagModel) - ] - , optional [ Data.Fields.Folder ] <| - div [ class "field" ] - [ label [] - [ Icons.folderIcon "grey" - , text "Folder" - ] - , Html.map FolderDropdownMsg (Comp.Dropdown.view settings model.folderModel) - , div - [ classList - [ ( "ui warning message", True ) - , ( "hidden", isFolderMember model ) - ] - ] - [ Markdown.toHtml [] """ -You are **not a member** of this folder. This item will be **hidden** -from any search now. Use a folder where you are a member of to make this -item visible. This message will disappear then. - """ - ] - ] - , if showCustomFields then - h4 [ class "ui dividing header" ] - [ Icons.customFieldIcon "" - , text "Custom Fields" - ] - - else - span [ class "hidden invisible" ] [] - , if showCustomFields then - Html.map CustomFieldMsg - (Comp.CustomFieldMultiInput.view customFieldSettings model.customFieldsModel) - - else - span [ class "hidden invisible" ] [] - , optional [ Data.Fields.DueDate, Data.Fields.Date ] <| - h4 [ class "ui dividing header" ] - [ Icons.itemDatesIcon "" - , text "Item Dates" - ] - , optional [ Data.Fields.Date ] <| - div [ class "field" ] - [ label [] - [ Icons.dateIcon "grey" - , text "Item Date" - ] - , div [ class "ui left icon action input" ] - [ Html.map ItemDatePickerMsg - (Comp.DatePicker.viewTime - model.itemDate - actionInputDatePicker - model.itemDatePicker - ) - , a [ class "ui icon button", href "#", onClick RemoveDate ] - [ i [ class "trash alternate outline icon" ] [] - ] - , Icons.dateIcon "" - ] - , renderItemDateSuggestions model - ] - , optional [ Data.Fields.DueDate ] <| - div [ class " field" ] - [ label [] - [ Icons.dueDateIcon "grey" - , text "Due Date" - ] - , div [ class "ui left icon action input" ] - [ Html.map DueDatePickerMsg - (Comp.DatePicker.viewTime - model.dueDate - actionInputDatePicker - model.dueDatePicker - ) - , a [ class "ui icon button", href "#", onClick RemoveDueDate ] - [ i [ class "trash alternate outline icon" ] [] ] - , Icons.dueDateIcon "" - ] - , renderDueDateSuggestions model - ] - , optional [ Data.Fields.CorrOrg, Data.Fields.CorrPerson ] <| - h4 [ class "ui dividing header" ] - [ Icons.correspondentIcon "" - , text "Correspondent" - ] - , optional [ Data.Fields.CorrOrg ] <| - div [ class "field" ] - [ label [] - [ Icons.organizationIcon "grey" - , text "Organization" - , addIconLink "Add new organization" StartCorrOrgModal - , editIconLink "Edit organization" model.corrOrgModel StartEditCorrOrgModal - ] - , Html.map OrgDropdownMsg (Comp.Dropdown.view settings model.corrOrgModel) - , renderOrgSuggestions model - ] - , optional [ Data.Fields.CorrPerson ] <| - div [ class "field" ] - [ label [] - [ Icons.personIcon "grey" - , text "Person" - , addIconLink "Add new correspondent person" StartCorrPersonModal - , editIconLink "Edit person" - model.corrPersonModel - (StartEditPersonModal model.corrPersonModel) - ] - , Html.map CorrPersonMsg (Comp.Dropdown.view settings model.corrPersonModel) - , renderCorrPersonSuggestions model - , div - [ classList - [ ( "ui warning message", True ) - , ( "invisible hidden", personMatchesOrg model ) - ] - ] - [ i [ class "info icon" ] [] - , text "The selected person doesn't belong to the selected organization." - ] - ] - , optional [ Data.Fields.ConcPerson, Data.Fields.ConcEquip ] <| - h4 [ class "ui dividing header" ] - [ Icons.concernedIcon - , text "Concerning" - ] - , optional [ Data.Fields.ConcPerson ] <| - div [ class "field" ] - [ label [] - [ Icons.personIcon "grey" - , text "Person" - , addIconLink "Add new concerning person" StartConcPersonModal - , editIconLink "Edit person" - model.concPersonModel - (StartEditPersonModal model.concPersonModel) - ] - , Html.map ConcPersonMsg (Comp.Dropdown.view settings model.concPersonModel) - , renderConcPersonSuggestions model - ] - , optional [ Data.Fields.ConcEquip ] <| - div [ class "field" ] - [ label [] - [ Icons.equipmentIcon "grey" - , text "Equipment" - , addIconLink "Add new equipment" StartEquipModal - , editIconLink "Edit equipment" - model.concEquipModel - StartEditEquipModal - ] - , Html.map ConcEquipMsg (Comp.Dropdown.view settings model.concEquipModel) - , renderConcEquipSuggestions model - ] - , optional [ Data.Fields.Direction ] <| - div [ class "field" ] - [ label [] - [ Icons.directionIcon "grey" - , text "Direction" - ] - , Html.map DirDropdownMsg (Comp.Dropdown.view settings model.directionModel) - ] - ] - ] - - -renderSuggestions : Model -> (a -> String) -> List a -> (a -> Msg) -> Html Msg -renderSuggestions model mkName idnames tagger = - div - [ classList - [ ( "ui secondary vertical menu", True ) - , ( "invisible", model.item.state /= "created" ) - ] - ] - [ div [ class "item" ] - [ div [ class "header" ] - [ text "Suggestions" - ] - , div [ class "menu" ] <| - (idnames - |> List.map (\p -> a [ class "item", href "#", onClick (tagger p) ] [ text (mkName p) ]) - ) - ] - ] - - -renderOrgSuggestions : Model -> Html Msg -renderOrgSuggestions model = - renderSuggestions model - .name - (List.take 6 model.itemProposals.corrOrg) - SetCorrOrgSuggestion - - -renderCorrPersonSuggestions : Model -> Html Msg -renderCorrPersonSuggestions model = - renderSuggestions model - .name - (List.take 6 model.itemProposals.corrPerson) - SetCorrPersonSuggestion - - -renderConcPersonSuggestions : Model -> Html Msg -renderConcPersonSuggestions model = - renderSuggestions model - .name - (List.take 6 model.itemProposals.concPerson) - SetConcPersonSuggestion - - -renderConcEquipSuggestions : Model -> Html Msg -renderConcEquipSuggestions model = - renderSuggestions model - .name - (List.take 6 model.itemProposals.concEquipment) - SetConcEquipSuggestion - - -renderItemDateSuggestions : Model -> Html Msg -renderItemDateSuggestions model = - renderSuggestions model - Util.Time.formatDate - (List.take 6 model.itemProposals.itemDate) - SetItemDateSuggestion - - -renderDueDateSuggestions : Model -> Html Msg -renderDueDateSuggestions model = - renderSuggestions model - Util.Time.formatDate - (List.take 6 model.itemProposals.dueDate) - SetDueDateSuggestion - - -renderMailForm : UiSettings -> Model -> Html Msg -renderMailForm settings model = - div - [ classList - [ ( "ui bottom attached segment", True ) - , ( "invisible hidden", not model.mailOpen ) - ] - ] - [ h4 [ class "ui header" ] - [ text "Send this item via E-Mail" - ] - , div - [ classList - [ ( "ui dimmer", True ) - , ( "active", model.mailSending ) - ] - ] - [ div [ class "ui text loader" ] - [ text "Sending …" - ] - ] - , Html.map ItemMailMsg (Comp.ItemMail.view settings model.itemMail) - , div - [ classList - [ ( "ui message", True ) - , ( "error" - , Maybe.map .success model.mailSendResult - |> Maybe.map not - |> Maybe.withDefault False - ) - , ( "success" - , Maybe.map .success model.mailSendResult - |> Maybe.withDefault False - ) - , ( "invisible hidden", model.mailSendResult == Nothing ) - ] - ] - [ Maybe.map .message model.mailSendResult - |> Maybe.withDefault "" - |> text - ] - ] - - -isIdle : Model -> File -> Bool -isIdle model file = - not (isLoading model file || isCompleted model file || isError model file) - - -isLoading : Model -> File -> Bool -isLoading model file = - Dict.member (makeFileId file) model.loading - - -isCompleted : Model -> File -> Bool -isCompleted model file = - Set.member (makeFileId file) model.completed - - -isError : Model -> File -> Bool -isError model file = - Set.member (makeFileId file) model.errored - - -isSuccessAll : Model -> Bool -isSuccessAll model = - List.map makeFileId model.selectedFiles - |> List.all (\id -> Set.member id model.completed) - - -renderAddFilesForm : Model -> Html Msg -renderAddFilesForm model = - div - [ classList - [ ( "ui bottom attached segment", True ) - , ( "invisible hidden", not model.addFilesOpen ) - ] - ] - [ h4 [ class "ui header" ] - [ text "Add more files to this item" - ] - , Html.map AddFilesMsg - (Comp.Dropzone.view - Comp.Dropzone.defaultSettings - model.addFilesModel - ) - , button - [ class "ui primary button" - , href "#" - , onClick AddFilesSubmitUpload - ] - [ text "Submit" - ] - , button - [ class "ui secondary button" - , href "#" - , onClick AddFilesReset - ] - [ text "Reset" - ] - , div - [ classList - [ ( "ui success message", True ) - , ( "invisible hidden", model.selectedFiles == [] || not (isSuccessAll model) ) - ] - ] - [ text "All files have been uploaded. They are being processed, some data " - , text "may not be available immediately. " - , a - [ class "link" - , href "#" - , onClick ReloadItem - ] - [ text "Refresh now" - ] - ] - , div [ class "ui items" ] - (List.map (renderFileItem model) model.selectedFiles) - ] - - -renderFileItem : Model -> File -> Html Msg -renderFileItem model file = - let - name = - File.name file - - size = - File.size file - |> toFloat - |> Util.Size.bytesReadable Util.Size.B - in - div [ class "item" ] - [ i - [ classList - [ ( "large", True ) - , ( "file outline icon", isIdle model file ) - , ( "loading spinner icon", isLoading model file ) - , ( "green check icon", isCompleted model file ) - , ( "red bolt icon", isError model file ) - ] - ] - [] - , div [ class "middle aligned content" ] - [ div [ class "header" ] - [ text name - ] - , div [ class "right floated meta" ] - [ text size - ] - , div [ class "description" ] - [ div - [ classList - [ ( "ui small indicating progress", True ) - ] - , id (makeFileId file) - ] - [ div [ class "bar" ] - [] - ] - ] - ] - ] - - -renderEditAttachmentName : Model -> Attachment -> Html Msg -renderEditAttachmentName model attach = - let - am = - Util.Maybe.filter (\m -> m.id == attach.id) model.attachRename - in - case am of - Just m -> - div [ class "ui fluid action input" ] - [ input - [ type_ "text" - , value m.newName - , onInput EditAttachNameSet - ] - [] - , button - [ class "ui primary icon button" - , onClick EditAttachNameSubmit - ] - [ i [ class "check icon" ] [] - ] - , button - [ class "ui secondary icon button" - , onClick EditAttachNameCancel - ] - [ i [ class "delete icon" ] [] - ] - ] - - Nothing -> - span [ class "invisible hidden" ] [] - - -isFolderMember : Model -> Bool -isFolderMember model = - let - selected = - Comp.Dropdown.getSelected model.folderModel - |> List.head - |> Maybe.map .id - in - Util.Folder.isFolderMember model.allFolders selected diff --git a/modules/webapp/src/main/elm/Comp/ItemList.elm b/modules/webapp/src/main/elm/Comp/ItemList.elm deleted file mode 100644 index dc1dee5f..00000000 --- a/modules/webapp/src/main/elm/Comp/ItemList.elm +++ /dev/null @@ -1,285 +0,0 @@ -module Comp.ItemList exposing - ( Model - , Msg(..) - , emptyModel - , nextItem - , prevItem - , update - , view - ) - -import Api.Model.ItemLight exposing (ItemLight) -import Api.Model.ItemLightGroup exposing (ItemLightGroup) -import Api.Model.ItemLightList exposing (ItemLightList) -import Data.Direction -import Data.Flags exposing (Flags) -import Html exposing (..) -import Html.Attributes exposing (..) -import Html.Events exposing (onClick) -import Set exposing (Set) -import Util.List -import Util.Maybe -import Util.String -import Util.Time - - -type alias Model = - { results : ItemLightList - , openGroups : Set String - } - - -emptyModel : Model -emptyModel = - { results = Api.Model.ItemLightList.empty - , openGroups = Set.empty - } - - -type Msg - = SetResults ItemLightList - | ToggleGroupState ItemLightGroup - | CollapseAll - | ExpandAll - | SelectItem ItemLight - - -nextItem : Model -> String -> Maybe ItemLight -nextItem model id = - List.concatMap .items model.results.groups - |> Util.List.findNext (\i -> i.id == id) - - -prevItem : Model -> String -> Maybe ItemLight -prevItem model id = - List.concatMap .items model.results.groups - |> Util.List.findPrev (\i -> i.id == id) - - -openAllGroups : Model -> Set String -openAllGroups model = - List.foldl - (\g -> \set -> Set.insert g.name set) - model.openGroups - model.results.groups - - -update : Flags -> Msg -> Model -> ( Model, Cmd Msg, Maybe ItemLight ) -update _ msg model = - case msg of - SetResults list -> - let - newModel = - { model | results = list, openGroups = Set.empty } - in - ( { newModel | openGroups = openAllGroups newModel }, Cmd.none, Nothing ) - - ToggleGroupState group -> - let - m2 = - if isGroupOpen model group then - closeGroup model group - - else - openGroup model group - in - ( m2, Cmd.none, Nothing ) - - CollapseAll -> - ( { model | openGroups = Set.empty }, Cmd.none, Nothing ) - - ExpandAll -> - let - open = - openAllGroups model - in - ( { model | openGroups = open }, Cmd.none, Nothing ) - - SelectItem item -> - ( model, Cmd.none, Just item ) - - -view : Model -> Html Msg -view model = - div [] - [ div [ class "ui ablue-comp menu" ] - [ div [ class "right floated menu" ] - [ a - [ class "item" - , title "Expand all" - , onClick ExpandAll - , href "#" - ] - [ i [ class "double angle down icon" ] [] - ] - , a - [ class "item" - , title "Collapse all" - , onClick CollapseAll - , href "#" - ] - [ i [ class "double angle up icon" ] [] - ] - ] - ] - , div [ class "ui middle aligned very relaxed divided basic list segment" ] - (List.map (viewGroup model) model.results.groups) - ] - - -isGroupOpen : Model -> ItemLightGroup -> Bool -isGroupOpen model group = - Set.member group.name model.openGroups - - -openGroup : Model -> ItemLightGroup -> Model -openGroup model group = - { model | openGroups = Set.insert group.name model.openGroups } - - -closeGroup : Model -> ItemLightGroup -> Model -closeGroup model group = - { model | openGroups = Set.remove group.name model.openGroups } - - -viewGroup : Model -> ItemLightGroup -> Html Msg -viewGroup model group = - let - groupOpen = - isGroupOpen model group - - children = - [ i - [ classList - [ ( "large middle aligned icon", True ) - , ( "caret right", not groupOpen ) - , ( "caret down", groupOpen ) - ] - ] - [] - , div [ class "content" ] - [ div [ class "right floated content" ] - [ div [ class "ui blue label" ] - [ List.length group.items |> String.fromInt |> text - ] - ] - , a - [ class "header" - , onClick (ToggleGroupState group) - , href "#" - ] - [ text group.name - ] - , div [ class "description" ] - [ makeSummary group |> text - ] - ] - ] - - itemTable = - div [ class "ui basic content segment no-margin" ] - [ renderItemTable model group.items - ] - in - if isGroupOpen model group then - div [ class "item" ] - (List.append children [ itemTable ]) - - else - div [ class "item" ] - children - - -renderItemTable : Model -> List ItemLight -> Html Msg -renderItemTable model items = - table [ class "ui selectable padded table" ] - [ thead [] - [ tr [] - [ th [ class "collapsing" ] [] - , th [ class "collapsing" ] [ text "Name" ] - , th [ class "collapsing" ] [ text "Date" ] - , th [ class "collapsing" ] [ text "Source" ] - , th [] [ text "Correspondent" ] - , th [] [ text "Concerning" ] - ] - ] - , tbody [] - (List.map (renderItemLine model) items) - ] - - -renderItemLine : Model -> ItemLight -> Html Msg -renderItemLine _ item = - let - dirIcon = - i [ class (Data.Direction.iconFromMaybe item.direction) ] [] - - corr = - List.filterMap identity [ item.corrOrg, item.corrPerson ] - |> List.map .name - |> List.intersperse ", " - |> String.concat - - conc = - List.filterMap identity [ item.concPerson, item.concEquip ] - |> List.map .name - |> List.intersperse ", " - |> String.concat - in - tr [ onClick (SelectItem item) ] - [ td [ class "collapsing" ] - [ div - [ classList - [ ( "ui teal ribbon label", True ) - , ( "invisible", item.state /= "created" ) - ] - ] - [ text "New" - ] - ] - , td [ class "collapsing" ] - [ dirIcon - , Util.String.ellipsis 45 item.name |> text - ] - , td [ class "collapsing" ] - [ Util.Time.formatDateShort item.date |> text - , span - [ classList - [ ( "invisible", Util.Maybe.isEmpty item.dueDate ) - ] - ] - [ text " " - , div [ class "ui basic label" ] - [ i [ class "bell icon" ] [] - , Maybe.map Util.Time.formatDateShort item.dueDate |> Maybe.withDefault "" |> text - ] - ] - ] - , td [ class "collapsing" ] [ text item.source ] - , td [] [ text corr ] - , td [] [ text conc ] - ] - - -makeSummary : ItemLightGroup -> String -makeSummary group = - let - corrOrgs = - List.filterMap .corrOrg group.items - - corrPers = - List.filterMap .corrPerson group.items - - concPers = - List.filterMap .concPerson group.items - - concEqui = - List.filterMap .concEquip group.items - - all = - List.concat [ corrOrgs, corrPers, concPers, concEqui ] - in - List.map .name all - |> Util.List.distinct - |> List.intersperse ", " - |> String.concat diff --git a/modules/webapp/src/main/elm/Comp/ItemMail.elm b/modules/webapp/src/main/elm/Comp/ItemMail.elm index 0e5da636..718f64a3 100644 --- a/modules/webapp/src/main/elm/Comp/ItemMail.elm +++ b/modules/webapp/src/main/elm/Comp/ItemMail.elm @@ -6,7 +6,6 @@ module Comp.ItemMail exposing , emptyModel , init , update - , view , view2 ) @@ -22,7 +21,7 @@ import Data.Flags exposing (Flags) import Data.UiSettings exposing (UiSettings) import Html exposing (..) import Html.Attributes exposing (..) -import Html.Events exposing (onCheck, onClick, onInput) +import Html.Events exposing (onClick, onInput) import Http import Styles as S import Util.Http @@ -222,89 +221,6 @@ isValid model = ---- View - - -view : UiSettings -> Model -> Html Msg -view settings model = - div - [ classList - [ ( "ui form", True ) - , ( "error", model.formError /= Nothing ) - ] - ] - [ div [ class "field" ] - [ label [] [ text "Send via" ] - , Html.map ConnMsg (Comp.Dropdown.view settings model.connectionModel) - ] - , div [ class "ui error message" ] - [ Maybe.withDefault "" model.formError |> text - ] - , div [ class "field" ] - [ label [] - [ text "Recipient(s)" - ] - , Html.map RecipientMsg (Comp.EmailInput.view model.recipients model.recipientsModel) - ] - , div [ class "field" ] - [ label [] - [ text "CC(s)" - ] - , Html.map CCRecipientMsg (Comp.EmailInput.view model.ccRecipients model.ccRecipientsModel) - ] - , div [ class "field" ] - [ label [] - [ text "BCC(s)" - ] - , Html.map BCCRecipientMsg (Comp.EmailInput.view model.bccRecipients model.bccRecipientsModel) - ] - , div [ class "field" ] - [ label [] [ text "Subject" ] - , input - [ type_ "text" - , onInput SetSubject - , value model.subject - ] - [] - ] - , div [ class "field" ] - [ label [] [ text "Body" ] - , textarea - [ onInput SetBody - , value model.body - ] - [] - ] - , div [ class "inline field" ] - [ div [ class "ui checkbox" ] - [ input - [ type_ "checkbox" - , checked model.attachAll - , onCheck (\_ -> ToggleAttachAll) - ] - [] - , label [] [ text "Include all item attachments" ] - ] - ] - , button - [ classList - [ ( "ui primary button", True ) - , ( "disabled", not (isValid model) ) - ] - , onClick Send - ] - [ text "Send" - ] - , button - [ class "ui secondary button" - , onClick Cancel - ] - [ text "Cancel" - ] - ] - - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/MappingForm.elm b/modules/webapp/src/main/elm/Comp/MappingForm.elm deleted file mode 100644 index 6fbf9148..00000000 --- a/modules/webapp/src/main/elm/Comp/MappingForm.elm +++ /dev/null @@ -1,181 +0,0 @@ -module Comp.MappingForm exposing - ( FormData - , Model - , Msg - , ViewOpts - , init - , update - , view - ) - -import Comp.FixedDropdown -import Dict exposing (Dict) -import Html exposing (..) -import Html.Attributes exposing (..) -import Html.Events exposing (onClick) -import Util.Maybe - - -type alias FormData = - Dict String String - - -type alias Model = - { leftDropdown : Comp.FixedDropdown.Model String - , rightDropdown : Comp.FixedDropdown.Model String - , leftSelect : Maybe String - , rightSelect : Maybe String - } - - -type Msg - = AddPair FormData - | DeleteItem FormData String - | EditItem String String - | LeftMsg (Comp.FixedDropdown.Msg String) - | RightMsg (Comp.FixedDropdown.Msg String) - - -init : List String -> List String -> Model -init leftSel rightSel = - { leftDropdown = Comp.FixedDropdown.initString leftSel - , rightDropdown = Comp.FixedDropdown.initString rightSel - , leftSelect = Nothing - , rightSelect = Nothing - } - - - ---- Update - - -update : Msg -> Model -> ( Model, Maybe FormData ) -update msg model = - case msg of - AddPair data -> - case ( model.leftSelect, model.rightSelect ) of - ( Just l, Just r ) -> - ( { model - | leftSelect = Nothing - , rightSelect = Nothing - } - , Just (Dict.insert l r data) - ) - - _ -> - ( model, Nothing ) - - DeleteItem data k -> - ( model, Just (Dict.remove k data) ) - - EditItem k v -> - ( { model - | leftSelect = Just k - , rightSelect = Just v - } - , Nothing - ) - - LeftMsg lm -> - let - ( m_, la ) = - Comp.FixedDropdown.update lm model.leftDropdown - in - ( { model - | leftDropdown = m_ - , leftSelect = Util.Maybe.withDefault model.leftSelect la - } - , Nothing - ) - - RightMsg lm -> - let - ( m_, la ) = - Comp.FixedDropdown.update lm model.rightDropdown - in - ( { model - | rightDropdown = m_ - , rightSelect = Util.Maybe.withDefault model.rightSelect la - } - , Nothing - ) - - - ---- View - - -type alias ViewOpts = - { renderItem : ( String, String ) -> Html Msg - , label : String - , description : Maybe String - } - - -view : FormData -> ViewOpts -> Model -> Html Msg -view data opts model = - div [ class "field" ] - [ label [] [ text opts.label ] - , div [ class "fields" ] - [ div [ class "inline field" ] - [ Html.map LeftMsg - (Comp.FixedDropdown.viewString - model.leftSelect - model.leftDropdown - ) - ] - , div [ class "inline field" ] - [ Html.map RightMsg - (Comp.FixedDropdown.viewString - model.rightSelect - model.rightDropdown - ) - ] - , button - [ class "ui icon button" - , onClick (AddPair data) - , href "#" - ] - [ i [ class "add icon" ] [] - ] - ] - , renderFormData opts data - , span - [ classList - [ ( "small-info", True ) - , ( "invisible hidden", opts.description == Nothing ) - ] - ] - [ Maybe.withDefault "" opts.description - |> text - ] - ] - - -renderFormData : ViewOpts -> FormData -> Html Msg -renderFormData opts data = - let - values = - Dict.toList data - - renderItem ( k, v ) = - div [ class "item" ] - [ a - [ class "link icon" - , href "#" - , onClick (DeleteItem data k) - ] - [ i [ class "trash icon" ] [] - ] - , a - [ class "link icon" - , href "#" - , onClick (EditItem k v) - ] - [ i [ class "edit icon" ] [] - ] - , opts.renderItem ( k, v ) - ] - in - div [ class "ui list" ] - (List.map renderItem values) diff --git a/modules/webapp/src/main/elm/Comp/MarkdownInput.elm b/modules/webapp/src/main/elm/Comp/MarkdownInput.elm index 2df7d827..9209d739 100644 --- a/modules/webapp/src/main/elm/Comp/MarkdownInput.elm +++ b/modules/webapp/src/main/elm/Comp/MarkdownInput.elm @@ -3,16 +3,10 @@ module Comp.MarkdownInput exposing , Msg , init , update - , view - , viewCheatLink , viewCheatLink2 - , viewContent , viewContent2 - , viewEditLink , viewEditLink2 - , viewPreviewLink , viewPreviewLink2 - , viewSplitLink , viewSplitLink2 ) @@ -58,133 +52,6 @@ update txt msg model = ---- View - - -viewContent : String -> Model -> Html Msg -viewContent txt model = - case model.display of - Edit -> - editDisplay txt - - Preview -> - previewDisplay txt - - Split -> - splitDisplay txt - - -viewEditLink : (Bool -> Attribute Msg) -> Model -> Html Msg -viewEditLink classes model = - a - [ onClick (SetDisplay Edit) - , classes (model.display == Edit) - , href "#" - ] - [ text "Edit" - ] - - -viewPreviewLink : (Bool -> Attribute Msg) -> Model -> Html Msg -viewPreviewLink classes model = - a - [ onClick (SetDisplay Preview) - , classes (model.display == Preview) - , href "#" - ] - [ text "Preview" - ] - - -viewSplitLink : (Bool -> Attribute Msg) -> Model -> Html Msg -viewSplitLink classes model = - a - [ onClick (SetDisplay Split) - , classes (model.display == Split) - , href "#" - ] - [ text "Split" - ] - - -viewCheatLink : String -> Model -> Html msg -viewCheatLink classes model = - a - [ class classes - , target "_new" - , href model.cheatSheetUrl - ] - [ i [ class "ui help icon" ] [] - , text "Supports Markdown" - ] - - -view : String -> Model -> Html Msg -view txt model = - div [] - [ div [ class "ui top attached tabular mini menu" ] - [ viewEditLink - (\act -> - classList - [ ( "ui link item", True ) - , ( "active", act ) - ] - ) - model - , viewPreviewLink - (\act -> - classList - [ ( "ui link item", True ) - , ( "active", act ) - ] - ) - model - , viewSplitLink - (\act -> - classList - [ ( "ui link item", True ) - , ( "active", act ) - ] - ) - model - , viewCheatLink "ui right floated help-link link item" model - ] - , div [ class "ui bottom attached segment" ] - [ viewContent txt model - ] - ] - - -editDisplay : String -> Html Msg -editDisplay txt = - textarea - [ class "markdown-editor" - , onInput SetText - , placeholder "Add notes here…" - ] - [ text txt ] - - -previewDisplay : String -> Html Msg -previewDisplay txt = - Markdown.toHtml [ class "markdown-preview" ] txt - - -splitDisplay : String -> Html Msg -splitDisplay txt = - div [ class "ui grid" ] - [ div [ class "row" ] - [ div [ class "eight wide column markdown-split" ] - [ editDisplay txt - ] - , div [ class "eight wide column markdown-split" ] - [ previewDisplay txt - ] - ] - ] - - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/MenuBar.elm b/modules/webapp/src/main/elm/Comp/MenuBar.elm index dd554906..abe6e9c2 100644 --- a/modules/webapp/src/main/elm/Comp/MenuBar.elm +++ b/modules/webapp/src/main/elm/Comp/MenuBar.elm @@ -9,10 +9,9 @@ module Comp.MenuBar exposing , viewSide ) -import Data.DropdownStyle exposing (DropdownStyle) import Html exposing (..) import Html.Attributes exposing (..) -import Html.Events exposing (onBlur, onCheck, onClick, onFocus, onInput) +import Html.Events exposing (onCheck, onClick, onInput) import Styles as S diff --git a/modules/webapp/src/main/elm/Comp/NotificationForm.elm b/modules/webapp/src/main/elm/Comp/NotificationForm.elm index e89de873..81ebb11c 100644 --- a/modules/webapp/src/main/elm/Comp/NotificationForm.elm +++ b/modules/webapp/src/main/elm/Comp/NotificationForm.elm @@ -5,7 +5,6 @@ module Comp.NotificationForm exposing , init , initWith , update - , view , view2 ) @@ -29,7 +28,6 @@ import Data.UiSettings exposing (UiSettings) import Data.Validated exposing (Validated(..)) import Html exposing (..) import Html.Attributes exposing (..) -import Html.Events exposing (onCheck, onClick) import Http import Styles as S import Util.Http @@ -454,7 +452,7 @@ update flags msg model = ---- View +--- View2 isFormError : Model -> Bool @@ -470,169 +468,6 @@ isFormSuccess model = |> Maybe.withDefault False -view : String -> UiSettings -> Model -> Html Msg -view extraClasses settings model = - div - [ classList - [ ( "ui form", True ) - , ( extraClasses, True ) - , ( "error", isFormError model ) - , ( "success", isFormSuccess model ) - ] - ] - [ Html.map YesNoDeleteMsg (Comp.YesNoDimmer.view model.yesNoDelete) - , div - [ classList - [ ( "ui dimmer", True ) - , ( "active", model.loading > 0 ) - ] - ] - [ div [ class "ui text loader" ] - [ text "Loading..." - ] - ] - , div [ class "inline field" ] - [ div [ class "ui checkbox" ] - [ input - [ type_ "checkbox" - , onCheck (\_ -> ToggleEnabled) - , checked model.enabled - ] - [] - , label [] [ text "Enabled" ] - ] - , span [ class "small-info" ] - [ text "Enable or disable this task." - ] - ] - , div [ class "required field" ] - [ label [] [ text "Send via" ] - , Html.map ConnMsg (Comp.Dropdown.view settings model.connectionModel) - , span [ class "small-info" ] - [ text "The SMTP connection to use when sending notification mails." - ] - ] - , div [ class "required field" ] - [ label [] - [ text "Recipient(s)" - ] - , Html.map RecipientMsg - (Comp.EmailInput.view model.recipients model.recipientsModel) - , span [ class "small-info" ] - [ text "One or more mail addresses, confirm each by pressing 'Return'." - ] - ] - , div [ class "field" ] - [ label [] [ text "Tags Include (and)" ] - , Html.map TagIncMsg (Comp.Dropdown.view settings model.tagInclModel) - , span [ class "small-info" ] - [ text "Items must have all the tags specified here." - ] - ] - , div [ class "field" ] - [ label [] [ text "Tags Exclude (or)" ] - , Html.map TagExcMsg (Comp.Dropdown.view settings model.tagExclModel) - , span [ class "small-info" ] - [ text "Items must not have any tag specified here." - ] - ] - , Html.map RemindDaysMsg - (Comp.IntField.viewWithInfo - "Select items with a due date *lower than* `today+remindDays`" - model.remindDays - "required field" - model.remindDaysModel - ) - , div [ class "required inline field" ] - [ div [ class "ui checkbox" ] - [ input - [ type_ "checkbox" - , onCheck (\_ -> ToggleCapOverdue) - , checked model.capOverdue - ] - [] - , label [] - [ text "Cap overdue items" - ] - ] - , div [ class "small-info" ] - [ text "If checked, only items with a due date" - , em [] [ text " greater than " ] - , code [] [ text "today-remindDays" ] - , text " are considered." - ] - ] - , div [ class "required field" ] - [ label [] - [ text "Schedule" - , a - [ class "right-float" - , href "https://github.com/eikek/calev#what-are-calendar-events" - , target "_blank" - ] - [ i [ class "help icon" ] [] - , text "Click here for help" - ] - ] - , Html.map CalEventMsg - (Comp.CalEventInput.view "" - (Data.Validated.value model.schedule) - model.scheduleModel - ) - , span [ class "small-info" ] - [ text "Specify how often and when this task should run. " - , text "Use English 3-letter weekdays. Either a single value, " - , text "a list (ex. 1,2,3), a range (ex. 1..3) or a '*' (meaning all) " - , text "is allowed for each part." - ] - ] - , div [ class "ui divider" ] [] - , div - [ classList - [ ( "ui message", True ) - , ( "success", isFormSuccess model ) - , ( "error", isFormError model ) - , ( "hidden", model.formMsg == Nothing ) - ] - ] - [ Maybe.map .message model.formMsg - |> Maybe.withDefault "" - |> text - ] - , button - [ class "ui primary button" - , onClick Submit - ] - [ text "Submit" - ] - , button - [ class "ui secondary button" - , onClick Cancel - ] - [ text "Cancel" - ] - , button - [ classList - [ ( "ui red button", True ) - , ( "hidden invisible", model.settings.id == "" ) - ] - , onClick RequestDelete - ] - [ text "Delete" - ] - , button - [ class "ui right floated button" - , onClick StartOnce - ] - [ text "Start Once" - ] - ] - - - ---- View 2 - - view2 : String -> UiSettings -> Model -> Html Msg view2 extraClasses settings model = let diff --git a/modules/webapp/src/main/elm/Comp/NotificationList.elm b/modules/webapp/src/main/elm/Comp/NotificationList.elm index 1ac1450e..486afe36 100644 --- a/modules/webapp/src/main/elm/Comp/NotificationList.elm +++ b/modules/webapp/src/main/elm/Comp/NotificationList.elm @@ -4,7 +4,6 @@ module Comp.NotificationList exposing , Msg , init , update - , view , view2 ) @@ -12,7 +11,6 @@ import Api.Model.NotificationSettings exposing (NotificationSettings) import Comp.Basic as B import Html exposing (..) import Html.Attributes exposing (..) -import Html.Events exposing (onClick) import Styles as S import Util.Html @@ -43,66 +41,6 @@ update msg model = ---- View - - -view : Model -> List NotificationSettings -> Html Msg -view _ items = - div [] - [ table [ class "ui very basic center aligned table" ] - [ thead [] - [ tr [] - [ th [ class "collapsing" ] [] - , th [ class "collapsing" ] - [ i [ class "check icon" ] [] - ] - , th [] [ text "Schedule" ] - , th [] [ text "Connection" ] - , th [] [ text "Recipients" ] - , th [] [ text "Remind Days" ] - ] - ] - , tbody [] - (List.map viewItem items) - ] - ] - - -viewItem : NotificationSettings -> Html Msg -viewItem item = - tr [] - [ td [ class "collapsing" ] - [ a - [ href "#" - , class "ui basic small blue label" - , onClick (EditSettings item) - ] - [ i [ class "edit icon" ] [] - , text "Edit" - ] - ] - , td [ class "collapsing" ] - [ Util.Html.checkbox item.enabled - ] - , td [] - [ code [] - [ text item.schedule - ] - ] - , td [] - [ text item.smtpConnection - ] - , td [] - [ String.join ", " item.recipients |> text - ] - , td [] - [ String.fromInt item.remindDays - |> text - ] - ] - - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/NotificationManage.elm b/modules/webapp/src/main/elm/Comp/NotificationManage.elm index 99cfd571..eb88db3f 100644 --- a/modules/webapp/src/main/elm/Comp/NotificationManage.elm +++ b/modules/webapp/src/main/elm/Comp/NotificationManage.elm @@ -3,7 +3,6 @@ module Comp.NotificationManage exposing , Msg , init , update - , view , view2 ) @@ -18,7 +17,6 @@ import Data.Flags exposing (Flags) import Data.UiSettings exposing (UiSettings) import Html exposing (..) import Html.Attributes exposing (..) -import Html.Events exposing (onClick) import Http import Styles as S import Util.Http @@ -211,61 +209,13 @@ update flags msg model = ---- View - - -view : UiSettings -> Model -> Html Msg -view settings model = - div [] - [ div [ class "ui menu" ] - [ a - [ class "link item" - , href "#" - , onClick NewTask - ] - [ i [ class "add icon" ] [] - , text "New Task" - ] - ] - , div - [ classList - [ ( "ui message", True ) - , ( "error", Maybe.map .success model.result == Just False ) - , ( "success", Maybe.map .success model.result == Just True ) - , ( "invisible hidden", model.result == Nothing ) - ] - ] - [ Maybe.map .message model.result - |> Maybe.withDefault "" - |> text - ] - , case model.detailModel of - Just msett -> - viewForm settings msett - - Nothing -> - viewList model - ] - - -viewForm : UiSettings -> Comp.NotificationForm.Model -> Html Msg -viewForm settings model = - Html.map DetailMsg (Comp.NotificationForm.view "segment" settings model) - - -viewList : Model -> Html Msg -viewList model = - Html.map ListMsg (Comp.NotificationList.view model.listModel model.items) - - - --- View2 view2 : UiSettings -> Model -> Html Msg view2 settings model = div [ class "flex flex-col" ] - ([ div + (div [ classList [ ( S.errorMessage, Maybe.map .success model.result == Just False ) , ( S.successMessage, Maybe.map .success model.result == Just True ) @@ -276,8 +226,7 @@ view2 settings model = |> Maybe.withDefault "" |> text ] - ] - ++ (case model.detailModel of + :: (case model.detailModel of Just msett -> viewForm2 settings msett diff --git a/modules/webapp/src/main/elm/Comp/OrgForm.elm b/modules/webapp/src/main/elm/Comp/OrgForm.elm index 58522d17..b0d8d848 100644 --- a/modules/webapp/src/main/elm/Comp/OrgForm.elm +++ b/modules/webapp/src/main/elm/Comp/OrgForm.elm @@ -5,8 +5,6 @@ module Comp.OrgForm exposing , getOrg , isValid , update - , view - , view1 , view2 ) @@ -121,50 +119,6 @@ update flags msg model = ) -view : UiSettings -> Model -> Html Msg -view settings model = - view1 settings False model - - -view1 : UiSettings -> Bool -> Model -> Html Msg -view1 settings compact model = - div [ class "ui form" ] - [ div - [ classList - [ ( "field", True ) - , ( "error", not (isValid model) ) - ] - ] - [ label [] [ text "Name*" ] - , input - [ type_ "text" - , onInput SetName - , placeholder "Name" - , value model.name - ] - [] - ] - , h3 [ class "ui dividing header" ] - [ text "Address" - ] - , Html.map AddressMsg (Comp.AddressForm.view settings model.addressModel) - , h3 [ class "ui dividing header" ] - [ text "Contacts" - ] - , Html.map ContactMsg (Comp.ContactField.view1 settings compact model.contactModel) - , h3 [ class "ui dividing header" ] - [ text "Notes" - ] - , div [ class "field" ] - [ textarea - [ onInput SetNotes - , Maybe.withDefault "" model.notes |> value - ] - [] - ] - ] - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/OrgManage.elm b/modules/webapp/src/main/elm/Comp/OrgManage.elm index d184f0d1..1cdc03fe 100644 --- a/modules/webapp/src/main/elm/Comp/OrgManage.elm +++ b/modules/webapp/src/main/elm/Comp/OrgManage.elm @@ -3,7 +3,6 @@ module Comp.OrgManage exposing , Msg(..) , emptyModel , update - , view , view2 ) @@ -20,7 +19,7 @@ import Data.Flags exposing (Flags) import Data.UiSettings exposing (UiSettings) import Html exposing (..) import Html.Attributes exposing (..) -import Html.Events exposing (onClick, onInput, onSubmit) +import Html.Events exposing (onSubmit) import Http import Styles as S import Util.Http @@ -202,111 +201,6 @@ update flags msg model = ( m, Api.getOrganizations flags str OrgResp ) -view : UiSettings -> Model -> Html Msg -view settings model = - if model.viewMode == Table then - viewTable model - - else - viewForm settings model - - -viewTable : Model -> Html Msg -viewTable model = - div [] - [ div [ class "ui secondary menu" ] - [ div [ class "horizontally fitted item" ] - [ div [ class "ui icon input" ] - [ input - [ type_ "text" - , onInput SetQuery - , value model.query - , placeholder "Search…" - ] - [] - , i [ class "ui search icon" ] - [] - ] - ] - , div [ class "right menu" ] - [ div [ class "item" ] - [ a - [ class "ui primary button" - , href "#" - , onClick InitNewOrg - ] - [ i [ class "plus icon" ] [] - , text "New Organization" - ] - ] - ] - ] - , Html.map TableMsg (Comp.OrgTable.view model.tableModel) - , div - [ classList - [ ( "ui dimmer", True ) - , ( "active", model.loading ) - ] - ] - [ div [ class "ui loader" ] [] - ] - ] - - -viewForm : UiSettings -> Model -> Html Msg -viewForm settings model = - let - newOrg = - model.formModel.org.id == "" - in - Html.form [ class "ui segment", onSubmit Submit ] - [ Html.map YesNoMsg (Comp.YesNoDimmer.view model.deleteConfirm) - , if newOrg then - h3 [ class "ui dividing header" ] - [ text "Create new organization" - ] - - else - h3 [ class "ui dividing header" ] - [ text ("Edit org: " ++ model.formModel.org.name) - , div [ class "sub header" ] - [ text "Id: " - , text model.formModel.org.id - ] - ] - , Html.map FormMsg (Comp.OrgForm.view settings model.formModel) - , div - [ classList - [ ( "ui error message", True ) - , ( "invisible", Util.Maybe.isEmpty model.formError ) - ] - ] - [ Maybe.withDefault "" model.formError |> text - ] - , div [ class "ui horizontal divider" ] [] - , button [ class "ui primary button", type_ "submit" ] - [ text "Submit" - ] - , a [ class "ui secondary button", onClick (SetViewMode Table), href "#" ] - [ text "Cancel" - ] - , if not newOrg then - a [ class "ui right floated red button", href "#", onClick RequestDelete ] - [ text "Delete" ] - - else - span [] [] - , div - [ classList - [ ( "ui dimmer", True ) - , ( "active", model.loading ) - ] - ] - [ div [ class "ui loader" ] [] - ] - ] - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/OrgTable.elm b/modules/webapp/src/main/elm/Comp/OrgTable.elm index 262827dc..46ff10ab 100644 --- a/modules/webapp/src/main/elm/Comp/OrgTable.elm +++ b/modules/webapp/src/main/elm/Comp/OrgTable.elm @@ -3,7 +3,6 @@ module Comp.OrgTable exposing , Msg(..) , emptyModel , update - , view , view2 ) @@ -12,7 +11,6 @@ import Comp.Basic as B import Data.Flags exposing (Flags) import Html exposing (..) import Html.Attributes exposing (..) -import Html.Events exposing (onClick) import Styles as S import Util.Address import Util.Contact @@ -50,49 +48,6 @@ update _ msg model = ( { model | selected = Nothing }, Cmd.none ) -view : Model -> Html Msg -view model = - table [ class "ui very basic aligned table" ] - [ thead [] - [ tr [] - [ th [ class "collapsing" ] [] - , th [ class "collapsing" ] [ text "Name" ] - , th [] [ text "Address" ] - , th [] [ text "Contact" ] - ] - ] - , tbody [] - (List.map (renderOrgLine model) model.orgs) - ] - - -renderOrgLine : Model -> Organization -> Html Msg -renderOrgLine model org = - tr - [ classList [ ( "active", model.selected == Just org ) ] - ] - [ td [ class "collapsing" ] - [ a - [ href "#" - , class "ui basic small blue label" - , onClick (Select org) - ] - [ i [ class "edit icon" ] [] - , text "Edit" - ] - ] - , td [ class "collapsing" ] - [ text org.name - ] - , td [] - [ Util.Address.toString org.address |> text - ] - , td [] - [ Util.Contact.toString org.contacts |> text - ] - ] - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/PasswordInput.elm b/modules/webapp/src/main/elm/Comp/PasswordInput.elm index c9c298e5..70fc645b 100644 --- a/modules/webapp/src/main/elm/Comp/PasswordInput.elm +++ b/modules/webapp/src/main/elm/Comp/PasswordInput.elm @@ -3,7 +3,6 @@ module Comp.PasswordInput exposing , Msg , init , update - , view , view2 ) @@ -46,36 +45,6 @@ update msg model = ( model, pw ) -view : Maybe String -> Model -> Html Msg -view pw model = - div [ class "ui left action input" ] - [ button - [ class "ui icon button" - , type_ "button" - , onClick (ToggleShow pw) - ] - [ i - [ classList - [ ( "ui eye icon", True ) - , ( "slash", model.show ) - ] - ] - [] - ] - , input - [ type_ <| - if model.show then - "text" - - else - "password" - , onInput SetPassword - , Maybe.withDefault "" pw |> value - ] - [] - ] - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/PersonForm.elm b/modules/webapp/src/main/elm/Comp/PersonForm.elm index 9ed8b2be..004157db 100644 --- a/modules/webapp/src/main/elm/Comp/PersonForm.elm +++ b/modules/webapp/src/main/elm/Comp/PersonForm.elm @@ -5,8 +5,6 @@ module Comp.PersonForm exposing , getPerson , isValid , update - , view - , view1 , view2 ) @@ -178,59 +176,6 @@ update flags msg model = ) -view : UiSettings -> Model -> Html Msg -view settings model = - view1 settings False model - - -view1 : UiSettings -> Bool -> Model -> Html Msg -view1 settings compact model = - div [ class "ui form" ] - [ div - [ classList - [ ( "field", True ) - , ( "error", not (isValid model) ) - ] - ] - [ label [] [ text "Name*" ] - , input - [ type_ "text" - , onInput SetName - , placeholder "Name" - , value model.name - ] - [] - ] - , div [ class "field" ] - [ label [] [ text "Use" ] - , Html.map UseDropdownMsg (Comp.FixedDropdown.view (makeUseItem model) model.useModel) - , label [] [ text "Use for concerning person suggestion only" ] - ] - , div [ class "field" ] - [ label [] [ text "Organization" ] - , Html.map OrgDropdownMsg (Comp.Dropdown.view settings model.orgModel) - ] - , h3 [ class "ui dividing header" ] - [ text "Address" - ] - , Html.map AddressMsg (Comp.AddressForm.view settings model.addressModel) - , h3 [ class "ui dividing header" ] - [ text "Contacts" - ] - , Html.map ContactMsg (Comp.ContactField.view1 settings compact model.contactModel) - , h3 [ class "ui dividing header" ] - [ text "Notes" - ] - , div [ class "field" ] - [ textarea - [ onInput SetNotes - , Maybe.withDefault "" model.notes |> value - ] - [] - ] - ] - - makeUseItem : Model -> Maybe (Comp.FixedDropdown.Item PersonUse) makeUseItem model = Just <| diff --git a/modules/webapp/src/main/elm/Comp/PersonManage.elm b/modules/webapp/src/main/elm/Comp/PersonManage.elm index 5e9078ca..6e52da6a 100644 --- a/modules/webapp/src/main/elm/Comp/PersonManage.elm +++ b/modules/webapp/src/main/elm/Comp/PersonManage.elm @@ -3,7 +3,6 @@ module Comp.PersonManage exposing , Msg(..) , emptyModel , update - , view , view2 ) @@ -21,7 +20,7 @@ import Data.Flags exposing (Flags) import Data.UiSettings exposing (UiSettings) import Html exposing (..) import Html.Attributes exposing (..) -import Html.Events exposing (onClick, onInput, onSubmit) +import Html.Events exposing (onSubmit) import Http import Styles as S import Util.Http @@ -239,122 +238,6 @@ isLoading model = model.loading /= 0 -view : UiSettings -> Model -> Html Msg -view settings model = - if model.viewMode == Table then - viewTable model - - else - viewForm settings model - - -viewTable : Model -> Html Msg -viewTable model = - div [] - [ div [ class "ui secondary menu" ] - [ div [ class "horizontally fitted item" ] - [ div [ class "ui icon input" ] - [ input - [ type_ "text" - , onInput SetQuery - , value model.query - , placeholder "Search…" - ] - [] - , i [ class "ui search icon" ] - [] - ] - ] - , div [ class "right menu" ] - [ div [ class "item" ] - [ a - [ class "ui primary button" - , href "#" - , onClick InitNewPerson - ] - [ i [ class "plus icon" ] [] - , text "New Person" - ] - ] - ] - ] - , Html.map TableMsg (Comp.PersonTable.view model.tableModel) - , div - [ classList - [ ( "ui dimmer", True ) - , ( "active", isLoading model ) - ] - ] - [ div [ class "ui loader" ] [] - ] - ] - - -viewForm : UiSettings -> Model -> Html Msg -viewForm settings model = - let - newPerson = - model.formModel.person.id == "" - in - div [ class "ui segment" ] - [ Html.map YesNoMsg (Comp.YesNoDimmer.view model.deleteConfirm) - , if newPerson then - h3 [ class "ui dividing header" ] - [ text "Create new person" - ] - - else - h3 [ class "ui dividing header" ] - [ text ("Edit person: " ++ model.formModel.person.name) - , div [ class "sub header" ] - [ text "Id: " - , text model.formModel.person.id - ] - ] - , Html.map FormMsg (Comp.PersonForm.view settings model.formModel) - , div - [ classList - [ ( "ui error message", True ) - , ( "invisible", Util.Maybe.isEmpty model.formError ) - ] - ] - [ Maybe.withDefault "" model.formError |> text - ] - , div [ class "ui horizontal divider" ] [] - , button - [ class "ui primary button" - , onClick Submit - ] - [ text "Submit" - ] - , a - [ class "ui secondary button" - , onClick (SetViewMode Table) - , href "#" - ] - [ text "Cancel" - ] - , if not newPerson then - a - [ class "ui right floated red button" - , href "#" - , onClick RequestDelete - ] - [ text "Delete" ] - - else - span [] [] - , div - [ classList - [ ( "ui dimmer", True ) - , ( "active", isLoading model ) - ] - ] - [ div [ class "ui loader" ] [] - ] - ] - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/PersonTable.elm b/modules/webapp/src/main/elm/Comp/PersonTable.elm index 2d1818e1..8646cc9f 100644 --- a/modules/webapp/src/main/elm/Comp/PersonTable.elm +++ b/modules/webapp/src/main/elm/Comp/PersonTable.elm @@ -3,7 +3,6 @@ module Comp.PersonTable exposing , Msg(..) , emptyModel , update - , view , view2 ) @@ -13,11 +12,8 @@ import Data.Flags exposing (Flags) import Data.PersonUse import Html exposing (..) import Html.Attributes exposing (..) -import Html.Events exposing (onClick) import Styles as S -import Util.Address import Util.Contact -import Util.Html type alias Model = @@ -52,62 +48,6 @@ update _ msg model = ( { model | selected = Nothing }, Cmd.none ) -view : Model -> Html Msg -view model = - table [ class "ui very basic aligned table" ] - [ thead [] - [ tr [] - [ th [ class "collapsing" ] [] - , th [ class "collapsing center aligned" ] [ text "Use" ] - , th [] [ text "Name" ] - , th [] [ text "Organization" ] - , th [] [ text "Address" ] - , th [] [ text "Contact" ] - ] - ] - , tbody [] - (List.map (renderPersonLine model) model.equips) - ] - - -renderPersonLine : Model -> Person -> Html Msg -renderPersonLine model person = - tr - [ classList [ ( "active", model.selected == Just person ) ] - ] - [ td [ class "collapsing" ] - [ a - [ href "#" - , class "ui basic small blue label" - , onClick (Select person) - ] - [ i [ class "edit icon" ] [] - , text "Edit" - ] - ] - , td [ class "center aligned" ] - [ Data.PersonUse.fromString person.use - |> Maybe.withDefault Data.PersonUse.Both - |> Data.PersonUse.label - |> text - ] - , td [] - [ text person.name - ] - , td [] - [ Maybe.map .name person.organization - |> Maybe.withDefault "-" - |> text - ] - , td [] - [ Util.Address.toString person.address |> text - ] - , td [] - [ Util.Contact.toString person.contacts |> text - ] - ] - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/PowerSearchInput.elm b/modules/webapp/src/main/elm/Comp/PowerSearchInput.elm index 2a868fa0..ac1b35f3 100644 --- a/modules/webapp/src/main/elm/Comp/PowerSearchInput.elm +++ b/modules/webapp/src/main/elm/Comp/PowerSearchInput.elm @@ -8,7 +8,6 @@ module Comp.PowerSearchInput exposing , viewResult ) -import Data.DropdownStyle import Data.QueryParseResult exposing (QueryParseResult) import Html exposing (..) import Html.Attributes exposing (..) diff --git a/modules/webapp/src/main/elm/Comp/ScanMailboxForm.elm b/modules/webapp/src/main/elm/Comp/ScanMailboxForm.elm index dbee13c8..9949719b 100644 --- a/modules/webapp/src/main/elm/Comp/ScanMailboxForm.elm +++ b/modules/webapp/src/main/elm/Comp/ScanMailboxForm.elm @@ -5,7 +5,6 @@ module Comp.ScanMailboxForm exposing , init , initWith , update - , view , view2 ) @@ -76,7 +75,6 @@ type alias Model = , languageModel : Comp.FixedDropdown.Model Language , language : Maybe Language , postHandleAll : Bool - , menuTab : MenuTab , openTabs : Set String } @@ -122,7 +120,6 @@ type Msg | LanguageMsg (Comp.FixedDropdown.Msg Language) | RemoveLanguage | TogglePostHandleAll - | SetMenuTab MenuTab | ToggleAkkordionTab String @@ -170,7 +167,6 @@ initWith flags s = Comp.FixedDropdown.init (List.map mkLanguageItem Data.Language.all) , language = Maybe.andThen Data.Language.fromString s.language , postHandleAll = Maybe.withDefault False s.postHandleAll - , menuTab = TabGeneral } , Cmd.batch [ Api.getImapSettings flags "" ConnResp @@ -225,7 +221,6 @@ init flags = Comp.FixedDropdown.init (List.map mkLanguageItem Data.Language.all) , language = Nothing , postHandleAll = False - , menuTab = TabGeneral , openTabs = Set.insert (tabTitle TabGeneral) Set.empty } , Cmd.batch @@ -680,12 +675,6 @@ update flags msg model = , Cmd.none ) - SetMenuTab tab -> - ( { model | menuTab = tab } - , NoAction - , Cmd.none - ) - ToggleAkkordionTab title -> let tabs = @@ -702,7 +691,7 @@ update flags msg model = ---- View +--- View2 isFormError : Model -> Bool @@ -729,426 +718,6 @@ isFolderMember model = Util.Folder.isFolderMember model.allFolders selected - ---- View - - -view : String -> UiSettings -> Model -> Html Msg -view extraClasses settings model = - div - [ classList - [ ( "ui warning form", True ) - , ( extraClasses, True ) - , ( "error", isFormError model ) - , ( "success", isFormSuccess model ) - ] - ] - [ viewMenu model - , div [ class "ui bottom attached segment" ] - (case model.menuTab of - TabGeneral -> - viewGeneral settings model - - TabProcessing -> - viewProcessing model - - TabAdditionalFilter -> - viewAdditionalFilter model - - TabPostProcessing -> - viewPostProcessing model - - TabMetadata -> - viewMetadata settings model - - TabSchedule -> - viewSchedule model - ) - , div - [ classList - [ ( "ui message", True ) - , ( "success", isFormSuccess model ) - , ( "error", isFormError model ) - , ( "hidden", model.formMsg == Nothing ) - ] - ] - [ Maybe.map .message model.formMsg - |> Maybe.withDefault "" - |> text - ] - , button - [ class "ui primary button" - , onClick Submit - ] - [ text "Submit" - ] - , button - [ class "ui secondary button" - , onClick Cancel - ] - [ text "Cancel" - ] - , button - [ classList - [ ( "ui red button", True ) - , ( "hidden invisible", model.settings.id == "" ) - ] - , onClick RequestDelete - ] - [ text "Delete" - ] - , button - [ class "ui right floated button" - , onClick StartOnce - ] - [ text "Start Once" - ] - , Html.map YesNoDeleteMsg (Comp.YesNoDimmer.view model.yesNoDelete) - , div - [ classList - [ ( "ui dimmer", True ) - , ( "active", model.loading > 0 ) - , ( "invisible hidden", model.loading == 0 ) - ] - ] - [ div [ class "ui text loader" ] - [ text "Loading..." - ] - ] - ] - - -viewMenu : Model -> Html Msg -viewMenu model = - let - tabLink tab txt = - a - [ class "item" - , classList - [ ( "active", model.menuTab == tab ) ] - , href "#" - , onClick (SetMenuTab tab) - ] - [ text txt - ] - in - div [ class "ui top attached stacked tabular menu" ] - [ tabLink TabGeneral "General" - , tabLink TabProcessing "Processing" - , tabLink TabAdditionalFilter "Additional Filter" - , tabLink TabPostProcessing "Post Processing" - , tabLink TabMetadata "Metadata" - , tabLink TabSchedule "Schedule" - ] - - -viewGeneral : UiSettings -> Model -> List (Html Msg) -viewGeneral settings model = - [ div [ class "inline field" ] - [ div [ class "ui checkbox" ] - [ input - [ type_ "checkbox" - , onCheck (\_ -> ToggleEnabled) - , checked model.enabled - ] - [] - , label [] [ text "Enabled" ] - ] - , span [ class "small-info" ] - [ text "Enable or disable this task." - ] - ] - , div [ class "required field" ] - [ label [] [ text "Mailbox" ] - , Html.map ConnMsg (Comp.Dropdown.view settings model.connectionModel) - , span [ class "small-info" ] - [ text "The IMAP connection to use when sending notification mails." - ] - ] - ] - - -viewProcessing : Model -> List (Html Msg) -viewProcessing model = - [ div [ class "ui message" ] - [ text "These settings define which mails are fetched from the mail server." - ] - , div [ class "required field" ] - [ label [] [ text "Folders" ] - , Html.map FoldersMsg (Comp.StringListInput.view model.folders model.foldersModel) - , span [ class "small-info" ] - [ text "The folders to go through" - ] - ] - , Html.map ReceivedHoursMsg - (Comp.IntField.viewWithInfo - "Select mails newer than `now - receivedHours`" - model.receivedHours - "field" - model.receivedHoursModel - ) - ] - - -viewAdditionalFilter : Model -> List (Html Msg) -viewAdditionalFilter model = - [ div [ class "ui message" ] - [ text "These filters are applied to mails that have been fetched from the " - , text "mailbox to select those that should be imported." - ] - , div - [ class "field" - ] - [ label [] [ text "File Filter" ] - , input - [ type_ "text" - , onInput SetFileFilter - , placeholder "File Filter" - , model.fileFilter - |> Maybe.withDefault "" - |> value - ] - [] - , div [ class "small-info" ] - [ text "Specify a file glob to filter attachments. For example, to only extract pdf files: " - , code [] - [ text "*.pdf" - ] - , text ". If you want to include the mail body, allow html files or " - , code [] - [ text "mail.html" - ] - , text ". Globs can be combined via OR, like this: " - , code [] - [ text "*.pdf|mail.html" - ] - , text ". No file filter defaults to " - , code [] - [ text "*" - ] - , text " that includes all" - ] - ] - , div - [ class "field" - ] - [ label [] [ text "Subject Filter" ] - , input - [ type_ "text" - , onInput SetSubjectFilter - , placeholder "Subject Filter" - , model.subjectFilter - |> Maybe.withDefault "" - |> value - ] - [] - , div [ class "small-info" ] - [ text "Specify a file glob to filter mails by subject. For example: " - , code [] - [ text "*Scanned Document*" - ] - , text ". No file filter defaults to " - , code [] - [ text "*" - ] - , text " that includes all" - ] - ] - ] - - -viewPostProcessing : Model -> List (Html Msg) -viewPostProcessing model = - [ div [ class "ui message" ] - [ text "This defines what happens to mails that have been downloaded." - ] - , div [ class "inline field" ] - [ div [ class "ui checkbox" ] - [ input - [ type_ "checkbox" - , onCheck (\_ -> TogglePostHandleAll) - , checked model.postHandleAll - ] - [] - , label [] [ text "Apply post-processing to all fetched mails." ] - ] - , span [ class "small-info" ] - [ text "When mails are not imported due to the 'Additional Filters', this flag can " - , text "control whether they should be moved to a target folder or deleted (whatever is " - , text "defined here) nevertheless. If unchecked only imported mails " - , text "are post-processed, others stay where they are." - ] - ] - , div [ class "field" ] - [ label [] [ text "Target folder" ] - , input - [ type_ "text" - , onInput SetTargetFolder - , Maybe.withDefault "" model.targetFolder |> value - ] - [] - , span [ class "small-info" ] - [ text "Move mails into this folder." - ] - ] - , div [ class "inline field" ] - [ div [ class "ui checkbox" ] - [ input - [ type_ "checkbox" - , onCheck (\_ -> ToggleDeleteMail) - , checked model.deleteMail - ] - [] - , label [] [ text "Delete imported mails" ] - ] - , span [ class "small-info" ] - [ text "Whether to delete all mails fetched by docspell. This only applies if " - , em [] [ text "target folder" ] - , text " is not set." - ] - ] - ] - - -viewMetadata : UiSettings -> Model -> List (Html Msg) -viewMetadata settings model = - [ div [ class "ui message" ] - [ text "Define metadata that should be attached to all items created by this task." - ] - , div [ class "required field" ] - [ label [] [ text "Item direction" ] - , div [ class "grouped fields" ] - [ div [ class "field" ] - [ div [ class "ui radio checkbox" ] - [ input - [ type_ "radio" - , checked (model.direction == Nothing) - , onCheck (\_ -> DirectionMsg Nothing) - ] - [] - , label [] [ text "Automatic" ] - ] - ] - , div [ class "field" ] - [ div [ class "ui radio checkbox" ] - [ input - [ type_ "radio" - , checked (model.direction == Just Incoming) - , onCheck (\_ -> DirectionMsg (Just Incoming)) - ] - [] - , label [] [ text "Incoming" ] - ] - ] - , div [ class "field" ] - [ div [ class "ui radio checkbox" ] - [ input - [ type_ "radio" - , checked (model.direction == Just Outgoing) - , onCheck (\_ -> DirectionMsg (Just Outgoing)) - ] - [] - , label [] [ text "Outgoing" ] - ] - ] - , span [ class "small-info" ] - [ text "Sets the direction for an item. If you know all mails are incoming or " - , text "outgoing, you can set it here. Otherwise it will be guessed from looking " - , text "at sender and receiver." - ] - ] - ] - , div [ class "field" ] - [ label [] - [ text "Item Folder" - ] - , Html.map FolderDropdownMsg (Comp.Dropdown.view settings model.folderModel) - , span [ class "small-info" ] - [ text "Put all items from this mailbox into the selected folder" - ] - , div - [ classList - [ ( "ui warning message", True ) - , ( "hidden", isFolderMember model ) - ] - ] - [ Markdown.toHtml [] """ -You are **not a member** of this folder. Items created from mails in -this mailbox will be **hidden** from any search results. Use a folder -where you are a member of to make items visible. This message will -disappear then. - """ - ] - ] - , div [ class "field" ] - [ label [] [ text "Tags" ] - , Html.map TagDropdownMsg (Comp.Dropdown.view settings model.tagModel) - , div [ class "small-info" ] - [ text "Choose tags that should be applied to items." - ] - ] - , div [ class "field" ] - [ label [] - [ text "Language" - ] - , div [ class "ui action input" ] - [ Html.map LanguageMsg - (Comp.FixedDropdown.viewStyled "fluid" - (Maybe.map mkLanguageItem model.language) - model.languageModel - ) - , a - [ class "ui icon button" - , href "#" - , onClick RemoveLanguage - ] - [ i [ class "delete icon" ] [] - ] - ] - , div [ class "small-info" ] - [ text "Used for text extraction and text analysis. The " - , text "collective's default language is used, if not specified here." - ] - ] - ] - - -viewSchedule : Model -> List (Html Msg) -viewSchedule model = - [ div [ class "ui message" ] - [ text "Define when mails should be imported." - ] - , div [ class "required field" ] - [ label [] - [ text "Schedule" - , a - [ class "right-float" - , href "https://github.com/eikek/calev#what-are-calendar-events" - , target "_blank" - ] - [ i [ class "help icon" ] [] - , text "Click here for help" - ] - ] - , Html.map CalEventMsg - (Comp.CalEventInput.view "" - (Data.Validated.value model.schedule) - model.scheduleModel - ) - , span [ class "small-info" ] - [ text "Specify how often and when this task should run. " - , text "Use English 3-letter weekdays. Either a single value, " - , text "a list (ex. 1,2,3), a range (ex. 1..3) or a '*' (meaning all) " - , text "is allowed for each part." - ] - ] - ] - - - ---- View2 - - view2 : String -> UiSettings -> Model -> Html Msg view2 extraClasses settings model = let diff --git a/modules/webapp/src/main/elm/Comp/ScanMailboxList.elm b/modules/webapp/src/main/elm/Comp/ScanMailboxList.elm index 7d40ccd7..40a4f820 100644 --- a/modules/webapp/src/main/elm/Comp/ScanMailboxList.elm +++ b/modules/webapp/src/main/elm/Comp/ScanMailboxList.elm @@ -4,7 +4,6 @@ module Comp.ScanMailboxList exposing , Msg , init , update - , view , view2 ) @@ -12,7 +11,6 @@ import Api.Model.ScanMailboxSettings exposing (ScanMailboxSettings) import Comp.Basic as B import Html exposing (..) import Html.Attributes exposing (..) -import Html.Events exposing (onClick) import Styles as S import Util.Html @@ -43,77 +41,6 @@ update msg model = ---- View - - -view : Model -> List ScanMailboxSettings -> Html Msg -view _ items = - div [] - [ table [ class "ui very basic center aligned table" ] - [ thead [] - [ tr [] - [ th [ class "collapsing" ] [] - , th [ class "collapsing" ] - [ i [ class "check icon" ] [] - ] - , th [] [ text "Schedule" ] - , th [] [ text "Connection" ] - , th [] [ text "Folders" ] - , th [] [ text "Received Since" ] - , th [] [ text "Target" ] - , th [] [ text "Delete" ] - ] - ] - , tbody [] - (List.map viewItem items) - ] - ] - - -viewItem : ScanMailboxSettings -> Html Msg -viewItem item = - tr [] - [ td [ class "collapsing" ] - [ a - [ href "#" - , class "ui basic small blue label" - , onClick (EditSettings item) - ] - [ i [ class "edit icon" ] [] - , text "Edit" - ] - ] - , td [ class "collapsing" ] - [ Util.Html.checkbox item.enabled - ] - , td [] - [ code [] - [ text item.schedule - ] - ] - , td [] - [ text item.imapConnection - ] - , td [] - [ String.join ", " item.folders |> text - ] - , td [] - [ Maybe.map String.fromInt item.receivedSinceHours - |> Maybe.withDefault "-" - |> text - , text " h" - ] - , td [] - [ Maybe.withDefault "-" item.targetFolder - |> text - ] - , td [] - [ Util.Html.checkbox item.deleteMail - ] - ] - - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/ScanMailboxManage.elm b/modules/webapp/src/main/elm/Comp/ScanMailboxManage.elm index dd5d70c0..c199f7fe 100644 --- a/modules/webapp/src/main/elm/Comp/ScanMailboxManage.elm +++ b/modules/webapp/src/main/elm/Comp/ScanMailboxManage.elm @@ -3,7 +3,6 @@ module Comp.ScanMailboxManage exposing , Msg , init , update - , view , view2 ) @@ -211,61 +210,13 @@ update flags msg model = ---- View - - -view : UiSettings -> Model -> Html Msg -view settings model = - div [] - [ div [ class "ui menu" ] - [ a - [ class "link item" - , href "#" - , onClick NewTask - ] - [ i [ class "add icon" ] [] - , text "New Task" - ] - ] - , div - [ classList - [ ( "ui message", True ) - , ( "error", Maybe.map .success model.result == Just False ) - , ( "success", Maybe.map .success model.result == Just True ) - , ( "invisible hidden", model.result == Nothing ) - ] - ] - [ Maybe.map .message model.result - |> Maybe.withDefault "" - |> text - ] - , case model.detailModel of - Just msett -> - viewForm settings msett - - Nothing -> - viewList model - ] - - -viewForm : UiSettings -> Comp.ScanMailboxForm.Model -> Html Msg -viewForm settings model = - Html.map DetailMsg (Comp.ScanMailboxForm.view "" settings model) - - -viewList : Model -> Html Msg -viewList model = - Html.map ListMsg (Comp.ScanMailboxList.view model.listModel model.items) - - - --- View2 view2 : UiSettings -> Model -> Html Msg view2 settings model = div [ class "flex flex-col" ] - ([ div + (div [ classList [ ( S.errorMessage, Maybe.map .success model.result == Just False ) , ( S.successMessage, Maybe.map .success model.result == Just True ) @@ -276,8 +227,7 @@ view2 settings model = |> Maybe.withDefault "" |> text ] - ] - ++ (case model.detailModel of + :: (case model.detailModel of Just msett -> viewForm2 settings msett diff --git a/modules/webapp/src/main/elm/Comp/SearchMenu.elm b/modules/webapp/src/main/elm/Comp/SearchMenu.elm index 669d71b7..262a2011 100644 --- a/modules/webapp/src/main/elm/Comp/SearchMenu.elm +++ b/modules/webapp/src/main/elm/Comp/SearchMenu.elm @@ -10,8 +10,6 @@ module Comp.SearchMenu exposing , textSearchString , update , updateDrop - , view - , viewDrop , viewDrop2 ) @@ -37,14 +35,13 @@ import Data.Direction exposing (Direction) import Data.DropdownStyle as DS import Data.Fields import Data.Flags exposing (Flags) -import Data.Icons as Icons import Data.ItemQuery as Q exposing (ItemQuery) import Data.PersonUse import Data.UiSettings exposing (UiSettings) import DatePicker exposing (DatePicker) import Html exposing (..) import Html.Attributes exposing (..) -import Html.Events exposing (onCheck, onClick, onInput) +import Html.Events exposing (onClick, onInput) import Http import Set exposing (Set) import Styles as S @@ -221,20 +218,6 @@ isNamesSearch model = True -getDirection : Model -> Maybe Direction -getDirection model = - let - selection = - Comp.Dropdown.getSelected model.directionModel - in - case selection of - [ d ] -> - Just d - - _ -> - Nothing - - getItemQuery : Model -> Maybe ItemQuery getItemQuery model = let @@ -956,289 +939,6 @@ updateDrop ddm flags settings msg model = --- View - - -view : Flags -> UiSettings -> Model -> Html Msg -view = - viewDrop (DD.DragDropData DD.init Nothing) - - -viewDrop : DD.DragDropData -> Flags -> UiSettings -> Model -> Html Msg -viewDrop ddd flags settings model = - let - formHeader icon headline = - div [ class "ui tiny header" ] - [ icon - , div [ class "content" ] - [ text headline - ] - ] - - segmentClass = - "ui vertical segment" - - fieldVisible field = - Data.UiSettings.fieldVisible settings field - - fieldHidden field = - Data.UiSettings.fieldHidden settings field - - optional fields html = - if - List.map fieldVisible fields - |> List.foldl (||) False - then - html - - else - span [ class "invisible hidden" ] [] - in - div [ class "ui form" ] - [ div [ class segmentClass ] - [ div [ class "inline field" ] - [ div [ class "ui checkbox" ] - [ input - [ type_ "checkbox" - , onCheck (\_ -> ToggleInbox) - , checked model.inboxCheckbox - ] - [] - , label [] - [ text "Only New" - ] - ] - ] - ] - , div [ class segmentClass ] - [ div - [ class "field" - ] - [ label [] - [ text - (case model.textSearchModel of - Fulltext _ -> - "Fulltext Search" - - Names _ -> - "Search in names" - ) - , a - [ classList - [ ( "right-float", True ) - , ( "invisible hidden", not flags.config.fullTextSearchEnabled ) - ] - , href "#" - , onClick SwapTextSearch - , title "Switch between text search modes" - ] - [ i [ class "small grey exchange alternate icon" ] [] - ] - ] - , input - [ type_ "text" - , onInput SetTextSearch - , Util.Html.onKeyUpCode KeyUpMsg - , textSearchString model.textSearchModel |> Maybe.withDefault "" |> value - , case model.textSearchModel of - Fulltext _ -> - placeholder "Content search…" - - Names _ -> - placeholder "Search in various names…" - ] - [] - , span [ class "small-info" ] - [ case model.textSearchModel of - Fulltext _ -> - text "Fulltext search in document contents and notes." - - Names _ -> - text "Looks in correspondents, concerned entities, item name and notes." - ] - ] - ] - , div - [ classList - [ ( segmentClass, True ) - , ( "invisible hidden", fieldHidden Data.Fields.Tag && fieldHidden Data.Fields.Folder ) - ] - ] - ((if fieldVisible Data.Fields.Tag then - List.map (Html.map TagSelectMsg) - (Comp.TagSelect.viewAll - ddd.model - settings - model.tagSelection - model.tagSelectModel - ) - - else - [] - ) - ++ [ optional [ Data.Fields.Folder ] <| - Html.map FolderSelectMsg - (Comp.FolderSelect.viewDrop ddd.model - settings.searchMenuFolderCount - model.folderList - ) - ] - ) - , div - [ classList - [ ( segmentClass, True ) - , ( "hidden invisible", fieldHidden Data.Fields.CorrOrg && fieldHidden Data.Fields.CorrPerson ) - ] - ] - [ optional - [ Data.Fields.CorrOrg - , Data.Fields.CorrPerson - ] - <| - formHeader (Icons.correspondentIcon "") - (case getDirection model of - Just Data.Direction.Incoming -> - "Sender" - - Just Data.Direction.Outgoing -> - "Recipient" - - Nothing -> - "Correspondent" - ) - , optional [ Data.Fields.CorrOrg ] <| - div [ class "field" ] - [ label [] [ text "Organization" ] - , Html.map OrgMsg (Comp.Dropdown.view settings model.orgModel) - ] - , optional [ Data.Fields.CorrPerson ] <| - div [ class "field" ] - [ label [] [ text "Person" ] - , Html.map CorrPersonMsg (Comp.Dropdown.view settings model.corrPersonModel) - ] - , optional - [ Data.Fields.ConcPerson - , Data.Fields.ConcEquip - ] - <| - formHeader Icons.concernedIcon "Concerned" - , optional [ Data.Fields.ConcPerson ] <| - div [ class "field" ] - [ label [] [ text "Person" ] - , Html.map ConcPersonMsg (Comp.Dropdown.view settings model.concPersonModel) - ] - , optional [ Data.Fields.ConcEquip ] <| - div [ class "field" ] - [ label [] [ text "Equipment" ] - , Html.map ConcEquipmentMsg (Comp.Dropdown.view settings model.concEquipmentModel) - ] - ] - , div - [ classList - [ ( segmentClass, True ) - , ( "hidden invisible" - , fieldHidden Data.Fields.CustomFields - || Comp.CustomFieldMultiInput.isEmpty model.customFieldModel - ) - ] - ] - [ formHeader (Icons.customFieldIcon "") "Custom Fields" - , Html.map CustomFieldMsg - (Comp.CustomFieldMultiInput.view - (Comp.CustomFieldMultiInput.ViewSettings False "field" (\_ -> Nothing)) - model.customFieldModel - ) - ] - , div - [ classList - [ ( segmentClass, True ) - , ( "invisible hidden", fieldHidden Data.Fields.Date && fieldHidden Data.Fields.DueDate ) - ] - ] - [ optional [ Data.Fields.Date ] <| - formHeader (Icons.dateIcon "") "Date" - , optional [ Data.Fields.Date ] <| - div [ class "fields" ] - [ div [ class "field" ] - [ label [] - [ text "From" - ] - , Html.map FromDateMsg - (Comp.DatePicker.viewTimeDefault - model.fromDate - model.fromDateModel - ) - ] - , div [ class "field" ] - [ label [] - [ text "To" - ] - , Html.map UntilDateMsg - (Comp.DatePicker.viewTimeDefault - model.untilDate - model.untilDateModel - ) - ] - ] - , optional [ Data.Fields.DueDate ] <| - formHeader (Icons.dueDateIcon "") "Due Date" - , optional [ Data.Fields.DueDate ] <| - div [ class "fields" ] - [ div [ class "field" ] - [ label [] - [ text "Due From" - ] - , Html.map FromDueDateMsg - (Comp.DatePicker.viewTimeDefault - model.fromDueDate - model.fromDueDateModel - ) - ] - , div [ class "field" ] - [ label [] - [ text "Due To" - ] - , Html.map UntilDueDateMsg - (Comp.DatePicker.viewTimeDefault - model.untilDueDate - model.untilDueDateModel - ) - ] - ] - ] - , div - [ classList - [ ( segmentClass, not (fieldHidden Data.Fields.SourceName) ) - , ( "invisible hidden", fieldHidden Data.Fields.SourceName ) - ] - ] - [ formHeader (Icons.sourceIcon "") "Source" - , div [ class "field" ] - [ input - [ type_ "text" - , onInput SetSource - , Util.Html.onKeyUpCode KeyUpMsg - , model.sourceModel |> Maybe.withDefault "" |> value - , placeholder "Search in item source…" - ] - [] - ] - ] - , div - [ classList - [ ( segmentClass, True ) - , ( "invisible hidden", fieldHidden Data.Fields.Direction ) - ] - ] - [ formHeader (Icons.directionIcon "") "Direction" - , div [ class "field" ] - [ Html.map DirectionMsg (Comp.Dropdown.view settings model.directionModel) - ] - ] - ] - - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/SearchStatsView.elm b/modules/webapp/src/main/elm/Comp/SearchStatsView.elm index 6edab65d..6e03fd35 100644 --- a/modules/webapp/src/main/elm/Comp/SearchStatsView.elm +++ b/modules/webapp/src/main/elm/Comp/SearchStatsView.elm @@ -1,7 +1,6 @@ module Comp.SearchStatsView exposing ( nameOrLabel , sortFields - , view , view2 ) @@ -26,78 +25,6 @@ sortFields fields = ---- View - - -view : SearchStats -> List (Html msg) -view stats = - let - isNumField f = - f.sum > 0 - - statValues f = - tr [ class "center aligned" ] - [ td [ class "left aligned" ] - [ div [ class "ui basic label" ] - [ Icons.customFieldTypeIconString "" f.ftype - , text (nameOrLabel f) - ] - ] - , td [] - [ f.count |> String.fromInt |> text - ] - , td [] - [ f.sum |> Data.Money.format |> text - ] - , td [] - [ f.avg |> Data.Money.format |> text - ] - , td [] - [ f.min |> Data.Money.format |> text - ] - , td [] - [ f.max |> Data.Money.format |> text - ] - ] - - fields = - List.filter isNumField stats.fieldStats - |> sortFields - in - [ div [ class "ui container" ] - [ div [ class "ui middle aligned stackable grid" ] - [ div [ class "three wide center aligned column" ] - [ div [ class "ui small statistic" ] - [ div [ class "value" ] - [ String.fromInt stats.count |> text - ] - , div [ class "label" ] - [ text "Items" - ] - ] - ] - , div [ class "thirteen wide column" ] - [ table [ class "ui very basic tiny six column table" ] - [ thead [] - [ tr [ class "center aligned" ] - [ th [] [] - , th [] [ text "Count" ] - , th [] [ text "Sum" ] - , th [] [ text "Avg" ] - , th [] [ text "Min" ] - , th [] [ text "Max" ] - ] - ] - , tbody [] - (List.map statValues fields) - ] - ] - ] - ] - ] - - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/SentMails.elm b/modules/webapp/src/main/elm/Comp/SentMails.elm index 03077326..df28d3c3 100644 --- a/modules/webapp/src/main/elm/Comp/SentMails.elm +++ b/modules/webapp/src/main/elm/Comp/SentMails.elm @@ -5,7 +5,6 @@ module Comp.SentMails exposing , initMails , isEmpty , update - , view , view2 ) @@ -57,88 +56,6 @@ update msg model = ---- View - - -view : Model -> Html Msg -view model = - case model.selected of - Just mail -> - div [ class "ui blue basic segment" ] - [ div [ class "ui list" ] - [ div [ class "item" ] - [ text "From" - , div [ class "header" ] - [ text mail.sender - , text " (" - , text mail.connection - , text ")" - ] - ] - , div [ class "item" ] - [ text "Date" - , div [ class "header" ] - [ Util.Time.formatDateTime mail.created |> text - ] - ] - , div [ class "item" ] - [ text "Recipients" - , div [ class "header" ] - [ String.join ", " mail.recipients |> text - ] - ] - , div [ class "item" ] - [ text "Subject" - , div [ class "header" ] - [ text mail.subject - ] - ] - ] - , div [ class "ui horizontal divider" ] [] - , div [ class "mail-body" ] - [ text mail.body - ] - , a - [ class "ui right corner label" - , onClick Hide - , href "#" - ] - [ i [ class "close icon" ] [] - ] - ] - - Nothing -> - table [ class "ui selectable pointer very basic table" ] - [ thead [] - [ tr [] - [ th [ class "collapsing" ] [ text "Recipients" ] - , th [] [ text "Subject" ] - , th [ class "collapsible" ] [ text "Sent" ] - , th [ class "collapsible" ] [ text "Sender" ] - ] - ] - , tbody [] <| - List.map - renderLine - model.mails - ] - - -renderLine : SentMail -> Html Msg -renderLine mail = - tr [ onClick (Show mail) ] - [ td [ class "collapsing" ] - [ String.join ", " mail.recipients |> text - ] - , td [] [ text mail.subject ] - , td [ class "collapsing" ] - [ Util.Time.formatDateTime mail.created |> text - ] - , td [ class "collapsing" ] [ text mail.sender ] - ] - - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/SourceForm.elm b/modules/webapp/src/main/elm/Comp/SourceForm.elm index aee1db57..bca6a32e 100644 --- a/modules/webapp/src/main/elm/Comp/SourceForm.elm +++ b/modules/webapp/src/main/elm/Comp/SourceForm.elm @@ -5,7 +5,6 @@ module Comp.SourceForm exposing , init , isValid , update - , view , view2 ) @@ -327,141 +326,6 @@ update flags msg model = ---- View - - -view : Flags -> UiSettings -> Model -> Html Msg -view flags settings model = - let - priorityItem = - Comp.FixedDropdown.Item - model.priority - (Data.Priority.toName model.priority) - in - div [ class "ui warning form" ] - [ div - [ classList - [ ( "field", True ) - , ( "error", not (isValid model) ) - ] - ] - [ label [] [ text "Abbrev*" ] - , input - [ type_ "text" - , onInput SetAbbrev - , placeholder "Abbrev" - , value model.abbrev - ] - [] - ] - , div [ class "field" ] - [ label [] [ text "Description" ] - , textarea - [ onInput SetDescr - , model.description |> Maybe.withDefault "" |> value - , rows 3 - ] - [] - ] - , div [ class "inline field" ] - [ div [ class "ui checkbox" ] - [ input - [ type_ "checkbox" - , onCheck (\_ -> ToggleEnabled) - , checked model.enabled - ] - [] - , label [] [ text "Enabled" ] - ] - ] - , div [ class "field" ] - [ label [] [ text "Priority" ] - , Html.map PrioDropdownMsg - (Comp.FixedDropdown.view - (Just priorityItem) - model.priorityModel - ) - , div [ class "small-info" ] - [ text "The priority used by the scheduler when processing uploaded files." - ] - ] - , div [ class "ui dividing header" ] - [ text "Metadata" - ] - , div [ class "ui message" ] - [ text "Metadata specified here is automatically attached to each item uploaded " - , text "through this source, unless it is overriden in the upload request meta data. " - , text "Tags from the request are added to those defined here." - ] - , div [ class "field" ] - [ label [] - [ text "Folder" - ] - , Html.map FolderDropdownMsg (Comp.Dropdown.view settings model.folderModel) - , div [ class "small-info" ] - [ text "Choose a folder to automatically put items into." - ] - , div - [ classList - [ ( "ui warning message", True ) - , ( "hidden", isFolderMember model ) - ] - ] - [ Markdown.toHtml [] """ -You are **not a member** of this folder. Items created through this -link will be **hidden** from any search results. Use a folder where -you are a member of to make items visible. This message will -disappear then. - """ - ] - ] - , div [ class "field" ] - [ label [] [ text "Tags" ] - , Html.map TagDropdownMsg (Comp.Dropdown.view settings model.tagModel) - , div [ class "small-info" ] - [ text "Choose tags that should be applied to items." - ] - ] - , div - [ class "field" - ] - [ label [] [ text "File Filter" ] - , input - [ type_ "text" - , onInput SetFileFilter - , placeholder "File Filter" - , model.fileFilter - |> Maybe.withDefault "" - |> value - ] - [] - , div [ class "small-info" ] - [ text "Specify a file glob to filter files when uploading archives " - , text "(e.g. for email and zip). For example, to only extract pdf files: " - , code [] - [ text "*.pdf" - ] - , text ". Globs can be combined via OR, like this: " - , code [] - [ text "*.pdf|mail.html" - ] - ] - ] - ] - - -isFolderMember : Model -> Bool -isFolderMember model = - let - selected = - Comp.Dropdown.getSelected model.folderModel - |> List.head - |> Maybe.map .id - in - Util.Folder.isFolderMember model.allFolders selected - - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/SourceManage.elm b/modules/webapp/src/main/elm/Comp/SourceManage.elm index a756eb0c..0d8b2954 100644 --- a/modules/webapp/src/main/elm/Comp/SourceManage.elm +++ b/modules/webapp/src/main/elm/Comp/SourceManage.elm @@ -3,7 +3,6 @@ module Comp.SourceManage exposing , Msg(..) , init , update - , view , view2 ) @@ -20,7 +19,7 @@ import Data.Flags exposing (Flags) import Data.UiSettings exposing (UiSettings) import Html exposing (..) import Html.Attributes exposing (..) -import Html.Events exposing (onClick, onSubmit) +import Html.Events exposing (onSubmit) import Http import Ports import QRCode @@ -209,7 +208,7 @@ update flags msg model = ---- View +--- View2 qrCodeView : String -> Html msg @@ -220,203 +219,6 @@ qrCodeView message = (Html.text "Error generating QR-Code") -view : Flags -> UiSettings -> Model -> Html Msg -view flags settings model = - case model.viewMode of - None -> - viewTable model - - Edit _ -> - div [] (viewForm flags settings model) - - Display source -> - viewLinks flags settings source - - -viewTable : Model -> Html Msg -viewTable model = - div [] - [ button [ class "ui basic button", onClick InitNewSource ] - [ i [ class "plus icon" ] [] - , text "Create new" - ] - , Html.map TableMsg (Comp.SourceTable.view model.sources) - , div - [ classList - [ ( "ui dimmer", True ) - , ( "active", model.loading ) - ] - ] - [ div [ class "ui loader" ] [] - ] - ] - - -viewLinks : Flags -> UiSettings -> SourceAndTags -> Html Msg -viewLinks flags _ source = - let - appUrl = - flags.config.baseUrl ++ "/app/upload/" ++ source.source.id - - apiUrl = - flags.config.baseUrl ++ "/api/v1/open/upload/item/" ++ source.source.id - in - div - [] - [ h3 [ class "ui dividing header" ] - [ text "Public Uploads: " - , text source.source.abbrev - , div [ class "sub header" ] - [ text source.source.id - ] - ] - , p [] - [ text "This source defines URLs that can be used by anyone to send files to " - , text "you. There is a web page that you can share or the API url can be used " - , text "with other clients." - ] - , p [] - [ text "There have been " - , String.fromInt source.source.counter |> text - , text " items created through this source." - ] - , h4 [ class "ui header" ] - [ text "Public Upload Page" - ] - , div [ class "ui attached message" ] - [ div [ class "ui fluid left action input" ] - [ a - [ class "ui left icon button" - , title "Copy to clipboard" - , href "#" - , Tuple.second appClipboardData - |> String.dropLeft 1 - |> id - , attribute "data-clipboard-target" "#app-url" - ] - [ i [ class "copy icon" ] [] - ] - , a - [ class "ui icon button" - , href appUrl - , target "_blank" - , title "Open in new tab/window" - ] - [ i [ class "link external icon" ] [] - ] - , input - [ type_ "text" - , id "app-url" - , value appUrl - , readonly True - ] - [] - ] - ] - , div [ class "ui attached segment" ] - [ div [ class "qr-code" ] - [ qrCodeView appUrl - ] - ] - , h4 [ class "ui header" ] - [ text "Public API Upload URL" - ] - , div [ class "ui attached message" ] - [ div [ class "ui fluid left action input" ] - [ a - [ class "ui left icon button" - , title "Copy to clipboard" - , href "#" - , Tuple.second apiClipboardData - |> String.dropLeft 1 - |> id - , attribute "data-clipboard-target" "#api-url" - ] - [ i [ class "copy icon" ] [] - ] - , input - [ type_ "text" - , value apiUrl - , readonly True - , id "api-url" - ] - [] - ] - ] - , div [ class "ui attached segment" ] - [ div [ class "qr-code" ] - [ qrCodeView apiUrl - ] - ] - , div [ class "ui divider" ] [] - , button - [ class "ui button" - , onClick SetTableView - ] - [ text "Back" - ] - ] - - -viewForm : Flags -> UiSettings -> Model -> List (Html Msg) -viewForm flags settings model = - let - newSource = - model.formModel.source.source.id == "" - in - [ if newSource then - h3 [ class "ui top attached header" ] - [ text "Create new source" - ] - - else - h3 [ class "ui top attached header" ] - [ text ("Edit: " ++ model.formModel.source.source.abbrev) - , div [ class "sub header" ] - [ text "Id: " - , text model.formModel.source.source.id - ] - ] - , Html.form [ class "ui attached segment", onSubmit Submit ] - [ Html.map YesNoMsg (Comp.YesNoDimmer.view model.deleteConfirm) - , Html.map FormMsg (Comp.SourceForm.view flags settings model.formModel) - , div - [ classList - [ ( "ui error message", True ) - , ( "invisible", Util.Maybe.isEmpty model.formError ) - ] - ] - [ Maybe.withDefault "" model.formError |> text - ] - , div [ class "ui horizontal divider" ] [] - , button [ class "ui primary button", type_ "submit" ] - [ text "Submit" - ] - , a [ class "ui secondary button", onClick SetTableView, href "#" ] - [ text "Cancel" - ] - , if not newSource then - a [ class "ui right floated red button", href "#", onClick RequestDelete ] - [ text "Delete" ] - - else - span [] [] - , div - [ classList - [ ( "ui dimmer", True ) - , ( "active", model.loading ) - ] - ] - [ div [ class "ui loader" ] [] - ] - ] - ] - - - ---- View2 - - view2 : Flags -> UiSettings -> Model -> Html Msg view2 flags settings model = case model.viewMode of diff --git a/modules/webapp/src/main/elm/Comp/SourceTable.elm b/modules/webapp/src/main/elm/Comp/SourceTable.elm index a061026e..bd0a3466 100644 --- a/modules/webapp/src/main/elm/Comp/SourceTable.elm +++ b/modules/webapp/src/main/elm/Comp/SourceTable.elm @@ -3,7 +3,6 @@ module Comp.SourceTable exposing , SelectMode(..) , isEdit , update - , view , view2 ) @@ -13,7 +12,6 @@ import Data.Flags exposing (Flags) import Data.Priority import Html exposing (..) import Html.Attributes exposing (..) -import Html.Events exposing (onClick) import Styles as S import Util.Html @@ -53,79 +51,6 @@ update _ msg = ---- View - - -view : List SourceAndTags -> Html Msg -view sources = - table [ class "ui table" ] - [ thead [] - [ tr [] - [ th [ class "collapsing" ] [] - , th [ class "collapsing" ] [ text "Abbrev" ] - , th [ class "collapsing" ] [ text "Enabled" ] - , th [ class "collapsing" ] [ text "Counter" ] - , th [ class "collapsing" ] [ text "Priority" ] - , th [] [ text "Id" ] - ] - ] - , tbody [] - (List.map renderSourceLine sources) - ] - - -renderSourceLine : SourceAndTags -> Html Msg -renderSourceLine source = - tr - [] - [ td [ class "collapsing" ] - [ a - [ class "ui basic tiny primary button" - , href "#" - , onClick (Select source) - ] - [ i [ class "edit icon" ] [] - , text "Edit" - ] - , a - [ classList - [ ( "ui basic tiny primary button", True ) - , ( "disabled", not source.source.enabled ) - ] - , href "#" - , disabled (not source.source.enabled) - , onClick (Show source) - ] - [ i [ class "eye icon" ] [] - , text "Show" - ] - ] - , td [ class "collapsing" ] - [ text source.source.abbrev - ] - , td [ class "collapsing" ] - [ if source.source.enabled then - i [ class "check square outline icon" ] [] - - else - i [ class "minus square outline icon" ] [] - ] - , td [ class "collapsing" ] - [ source.source.counter |> String.fromInt |> text - ] - , td [ class "collapsing" ] - [ Data.Priority.fromString source.source.priority - |> Maybe.map Data.Priority.toName - |> Maybe.withDefault source.source.priority - |> text - ] - , td [] - [ text source.source.id - ] - ] - - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/StringListInput.elm b/modules/webapp/src/main/elm/Comp/StringListInput.elm index 899a4c1a..60785b46 100644 --- a/modules/webapp/src/main/elm/Comp/StringListInput.elm +++ b/modules/webapp/src/main/elm/Comp/StringListInput.elm @@ -4,7 +4,6 @@ module Comp.StringListInput exposing , Msg , init , update - , view , view2 ) @@ -62,45 +61,6 @@ update msg model = ---- View - - -view : List String -> Model -> Html Msg -view values model = - let - valueItem s = - div [ class "item" ] - [ a - [ class "ui icon link" - , onClick (RemoveString s) - , href "#" - ] - [ i [ class "delete icon" ] [] - ] - , text s - ] - in - div [ class "string-list-input" ] - [ div [ class "ui list" ] - (List.map valueItem values) - , div [ class "ui icon input" ] - [ input - [ placeholder "" - , type_ "text" - , onInput SetString - , value model.currentInput - ] - [] - , i - [ class "circular add link icon" - , onClick AddString - ] - [] - ] - ] - - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/TagForm.elm b/modules/webapp/src/main/elm/Comp/TagForm.elm index 01e9861d..45c202d6 100644 --- a/modules/webapp/src/main/elm/Comp/TagForm.elm +++ b/modules/webapp/src/main/elm/Comp/TagForm.elm @@ -5,7 +5,6 @@ module Comp.TagForm exposing , getTag , isValid , update - , view , view2 ) @@ -117,30 +116,8 @@ update _ msg model = ( { model | catDropdown = dm_ }, Cmd.map CatMsg cmd_ ) -view : Model -> Html Msg -view model = - div [ class "ui form" ] - [ div - [ classList - [ ( "field", True ) - , ( "error", not (isValid model) ) - ] - ] - [ label [] [ text "Name*" ] - , input - [ type_ "text" - , onInput SetName - , placeholder "Name" - , value model.name - ] - [] - ] - , div [ class "field" ] - [ label [] - [ text "Category" ] - , Html.map CatMsg (Comp.Dropdown.viewSingle model.catDropdown) - ] - ] + +--- View2 view2 : Model -> Html Msg diff --git a/modules/webapp/src/main/elm/Comp/TagManage.elm b/modules/webapp/src/main/elm/Comp/TagManage.elm index 89d4d3a9..33664c83 100644 --- a/modules/webapp/src/main/elm/Comp/TagManage.elm +++ b/modules/webapp/src/main/elm/Comp/TagManage.elm @@ -3,7 +3,6 @@ module Comp.TagManage exposing , Msg(..) , emptyModel , update - , view , view2 ) @@ -19,7 +18,7 @@ import Comp.YesNoDimmer import Data.Flags exposing (Flags) import Html exposing (..) import Html.Attributes exposing (..) -import Html.Events exposing (onClick, onInput, onSubmit) +import Html.Events exposing (onSubmit) import Http import Styles as S import Util.Http @@ -56,11 +55,6 @@ emptyModel = } -dimmerSettings : Comp.YesNoDimmer.Settings -dimmerSettings = - Comp.YesNoDimmer.defaultSettings - - type Msg = TableMsg Comp.TagTable.Msg | FormMsg Comp.TagForm.Msg @@ -215,109 +209,8 @@ update flags msg model = ( m, Api.getTags flags str TagResp ) -view : Model -> Html Msg -view model = - if model.viewMode == Table then - viewTable model - else - viewForm model - - -viewTable : Model -> Html Msg -viewTable model = - div [] - [ div [ class "ui secondary menu" ] - [ div [ class "horizontally fitted item" ] - [ div [ class "ui icon input" ] - [ input - [ type_ "text" - , onInput SetQuery - , value model.query - , placeholder "Search…" - ] - [] - , i [ class "ui search icon" ] - [] - ] - ] - , div [ class "right menu" ] - [ div [ class "item" ] - [ a - [ class "ui primary button" - , href "#" - , onClick InitNewTag - ] - [ i [ class "plus icon" ] [] - , text "New Tag" - ] - ] - ] - ] - , Html.map TableMsg (Comp.TagTable.view model.tagTableModel) - , div - [ classList - [ ( "ui dimmer", True ) - , ( "active", model.loading ) - ] - ] - [ div [ class "ui loader" ] [] - ] - ] - - -viewForm : Model -> Html Msg -viewForm model = - let - newTag = - model.tagFormModel.tag.id == "" - in - Html.form [ class "ui segment", onSubmit Submit ] - [ Html.map YesNoMsg (Comp.YesNoDimmer.view model.deleteConfirm) - , if newTag then - h3 [ class "ui dividing header" ] - [ text "Create new tag" - ] - - else - h3 [ class "ui dividing header" ] - [ text ("Edit tag: " ++ model.tagFormModel.tag.name) - , div [ class "sub header" ] - [ text "Id: " - , text model.tagFormModel.tag.id - ] - ] - , Html.map FormMsg (Comp.TagForm.view model.tagFormModel) - , div - [ classList - [ ( "ui error message", True ) - , ( "invisible", Util.Maybe.isEmpty model.formError ) - ] - ] - [ Maybe.withDefault "" model.formError |> text - ] - , div [ class "ui horizontal divider" ] [] - , button [ class "ui primary button", type_ "submit" ] - [ text "Submit" - ] - , a [ class "ui secondary button", onClick (SetViewMode Table), href "#" ] - [ text "Cancel" - ] - , if not newTag then - a [ class "ui right floated red button", href "#", onClick RequestDelete ] - [ text "Delete" ] - - else - span [] [] - , div - [ classList - [ ( "ui dimmer", True ) - , ( "active", model.loading ) - ] - ] - [ div [ class "ui loader" ] [] - ] - ] +--- View2 view2 : Model -> Html Msg diff --git a/modules/webapp/src/main/elm/Comp/TagSelect.elm b/modules/webapp/src/main/elm/Comp/TagSelect.elm index 54c99371..2d89ae4a 100644 --- a/modules/webapp/src/main/elm/Comp/TagSelect.elm +++ b/modules/webapp/src/main/elm/Comp/TagSelect.elm @@ -13,7 +13,6 @@ module Comp.TagSelect exposing , toggleTag , update , updateDrop - , viewAll , viewAll2 , viewCats2 , viewTagsDrop2 @@ -420,229 +419,6 @@ catState model name = ---- View - - -viewAll : DD.Model -> UiSettings -> Selection -> Model -> List (Html Msg) -viewAll ddm settings sel model = - let - wm = - makeWorkModel sel model - in - viewTagsDrop ddm wm settings model ++ [ viewCats settings wm model ] - - -viewTagsDrop : DD.Model -> WorkModel -> UiSettings -> Model -> List (Html Msg) -viewTagsDrop ddm wm settings model = - [ div [ class "ui tiny fluid secondary menu" ] - [ a - [ class "borderless item" - , href "#" - , onClick ToggleShowEmpty - ] - [ if model.showEmpty then - text " Hide empty" - - else - text " Show empty" - ] - , div [ class "right menu" ] - [ div [ class "right fitted item width-80" ] - [ div [ class "ui small transparent icon input" ] - [ input - [ type_ "text" - , placeholder "Filter …" - , onInput Search - ] - [] - , i [ class "search icon" ] [] - ] - ] - ] - ] - , div [ class "ui list" ] - [ div [ class "item" ] - [ I.tagIcon "" - , div [ class "content" ] - [ div [ class "header" ] - [ text "Tags" - ] - , div [ class "ui relaxed list" ] - (renderTagItems ddm settings model wm) - ] - ] - ] - ] - - -viewCats : UiSettings -> WorkModel -> Model -> Html Msg -viewCats settings wm model = - div [ class "ui list" ] - [ div [ class "item" ] - [ I.tagsIcon "" - , div [ class "content" ] - [ div [ class "header" ] - [ text "Categories" - ] - , div [ class "ui relaxed list" ] - (renderCatItems settings model wm) - ] - ] - ] - - -renderTagItems : DD.Model -> UiSettings -> Model -> WorkModel -> List (Html Msg) -renderTagItems ddm settings model wm = - let - tags = - wm.filteredTags - - max = - settings.searchMenuTagCount - - expLink = - Util.ExpandCollapse.expandToggle - max - (List.length tags) - ToggleExpandTags - - cpsLink = - Util.ExpandCollapse.collapseToggle - max - (List.length tags) - ToggleExpandTags - in - if max <= 0 then - List.map (viewTagItem ddm settings wm) tags - - else if model.expandedTags then - List.map (viewTagItem ddm settings wm) tags ++ cpsLink - - else - List.map (viewTagItem ddm settings wm) (List.take max tags) ++ expLink - - -renderCatItems : UiSettings -> Model -> WorkModel -> List (Html Msg) -renderCatItems settings model wm = - let - cats = - wm.filteredCats - - max = - settings.searchMenuTagCatCount - - expLink = - Util.ExpandCollapse.expandToggle - max - (List.length cats) - ToggleExpandCats - - cpsLink = - Util.ExpandCollapse.collapseToggle - max - (List.length cats) - ToggleExpandCats - in - if max <= 0 then - List.map (viewCategoryItem settings wm) cats - - else if model.expandedCats then - List.map (viewCategoryItem settings wm) cats ++ cpsLink - - else - List.map (viewCategoryItem settings wm) (List.take max cats) ++ expLink - - -viewCategoryItem : UiSettings -> WorkModel -> Category -> Html Msg -viewCategoryItem settings model cat = - let - state = - catState model cat.name - - color = - Data.UiSettings.catColorString settings cat.name - - icon = - getIcon state color I.tagsIcon - in - a - [ class "item" - , href "#" - , onClick (ToggleCat cat.name) - ] - [ icon - , div [ class "content" ] - [ div - [ classList - [ ( "header", state == Include ) - , ( "description", state /= Include ) - ] - ] - [ text cat.name - , div [ class "ui right floated circular label" ] - [ text (String.fromInt cat.count) - ] - ] - ] - ] - - -viewTagItem : DD.Model -> UiSettings -> WorkModel -> TagCount -> Html Msg -viewTagItem ddm settings model tag = - let - state = - tagState model tag.tag.id - - color = - Data.UiSettings.tagColorString tag.tag settings - - icon = - getIcon state color I.tagIcon - - dropActive = - DD.getDropId ddm == Just (DD.Tag tag.tag.id) - in - a - ([ classList - [ ( "item", True ) - , ( "current-drop-target", dropActive ) - ] - , href "#" - , onClick (ToggleTag tag.tag.id) - ] - ++ DD.droppable TagDDMsg (DD.Tag tag.tag.id) - ) - [ icon - , div [ class "content" ] - [ div - [ classList - [ ( "header", state == Include ) - , ( "description", state /= Include ) - ] - ] - [ text tag.tag.name - , div [ class "ui right floated circular label" ] - [ text (String.fromInt tag.count) - ] - ] - ] - ] - - -getIcon : SelState -> String -> (String -> Html msg) -> Html msg -getIcon state color default = - case state of - Include -> - i [ class ("check icon " ++ color) ] [] - - Exclude -> - i [ class ("minus icon " ++ color) ] [] - - Deselect -> - default color - - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/TagTable.elm b/modules/webapp/src/main/elm/Comp/TagTable.elm index 929d6bc5..77e36451 100644 --- a/modules/webapp/src/main/elm/Comp/TagTable.elm +++ b/modules/webapp/src/main/elm/Comp/TagTable.elm @@ -3,7 +3,6 @@ module Comp.TagTable exposing , Msg(..) , emptyModel , update - , view , view2 ) @@ -12,7 +11,6 @@ import Comp.Basic as B import Data.Flags exposing (Flags) import Html exposing (..) import Html.Attributes exposing (..) -import Html.Events exposing (onClick) import Styles as S @@ -48,44 +46,6 @@ update _ msg model = ( { model | selected = Nothing }, Cmd.none ) -view : Model -> Html Msg -view model = - table [ class "ui very basic aligned table" ] - [ thead [] - [ tr [] - [ th [ class "collapsing" ] [] - , th [ class "eight wide" ] [ text "Name" ] - , th [] [ text "Category" ] - ] - ] - , tbody [] - (List.map (renderTagLine model) model.tags) - ] - - -renderTagLine : Model -> Tag -> Html Msg -renderTagLine model tag = - tr - [] - [ td [ class "collapsing" ] - [ a - [ href "#" - , class "ui basic small blue label" - , onClick (Select tag) - ] - [ i [ class "edit icon" ] [] - , text "Edit" - ] - ] - , td [] - [ text tag.name - ] - , td [] - [ Maybe.withDefault "-" tag.category |> text - ] - ] - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/UiSettingsForm.elm b/modules/webapp/src/main/elm/Comp/UiSettingsForm.elm index 14cbc18c..c9f0a010 100644 --- a/modules/webapp/src/main/elm/Comp/UiSettingsForm.elm +++ b/modules/webapp/src/main/elm/Comp/UiSettingsForm.elm @@ -3,7 +3,6 @@ module Comp.UiSettingsForm exposing , Msg , init , update - , view , view2 ) @@ -24,7 +23,7 @@ import Data.UiSettings exposing (ItemPattern, Pos(..), UiSettings) import Dict exposing (Dict) import Html exposing (..) import Html.Attributes exposing (..) -import Html.Events exposing (onCheck, onClick, onInput) +import Html.Events exposing (onClick, onInput) import Http import Markdown import Set exposing (Set) @@ -41,7 +40,6 @@ type alias Model = , nativePdfPreview : Bool , itemSearchNoteLength : Maybe Int , searchNoteLengthModel : Comp.IntField.Model - , itemDetailNotesPosition : Pos , searchMenuFolderCount : Maybe Int , searchMenuFolderCountModel : Comp.IntField.Model , searchMenuTagCount : Maybe Int @@ -50,7 +48,6 @@ type alias Model = , searchMenuTagCatCountModel : Comp.IntField.Model , formFields : List Field , itemDetailShortcuts : Bool - , searchMenuVisible : Bool , editMenuVisible : Bool , cardPreviewSize : BasicSize , cardTitlePattern : PatternModel @@ -120,7 +117,6 @@ init flags settings = (Just flags.config.maxNoteLength) False "Max. Note Length" - , itemDetailNotesPosition = settings.itemDetailNotesPosition , searchMenuFolderCount = Just settings.searchMenuFolderCount , searchMenuFolderCountModel = Comp.IntField.init @@ -144,7 +140,6 @@ init flags settings = "Number of categories in search menu" , formFields = settings.formFields , itemDetailShortcuts = settings.itemDetailShortcuts - , searchMenuVisible = settings.searchMenuVisible , editMenuVisible = settings.editMenuVisible , cardPreviewSize = settings.cardPreviewSize , cardTitlePattern = initPatternModel settings.cardTitleTemplate @@ -165,13 +160,11 @@ type Msg | GetTagsResp (Result Http.Error TagList) | TogglePdfPreview | NoteLengthMsg Comp.IntField.Msg - | SetNotesPosition Pos | SearchMenuFolderMsg Comp.IntField.Msg | SearchMenuTagMsg Comp.IntField.Msg | SearchMenuTagCatMsg Comp.IntField.Msg | FieldListMsg Comp.FieldListSelect.Msg | ToggleItemDetailShortcuts - | ToggleSearchMenuVisible | ToggleEditMenuVisible | CardPreviewSizeMsg Comp.BasicSizeField.Msg | SetCardTitlePattern String @@ -270,17 +263,6 @@ update sett msg model = in ( model_, nextSettings ) - SetNotesPosition pos -> - let - model_ = - { model | itemDetailNotesPosition = pos } - in - if model_.itemDetailNotesPosition == sett.itemDetailNotesPosition then - ( model_, Nothing ) - - else - ( model_, Just { sett | itemDetailNotesPosition = model_.itemDetailNotesPosition } ) - TagColorMsg lm -> let ( m_, d_ ) = @@ -348,15 +330,6 @@ update sett msg model = , Just { sett | itemDetailShortcuts = flag } ) - ToggleSearchMenuVisible -> - let - flag = - not model.searchMenuVisible - in - ( { model | searchMenuVisible = flag } - , Just { sett | searchMenuVisible = flag } - ) - ToggleEditMenuVisible -> let flag = @@ -474,235 +447,6 @@ update sett msg model = ---- View - - -tagColorViewOpts : Comp.ColorTagger.ViewOpts -tagColorViewOpts = - { renderItem = - \( k, v ) -> - span [ class ("ui label " ++ Data.Color.toString v) ] - [ text k ] - , label = "Choose color for tag categories" - , description = Just "Tags can be represented differently based on their category." - } - - -view : Flags -> UiSettings -> Model -> Html Msg -view flags _ model = - div [ class "ui form" ] - [ div [ class "ui dividing header" ] - [ text "Item Search" - ] - , Html.map SearchPageSizeMsg - (Comp.IntField.viewWithInfo - ("Maximum results in one page when searching items. At most " - ++ String.fromInt flags.config.maxPageSize - ++ "." - ) - model.itemSearchPageSize - "field" - model.searchPageSizeModel - ) - , div [ class "field" ] - [ div [ class "ui checkbox" ] - [ input - [ type_ "checkbox" - , onCheck (\_ -> ToggleSearchStatsVisible) - , checked model.searchStatsVisible - ] - [] - , label [] - [ text "Show basic search statistics by default" - ] - ] - ] - , div [ class "ui dividing header" ] - [ text "Item Cards" - ] - , Html.map NoteLengthMsg - (Comp.IntField.viewWithInfo - ("Maximum size of the item notes to display in card view. Between 0 - " - ++ String.fromInt flags.config.maxNoteLength - ++ "." - ) - model.itemSearchNoteLength - "field" - model.searchNoteLengthModel - ) - , Html.map CardPreviewSizeMsg - (Comp.BasicSizeField.view - "Size of item preview" - model.cardPreviewSize - ) - , div [ class "field" ] - [ label [] - [ text "Card Title Pattern" - , a - [ class "right-float" - , title "Toggle pattern help text" - , href "#" - , onClick TogglePatternHelpMsg - ] - [ i [ class "help link icon" ] [] - ] - ] - , input - [ type_ "text" - , Maybe.withDefault "" model.cardTitlePattern.pattern |> value - , onInput SetCardTitlePattern - ] - [] - ] - , div [ class "field" ] - [ label [] - [ text "Card Subtitle Pattern" - , a - [ class "right-float" - , title "Toggle pattern help text" - , href "#" - , onClick TogglePatternHelpMsg - ] - [ i [ class "help link icon" ] [] - ] - ] - , input - [ type_ "text" - , Maybe.withDefault "" model.cardSubtitlePattern.pattern |> value - , onInput SetCardSubtitlePattern - ] - [] - ] - , Markdown.toHtml - [ classList - [ ( "ui message", True ) - , ( "hidden", not model.showPatternHelp ) - ] - ] - IT.helpMessage - , div [ class "ui dividing header" ] - [ text "Search Menu" ] - , div [ class "field" ] - [ div [ class "ui checkbox" ] - [ input - [ type_ "checkbox" - , onCheck (\_ -> ToggleSearchMenuVisible) - , checked model.searchMenuVisible - ] - [] - , label [] - [ text "Show search side menu by default" - ] - ] - ] - , Html.map SearchMenuTagMsg - (Comp.IntField.viewWithInfo - "How many tags to display in search menu at once. Others can be expanded. Use 0 to always show all." - model.searchMenuTagCount - "field" - model.searchMenuTagCountModel - ) - , Html.map SearchMenuTagCatMsg - (Comp.IntField.viewWithInfo - "How many categories to display in search menu at once. Others can be expanded. Use 0 to always show all." - model.searchMenuTagCatCount - "field" - model.searchMenuTagCatCountModel - ) - , Html.map SearchMenuFolderMsg - (Comp.IntField.viewWithInfo - "How many folders to display in search menu at once. Other folders can be expanded. Use 0 to always show all." - model.searchMenuFolderCount - "field" - model.searchMenuFolderCountModel - ) - , div [ class "ui dividing header" ] - [ text "Item Detail" - ] - , div [ class "field" ] - [ div [ class "ui checkbox" ] - [ input - [ type_ "checkbox" - , onCheck (\_ -> TogglePdfPreview) - , checked model.nativePdfPreview - ] - [] - , label [] - [ text "Browser-native PDF preview" - ] - ] - ] - , div [ class "field" ] - [ div [ class "ui checkbox" ] - [ input - [ type_ "checkbox" - , onCheck (\_ -> ToggleItemDetailShortcuts) - , checked model.itemDetailShortcuts - ] - [] - , label [] - [ text "Use keyboard shortcuts for navigation and confirm/unconfirm with open edit menu." - ] - ] - ] - , div [ class "field" ] - [ div [ class "ui checkbox" ] - [ input - [ type_ "checkbox" - , onCheck (\_ -> ToggleEditMenuVisible) - , checked model.editMenuVisible - ] - [] - , label [] - [ text "Show edit side menu by default" - ] - ] - ] - , div [ class "grouped fields" ] - [ label [] [ text "Position of item notes" ] - , div [ class "field" ] - [ div [ class "ui radio checkbox" ] - [ input - [ type_ "radio" - , checked (model.itemDetailNotesPosition == Top) - , onCheck (\_ -> SetNotesPosition Top) - ] - [] - , label [] [ text "Top" ] - ] - ] - , div [ class "field" ] - [ div [ class "ui radio checkbox" ] - [ input - [ type_ "radio" - , checked (model.itemDetailNotesPosition == Bottom) - , onCheck (\_ -> SetNotesPosition Bottom) - ] - [] - , label [] [ text "Bottom" ] - ] - ] - ] - , div [ class "ui dividing header" ] - [ text "Tag Category Colors" - ] - , Html.map TagColorMsg - (Comp.ColorTagger.view - model.tagColors - tagColorViewOpts - model.tagColorModel - ) - , div [ class "ui dividing header" ] - [ text "Fields" - ] - , span [ class "small-info" ] - [ text "Choose which fields to display in search and edit menus." - ] - , Html.map FieldListMsg (Comp.FieldListSelect.view model.formFields) - ] - - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/UiSettingsManage.elm b/modules/webapp/src/main/elm/Comp/UiSettingsManage.elm index 72e88acb..7cd87d50 100644 --- a/modules/webapp/src/main/elm/Comp/UiSettingsManage.elm +++ b/modules/webapp/src/main/elm/Comp/UiSettingsManage.elm @@ -3,7 +3,6 @@ module Comp.UiSettingsManage exposing , Msg(..) , init , update - , view , view2 ) @@ -113,7 +112,7 @@ update flags settings msg model = ---- View +--- View2 isError : Model -> Bool @@ -126,36 +125,6 @@ isSuccess model = Maybe.map .success model.message == Just True -view : Flags -> UiSettings -> String -> Model -> Html Msg -view flags settings classes model = - div [ class classes ] - [ Html.map UiSettingsFormMsg (Comp.UiSettingsForm.view flags settings model.formModel) - , div [ class "ui divider" ] [] - , button - [ class "ui primary button" - , onClick Submit - ] - [ text "Submit" - ] - , div - [ classList - [ ( "ui message", True ) - , ( "success", isSuccess model ) - , ( "error", isError model ) - , ( "hidden invisible", model.message == Nothing ) - ] - ] - [ Maybe.map .message model.message - |> Maybe.withDefault "" - |> text - ] - ] - - - ---- View2 - - view2 : Flags -> UiSettings -> String -> Model -> Html Msg view2 flags settings classes model = div [ class classes ] diff --git a/modules/webapp/src/main/elm/Comp/UserForm.elm b/modules/webapp/src/main/elm/Comp/UserForm.elm index d78ac417..a1b74aad 100644 --- a/modules/webapp/src/main/elm/Comp/UserForm.elm +++ b/modules/webapp/src/main/elm/Comp/UserForm.elm @@ -6,7 +6,6 @@ module Comp.UserForm exposing , isNewUser , isValid , update - , view , view2 ) @@ -164,61 +163,6 @@ update _ msg model = ---- View - - -view : UiSettings -> Model -> Html Msg -view settings model = - div [ class "ui form" ] - [ div - [ classList - [ ( "field", True ) - , ( "error", model.login == "" ) - , ( "invisible", model.user.login /= "" ) - ] - ] - [ label [] [ text "Login*" ] - , input - [ type_ "text" - , onInput SetLogin - , placeholder "Login" - , value model.login - ] - [] - ] - , div [ class "field" ] - [ label [] [ text "E-Mail" ] - , input - [ onInput SetEmail - , model.email |> Maybe.withDefault "" |> value - , placeholder "E-Mail" - ] - [] - ] - , div [ class "field" ] - [ label [] [ text "State" ] - , Html.map StateMsg (Comp.Dropdown.view settings model.state) - ] - , div - [ classList - [ ( "field", True ) - , ( "invisible", model.user.login /= "" ) - , ( "error", Util.Maybe.isEmpty model.password ) - ] - ] - [ label [] [ text "Password*" ] - , input - [ type_ "text" - , onInput SetPassword - , placeholder "Password" - , Maybe.withDefault "" model.password |> value - ] - [] - ] - ] - - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/UserManage.elm b/modules/webapp/src/main/elm/Comp/UserManage.elm index 9df978b8..f1f7ff1d 100644 --- a/modules/webapp/src/main/elm/Comp/UserManage.elm +++ b/modules/webapp/src/main/elm/Comp/UserManage.elm @@ -3,7 +3,6 @@ module Comp.UserManage exposing , Msg(..) , emptyModel , update - , view , view2 ) @@ -20,7 +19,7 @@ import Data.Flags exposing (Flags) import Data.UiSettings exposing (UiSettings) import Html exposing (..) import Html.Attributes exposing (..) -import Html.Events exposing (onClick, onSubmit) +import Html.Events exposing (onSubmit) import Http import Styles as S import Util.Http @@ -200,88 +199,6 @@ update flags msg model = ---- View - - -view : UiSettings -> Model -> Html Msg -view settings model = - if model.viewMode == Table then - viewTable model - - else - viewForm settings model - - -viewTable : Model -> Html Msg -viewTable model = - div [] - [ button [ class "ui basic button", onClick InitNewUser ] - [ i [ class "plus icon" ] [] - , text "Create new" - ] - , Html.map TableMsg (Comp.UserTable.view model.tableModel) - , div - [ classList - [ ( "ui dimmer", True ) - , ( "active", model.loading ) - ] - ] - [ div [ class "ui loader" ] [] - ] - ] - - -viewForm : UiSettings -> Model -> Html Msg -viewForm settings model = - let - newUser = - Comp.UserForm.isNewUser model.formModel - in - Html.form [ class "ui segment", onSubmit Submit ] - [ Html.map YesNoMsg (Comp.YesNoDimmer.view model.deleteConfirm) - , if newUser then - h3 [ class "ui dividing header" ] - [ text "Create new user" - ] - - else - h3 [ class "ui dividing header" ] - [ text ("Edit user: " ++ model.formModel.user.login) - ] - , Html.map FormMsg (Comp.UserForm.view settings model.formModel) - , div - [ classList - [ ( "ui error message", True ) - , ( "invisible", Util.Maybe.isEmpty model.formError ) - ] - ] - [ Maybe.withDefault "" model.formError |> text - ] - , div [ class "ui horizontal divider" ] [] - , button [ class "ui primary button", type_ "submit" ] - [ text "Submit" - ] - , a [ class "ui secondary button", onClick (SetViewMode Table), href "#" ] - [ text "Cancel" - ] - , if not newUser then - a [ class "ui right floated red button", href "#", onClick RequestDelete ] - [ text "Delete" ] - - else - span [] [] - , div - [ classList - [ ( "ui dimmer", True ) - , ( "active", model.loading ) - ] - ] - [ div [ class "ui loader" ] [] - ] - ] - - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/UserTable.elm b/modules/webapp/src/main/elm/Comp/UserTable.elm index c3505f4f..8a021de3 100644 --- a/modules/webapp/src/main/elm/Comp/UserTable.elm +++ b/modules/webapp/src/main/elm/Comp/UserTable.elm @@ -3,7 +3,6 @@ module Comp.UserTable exposing , Msg(..) , emptyModel , update - , view , view2 ) @@ -12,7 +11,6 @@ import Comp.Basic as B import Data.Flags exposing (Flags) import Html exposing (..) import Html.Attributes exposing (..) -import Html.Events exposing (onClick) import Styles as S import Util.Time exposing (formatDateTime) @@ -50,55 +48,6 @@ update _ msg model = ---- View - - -view : Model -> Html Msg -view model = - table [ class "ui selectable table" ] - [ thead [] - [ tr [] - [ th [ class "collapsing" ] [ text "Login" ] - , th [ class "collapsing" ] [ text "State" ] - , th [ class "collapsing" ] [ text "Email" ] - , th [ class "collapsing" ] [ text "Logins" ] - , th [ class "collapsing" ] [ text "Last Login" ] - , th [ class "collapsing" ] [ text "Created" ] - ] - ] - , tbody [] - (List.map (renderUserLine model) model.users) - ] - - -renderUserLine : Model -> User -> Html Msg -renderUserLine model user = - tr - [ classList [ ( "active", model.selected == Just user ) ] - , onClick (Select user) - ] - [ td [ class "collapsing" ] - [ text user.login - ] - , td [ class "collapsing" ] - [ text user.state - ] - , td [ class "collapsing" ] - [ Maybe.withDefault "" user.email |> text - ] - , td [ class "collapsing" ] - [ String.fromInt user.loginCount |> text - ] - , td [ class "collapsing" ] - [ Maybe.map formatDateTime user.lastLogin |> Maybe.withDefault "" |> text - ] - , td [ class "collapsing" ] - [ formatDateTime user.created |> text - ] - ] - - - --- View2 diff --git a/modules/webapp/src/main/elm/Comp/YesNoDimmer.elm b/modules/webapp/src/main/elm/Comp/YesNoDimmer.elm index 656cf9e6..e4006c49 100644 --- a/modules/webapp/src/main/elm/Comp/YesNoDimmer.elm +++ b/modules/webapp/src/main/elm/Comp/YesNoDimmer.elm @@ -10,8 +10,6 @@ module Comp.YesNoDimmer exposing , initActive , initInactive , update - , view - , view2 , viewN ) @@ -105,42 +103,8 @@ update msg model = ( { model | active = False }, True ) -view : Model -> Html Msg -view model = - view2 True defaultSettings model - -view2 : Bool -> Settings -> Model -> Html Msg -view2 active settings model = - div - [ classList - [ ( "ui dimmer", True ) - , ( settings.extraClass, True ) - , ( "active", active && model.active ) - ] - ] - [ div [ class "content" ] - [ h3 [ class settings.headerClass ] - [ if settings.headerIcon == "" then - span [] [] - - else - i [ class settings.headerIcon ] [] - , text settings.message - ] - ] - , div [ class "content" ] - [ div [ class "ui buttons" ] - [ a [ class "ui primary button", onClick ConfirmDelete, href "#" ] - [ text settings.confirmButton - ] - , div [ class "or" ] [] - , a [ class "ui secondary button", onClick Disable, href "#" ] - [ text settings.cancelButton - ] - ] - ] - ] +--- View2 viewN : Bool -> Settings -> Model -> Html Msg diff --git a/modules/webapp/src/main/elm/Data/Flags.elm b/modules/webapp/src/main/elm/Data/Flags.elm index aa94870b..74ec0c92 100644 --- a/modules/webapp/src/main/elm/Data/Flags.elm +++ b/modules/webapp/src/main/elm/Data/Flags.elm @@ -20,7 +20,6 @@ type alias Config = , maxPageSize : Int , maxNoteLength : Int , showClassificationSettings : Bool - , uiVersion : Int } diff --git a/modules/webapp/src/main/elm/Main.elm b/modules/webapp/src/main/elm/Main.elm index 4c9c73f4..9be17f90 100644 --- a/modules/webapp/src/main/elm/Main.elm +++ b/modules/webapp/src/main/elm/Main.elm @@ -3,7 +3,6 @@ module Main exposing (init, main) import Api import App.Data exposing (..) import App.Update exposing (..) -import App.View import App.View2 import Browser exposing (Document) import Browser.Navigation exposing (Key) @@ -74,12 +73,7 @@ viewDoc model = in { title = model.flags.config.appName ++ ": " ++ title , body = - if model.flags.config.uiVersion == 2 then - App.View2.view model - - else - [ App.View.view model - ] + App.View2.view model } diff --git a/modules/webapp/src/main/elm/Page/CollectiveSettings/View.elm b/modules/webapp/src/main/elm/Page/CollectiveSettings/View.elm deleted file mode 100644 index 2adca4c2..00000000 --- a/modules/webapp/src/main/elm/Page/CollectiveSettings/View.elm +++ /dev/null @@ -1,230 +0,0 @@ -module Page.CollectiveSettings.View exposing (view) - -import Api.Model.TagCount exposing (TagCount) -import Comp.CollectiveSettingsForm -import Comp.SourceManage -import Comp.UserManage -import Data.Flags exposing (Flags) -import Data.Icons as Icons -import Data.UiSettings exposing (UiSettings) -import Html exposing (..) -import Html.Attributes exposing (..) -import Html.Events exposing (onClick) -import Page.CollectiveSettings.Data exposing (..) -import Util.Html exposing (classActive) -import Util.Maybe -import Util.Size - - -view : Flags -> UiSettings -> Model -> Html Msg -view flags settings model = - div [ class "collectivesetting-page ui padded grid" ] - [ div [ class "sixteen wide mobile four wide tablet four wide computer column" ] - [ h4 [ class "ui top attached ablue-comp header" ] - [ text "Collective" - ] - , div [ class "ui attached fluid segment" ] - [ div [ class "ui fluid vertical secondary menu" ] - [ div - [ classActive (model.currentTab == Just InsightsTab) "link icon item" - , onClick (SetTab InsightsTab) - ] - [ i [ class "chart bar outline icon" ] [] - , text "Insights" - ] - , div - [ classActive (model.currentTab == Just SourceTab) "link icon item" - , onClick (SetTab SourceTab) - ] - [ Icons.sourceIcon "" - , text "Sources" - ] - , div - [ classActive (model.currentTab == Just SettingsTab) "link icon item" - , onClick (SetTab SettingsTab) - ] - [ i [ class "cog icon" ] [] - , text "Settings" - ] - , div - [ classActive (model.currentTab == Just UserTab) "link icon item" - , onClick (SetTab UserTab) - ] - [ i [ class "user icon" ] [] - , text "Users" - ] - ] - ] - ] - , div [ class "sixteen wide mobile twelve wide tablet twelve wide computer column" ] - [ div [ class "" ] - (case model.currentTab of - Just SourceTab -> - viewSources flags settings model - - Just UserTab -> - viewUsers settings model - - Just InsightsTab -> - viewInsights flags model - - Just SettingsTab -> - viewSettings flags settings model - - Nothing -> - [] - ) - ] - ] - - -viewInsights : Flags -> Model -> List (Html Msg) -viewInsights flags model = - let - ( coll, user ) = - Maybe.map (\a -> ( a.collective, a.user )) flags.account - |> Maybe.withDefault ( "", "" ) - in - [ h1 [ class "ui header" ] - [ i [ class "chart bar outline icon" ] [] - , div [ class "content" ] - [ text "Insights" - ] - ] - , h2 [ class "ui sub header" ] - [ div [ class "ui horizontal list" ] - [ div - [ class "item" - , title "Collective" - ] - [ i [ class "users circle icon" ] [] - , text coll - ] - , div - [ class "item" - , title "User" - ] - [ i [ class "user outline icon" ] [] - , text user - ] - ] - ] - , div [ class "ui basic blue segment" ] - [ h4 [ class "ui header" ] - [ text "Items" - ] - , div [ class "ui statistics" ] - [ div [ class "ui statistic" ] - [ div [ class "value" ] - [ String.fromInt (model.insights.incomingCount + model.insights.outgoingCount) |> text - ] - , div [ class "label" ] - [ text "Items" - ] - ] - , div [ class "ui statistic" ] - [ div [ class "value" ] - [ String.fromInt model.insights.incomingCount |> text - ] - , div [ class "label" ] - [ text "Incoming" - ] - ] - , div [ class "ui statistic" ] - [ div [ class "value" ] - [ String.fromInt model.insights.outgoingCount |> text - ] - , div [ class "label" ] - [ text "Outgoing" - ] - ] - ] - ] - , div [ class "ui basic blue segment" ] - [ h4 [ class "ui header" ] - [ text "Size" - ] - , div [ class "ui statistics" ] - [ div [ class "ui statistic" ] - [ div [ class "value" ] - [ toFloat model.insights.itemSize |> Util.Size.bytesReadable Util.Size.B |> text - ] - , div [ class "label" ] - [ text "Size" - ] - ] - ] - ] - , div [ class "ui basic blue segment" ] - [ h4 [ class "ui header" ] - [ text "Tags" - ] - , div [ class "ui statistics" ] - (List.map makeTagStats - (List.sortBy .count model.insights.tagCloud.items - |> List.reverse - ) - ) - ] - ] - - -makeTagStats : TagCount -> Html Msg -makeTagStats nc = - div [ class "ui statistic" ] - [ div [ class "value" ] - [ String.fromInt nc.count |> text - ] - , div [ class "label" ] - [ text nc.tag.name - ] - ] - - -viewSources : Flags -> UiSettings -> Model -> List (Html Msg) -viewSources flags settings model = - [ h2 [ class "ui header" ] - [ Icons.sourceIcon "" - , div [ class "content" ] - [ text "Sources" - ] - ] - , Html.map SourceMsg (Comp.SourceManage.view flags settings model.sourceModel) - ] - - -viewUsers : UiSettings -> Model -> List (Html Msg) -viewUsers settings model = - [ h2 [ class "ui header" ] - [ i [ class "ui user icon" ] [] - , div [ class "content" ] - [ text "Users" - ] - ] - , Html.map UserMsg (Comp.UserManage.view settings model.userModel) - ] - - -viewSettings : Flags -> UiSettings -> Model -> List (Html Msg) -viewSettings flags settings model = - [ h2 [ class "ui header" ] - [ i [ class "cog icon" ] [] - , text "Collective Settings" - ] - , div [ class "ui segment" ] - [ Html.map SettingsFormMsg - (Comp.CollectiveSettingsForm.view flags settings model.settingsModel) - ] - , div - [ classList - [ ( "ui message", True ) - , ( "hidden", Util.Maybe.isEmpty model.submitResult ) - , ( "success", Maybe.map .success model.submitResult |> Maybe.withDefault False ) - , ( "error", Maybe.map .success model.submitResult |> Maybe.map not |> Maybe.withDefault False ) - ] - ] - [ Maybe.map .message model.submitResult - |> Maybe.withDefault "" - |> text - ] - ] diff --git a/modules/webapp/src/main/elm/Page/Home/View.elm b/modules/webapp/src/main/elm/Page/Home/View.elm deleted file mode 100644 index c12a31c9..00000000 --- a/modules/webapp/src/main/elm/Page/Home/View.elm +++ /dev/null @@ -1,395 +0,0 @@ -module Page.Home.View exposing (view) - -import Api.Model.ItemSearch -import Comp.FixedDropdown -import Comp.ItemCardList -import Comp.ItemDetail.MultiEditMenu -import Comp.SearchMenu -import Comp.SearchStatsView -import Comp.YesNoDimmer -import Data.Flags exposing (Flags) -import Data.ItemSelection -import Data.UiSettings exposing (UiSettings) -import Html exposing (..) -import Html.Attributes exposing (..) -import Html.Events exposing (onClick, onInput) -import Page exposing (Page(..)) -import Page.Home.Data exposing (..) -import Set -import Util.Html - - -view : Flags -> UiSettings -> Model -> Html Msg -view flags settings model = - let - itemViewCfg = - case model.viewMode of - SelectView svm -> - Comp.ItemCardList.ViewConfig - model.scrollToCard - (Data.ItemSelection.Active svm.ids) - - _ -> - Comp.ItemCardList.ViewConfig - model.scrollToCard - Data.ItemSelection.Inactive - - selectAction = - case model.viewMode of - SelectView svm -> - svm.action - - _ -> - NoneAction - in - div [ class "home-page ui padded grid" ] - [ div - [ classList - [ ( "sixteen wide mobile six wide tablet four wide computer search-menu column" - , True - ) - , ( "invisible hidden", menuCollapsed model ) - ] - ] - [ div - [ class "ui ablue-comp icon menu" - ] - [ a - [ class "borderless item" - , href "#" - , onClick ToggleSearchMenu - , title "Hide menu" - ] - [ i [ class "chevron left icon" ] [] - ] - , div [ class "right floated menu" ] - [ a - [ classList - [ ( "borderless item", True ) - , ( "active", selectActive model ) - ] - , href "#" - , title "Toggle select items" - , onClick ToggleSelectView - ] - [ i [ class "tasks icon" ] [] - ] - , a - [ class "borderless item" - , onClick ResetSearch - , title "Reset form" - , href "#" - ] - [ i [ class "undo icon" ] [] - ] - , a - [ class "borderless item" - , onClick (DoSearch BasicSearch) - , title "Run search query" - , href "#" - , disabled model.searchInProgress - ] - [ i - [ classList - [ ( "search icon", not model.searchInProgress ) - , ( "loading spinner icon", model.searchInProgress ) - ] - ] - [] - ] - ] - ] - , div [ class "" ] - (viewLeftMenu flags settings model) - ] - , div - [ classList - [ ( "sixteen wide mobile ten wide tablet twelve wide computer column" - , not (menuCollapsed model) - ) - , ( "sixteen wide column", menuCollapsed model ) - , ( "item-card-list", True ) - ] - , id "item-card-list" - ] - (List.concat - [ viewBar flags model - , case model.viewMode of - SelectView svm -> - [ Html.map DeleteSelectedConfirmMsg - (Comp.YesNoDimmer.view2 (selectAction == DeleteSelected) - deleteAllDimmer - svm.deleteAllConfirm - ) - ] - - _ -> - [] - , viewStats flags settings model - , [ Html.map ItemCardListMsg - (Comp.ItemCardList.view itemViewCfg settings model.itemListModel) - ] - ] - ) - , div - [ classList - [ ( "sixteen wide column", True ) - , ( "hidden invisible", resultsBelowLimit settings model ) - ] - ] - [ div [ class "ui basic center aligned segment" ] - [ button - [ classList - [ ( "ui basic tiny button", True ) - , ( "disabled", not model.moreAvailable ) - ] - , disabled (not model.moreAvailable || model.moreInProgress || model.searchInProgress) - , title "Load more items" - , href "#" - , onClick LoadMore - ] - [ if model.moreInProgress then - i [ class "loading spinner icon" ] [] - - else - i [ class "angle double down icon" ] [] - , if model.moreAvailable then - text "Load more…" - - else - text "That's all" - ] - ] - ] - ] - - -viewStats : Flags -> UiSettings -> Model -> List (Html Msg) -viewStats _ settings model = - if settings.searchStatsVisible then - Comp.SearchStatsView.view model.searchStats - - else - [] - - -viewLeftMenu : Flags -> UiSettings -> Model -> List (Html Msg) -viewLeftMenu flags settings model = - let - searchMenu = - [ Html.map SearchMenuMsg - (Comp.SearchMenu.viewDrop model.dragDropData - flags - settings - model.searchMenuModel - ) - ] - in - case model.viewMode of - SelectView svm -> - case svm.action of - EditSelected -> - let - cfg_ = - Comp.ItemDetail.MultiEditMenu.defaultViewConfig - - cfg = - { cfg_ - | nameState = svm.saveNameState - , customFieldState = - \fId -> - if Set.member fId svm.saveCustomFieldState then - Comp.ItemDetail.MultiEditMenu.Saving - - else - Comp.ItemDetail.MultiEditMenu.SaveSuccess - } - in - [ div [ class "ui dividing header" ] - [ text "Multi-Edit" - ] - , div [ class "ui info message" ] - [ text "Note that a change here immediatly affects all selected items on the right!" - ] - , Html.map EditMenuMsg - (Comp.ItemDetail.MultiEditMenu.view cfg settings svm.editModel) - ] - - _ -> - searchMenu - - _ -> - searchMenu - - -viewBar : Flags -> Model -> List (Html Msg) -viewBar flags model = - case model.viewMode of - SimpleView -> - [ viewSearchBar flags model ] - - SearchView -> - [] - - SelectView svm -> - [ viewActionBar flags svm model ] - - -viewActionBar : Flags -> SelectViewModel -> Model -> Html Msg -viewActionBar _ svm _ = - let - selectCount = - Set.size svm.ids |> String.fromInt - in - div - [ class "ui ablue-comp icon menu" - ] - [ a - [ classList - [ ( "borderless item", True ) - , ( "active", svm.action == EditSelected ) - ] - , href "#" - , title <| "Edit " ++ selectCount ++ " selected items" - , onClick EditSelectedItems - ] - [ i [ class "ui edit icon" ] [] - ] - , a - [ classList - [ ( "borderless item", True ) - , ( "active", svm.action == DeleteSelected ) - ] - , href "#" - , title <| "Delete " ++ selectCount ++ " selected items" - , onClick RequestDeleteSelected - ] - [ i [ class "trash icon" ] [] - ] - , div [ class "right menu" ] - [ a - [ class "item" - , href "#" - , onClick SelectAllItems - , title "Select all" - ] - [ i [ class "check square outline icon" ] [] - ] - , a - [ class "borderless item" - , href "#" - , title "Select none" - , onClick SelectNoItems - ] - [ i [ class "square outline icon" ] [] - ] - , div [ class "borderless label item" ] - [ div [ class "ui circular purple icon label" ] - [ text selectCount - ] - ] - ] - ] - - -viewSearchBar : Flags -> Model -> Html Msg -viewSearchBar flags model = - let - searchTypeItem = - Comp.FixedDropdown.Item - model.searchTypeDropdownValue - (searchTypeString model.searchTypeDropdownValue) - - searchInput = - Comp.SearchMenu.textSearchString - model.searchMenuModel.textSearchModel - - searchTypeClass = - if flags.config.fullTextSearchEnabled then - "compact" - - else - "hidden invisible" - in - div - [ classList - [ ( "invisible hidden", not (menuCollapsed model) ) - , ( "ui secondary stackable menu container", True ) - ] - ] - [ a - [ classList - [ ( "search-menu-toggle ui icon button", True ) - - -- , ( "primary", not (searchMenuFilled model) ) - -- , ( "secondary", searchMenuFilled model ) - ] - , onClick ToggleSearchMenu - , href "#" - , title "Open search menu" - ] - [ i [ class "filter icon" ] [] - ] - , div [ class "right menu" ] - [ div [ class "fitted item" ] - [ div [ class "ui left icon right action input" ] - [ -- i - -- [ classList - -- [ ( "search link icon", not model.searchInProgress ) - -- , ( "loading spinner icon", model.searchInProgress ) - -- ] - -- , href "#" - -- , onClick (DoSearch model.searchTypeDropdownValue) - -- ] - -- (if hasMoreSearch model then - -- [ i [ class "icons search-corner-icons" ] - -- [ i [ class "tiny blue circle icon" ] [] - -- ] - -- ] - -- else - -- [] - -- ) - input - [ type_ "text" - , placeholder - (case model.searchTypeDropdownValue of - ContentOnlySearch -> - "Content search…" - - BasicSearch -> - "Search in names…" - ) - , onInput SetBasicSearch - , Util.Html.onKeyUpCode KeyUpSearchbarMsg - , Maybe.map value searchInput - |> Maybe.withDefault (value "") - ] - [] - , Html.map SearchTypeMsg - (Comp.FixedDropdown.viewStyled searchTypeClass - (Just searchTypeItem) - model.searchTypeDropdown - ) - , a - [ class "ui icon basic button" - , href "#" - , onClick ResetSearch - , title "Reset search form" - ] - [ i [ class "undo icon" ] [] - ] - ] - ] - ] - ] - - -deleteAllDimmer : Comp.YesNoDimmer.Settings -deleteAllDimmer = - { message = "Really delete all selected items?" - , headerIcon = "exclamation icon" - , headerClass = "ui inverted icon header" - , confirmButton = "Yes" - , cancelButton = "No" - , extraClass = "top aligned" - } diff --git a/modules/webapp/src/main/elm/Page/ItemDetail/View.elm b/modules/webapp/src/main/elm/Page/ItemDetail/View.elm deleted file mode 100644 index c00c2b94..00000000 --- a/modules/webapp/src/main/elm/Page/ItemDetail/View.elm +++ /dev/null @@ -1,15 +0,0 @@ -module Page.ItemDetail.View exposing (view) - -import Comp.ItemDetail -import Data.ItemNav exposing (ItemNav) -import Data.UiSettings exposing (UiSettings) -import Html exposing (..) -import Html.Attributes exposing (..) -import Page.ItemDetail.Data exposing (Model, Msg(..)) - - -view : ItemNav -> UiSettings -> Model -> Html Msg -view inav settings model = - div [ class "ui fluid container item-detail-page" ] - [ Html.map ItemDetailMsg (Comp.ItemDetail.view inav settings model.detail) - ] diff --git a/modules/webapp/src/main/elm/Page/Login/View.elm b/modules/webapp/src/main/elm/Page/Login/View.elm deleted file mode 100644 index 748c55d1..00000000 --- a/modules/webapp/src/main/elm/Page/Login/View.elm +++ /dev/null @@ -1,112 +0,0 @@ -module Page.Login.View exposing (view) - -import Data.Flags exposing (Flags) -import Html exposing (..) -import Html.Attributes exposing (..) -import Html.Events exposing (onCheck, onInput, onSubmit) -import Page exposing (Page(..)) -import Page.Login.Data exposing (..) - - -view : Flags -> Model -> Html Msg -view flags model = - div [ class "login-page" ] - [ div [ class "ui centered grid" ] - [ div [ class "row" ] - [ div [ class "sixteen wide mobile twelve wide tablet six wide computer column" ] - [ div [ class "ui segment login-view" ] - [ h1 [ class "ui center aligned icon header" ] - [ img - [ class "ui image" - , src (flags.config.docspellAssetPath ++ "/img/logo-96.png") - ] - [] - , div [ class "content" ] - [ text "Sign in to Docspell" - ] - ] - , Html.form - [ class "ui large error raised form segment" - , onSubmit Authenticate - , autocomplete False - ] - [ div [ class "field" ] - [ label [] [ text "Username" ] - , div [ class "ui left icon input" ] - [ input - [ type_ "text" - , autocomplete False - , onInput SetUsername - , value model.username - , placeholder "Collective / Login" - , autofocus True - ] - [] - , i [ class "user icon" ] [] - ] - ] - , div [ class "field" ] - [ label [] [ text "Password" ] - , div [ class "ui left icon input" ] - [ input - [ type_ "password" - , autocomplete False - , onInput SetPassword - , value model.password - , placeholder "Password" - ] - [] - , i [ class "lock icon" ] [] - ] - ] - , div [ class "field" ] - [ div [ class "ui checkbox" ] - [ input - [ type_ "checkbox" - , onCheck (\_ -> ToggleRememberMe) - , checked model.rememberMe - ] - [] - , label [] - [ text "Remember Me" - ] - ] - ] - , button - [ class "ui primary fluid button" - , type_ "submit" - ] - [ text "Login" - ] - ] - , resultMessage model - , div [ class "ui very basic right aligned segment" ] - [ text "No account? " - , a [ class "ui icon link", Page.href RegisterPage ] - [ i [ class "user circle outline icon" ] [] - , text "Sign up!" - ] - ] - ] - ] - ] - ] - ] - - -resultMessage : Model -> Html Msg -resultMessage model = - case model.result of - Just r -> - if r.success then - div [ class "ui success message" ] - [ text "Login successful." - ] - - else - div [ class "ui error message" ] - [ text r.message - ] - - Nothing -> - span [] [] diff --git a/modules/webapp/src/main/elm/Page/ManageData/View.elm b/modules/webapp/src/main/elm/Page/ManageData/View.elm deleted file mode 100644 index 2f3535b2..00000000 --- a/modules/webapp/src/main/elm/Page/ManageData/View.elm +++ /dev/null @@ -1,185 +0,0 @@ -module Page.ManageData.View exposing (view) - -import Comp.CustomFieldManage -import Comp.EquipmentManage -import Comp.FolderManage -import Comp.OrgManage -import Comp.PersonManage -import Comp.TagManage -import Data.Fields -import Data.Flags exposing (Flags) -import Data.Icons as Icons -import Data.UiSettings exposing (UiSettings) -import Html exposing (..) -import Html.Attributes exposing (..) -import Html.Events exposing (onClick) -import Page.ManageData.Data exposing (..) -import Util.Html exposing (classActive) - - -view : Flags -> UiSettings -> Model -> Html Msg -view flags settings model = - div [ class "managedata-page ui padded grid" ] - [ div [ class "sixteen wide mobile four wide tablet four wide computer column" ] - [ h4 [ class "ui top attached ablue-comp header" ] - [ text "Manage Data" - ] - , div [ class "ui attached fluid segment" ] - [ div [ class "ui fluid vertical secondary menu" ] - [ div - [ classActive (model.currentTab == Just TagTab) "link icon item" - , onClick (SetTab TagTab) - ] - [ Icons.tagIcon "" - , text "Tag" - ] - , div - [ classActive (model.currentTab == Just EquipTab) "link icon item" - , onClick (SetTab EquipTab) - ] - [ Icons.equipmentIcon "" - , text "Equipment" - ] - , div - [ classActive (model.currentTab == Just OrgTab) "link icon item" - , onClick (SetTab OrgTab) - ] - [ Icons.organizationIcon "" - , text "Organization" - ] - , div - [ classActive (model.currentTab == Just PersonTab) "link icon item" - , onClick (SetTab PersonTab) - ] - [ Icons.personIcon "" - , text "Person" - ] - , div - [ classActive (model.currentTab == Just FolderTab) "link icon item" - , classList - [ ( "invisible hidden" - , Data.UiSettings.fieldHidden settings Data.Fields.Folder - ) - ] - , onClick (SetTab FolderTab) - ] - [ Icons.folderIcon "" - , text "Folder" - ] - , div - [ classActive (model.currentTab == Just CustomFieldTab) "link icon item" - , classList - [ ( "invisible hidden" - , Data.UiSettings.fieldHidden settings Data.Fields.CustomFields - ) - ] - , onClick (SetTab CustomFieldTab) - ] - [ Icons.customFieldIcon "" - , text "Custom Fields" - ] - ] - ] - ] - , div [ class "sixteen wide mobile twelve wide tablet twelve wide computer column" ] - [ div [ class "" ] - (case model.currentTab of - Just TagTab -> - viewTags model - - Just EquipTab -> - viewEquip model - - Just OrgTab -> - viewOrg settings model - - Just PersonTab -> - viewPerson settings model - - Just FolderTab -> - viewFolder flags settings model - - Just CustomFieldTab -> - viewCustomFields flags settings model - - Nothing -> - [] - ) - ] - ] - - -viewCustomFields : Flags -> UiSettings -> Model -> List (Html Msg) -viewCustomFields flags _ model = - [ h2 [ class "ui header" ] - [ Icons.customFieldIcon "" - , div [ class "content" ] - [ text "Custom Fields" - ] - ] - , Html.map CustomFieldMsg (Comp.CustomFieldManage.view flags model.fieldManageModel) - ] - - -viewFolder : Flags -> UiSettings -> Model -> List (Html Msg) -viewFolder flags _ model = - [ h2 - [ class "ui header" - ] - [ Icons.folderIcon "" - , div - [ class "content" - ] - [ text "Folders" - ] - ] - , Html.map FolderMsg (Comp.FolderManage.view flags model.folderManageModel) - ] - - -viewTags : Model -> List (Html Msg) -viewTags model = - [ h2 [ class "ui header" ] - [ Icons.tagIcon "" - , div [ class "content" ] - [ text "Tags" - ] - ] - , Html.map TagManageMsg (Comp.TagManage.view model.tagManageModel) - ] - - -viewEquip : Model -> List (Html Msg) -viewEquip model = - [ h2 [ class "ui header" ] - [ Icons.equipmentIcon "" - , div [ class "content" ] - [ text "Equipment" - ] - ] - , Html.map EquipManageMsg (Comp.EquipmentManage.view model.equipManageModel) - ] - - -viewOrg : UiSettings -> Model -> List (Html Msg) -viewOrg settings model = - [ h2 [ class "ui header" ] - [ Icons.organizationIcon "" - , div [ class "content" ] - [ text "Organizations" - ] - ] - , Html.map OrgManageMsg (Comp.OrgManage.view settings model.orgManageModel) - ] - - -viewPerson : UiSettings -> Model -> List (Html Msg) -viewPerson settings model = - [ h2 [ class "ui header" ] - [ Icons.personIcon "" - , div [ class "content" ] - [ text "Person" - ] - ] - , Html.map PersonManageMsg (Comp.PersonManage.view settings model.personManageModel) - ] diff --git a/modules/webapp/src/main/elm/Page/NewInvite/View.elm b/modules/webapp/src/main/elm/Page/NewInvite/View.elm deleted file mode 100644 index e7bac68e..00000000 --- a/modules/webapp/src/main/elm/Page/NewInvite/View.elm +++ /dev/null @@ -1,114 +0,0 @@ -module Page.NewInvite.View exposing (view) - -import Data.Flags exposing (Flags) -import Html exposing (..) -import Html.Attributes exposing (..) -import Html.Events exposing (onClick, onInput, onSubmit) -import Page.NewInvite.Data exposing (..) - - -view : Flags -> Model -> Html Msg -view flags model = - div [ class "newinvite-page" ] - [ div [ class "ui centered grid" ] - [ div [ class "row" ] - [ div [ class "sixteen wide mobile fourteen wide tablet eight wide computer column" ] - [ h1 [ class "ui cener aligned icon header" ] - [ text "Create new invitations" - ] - , inviteMessage flags - , Html.form - [ classList - [ ( "ui large form raised segment", True ) - , ( "error", isFailed model.result ) - , ( "success", isSuccess model.result ) - ] - , onSubmit GenerateInvite - ] - [ div [ class "required field" ] - [ label [] [ text "New Invitation Password" ] - , div [ class "ui left icon input" ] - [ input - [ type_ "password" - , onInput SetPassword - , value model.password - , autofocus True - ] - [] - , i [ class "key icon" ] [] - ] - ] - , button - [ class "ui primary button" - , type_ "submit" - ] - [ text "Submit" - ] - , a [ class "ui right floated button", href "#", onClick Reset ] - [ text "Reset" - ] - , resultMessage model - ] - ] - ] - ] - ] - - -resultMessage : Model -> Html Msg -resultMessage model = - div - [ classList - [ ( "ui message", True ) - , ( "error", isFailed model.result ) - , ( "success", isSuccess model.result ) - , ( "hidden", model.result == Empty ) - ] - ] - [ case model.result of - Failed m -> - div [ class "content" ] - [ div [ class "header" ] [ text "Error" ] - , p [] [ text m ] - ] - - Success r -> - div [ class "content" ] - [ div [ class "header" ] [ text "Success" ] - , p [] [ text r.message ] - , p [] [ text "Invitation Key:" ] - , pre [] - [ Maybe.withDefault "" r.key |> text - ] - ] - - Empty -> - span [] [] - ] - - -inviteMessage : Flags -> Html Msg -inviteMessage flags = - div - [ classList - [ ( "ui message", True ) - , ( "hidden", flags.config.signupMode /= "invite" ) - ] - ] - [ p [] - [ text - """Docspell requires an invite when signing up. You can - create these invites here and send them to friends so - they can signup with docspell.""" - ] - , p [] - [ text - """Each invite can only be used once. You'll need to - create one key for each person you want to invite.""" - ] - , p [] - [ text - """Creating an invite requires providing the password - from the configuration.""" - ] - ] diff --git a/modules/webapp/src/main/elm/Page/Queue/View.elm b/modules/webapp/src/main/elm/Page/Queue/View.elm deleted file mode 100644 index c5d5a1e0..00000000 --- a/modules/webapp/src/main/elm/Page/Queue/View.elm +++ /dev/null @@ -1,282 +0,0 @@ -module Page.Queue.View exposing (view) - -import Api.Model.JobDetail exposing (JobDetail) -import Api.Model.JobLogEvent exposing (JobLogEvent) -import Comp.Progress -import Comp.YesNoDimmer -import Data.Priority -import Html exposing (..) -import Html.Attributes exposing (..) -import Html.Events exposing (onClick) -import Page.Queue.Data exposing (..) -import Util.Time exposing (formatDateTime, formatIsoDateTime) - - -view : Model -> Html Msg -view model = - div [ class "queue-page ui grid container" ] <| - List.concat - [ case model.showLog of - Just job -> - [ renderJobLog job ] - - Nothing -> - List.map (renderProgressCard model) model.state.progress - |> List.map (\el -> div [ class "row" ] [ div [ class "column" ] [ el ] ]) - , [ div [ class "two column row" ] - [ renderWaiting model - , renderCompleted model - ] - ] - ] - - -renderJobLog : JobDetail -> Html Msg -renderJobLog job = - div [ class "ui fluid card" ] - [ div [ class "content" ] - [ i [ class "delete link icon", onClick QuitShowLog ] [] - , text job.name - ] - , div [ class "content" ] - [ div [ class "job-log" ] - (List.map renderLogLine job.logs) - ] - ] - - -renderWaiting : Model -> Html Msg -renderWaiting model = - div [ class "column" ] - [ div [ class "ui center aligned basic segment" ] - [ i [ class "ui large angle double up icon" ] [] - ] - , div [ class "ui centered cards" ] - (List.map (renderInfoCard model) model.state.queued) - ] - - -renderCompleted : Model -> Html Msg -renderCompleted model = - div [ class "column" ] - [ div [ class "ui center aligned basic segment" ] - [ i [ class "ui large angle double down icon" ] [] - ] - , div [ class "ui centered cards" ] - (List.map (renderInfoCard model) model.state.completed) - ] - - -renderProgressCard : Model -> JobDetail -> Html Msg -renderProgressCard model job = - div [ class "ui fluid card" ] - [ Comp.Progress.topAttachedIndicating job.progress - , Html.map (DimmerMsg job) (Comp.YesNoDimmer.view2 (model.cancelJobRequest == Just job.id) dimmerSettings model.deleteConfirm) - , div [ class "content" ] - [ div [ class "right floated meta" ] - [ div [ class "ui label" ] - [ text job.state - , div [ class "detail" ] - [ Maybe.withDefault "" job.worker |> text - ] - ] - , div [ class "ui basic label" ] - [ i [ class "clock icon" ] [] - , div [ class "detail" ] - [ getDuration model job |> Maybe.withDefault "-:-" |> text - ] - ] - ] - , i [ class "asterisk loading icon" ] [] - , text job.name - ] - , div [ class "content" ] - [ div [ class "job-log" ] - (List.map renderLogLine job.logs) - ] - , div [ class "meta" ] - [ div [ class "right floated" ] - [ button [ class "ui button", onClick (RequestCancelJob job) ] - [ text "Cancel" - ] - ] - ] - ] - - -renderLogLine : JobLogEvent -> Html Msg -renderLogLine log = - span [ class (String.toLower log.level) ] - [ formatIsoDateTime log.time |> text - , text ": " - , text log.message - , br [] [] - ] - - -isFinal : JobDetail -> Bool -isFinal job = - case job.state of - "failed" -> - True - - "success" -> - True - - "cancelled" -> - True - - _ -> - False - - -dimmerSettings : Comp.YesNoDimmer.Settings -dimmerSettings = - let - defaults = - Comp.YesNoDimmer.defaultSettings - in - { defaults | headerClass = "ui inverted header", headerIcon = "", message = "Cancel/Delete this job?" } - - -renderInfoCard : Model -> JobDetail -> Html Msg -renderInfoCard model job = - let - prio = - Data.Priority.fromString job.priority - |> Maybe.withDefault Data.Priority.Low - in - div - [ classList - [ ( "ui fluid card", True ) - , ( jobStateColor job, True ) - ] - ] - [ Html.map (DimmerMsg job) (Comp.YesNoDimmer.view2 (model.cancelJobRequest == Just job.id) dimmerSettings model.deleteConfirm) - , div [ class "content" ] - [ div [ class "right floated" ] - [ if isFinal job || job.state == "stuck" then - span [ onClick (ShowLog job) ] - [ i [ class "file link icon", title "Show log" ] [] - ] - - else - span [] [] - , i [ class "delete link icon", title "Remove", onClick (RequestCancelJob job) ] [] - ] - , if isFinal job then - span [ class "invisible" ] [] - - else - div [ class "right floated" ] - [ div [ class "meta" ] - [ getDuration model job |> Maybe.withDefault "-:-" |> text - ] - ] - , i - [ classList - [ ( "check icon", job.state == "success" ) - , ( "redo icon", job.state == "stuck" ) - , ( "bolt icon", job.state == "failed" ) - , ( "meh outline icon", job.state == "canceled" ) - , ( "cog icon", not (isFinal job) && job.state /= "stuck" ) - ] - ] - [] - , text job.name - ] - , div [ class "content" ] - [ div [ class "right floated" ] - [ if isFinal job then - div [ class ("ui basic label " ++ jobStateColor job) ] - [ i [ class "clock icon" ] [] - , div [ class "detail" ] - [ getDuration model job |> Maybe.withDefault "-:-" |> text - ] - ] - - else - span [ class "invisible" ] [] - , div [ class ("ui basic label " ++ jobStateColor job) ] - [ text "Retries" - , div [ class "detail" ] - [ job.retries |> String.fromInt |> text - ] - ] - , case job.state of - "waiting" -> - a - [ class ("ui basic label " ++ jobStateColor job) - , onClick (ChangePrio job.id (Data.Priority.next prio)) - , href "#" - , title "Change priority of this job" - ] - [ i [ class "sort numeric up icon" ] [] - , text "Prio" - , div [ class "detail" ] - [ code [] - [ Data.Priority.fromString job.priority - |> Maybe.map Data.Priority.toName - |> Maybe.withDefault job.priority - |> text - ] - ] - ] - - _ -> - div - [ class ("ui basic label " ++ jobStateColor job) - ] - [ text "Prio" - , div [ class "detail" ] - [ code [] - [ Data.Priority.fromString job.priority - |> Maybe.map Data.Priority.toName - |> Maybe.withDefault job.priority - |> text - ] - ] - ] - ] - , jobStateLabel job - , div [ class "ui basic label" ] - [ Util.Time.formatDateTime job.submitted |> text - ] - ] - ] - - -jobStateColor : JobDetail -> String -jobStateColor job = - case job.state of - "success" -> - "green" - - "failed" -> - "red" - - "canceled" -> - "orange" - - "stuck" -> - "purple" - - "scheduled" -> - "blue" - - "waiting" -> - "grey" - - _ -> - "" - - -jobStateLabel : JobDetail -> Html Msg -jobStateLabel job = - let - col = - jobStateColor job - in - div [ class ("ui label " ++ col) ] - [ text job.state - ] diff --git a/modules/webapp/src/main/elm/Page/Register/View.elm b/modules/webapp/src/main/elm/Page/Register/View.elm deleted file mode 100644 index 933dc978..00000000 --- a/modules/webapp/src/main/elm/Page/Register/View.elm +++ /dev/null @@ -1,166 +0,0 @@ -module Page.Register.View exposing (view) - -import Data.Flags exposing (Flags) -import Html exposing (..) -import Html.Attributes exposing (..) -import Html.Events exposing (onClick, onInput, onSubmit) -import Page exposing (Page(..)) -import Page.Register.Data exposing (..) - - -view : Flags -> Model -> Html Msg -view flags model = - div [ class "register-page" ] - [ div [ class "ui centered grid" ] - [ div [ class "row" ] - [ div [ class "sixteen wide mobile twelve wide tablet six wide computer column" ] - [ div [ class "ui segment register-view" ] - [ h1 [ class "ui cener aligned icon header" ] - [ img - [ class "ui image" - , src (flags.config.docspellAssetPath ++ "/img/logo-96.png") - ] - [] - , div [ class "content" ] - [ text "Sign up @ Docspell" - ] - ] - , Html.form - [ class "ui large error form raised segment" - , onSubmit RegisterSubmit - , autocomplete False - ] - [ div [ class "required field" ] - [ label [] [ text "Collective ID" ] - , div [ class "ui left icon input" ] - [ input - [ type_ "text" - , autocomplete False - , onInput SetCollId - , value model.collId - , autofocus True - ] - [] - , i [ class "users icon" ] [] - ] - ] - , div [ class "required field" ] - [ label [] [ text "User Login" ] - , div [ class "ui left icon input" ] - [ input - [ type_ "text" - , autocomplete False - , onInput SetLogin - , value model.login - ] - [] - , i [ class "user icon" ] [] - ] - ] - , div - [ class "required field" - ] - [ label [] [ text "Password" ] - , div [ class "ui left icon action input" ] - [ input - [ type_ <| - if model.showPass1 then - "text" - - else - "password" - , autocomplete False - , onInput SetPass1 - , value model.pass1 - ] - [] - , i [ class "lock icon" ] [] - , button [ class "ui icon button", onClick ToggleShowPass1 ] - [ i [ class "eye icon" ] [] - ] - ] - ] - , div - [ class "required field" - ] - [ label [] [ text "Password (repeat)" ] - , div [ class "ui left icon action input" ] - [ input - [ type_ <| - if model.showPass2 then - "text" - - else - "password" - , autocomplete False - , onInput SetPass2 - , value model.pass2 - ] - [] - , i [ class "lock icon" ] [] - , button [ class "ui icon button", onClick ToggleShowPass2 ] - [ i [ class "eye icon" ] [] - ] - ] - ] - , div - [ classList - [ ( "field", True ) - , ( "invisible", flags.config.signupMode /= "invite" ) - ] - ] - [ label [] [ text "Invitation Key" ] - , div [ class "ui left icon input" ] - [ input - [ type_ "text" - , autocomplete False - , onInput SetInvite - , model.invite |> Maybe.withDefault "" |> value - ] - [] - , i [ class "key icon" ] [] - ] - ] - , button - [ class "ui primary button" - , type_ "submit" - ] - [ text "Submit" - ] - ] - , resultMessage model - , div [ class "ui very basic right aligned segment" ] - [ text "Already signed up? " - , a [ class "ui link", Page.href (LoginPage Nothing) ] - [ i [ class "sign in icon" ] [] - , text "Sign in" - ] - ] - ] - ] - ] - ] - ] - - -resultMessage : Model -> Html Msg -resultMessage model = - case model.result of - Just r -> - if r.success then - div [ class "ui success message" ] - [ text "Registration successful." - ] - - else - div [ class "ui error message" ] - [ text r.message - ] - - Nothing -> - if List.isEmpty model.errorMsg then - span [ class "invisible" ] [] - - else - div [ class "ui error message" ] - (List.map (\s -> div [] [ text s ]) model.errorMsg) diff --git a/modules/webapp/src/main/elm/Page/Upload/View.elm b/modules/webapp/src/main/elm/Page/Upload/View.elm deleted file mode 100644 index be5f5883..00000000 --- a/modules/webapp/src/main/elm/Page/Upload/View.elm +++ /dev/null @@ -1,252 +0,0 @@ -module Page.Upload.View exposing (view) - -import Comp.Dropzone -import Comp.FixedDropdown -import Comp.Progress -import Dict -import File exposing (File) -import Html exposing (..) -import Html.Attributes exposing (..) -import Html.Events exposing (onCheck, onClick) -import Page exposing (Page(..)) -import Page.Upload.Data exposing (..) -import Util.File exposing (makeFileId) -import Util.Maybe -import Util.Size - - -view : Maybe String -> Model -> Html Msg -view mid model = - div [ class "upload-page ui grid container" ] - [ div [ class "row" ] - [ div [ class "sixteen wide column" ] - [ div [ class "ui top attached segment" ] - [ renderForm model - ] - , Html.map DropzoneMsg (Comp.Dropzone.view dropzoneSettings model.dropzone) - , div [ class "ui bottom attached segment" ] - [ a [ class "ui primary button", href "#", onClick SubmitUpload ] - [ text "Submit" - ] - , a [ class "ui secondary button", href "#", onClick Clear ] - [ text "Reset" - ] - ] - ] - ] - , if isDone model && hasErrors model then - renderErrorMsg model - - else - span [ class "invisible" ] [] - , if List.isEmpty model.files then - span [] [] - - else if isSuccessAll model then - renderSuccessMsg (Util.Maybe.nonEmpty mid) model - - else - renderUploads model - ] - - -dropzoneSettings : Comp.Dropzone.Settings -dropzoneSettings = - let - ds = - Comp.Dropzone.defaultSettings - in - { ds - | classList = - \m -> - [ ( "ui attached blue placeholder segment dropzone", True ) - , ( "dragging", m.hover ) - , ( "disabled", not m.active ) - ] - } - - -renderErrorMsg : Model -> Html Msg -renderErrorMsg _ = - div [ class "row" ] - [ div [ class "sixteen wide column" ] - [ div [ class "ui large error message" ] - [ h3 [ class "ui header" ] - [ i [ class "meh outline icon" ] [] - , text "Some files failed to upload" - ] - , text "There were errors uploading some files." - ] - ] - ] - - -renderSuccessMsg : Bool -> Model -> Html Msg -renderSuccessMsg public _ = - div [ class "row" ] - [ div [ class "sixteen wide column" ] - [ div [ class "ui large success message" ] - [ h3 [ class "ui header" ] - [ i [ class "smile outline icon" ] [] - , text "All files uploaded" - ] - , if public then - p [] [] - - else - p [] - [ text "Your files have been successfully uploaded. They are now being processed. Check the " - , a [ class "ui link", Page.href HomePage ] - [ text "Items page" - ] - , text " later where the files will arrive eventually. Or go to the " - , a [ class "ui link", Page.href QueuePage ] - [ text "Processing Page" - ] - , text " to view the current processing state." - ] - , p [] - [ text "Click " - , a [ class "ui link", href "#", onClick Clear ] - [ text "Reset" - ] - , text " to upload more files." - ] - ] - ] - ] - - -renderUploads : Model -> Html Msg -renderUploads model = - div [ class "row" ] - [ div [ class "sixteen wide column" ] - [ div [ class "ui basic segment" ] - [ h2 [ class "ui header" ] - [ text "Selected Files" - ] - , div [ class "ui items" ] <| - if model.singleItem then - List.map (renderFileItem model (Just uploadAllTracker)) model.files - - else - List.map (renderFileItem model Nothing) model.files - ] - ] - ] - - -getProgress : Model -> File -> Int -getProgress model file = - let - key = - if model.singleItem then - uploadAllTracker - - else - makeFileId file - in - Dict.get key model.loading - |> Maybe.withDefault 0 - - -renderFileItem : Model -> Maybe String -> File -> Html Msg -renderFileItem model mtracker file = - let - name = - File.name file - - size = - File.size file - |> toFloat - |> Util.Size.bytesReadable Util.Size.B - in - div [ class "item" ] - [ i - [ classList - [ ( "large", True ) - , ( "file outline icon", isIdle model file ) - , ( "loading spinner icon", isLoading model file ) - , ( "green check icon", isCompleted model file ) - , ( "red bolt icon", isError model file ) - ] - ] - [] - , div [ class "middle aligned content" ] - [ div [ class "header" ] - [ text name - ] - , div [ class "right floated meta" ] - [ text size - ] - , div [ class "description" ] - [ Comp.Progress.smallIndicating (getProgress model file) - ] - ] - ] - - -renderForm : Model -> Html Msg -renderForm model = - div [ class "row" ] - [ Html.form [ class "ui form" ] - [ div [ class "grouped fields" ] - [ div [ class "field" ] - [ div [ class "ui radio checkbox" ] - [ input - [ type_ "radio" - , checked model.incoming - , onCheck (\_ -> ToggleIncoming) - ] - [] - , label [] [ text "Incoming" ] - ] - ] - , div [ class "field" ] - [ div [ class "ui radio checkbox" ] - [ input - [ type_ "radio" - , checked (not model.incoming) - , onCheck (\_ -> ToggleIncoming) - ] - [] - , label [] [ text "Outgoing" ] - ] - ] - ] - , div [ class "inline field" ] - [ div [ class "ui checkbox" ] - [ input - [ type_ "checkbox" - , checked model.singleItem - , onCheck (\_ -> ToggleSingleItem) - ] - [] - , label [] [ text "All files are one single item" ] - ] - ] - , div [ class "inline field" ] - [ div [ class "ui checkbox" ] - [ input - [ type_ "checkbox" - , checked model.skipDuplicates - , onCheck (\_ -> ToggleSkipDuplicates) - ] - [] - , label [] [ text "Skip files already present in docspell" ] - ] - ] - , div [ class "inline field" ] - [ label [] [ text "Language:" ] - , Html.map LanguageMsg - (Comp.FixedDropdown.view - (Maybe.map mkLanguageItem model.language) - model.languageModel - ) - , div [ class "small-info" ] - [ text "Used for text extraction and analysis. The collective's " - , text "default language is used if not specified here." - ] - ] - ] - ] diff --git a/modules/webapp/src/main/elm/Page/UserSettings/View.elm b/modules/webapp/src/main/elm/Page/UserSettings/View.elm deleted file mode 100644 index c8adb9da..00000000 --- a/modules/webapp/src/main/elm/Page/UserSettings/View.elm +++ /dev/null @@ -1,185 +0,0 @@ -module Page.UserSettings.View exposing (view) - -import Comp.ChangePasswordForm -import Comp.EmailSettingsManage -import Comp.ImapSettingsManage -import Comp.NotificationManage -import Comp.ScanMailboxManage -import Comp.UiSettingsManage -import Data.Flags exposing (Flags) -import Data.UiSettings exposing (UiSettings) -import Html exposing (..) -import Html.Attributes exposing (..) -import Html.Events exposing (onClick) -import Page.UserSettings.Data exposing (..) -import Util.Html exposing (classActive) - - -view : Flags -> UiSettings -> Model -> Html Msg -view flags settings model = - div [ class "usersetting-page ui padded grid" ] - [ div [ class "sixteen wide mobile four wide tablet four wide computer column" ] - [ h4 [ class "ui top attached ablue-comp header" ] - [ text "User Settings" - ] - , div [ class "ui attached fluid segment" ] - [ div [ class "ui fluid vertical secondary menu" ] - [ makeTab model ChangePassTab "Change Password" "user secret icon" - , makeTab model EmailSettingsTab "E-Mail Settings (SMTP)" "mail icon" - , makeTab model ImapSettingsTab "E-Mail Settings (IMAP)" "mail icon" - , makeTab model NotificationTab "Notification Task" "bullhorn icon" - , makeTab model ScanMailboxTab "Scan Mailbox Task" "envelope open outline icon" - , makeTab model UiSettingsTab "UI Settings" "cog icon" - ] - ] - ] - , div [ class "sixteen wide mobile twelve wide tablet twelve wide computer column" ] - [ div [ class "" ] - (case model.currentTab of - Just ChangePassTab -> - viewChangePassword model - - Just EmailSettingsTab -> - viewEmailSettings settings model - - Just NotificationTab -> - viewNotificationManage settings model - - Just ImapSettingsTab -> - viewImapSettings settings model - - Just ScanMailboxTab -> - viewScanMailboxManage settings model - - Just UiSettingsTab -> - viewUiSettings flags settings model - - Nothing -> - [] - ) - ] - ] - - -makeTab : Model -> Tab -> String -> String -> Html Msg -makeTab model tab header icon = - a - [ classActive (model.currentTab == Just tab) "link icon item" - , onClick (SetTab tab) - , href "#" - ] - [ i [ class icon ] [] - , text header - ] - - -viewUiSettings : Flags -> UiSettings -> Model -> List (Html Msg) -viewUiSettings flags settings model = - [ h2 [ class "ui header" ] - [ i [ class "cog icon" ] [] - , text "UI Settings" - ] - , p [] - [ text "These settings only affect the web ui. They are stored in the browser, " - , text "so they are separated between browsers and devices." - ] - , Html.map UiSettingsMsg - (Comp.UiSettingsManage.view - flags - settings - "ui segment" - model.uiSettingsModel - ) - ] - - -viewEmailSettings : UiSettings -> Model -> List (Html Msg) -viewEmailSettings settings model = - [ h2 [ class "ui header" ] - [ i [ class "mail icon" ] [] - , div [ class "content" ] - [ text "E-Mail Settings (Smtp)" - ] - ] - , Html.map EmailSettingsMsg (Comp.EmailSettingsManage.view settings model.emailSettingsModel) - ] - - -viewImapSettings : UiSettings -> Model -> List (Html Msg) -viewImapSettings settings model = - [ h2 [ class "ui header" ] - [ i [ class "mail icon" ] [] - , div [ class "content" ] - [ text "E-Mail Settings (Imap)" - ] - ] - , Html.map ImapSettingsMsg (Comp.ImapSettingsManage.view settings model.imapSettingsModel) - ] - - -viewChangePassword : Model -> List (Html Msg) -viewChangePassword model = - [ h2 [ class "ui header" ] - [ i [ class "ui user secret icon" ] [] - , div [ class "content" ] - [ text "Change Password" - ] - ] - , Html.map ChangePassMsg (Comp.ChangePasswordForm.view model.changePassModel) - ] - - -viewNotificationManage : UiSettings -> Model -> List (Html Msg) -viewNotificationManage settings model = - [ h2 [ class "ui header" ] - [ i [ class "ui bullhorn icon" ] [] - , div [ class "content" ] - [ text "Notification" - ] - ] - , p [] - [ text """ - Docspell can notify you once the due dates of your items - come closer. Notification is done via e-mail. You need to - provide a connection in your e-mail settings.""" - ] - , p [] - [ text "Docspell finds all items that are due in " - , em [] [ text "Remind Days" ] - , text " days and sends this list via e-mail." - ] - , Html.map NotificationMsg - (Comp.NotificationManage.view settings model.notificationModel) - ] - - -viewScanMailboxManage : UiSettings -> Model -> List (Html Msg) -viewScanMailboxManage settings model = - [ h2 [ class "ui header" ] - [ i [ class "ui envelope open outline icon" ] [] - , div [ class "content" ] - [ text "Scan Mailbox" - ] - ] - , p [] - [ text "Docspell can scan folders of your mailbox to import your mails. " - , text "You need to provide a connection in " - , text "your e-mail (imap) settings." - ] - , p [] - [ text """ - Docspell goes through all configured folders and imports - mails matching the search criteria. Mails are skipped if - they were imported in a previous run and the corresponding - items still exist. After submitting a mail into docspell, - you can choose to move it to another folder, to delete it - or to just leave it there. In the latter case you should - adjust the schedule to avoid reading over the same mails - again.""" - ] - , Html.map ScanMailboxMsg - (Comp.ScanMailboxManage.view - settings - model.scanMailboxModel - ) - ] From 64e3cb04f30d15fc4214906b57a8549fde3090b4 Mon Sep 17 00:00:00 2001 From: Eike Kettner Date: Tue, 9 Mar 2021 20:31:03 +0100 Subject: [PATCH 2/3] Remove fomantic ui and ui-header handling --- .../docspell/restserver/webapp/Flags.scala | 8 +-- .../restserver/webapp/TemplateRoutes.scala | 56 ++++--------------- project/Dependencies.scala | 2 - 3 files changed, 13 insertions(+), 53 deletions(-) diff --git a/modules/restserver/src/main/scala/docspell/restserver/webapp/Flags.scala b/modules/restserver/src/main/scala/docspell/restserver/webapp/Flags.scala index bcd041d3..3966445e 100644 --- a/modules/restserver/src/main/scala/docspell/restserver/webapp/Flags.scala +++ b/modules/restserver/src/main/scala/docspell/restserver/webapp/Flags.scala @@ -18,12 +18,11 @@ case class Flags( fullTextSearchEnabled: Boolean, maxPageSize: Int, maxNoteLength: Int, - showClassificationSettings: Boolean, - uiVersion: Int + showClassificationSettings: Boolean ) object Flags { - def apply(cfg: Config, uiVersion: Int): Flags = + def apply(cfg: Config): Flags = Flags( cfg.appName, getBaseUrl(cfg), @@ -33,8 +32,7 @@ object Flags { cfg.fullTextSearch.enabled, cfg.maxItemPageSize, cfg.maxNoteLength, - cfg.showClassificationSettings, - uiVersion + cfg.showClassificationSettings ) private def getBaseUrl(cfg: Config): String = diff --git a/modules/restserver/src/main/scala/docspell/restserver/webapp/TemplateRoutes.scala b/modules/restserver/src/main/scala/docspell/restserver/webapp/TemplateRoutes.scala index 9d59c201..f13dd4be 100644 --- a/modules/restserver/src/main/scala/docspell/restserver/webapp/TemplateRoutes.scala +++ b/modules/restserver/src/main/scala/docspell/restserver/webapp/TemplateRoutes.scala @@ -14,8 +14,6 @@ import org.http4s.HttpRoutes import org.http4s._ import org.http4s.dsl.Http4sDsl import org.http4s.headers._ -import org.http4s.util.CaseInsensitiveString -import org.http4s.util.Writer import org.log4s._ import yamusca.implicits._ import yamusca.imports._ @@ -26,32 +24,6 @@ object TemplateRoutes { val `text/html` = new MediaType("text", "html") val `application/javascript` = new MediaType("application", "javascript") - val ui2Header = CaseInsensitiveString("Docspell-Ui2") - - case class UiVersion(version: Int) extends Header.Parsed { - val key = UiVersion - def renderValue(writer: Writer): writer.type = - writer.append(version) - } - object UiVersion extends HeaderKey.Singleton { - val default = UiVersion(2) - - def get[F[_]](req: Request[F]): UiVersion = - req.headers.get(UiVersion).getOrElse(UiVersion.default) - - type HeaderT = UiVersion - val name = CaseInsensitiveString("Docspell-Ui") - override def parse(s: String): ParseResult[UiVersion] = - Either - .catchNonFatal(s.trim.toInt) - .leftMap(ex => ParseFailure("Invalid int header", ex.getMessage)) - .map(UiVersion.apply) - - override def matchHeader(h: Header): Option[UiVersion] = - if (h.name == name) parse(h.value).toOption - else None - } - trait InnerRoutes[F[_]] { def doc: HttpRoutes[F] def app: HttpRoutes[F] @@ -81,24 +53,22 @@ object TemplateRoutes { } yield resp } def app = - HttpRoutes.of[F] { case req @ GET -> _ => + HttpRoutes.of[F] { case GET -> _ => for { templ <- indexTemplate - uiv = UiVersion.get(req).version resp <- Ok( - IndexData(cfg, uiv).render(templ), + IndexData(cfg).render(templ), `Content-Type`(`text/html`, Charset.`UTF-8`) ) } yield resp } def serviceWorker = - HttpRoutes.of[F] { case req @ GET -> _ => + HttpRoutes.of[F] { case GET -> _ => for { templ <- swTemplate - uiv = UiVersion.get(req).version resp <- Ok( - IndexData(cfg, uiv).render(templ), + IndexData(cfg).render(templ), `Content-Type`(`application/javascript`, Charset.`UTF-8`) ) } yield resp @@ -164,10 +134,10 @@ object TemplateRoutes { object IndexData { - def apply(cfg: Config, uiVersion: Int): IndexData = + def apply(cfg: Config): IndexData = IndexData( - Flags(cfg, uiVersion), - chooseUi(uiVersion), + Flags(cfg), + chooseUi, Seq( "/app/assets" + Webjars.clipboardjs + "/clipboard.min.js", s"/app/assets/docspell-webapp/${BuildInfo.version}/docspell-app.js", @@ -175,17 +145,11 @@ object TemplateRoutes { ), s"/app/assets/docspell-webapp/${BuildInfo.version}/favicon", s"/app/assets/docspell-webapp/${BuildInfo.version}/docspell.js", - Flags(cfg, uiVersion).asJson.spaces2 + Flags(cfg).asJson.spaces2 ) - private def chooseUi(uiVersion: Int): Seq[String] = - if (uiVersion == 2) - Seq(s"/app/assets/docspell-webapp/${BuildInfo.version}/css/styles.css") - else - Seq( - "/app/assets" + Webjars.fomanticslimdefault + "/semantic.min.css", - s"/app/assets/docspell-webapp/${BuildInfo.version}/docspell.css" - ) + private def chooseUi: Seq[String] = + Seq(s"/app/assets/docspell-webapp/${BuildInfo.version}/css/styles.css") implicit def yamuscaValueConverter: ValueConverter[IndexData] = ValueConverter.deriveConverter[IndexData] diff --git a/project/Dependencies.scala b/project/Dependencies.scala index e964d621..9d2e6a25 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -40,7 +40,6 @@ object Dependencies { val TikaVersion = "1.25" val YamuscaVersion = "0.8.0" val SwaggerUIVersion = "3.44.0" - val FomanticUIVersion = "2.8.7-3" val TwelveMonkeysVersion = "3.6.4" val JQueryVersion = "3.5.1" val ViewerJSVersion = "0.5.8" @@ -282,7 +281,6 @@ object Dependencies { val webjars = Seq( "org.webjars" % "swagger-ui" % SwaggerUIVersion, - "com.github.eikek" % "fomantic-slim-default" % FomanticUIVersion, "org.webjars" % "viewerjs" % ViewerJSVersion, "org.webjars" % "clipboard.js" % ClipboardJsVersion ) From 4ca68ebca4bf795af02eb0189fd53f516edc1271 Mon Sep 17 00:00:00 2001 From: Eike Kettner Date: Tue, 9 Mar 2021 20:47:16 +0100 Subject: [PATCH 3/3] Fix link in contribution.md --- Changelog.md | 3 ++- Contributing.md | 5 +---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Changelog.md b/Changelog.md index 2ed5727a..e93dc17f 100644 --- a/Changelog.md +++ b/Changelog.md @@ -4,7 +4,8 @@ *Feb 19, 2021* -This release comes with a completely new ui, including a dark theme! +This release comes with a completely new ui based on +[tailwindcss](https://tailwindcss.com), including a dark theme! Additionally there are some other minor features and bug fixes. - New Web-UI with light and dark theme (#293). diff --git a/Contributing.md b/Contributing.md index 58cb5376..40d71929 100644 --- a/Contributing.md +++ b/Contributing.md @@ -61,10 +61,7 @@ processes. The web frontend is written in [Elm](https://elm-lang.org), which is a nice functional language that compiles to javascript. The frontend is included in the http/restserver component. The CSS is provided by -[Fomantic-UI](https://fomantic-ui.com/), where a [custom -build](https://github.com/eikek/fomantic-slim-default) of it is used -to avoid dependency to a google font and jquery (all javascript -modules are removed). +[TailwindCSS](https://tailwindcss.com/).. The [development](https://docspell.org/docs/dev/building/) page contains some tips to get started.