@@ -14,14 +14,16 @@ import Data.Functor
1414import Data.Generics.Product
1515import Data.Generics.Sum
1616import Data.List (deleteFirstsBy)
17+import qualified Data.List as L
1718import Data.Map as M
1819import Data.Monoid
19−import Data.Text as T (Text, intercalate)
20+import qualified Data.Text as T
2021import Prelude as P
2122import Reflex.Dom as R
2223
2324import Common.Types
2425import Common.Utils
26+import Data.Text (Text)
2527import Frontend.API
2628import Frontend.Utils
2729import Servant.Reflex
@@ -139,21 +141,21 @@ envVarsInput overridesHeader evs = do
139141 elClass "div" "deployment__widget" $
140142 elClass "div" "overrides" $ mdo
141143 let
142− initEnvs = fromList $ zip [0..] evs
144+ initEnvs = L.foldl' (\m v -> fst $ insertUniq v m) emptyUniqKeyMap evs
143145 emptyVar = Override "" "" Public
144− addEv = clickEv $> Endo (\envs -> P.length envs =: emptyVar <> envs)
146+ addEv = clickEv $> Endo (fst . insertUniq emptyVar)
145147 envsDyn <- foldDyn appEndo initEnvs $ leftmost [ addEv, updEv ]
146− (_, updEv) <- runEventWriterT $ listWithKey envsDyn envVarInput
147− let addDisabledDyn = all ( (/= "") . overrideKey ) . M.elems <$> envsDyn
148+ (_, updEv) <- runEventWriterT $ listWithKey (uniqMap <$> envsDyn) envVarInput
149+ let addingIsEnabled = all ( (not . T.null) . overrideKey ) . elemsUniq <$> envsDyn
148150 clickEv <- buttonClassEnabled'
149− "overrides__add dash dash--add" "Add an override" addDisabledDyn
151+ "overrides__add dash dash--add" "Add an override" addingIsEnabled
150152 "dash--disabled"
151− pure $ elems <$> envsDyn
153+ pure $ elemsUniq <$> envsDyn
152154
153155-- | Widget for entering a key-value pair. The updated overrides list is
154156-- written to the 'EventWriter'.
155157envVarInput
156− :: (EventWriter t (Endo (Map Int Override)) m, MonadWidget t m)
158+ :: (EventWriter t (Endo (UniqKeyMap Override)) m, MonadWidget t m)
157159 => Int -- ^ Index of variable in overrides list.
158160 -> Dynamic t Override -- ^ Current variable key and value.
159161 -> m ()
@@ -167,6 +169,26 @@ envVarInput ix epDyn = do
167169 closeEv <- buttonClass "overrides__delete spot spot--cancel" "Delete"
168170 let
169171 envEv = updated $ zipDynWith (\k v -> Override k v Public) keyDyn valDyn
170− deleteEv = Endo (M.delete ix) <$ closeEv
171− updEv = Endo . flip update ix . const . Just <$> envEv
172+ deleteEv = Endo (deleteUniq ix) <$ closeEv
173+ updEv = Endo . updateUniq ix . const <$> envEv
172174 tellEvent $ leftmost [deleteEv, updEv]
175+
176+data UniqKeyMap v = UniqKeyMap (Map Int v) (Int)
177+
178+uniqMap :: UniqKeyMap v -> Map Int v
179+uniqMap (UniqKeyMap m _) = m
180+
181+insertUniq :: v -> UniqKeyMap v -> (UniqKeyMap v, Int)
182+insertUniq v (UniqKeyMap m x) = (UniqKeyMap (M.insert x v m) (x + 1), x)
183+
184+deleteUniq :: Int -> UniqKeyMap v -> UniqKeyMap v
185+deleteUniq k (UniqKeyMap m x) = UniqKeyMap (M.delete k m) x
186+
187+updateUniq :: Int -> (v -> v) -> UniqKeyMap v -> UniqKeyMap v
188+updateUniq k f (UniqKeyMap m x) = UniqKeyMap (M.adjust f k m) x
189+
190+elemsUniq :: UniqKeyMap v -> [v]
191+elemsUniq (UniqKeyMap m _) = M.elems m
192+
193+emptyUniqKeyMap :: UniqKeyMap v
194+emptyUniqKeyMap = UniqKeyMap mempty 0