diff --git a/resources/assets/stylesheets/scss/courseware.scss b/resources/assets/stylesheets/scss/courseware.scss index 827c30864789c21665cbf48349c280cece136437..ce2a2096bfd921972a46eed7e694469baabaf278 100644 --- a/resources/assets/stylesheets/scss/courseware.scss +++ b/resources/assets/stylesheets/scss/courseware.scss @@ -78,15 +78,18 @@ $blockadder-items: ( timeline: date-cycle, typewriter: block-typewriter, video: video2, - accordion: block-accordion, - list: view-list, - tabs: block-tabs, biography-achievements: medal, biography-career: ranking, biography-personal-information: own-license, biography-goals: radar ); +$containeradder-items: ( + accordion: block-accordion, + list: view-list, + tabs: block-tabs, +); + $achievement-types: ( certificate: file-text, accreditation: vcard, @@ -1864,30 +1867,60 @@ b l o c k a d d e r } } -.cw-blockadder-item { - margin-bottom: 4px; - padding: 1em 1em 1em 6em; - @include background-icon(unit-test, clickable, 48); - background-position: 12px center; - background-repeat: no-repeat; - border: solid thin $content-color-40; - cursor: pointer; +.cw-element-adder-wrapper { + display: flex; + flex-wrap: wrap; + justify-content: space-between; +} +.cw-blockadder-item-list { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); + grid-auto-rows: auto; + grid-gap: 4px; - &:hover { - border-color: $base-color; - } + .cw-blockadder-item-wrapper { + display: flex; + border: solid thin var(--content-color-40); + max-width: 254px; - @each $item, $icon in $blockadder-items { - &.cw-blockadder-item-#{$item} { - @include background-icon($icon, clickable, 48); + &:hover { + border-color: var(--base-color); } - } - .cw-blockadder-item-title { - font-weight: 600; + .cw-blockadder-item { + padding: 64px 10px 4px 10px; + @include background-icon(unit-test, clickable, 48); + background-position: 10px 10px; + background-repeat: no-repeat; + cursor: pointer; + + @each $item, $icon in $blockadder-items { + &.cw-blockadder-item-#{$item} { + @include background-icon($icon, clickable, 48); + } + } + + .cw-blockadder-item-title { + display: inline-block; + font-weight: 600; + margin-bottom: 2px; + } + .cw-blockadder-item-description { + display: inline-block; + margin: 0 0 4px; + } + } + .cw-blockadder-item-fav { + height: 32px; + padding: 8px; + background-color: transparent; + border: none; + cursor: pointer; + } } } + .cw-block-adder-area { background-color: $white; border: solid thin $content-color-40; @@ -1935,38 +1968,28 @@ b l o c k a d d e r margin-top: 5px; } -.cw-element-adder-favs-wrapper { - display: flex; - .cw-element-adder-all-blocks { - &.fav-edit-active { - .cw-blockadder-item { - height: 5em; - } - } +.cw-containeradder-item { + margin-bottom: 4px; + padding: 1em 1em 1em 6em; + @include background-icon(unit-test, clickable, 48); + background-position: 12px center; + background-repeat: no-repeat; + border: solid thin $content-color-40; + cursor: pointer; + &:hover { + border-color: $base-color; } - .cw-element-adder-favs { - - .cw-block-fav-item { - @include background-icon(star-empty, clickable, 48); - background-position: center; - background-repeat: no-repeat; - height: 5em; - width: 5em; - padding: 1em; - margin: 0 0 4px 4px; - border: solid thin $content-color-40; - cursor: pointer; - &:hover { - border-color: $base-color; - } - - &.cw-block-fav-item-active { - @include background-icon(star, clickable, 48); - } + @each $item, $icon in $containeradder-items { + &.cw-containeradder-item-#{$item} { + @include background-icon($icon, clickable, 48); } } + + .cw-containeradder-item-title { + font-weight: 600; + } } diff --git a/resources/vue/components/courseware/CoursewareBlockHelper.vue b/resources/vue/components/courseware/CoursewareBlockHelper.vue index 2d7acbce6c66ac4b7f8d8e4eb21e7c6b45a7bb03..1a709f8e100e8138aaa60dfc909f90b8e047e8d9 100644 --- a/resources/vue/components/courseware/CoursewareBlockHelper.vue +++ b/resources/vue/components/courseware/CoursewareBlockHelper.vue @@ -1,7 +1,7 @@ <template> <div class="block-helper"> <courseware-companion-box :msgCompanion="currentQuestion.text" :mood="companionMood"/> - <div v-if="showBlocks" class="cw-block-helper-results"> + <div v-if="showBlocks" class="cw-block-helper-results cw-element-adder-wrapper "> <courseware-blockadder-item v-for="(block, index) in selectedBlockTypes" :key="index" diff --git a/resources/vue/components/courseware/CoursewareBlockadderItem.vue b/resources/vue/components/courseware/CoursewareBlockadderItem.vue index 93c31f424debd7161784dbc8358d891b04072e0e..5e4b850971958ed555fa29359fe54ebdd2d4bcd3 100644 --- a/resources/vue/components/courseware/CoursewareBlockadderItem.vue +++ b/resources/vue/components/courseware/CoursewareBlockadderItem.vue @@ -1,14 +1,22 @@ <template> - <a href="#" @click.prevent="addBlock"> - <div class="cw-blockadder-item" :class="['cw-blockadder-item-' + type]"> + <div class="cw-blockadder-item-wrapper"> + <a href="#" @click.prevent="addBlock" class="cw-blockadder-item" :class="['cw-blockadder-item-' + type]"> <header class="cw-blockadder-item-title"> {{ title }} </header> <p class="cw-blockadder-item-description"> {{ description }} </p> - </div> - </a> + </a> + <button + class="cw-blockadder-item-fav" + :title="favButtonTitle" + @click="toggleFavItem()" + > + <studip-icon :shape="blockTypeIsFav ? 'star' : 'star-empty'" :size="20" /> + </button> + </div> + </template> <script> @@ -32,7 +40,24 @@ export default { blockAdder: 'blockAdder', blockById: 'courseware-blocks/byId', lastCreatedBlock: 'courseware-blocks/lastCreated', + favoriteBlockTypes: 'favoriteBlockTypes', }), + blockTypeIsFav() { + return this.favoriteBlockTypes.some((type) => type.type === this.type); + }, + favButtonTitle() { + if (this.blockTypeIsFav) { + return this.$gettextInterpolate( + this.$gettext('%{ blockName } Block aus den Favoriten entfernen'), + { blockName: this.title } + ); + } + + return this.$gettextInterpolate( + this.$gettext('%{ blockName } Block zu Favoriten hinzufügen'), + { blockName: this.title } + ); + } }, methods: { ...mapActions({ @@ -44,6 +69,8 @@ export default { unlockObject: 'unlockObject', loadBlock: 'courseware-blocks/loadById', updateContainer: 'updateContainer', + removeFavoriteBlockType: 'removeFavoriteBlockType', + addFavoriteBlockType: 'addFavoriteBlockType', }), async addBlock() { if (Object.keys(this.blockAdder).length !== 0) { @@ -76,6 +103,13 @@ export default { }); } }, + toggleFavItem() { + if (this.blockTypeIsFav) { + this.removeFavoriteBlockType(this.type); + } else { + this.addFavoriteBlockType(this.type); + } + }, }, }; </script> diff --git a/resources/vue/components/courseware/CoursewareContainerAdderItem.vue b/resources/vue/components/courseware/CoursewareContainerAdderItem.vue index 5cc82cd43d0a67d7dbda8112bfd64769c37f79e6..78cc4eda3bc714b7717b9763e07916f98c1ec235 100644 --- a/resources/vue/components/courseware/CoursewareContainerAdderItem.vue +++ b/resources/vue/components/courseware/CoursewareContainerAdderItem.vue @@ -1,10 +1,10 @@ <template> <a href="#" @click.prevent="addContainer"> - <div class="cw-blockadder-item" :class="['cw-blockadder-item-' + type]"> - <header class="cw-blockadder-item-title"> + <div class="cw-containeradder-item" :class="['cw-containeradder-item-' + type]"> + <header class="cw-containeradder-item-title"> {{ title }} </header> - <p class="cw-blockadder-item-description"> + <p class="cw-containeradder-item-description"> {{ description }} </p> </div> diff --git a/resources/vue/components/courseware/CoursewareToolsBlockadder.vue b/resources/vue/components/courseware/CoursewareToolsBlockadder.vue index 5f6ffd42991afac53eb719fe7b072ba189b68bf4..efdeb4ef50e57cbe02b0034d9aa7e1aebc537419 100644 --- a/resources/vue/components/courseware/CoursewareToolsBlockadder.vue +++ b/resources/vue/components/courseware/CoursewareToolsBlockadder.vue @@ -48,7 +48,7 @@ </button> </div> - <div v-if="filteredBlockTypes.length > 0"> + <div v-if="filteredBlockTypes.length > 0" class="cw-blockadder-item-list"> <courseware-blockadder-item v-for="(block, index) in filteredBlockTypes" :key="index" @@ -58,12 +58,11 @@ @blockAdded="$emit('blockAdded')" /> </div> - <div v-else> - <courseware-companion-box - :msgCompanion="$gettext('Es wurden keine passenden Blöcke gefunden.')" - mood="pointing" - /> - </div> + <courseware-companion-box + v-else + :msgCompanion="$gettext('Es wurden keine passenden Blöcke gefunden.')" + mood="pointing" + /> </courseware-tab> <courseware-tab :name="$gettext('Abschnitte')" :selected="showContaineradder" :index="1" :style="{ maxHeight: maxHeight + 'px' }"> <courseware-collapsible-box