Remove deprecated issue status
This commit is contained in:
parent
d272b6a1dc
commit
4be598b9ae
@ -1,3 +1,5 @@
|
|||||||
|
use seed::Method;
|
||||||
|
|
||||||
use jirs_data::UpdateIssuePayload;
|
use jirs_data::UpdateIssuePayload;
|
||||||
|
|
||||||
use crate::shared::host_client;
|
use crate::shared::host_client;
|
||||||
@ -22,9 +24,11 @@ pub async fn update_issue(
|
|||||||
id: i32,
|
id: i32,
|
||||||
payload: UpdateIssuePayload,
|
payload: UpdateIssuePayload,
|
||||||
) -> Result<Msg, Msg> {
|
) -> Result<Msg, Msg> {
|
||||||
match host_client(host_url, format!("/issue/{id}", id = id).as_str()) {
|
match host_client(host_url, format!("/issues/{id}", id = id).as_str()) {
|
||||||
Ok(client) => {
|
Ok(client) => {
|
||||||
client
|
client
|
||||||
|
.method(Method::Put)
|
||||||
|
.header("Content-Type", "application/json")
|
||||||
.body_json(&payload)
|
.body_json(&payload)
|
||||||
.fetch_json(Msg::IssueUpdateResult)
|
.fetch_json(Msg::IssueUpdateResult)
|
||||||
.await
|
.await
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
use seed::fetch::{FetchObject, ResponseWithDataResult};
|
use seed::fetch::{FetchObject, ResponseWithDataResult};
|
||||||
|
use seed::*;
|
||||||
|
|
||||||
use jirs_data::{FullProjectResponse, Issue};
|
use jirs_data::{FullProjectResponse, Issue};
|
||||||
|
|
||||||
@ -51,6 +52,8 @@ pub fn current_project_response(fetched: &FetchObject<String>, model: &mut Model
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn update_issue_response(fetched: &FetchObject<String>, model: &mut Model) {
|
pub fn update_issue_response(fetched: &FetchObject<String>, model: &mut Model) {
|
||||||
|
log!("update_issue_response");
|
||||||
|
log!(fetched);
|
||||||
if let FetchObject {
|
if let FetchObject {
|
||||||
result:
|
result:
|
||||||
Ok(ResponseWithDataResult {
|
Ok(ResponseWithDataResult {
|
||||||
|
@ -8,7 +8,6 @@ use jirs_data::*;
|
|||||||
use crate::{IssueId, UserId, HOST_URL};
|
use crate::{IssueId, UserId, HOST_URL};
|
||||||
|
|
||||||
pub type ProjectId = i32;
|
pub type ProjectId = i32;
|
||||||
pub type StatusCode = u32;
|
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Copy, Clone, Debug, PartialOrd, PartialEq)]
|
#[derive(Serialize, Deserialize, Copy, Clone, Debug, PartialOrd, PartialEq)]
|
||||||
#[serde(rename_all = "kebab-case")]
|
#[serde(rename_all = "kebab-case")]
|
||||||
|
@ -6,7 +6,7 @@ use crate::model::{Icon, Model, Page};
|
|||||||
use crate::shared::styled_avatar::StyledAvatar;
|
use crate::shared::styled_avatar::StyledAvatar;
|
||||||
use crate::shared::styled_button::{StyledButton, Variant};
|
use crate::shared::styled_button::{StyledButton, Variant};
|
||||||
use crate::shared::styled_input::StyledInput;
|
use crate::shared::styled_input::StyledInput;
|
||||||
use crate::shared::{drag_ev, host_client, inner_layout, ToNode};
|
use crate::shared::{drag_ev, inner_layout, ToNode};
|
||||||
use crate::Msg;
|
use crate::Msg;
|
||||||
|
|
||||||
pub fn update(msg: Msg, model: &mut crate::model::Model, orders: &mut impl Orders<Msg>) {
|
pub fn update(msg: Msg, model: &mut crate::model::Model, orders: &mut impl Orders<Msg>) {
|
||||||
@ -71,7 +71,7 @@ pub fn update(msg: Msg, model: &mut crate::model::Model, orders: &mut impl Order
|
|||||||
let mut position = 0f64;
|
let mut position = 0f64;
|
||||||
let mut found: Option<&mut Issue> = None;
|
let mut found: Option<&mut Issue> = None;
|
||||||
for issue in project.issues.iter_mut() {
|
for issue in project.issues.iter_mut() {
|
||||||
if issue.status == status.to_payload() {
|
if issue.status == status {
|
||||||
position += 1f64;
|
position += 1f64;
|
||||||
}
|
}
|
||||||
if issue.id == issue_id {
|
if issue.id == issue_id {
|
||||||
@ -80,22 +80,23 @@ pub fn update(msg: Msg, model: &mut crate::model::Model, orders: &mut impl Order
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if let Some(issue) = found {
|
if let Some(issue) = found {
|
||||||
issue.status = status.to_payload().to_string();
|
issue.status = status.clone();
|
||||||
issue.list_position = position + 1f64;
|
issue.list_position = position + 1f64;
|
||||||
|
|
||||||
let payload = UpdateIssuePayload {
|
let payload = UpdateIssuePayload {
|
||||||
title: None,
|
title: Some(issue.title.clone()),
|
||||||
issue_type: None,
|
issue_type: Some(issue.issue_type.clone()),
|
||||||
status: Some(status.to_payload().to_string()),
|
status: Some(status.to_payload().to_string()),
|
||||||
priority: None,
|
priority: Some(issue.priority.clone()),
|
||||||
list_position: Some(position + 1f64),
|
list_position: Some(issue.list_position),
|
||||||
description: None,
|
description: Some(issue.description.clone()),
|
||||||
description_text: None,
|
description_text: Some(issue.description_text.clone()),
|
||||||
estimate: None,
|
estimate: Some(issue.estimate),
|
||||||
time_spent: None,
|
time_spent: Some(issue.time_spent),
|
||||||
time_remaining: None,
|
time_remaining: Some(issue.time_remaining),
|
||||||
project_id: None,
|
project_id: Some(issue.project_id),
|
||||||
users: None,
|
users: Some(vec![]),
|
||||||
user_ids: None,
|
user_ids: Some(issue.user_ids.clone()),
|
||||||
};
|
};
|
||||||
orders.skip().perform_cmd(crate::api::update_issue(
|
orders.skip().perform_cmd(crate::api::update_issue(
|
||||||
model.host_url.clone(),
|
model.host_url.clone(),
|
||||||
@ -269,7 +270,7 @@ fn project_issue_list(model: &Model, status: jirs_data::IssueStatus) -> Node<Msg
|
|||||||
let issues: Vec<Node<Msg>> = project
|
let issues: Vec<Node<Msg>> = project
|
||||||
.issues
|
.issues
|
||||||
.iter()
|
.iter()
|
||||||
.filter(|issue| status.match_name(issue.status.as_str()))
|
.filter(|issue| status == issue.status)
|
||||||
.map(|issue| project_issue(model, project, issue))
|
.map(|issue| project_issue(model, project, issue))
|
||||||
.collect();
|
.collect();
|
||||||
let label = status.to_label();
|
let label = status.to_label();
|
||||||
@ -316,7 +317,7 @@ fn project_issue(model: &Model, project: &FullProject, issue: &Issue) -> Node<Ms
|
|||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
let mut issue_type_icon = match issue.issue_type.parse::<IssueType>() {
|
let issue_type_icon = match issue.issue_type.parse::<IssueType>() {
|
||||||
Ok(icon) => {
|
Ok(icon) => {
|
||||||
let mut node = crate::shared::styled_icon(icon.into());
|
let mut node = crate::shared::styled_icon(icon.into());
|
||||||
node.add_style(
|
node.add_style(
|
||||||
@ -341,7 +342,7 @@ fn project_issue(model: &Model, project: &FullProject, issue: &Issue) -> Node<Ms
|
|||||||
};
|
};
|
||||||
|
|
||||||
let issue_id = issue.id;
|
let issue_id = issue.id;
|
||||||
let drag_started = drag_ev(Ev::DragStart, move |event| Msg::IssueDragStarted(issue_id));
|
let drag_started = drag_ev(Ev::DragStart, move |_| Msg::IssueDragStarted(issue_id));
|
||||||
let drag_stopped = drag_ev(Ev::DragEnd, move |_| Msg::IssueDragStopped(issue_id));
|
let drag_stopped = drag_ev(Ev::DragEnd, move |_| Msg::IssueDragStopped(issue_id));
|
||||||
|
|
||||||
let mut class_list = vec!["issue"];
|
let mut class_list = vec!["issue"];
|
||||||
|
@ -1,9 +1,6 @@
|
|||||||
use seed::fetch::{FetchObject, ResponseWithDataResult};
|
|
||||||
use seed::{prelude::*, *};
|
use seed::{prelude::*, *};
|
||||||
use wasm_bindgen::JsCast;
|
use wasm_bindgen::JsCast;
|
||||||
|
|
||||||
use jirs_data::FullProjectResponse;
|
|
||||||
|
|
||||||
use crate::model::{Icon, Model};
|
use crate::model::{Icon, Model};
|
||||||
use crate::Msg;
|
use crate::Msg;
|
||||||
|
|
||||||
|
@ -1 +1 @@
|
|||||||
./LICENSE
|
../LICENSE
|
@ -50,6 +50,20 @@ pub enum IssueStatus {
|
|||||||
Done,
|
Done,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl FromStr for IssueStatus {
|
||||||
|
type Err = String;
|
||||||
|
|
||||||
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||||
|
match s {
|
||||||
|
"backlog" => Ok(IssueStatus::Backlog),
|
||||||
|
"selected" => Ok(IssueStatus::Selected),
|
||||||
|
"in_progress" => Ok(IssueStatus::InProgress),
|
||||||
|
"done" => Ok(IssueStatus::Done),
|
||||||
|
_ => Err(format!("Invalid status {:?}", s)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl IssueStatus {
|
impl IssueStatus {
|
||||||
pub fn to_label(&self) -> &str {
|
pub fn to_label(&self) -> &str {
|
||||||
match self {
|
match self {
|
||||||
@ -69,18 +83,8 @@ impl IssueStatus {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[deprecated]
|
|
||||||
pub fn to_deprecated_payload(&self) -> &str {
|
|
||||||
match self {
|
|
||||||
IssueStatus::Backlog => "backlog",
|
|
||||||
IssueStatus::Selected => "selected",
|
|
||||||
IssueStatus::InProgress => "inprogress",
|
|
||||||
IssueStatus::Done => "done",
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn match_name(&self, name: &str) -> bool {
|
pub fn match_name(&self, name: &str) -> bool {
|
||||||
self.to_payload() == name || self.to_deprecated_payload() == name
|
self.to_payload() == name
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -232,7 +236,7 @@ pub struct Issue {
|
|||||||
pub title: String,
|
pub title: String,
|
||||||
#[serde(rename = "type")]
|
#[serde(rename = "type")]
|
||||||
pub issue_type: String,
|
pub issue_type: String,
|
||||||
pub status: String,
|
pub status: IssueStatus,
|
||||||
pub priority: String,
|
pub priority: String,
|
||||||
pub list_position: f64,
|
pub list_position: f64,
|
||||||
pub description: Option<String>,
|
pub description: Option<String>,
|
||||||
|
@ -1 +1 @@
|
|||||||
./LICENSE
|
../LICENSE
|
@ -2,6 +2,8 @@ use chrono::NaiveDateTime;
|
|||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
|
|
||||||
|
use jirs_data::IssueStatus;
|
||||||
|
|
||||||
use crate::schema::*;
|
use crate::schema::*;
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize, Queryable)]
|
#[derive(Debug, Serialize, Deserialize, Queryable)]
|
||||||
@ -66,7 +68,11 @@ impl Into<jirs_data::Issue> for Issue {
|
|||||||
id: self.id,
|
id: self.id,
|
||||||
title: self.title,
|
title: self.title,
|
||||||
issue_type: self.issue_type,
|
issue_type: self.issue_type,
|
||||||
status: self.status,
|
status: self
|
||||||
|
.status
|
||||||
|
.as_str()
|
||||||
|
.parse::<IssueStatus>()
|
||||||
|
.unwrap_or_else(|_| IssueStatus::Backlog),
|
||||||
priority: self.priority,
|
priority: self.priority,
|
||||||
list_position: self.list_position,
|
list_position: self.list_position,
|
||||||
description: self.description,
|
description: self.description,
|
||||||
|
@ -1,6 +0,0 @@
|
|||||||
-- This file was automatically created by Diesel to setup helper functions
|
|
||||||
-- and other internal bookkeeping. This file is safe to edit, any future
|
|
||||||
-- changes will be added to existing projects as new migrations.
|
|
||||||
|
|
||||||
DROP FUNCTION IF EXISTS diesel_manage_updated_at(_tbl regclass);
|
|
||||||
DROP FUNCTION IF EXISTS diesel_set_updated_at();
|
|
@ -1,36 +0,0 @@
|
|||||||
-- This file was automatically created by Diesel to setup helper functions
|
|
||||||
-- and other internal bookkeeping. This file is safe to edit, any future
|
|
||||||
-- changes will be added to existing projects as new migrations.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-- Sets up a trigger for the given table to automatically set a column called
|
|
||||||
-- `updated_at` whenever the row is modified (unless `updated_at` was included
|
|
||||||
-- in the modified columns)
|
|
||||||
--
|
|
||||||
-- # Example
|
|
||||||
--
|
|
||||||
-- ```sql
|
|
||||||
-- CREATE TABLE users (id SERIAL PRIMARY KEY, updated_at TIMESTAMP NOT NULL DEFAULT NOW());
|
|
||||||
--
|
|
||||||
-- SELECT diesel_manage_updated_at('users');
|
|
||||||
-- ```
|
|
||||||
CREATE OR REPLACE FUNCTION diesel_manage_updated_at(_tbl regclass) RETURNS VOID AS $$
|
|
||||||
BEGIN
|
|
||||||
EXECUTE format('CREATE TRIGGER set_updated_at BEFORE UPDATE ON %s
|
|
||||||
FOR EACH ROW EXECUTE PROCEDURE diesel_set_updated_at()', _tbl);
|
|
||||||
END;
|
|
||||||
$$ LANGUAGE plpgsql;
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION diesel_set_updated_at() RETURNS trigger AS $$
|
|
||||||
BEGIN
|
|
||||||
IF (
|
|
||||||
NEW IS DISTINCT FROM OLD AND
|
|
||||||
NEW.updated_at IS NOT DISTINCT FROM OLD.updated_at
|
|
||||||
) THEN
|
|
||||||
NEW.updated_at := current_timestamp;
|
|
||||||
END IF;
|
|
||||||
RETURN NEW;
|
|
||||||
END;
|
|
||||||
$$ LANGUAGE plpgsql;
|
|
Loading…
Reference in New Issue
Block a user