Persist project across pages.
[?]
Jan 25, 2021, 12:47 AM
B4MTB6UOH5VPZQ7KDQ23TZSR3CIFGVGVBEFL26LMFAQ5RL7CXPRQCDependencies
- [2]
QAC2QJ32Add project overview page to client. - [3]
2J37EVJMCheck for an open interval on project switch. - [4]
SAESJLLYInitial experiments in hash routing. - [5]
IR75ZMX3Return actual events for interval ends, not just timestamps. - [6]
OUR4PAOTUse local dates for display of intervals. - [7]
WRPIYG3EUse project listing functionality to check for whether we have a cookie. - [8]
JXG3FCXYUpgrade ps + halogen versions. - [9]
J6S23MDGUse server timestamps for interval start and end. - [10]
NJNMO72SAdd zcash.com submodule and update client to modern halogen. - [11]
ZIG57EE6Fix project selection, end log end on project switch. - [12]
QU5FW67RAdd project selection to time tracker. - [13]
QMEYU4MWAdd display for prior intervals. - [14]
RSF6UAJKBreak out api module for timeline. - [15]
PT4276XCAdd logout functionality. - [16]
BFZN4SUAMake timeline component work. - [*]
RB2ETNIFAdd skeletal PureScript client project.
Change contents
- replacement in client/src/Aftok/Overview.purs at line 18
import Data.Foldable (any)import Data.Foldable (all) - replacement in client/src/Aftok/Overview.purs at line 126
[HH.slot _projectList unit (Project.projectListComponent system pcaps) unit (Just <<< ProjectSelected)][HH.slot _projectList unit (Project.projectListComponent system pcaps) st.selectedProject (Just <<< ProjectSelected)] - replacement in client/src/Aftok/Overview.purs at line 145
when (any (\p' -> (unwrap p').projectId /= (unwrap p).projectId) currentProject) $ dowhen (all (\p' -> (unwrap p').projectId /= (unwrap p).projectId) currentProject) $ do - replacement in client/src/Aftok/Project.purs at line 14
import Data.Maybe (Maybe(..))import Data.Foldable (any)import Data.Maybe (Maybe(..), isNothing) - edit in client/src/Aftok/Project.purs at line 40
type ProjectInput = Maybe Project - replacement in client/src/Aftok/Project.purs at line 43
{ projects :: Array Project{ selectedProject :: Maybe Project, projects :: Array Project - replacement in client/src/Aftok/Project.purs at line 62
-> H.Component HH.HTML query input Project m-> H.Component HH.HTML query ProjectInput Project m - replacement in client/src/Aftok/Project.purs at line 72
initialState :: input -> ProjectCStateinitialState _ = { projects: [] }initialState :: ProjectInput -> ProjectCStateinitialState input = { selectedProject: input, projects: [] } - replacement in client/src/Aftok/Project.purs at line 77
let renderOption (Project' p) =HH.option [P.value $ pidStr p.projectId] [HH.text p.projectName]in HH.div[P.classes (ClassName <$> ["form-group"])][HH.label[ P.classes (ClassName <$> ["sr-only"]), P.for "projectSelect"][ HH.text "Project" ],HH.select[P.classes (ClassName <$> ["form-control"]),P.id_ "projectSelect",E.onSelectedIndexChange (Just <<< Select)]([HH.option [P.selected true, P.disabled true] [HH.text "Select a project"]] <> map renderOption st.projects)]HH.div[P.classes (ClassName <$> ["form-group"])][ HH.label[ P.classes (ClassName <$> ["sr-only"]), P.for "projectSelect"][ HH.text "Project" ], HH.select[P.classes (ClassName <$> ["form-control"]),P.id_ "projectSelect",E.onSelectedIndexChange (Just <<< Select)]( [HH.option [P.selected (isNothing st.selectedProject), P.disabled true] [HH.text "Select a project"]]<> map renderOption st.projects)]whererenderOption (Project' p) =HH.option[ P.selected (any (\(Project' p') -> p'.projectId == p.projectId) st.selectedProject), P.value $ pidStr p.projectId][HH.text p.projectName] - edit in client/src/Aftok/Timeline.purs at line 95
type TimelineInput = Maybe Project - replacement in client/src/Aftok/Timeline.purs at line 129
:: forall query input m:: forall query m - replacement in client/src/Aftok/Timeline.purs at line 134
-> H.Component HH.HTML query input ProjectEvent m-> H.Component HH.HTML query TimelineInput ProjectEvent m - replacement in client/src/Aftok/Timeline.purs at line 143
initialState :: input -> TimelineStateinitialState _ ={ selectedProject: NothinginitialState :: TimelineInput -> TimelineStateinitialState input ={ selectedProject: input - replacement in client/src/Aftok/Timeline.purs at line 164
[HH.slot _projectList unit (Project.projectListComponent system pcaps) unit (Just <<< ProjectSelected)][HH.slot _projectList unit (Project.projectListComponent system pcaps) st.selectedProject (Just <<< ProjectSelected)] - edit in client/src/Aftok/Timeline.purs at line 191
currentProject <- H.gets (_.selectedProject)traverse_ setStateForProject currentProject - edit in client/src/Aftok/Timeline.purs at line 200
H.raise (ProjectChange p) - replacement in client/src/Aftok/Timeline.purs at line 202[3.916]→[3.1825:2085](∅→∅),[3.1825]→[3.1825:2085](∅→∅),[3.2085]→[3.917:1001](∅→∅),[3.1001]→[3.2156:2215](∅→∅),[3.2156]→[3.2156:2215](∅→∅),[3.2215]→[3.6869:6922](∅→∅)
timeSpan <- TL.Before <$> lift system.nowDateTime -- FIXME, should come from a form controlintervals' <- lift $ caps.listIntervals (unwrap p).projectId timeSpanintervals <- lift $ case intervals' ofLeft err ->(system.log $ "Error occurred listing intervals" <> show err ) *>pure []Right ivals ->pure $ map (map LoggedEvent) ivalsH.raise (ProjectChange p)setStateForProject p - edit in client/src/Aftok/Timeline.purs at line 205[3.1139]→[3.2377:2601](∅→∅),[3.2377]→[3.2377:2601](∅→∅),[3.2601]→[3.1140:1499](∅→∅),[3.1499]→[3.6923:7078](∅→∅),[3.7078]→[3.1619:1761](∅→∅),[3.1619]→[3.1619:1761](∅→∅),[3.1761]→[3.7079:7172](∅→∅),[3.7172]→[3.1822:1963](∅→∅),[3.1822]→[3.1822:1963](∅→∅),[3.802]→[3.5264:5265](∅→∅),[3.1963]→[3.5264:5265](∅→∅),[3.2670]→[3.5264:5265](∅→∅),[3.5920]→[3.5264:5265](∅→∅),[3.5264]→[3.5264:5265](∅→∅),[3.5265]→[3.1964:2051](∅→∅)
history' <- lift <<< runMaybeT $ toHistory system intervalshist <- case history' ofNothing -> lift $ system.log "Project history was empty." *> pure M.emptyJust h -> pure hlatestEventResponse <- lift $ caps.getLatestEvent (unwrap p).projectIdnow <- lift $ system.nowactive <- lift $ case latestEventResponse ofLeft err ->(system.log $ "Error occurred retrieving the latest event: " <> show err) *>pure NothingRight latestEvent -> dolet activeInterval :: TL.KeyedEvent Instant -> m (Maybe (Interval TimelineEvent))activeInterval ev = case event ev ofTL.StartEvent i ->(system.log $ "Project has an open active interval starting " <> show i) *>(Just <<< interval (LoggedEvent ev) <<< PhantomEvent <$> system.now)TL.StopEvent _ ->pure Nothingjoin <$> traverse activeInterval latestEventH.modify_ (_ { selectedProject = Just p, history = hist, active = active }) - edit in client/src/Aftok/Timeline.purs at line 238
setStateForProject :: Project -> H.HalogenM TimelineState TimelineAction Slots ProjectEvent m UnitsetStateForProject p = dotimeSpan <- TL.Before <$> lift system.nowDateTime -- FIXME, should come from a form controlintervals' <- lift $ caps.listIntervals (unwrap p).projectId timeSpanintervals <- lift $ case intervals' ofLeft err ->(system.log $ "Error occurred listing intervals" <> show err ) *>pure []Right ivals ->pure $ map (map LoggedEvent) ivalshistory' <- lift <<< runMaybeT $ toHistory system intervalshist <- case history' ofNothing -> lift $ system.log "Project history was empty." *> pure M.emptyJust h -> pure h - edit in client/src/Aftok/Timeline.purs at line 255
latestEventResponse <- lift $ caps.getLatestEvent (unwrap p).projectIdnow <- lift $ system.nowactive <- lift $ case latestEventResponse ofLeft err ->(system.log $ "Error occurred retrieving the latest event: " <> show err) *>pure NothingRight latestEvent -> dolet activeInterval :: TL.KeyedEvent Instant -> m (Maybe (Interval TimelineEvent))activeInterval ev = case event ev ofTL.StartEvent i ->(system.log $ "Project has an open active interval starting " <> show i) *>(Just <<< interval (LoggedEvent ev) <<< PhantomEvent <$> system.now)TL.StopEvent _ ->pure Nothingjoin <$> traverse activeInterval latestEventH.modify_ (_ { selectedProject = Just p, history = hist, active = active }) - replacement in client/src/Main.purs at line 147
HH.div_withNavBar $ HH.div_ - replacement in client/src/Main.purs at line 152
[ HH.slot _timeline unit (Timeline.component system tlCap pCap) unit (Just <<< ProjectAction) ][ HH.slot _timeline unit (Timeline.component system tlCap pCap) st.selectedProject (Just <<< ProjectAction) ]