Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
aviaviavi committed Sep 27, 2018
1 parent 6a5cf6c commit ba112d8
Show file tree
Hide file tree
Showing 6 changed files with 114 additions and 7 deletions.
40 changes: 38 additions & 2 deletions app/Main.hs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import qualified Data.ByteString.Lazy.Char8 as B8S
import Data.IORef
import Data.List
import Data.Maybe
import Data.String.Utils
import Text.Read
import Data.Monoid
import Data.Proxy
Expand Down Expand Up @@ -66,19 +67,30 @@ data TodoListResult = TodoListResult {
data DeleteTodoRequest = DeleteTodoRequest {
ids :: [Integer]
} deriving (Show, Generic)

data EditTodoRequest = EditTodoRequest {
editIds :: [Integer],
setAssignee :: Maybe T.Text,
addTags :: [T.Text]
} deriving (Show, Generic)

instance FromJSON TodoEntry
instance ToJSON TodoEntry
instance FromJSON TodoListResult
instance ToJSON TodoListResult
instance FromJSON DeleteTodoRequest
instance ToJSON DeleteTodoRequest

instance FromJSON EditTodoRequest
instance ToJSON EditTodoRequest

type ToodlesAPI =
"todos" :> QueryFlag "recompute" :> Get '[JSON] TodoListResult :<|>
"todos" :> "delete" :> ReqBody '[JSON] DeleteTodoRequest :> Post '[JSON] T.Text :<|>
"todos" :> "edit" :> ReqBody '[JSON] EditTodoRequest :> Post '[JSON] T.Text :<|>
"static" :> Raw :<|> -- file server
"source_file" :> Capture "id" Integer :> Get '[HTML] BZ.Html :<|> -- source file
"source_file" :> Capture "id" Integer :> Get '[HTML] BZ.Html :<|> -- source
-- TODO(avi|#bug|p=1) - we don't have a 404 page, everything falls
-- through to default page
Raw -- root html page

data ToodlesState = ToodlesState {
Expand Down Expand Up @@ -132,6 +144,29 @@ deleteTodos (ToodlesState ref) req = do
_ <- liftIO $ atomicModifyIORef' ref (const (updeatedResults, updeatedResults))
return $ T.pack "{}"

editTodos :: ToodlesState -> EditTodoRequest -> Handler T.Text
editTodos (ToodlesState ref) req = do
refVal@(TodoListResult r _) <- liftIO $ readIORef ref
let editedList = map (\t -> if willEditTodo req t then (editTodo req t) else t) r
editedFilteredList = filter (willEditTodo req) editedList
_ <- mapM_ recordUpdates editedFilteredList
return $ T.pack "{}"
where

willEditTodo :: EditTodoRequest -> TodoEntry -> Bool
willEditTodo req entry = Main.id entry `elem` editIds req

editTodo :: EditTodoRequest -> TodoEntry -> TodoEntry
editTodo req entry = entry { assignee = (setAssignee req), tags = tags entry ++ (addTags req)}

recordUpdates :: MonadIO m => TodoEntry -> m ()
recordUpdates t =
let comment = fromJust $ lookup (getExtension $ sourceFile t) fileTypeToComment
detail = (T.pack "TODO(") <> (T.pack $ Data.String.Utils.join "|" (map T.unpack $ [fromMaybe "" $ assignee t] ++ (tags t) ++ (map (\a -> fst a <> "=" <> snd a)) (customAttributes t))) <> (T.pack ") ") in do
return ()



root :: Application
root _ res = readFile "./web/html/index.html" >>= \r -> res $
responseLBS
Expand All @@ -142,6 +177,7 @@ root _ res = readFile "./web/html/index.html" >>= \r -> res $
server :: ToodlesState -> Server ToodlesAPI
server s = liftIO . getFullSearchResults s :<|>
deleteTodos s :<|>
editTodos s :<|>
serveDirectoryFileServer "web" :<|>
showRawFile s :<|>
return root
Expand Down
10 changes: 10 additions & 0 deletions web/css/toodles.css
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,10 @@
text-align: center;
}

.todo-item-body {
max-width: 10%;
}

.attribute-block{
}

Expand All @@ -86,3 +90,9 @@
.priority-column {
min-width: 105px;
}

.modal-content {
background-color: white;
min-width: 50%;
min-height: 20%;
}
Binary file added web/fonts/fontawesome-webfont.woff
Binary file not shown.
Binary file added web/fonts/fontawesome-webfont.woff2
Binary file not shown.
37 changes: 33 additions & 4 deletions web/html/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,12 @@
</div>
<div class="navbar-menu">
<div class="navbar-end">
<div class="navbar-item edit-todos" v-on:click="editSeletedTodos" v-show="Object.values(todoSelected).some(v => v)">
<span class="icon">
<i class="fa fa-edit"></i>
</span>
<span>Edit</span>
</div>
<div class="navbar-item delete-todo" v-on:click="deleteSeletedTodos" v-show="Object.values(todoSelected).some(v => v)">
<span class="icon">
<i class="fa fa-trash"></i>
Expand All @@ -32,6 +38,29 @@
</div>
</div>
</nav>
<div class="modal">
<div class="modal-background" @click="closeModal"></div>
<div class="modal-content">
<div class="edit-todo-form container">
<div class="field">
<label class="label">Set Assignee</label>
<div class="control">
<input class="input" type="text" placeholder="Assignee" v-model="setAssignee">
</div>
</div>

<div class="field">
<label class="label">Add Tag (comma separated)</label>
<div class="control">
<input class="input" type="text" placeholder="bug,techdebt,..." v-model="addTags">
</div>
</div>

<button class="button is-primary submit-todo-edits" v-on:click="submitTodoEdits">Submit</button>
</div>
</div>
<button class="modal-close is-large" aria-label="close" @click="closeModal"></button>
</div>
<div class="columns content-container">
<div class="side-bar column is-one-quarter">
<label for="todo-search">Filter</label>
Expand Down Expand Up @@ -65,7 +94,7 @@
<i class="fa fa-sort"></i>
</span>
</td>
<td>Body</td>
<td class="todo-item-body">Body</td>
<td>Assignee</td>
<td>Tags</td>
</tr>
Expand All @@ -79,16 +108,16 @@
<div class="todo-source-link"><a :href="'/source_file/' + todo.id + '#line-' + todo.lineNumber" target="_blank">{{ todo.sourceFile }}:{{ todo.lineNumber}}</a></div>
<div>{{ todo.body }}</div>
</td>
<td class="todo-item-assignee" contenteditable>{{ todo.assignee }}</td>
<td class="todo-item-assignee" >{{ todo.assignee }}</td>
<td class="todo-item-customAttributes">
<div v-show="Object.keys(todo.customAttributes).length" class="attribute-block">
<span v-for="entry in Object.entries(todo.customAttributes)" class="attribute-item" @change="updateTodo('here')">
<span contenteditable>{{entry[0]}}</span>: <span contenteditable>{{entry[1]}}</span>
<span >{{entry[0]}}</span>: <span >{{entry[1]}}</span>
</span>
</div>
<div class="tag-block" v-show="Object.keys(todo.tags).length">
<span v-for="tag in todo.tags" class="tag-item">
<span contenteditable>{{tag}}</span>
<span >{{tag}}</span>
</span>
</div>
</td>
Expand Down
34 changes: 33 additions & 1 deletion web/js/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@ $(document).ready(function() {
sortMultiplier: {'priority': 1},
customSortSelected: '',
customAttributeKeys: [],
todoSelected: {}
todoSelected: {},
setAssignee: "",
addTags: ""
}
},
created: function() {
Expand Down Expand Up @@ -108,6 +110,14 @@ $(document).ready(function() {
}
},

editSeletedTodos: function() {
$(".modal").addClass("is-active")
},

closeModal: function() {
$(".modal").removeClass("is-active")
},

deleteSeletedTodos: function() {
if (confirm("Are you sure you want to delete these todo's?")) {
$.ajax({
Expand All @@ -128,6 +138,28 @@ $(document).ready(function() {
} else {
console.log("no")
}
},

submitTodoEdits: function(){
$.ajax({
url: "/todos/edit",
type: "POST",
dataType: "json",
contentType: 'application/json',
data: JSON.stringify({
ids: Object.entries(this.todoSelected).filter(e => e[1]).map(e => parseInt(e[0])),
setAssignee: this.setAssignee,
addTags: this.addTags.split(",").map(s => s.trim()).filter(s => !!s)
}),
success: function(data){
this.todos = this.todos.filter(function(t) {
return !this.todoSelected[t.id]
}.bind(this))
this.todoSelected = {}
this.closeModal()
}.bind(this),
error: console.log
})
}
}
})
Expand Down

0 comments on commit ba112d8

Please sign in to comment.