forked from DebaucheryLibrarian/traxxx
328 lines
6.9 KiB
Vue
328 lines
6.9 KiB
Vue
<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>
|