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.
252 lines
8.1 KiB
252 lines
8.1 KiB
<template>
|
|
<div id="searchers-create" :class="{'is-defining': isDefining,}">
|
|
|
|
<!-- <h1> {{ searcher.id ? 'Edit' : 'New' }} searcher </h1> -->
|
|
|
|
<Card>
|
|
<template #title>
|
|
{{ searcher.id ? 'Edit' : 'New' }} searcher
|
|
</template>
|
|
<template #content>
|
|
<div class="p-fluid p-formgrid p-grid">
|
|
<div class="p-field p-col-12 p-md-6">
|
|
<label for="searcher-">Searcher name</label>
|
|
<InputText v-model="name"
|
|
type="text"
|
|
placeholder="Enter searcher name"
|
|
class="input"
|
|
id="searcher-name"
|
|
name="searcher-name">
|
|
</InputText>
|
|
</div>
|
|
<div class="p-field p-col-12 p-md-6">
|
|
<label for="lastname">Default tag</label>
|
|
<InputText v-model="tag"
|
|
type="text"
|
|
placeholder="Enter the default tag"
|
|
class="input"
|
|
id="searcher-default-tag"
|
|
name="searcher-default-tag">
|
|
</InputText>
|
|
</div>
|
|
<div class="p-field p-col-12">
|
|
<label for="address">Description</label>
|
|
<Textarea
|
|
v-model="description"
|
|
rows="5"
|
|
placeholder="Enter searcher description"
|
|
id="searcher-description"
|
|
name="searcher-description"
|
|
/>
|
|
</div>
|
|
</div>
|
|
<Message severity="info" v-if="standalone">
|
|
<p>A searcher may contain multiple compounded searchers on multiple rows and columns.</p>
|
|
<p>Each searcher in a row is extending the searching criteria on the content resulted from the
|
|
previous row searchers.</p>
|
|
</Message>
|
|
</template>
|
|
<template #footer>
|
|
<Button @click="onSave" :disabled=" ! name || rows.length === 0">
|
|
Save
|
|
</Button>
|
|
</template>
|
|
</Card>
|
|
|
|
<div v-for="(row, rowIndex) in rows"
|
|
:key="`row-${rowIndex}`"
|
|
class="searchers-row flex-row">
|
|
<div v-for="(searcher, columnIndex) in row"
|
|
:key="`column-${columnIndex}`"
|
|
class="searcher box">
|
|
<searcher-show :searcher="searcher"
|
|
:editable="true"
|
|
:standalone="false"
|
|
@deleted="onRemoveItem(rowIndex, columnIndex)">
|
|
</searcher-show>
|
|
</div>
|
|
|
|
<add-box :ignore-searcher-ids="searcher.id ? [searcher.id] : []"
|
|
@added="(searcher) => { onSearcherAdded(searcher, rowIndex); }">
|
|
</add-box>
|
|
</div>
|
|
|
|
<div class="searchers-row flex-row">
|
|
<add-box @added="onNewRowSearcherAdded">
|
|
</add-box>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script lang="ts">
|
|
import { eventBus } from "@/app";
|
|
import {Component, Prop, Vue} from "vue-property-decorator";
|
|
import AddBox from './AddBox.vue';
|
|
import SearcherShow from './Show.vue';
|
|
|
|
@Component({
|
|
name: 'SearcherCreate',
|
|
|
|
components: {
|
|
AddBox,
|
|
SearcherShow,
|
|
},
|
|
})
|
|
export default class Create extends Vue {
|
|
private id: String = '';
|
|
private name: String = '';
|
|
private description: String = '';
|
|
private tag: String = '';
|
|
private rows: Array<Array<any>> = [];
|
|
|
|
@Prop({
|
|
default: () => {
|
|
return {
|
|
id: '',
|
|
name: '',
|
|
description: '',
|
|
tag: '',
|
|
rows: [],
|
|
};
|
|
}
|
|
})
|
|
public readonly searcher!: any;
|
|
|
|
@Prop({default: true})
|
|
public readonly standalone!: boolean;
|
|
|
|
@Prop({default: true})
|
|
public readonly isDefining!: boolean;
|
|
|
|
@Prop({default: ''})
|
|
public readonly definedSearcher!: string;
|
|
|
|
onNewRowSearcherAdded(searcher: Object) {
|
|
const length = this.rows.push([]);
|
|
|
|
this.onSearcherAdded(searcher, length - 1);
|
|
}
|
|
|
|
async onSearcherAdded(searcher: any, rowIndex: number) {
|
|
try {
|
|
const { data } = await (window as any).axios.get(`/searchers/${searcher.id}`);
|
|
|
|
this.rows[rowIndex].push(data.searcher);
|
|
} catch (e) {
|
|
|
|
}
|
|
}
|
|
|
|
onSave() {
|
|
if (this.standalone) {
|
|
this.save();
|
|
|
|
return;
|
|
}
|
|
|
|
const updatedSearcher = Object.assign(this.searcher, {
|
|
name: this.name,
|
|
description: this.description,
|
|
tag: this.tag,
|
|
rows: this.rows,
|
|
});
|
|
|
|
this.$emit('updated', updatedSearcher);
|
|
}
|
|
|
|
async save() {
|
|
try {
|
|
const searcher = this.id ? await this.update() : await this.create();
|
|
|
|
if (this.isDefining) {
|
|
this.$emit('defined', searcher);
|
|
|
|
return;
|
|
}
|
|
|
|
window.location.href = `/searchers/${searcher.id}`;
|
|
} catch (e) {
|
|
console.log(e);
|
|
console.log('Something went wrong.');
|
|
}
|
|
}
|
|
|
|
async update() {
|
|
const { data } = await (window as any).axios.put(`/searchers/${this.id}`, {
|
|
name: this.name,
|
|
description: this.description,
|
|
tag: this.tag,
|
|
rows: this.rows,
|
|
});
|
|
|
|
return data.searcher;
|
|
}
|
|
|
|
async create() {
|
|
const { data } = await (window as any).axios.post('/searchers', {
|
|
name: this.name,
|
|
description: this.description,
|
|
tag: this.tag,
|
|
rows: this.rows,
|
|
});
|
|
|
|
return data.searcher;
|
|
}
|
|
|
|
onRemoveItem(rowIndex: number, columnIndex: number) {
|
|
if (
|
|
this.rows[rowIndex][columnIndex].hasOwnProperty('rows') &&
|
|
this.rows[rowIndex][columnIndex].rows.length === 0
|
|
) {
|
|
this.$toast.add({
|
|
severity: 'info',
|
|
summary: `${this.searcher.name} searcher deleted`,
|
|
detail: 'The searcher has been deleted as well because it does not have any searching data..',
|
|
life: 4000,
|
|
});
|
|
}
|
|
|
|
this.rows[rowIndex].splice(columnIndex, 1);
|
|
|
|
if (this.rows[rowIndex].length === 0) {
|
|
this.rows.splice(rowIndex, 1);
|
|
}
|
|
}
|
|
|
|
public async changeRoute(url: string) {
|
|
if (this.rows.length > 0) {
|
|
if (this.name === '' || this.name === undefined) {
|
|
this.name = 'Unnamed searcher - ' + Date.now();
|
|
}
|
|
|
|
const searcher = this.id ? await this.update() : await this.create();
|
|
}
|
|
|
|
window.location.href = url;
|
|
}
|
|
|
|
created() {
|
|
// Editing.
|
|
if (this.searcher.id) {
|
|
this.id = this.searcher.id;
|
|
this.rows = this.searcher.rows;
|
|
this.name = this.searcher.name;
|
|
this.description = this.searcher.description;
|
|
this.tag = this.searcher.tag;
|
|
}
|
|
|
|
if (this.isDefining && this.definedSearcher) {
|
|
this.name = this.definedSearcher;
|
|
this.description = '';
|
|
|
|
this.rows.push([
|
|
{
|
|
expression: this.definedSearcher,
|
|
},
|
|
]);
|
|
}
|
|
|
|
eventBus.$on('changeRoute', this.changeRoute);
|
|
}
|
|
};
|
|
</script>
|