login

<     >

2023-08-02 16:55:33 (UTC-03:00)

Marcel Rodrigues <marcelgmr@gmail.com>

add project updating

diff --git a/data.lua b/data.lua
index 78e1bca..ed6fac9 100644
--- a/data.lua
+++ b/data.lua
@@ -149,6 +149,13 @@ function Model:get_project(name)
     return self.db:execute("SELECT * FROM Project WHERE name = ?;", name)[1]
 end
 
+function Model:get_user_project(user_id, proj_name)
+    return self.db:execute([[
+        SELECT * FROM Project JOIN Membership ON Project.id = Membership.proj_id
+        WHERE Membership.user_id = ? AND Project.name = ? ORDER BY priority DESC;
+    ]], user_id, proj_name)[1]
+end
+
 function Model:get_user_projects(user_id)
     return self.db:execute([[
         SELECT * FROM Project JOIN Membership ON Project.id = Membership.proj_id
@@ -156,6 +163,14 @@ function Model:get_user_projects(user_id)
     ]], user_id)
 end
 
+function Model:update_project(old_name, new_name, desc, goal, color, priority)
+    local query = [[
+        UPDATE Project SET name = ?, desc = ?, goal = ?, color = ?, priority = ?
+        WHERE name = ?;
+    ]]
+    self.db:execute(query, new_name, desc, goal, color, priority, old_name)
+end
+
 function Model:del_project(proj_id)
     self.db:execute("DELETE FROM Membership WHERE proj_id = ?;", proj_id)
     self.db:execute("DELETE FROM Ticket WHERE proj_id = ?;", proj_id)

diff --git a/skopos.lua b/skopos.lua
index c354ee8..dfd93a8 100644
--- a/skopos.lua
+++ b/skopos.lua
@@ -161,6 +161,28 @@ function App:routes()
         self:log(LOG_INFO, "user "..user.nick.." created project "..name)
         return "/p", 303
     end},
+    {"GET", "/upd%-project/([-_%w]+)",
+    function (req, name)
+        local user = self:get_user(req)
+        if user == nil then return "/login", 303 end
+        local proj = self.model:get_user_project(user.id, name)
+        if proj == nil then return "not found", 404 end
+        local env = {title=self.title, user=user, proj=proj}
+        return lud.template.render_file("view/proj_form.html", env)
+    end},
+    {"POST", "/upd%-project/([-_%w]+)",
+    function (req, old_name)
+        local user = self:get_user(req)
+        if user == nil then return "/login", 303 end
+        local new_name = req.form.name
+        local desc = req.form.desc
+        local goal = req.form.goal
+        local color = req.form.color
+        local priority = tonumber(req.form.priority or 0)
+        self.model:update_project(old_name, new_name, desc, goal, color, priority)
+        self:log(LOG_INFO, "user "..user.nick.." edited project "..old_name)
+        return "/p", 303
+    end},
     {"POST", "/del%-project/([-_%w]+)",
     function (req, name)
         local user = self:get_user(req)

diff --git a/view/proj_form.html b/view/proj_form.html
index e6480ab..9484b84 100644
--- a/view/proj_form.html
+++ b/view/proj_form.html
@@ -10,7 +10,15 @@
 </head>
 <body>
   <h1 class="centered">Project</h1>
-  <form action="/new-project" method="post">
+  % if $proj == nil then
+  %   set action = "/new-project"
+  %   set proj = {name="", desc="", goal="", color="#000000", priority=0}
+  %   set submit_value = "Create"
+  % else
+  %   set action = "/upd-project/" .. $proj.name
+  %   set submit_value = "Save"
+  % end
+  <form action="{{$action}}" method="post">
     <table class="field-list">
       <tbody>
         <tr>
@@ -20,7 +28,7 @@
           <td>
             <input
               type="text" class="flat-field" id="name" name="name" required
-              pattern="[-_A-Za-z0-9]+" autofocus>
+              pattern="[-_A-Za-z0-9]+" value="{{$proj.name}}" autofocus>
           </td>
         </tr>
         <tr>
@@ -28,7 +36,9 @@
             <label for="desc">Description:</label>
           </td>
           <td>
-            <input type="text" class="flat-field" id="desc" name="desc" size="30">
+            <input
+              type="text" class="flat-field" id="desc" name="desc" size="30"
+              value="{{$proj.desc}}">
           </td>
         </tr>
         <tr>
@@ -36,7 +46,9 @@
             <label for="goal">Goal:</label>
           </td>
           <td>
-            <input type="text" class="flat-field" id="goal" name="goal" size="50">
+            <input
+              type="text" class="flat-field" id="goal" name="goal" size="50"
+              value="{{$proj.goal}}">
           </td>
         </tr>
         <tr>
@@ -44,7 +56,9 @@
             <label for="color">Color:</label>
           </td>
           <td>
-            <input type="color" class="flat-field" id="color" name="color" value="#000000">
+            <input
+              type="color" class="flat-field" id="color" name="color"
+              value="{{$proj.color}}">
           </td>
         </tr>
         <tr>
@@ -52,13 +66,15 @@
             <label for="priority">Priority:</label>
           </td>
           <td>
-            <input type="number" class="flat-field" id="priority" name="priority" required>
+            <input
+              type="number" class="flat-field" id="priority" name="priority"
+              required value="{{$proj.priority}}">
           </td>
         </tr>
       </tbody>
     </table>
     <br>
-    <input type="submit" class="flat-button" value="Create">
+    <input type="submit" class="flat-button" value="{{$submit_value}}">
   </form>
 </body>
 </html>

diff --git a/view/projs.html b/view/projs.html
index f84996b..0a08b99 100644
--- a/view/projs.html
+++ b/view/projs.html
@@ -18,6 +18,7 @@
       <th>description</th>
       <th>priority</th>
       <th>color</th>
+      <th>edit</th>
       <th>delete</th>
     </tr>
     % for proj in $projs do
@@ -26,6 +27,7 @@
         <td>{{$proj.desc}}</td>
         <td>{{$proj.priority}}</td>
         <td><span style="background-color:{{$proj.color}};">{{$proj.color}}</span></td>
+        <td><a href="/upd-project/{{$proj.name}}">edit</a></td>
         <td>
           <form action="/del-project/{{$proj.name}}" method="post">
             <button type="submit">delete</button>