<template> <div> <div class="dialog-section"> <h3 class="form-heading">Summary format</h3> <ul class="summary nolist"> <li v-for="(group, groupIndex) in summaryFormat" :key="groupIndex" class="summary-group" > <div class="summary-options"> <label class="summary-option">Delimiter <input class="input summary-delimiter" :value="group.delimiter" @change="setSummaryGroupValue(groupIndex, 'delimiter', $event.target.value)" > </label> <label class="summary-option">Brackets <select class="select summary-delimiter" :value="group.bracket" @change="setSummaryGroupValue(groupIndex, 'bracket', $event.target.value)" > <option v-for="bracket in brackets" :key="bracket" >{{ bracket }}</option> </select> </label> </div> <ul class="summary-segments nolist"> <li v-for="(segment, segmentIndex) in group.segments" :key="segmentIndex" class="summary-segment" > <select class="select summary-prop" :value="segment.prop" @change="setSummarySegmentValue(groupIndex, segmentIndex, 'prop', $event.target.value)" > <option>channel</option> <option>network</option> <option>title</option> <option>movie</option> <option>tags</option> <option>actors</option> <option>date</option> </select> <input v-if="delimitedProps.includes(segment.prop)" class="input summary-delimiter" :value="segment.delimiter" @change="setSummarySegmentValue(groupIndex, segmentIndex, 'delimiter', $event.target.value)" > <select v-if="segment.prop === 'date'" class="select summary-format" :value="segment.format" @change="setSummarySegmentValue(groupIndex, segmentIndex, 'format', $event.target.value)" > <option>YYYY-MM-DD</option> <option>DD-MM-YYYY</option> <option>MM/DD/YYYY</option> </select> <Icon icon="bin" class="active" @click="removeSummarySegment(groupIndex, segmentIndex)" /> </li> <li class="summary-actions"> <button type="button" class="button button-secondary" @click="addSummarySegment(groupIndex)" >Add segment</button> <button type="button" class="button button-secondary" @click="removeSummaryGroup(groupIndex)" >Remove group</button> </li> </ul> </li> <li class="summary summary-actions"> <button type="button" class="button button-secondary" @click="addSummaryGroup" >Add group</button> <button type="button" class="button button-secondary" @click="resetSummaryFormat" >Reset to default</button> </li> </ul> </div> <div class="dialog-section"> <h3 class="form-heading">Preview</h3> <input class="input summary-preview" :value="summary" :title="summary" disabled > </div> </div> </template> <script> import formatSummary from '../../js/utils/format-summary'; function summary() { return formatSummary(this.scene, this.summaryFormat); } function summaryFormat() { return this.$store.state.ui.summaryFormat; } function setSummaryGroupValue(targetGroupIndex, target, value) { const newFormat = this.summaryFormat.map((group, groupIndex) => { if (groupIndex === targetGroupIndex) { return { ...group, [target]: value, }; } return group; }); this.$store.dispatch('setSummaryFormat', newFormat); } function setSummarySegmentValue(targetGroupIndex, targetSegmentIndex, target, value) { const newFormat = this.summaryFormat.map((group, groupIndex) => { if (groupIndex === targetGroupIndex) { return { ...group, segments: group.segments.map((segment, segmentIndex) => { if (segmentIndex === targetSegmentIndex) { return { ...segment, [target]: value, }; } return segment; }), }; } return group; }); this.$store.dispatch('setSummaryFormat', newFormat); } function addSummarySegment(targetGroupIndex) { const newFormat = this.summaryFormat.map((group, groupIndex) => { if (groupIndex === targetGroupIndex) { return { ...group, segments: group.segments.concat({ prop: 'title', delimiter: ',', // default delimiter for when prop is changed to iterabte like actors or tags format: 'YYYY-MM-DD', // default format for when prop is changed to date }), }; } return group; }); this.$store.dispatch('setSummaryFormat', newFormat); } function addSummaryGroup() { const newFormat = this.summaryFormat.concat({ delimiter: ' - ', segments: [{ prop: 'title' }], }); this.$store.dispatch('setSummaryFormat', newFormat); } function removeSummaryGroup(groupIndex) { const newFormat = this.summaryFormat.filter((group, index) => index !== groupIndex); this.$store.dispatch('setSummaryFormat', newFormat); } function removeSummarySegment(targetGroupIndex, targetSegmentIndex) { const newFormat = this.summaryFormat.map((group, groupIndex) => ({ ...group, segments: groupIndex === targetGroupIndex ? group.segments.filter((segment, index) => index !== targetSegmentIndex) : group.segments, })); this.$store.dispatch('setSummaryFormat', newFormat); } function resetSummaryFormat() { this.$store.dispatch('setSummaryFormat', this.$store.state.ui.defaultSummaryFormat); } export default { data() { return { delimiters: [null, '-', '_', ',', '.'], brackets: [null, '()', '[]', '{}', '<>'], delimitedProps: ['actors', 'tags'], scene: { channel: 'Channel', network: 'Network', title: 'Title', movie: 'Movie', scene: 1, actors: ['Jane Doe', 'John Doe'], date: new Date(), }, }; }, computed: { summary, summaryFormat, }, methods: { addSummaryGroup, setSummaryGroupValue, addSummarySegment, setSummarySegmentValue, removeSummaryGroup, removeSummarySegment, resetSummaryFormat, }, }; </script> <style lang="scss" scoped> .summary { .icon { padding: .5rem; } } .summary-group, .summary-segment { display: flex; } .summary-group { display: flex; flex-direction: column; margin-bottom: .5rem; .button { margin-top: .5rem; } &:not(:last-child) { padding-bottom: .5rem; border-bottom: solid 1px var(--shadow-hint); margin-bottom: .5rem; } } .summary-segments { width: 100%; display: flex; flex-direction: column; } .summary-segment { display: flex; align-items: center; margin-bottom: .25rem; } .summary-delimiter { width: 5rem; } .summary-format { width: 9rem; } .summary-prop { flex-grow: 1; } .summary-options { margin-bottom: .5rem; } .summary-option:not(:last-child) { margin-right: 1rem; } .summary-actions { display: flex; justify-content: space-between; align-items: center; } .summary-preview { width: 100%; margin-bottom: 1rem; } </style>