aboutsummaryrefslogtreecommitdiff
path: root/resources/vue/components/courseware/CoursewareTile.vue
blob: 6976acec1d7a24b904315db5223b44dbf1a116b0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
<template>
    <component :is="tag" class="cw-tile" :class="[color]">
        <div
            class="preview-image"
            :class="[hasImage ? '' : 'default-image']"
            :style="previewImageStyle"
        >
            <div class="overlay-text" v-if="hasImageOverlay">
                <slot name="image-overlay"></slot>
            </div>
            <div class="overlay-action-menu" v-if="hasImageOverlayWithActionMenu">
                <slot name="image-overlay-with-action-menu"></slot>
            </div>
        </div>
        <component
            :is="hasDescriptionLink ? 'a' : 'div'"
            :href="hasDescriptionLink ? descriptionLink : ''"
            :title="descriptionTitle"
            class="description"
        >
            <header
                :class="[icon ? 'description-icon-' + icon : '']"
            >
                {{ title }}
            </header>
            <div
                v-if="displayProgress"
                :title="progressTitle"
                class="progress-wrapper" >
                <progress :value="progress" max="100">{{ progress }}</progress>
            </div>
            <div class="description-text-wrapper">
                <p><slot name="description"></slot></p>
            </div>
            <footer>
                <slot name="footer"></slot>
            </footer>
        </component>
    </component>
</template>

<script>
export default {
    name: "courseware-tile",
    props: {
        tag: {
            type: String,
            default: "div",
            validator: tag => {
                return ["div", "li"].includes(tag);
            }
        },
        color: {
            type: String,
            default: "studip-blue",
            validator: value => {
                return [
                    "black",
                    "charcoal",
                    "royal-purple",
                    "iguana-green",
                    "queen-blue",
                    "verdigris",
                    "mulberry",
                    "pumpkin",
                    "sunglow",
                    "apple-green",
                    "studip-blue",
                    "studip-lightblue",
                    "studip-green",
                    "studip-yellow",
                    "studip-gray",
                ].includes(value);
            }
        },
        title: {
            type: String,
            default: "–"
        },
        icon: {
            type: String
        },
        imageUrl: {
            type: String
        },
        displayProgress: {
            type: Boolean,
            default: false
        },
        progress: {
            type: Number,
            validator: value => {
                return value >= 0 && value <= 100;
            }
        },
        descriptionLink: {
            type: String,
            default: ""
        },
        descriptionTitle: {
            type: String,
            default: ''
        }
    },
    computed: {
        hasImage() {
            return this.imageUrl !== "" && this.imageUrl !== undefined;
        },
        hasImageOverlay() {
            return this.$slots["image-overlay"] !== undefined;
        },
        hasImageOverlayWithActionMenu() {
            return this.$slots["image-overlay-with-action-menu"] !== undefined;
        },
        previewImageStyle() {
            if (this.hasImage) {
                return { "background-image": "url(" + this.imageUrl + ")" };
            }
            else {
                return {};
            }
        },
        progressTitle() {
            return this.$gettextInterpolate(this.$gettext("Fortschritt: %{progress}%"), { progress: this.progress });
        },
        hasDescriptionLink() {
            return this.descriptionLink !== '';
        }
    },
    methods: {
        showProgress(e) {
            e.preventDefault();
            this.$emit("showProgress");
        }
    },
}
</script>