Added summary template editor, improved summary template format and options.
This commit is contained in:
@@ -314,6 +314,13 @@
|
||||
@focus="$event.target.select()"
|
||||
>
|
||||
|
||||
<Icon
|
||||
v-tooltip="'Edit template'"
|
||||
icon="pencil5"
|
||||
class="edit"
|
||||
@click="showSummaryDialog = true"
|
||||
/>
|
||||
|
||||
<Icon
|
||||
v-tooltip="'Copy to clipboard'"
|
||||
icon="copy"
|
||||
@@ -324,6 +331,12 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<EditSummary
|
||||
v-if="showSummaryDialog"
|
||||
:release="scene"
|
||||
@close="showSummaryDialog = false"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -331,7 +344,9 @@
|
||||
import { ref, computed, inject } from 'vue';
|
||||
|
||||
import { formatDate, formatDuration } from '#/utils/format.js';
|
||||
import events from '#/src/events.js';
|
||||
import getPath from '#/src/get-path.js';
|
||||
import processSummaryTemplate from '#/utils/process-summary-template.js';
|
||||
|
||||
import ActorTile from '#/components/actors/tile.vue';
|
||||
import MovieTile from '#/components/movies/tile.vue';
|
||||
@@ -339,8 +354,7 @@ import SerieTile from '#/components/series/tile.vue';
|
||||
import Player from '#/components/video/player.vue';
|
||||
import Heart from '#/components/stashes/heart.vue';
|
||||
import Campaign from '#/components/campaigns/campaign.vue';
|
||||
|
||||
import summaryTemplate from '#/assets/summary.yaml';
|
||||
import EditSummary from '#/components/scenes/edit-summary.vue';
|
||||
|
||||
const { pageProps, campaigns } = inject('pageContext');
|
||||
const { scene } = pageProps;
|
||||
@@ -348,6 +362,8 @@ const { scene } = pageProps;
|
||||
const playing = ref(false);
|
||||
const paused = ref(false);
|
||||
|
||||
const showSummaryDialog = ref(false);
|
||||
|
||||
const qualities = {
|
||||
2160: '4K',
|
||||
1440: 'Quad HD',
|
||||
@@ -375,62 +391,24 @@ const poster = computed(() => {
|
||||
return null;
|
||||
});
|
||||
|
||||
const propProcessors = {
|
||||
channel: (sceneInfo) => sceneInfo.channel?.name || sceneInfo.network?.name,
|
||||
network: (sceneInfo) => sceneInfo.network?.name || sceneInfo.channel?.name,
|
||||
actors: (sceneInfo) => sceneInfo.actors.map((actor) => actor.name),
|
||||
movie: (sceneInfo) => sceneInfo.movies[0]?.title,
|
||||
date: (sceneInfo, format) => formatDate(sceneInfo.effectiveDate, format),
|
||||
};
|
||||
|
||||
function processTemplate(chain, delimit = ' ', wrapOpen = '', wrapClose = '') {
|
||||
const results = chain.reduce((result, item) => {
|
||||
if (typeof item === 'string') {
|
||||
const [prop, format] = item.split('|');
|
||||
const value = propProcessors[prop]?.(scene, format) || scene[prop];
|
||||
|
||||
if (Array.isArray(value)) {
|
||||
return result.concat(value.join(format || ', '));
|
||||
}
|
||||
|
||||
return result.concat(value);
|
||||
}
|
||||
|
||||
if (Array.isArray(item)) {
|
||||
const values = processTemplate(item, ', ');
|
||||
|
||||
return result.concat(values);
|
||||
}
|
||||
|
||||
if (typeof item === 'object') {
|
||||
const [meta, items] = Object.entries(item)[0];
|
||||
const [delimiter, wrapStart, wrapEnd] = meta.split('|');
|
||||
const values = processTemplate(items, delimiter, wrapStart, wrapEnd);
|
||||
|
||||
return result.concat(values);
|
||||
}
|
||||
|
||||
return [];
|
||||
}, []);
|
||||
|
||||
if (results.length > 0) {
|
||||
return `${wrapOpen}${results.filter(Boolean).join(delimit)}${wrapClose}`;
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
|
||||
const summary = (() => {
|
||||
try {
|
||||
return processTemplate(summaryTemplate);
|
||||
const result = processSummaryTemplate(scene);
|
||||
|
||||
return result;
|
||||
} catch (error) {
|
||||
console.error(`Failed to process template: ${error.message}`);
|
||||
console.error(`Failed to process summary template: ${error.message}`);
|
||||
return null;
|
||||
}
|
||||
})();
|
||||
|
||||
function copySummary() {
|
||||
navigator.clipboard.writeText(summary);
|
||||
|
||||
events.emit('feedback', {
|
||||
type: 'success',
|
||||
message: 'Summary copied to clipboard',
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user