Files
mixtape/zero.Backoffice.UI/old_app/search.vue
T

162 lines
3.2 KiB
Vue
Raw Normal View History

2021-09-01 23:09:22 +02:00
<template>
2021-09-03 09:40:36 +02:00
<div class="app-search">
<form class="app-search-form" @submit.prevent="onSubmit">
<input ref="input" class="app-search-form-input" type="search" v-model="query" placeholder="Search..." />
2021-09-03 00:23:39 +02:00
<ui-button class="app-search-submit" :submit="true" type="blank" icon="fth-search" />
2021-09-01 23:09:22 +02:00
</form>
2021-09-03 09:40:36 +02:00
<div v-if="list.items.length" class="app-search-items">
2021-12-23 14:39:00 +01:00
<ui-link :to="item.url" v-for="item in list.items" :key="item.id" class="app-search-item" @click.native="config.close">
2021-09-03 00:23:39 +02:00
<ui-icon :symbol="item.icon" :size="18" class="app-search-item-icon" />
<span class="app-search-item-text">
<span class="app-search-item-name">{{item.name}} <span class="app-search-item-group" v-localize="item.group"></span></span>
<span class="app-search-item-description" v-if="item.description">{{item.description}}</span>
2021-09-01 23:09:22 +02:00
</span>
2021-12-23 14:39:00 +01:00
</ui-link>
2021-09-01 23:09:22 +02:00
</div>
</div>
</template>
<script>
import { map as _map, find as _find } from 'underscore';
import SearchApi from 'zero/api/search.js';
export default {
2021-09-03 09:40:36 +02:00
props: {
model: Object,
config: Object
},
2021-09-01 23:09:22 +02:00
name: 'app-search',
data: () => ({
2021-09-03 00:23:39 +02:00
open: false,
2021-09-01 23:09:22 +02:00
query: null,
2021-09-03 09:40:36 +02:00
list: {
2021-09-01 23:09:22 +02:00
page: 1,
totalPages: 1,
items: []
}
}),
2021-09-03 09:40:36 +02:00
mounted()
{
this.$nextTick(() =>
{
this.$refs.input.focus();
//this.$refs.input.select();
});
},
2021-09-01 23:09:22 +02:00
methods: {
async onSubmit()
{
2021-09-03 09:40:36 +02:00
this.list = await SearchApi.query(this.query);
console.info(this.list);
2021-09-01 23:09:22 +02:00
}
}
}
</script>
<style lang="scss">
2021-09-03 09:40:36 +02:00
.app-search-overlay .app-overlay
2021-09-01 23:09:22 +02:00
{
2021-09-03 09:40:36 +02:00
padding: var(--padding);
2021-09-01 23:09:22 +02:00
}
.app-search-dialog
{
2021-09-03 09:40:36 +02:00
2021-09-01 23:09:22 +02:00
}
.app-search-form
{
2021-09-03 00:23:39 +02:00
position: relative;
}
input.app-search-form-input
{
padding-right: 48px;
}
.app-search-submit
{
position: absolute;
right: 0;
height: 100%;
width: 48px;
justify-content: center;
2021-09-01 23:09:22 +02:00
}
.app-search-items
{
margin-top: var(--padding-s);
font-size: var(--font-size);
2021-09-03 00:23:39 +02:00
max-height: 490px;
overflow-y: auto;
}
.app-search-item
{
display: grid;
width: 100%;
grid-template-columns: 26px 1fr auto;
gap: 12px;
align-items: center;
position: relative;
color: var(--color-text);
padding: var(--padding-xs);
border-radius: var(--radius);
&:hover, &:focus
{
background: var(--color-tree-selected);
}
& + .app-search-item
{
margin-top: 2px;
}
}
.app-search-item-text
{
display: flex;
flex-direction: column;
position: relative;
top: 1px;
}
.app-search-item-name
{
font-size: var(--font-size);
/*display: flex;
flex-direction: row;
align-items: center;
flex-wrap: wrap;*/
}
.app-search-item-description
{
color: var(--color-text-dim);
margin-top: 3px;
}
.app-search-item-group
{
display: block;
2021-09-03 09:40:36 +02:00
font-size: var(--font-size-xs);
color: var(--color-text-dim);
margin-top: 3px;
2021-09-03 00:23:39 +02:00
//margin-left: 8px;
}
.app-search-item-icon
{
position: relative;
top: -1px;
left: 4px;
color: var(--color-text);
2021-09-01 23:09:22 +02:00
}
</style>