Skip to content

Commit

Permalink
Merge pull request #74 from markfijneman/tabledense-layout
Browse files Browse the repository at this point in the history
Added tabledense task display
  • Loading branch information
JJ-8 authored Mar 16, 2024
2 parents 9f11920 + fffd749 commit 585564b
Show file tree
Hide file tree
Showing 4 changed files with 205 additions and 44 deletions.
12 changes: 5 additions & 7 deletions front/src/components/Profile/UserBadge.vue
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
<template>
<div>
<q-chip :style="style" text-color="white" class="text-center outer-chip">
<span class="user-chip">
{{ profile.username }}
</span>
</q-chip>
</div>
<q-chip :style="style" text-color="white" class="text-center outer-chip">
<span class="user-chip">
{{ profile.username }}
</span>
</q-chip>
</template>

<script lang="ts">
Expand Down
91 changes: 57 additions & 34 deletions front/src/components/Task/TaskBtnGroup.vue
Original file line number Diff line number Diff line change
@@ -1,48 +1,65 @@
<template>
<div class="q-gutter-sm">
<q-btn
v-touch-hold:2000.mouse="handleOnItClick"
round
size="sm"
:title="onItTitle"
:icon="onItIcon"
:color="onItColor"
@click="updateOnIt(!onIt)"
/>
<q-btn
round
size="sm"
title="Enter flag"
icon="flag"
color="positive"
@click="solveTask(task)"
/>
<q-btn
round
size="sm"
:title="`Edit ${task.title}`"
icon="edit"
color="warning"
@click="editTask(task)"
/>
<q-btn
round
size="sm"
:title="`Delete ${task.title}`"
icon="delete"
color="negative"
@click="deleteTask(task)"
/>
<div>
<component
:is="group ? 'q-btn-group' : 'div'"
:class="{ 'q-gutter-sm': !group }"
>
<q-btn
v-if="showOpenTaskBtn"
:to="openTaskRoute"
round
size="sm"
:title="`Open ${task.title}`"
icon="edit_note"
color="accent"
/>
<q-btn
v-touch-hold:2000.mouse="handleOnItClick"
round
size="sm"
:title="onItTitle"
:icon="onItIcon"
:color="onItColor"
@click="updateOnIt(!onIt)"
/>
<q-btn
round
size="sm"
title="Enter flag"
icon="flag"
color="positive"
@click="solveTask(task)"
/>
<q-btn
round
size="sm"
:title="`Edit ${task.title}`"
icon="edit"
color="warning"
@click="editTask(task)"
/>
<q-btn
round
size="sm"
:title="`Delete ${task.title}`"
icon="delete"
color="negative"
@click="deleteTask(task)"
/>
</component>
</div>
</template>

<script lang="ts">
import ctfnote from 'src/ctfnote';
import { Task } from 'src/ctfnote/models';
import { defineComponent } from 'vue';
import { RouteLocationRaw } from 'vue-router';
export default defineComponent({
props: {
group: { type: Boolean, required: false },
showOpenTaskBtn: { type: Boolean, required: false },
task: { type: Object as () => Task, required: true },
},
setup() {
Expand All @@ -62,6 +79,12 @@ export default defineComponent({
},
computed: {
openTaskRoute(): RouteLocationRaw {
const params: Record<string, string> = {};
params['taskId'] = this.task.id.toString();
params['taskSlug'] = this.task.slug;
return { name: 'task', params };
},
onItColor() {
return this.onIt ? 'secondary' : 'primary';
},
Expand Down
18 changes: 15 additions & 3 deletions front/src/components/Task/TaskList.vue
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,11 @@
:tasks="sortedTasks"
:display-mode="displayMode"
/>
<task-table-dense
v-else-if="displayMode == 'tabledense'"
:ctf="ctf"
:tasks="sortedTasks"
/>
<task-table v-else :ctf="ctf" :tasks="sortedTasks" />
</template>
<div v-else class="text-center col">
Expand Down Expand Up @@ -112,16 +117,23 @@ import TaskImportDialogVue from '../Dialogs/TaskImportDialog.vue';
import TaskExportDialogVue from '../Dialogs/TaskExportDialog.vue';
import TaskCards from './TaskCards.vue';
import TaskTable from './TaskTable.vue';
import TaskTableDense from './TaskTableDense.vue';
import keys from '../../injectionKeys';
import { tagsSortFn } from 'src/ctfnote/tags';
import { Platform } from 'quasar';
const displayOptions = ['classic', 'dense', 'ultradense', 'table'] as const;
const displayOptions = [
'classic',
'dense',
'ultradense',
'table',
'tabledense',
] as const;
export type DisplayMode = (typeof displayOptions)[number];
export default defineComponent({
components: { TaskCards, TaskTable },
components: { TaskCards, TaskTable, TaskTableDense },
props: {
ctf: { type: Object as () => Ctf, required: true },
},
Expand Down Expand Up @@ -193,7 +205,7 @@ export default defineComponent({
return this.ctf.tasks;
},
useCard() {
return this.displayMode != 'table';
return this.displayMode != 'table' && this.displayMode != 'tabledense';
},
tags() {
return [
Expand Down
128 changes: 128 additions & 0 deletions front/src/components/Task/TaskTableDense.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
<template>
<q-table
:rows="tasks"
:columns="columns"
:pagination="pagination"
hide-pagination
flat
dense
>
<template #body="props">
<q-tr v-show="isTaskVisible(props.row)" :props="props">
<task-menu :task="props.row" :context-menu="true" />

<q-td
key="tags"
style="padding-left: 12px"
:props="props"
class="no-click"
>
<task-tags-list :tags="props.row.assignedTags" />
</q-td>

<q-td key="solved" :props="props" auto-width>
<q-badge v-if="props.row.solved" color="positive">
<q-icon name="flag" />
</q-badge>
</q-td>

<q-td key="title" :props="props" align="left">
<ctf-note-link name="task" :ctf="ctf" :task="props.row">
{{ props.row.title }}
</ctf-note-link>
</q-td>

<q-td key="description" :props="props">
<div v-if="props.row.solved" class="blur q-py-xs">
{{ props.row.flag }}
</div>
<div v-else class="q-py-xs">{{ props.row.description || '…' }}</div>
</q-td>

<q-td key="players" :props="props">
<task-player-list :task="props.row" />
</q-td>

<q-td key="actions" :props="props" class="no-click" auto-width>
<task-btn-group
dense
group
show-open-task-btn
:ctf="ctf"
:task="props.row"
/>
</q-td>
</q-tr>
</template>
</q-table>
</template>

<script lang="ts">
import { defineComponent } from 'vue';
import { Ctf, Task } from 'src/ctfnote/models';
import ctfnote from 'src/ctfnote';
import TaskBtnGroup from './TaskBtnGroup.vue';
import TaskTagsList from './TaskTagsList.vue';
import TaskPlayerList from './TaskPlayerList.vue';
import TaskMenu from './TaskMenu.vue';
import { injectStrict } from 'src/ctfnote/utils';
import CtfNoteLink from '../Utils/CtfNoteLink.vue';
import keys from '../../injectionKeys';
function col(name: string, opt = {}) {
return {
name,
field: name,
label: name,
align: 'left',
...opt,
headerStyle: 'text-transform: capitalize;',
};
}
export default defineComponent({
components: {
TaskBtnGroup,
TaskTagsList,
TaskPlayerList,
TaskMenu,
CtfNoteLink,
},
props: {
ctf: { type: Object as () => Ctf, required: true },
tasks: { type: Array as () => Task[], required: true },
},
setup() {
const columns = [
col('tags', { sortable: true }),
col('solved', { sortable: false, label: '' }),
col('title', { sortable: true }),
col('description', { label: 'description / flag' }),
col('players', { align: 'center' }),
col('actions', {
label: '',
align: 'right',
}),
];
const pagination = {
rowsPerPage: 0,
};
const me = ctfnote.me.injectMe();
const team = ctfnote.profiles.injectTeam();
return {
columns,
pagination,
me,
team,
isTaskVisible: injectStrict(keys.isTaskVisible),
};
},
});
</script>

<style scoped>
.q-table td,
.q-table th {
white-space: normal;
}
</style>

0 comments on commit 585564b

Please sign in to comment.