Newer
Older
class="d-flex flex-column flex-md-row align-stretch align-md-center gap justify-start fill-height"

Jonathan Weth
committed
<documentation-compact-details
v-bind="dialogActivator.attrs"
v-on="dialogActivator.on"
v-if="
!documentation.canEdit &&
(documentation.topic ||
documentation.homework ||
documentation.groupNote)
"
:documentation="documentation"
@click="$emit('open')"
:class="{
'flex-grow-1 min-width pa-1 read-only-grid': true,
'full-width': $vuetify.breakpoint.mobile,
}"
/>
<v-alert
v-else-if="documentation.futureNotice"
type="warning"
outlined
class="min-width flex-grow-1 mb-0"
>
{{ $t("alsijil.coursebook.notices.future") }}
</v-alert>
<v-alert
v-else-if="!documentation.canEdit"
type="info"
outlined
class="min-width flex-grow-1 mb-0"
>
{{ $t("alsijil.coursebook.notices.no_entry") }}
</v-alert>

Jonathan Weth
committed
v-if="documentation.canEdit"
:class="{
'flex-grow-1 min-width': true,
'full-width': $vuetify.breakpoint.mobile,
}"
:label="$t('alsijil.coursebook.summary.topic.label')"
:value="documentation.topic"
@input="topic = $event"
@focusout="save"
@keydown.enter="saveAndBlur"
:loading="loading"
<v-scroll-x-transition>
<v-icon
v-if="appendIcon"
:color="appendIconColor"
v-on="on"
v-bind="attrs"
>{{ appendIcon }}</v-icon
>
</v-scroll-x-transition>
</template>
<span>{{ appendIconTooltip }}</span>
</v-tooltip>
<div
:class="{
'flex-grow-1 max-width': true,
'full-width': $vuetify.breakpoint.mobile,
}"

Jonathan Weth
committed
v-if="documentation.canEdit"
v-bind="dialogActivator.attrs"
v-on="dialogActivator.on"
class="max-width grid-layout pa-1"
>
<span class="max-width text-truncate">{{
documentation.homework
? $t("alsijil.coursebook.summary.homework.value", documentation)
: $t("alsijil.coursebook.summary.homework.empty")
}}</span>
<v-icon right class="float-right">{{ homeworkIcon }}</v-icon>
<span class="max-width text-truncate">{{
documentation.groupNote
? $t("alsijil.coursebook.summary.group_note.value", documentation)
: $t("alsijil.coursebook.summary.group_note.empty")
}}</span>
<v-icon right class="float-right">{{ groupNoteIcon }}</v-icon>
</v-card>
<!-- not compact -->
<!-- Are focusout & enter enough trigger? -->
<v-text-field
filled

Jonathan Weth
committed
v-if="!compact && documentation.canEdit"
:label="$t('alsijil.coursebook.summary.topic.label')"
/>
<v-textarea
filled
auto-grow
rows="3"
clearable

Jonathan Weth
committed
v-if="!compact && documentation.canEdit"
@input="homework = $event ? $event : ''"
/>
<v-textarea
filled
auto-grow
rows="3"
clearable

Jonathan Weth
committed
v-if="!compact && documentation.canEdit"
:label="$t('alsijil.coursebook.summary.group_note.label')"
@input="groupNote = $event ? $event : ''"

Jonathan Weth
committed
/>
<documentation-full-details
v-if="!compact && !documentation.canEdit"
:documentation="documentation"

Jonathan Weth
committed
<script setup>
import DocumentationCompactDetails from "./DocumentationCompactDetails.vue";
import DocumentationFullDetails from "./DocumentationFullDetails.vue";
</script>
import createOrPatchMixin from "aleksis.core/mixins/createOrPatchMixin.js";
import documentationPartMixin from "./documentationPartMixin";
mixins: [createOrPatchMixin, documentationPartMixin],
data() {
return {
topic: null,
homework: null,
groupNote: null,
};
},
methods: {
return (cached, incoming) => {
for (const object of incoming) {
const index = cached.findIndex(
(o) => o[itemId] === this.documentation.id,
);
// if creation of proper documentation from dummy one, set ID of documentation currently being edited as oldID so that key in coursebook doesn't change
oldId:
this.documentation.id !== object.id
? this.documentation.id
: this.documentation.oldId,
if (
this.topic !== null ||
this.homework !== null ||
this.groupNote !== null
) {
...(this.topic !== null && { topic: this.topic }),
...(this.homework !== null && { homework: this.homework }),
...(this.groupNote !== null && { groupNote: this.groupNote }),
this.topic = null;
this.homework = null;
this.groupNote = null;
saveAndBlur(event) {
this.save();
event.target.blur();
computed: {
homeworkIcon() {
if (this.documentation.homework) {
return this.documentation.canEdit
? "mdi-book-edit-outline"
: "mdi-book-alert-outline";
return this.documentation.canEdit
? "mdi-book-plus-outline"
: "mdi-book-off-outline";
},
groupNoteIcon() {
if (this.documentation.groupNote) {
return this.documentation.canEdit
? "mdi-note-edit-outline"
: "mdi-note-alert-outline";
return this.documentation.canEdit
? "mdi-note-plus-outline"
: "mdi-note-off-outline";
minWidth() {
return Math.min(this.documentation?.topic?.length || 15, 15) + "ch";
},
maxWidth() {
return this.$vuetify.breakpoint.mobile ? "100%" : "20ch";
return (
{ $success: "success", $error: "error" }[this.appendIcon] || "primary"
);
},
{
$success: this.$t("alsijil.coursebook.summary.topic.status.success"),
$error: this.$t("alsijil.coursebook.summary.topic.status.error", {
error: this.topicError,
}),
}[this.appendIcon] || ""
mounted() {
this.$on("save", this.handleAppendIconSuccess);
},
.grid-layout {
display: grid;
grid-template-columns: auto min-content;
}

Jonathan Weth
committed
.read-only-grid {
display: grid;
grid-template-columns: min-content auto;
grid-template-rows: auto;
}