@@ -39,6 +39,7 @@ import Page.ClassicPopup
3939import Page.Elements.Links
4040import Page.Popup.EditDeployment
4141import Page.Popup.NewDeployment
42+import Reflex.Dom.Renderable
4243import Reflex.MultiEventWriter.Class
4344import Servant.Reflex.Extra
4445
@@ -88,9 +89,10 @@ deploymentsWidget updAllEv dfis = do
8889 <$ errUpdEv
8990 , DPMClear <$ okUpdEv
9091 ]
91− (showNewDeploymentEv', termDyn) <- deploymentsHeadWidget True okUpdEv
92+ (showNewDeploymentEv', termDyn') <- deploymentsHeadWidget True okUpdEv
93+ termDyn <- debounceDyn 0.3 termDyn'
9294 (okUpdEv, errUpdEv, editEv) <- deploymentsListWidget hReq updAllEv termDyn dfis
93− pure (showNewDeploymentEv', editEv)
95+ pure (showNewDeploymentEv', deSearch <$> editEv)
9496 void $ newDeploymentPopup showNewDeploymentEv never
9597 void $ editDeploymentPopup editEv never
9698
@@ -179,58 +181,24 @@ deploymentsListWidget ::
179181 Dynamic t Text ->
180182 -- | Initial deployment data
181183 [DeploymentFullInfo] ->
182− m (Event t (), Event t (), Event t DeploymentFullInfo)
184+ m (Event t (), Event t (), Event t SearchedDeploymentInfo)
183185deploymentsListWidget hReq updAllEv termDyn ds = dataWidgetWrapper $ mdo
184186 retryEv <- delay 10 errUpdEv
185187 updRespEv <- listEndpoint $ leftmost [updAllEv, () <$ retryEv]
186188 let okUpdEv = fmapMaybe reqSuccess updRespEv
187189 errUpdEv = fmapMaybe reqErrorBody updRespEv
188190 dsDyn <- holdDyn ds okUpdEv
189− let isArchived = isDeploymentArchived . view #deployment
190− filteredDyn = ffor2 termDyn dsDyn $ \term ds' ->
191− mapMaybe (searchDeployments . T.filter (not . isSpace) $ term) ds'
191+ let searchedDyn = ffor2 termDyn dsDyn $ \term ds' ->
192+ searchMany (T.filter (not . isSpace) term) ds'
192193 (archivedDsDyn, activeDsDyn) =
193− splitDynPure $
194− L.partition isArchived
195− <$> filteredDyn
196− searchSorting = termDyn $> Just (SortDesc (view #score))
194+ splitDynPure $ L.partition isDeploymentArchived <$> searchedDyn
195+ searchSorting = termDyn $> Nothing
197196 clickedEv <- elementClick
198197 editEv <- activeDeploymentsWidget hReq searchSorting clickedEv activeDsDyn
199198 archivedDeploymentsWidget hReq searchSorting clickedEv archivedDsDyn
200199 pure (() <$ okUpdEv, () <$ errUpdEv, editEv)
201200
202−data SearchedDeploymentFullInfo = SearchedDeploymentFullInfo
203− { deployment :: DeploymentFullInfo
204− , searchResult :: DeploymentSearchResult
205− , score :: Int
206− }
207− deriving stock (Generic, Show, Eq)
208−
209−-- | Compares deployment fields (name and tag) with a search term.
210−searchDeployments ::
211− -- | Search term.
212− Text ->
213− -- | Deployment data.
214− DeploymentFullInfo ->
215− Maybe SearchedDeploymentFullInfo
216−searchDeployments term d = case (tagResult, nameResult) of
217− (Nothing, Nothing) -> Nothing
218− (Just (res, score), Nothing) ->
219− Just $ SearchedDeploymentFullInfo d (DeploymentTagResult res) score
220− (Nothing, Just (res, score)) ->
221− Just $ SearchedDeploymentFullInfo d (DeploymentNameResult res) score
222− (Just (tRes, tScore), Just (nRes, nScore)) ->
223− if tScore > nScore
224− then Just $ SearchedDeploymentFullInfo d (DeploymentTagResult tRes) tScore
225− else Just $ SearchedDeploymentFullInfo d (DeploymentNameResult nRes) nScore
226− where
227− tagResult = fuzzySearch term . unDeploymentTag $ d ^. field @"deployment" . field @"tag"
228− nameResult = fuzzySearch term . unDeploymentName $ d ^. dfiName
229−
230−data DeploymentSearchResult
231− = DeploymentNameResult [FuzzySearchStringChunk Text]
232− | DeploymentTagResult [FuzzySearchStringChunk Text]
233− deriving stock (Show, Eq)
201+type SearchedDeploymentInfo = DeploymentFullInfo' SearchResult
234202
235203-- | Table with active deployments.
236204activeDeploymentsWidget ::
@@ -239,19 +207,18 @@ activeDeploymentsWidget ::
239207 , MonadReader ProjectConfig m
240208 ) =>
241209 RequestErrorHandler t m ->
242− Dynamic t (Maybe (SortDir SearchedDeploymentFullInfo)) ->
210+ Dynamic t (Maybe (SortDir DeploymentFullInfo)) ->
243211 -- | Event that carries the clicked DOM element. This event is required by
244212 -- `dropdownWidget'`.
245213 Event t ClickedElement ->
246− Dynamic t [SearchedDeploymentFullInfo] ->
214+ Dynamic t [SearchedDeploymentInfo] ->
247215 -- | Returns an event carrying editable deployment
248216 -- to \"edit deployment\" sidebar.
249− m (Event t DeploymentFullInfo)
217+ m (Event t SearchedDeploymentInfo)
250218activeDeploymentsWidget hReq searchSorting clickedEv dsDyn =
251219 divClass "data__primary" $
252220 tableWrapper (updated searchSorting $> SortingChanged) $ \sortDyn -> do
253− let colSortDyn = fmap (contramap (view #deployment)) <$> sortDyn
254− sorting <- holdDyn Nothing (mergeWith (<|>) [updated colSortDyn, updated searchSorting])
221+ sorting <- holdDyn Nothing (mergeWith (<|>) [updated sortDyn, updated searchSorting])
255222 let emptyDyn' = L.null <$> dsDyn
256223 dsSortedDyn = zipDynWith sortDeployments dsDyn sorting
257224 emptyDyn <- holdUniqDyn emptyDyn'
@@ -262,7 +229,7 @@ activeDeploymentsWidget hReq searchSorting clickedEv dsDyn =
262229 editEvs <- simpleList dsSortedDyn (activeDeploymentWidget hReq clickedEv)
263230 pure $ switchDyn $ leftmost <$> editEvs
264231 True -> do
265− emptyTableBody $ noDeploymentsWidget
232+ emptyTableBody noDeploymentsWidget
266233 pure never
267234 switchHold never editEvEv
268235
@@ -283,28 +250,27 @@ activeDeploymentWidget ::
283250 -- | Event that carries the clicked DOM element. This event is required by
284251 -- `dropdownWidget'`.
285252 Event t ClickedElement ->
286− Dynamic t SearchedDeploymentFullInfo ->
253+ Dynamic t SearchedDeploymentInfo ->
287254 -- | Returns event carrying editable deployment
288255 -- that is required by \"edit deployment\" sidebar.
289− m (Event t DeploymentFullInfo)
256+ m (Event t SearchedDeploymentInfo)
290257activeDeploymentWidget hReq clickedEv dDyn' = do
291258 dDyn <- holdUniqDyn dDyn'
292259 editEvEv <- dyn $
293− ffor dDyn $ \s@SearchedDeploymentFullInfo {deployment = d@DeploymentFullInfo {..}} -> do
294− let (name, tag') = displaySearchHighlighting s
295− dName = deployment ^. #name
260+ ffor dDyn $ \d@DeploymentFullInfo {..} -> do
261+ let desearchedDeployment = deSearch d
262+ dName = desearchedDeployment ^. #deployment . #name
296263 (linkEl, dropdownEv) <- el' "tr" $ do
297264 el "td" $ do
298− name
265+ rndr . unDeploymentName $ d ^. #deployment . #name
299266 statusWidget $ constDyn status
300267 el "td" $
301268 divClass "listing" $
302269 forM_ (unDeploymentMetadata metadata) (renderMetadataLink . pure)
303− el "td" tag'
304270 el "td" $
305− deploymentOverridesWidget hReq (deployment ^. field @"deploymentOverrides" . coerced)
271+ deploymentOverridesWidgetSearched hReq (deployment ^. field @"deploymentOverrides" . coerced)
306272 el "td" $
307− applicationOverridesWidget
273+ applicationOverridesWidgetSearched
308274 hReq
309275 (deployment ^. field @"deploymentOverrides" . coerced)
310276 (deployment ^. field @"appOverrides" . coerced)
@@ -314,13 +280,11 @@ activeDeploymentWidget hReq clickedEv dDyn' = do
314280 text $ formatPosixToDate updatedAt
315281 el "td" $ do
316282 let enabled = not . isPending . recordedStatus $ status
317− elId = "deployment_row_" <> unDeploymentName dName
318283 btn =
319284 elAttr
320285 "button"
321286 ( "class" =: "drop__handler"
322287 <> "type" =: "button"
323− <> "id" =: elId
324288 )
325289 $ text "Actions"
326290 body = do
@@ -336,7 +300,7 @@ activeDeploymentWidget hReq clickedEv dDyn' = do
336300 & #buttonText .~~ "Move to archive"
337301 & #buttonEnabled .~~ pure enabled
338302 & #buttonType .~~ Just ArchiveActionButtonType
339− url' <- kubeDashboardUrl (view #deployment <$> dDyn)
303+ url' <- kubeDashboardUrl (pure desearchedDeployment)
340304 void . dyn $
341305 url'
342306 <&> maybe
@@ -366,24 +330,6 @@ activeDeploymentWidget hReq clickedEv dDyn' = do
366330 pure editEv
367331 switchHold never editEvEv
368332
369−displaySearchHighlighting :: DomBuilder t m => SearchedDeploymentFullInfo -> (m (), m ())
370−displaySearchHighlighting
371− SearchedDeploymentFullInfo {searchResult = DeploymentNameResult res, deployment = d} =
372− ( markMatches res
373− , text . unDeploymentTag $ d ^. #deployment . #tag
374− )
375−displaySearchHighlighting
376− SearchedDeploymentFullInfo {searchResult = DeploymentTagResult res, deployment = d} =
377− ( text . unDeploymentName $ d ^. #deployment . #name
378− , markMatches res
379− )
380−
381−markMatches :: DomBuilder t m => [FuzzySearchStringChunk Text] -> m ()
382−markMatches [] = blank
383−markMatches (NotMatched x : xs) = text x >> markMatches xs
384−markMatches (Matched x : xs) =
385− elAttr "span" ("style" =: "text-decoration: underline;") (text x) >> markMatches xs
386−
387333-- | Table with archived deployments.
388334archivedDeploymentsWidget ::
389335 forall t m.
@@ -391,11 +337,11 @@ archivedDeploymentsWidget ::
391337 , SetRoute t (R Routes) m
392338 ) =>
393339 RequestErrorHandler t m ->
394− Dynamic t (Maybe (SortDir SearchedDeploymentFullInfo)) ->
340+ Dynamic t (Maybe (SortDir DeploymentFullInfo)) ->
395341 -- | Event that carries the clicked DOM element. This event is required by
396342 -- `dropdownWidget'`.
397343 Event t ClickedElement ->
398− Dynamic t [SearchedDeploymentFullInfo] ->
344+ Dynamic t [SearchedDeploymentInfo] ->
399345 m ()
400346archivedDeploymentsWidget hReq searchSorting clickedEv dsDyn = do
401347 showDyn <- toggleButton
@@ -404,8 +350,7 @@ archivedDeploymentsWidget hReq searchSorting clickedEv dsDyn = do
404350 False -> "data__archive"
405351 elDynClass "div" classDyn $
406352 tableWrapper (updated searchSorting $> SortingChanged) $ \sortDyn -> do
407− let colSortDyn = fmap (contramap (view #deployment)) <$> sortDyn
408− sorting <- holdDyn Nothing (mergeWith (<|>) [updated colSortDyn, updated searchSorting])
353+ sorting <- holdDyn Nothing (mergeWith (<|>) [updated sortDyn, updated searchSorting])
409354 let emptyDyn' = L.null <$> dsDyn
410355 dsSortedDyn = zipDynWith sortDeployments dsDyn sorting
411356 emptyDyn <- holdUniqDyn emptyDyn'
@@ -416,7 +361,7 @@ archivedDeploymentsWidget hReq searchSorting clickedEv dsDyn = do
416361 simpleList
417362 dsSortedDyn
418363 (archivedDeploymentWidget hReq clickedEv)
419− True -> emptyTableBody $ noDeploymentsWidget
364+ True -> emptyTableBody noDeploymentsWidget
420365
421366-- | Row with archived deployment.
422367archivedDeploymentWidget ::
@@ -425,24 +370,23 @@ archivedDeploymentWidget ::
425370 ) =>
426371 RequestErrorHandler t m ->
427372 Event t ClickedElement ->
428− Dynamic t SearchedDeploymentFullInfo ->
373+ Dynamic t SearchedDeploymentInfo ->
429374 m ()
430375archivedDeploymentWidget hReq clickedEv dDyn' = do
431376 dDyn <- holdUniqDyn dDyn'
432377 dyn_ $
433− ffor dDyn $ \s@SearchedDeploymentFullInfo {deployment = DeploymentFullInfo {..}} -> do
434− let (name, tag') = displaySearchHighlighting s
435− dName = deployment ^. #name
378+ ffor dDyn $ \d@DeploymentFullInfo {..} -> do
379+ let desearchedDeployment = deSearch d
380+ dName = desearchedDeployment ^. #deployment . #name
436381 (linkEl, _) <- el' "tr" $ do
437382 el "td" $ do
438− name
383+ rndr . unDeploymentName $ deployment ^. #name
439384 divClass "status status--archived" $ text "Archived"
440385 el "td" $ text "..."
441− el "td" tag'
442386 el "td" $
443− deploymentOverridesWidget hReq (deployment ^. field @"deploymentOverrides" . coerced)
387+ deploymentOverridesWidgetSearched hReq (deployment ^. field @"deploymentOverrides" . coerced)
444388 el "td" $
445− applicationOverridesWidget
389+ applicationOverridesWidgetSearched
446390 hReq
447391 (deployment ^. field @"deploymentOverrides" . coerced)
448392 (deployment ^. field @"appOverrides" . coerced)
@@ -451,13 +395,11 @@ archivedDeploymentWidget hReq clickedEv dDyn' = do
451395 el "td" $
452396 text $ formatPosixToDate updatedAt
453397 el "td" $ do
454− let elId = "deployment_row_" <> (unDeploymentName dName)
455− btn =
398+ let btn =
456399 elAttr
457400 "button"
458401 ( "class" =: "drop__handler"
459402 <> "type" =: "button"
460− <> "id" =: elId
461403 )
462404 $ text "Actions"
463405 body =
@@ -473,16 +415,16 @@ archivedDeploymentWidget hReq clickedEv dDyn' = do
473415
474416-- | Sort deployments by the supplied condition.
475417sortDeployments ::
476− [SearchedDeploymentFullInfo] ->
418+ [SearchedDeploymentInfo] ->
477419 -- | Sorting condition.
478− Maybe (SortDir SearchedDeploymentFullInfo) ->
479− [SearchedDeploymentFullInfo]
480−sortDeployments items s = L.sortBy sortFunc items
420+ Maybe (SortDir DeploymentFullInfo) ->
421+ [SearchedDeploymentInfo]
422+sortDeployments items Nothing = items
423+sortDeployments items (Just (contramap deSearch -> s)) = L.sortBy sortFunc items
481424 where
482425 sortFunc a b = case s of
483− Just (SortAsc get) -> compare (get a) (get b)
484− Just (SortDesc get) -> compare (get b) (get a)
485− Nothing -> EQ
426+ (SortAsc get) -> compare (get a) (get b)
427+ (SortDesc get) -> compare (get b) (get a)
486428
487429-- | Each constructor contains a getter
488430-- that extracts the field that is used for sorting.
@@ -509,7 +451,6 @@ tableHeader = do
509451 el "tr" $ do
510452 sortHeader (view dfiName) "Name" SortAsc
511453 el "th" $ text "Links"
512− el "th" $ text "Tag"
513454 el "th" $ text "Deployment overrides"
514455 el "th" $ text "App overrides"
515456 sortHeader (view $ field @"createdAt") "Created" SortDesc