Repo for the search and displace core module including the interface to select files and search and displace operations to run on them.
https://searchanddisplace.com
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
279 lines
9.0 KiB
279 lines
9.0 KiB
<template>
|
|
<div id="searchers-show">
|
|
<div>
|
|
<h1 v-if="editable">
|
|
{{ searcher.hasOwnProperty('name') ? searcher.name : searcher.expression }}
|
|
</h1>
|
|
|
|
<h3 v-if=" ! editable">
|
|
{{ searcher.hasOwnProperty('name') ? searcher.name : searcher.expression }}
|
|
</h3>
|
|
|
|
<h5>{{ searcher.description }}</h5>
|
|
|
|
<div v-if="editable && ! ducklingSearcher" style="margin-bottom: 1rem;">
|
|
<a @click="onEdit">
|
|
<Button class="fc-button">
|
|
Edit
|
|
</Button>
|
|
</a>
|
|
|
|
<a @click="onDelete">
|
|
<Button class="fc-button p-button-danger">
|
|
Delete
|
|
</Button>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
|
|
<div v-if=" ! editing"
|
|
v-for="(row, rowIndex) in searcher.rows"
|
|
:key="`row-${rowIndex}`"
|
|
class="searchers-row flex-row">
|
|
<div v-for="(searcherItem, columnIndex) in row"
|
|
:key="`column-${columnIndex}`"
|
|
class="searcher box"
|
|
:class="{'is-highlighted': searcher.hasOwnProperty('highlight')}">
|
|
<template v-if="searcherItem.hasOwnProperty('name')">
|
|
<searcher-show :editable=" ! standalone && editable"
|
|
:standalone="standalone"
|
|
:searcher="searcherItem"
|
|
@deleted="onDeleted(rowIndex, columnIndex)">
|
|
</searcher-show>
|
|
</template>
|
|
|
|
<template v-else>
|
|
<b>{{ searcherItem.expression }}</b>
|
|
|
|
<p>
|
|
<!-- // Show example here, so for example the user has to input the example in order to save-->
|
|
<!-- // the regex, show highlight, so apply regex on example text-->
|
|
</p>
|
|
</template>
|
|
</div>
|
|
</div>
|
|
|
|
<Dialog v-if="editing"
|
|
header="Edit searcher"
|
|
position="center"
|
|
:visible.sync="editing"
|
|
:closable="true"
|
|
:style="{width: '100vw', height: '100vh',}"
|
|
:modal="true">
|
|
<searchers-editor v-if="searcher.hasOwnProperty('name')"
|
|
:searcher="searcher"
|
|
:standalone="true"
|
|
@updated="onSearcherUpdated">
|
|
</searchers-editor>
|
|
|
|
<regex-create v-if="searcher.hasOwnProperty('expression')"
|
|
:regex="searcher.expression"
|
|
@updated="onRegexUpdated">
|
|
</regex-create>
|
|
</Dialog>
|
|
|
|
<Dialog
|
|
header="Delete searcher"
|
|
:visible.sync="deleting"
|
|
:style="{width: '50vw'}"
|
|
:contentStyle="{overflow: 'visible'}"
|
|
id="remove-searcher-dialog"
|
|
ref="remove-searcher-dialog">
|
|
|
|
<p>
|
|
Are you sure you want to delete this searcher?
|
|
</p>
|
|
|
|
<template #footer>
|
|
<Button label="Close"
|
|
icon="pi pi-times"
|
|
@click="deleting = false"
|
|
class="p-button-text"/>
|
|
|
|
<Button
|
|
label="Delete searcher"
|
|
icon="pi pi-check"
|
|
class="p-button-danger p-button-outlined p-button-sm"
|
|
@click="confirmDelete"/>
|
|
</template>
|
|
</Dialog>
|
|
|
|
<!-- <Panel :header="searcher.name">-->
|
|
<!-- <template #icons>-->
|
|
<!-- <a-->
|
|
<!-- class="p-panel-header-icon p-link"-->
|
|
<!-- v-if="editable"-->
|
|
<!-- :href="`/searchers/${searcher.id}/edit`"-->
|
|
<!-- >-->
|
|
<!-- <span class="pi pi-cog"></span>-->
|
|
<!-- </a>-->
|
|
<!-- </template>-->
|
|
|
|
<!-- <div class="p-d-flex p-jc-start">-->
|
|
<!-- <h5>{{ searcher.description }}</h5>-->
|
|
|
|
<!-- <Timeline :value="searcher.rows">-->
|
|
<!-- <template #opposite="slotProps">-->
|
|
<!-- <small class="p-text-secondary">-->
|
|
<!-- {{ slotProps.index + 1 }}-->
|
|
<!-- </small>-->
|
|
<!-- </template>-->
|
|
<!-- <template #content="slotProps">-->
|
|
<!-- <ScrollPanel-->
|
|
<!-- style="max-width: 90vw; height: 125px"-->
|
|
<!-- class="searcher-list"-->
|
|
<!-- >-->
|
|
<!-- <div-->
|
|
<!-- v-for="(-->
|
|
<!-- searcherItem, columnIndex-->
|
|
<!-- ) in slotProps.item"-->
|
|
<!-- :key="`column-${columnIndex}`"-->
|
|
<!-- >-->
|
|
<!-- <div class="box is-plain p-shadow-5">-->
|
|
<!-- <template-->
|
|
<!-- v-if="-->
|
|
<!-- searcherItem.hasOwnProperty('name')-->
|
|
<!-- "-->
|
|
<!-- >-->
|
|
<!-- <searcher-show-->
|
|
<!-- :editable="false"-->
|
|
<!-- :searcher="searcherItem"-->
|
|
<!-- ></searcher-show>-->
|
|
<!-- </template>-->
|
|
|
|
<!-- <template v-else>-->
|
|
<!-- <b>{{ searcherItem.expression }}</b>-->
|
|
<!-- </template>-->
|
|
<!-- </div>-->
|
|
<!-- </div>-->
|
|
<!-- </ScrollPanel>-->
|
|
<!-- <Divider />-->
|
|
<!-- </template>-->
|
|
<!-- </Timeline>-->
|
|
<!-- </div>-->
|
|
<!-- </Panel>-->
|
|
</div>
|
|
</template>
|
|
|
|
<script lang="ts">
|
|
import {Component, Vue, Prop} from "vue-property-decorator";
|
|
import {eventBus} from "@/app";
|
|
|
|
@Component({
|
|
name: 'SearcherShow',
|
|
|
|
components: {
|
|
'searchers-editor': () => import('./Create.vue'),
|
|
},
|
|
})
|
|
export default class Show extends Vue {
|
|
private editing: boolean = false;
|
|
private deleting: boolean = false;
|
|
|
|
@Prop({default: {}})
|
|
public readonly searcher!: any;
|
|
|
|
@Prop({default: true})
|
|
public readonly editable!: boolean;
|
|
|
|
@Prop({default: true})
|
|
public readonly standalone!: boolean;
|
|
|
|
onEdit() {
|
|
if (this.standalone) {
|
|
window.location.href = `/searchers/${this.searcher.id}/edit`;
|
|
|
|
return;
|
|
}
|
|
|
|
this.editing = true;
|
|
}
|
|
|
|
onDelete() {
|
|
if (this.standalone) {
|
|
this.deleting = true;
|
|
|
|
return;
|
|
}
|
|
|
|
this.$emit('deleted');
|
|
}
|
|
|
|
async confirmDelete() {
|
|
try {
|
|
await (window as any).axios.delete(`/searchers/${this.searcher.id}`);
|
|
|
|
this.$toast.add({
|
|
severity: 'success',
|
|
summary: 'Searcher deleted.',
|
|
life: 3000,
|
|
});
|
|
|
|
window.location.href = '/searchers';
|
|
} catch (e) {
|
|
console.log(e);
|
|
}
|
|
}
|
|
|
|
onDeleted(rowIndex: number, columnIndex: number) {
|
|
this.searcher.rows[rowIndex].splice(columnIndex, 1);
|
|
|
|
if (this.searcher.rows[rowIndex].length === 0) {
|
|
this.searcher.rows.splice(rowIndex, 1);
|
|
}
|
|
|
|
if (this.searcher.rows.length === 0) {
|
|
this.$emit('deleted');
|
|
}
|
|
}
|
|
|
|
onRegexUpdated(regex: string) {
|
|
this.$set(this.searcher, 'expression', regex);
|
|
|
|
this.editing = false;
|
|
}
|
|
|
|
onSearcherUpdated(searcher: any) {
|
|
this.$set(this.searcher, 'name', searcher.name);
|
|
this.$set(this.searcher, 'rows', searcher.rows);
|
|
|
|
this.editing = false;
|
|
}
|
|
|
|
get ducklingSearcher(): boolean {
|
|
return this.searcher.type !== 'custom' && ! this.searcher.hasOwnProperty('expression');
|
|
}
|
|
|
|
public async changeRoute(url: string) {
|
|
window.location.href = url;
|
|
}
|
|
|
|
created() {
|
|
eventBus.$on('changeRoute', this.changeRoute);
|
|
}
|
|
};
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
::v-deep .p-timeline-event-opposite {
|
|
flex: 0 !important;
|
|
}
|
|
|
|
::v-deep .p-timeline-event-content {
|
|
margin-bottom: 25px;
|
|
}
|
|
|
|
::v-deep .searcher-list {
|
|
.p-scrollpanel-content {
|
|
display: flex;
|
|
flex-direction: row;
|
|
padding-top: 25px
|
|
}
|
|
|
|
.p-scrollpanel-bar {
|
|
background-color: #1976d2;
|
|
opacity: 1;
|
|
transition: background-color 0.3s;
|
|
}
|
|
}
|
|
</style>
|