mirror of https://github.com/sunface/rust-course
parent
001609b801
commit
9a43a37cae
@ -1 +1,56 @@
|
|||||||
package story
|
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