feat: task examples
This commit is contained in:
parent
639129c816
commit
fd81ca7395
|
|
@ -24,7 +24,8 @@
|
||||||
"v-calendar": "^3.0.3",
|
"v-calendar": "^3.0.3",
|
||||||
"vitepress": "^1.0.0-rc.10",
|
"vitepress": "^1.0.0-rc.10",
|
||||||
"vue": "^3.3.4",
|
"vue": "^3.3.4",
|
||||||
"vue-wrap-balancer": "^1.1.3"
|
"vue-wrap-balancer": "^1.1.3",
|
||||||
|
"zod": "^3.22.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@iconify-json/radix-icons": "^1.1.11",
|
"@iconify-json/radix-icons": "^1.1.11",
|
||||||
|
|
|
||||||
5
apps/www/src/content/examples/tasks.md
Normal file
5
apps/www/src/content/examples/tasks.md
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
<script setup>
|
||||||
|
import TasksExample from "@/examples/tasks/Example.vue"
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<TasksExample />
|
||||||
41
apps/www/src/examples/tasks/Example.vue
Normal file
41
apps/www/src/examples/tasks/Example.vue
Normal file
|
|
@ -0,0 +1,41 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
import tasks from './data/tasks.json'
|
||||||
|
import DataTable from './components/DataTable.vue'
|
||||||
|
import UserNav from './components/UserNav.vue'
|
||||||
|
import { columns } from './components/columns'
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<!-- <div className="md:hidden">
|
||||||
|
<Image
|
||||||
|
src="/examples/tasks-light.png"
|
||||||
|
width={1280}
|
||||||
|
height={998}
|
||||||
|
alt="Playground"
|
||||||
|
className="block dark:hidden"
|
||||||
|
/>
|
||||||
|
<Image
|
||||||
|
src="/examples/tasks-dark.png"
|
||||||
|
width={1280}
|
||||||
|
height={998}
|
||||||
|
alt="Playground"
|
||||||
|
className="hidden dark:block"
|
||||||
|
/>
|
||||||
|
</div> -->
|
||||||
|
<div className="hidden h-full flex-1 flex-col space-y-8 p-8 md:flex">
|
||||||
|
<div className="flex items-center justify-between space-y-2">
|
||||||
|
<div>
|
||||||
|
<h2 className="text-2xl font-bold tracking-tight">
|
||||||
|
Welcome back!
|
||||||
|
</h2>
|
||||||
|
<p className="text-muted-foreground">
|
||||||
|
Here's a list of your tasks for this month!
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div className="flex items-center space-x-2">
|
||||||
|
<UserNav />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<DataTable :data="tasks" :columns="columns" />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
106
apps/www/src/examples/tasks/components/DataTable.vue
Normal file
106
apps/www/src/examples/tasks/components/DataTable.vue
Normal file
|
|
@ -0,0 +1,106 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
import type {
|
||||||
|
ColumnDef,
|
||||||
|
ColumnFiltersState,
|
||||||
|
SortingState,
|
||||||
|
VisibilityState,
|
||||||
|
} from '@tanstack/vue-table'
|
||||||
|
import {
|
||||||
|
FlexRender,
|
||||||
|
getCoreRowModel,
|
||||||
|
getFacetedRowModel,
|
||||||
|
getFacetedUniqueValues,
|
||||||
|
getFilteredRowModel,
|
||||||
|
getPaginationRowModel,
|
||||||
|
getSortedRowModel,
|
||||||
|
useVueTable,
|
||||||
|
} from '@tanstack/vue-table'
|
||||||
|
|
||||||
|
import { ref } from 'vue'
|
||||||
|
import { type Task } from '../data/schema'
|
||||||
|
import DataTablePagination from './DataTablePagination.vue'
|
||||||
|
import DataTableToolbar from './DataTableToolbar.vue'
|
||||||
|
import { valueUpdater } from '@/lib/utils'
|
||||||
|
import {
|
||||||
|
Table,
|
||||||
|
TableBody,
|
||||||
|
TableCell,
|
||||||
|
TableHead,
|
||||||
|
TableHeader,
|
||||||
|
TableRow,
|
||||||
|
} from '@/lib/registry/default/ui/table'
|
||||||
|
|
||||||
|
interface DataTableProps {
|
||||||
|
columns: ColumnDef<Task, any>[]
|
||||||
|
data: Task[]
|
||||||
|
}
|
||||||
|
const props = defineProps<DataTableProps>()
|
||||||
|
|
||||||
|
const sorting = ref<SortingState>([])
|
||||||
|
const columnFilters = ref<ColumnFiltersState>([])
|
||||||
|
const columnVisibility = ref<VisibilityState>({})
|
||||||
|
const rowSelection = ref({})
|
||||||
|
|
||||||
|
const table = useVueTable({
|
||||||
|
data: props.data,
|
||||||
|
columns: props.columns,
|
||||||
|
state: {
|
||||||
|
get sorting() { return sorting.value },
|
||||||
|
get columnFilters() { return columnFilters.value },
|
||||||
|
get columnVisibility() { return columnVisibility.value },
|
||||||
|
get rowSelection() { return rowSelection.value },
|
||||||
|
},
|
||||||
|
enableRowSelection: true,
|
||||||
|
onSortingChange: updaterOrValue => valueUpdater(updaterOrValue, sorting),
|
||||||
|
onColumnFiltersChange: updaterOrValue => valueUpdater(updaterOrValue, columnFilters),
|
||||||
|
onColumnVisibilityChange: updaterOrValue => valueUpdater(updaterOrValue, columnVisibility),
|
||||||
|
onRowSelectionChange: updaterOrValue => valueUpdater(updaterOrValue, rowSelection),
|
||||||
|
getCoreRowModel: getCoreRowModel(),
|
||||||
|
getFilteredRowModel: getFilteredRowModel(),
|
||||||
|
getPaginationRowModel: getPaginationRowModel(),
|
||||||
|
getSortedRowModel: getSortedRowModel(),
|
||||||
|
getFacetedRowModel: getFacetedRowModel(),
|
||||||
|
getFacetedUniqueValues: getFacetedUniqueValues(),
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div className="space-y-4">
|
||||||
|
<DataTableToolbar :table="table" />
|
||||||
|
<div className="rounded-md border">
|
||||||
|
<Table>
|
||||||
|
<TableHeader>
|
||||||
|
<TableRow v-for="headerGroup in table.getHeaderGroups()" :key="headerGroup.id">
|
||||||
|
<TableHead v-for="header in headerGroup.headers" :key="header.id">
|
||||||
|
<FlexRender v-if="!header.isPlaceholder" :render="header.column.columnDef.header" :props="header.getContext()" />
|
||||||
|
</TableHead>
|
||||||
|
</TableRow>
|
||||||
|
</TableHeader>
|
||||||
|
<TableBody>
|
||||||
|
<template v-if="table.getRowModel().rows?.length">
|
||||||
|
<TableRow
|
||||||
|
v-for="row in table.getRowModel().rows"
|
||||||
|
:key="row.id"
|
||||||
|
:data-state="row.getIsSelected() && 'selected'"
|
||||||
|
>
|
||||||
|
<TableCell v-for="cell in row.getVisibleCells()" :key="cell.id">
|
||||||
|
<FlexRender :render="cell.column.columnDef.cell" :props="cell.getContext()" />
|
||||||
|
</TableCell>
|
||||||
|
</TableRow>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<TableRow v-else>
|
||||||
|
<TableCell
|
||||||
|
col-span="{columns.length}"
|
||||||
|
class="h-24 text-center"
|
||||||
|
>
|
||||||
|
No results.
|
||||||
|
</TableCell>
|
||||||
|
</TableRow>
|
||||||
|
</TableBody>
|
||||||
|
</Table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<DataTablePagination :table="table" />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
@ -0,0 +1,69 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
import type { Column } from '@tanstack/vue-table'
|
||||||
|
import { type Task } from '../data/schema'
|
||||||
|
import ArrowDownIcon from '~icons/radix-icons/arrow-down'
|
||||||
|
import ArrowUpIcon from '~icons/radix-icons/arrow-up'
|
||||||
|
import CaretSortIcon from '~icons/radix-icons/caret-sort'
|
||||||
|
import EyeNoneIcon from '~icons/radix-icons/eye-none'
|
||||||
|
|
||||||
|
import { cn } from '@/lib/utils'
|
||||||
|
import { Button } from '@/lib/registry/default/ui/button'
|
||||||
|
import {
|
||||||
|
DropdownMenu,
|
||||||
|
DropdownMenuContent,
|
||||||
|
DropdownMenuItem,
|
||||||
|
DropdownMenuSeparator,
|
||||||
|
DropdownMenuTrigger,
|
||||||
|
} from '@/lib/registry/default/ui/dropdown-menu'
|
||||||
|
|
||||||
|
interface DataTableColumnHeaderProps {
|
||||||
|
column: Column<Task, any>
|
||||||
|
title: string
|
||||||
|
}
|
||||||
|
|
||||||
|
defineProps<DataTableColumnHeaderProps>()
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
export default {
|
||||||
|
inheritAttrs: false,
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div v-if="column.getCanSort()" :class="cn('flex items-center space-x-2', $attrs.class ?? '')">
|
||||||
|
<DropdownMenu>
|
||||||
|
<DropdownMenuTrigger as-child>
|
||||||
|
<Button
|
||||||
|
variant="ghost"
|
||||||
|
size="sm"
|
||||||
|
class="-ml-3 h-8 data-[state=open]:bg-accent"
|
||||||
|
>
|
||||||
|
<span>{{ title }}</span>
|
||||||
|
<ArrowDownIcon v-if="column.getIsSorted() === 'desc'" class="ml-2 h-4 w-4" />
|
||||||
|
<ArrowUpIcon v-else-if=" column.getIsSorted() === 'asc'" class="ml-2 h-4 w-4" />
|
||||||
|
<CaretSortIcon v-else class="ml-2 h-4 w-4" />
|
||||||
|
</Button>
|
||||||
|
</DropdownMenuTrigger>
|
||||||
|
<DropdownMenuContent align="start">
|
||||||
|
<DropdownMenuItem @click="column.toggleSorting(false)">
|
||||||
|
<ArrowUpIcon class="mr-2 h-3.5 w-3.5 text-muted-foreground/70" />
|
||||||
|
Asc
|
||||||
|
</DropdownMenuItem>
|
||||||
|
<DropdownMenuItem @click="column.toggleSorting(true)">
|
||||||
|
<ArrowDownIcon class="mr-2 h-3.5 w-3.5 text-muted-foreground/70" />
|
||||||
|
Desc
|
||||||
|
</DropdownMenuItem>
|
||||||
|
<DropdownMenuSeparator />
|
||||||
|
<DropdownMenuItem @click="column.toggleVisibility(false)">
|
||||||
|
<EyeNoneIcon class="mr-2 h-3.5 w-3.5 text-muted-foreground/70" />
|
||||||
|
Hide
|
||||||
|
</DropdownMenuItem>
|
||||||
|
</DropdownMenuContent>
|
||||||
|
</DropdownMenu>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div v-else :class="$attrs.class">
|
||||||
|
{{ title }}
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
@ -0,0 +1,135 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
import type { Column } from '@tanstack/vue-table'
|
||||||
|
import type { Component } from 'vue'
|
||||||
|
import { computed } from 'vue'
|
||||||
|
import { type Task } from '../data/schema'
|
||||||
|
import PlusCircledIcon from '~icons/radix-icons/plus-circled'
|
||||||
|
|
||||||
|
import { Badge } from '@/lib/registry/default/ui/badge'
|
||||||
|
import { Button } from '@/lib/registry/default/ui/button'
|
||||||
|
|
||||||
|
import {
|
||||||
|
Popover,
|
||||||
|
PopoverContent,
|
||||||
|
PopoverTrigger,
|
||||||
|
} from '@/lib/registry/default/ui/popover'
|
||||||
|
import { Separator } from '@/lib/registry/default/ui/separator'
|
||||||
|
|
||||||
|
interface DataTableFacetedFilter {
|
||||||
|
column?: Column<Task, any>
|
||||||
|
title?: string
|
||||||
|
options: {
|
||||||
|
label: string
|
||||||
|
value: string
|
||||||
|
icon?: Component
|
||||||
|
}[]
|
||||||
|
}
|
||||||
|
|
||||||
|
const props = defineProps<DataTableFacetedFilter>()
|
||||||
|
|
||||||
|
const facets = computed(() => props.column?.getFacetedUniqueValues())
|
||||||
|
const selectedValues = computed(() => new Set(props.column?.getFilterValue() as string[]))
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<Popover>
|
||||||
|
<PopoverTrigger as-child>
|
||||||
|
<Button variant="outline" size="sm" class="h-8 border-dashed">
|
||||||
|
<PlusCircledIcon class="mr-2 h-4 w-4" />
|
||||||
|
{{ title }}
|
||||||
|
<template v-if="selectedValues.size > 0">
|
||||||
|
<Separator orientation="vertical" class="mx-2 h-4" />
|
||||||
|
<Badge
|
||||||
|
variant="secondary"
|
||||||
|
class="rounded-sm px-1 font-normal lg:hidden"
|
||||||
|
>
|
||||||
|
{{ selectedValues.size }}
|
||||||
|
</Badge>
|
||||||
|
<div class="hidden space-x-1 lg:flex">
|
||||||
|
<Badge
|
||||||
|
v-if="selectedValues.size > 2"
|
||||||
|
variant="secondary"
|
||||||
|
class="rounded-sm px-1 font-normal"
|
||||||
|
>
|
||||||
|
{{ selectedValues.size }} selected
|
||||||
|
</Badge>
|
||||||
|
|
||||||
|
<template v-else>
|
||||||
|
<Badge
|
||||||
|
v-for="option in options
|
||||||
|
.filter((option) => selectedValues.has(option.value))"
|
||||||
|
:key="option.value"
|
||||||
|
variant="secondary"
|
||||||
|
class="rounded-sm px-1 font-normal"
|
||||||
|
>
|
||||||
|
{{ option.label }}
|
||||||
|
</Badge>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</Button>
|
||||||
|
</PopoverTrigger>
|
||||||
|
<PopoverContent class="w-[200px] p-0" align="start">
|
||||||
|
<!-- <Command>
|
||||||
|
<CommandInput placeholder={title} />
|
||||||
|
<CommandList>
|
||||||
|
<CommandEmpty>No results found.</CommandEmpty>
|
||||||
|
<CommandGroup>
|
||||||
|
{options.map((option) => {
|
||||||
|
const isSelected = selectedValues.has(option.value)
|
||||||
|
return (
|
||||||
|
<CommandItem
|
||||||
|
key={option.value}
|
||||||
|
onSelect={() => {
|
||||||
|
if (isSelected) {
|
||||||
|
selectedValues.delete(option.value)
|
||||||
|
} else {
|
||||||
|
selectedValues.add(option.value)
|
||||||
|
}
|
||||||
|
const filterValues = Array.from(selectedValues)
|
||||||
|
column?.setFilterValue(
|
||||||
|
filterValues.length ? filterValues : undefined
|
||||||
|
)
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class={cn(
|
||||||
|
"mr-2 flex h-4 w-4 items-center justify-center rounded-sm border border-primary",
|
||||||
|
isSelected
|
||||||
|
? "bg-primary text-primary-foreground"
|
||||||
|
: "opacity-50 [&_svg]:invisible"
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
<CheckIcon class={cn("h-4 w-4")} />
|
||||||
|
</div>
|
||||||
|
{option.icon && (
|
||||||
|
<option.icon class="mr-2 h-4 w-4 text-muted-foreground" />
|
||||||
|
)}
|
||||||
|
<span>{option.label}</span>
|
||||||
|
{facets?.get(option.value) && (
|
||||||
|
<span class="ml-auto flex h-4 w-4 items-center justify-center font-mono text-xs">
|
||||||
|
{facets.get(option.value)}
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
|
</CommandItem>
|
||||||
|
)
|
||||||
|
})}
|
||||||
|
</CommandGroup>
|
||||||
|
{selectedValues.size > 0 && (
|
||||||
|
<>
|
||||||
|
<CommandSeparator />
|
||||||
|
<CommandGroup>
|
||||||
|
<CommandItem
|
||||||
|
onSelect={() => column?.setFilterValue(undefined)}
|
||||||
|
class="justify-center text-center"
|
||||||
|
>
|
||||||
|
Clear filters
|
||||||
|
</CommandItem>
|
||||||
|
</CommandGroup>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</CommandList>
|
||||||
|
</Command> -->
|
||||||
|
</PopoverContent>
|
||||||
|
</Popover>
|
||||||
|
</template>
|
||||||
|
|
@ -0,0 +1,93 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { type Table } from '@tanstack/vue-table'
|
||||||
|
import { type Task } from '../data/schema'
|
||||||
|
import ChevronLeftIcon from '~icons/radix-icons/chevron-left'
|
||||||
|
import ChevronRightIcon from '~icons/radix-icons/chevron-right'
|
||||||
|
import DoubleArrowLeftIcon from '~icons/radix-icons/double-arrow-left'
|
||||||
|
import DoubleArrowRightIcon from '~icons/radix-icons/double-arrow-right'
|
||||||
|
|
||||||
|
import { Button } from '@/lib/registry/default/ui/button'
|
||||||
|
import {
|
||||||
|
Select,
|
||||||
|
SelectContent,
|
||||||
|
SelectItem,
|
||||||
|
SelectTrigger,
|
||||||
|
SelectValue,
|
||||||
|
} from '@/lib/registry/default/ui/select'
|
||||||
|
|
||||||
|
interface DataTablePaginationProps {
|
||||||
|
table: Table<Task>
|
||||||
|
}
|
||||||
|
defineProps<DataTablePaginationProps>()
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="flex items-center justify-between px-2">
|
||||||
|
<div class="flex-1 text-sm text-muted-foreground">
|
||||||
|
{{ table.getFilteredSelectedRowModel().rows.length }} of
|
||||||
|
{{ table.getFilteredRowModel().rows.length }} row(s) selected.
|
||||||
|
</div>
|
||||||
|
<div class="flex items-center space-x-6 lg:space-x-8">
|
||||||
|
<div class="flex items-center space-x-2">
|
||||||
|
<p class="text-sm font-medium">
|
||||||
|
Rows per page
|
||||||
|
</p>
|
||||||
|
<Select
|
||||||
|
:model-value="`${table.getState().pagination.pageSize}`"
|
||||||
|
@update:model-value="table.setPageSize"
|
||||||
|
>
|
||||||
|
<SelectTrigger class="h-8 w-[70px]">
|
||||||
|
<SelectValue :placeholder="`${table.getState().pagination.pageSize}`" />
|
||||||
|
</SelectTrigger>
|
||||||
|
<SelectContent side="top">
|
||||||
|
<SelectItem v-for="pageSize in [10, 20, 30, 40, 50]" :key="pageSize" :value="`${pageSize}`">
|
||||||
|
{{ pageSize }}
|
||||||
|
</SelectItem>
|
||||||
|
</SelectContent>
|
||||||
|
</Select>
|
||||||
|
</div>
|
||||||
|
<div class="flex w-[100px] items-center justify-center text-sm font-medium">
|
||||||
|
Page {{ table.getState().pagination.pageIndex + 1 }} of
|
||||||
|
{{ table.getPageCount() }}
|
||||||
|
</div>
|
||||||
|
<div class="flex items-center space-x-2">
|
||||||
|
<Button
|
||||||
|
variant="outline"
|
||||||
|
class="hidden h-8 w-8 p-0 lg:flex"
|
||||||
|
:disabled="!table.getCanPreviousPage()"
|
||||||
|
@click="table.setPageIndex(0)"
|
||||||
|
>
|
||||||
|
<span class="sr-only">Go to first page</span>
|
||||||
|
<DoubleArrowLeftIcon class="h-4 w-4" />
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
variant="outline"
|
||||||
|
class="h-8 w-8 p-0"
|
||||||
|
:disabled="!table.getCanPreviousPage()"
|
||||||
|
@click="table.previousPage()"
|
||||||
|
>
|
||||||
|
<span class="sr-only">Go to previous page</span>
|
||||||
|
<ChevronLeftIcon class="h-4 w-4" />
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
variant="outline"
|
||||||
|
class="h-8 w-8 p-0"
|
||||||
|
:disabled="!table.getCanNextPage()"
|
||||||
|
@click="table.nextPage()"
|
||||||
|
>
|
||||||
|
<span class="sr-only">Go to next page</span>
|
||||||
|
<ChevronRightIcon class="h-4 w-4" />
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
variant="outline"
|
||||||
|
class="hidden h-8 w-8 p-0 lg:flex"
|
||||||
|
:disabled="!table.getCanNextPage()"
|
||||||
|
@click="table.setPageIndex(table.getPageCount() - 1)"
|
||||||
|
>
|
||||||
|
<span class="sr-only">Go to last page</span>
|
||||||
|
<DoubleArrowRightIcon class="h-4 w-4" />
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
@ -0,0 +1,65 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
import type { Row } from '@tanstack/vue-table'
|
||||||
|
import { computed } from 'vue'
|
||||||
|
import { labels } from '../data/data'
|
||||||
|
import { taskSchema } from '../data/schema'
|
||||||
|
import { type Task } from '../data/schema'
|
||||||
|
import DotsHorizontalIcon from '~icons/radix-icons/dots-horizontal'
|
||||||
|
|
||||||
|
import { Button } from '@/lib/registry/default/ui/button'
|
||||||
|
import {
|
||||||
|
DropdownMenu,
|
||||||
|
DropdownMenuContent,
|
||||||
|
DropdownMenuItem,
|
||||||
|
DropdownMenuRadioGroup,
|
||||||
|
DropdownMenuRadioItem,
|
||||||
|
DropdownMenuSeparator,
|
||||||
|
DropdownMenuShortcut,
|
||||||
|
DropdownMenuSub,
|
||||||
|
DropdownMenuSubContent,
|
||||||
|
DropdownMenuSubTrigger,
|
||||||
|
DropdownMenuTrigger,
|
||||||
|
} from '@/lib/registry/default/ui/dropdown-menu'
|
||||||
|
|
||||||
|
interface DataTableRowActionsProps {
|
||||||
|
row: Row<Task>
|
||||||
|
}
|
||||||
|
const props = defineProps<DataTableRowActionsProps>()
|
||||||
|
|
||||||
|
const task = computed(() => taskSchema.parse(props.row.original))
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<DropdownMenu>
|
||||||
|
<DropdownMenuTrigger as-child>
|
||||||
|
<Button
|
||||||
|
variant="ghost"
|
||||||
|
class="flex h-8 w-8 p-0 data-[state=open]:bg-muted"
|
||||||
|
>
|
||||||
|
<DotsHorizontalIcon class="h-4 w-4" />
|
||||||
|
<span class="sr-only">Open menu</span>
|
||||||
|
</Button>
|
||||||
|
</DropdownMenuTrigger>
|
||||||
|
<DropdownMenuContent align="end" class="w-[160px]">
|
||||||
|
<DropdownMenuItem>Edit</DropdownMenuItem>
|
||||||
|
<DropdownMenuItem>Make a copy</DropdownMenuItem>
|
||||||
|
<DropdownMenuItem>Favorite</DropdownMenuItem>
|
||||||
|
<DropdownMenuSeparator />
|
||||||
|
<DropdownMenuSub>
|
||||||
|
<DropdownMenuSubTrigger>Labels</DropdownMenuSubTrigger>
|
||||||
|
<DropdownMenuSubContent>
|
||||||
|
<DropdownMenuRadioGroup :value="task.label">
|
||||||
|
<DropdownMenuRadioItem v-for="label in labels" :key="label.value" :value="label.value">
|
||||||
|
{{ label.label }}
|
||||||
|
</DropdownMenuRadioItem>
|
||||||
|
</DropdownMenuRadioGroup>
|
||||||
|
</DropdownMenuSubContent>
|
||||||
|
</DropdownMenuSub>
|
||||||
|
<DropdownMenuSeparator />
|
||||||
|
<DropdownMenuItem>
|
||||||
|
Delete
|
||||||
|
<DropdownMenuShortcut>⌘⌫</DropdownMenuShortcut>
|
||||||
|
</DropdownMenuItem>
|
||||||
|
</DropdownMenuContent>
|
||||||
|
</DropdownMenu>
|
||||||
|
</template>
|
||||||
56
apps/www/src/examples/tasks/components/DataTableToolbar.vue
Normal file
56
apps/www/src/examples/tasks/components/DataTableToolbar.vue
Normal file
|
|
@ -0,0 +1,56 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { type Table } from '@tanstack/vue-table'
|
||||||
|
import { computed } from 'vue'
|
||||||
|
import { type Task } from '../data/schema'
|
||||||
|
|
||||||
|
import { priorities, statuses } from '../data/data'
|
||||||
|
import DataTableFacetedFilter from './DataTableFacetedFilter.vue'
|
||||||
|
import DataTableViewOptions from './DataTableViewOptions.vue'
|
||||||
|
import Cross2Icon from '~icons/radix-icons/cross-2'
|
||||||
|
import { Button } from '@/lib/registry/default/ui/button'
|
||||||
|
import { Input } from '@/lib/registry/default/ui/input'
|
||||||
|
|
||||||
|
interface DataTableToolbarProps {
|
||||||
|
table: Table<Task>
|
||||||
|
}
|
||||||
|
|
||||||
|
const props = defineProps<DataTableToolbarProps>()
|
||||||
|
|
||||||
|
const isFiltered = computed(() => props.table.getState().columnFilters.length > 0)
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="flex items-center justify-between">
|
||||||
|
<div class="flex flex-1 items-center space-x-2">
|
||||||
|
<Input
|
||||||
|
placeholder="Filter tasks..."
|
||||||
|
:model-value="(table.getColumn('title')?.getFilterValue() as string) ?? ''"
|
||||||
|
class="h-8 w-[150px] lg:w-[250px]"
|
||||||
|
@input="table.getColumn('title')?.setFilterValue($event.target.value)"
|
||||||
|
/>
|
||||||
|
<DataTableFacetedFilter
|
||||||
|
v-if="table.getColumn('status')"
|
||||||
|
:column="table.getColumn('status')"
|
||||||
|
title="Status"
|
||||||
|
:options="statuses"
|
||||||
|
/>
|
||||||
|
<DataTableFacetedFilter
|
||||||
|
v-if="table.getColumn('priority')"
|
||||||
|
:column="table.getColumn('priority')"
|
||||||
|
title="Priority"
|
||||||
|
:options="priorities"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Button
|
||||||
|
v-if="isFiltered"
|
||||||
|
variant="ghost"
|
||||||
|
class="h-8 px-2 lg:px-3"
|
||||||
|
@click="table.resetColumnFilters()"
|
||||||
|
>
|
||||||
|
Reset
|
||||||
|
<Cross2Icon class="ml-2 h-4 w-4" />
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
<DataTableViewOptions :table="table" />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
@ -0,0 +1,57 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
import type { Table } from '@tanstack/vue-table'
|
||||||
|
import { computed } from 'vue'
|
||||||
|
import { type Task } from '../data/schema'
|
||||||
|
import MixerHorizontalIcon from '~icons/radix-icons/mixer-horizontal'
|
||||||
|
|
||||||
|
import { Button } from '@/lib/registry/default/ui/button'
|
||||||
|
import {
|
||||||
|
DropdownMenu,
|
||||||
|
DropdownMenuCheckboxItem,
|
||||||
|
DropdownMenuContent,
|
||||||
|
DropdownMenuLabel,
|
||||||
|
DropdownMenuSeparator,
|
||||||
|
DropdownMenuTrigger,
|
||||||
|
} from '@/lib/registry/default/ui/dropdown-menu'
|
||||||
|
|
||||||
|
interface DataTableViewOptionsProps {
|
||||||
|
table: Table<Task>
|
||||||
|
}
|
||||||
|
|
||||||
|
const props = defineProps<DataTableViewOptionsProps>()
|
||||||
|
|
||||||
|
const columns = computed(() => props.table.getAllColumns()
|
||||||
|
.filter(
|
||||||
|
column =>
|
||||||
|
typeof column.accessorFn !== 'undefined' && column.getCanHide(),
|
||||||
|
))
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<DropdownMenu>
|
||||||
|
<DropdownMenuTrigger as-child>
|
||||||
|
<Button
|
||||||
|
variant="outline"
|
||||||
|
size="sm"
|
||||||
|
class="ml-auto hidden h-8 lg:flex"
|
||||||
|
>
|
||||||
|
<MixerHorizontalIcon class="mr-2 h-4 w-4" />
|
||||||
|
View
|
||||||
|
</Button>
|
||||||
|
</DropdownMenuTrigger>
|
||||||
|
<DropdownMenuContent align="end" class="w-[150px]">
|
||||||
|
<DropdownMenuLabel>Toggle columns</DropdownMenuLabel>
|
||||||
|
<DropdownMenuSeparator />
|
||||||
|
|
||||||
|
<DropdownMenuCheckboxItem
|
||||||
|
v-for="column in columns"
|
||||||
|
:key="column.id"
|
||||||
|
class="capitalize"
|
||||||
|
:checked="column.getIsVisible()"
|
||||||
|
@update:checked="(value) => column.toggleVisibility(!!value)"
|
||||||
|
>
|
||||||
|
{{ column.id }}
|
||||||
|
</DropdownMenuCheckboxItem>
|
||||||
|
</DropdownMenuContent>
|
||||||
|
</DropdownMenu>
|
||||||
|
</template>
|
||||||
64
apps/www/src/examples/tasks/components/UserNav.vue
Normal file
64
apps/www/src/examples/tasks/components/UserNav.vue
Normal file
|
|
@ -0,0 +1,64 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
import {
|
||||||
|
Avatar,
|
||||||
|
AvatarFallback,
|
||||||
|
AvatarImage,
|
||||||
|
} from '@/lib/registry/default/ui/avatar'
|
||||||
|
import { Button } from '@/lib/registry/default/ui/button'
|
||||||
|
import {
|
||||||
|
DropdownMenu,
|
||||||
|
DropdownMenuContent,
|
||||||
|
DropdownMenuGroup,
|
||||||
|
DropdownMenuItem,
|
||||||
|
DropdownMenuLabel,
|
||||||
|
DropdownMenuSeparator,
|
||||||
|
DropdownMenuShortcut,
|
||||||
|
DropdownMenuTrigger,
|
||||||
|
} from '@/lib/registry/default/ui/dropdown-menu'
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<DropdownMenu>
|
||||||
|
<DropdownMenuTrigger as-child>
|
||||||
|
<Button variant="ghost" class="relative h-8 w-8 rounded-full">
|
||||||
|
<Avatar class="h-9 w-9">
|
||||||
|
<AvatarImage src="/avatars/03.png" alt="@shadcn" />
|
||||||
|
<AvatarFallback>SC</AvatarFallback>
|
||||||
|
</Avatar>
|
||||||
|
</Button>
|
||||||
|
</DropdownMenuTrigger>
|
||||||
|
<DropdownMenuContent class="w-56" align="end" force-mount>
|
||||||
|
<DropdownMenuLabel class="font-normal flex">
|
||||||
|
<div class="flex flex-col space-y-1">
|
||||||
|
<p class="text-sm font-medium leading-none">
|
||||||
|
shadcn
|
||||||
|
</p>
|
||||||
|
<p class="text-xs leading-none text-muted-foreground">
|
||||||
|
m@example.com
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</DropdownMenuLabel>
|
||||||
|
<DropdownMenuSeparator />
|
||||||
|
<DropdownMenuGroup>
|
||||||
|
<DropdownMenuItem>
|
||||||
|
Profile
|
||||||
|
<DropdownMenuShortcut>⇧⌘P</DropdownMenuShortcut>
|
||||||
|
</DropdownMenuItem>
|
||||||
|
<DropdownMenuItem>
|
||||||
|
Billing
|
||||||
|
<DropdownMenuShortcut>⌘B</DropdownMenuShortcut>
|
||||||
|
</DropdownMenuItem>
|
||||||
|
<DropdownMenuItem>
|
||||||
|
Settings
|
||||||
|
<DropdownMenuShortcut>⌘S</DropdownMenuShortcut>
|
||||||
|
</DropdownMenuItem>
|
||||||
|
<DropdownMenuItem>New Team</DropdownMenuItem>
|
||||||
|
</DropdownMenuGroup>
|
||||||
|
<DropdownMenuSeparator />
|
||||||
|
<DropdownMenuItem>
|
||||||
|
Log out
|
||||||
|
<DropdownMenuShortcut>⇧⌘Q</DropdownMenuShortcut>
|
||||||
|
</DropdownMenuItem>
|
||||||
|
</DropdownMenuContent>
|
||||||
|
</DropdownMenu>
|
||||||
|
</template>
|
||||||
86
apps/www/src/examples/tasks/components/columns.ts
Normal file
86
apps/www/src/examples/tasks/components/columns.ts
Normal file
|
|
@ -0,0 +1,86 @@
|
||||||
|
import type { ColumnDef } from '@tanstack/vue-table'
|
||||||
|
import { h } from 'vue'
|
||||||
|
|
||||||
|
import { labels, priorities, statuses } from '../data/data'
|
||||||
|
import type { Task } from '../data/schema'
|
||||||
|
import DataTableColumnHeader from './DataTableColumnHeader.vue'
|
||||||
|
import DataTableRowActions from './DataTableRowActions.vue'
|
||||||
|
import { Checkbox } from '@/lib/registry/default/ui/checkbox'
|
||||||
|
import { Badge } from '@/lib/registry/default/ui/badge'
|
||||||
|
|
||||||
|
export const columns: ColumnDef<Task>[] = [
|
||||||
|
{
|
||||||
|
id: 'select',
|
||||||
|
header: ({ table }) => h(Checkbox,
|
||||||
|
{ 'checked': table.getIsAllPageRowsSelected(), 'onUpdate:checked': value => table.toggleAllPageRowsSelected(!!value), 'ariaLabel': 'Select all', 'class': 'translate-y-[2px]' }),
|
||||||
|
cell: ({ row }) => h(Checkbox,
|
||||||
|
{ 'checked': row.getIsSelected(), 'onUpdate:checked': value => row.toggleSelected(!!value), 'ariaLabel': 'Select row', 'class': 'translate-y-[2px]' }),
|
||||||
|
enableSorting: false,
|
||||||
|
enableHiding: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
accessorKey: 'id',
|
||||||
|
header: ({ column }) => h(DataTableColumnHeader, { column, title: 'Task' }),
|
||||||
|
cell: ({ row }) => h('div', { class: 'w-[80px]' }, row.getValue('id')),
|
||||||
|
enableSorting: false,
|
||||||
|
enableHiding: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
accessorKey: 'title',
|
||||||
|
header: ({ column }) => h(DataTableColumnHeader, { column, title: 'Title' }),
|
||||||
|
|
||||||
|
cell: ({ row }) => {
|
||||||
|
const label = labels.find(label => label.value === row.original.label)
|
||||||
|
|
||||||
|
return h('div', { class: 'flex space-x-2' }, [
|
||||||
|
label && h(Badge, { variant: 'outline' }, label.label),
|
||||||
|
h('span', { class: 'max-w-[500px] truncate font-medium' }, row.getValue('title')),
|
||||||
|
])
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
accessorKey: 'status',
|
||||||
|
header: ({ column }) => h(DataTableColumnHeader, { column, title: 'Status' }),
|
||||||
|
|
||||||
|
cell: ({ row }) => {
|
||||||
|
const status = statuses.find(
|
||||||
|
status => status.value === row.getValue('status'),
|
||||||
|
)
|
||||||
|
|
||||||
|
if (!status)
|
||||||
|
return null
|
||||||
|
|
||||||
|
return h('div', { class: 'flex w-[100px] items-center' }, [
|
||||||
|
status.icon && h(status.icon, { class: 'mr-2 h-4 w-4 text-muted-foreground' }),
|
||||||
|
h('span', status.label),
|
||||||
|
])
|
||||||
|
},
|
||||||
|
filterFn: (row, id, value) => {
|
||||||
|
return value.includes(row.getValue(id))
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
accessorKey: 'priority',
|
||||||
|
header: ({ column }) => h(DataTableColumnHeader, { column, title: 'Priority' }),
|
||||||
|
cell: ({ row }) => {
|
||||||
|
const priority = priorities.find(
|
||||||
|
priority => priority.value === row.getValue('priority'),
|
||||||
|
)
|
||||||
|
|
||||||
|
if (!priority)
|
||||||
|
return null
|
||||||
|
|
||||||
|
return h('div', { class: 'flex items-center' }, [
|
||||||
|
priority.icon && h(priority.icon, { class: 'mr-2 h-4 w-4 text-muted-foreground' }),
|
||||||
|
h('span', priority.label),
|
||||||
|
])
|
||||||
|
},
|
||||||
|
filterFn: (row, id, value) => {
|
||||||
|
return value.includes(row.getValue(id))
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'actions',
|
||||||
|
cell: ({ row }) => h(DataTableRowActions, { row }),
|
||||||
|
},
|
||||||
|
]
|
||||||
70
apps/www/src/examples/tasks/data/data.ts
Normal file
70
apps/www/src/examples/tasks/data/data.ts
Normal file
|
|
@ -0,0 +1,70 @@
|
||||||
|
import { h } from 'vue'
|
||||||
|
import ArrowDownIcon from '~icons/radix-icons/arrow-down'
|
||||||
|
import ArrowRightIcon from '~icons/radix-icons/arrow-right'
|
||||||
|
import ArrowUpIcon from '~icons/radix-icons/arrow-up'
|
||||||
|
import CheckCircledIcon from '~icons/radix-icons/check-circled'
|
||||||
|
import CircleIcon from '~icons/radix-icons/circle'
|
||||||
|
import CrossCircledIcon from '~icons/radix-icons/cross-circled'
|
||||||
|
import QuestionMarkCircledIcon from '~icons/radix-icons/question-mark-circled'
|
||||||
|
import StopwatchIcon from '~icons/radix-icons/stopwatch'
|
||||||
|
|
||||||
|
export const labels = [
|
||||||
|
{
|
||||||
|
value: 'bug',
|
||||||
|
label: 'Bug',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'feature',
|
||||||
|
label: 'Feature',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'documentation',
|
||||||
|
label: 'Documentation',
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
export const statuses = [
|
||||||
|
{
|
||||||
|
value: 'backlog',
|
||||||
|
label: 'Backlog',
|
||||||
|
icon: h(QuestionMarkCircledIcon),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'todo',
|
||||||
|
label: 'Todo',
|
||||||
|
icon: h(CircleIcon),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'in progress',
|
||||||
|
label: 'In Progress',
|
||||||
|
icon: h(StopwatchIcon),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'done',
|
||||||
|
label: 'Done',
|
||||||
|
icon: h(CheckCircledIcon),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'canceled',
|
||||||
|
label: 'Canceled',
|
||||||
|
icon: h(CrossCircledIcon),
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
export const priorities = [
|
||||||
|
{
|
||||||
|
label: 'Low',
|
||||||
|
value: 'low',
|
||||||
|
icon: h(ArrowDownIcon),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Medium',
|
||||||
|
value: 'medium',
|
||||||
|
icon: h(ArrowRightIcon),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'High',
|
||||||
|
value: 'high',
|
||||||
|
icon: h(ArrowUpIcon),
|
||||||
|
},
|
||||||
|
]
|
||||||
13
apps/www/src/examples/tasks/data/schema.ts
Normal file
13
apps/www/src/examples/tasks/data/schema.ts
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
import { z } from 'zod'
|
||||||
|
|
||||||
|
// We're keeping a simple non-relational schema here.
|
||||||
|
// IRL, you will have a schema for your data models.
|
||||||
|
export const taskSchema = z.object({
|
||||||
|
id: z.string(),
|
||||||
|
title: z.string(),
|
||||||
|
status: z.string(),
|
||||||
|
label: z.string(),
|
||||||
|
priority: z.string(),
|
||||||
|
})
|
||||||
|
|
||||||
|
export type Task = z.infer<typeof taskSchema>
|
||||||
702
apps/www/src/examples/tasks/data/tasks.json
Normal file
702
apps/www/src/examples/tasks/data/tasks.json
Normal file
|
|
@ -0,0 +1,702 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"id": "TASK-8782",
|
||||||
|
"title": "You can't compress the program without quantifying the open-source SSD pixel!",
|
||||||
|
"status": "in progress",
|
||||||
|
"label": "documentation",
|
||||||
|
"priority": "medium"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-7878",
|
||||||
|
"title": "Try to calculate the EXE feed, maybe it will index the multi-byte pixel!",
|
||||||
|
"status": "backlog",
|
||||||
|
"label": "documentation",
|
||||||
|
"priority": "medium"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-7839",
|
||||||
|
"title": "We need to bypass the neural TCP card!",
|
||||||
|
"status": "todo",
|
||||||
|
"label": "bug",
|
||||||
|
"priority": "high"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-5562",
|
||||||
|
"title": "The SAS interface is down, bypass the open-source pixel so we can back up the PNG bandwidth!",
|
||||||
|
"status": "backlog",
|
||||||
|
"label": "feature",
|
||||||
|
"priority": "medium"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-8686",
|
||||||
|
"title": "I'll parse the wireless SSL protocol, that should driver the API panel!",
|
||||||
|
"status": "canceled",
|
||||||
|
"label": "feature",
|
||||||
|
"priority": "medium"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-1280",
|
||||||
|
"title": "Use the digital TLS panel, then you can transmit the haptic system!",
|
||||||
|
"status": "done",
|
||||||
|
"label": "bug",
|
||||||
|
"priority": "high"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-7262",
|
||||||
|
"title": "The UTF8 application is down, parse the neural bandwidth so we can back up the PNG firewall!",
|
||||||
|
"status": "done",
|
||||||
|
"label": "feature",
|
||||||
|
"priority": "high"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-1138",
|
||||||
|
"title": "Generating the driver won't do anything, we need to quantify the 1080p SMTP bandwidth!",
|
||||||
|
"status": "in progress",
|
||||||
|
"label": "feature",
|
||||||
|
"priority": "medium"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-7184",
|
||||||
|
"title": "We need to program the back-end THX pixel!",
|
||||||
|
"status": "todo",
|
||||||
|
"label": "feature",
|
||||||
|
"priority": "low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-5160",
|
||||||
|
"title": "Calculating the bus won't do anything, we need to navigate the back-end JSON protocol!",
|
||||||
|
"status": "in progress",
|
||||||
|
"label": "documentation",
|
||||||
|
"priority": "high"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-5618",
|
||||||
|
"title": "Generating the driver won't do anything, we need to index the online SSL application!",
|
||||||
|
"status": "done",
|
||||||
|
"label": "documentation",
|
||||||
|
"priority": "medium"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-6699",
|
||||||
|
"title": "I'll transmit the wireless JBOD capacitor, that should hard drive the SSD feed!",
|
||||||
|
"status": "backlog",
|
||||||
|
"label": "documentation",
|
||||||
|
"priority": "medium"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-2858",
|
||||||
|
"title": "We need to override the online UDP bus!",
|
||||||
|
"status": "backlog",
|
||||||
|
"label": "bug",
|
||||||
|
"priority": "medium"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-9864",
|
||||||
|
"title": "I'll reboot the 1080p FTP panel, that should matrix the HEX hard drive!",
|
||||||
|
"status": "done",
|
||||||
|
"label": "bug",
|
||||||
|
"priority": "high"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-8404",
|
||||||
|
"title": "We need to generate the virtual HEX alarm!",
|
||||||
|
"status": "in progress",
|
||||||
|
"label": "bug",
|
||||||
|
"priority": "low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-5365",
|
||||||
|
"title": "Backing up the pixel won't do anything, we need to transmit the primary IB array!",
|
||||||
|
"status": "in progress",
|
||||||
|
"label": "documentation",
|
||||||
|
"priority": "low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-1780",
|
||||||
|
"title": "The CSS feed is down, index the bluetooth transmitter so we can compress the CLI protocol!",
|
||||||
|
"status": "todo",
|
||||||
|
"label": "documentation",
|
||||||
|
"priority": "high"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-6938",
|
||||||
|
"title": "Use the redundant SCSI application, then you can hack the optical alarm!",
|
||||||
|
"status": "todo",
|
||||||
|
"label": "documentation",
|
||||||
|
"priority": "high"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-9885",
|
||||||
|
"title": "We need to compress the auxiliary VGA driver!",
|
||||||
|
"status": "backlog",
|
||||||
|
"label": "bug",
|
||||||
|
"priority": "high"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-3216",
|
||||||
|
"title": "Transmitting the transmitter won't do anything, we need to compress the virtual HDD sensor!",
|
||||||
|
"status": "backlog",
|
||||||
|
"label": "documentation",
|
||||||
|
"priority": "medium"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-9285",
|
||||||
|
"title": "The IP monitor is down, copy the haptic alarm so we can generate the HTTP transmitter!",
|
||||||
|
"status": "todo",
|
||||||
|
"label": "bug",
|
||||||
|
"priority": "high"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-1024",
|
||||||
|
"title": "Overriding the microchip won't do anything, we need to transmit the digital OCR transmitter!",
|
||||||
|
"status": "in progress",
|
||||||
|
"label": "documentation",
|
||||||
|
"priority": "low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-7068",
|
||||||
|
"title": "You can't generate the capacitor without indexing the wireless HEX pixel!",
|
||||||
|
"status": "canceled",
|
||||||
|
"label": "bug",
|
||||||
|
"priority": "low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-6502",
|
||||||
|
"title": "Navigating the microchip won't do anything, we need to bypass the back-end SQL bus!",
|
||||||
|
"status": "todo",
|
||||||
|
"label": "bug",
|
||||||
|
"priority": "high"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-5326",
|
||||||
|
"title": "We need to hack the redundant UTF8 transmitter!",
|
||||||
|
"status": "todo",
|
||||||
|
"label": "bug",
|
||||||
|
"priority": "low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-6274",
|
||||||
|
"title": "Use the virtual PCI circuit, then you can parse the bluetooth alarm!",
|
||||||
|
"status": "canceled",
|
||||||
|
"label": "documentation",
|
||||||
|
"priority": "low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-1571",
|
||||||
|
"title": "I'll input the neural DRAM circuit, that should protocol the SMTP interface!",
|
||||||
|
"status": "in progress",
|
||||||
|
"label": "feature",
|
||||||
|
"priority": "medium"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-9518",
|
||||||
|
"title": "Compressing the interface won't do anything, we need to compress the online SDD matrix!",
|
||||||
|
"status": "canceled",
|
||||||
|
"label": "documentation",
|
||||||
|
"priority": "medium"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-5581",
|
||||||
|
"title": "I'll synthesize the digital COM pixel, that should transmitter the UTF8 protocol!",
|
||||||
|
"status": "backlog",
|
||||||
|
"label": "documentation",
|
||||||
|
"priority": "high"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-2197",
|
||||||
|
"title": "Parsing the feed won't do anything, we need to copy the bluetooth DRAM bus!",
|
||||||
|
"status": "todo",
|
||||||
|
"label": "documentation",
|
||||||
|
"priority": "low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-8484",
|
||||||
|
"title": "We need to parse the solid state UDP firewall!",
|
||||||
|
"status": "in progress",
|
||||||
|
"label": "bug",
|
||||||
|
"priority": "low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-9892",
|
||||||
|
"title": "If we back up the application, we can get to the UDP application through the multi-byte THX capacitor!",
|
||||||
|
"status": "done",
|
||||||
|
"label": "documentation",
|
||||||
|
"priority": "high"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-9616",
|
||||||
|
"title": "We need to synthesize the cross-platform ASCII pixel!",
|
||||||
|
"status": "in progress",
|
||||||
|
"label": "feature",
|
||||||
|
"priority": "medium"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-9744",
|
||||||
|
"title": "Use the back-end IP card, then you can input the solid state hard drive!",
|
||||||
|
"status": "done",
|
||||||
|
"label": "documentation",
|
||||||
|
"priority": "low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-1376",
|
||||||
|
"title": "Generating the alarm won't do anything, we need to generate the mobile IP capacitor!",
|
||||||
|
"status": "backlog",
|
||||||
|
"label": "documentation",
|
||||||
|
"priority": "low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-7382",
|
||||||
|
"title": "If we back up the firewall, we can get to the RAM alarm through the primary UTF8 pixel!",
|
||||||
|
"status": "todo",
|
||||||
|
"label": "feature",
|
||||||
|
"priority": "low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-2290",
|
||||||
|
"title": "I'll compress the virtual JSON panel, that should application the UTF8 bus!",
|
||||||
|
"status": "canceled",
|
||||||
|
"label": "documentation",
|
||||||
|
"priority": "high"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-1533",
|
||||||
|
"title": "You can't input the firewall without overriding the wireless TCP firewall!",
|
||||||
|
"status": "done",
|
||||||
|
"label": "bug",
|
||||||
|
"priority": "high"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-4920",
|
||||||
|
"title": "Bypassing the hard drive won't do anything, we need to input the bluetooth JSON program!",
|
||||||
|
"status": "in progress",
|
||||||
|
"label": "bug",
|
||||||
|
"priority": "high"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-5168",
|
||||||
|
"title": "If we synthesize the bus, we can get to the IP panel through the virtual TLS array!",
|
||||||
|
"status": "in progress",
|
||||||
|
"label": "feature",
|
||||||
|
"priority": "low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-7103",
|
||||||
|
"title": "We need to parse the multi-byte EXE bandwidth!",
|
||||||
|
"status": "canceled",
|
||||||
|
"label": "feature",
|
||||||
|
"priority": "low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-4314",
|
||||||
|
"title": "If we compress the program, we can get to the XML alarm through the multi-byte COM matrix!",
|
||||||
|
"status": "in progress",
|
||||||
|
"label": "bug",
|
||||||
|
"priority": "high"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-3415",
|
||||||
|
"title": "Use the cross-platform XML application, then you can quantify the solid state feed!",
|
||||||
|
"status": "todo",
|
||||||
|
"label": "feature",
|
||||||
|
"priority": "high"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-8339",
|
||||||
|
"title": "Try to calculate the DNS interface, maybe it will input the bluetooth capacitor!",
|
||||||
|
"status": "in progress",
|
||||||
|
"label": "feature",
|
||||||
|
"priority": "low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-6995",
|
||||||
|
"title": "Try to hack the XSS bandwidth, maybe it will override the bluetooth matrix!",
|
||||||
|
"status": "todo",
|
||||||
|
"label": "feature",
|
||||||
|
"priority": "high"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-8053",
|
||||||
|
"title": "If we connect the program, we can get to the UTF8 matrix through the digital UDP protocol!",
|
||||||
|
"status": "todo",
|
||||||
|
"label": "feature",
|
||||||
|
"priority": "medium"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-4336",
|
||||||
|
"title": "If we synthesize the microchip, we can get to the SAS sensor through the optical UDP program!",
|
||||||
|
"status": "todo",
|
||||||
|
"label": "documentation",
|
||||||
|
"priority": "low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-8790",
|
||||||
|
"title": "I'll back up the optical COM alarm, that should alarm the RSS capacitor!",
|
||||||
|
"status": "done",
|
||||||
|
"label": "bug",
|
||||||
|
"priority": "medium"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-8980",
|
||||||
|
"title": "Try to navigate the SQL transmitter, maybe it will back up the virtual firewall!",
|
||||||
|
"status": "canceled",
|
||||||
|
"label": "bug",
|
||||||
|
"priority": "low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-7342",
|
||||||
|
"title": "Use the neural CLI card, then you can parse the online port!",
|
||||||
|
"status": "backlog",
|
||||||
|
"label": "documentation",
|
||||||
|
"priority": "low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-5608",
|
||||||
|
"title": "I'll hack the haptic SSL program, that should bus the UDP transmitter!",
|
||||||
|
"status": "canceled",
|
||||||
|
"label": "documentation",
|
||||||
|
"priority": "low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-1606",
|
||||||
|
"title": "I'll generate the bluetooth PNG firewall, that should pixel the SSL driver!",
|
||||||
|
"status": "done",
|
||||||
|
"label": "feature",
|
||||||
|
"priority": "medium"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-7872",
|
||||||
|
"title": "Transmitting the circuit won't do anything, we need to reboot the 1080p RSS monitor!",
|
||||||
|
"status": "canceled",
|
||||||
|
"label": "feature",
|
||||||
|
"priority": "medium"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-4167",
|
||||||
|
"title": "Use the cross-platform SMS circuit, then you can synthesize the optical feed!",
|
||||||
|
"status": "canceled",
|
||||||
|
"label": "bug",
|
||||||
|
"priority": "medium"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-9581",
|
||||||
|
"title": "You can't index the port without hacking the cross-platform XSS monitor!",
|
||||||
|
"status": "backlog",
|
||||||
|
"label": "documentation",
|
||||||
|
"priority": "low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-8806",
|
||||||
|
"title": "We need to bypass the back-end SSL panel!",
|
||||||
|
"status": "done",
|
||||||
|
"label": "bug",
|
||||||
|
"priority": "medium"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-6542",
|
||||||
|
"title": "Try to quantify the RSS firewall, maybe it will quantify the open-source system!",
|
||||||
|
"status": "done",
|
||||||
|
"label": "feature",
|
||||||
|
"priority": "low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-6806",
|
||||||
|
"title": "The VGA protocol is down, reboot the back-end matrix so we can parse the CSS panel!",
|
||||||
|
"status": "canceled",
|
||||||
|
"label": "documentation",
|
||||||
|
"priority": "low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-9549",
|
||||||
|
"title": "You can't bypass the bus without connecting the neural JBOD bus!",
|
||||||
|
"status": "todo",
|
||||||
|
"label": "feature",
|
||||||
|
"priority": "high"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-1075",
|
||||||
|
"title": "Backing up the driver won't do anything, we need to parse the redundant RAM pixel!",
|
||||||
|
"status": "done",
|
||||||
|
"label": "feature",
|
||||||
|
"priority": "medium"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-1427",
|
||||||
|
"title": "Use the auxiliary PCI circuit, then you can calculate the cross-platform interface!",
|
||||||
|
"status": "done",
|
||||||
|
"label": "documentation",
|
||||||
|
"priority": "high"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-1907",
|
||||||
|
"title": "Hacking the circuit won't do anything, we need to back up the online DRAM system!",
|
||||||
|
"status": "todo",
|
||||||
|
"label": "documentation",
|
||||||
|
"priority": "high"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-4309",
|
||||||
|
"title": "If we generate the system, we can get to the TCP sensor through the optical GB pixel!",
|
||||||
|
"status": "backlog",
|
||||||
|
"label": "bug",
|
||||||
|
"priority": "medium"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-3973",
|
||||||
|
"title": "I'll parse the back-end ADP array, that should bandwidth the RSS bandwidth!",
|
||||||
|
"status": "todo",
|
||||||
|
"label": "feature",
|
||||||
|
"priority": "medium"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-7962",
|
||||||
|
"title": "Use the wireless RAM program, then you can hack the cross-platform feed!",
|
||||||
|
"status": "canceled",
|
||||||
|
"label": "bug",
|
||||||
|
"priority": "low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-3360",
|
||||||
|
"title": "You can't quantify the program without synthesizing the neural OCR interface!",
|
||||||
|
"status": "done",
|
||||||
|
"label": "feature",
|
||||||
|
"priority": "medium"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-9887",
|
||||||
|
"title": "Use the auxiliary ASCII sensor, then you can connect the solid state port!",
|
||||||
|
"status": "backlog",
|
||||||
|
"label": "bug",
|
||||||
|
"priority": "medium"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-3649",
|
||||||
|
"title": "I'll input the virtual USB system, that should circuit the DNS monitor!",
|
||||||
|
"status": "in progress",
|
||||||
|
"label": "feature",
|
||||||
|
"priority": "medium"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-3586",
|
||||||
|
"title": "If we quantify the circuit, we can get to the CLI feed through the mobile SMS hard drive!",
|
||||||
|
"status": "in progress",
|
||||||
|
"label": "bug",
|
||||||
|
"priority": "low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-5150",
|
||||||
|
"title": "I'll hack the wireless XSS port, that should transmitter the IP interface!",
|
||||||
|
"status": "canceled",
|
||||||
|
"label": "feature",
|
||||||
|
"priority": "medium"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-3652",
|
||||||
|
"title": "The SQL interface is down, override the optical bus so we can program the ASCII interface!",
|
||||||
|
"status": "backlog",
|
||||||
|
"label": "feature",
|
||||||
|
"priority": "low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-6884",
|
||||||
|
"title": "Use the digital PCI circuit, then you can synthesize the multi-byte microchip!",
|
||||||
|
"status": "canceled",
|
||||||
|
"label": "feature",
|
||||||
|
"priority": "high"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-1591",
|
||||||
|
"title": "We need to connect the mobile XSS driver!",
|
||||||
|
"status": "in progress",
|
||||||
|
"label": "feature",
|
||||||
|
"priority": "high"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-3802",
|
||||||
|
"title": "Try to override the ASCII protocol, maybe it will parse the virtual matrix!",
|
||||||
|
"status": "in progress",
|
||||||
|
"label": "feature",
|
||||||
|
"priority": "low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-7253",
|
||||||
|
"title": "Programming the capacitor won't do anything, we need to bypass the neural IB hard drive!",
|
||||||
|
"status": "backlog",
|
||||||
|
"label": "bug",
|
||||||
|
"priority": "high"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-9739",
|
||||||
|
"title": "We need to hack the multi-byte HDD bus!",
|
||||||
|
"status": "done",
|
||||||
|
"label": "documentation",
|
||||||
|
"priority": "medium"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-4424",
|
||||||
|
"title": "Try to hack the HEX alarm, maybe it will connect the optical pixel!",
|
||||||
|
"status": "in progress",
|
||||||
|
"label": "documentation",
|
||||||
|
"priority": "medium"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-3922",
|
||||||
|
"title": "You can't back up the capacitor without generating the wireless PCI program!",
|
||||||
|
"status": "backlog",
|
||||||
|
"label": "bug",
|
||||||
|
"priority": "low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-4921",
|
||||||
|
"title": "I'll index the open-source IP feed, that should system the GB application!",
|
||||||
|
"status": "canceled",
|
||||||
|
"label": "bug",
|
||||||
|
"priority": "low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-5814",
|
||||||
|
"title": "We need to calculate the 1080p AGP feed!",
|
||||||
|
"status": "backlog",
|
||||||
|
"label": "bug",
|
||||||
|
"priority": "high"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-2645",
|
||||||
|
"title": "Synthesizing the system won't do anything, we need to navigate the multi-byte HDD firewall!",
|
||||||
|
"status": "todo",
|
||||||
|
"label": "documentation",
|
||||||
|
"priority": "medium"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-4535",
|
||||||
|
"title": "Try to copy the JSON circuit, maybe it will connect the wireless feed!",
|
||||||
|
"status": "in progress",
|
||||||
|
"label": "feature",
|
||||||
|
"priority": "low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-4463",
|
||||||
|
"title": "We need to copy the solid state AGP monitor!",
|
||||||
|
"status": "done",
|
||||||
|
"label": "documentation",
|
||||||
|
"priority": "low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-9745",
|
||||||
|
"title": "If we connect the protocol, we can get to the GB system through the bluetooth PCI microchip!",
|
||||||
|
"status": "canceled",
|
||||||
|
"label": "feature",
|
||||||
|
"priority": "high"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-2080",
|
||||||
|
"title": "If we input the bus, we can get to the RAM matrix through the auxiliary RAM card!",
|
||||||
|
"status": "todo",
|
||||||
|
"label": "bug",
|
||||||
|
"priority": "medium"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-3838",
|
||||||
|
"title": "I'll bypass the online TCP application, that should panel the AGP system!",
|
||||||
|
"status": "backlog",
|
||||||
|
"label": "bug",
|
||||||
|
"priority": "high"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-1340",
|
||||||
|
"title": "We need to navigate the virtual PNG circuit!",
|
||||||
|
"status": "todo",
|
||||||
|
"label": "bug",
|
||||||
|
"priority": "medium"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-6665",
|
||||||
|
"title": "If we parse the monitor, we can get to the SSD hard drive through the cross-platform AGP alarm!",
|
||||||
|
"status": "canceled",
|
||||||
|
"label": "feature",
|
||||||
|
"priority": "low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-7585",
|
||||||
|
"title": "If we calculate the hard drive, we can get to the SSL program through the multi-byte CSS microchip!",
|
||||||
|
"status": "backlog",
|
||||||
|
"label": "feature",
|
||||||
|
"priority": "low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-6319",
|
||||||
|
"title": "We need to copy the multi-byte SCSI program!",
|
||||||
|
"status": "backlog",
|
||||||
|
"label": "bug",
|
||||||
|
"priority": "high"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-4369",
|
||||||
|
"title": "Try to input the SCSI bus, maybe it will generate the 1080p pixel!",
|
||||||
|
"status": "backlog",
|
||||||
|
"label": "bug",
|
||||||
|
"priority": "high"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-9035",
|
||||||
|
"title": "We need to override the solid state PNG array!",
|
||||||
|
"status": "canceled",
|
||||||
|
"label": "documentation",
|
||||||
|
"priority": "low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-3970",
|
||||||
|
"title": "You can't index the transmitter without quantifying the haptic ASCII card!",
|
||||||
|
"status": "todo",
|
||||||
|
"label": "documentation",
|
||||||
|
"priority": "medium"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-4473",
|
||||||
|
"title": "You can't bypass the protocol without overriding the neural RSS program!",
|
||||||
|
"status": "todo",
|
||||||
|
"label": "documentation",
|
||||||
|
"priority": "low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-4136",
|
||||||
|
"title": "You can't hack the hard drive without hacking the primary JSON program!",
|
||||||
|
"status": "canceled",
|
||||||
|
"label": "bug",
|
||||||
|
"priority": "medium"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-3939",
|
||||||
|
"title": "Use the back-end SQL firewall, then you can connect the neural hard drive!",
|
||||||
|
"status": "done",
|
||||||
|
"label": "feature",
|
||||||
|
"priority": "low"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-2007",
|
||||||
|
"title": "I'll input the back-end USB protocol, that should bandwidth the PCI system!",
|
||||||
|
"status": "backlog",
|
||||||
|
"label": "bug",
|
||||||
|
"priority": "high"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-7516",
|
||||||
|
"title": "Use the primary SQL program, then you can generate the auxiliary transmitter!",
|
||||||
|
"status": "done",
|
||||||
|
"label": "documentation",
|
||||||
|
"priority": "medium"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-6906",
|
||||||
|
"title": "Try to back up the DRAM system, maybe it will reboot the online transmitter!",
|
||||||
|
"status": "done",
|
||||||
|
"label": "feature",
|
||||||
|
"priority": "high"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "TASK-5207",
|
||||||
|
"title": "The SMS interface is down, copy the bluetooth bus so we can quantify the VGA card!",
|
||||||
|
"status": "in progress",
|
||||||
|
"label": "bug",
|
||||||
|
"priority": "low"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
@ -83,6 +83,9 @@ importers:
|
||||||
vue-wrap-balancer:
|
vue-wrap-balancer:
|
||||||
specifier: ^1.1.3
|
specifier: ^1.1.3
|
||||||
version: 1.1.3(vue@3.3.4)
|
version: 1.1.3(vue@3.3.4)
|
||||||
|
zod:
|
||||||
|
specifier: ^3.22.2
|
||||||
|
version: 3.22.2
|
||||||
devDependencies:
|
devDependencies:
|
||||||
'@iconify-json/radix-icons':
|
'@iconify-json/radix-icons':
|
||||||
specifier: ^1.1.11
|
specifier: ^1.1.11
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user