mirror of https://github.com/sunface/rust-course
parent
001609b801
commit
9a43a37cae
@ -1 +1,56 @@
|
||||
package story
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"github.com/imdotdev/im.dev/server/pkg/db"
|
||||
"github.com/imdotdev/im.dev/server/pkg/e"
|
||||
"github.com/imdotdev/im.dev/server/pkg/models"
|
||||
)
|
||||
|
||||
func SubmitSeriesPost(seriesID string, posts []*models.SeriesPost) *e.Error {
|
||||
_, err := db.Conn.Exec("DELETE FROM series_post WHERE series_id=?", seriesID)
|
||||
if err != nil {
|
||||
logger.Warn("delete series post error", "error", err)
|
||||
return e.New(http.StatusInternalServerError, e.Internal)
|
||||
}
|
||||
|
||||
for _, post := range posts {
|
||||
_, err = db.Conn.Exec("INSERT INTO series_post (series_id,post_id,priority) VALUES (?,?,?)", seriesID, post.PostID, post.Priority)
|
||||
if err != nil {
|
||||
logger.Warn("add series post error", "error", err)
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetSeriesPost(seriesID string) ([]*models.SeriesPost, *e.Error) {
|
||||
posts := make([]*models.SeriesPost, 0)
|
||||
rows, err := db.Conn.Query("SELECT post_id,priority FROM series_post WHERE series_id=?", seriesID)
|
||||
if err != nil {
|
||||
logger.Warn("select series post error", "error", err)
|
||||
return nil, e.New(http.StatusInternalServerError, e.Internal)
|
||||
}
|
||||
|
||||
for rows.Next() {
|
||||
post := &models.SeriesPost{}
|
||||
err := rows.Scan(&post.PostID, &post.Priority)
|
||||
if err != nil {
|
||||
logger.Warn("scan series post error", "error", err)
|
||||
continue
|
||||
}
|
||||
posts = append(posts, post)
|
||||
}
|
||||
|
||||
return posts, nil
|
||||
}
|
||||
|
||||
func DeleteSeriesPost(id string) *e.Error {
|
||||
_, err := db.Conn.Exec("DELETE FROM series_post WHERE series_id=?", id)
|
||||
if err != nil {
|
||||
return e.New(http.StatusInternalServerError, e.Internal)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
@ -0,0 +1,5 @@
|
||||
package models
|
||||
|
||||
import "github.com/imdotdev/im.dev/server/pkg/log"
|
||||
|
||||
var logger = log.RootLogger.New("logger", "models")
|
@ -0,0 +1,56 @@
|
||||
import React from "react"
|
||||
import { Popover, PopoverTrigger, IconButton, PopoverContent, useDisclosure, Stack, Box, Heading, Text, Divider, StackDivider, useColorModeValue, border, Button, Flex } from "@chakra-ui/react"
|
||||
import { Story } from "src/types/story"
|
||||
import { FaPlus } from "react-icons/fa"
|
||||
import userCustomTheme from "theme/user-custom"
|
||||
import { find } from "lodash"
|
||||
import { CheckIcon } from "@chakra-ui/icons"
|
||||
|
||||
interface Props {
|
||||
posts: Story[]
|
||||
selected: any[]
|
||||
onSelect:any
|
||||
}
|
||||
|
||||
export const PostSelect = (props: Props) => {
|
||||
const { onOpen, onClose, isOpen } = useDisclosure()
|
||||
const borderColor = useColorModeValue(userCustomTheme.borderColor.light, userCustomTheme.borderColor.dark)
|
||||
const beenSelected = id => {
|
||||
if (find(props.selected,v => id ===v.id)) {
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
return (
|
||||
<Popover
|
||||
isOpen={isOpen}
|
||||
onOpen={onOpen}
|
||||
onClose={onClose}
|
||||
placement="right"
|
||||
autoFocus={false}
|
||||
>
|
||||
<PopoverTrigger>
|
||||
<IconButton aria-label="select post" size="sm" icon={<FaPlus />} variant="ghost" _focus={null} />
|
||||
</PopoverTrigger>
|
||||
<PopoverContent maxHeight="400px" overflow="scroll">
|
||||
<Stack spacing="1" py="2" divider={<StackDivider borderColor={borderColor} />}>
|
||||
{
|
||||
props.posts.map(p =>
|
||||
<Flex key={p.id} justifyContent="space-between" alignItems="center" px="4" cursor="pointer" onClick={() => props.onSelect(p.id)}>
|
||||
<Box py="2" >
|
||||
<Heading size="xs">{p.title}</Heading>
|
||||
<Text layerStyle="textSecondary" mt="2">{p.brief}</Text>
|
||||
</Box>
|
||||
{beenSelected(p.id) ? <CheckIcon color="green.400"/> : null}
|
||||
</Flex>)
|
||||
}
|
||||
</Stack>
|
||||
|
||||
</PopoverContent>
|
||||
</Popover>
|
||||
)
|
||||
}
|
||||
|
||||
export default PostSelect
|
Loading…
Reference in new issue