make 'deleting' stories and pubs non-destructive
This commit is contained in:
parent
a2a91647c1
commit
8308557afa
|
@ -42,6 +42,7 @@ export const getResponses = async () => {
|
|||
export const requestEdit = async (data,type) => {
|
||||
try {
|
||||
const res = await API.post(`/${type}/edit`,data)
|
||||
console.log(res)
|
||||
return res
|
||||
} catch (error) {
|
||||
console.error(error)
|
||||
|
|
|
@ -5,7 +5,8 @@ import { DateTime } from "luxon"
|
|||
import { Link } from "react-router-dom"
|
||||
import { cloneDeep } from "lodash"
|
||||
export default function Table(props) {
|
||||
const filterList = props?.filterList ?? []
|
||||
const filterColumns = props?.filterColumns ?? []
|
||||
const filterRows = props?.filterRows ?? []
|
||||
const sort = (data,sortBy) => {
|
||||
const isDate = (str) =>{
|
||||
if(str && DateTime.fromFormat(str,'yyyy-MM-dd').isValid){
|
||||
|
@ -37,11 +38,22 @@ export default function Table(props) {
|
|||
}
|
||||
const data = props?.data ? cloneDeep(props?.data)
|
||||
.map(e=>{
|
||||
for (const filter of filterList) {
|
||||
for(const filter of filterRows){
|
||||
if(e[filter.column]===filter.value){
|
||||
return null
|
||||
}
|
||||
}
|
||||
for (const filter of filterColumns) {
|
||||
delete e[filter]
|
||||
}
|
||||
if(props?.extraCols){
|
||||
for (const col of props.extraCols) {
|
||||
e[col[0]]=col[1]
|
||||
}
|
||||
}
|
||||
return e
|
||||
}) : []
|
||||
})
|
||||
.filter(e=>{return e!==null}) : []
|
||||
|
||||
if (data.length === 0) { return <p>Nothing to see here...</p> }
|
||||
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" viewBox="0 0 8 8">
|
||||
<path d="M0 0v8h7v-4h-4v-4h-3zm4 0v3h3l-3-3zm-3 2h1v1h-1v-1zm0 2h1v1h-1v-1zm0 2h4v1h-4v-1z" />
|
||||
</svg>
|
After Width: | Height: | Size: 183 B |
|
@ -1,10 +1,10 @@
|
|||
import { redirect } from "react-router";
|
||||
import { requestDelete } from "../APIcalls.mjs";
|
||||
import { requestEdit } from "../APIcalls.mjs";
|
||||
|
||||
export async function action({request}){
|
||||
const formData = await request.formData()
|
||||
const data = Object.fromEntries(formData)
|
||||
console.dir(data)
|
||||
await requestDelete({id:Number(data.id)},'publication')
|
||||
await requestEdit({id:Number(data.id),deleted:1},'publication')
|
||||
return redirect("/publications")
|
||||
}
|
|
@ -1,10 +1,15 @@
|
|||
import { redirect } from "react-router";
|
||||
import { requestDelete } from "../APIcalls.mjs";
|
||||
import { requestEdit } from "../APIcalls.mjs";
|
||||
|
||||
export async function action({request}){
|
||||
const formData = await request.formData()
|
||||
const data = Object.fromEntries(formData)
|
||||
let data = Object.fromEntries(formData)
|
||||
console.dir(data)
|
||||
await requestDelete({id:Number(data.id)},'story')
|
||||
data = {
|
||||
id:Number(data.id),
|
||||
deleted:1,
|
||||
}
|
||||
console.log(data)
|
||||
await requestEdit(data,'story')
|
||||
return redirect("/stories")
|
||||
}
|
|
@ -3,7 +3,7 @@ import Dropdown from "../Components/Dropdown";
|
|||
import { useState } from "react";
|
||||
export default function EditSubmissionRoot (){
|
||||
const {submissions} = useLoaderData()
|
||||
const submissionsOptions = submissions?.map(row=>[row.id,row.date_submitted])
|
||||
const submissionsOptions = submissions?.map(row=>[row.id,`#${row.id}, submitted: ${row.date_submitted}`])
|
||||
const [id,setId]=useState(1)
|
||||
const handleChange = (event) => {
|
||||
const value = event.target.value
|
||||
|
|
|
@ -3,7 +3,7 @@ import Table from "../Components/Table";
|
|||
import PageHeader from "../Components/PageHeader";
|
||||
import { submissionsTableOptions } from "./submissions.jsx";
|
||||
|
||||
const { filterList, highlights, clickables } = submissionsTableOptions
|
||||
const { filterColumns, highlights, clickables } = submissionsTableOptions
|
||||
export default function Publication() {
|
||||
const { publicationId } = useParams()
|
||||
const { publications } = useLoaderData()
|
||||
|
@ -19,7 +19,7 @@ export default function Publication() {
|
|||
</div>
|
||||
|
||||
<Table data={publicationData.submissions}
|
||||
filterList={[...filterList, 'publication']}
|
||||
filterColumns={[...filterColumns, 'publication']}
|
||||
highlights={highlights}
|
||||
clickables={clickables}
|
||||
sortByDefault='date_submitted'
|
||||
|
|
|
@ -9,8 +9,12 @@ import PageHeader from "../Components/PageHeader.jsx";
|
|||
|
||||
export default function Publications(){
|
||||
const { publications } = useLoaderData();
|
||||
const filterList = [
|
||||
'submissions'
|
||||
const filterColumns = [
|
||||
'submissions',
|
||||
'deleted'
|
||||
]
|
||||
const filterRows = [
|
||||
{column:'deleted',value:1}
|
||||
]
|
||||
const links = [
|
||||
'link'
|
||||
|
@ -23,10 +27,11 @@ export default function Publications(){
|
|||
<PageHeader heading="Publications" url="/publication"/>
|
||||
<Table
|
||||
data={publications}
|
||||
filterList={filterList}
|
||||
filterColumns={filterColumns}
|
||||
links={links}
|
||||
clickables={clickables}
|
||||
sortByDefault='title'
|
||||
filterRows={filterRows}
|
||||
/>
|
||||
</div>
|
||||
)
|
||||
|
|
|
@ -3,7 +3,6 @@ import { getStories, getPublications, getSubmissions } from "../APIcalls.mjs"
|
|||
import Loader from "../Components/Loader"
|
||||
|
||||
|
||||
|
||||
export function Root() {
|
||||
const navigation = useNavigation()
|
||||
return(
|
||||
|
@ -11,7 +10,8 @@ export function Root() {
|
|||
<div id="container">
|
||||
{navigation==="loading"?<Loader/>:""}
|
||||
<div id="sidebar">
|
||||
<h1>Submission <br/> Manager</h1> version 1.0
|
||||
<h1>Submission <br/> Manager</h1>
|
||||
version 0.0.0.0.1
|
||||
<ul>
|
||||
<li>
|
||||
<Link to={`stories`}>STORIES</Link>
|
||||
|
|
|
@ -2,14 +2,18 @@ import { useLoaderData } from "react-router-dom"
|
|||
import Table from "../Components/Table.jsx";
|
||||
import PageHeader from "../Components/PageHeader.jsx";
|
||||
import { getStories } from "../APIcalls.mjs";
|
||||
|
||||
import magGlass from "../assets/magnifying-glass.svg"
|
||||
|
||||
|
||||
|
||||
export default function Stories(){
|
||||
const { stories } = useLoaderData();
|
||||
const filterList = [
|
||||
'submissions'
|
||||
const filterColumns = [
|
||||
'submissions',
|
||||
//'deleted'
|
||||
]
|
||||
const filterRows = [
|
||||
{column:'deleted',value:1}
|
||||
]
|
||||
const clickables = [
|
||||
['title',(row)=>{return `../../story/${row.id}`}]
|
||||
|
@ -19,9 +23,10 @@ export default function Stories(){
|
|||
<PageHeader heading="Stories" url="/story"/>
|
||||
<Table
|
||||
data={stories}
|
||||
filterList={filterList}
|
||||
filterColumns={filterColumns}
|
||||
clickables={clickables}
|
||||
sortByDefault='title'
|
||||
filterRows={filterRows}
|
||||
/>
|
||||
</div>
|
||||
)
|
||||
|
|
|
@ -4,7 +4,7 @@ import PageHeader from "../Components/PageHeader";
|
|||
import { submissionsTableOptions } from "./submissions.jsx";
|
||||
import { useState, useEffect } from "react";
|
||||
|
||||
const { filterList = [...filterList], highlights, clickables } = submissionsTableOptions
|
||||
const { filterColumns = [...filterColumns], highlights, clickables } = submissionsTableOptions
|
||||
export default function Story() {
|
||||
const { storyId } = useParams()
|
||||
const { stories } = useLoaderData()
|
||||
|
@ -20,7 +20,7 @@ export default function Story() {
|
|||
</div>
|
||||
<Table
|
||||
data={storyData.submissions}
|
||||
filterList={[...filterList, 'story']}
|
||||
filterColumns={[...filterColumns, 'story']}
|
||||
highlights={highlights}
|
||||
clickables={clickables}
|
||||
sortByDefault='date_submitted'
|
||||
|
|
|
@ -2,9 +2,10 @@ import { useLoaderData } from "react-router-dom";
|
|||
import { getSubmissions } from "../APIcalls.mjs";
|
||||
import Table from "../Components/Table";
|
||||
import PageHeader from "../Components/PageHeader";
|
||||
import edit from '../assets/pencil.svg'
|
||||
|
||||
export const submissionsTableOptions = {
|
||||
filterList : [
|
||||
filterColumns : [
|
||||
'response_id',
|
||||
'pub_id',
|
||||
'story_id'
|
||||
|
@ -21,7 +22,7 @@ export const submissionsTableOptions = {
|
|||
|
||||
export function Submissions(){
|
||||
const { submissions } = useLoaderData();
|
||||
const filterList = [
|
||||
const filterColumns = [
|
||||
'response_id',
|
||||
'pub_id',
|
||||
'story_id'
|
||||
|
@ -33,7 +34,11 @@ export function Submissions(){
|
|||
['story',(row)=>{
|
||||
return `../../story/${row.story_id}`}],
|
||||
['publication',(row)=>{return `../../publication/${row.pub_id}`}],
|
||||
['id',(row)=>{return `../../submission/${row.id}/edit`}]
|
||||
['edit',(row)=>{return `../../submission/${row.id}/edit`}]
|
||||
]
|
||||
|
||||
const extraCols = [
|
||||
['edit', <img src={edit} width="100%" style={{margin:"auto"}}/>]
|
||||
]
|
||||
|
||||
|
||||
|
@ -43,10 +48,11 @@ export function Submissions(){
|
|||
<PageHeader heading="Submissions" url="/submission"/>
|
||||
<Table
|
||||
data={submissions}
|
||||
filterList={filterList}
|
||||
filterColumns={filterColumns}
|
||||
highlights={highlights}
|
||||
sortByDefault="date_submitted"
|
||||
clickables={clickables}
|
||||
extraCols={extraCols}
|
||||
/>
|
||||
</div>
|
||||
)
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
width: 5rem;
|
||||
height: 5rem;
|
||||
margin: 1rem;
|
||||
filter: invert(83%) sepia(12%) saturate(387%) hue-rotate(129deg) brightness(89%) contrast(89%);
|
||||
}
|
||||
|
||||
#page-header h1 {
|
||||
|
|
|
@ -10,6 +10,8 @@
|
|||
#sidebar h1{
|
||||
text-shadow: var(--text-shadow-dark);
|
||||
font-size:4.5rem;
|
||||
line-height: 1em;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
#sidebar a:hover{
|
||||
text-shadow:
|
||||
|
|
|
@ -73,6 +73,9 @@ html {
|
|||
cursor:pointer;
|
||||
}
|
||||
|
||||
img{
|
||||
filter: invert(83%) sepia(12%) saturate(500%) hue-rotate(129deg) brightness(60%) contrast(89%);
|
||||
}
|
||||
|
||||
h1{
|
||||
font-size: 4rem;
|
||||
|
|
Loading…
Reference in New Issue