refactor: teleport for modals

This commit is contained in:
Fabio Di Stasio 2022-04-25 13:45:07 +02:00
parent 6780401cb7
commit 8b04a2b7dd
18 changed files with 1364 additions and 1340 deletions

View File

@ -1,45 +1,47 @@
<template> <template>
<div class="modal active" :class="modalSizeClass"> <Teleport to="#window-content">
<a class="modal-overlay" @click="hideModal" /> <div class="modal active" :class="modalSizeClass">
<div class="modal-container"> <a class="modal-overlay" @click="hideModal" />
<div v-if="hasHeader" class="modal-header pl-2"> <div class="modal-container">
<div class="modal-title h6"> <div v-if="hasHeader" class="modal-header pl-2">
<slot name="header" /> <div class="modal-title h6">
<slot name="header" />
</div>
<a class="btn btn-clear float-right" @click="hideModal" />
</div> </div>
<a class="btn btn-clear float-right" @click="hideModal" /> <div v-if="hasDefault" class="modal-header">
</div> <div class="modal-title h6">
<div v-if="hasDefault" class="modal-header"> <slot />
<div class="modal-title h6"> </div>
<slot /> <a class="btn btn-clear float-right" @click="hideModal" />
</div> </div>
<a class="btn btn-clear float-right" @click="hideModal" /> <div v-if="hasBody" class="modal-body">
</div> <a
<div v-if="hasBody" class="modal-body"> v-if="!hasHeader && !hasDefault"
<a class="btn btn-clear float-right"
v-if="!hasHeader && !hasDefault" @click="hideModal"
class="btn btn-clear float-right" />
@click="hideModal" <div class="content">
/> <slot name="body" />
<div class="content"> </div>
<slot name="body" /> </div>
<div v-if="!hideFooter" class="modal-footer pt-0">
<button
class="btn btn-primary mr-2"
@click.stop="confirmModal"
>
{{ confirmText || $t('word.confirm') }}
</button>
<button
class="btn btn-link"
@click="hideModal"
>
{{ cancelText || $t('word.cancel') }}
</button>
</div> </div>
</div>
<div v-if="!hideFooter" class="modal-footer">
<button
class="btn btn-primary mr-2"
@click.stop="confirmModal"
>
{{ confirmText || $t('word.confirm') }}
</button>
<button
class="btn btn-link"
@click="hideModal"
>
{{ cancelText || $t('word.cancel') }}
</button>
</div> </div>
</div> </div>
</div> </Teleport>
</template> </template>
<script> <script>

View File

@ -1,56 +1,58 @@
<template> <template>
<div class="modal active modal-sm"> <Teleport to="#window-content">
<a class="modal-overlay" /> <div class="modal active modal-sm">
<div class="modal-container p-0"> <a class="modal-overlay" />
<div class="modal-header pl-2"> <div class="modal-container p-0">
<div class="modal-title h6"> <div class="modal-header pl-2">
<div class="d-flex"> <div class="modal-title h6">
<i class="mdi mdi-24px mdi-key-variant mr-1" /> {{ $t('word.credentials') }} <div class="d-flex">
<i class="mdi mdi-24px mdi-key-variant mr-1" /> {{ $t('word.credentials') }}
</div>
</div>
<a class="btn btn-clear c-hand" @click.stop="closeModal" />
</div>
<div class="modal-body pb-0">
<div class="content">
<form class="form-horizontal">
<div class="form-group">
<div class="col-3">
<label class="form-label">{{ $t('word.user') }}</label>
</div>
<div class="col-9">
<input
ref="firstInput"
v-model="credentials.user"
class="form-input"
type="text"
>
</div>
</div>
<div class="form-group">
<div class="col-3">
<label class="form-label">{{ $t('word.password') }}</label>
</div>
<div class="col-9">
<input
v-model="credentials.password"
class="form-input"
type="password"
>
</div>
</div>
</form>
</div> </div>
</div> </div>
<a class="btn btn-clear c-hand" @click.stop="closeModal" /> <div class="modal-footer">
</div> <button class="btn btn-primary mr-2" @click.stop="sendCredentials">
<div class="modal-body pb-0"> {{ $t('word.send') }}
<div class="content"> </button>
<form class="form-horizontal"> <button class="btn btn-link" @click.stop="closeModal">
<div class="form-group"> {{ $t('word.close') }}
<div class="col-3"> </button>
<label class="form-label">{{ $t('word.user') }}</label>
</div>
<div class="col-9">
<input
ref="firstInput"
v-model="credentials.user"
class="form-input"
type="text"
>
</div>
</div>
<div class="form-group">
<div class="col-3">
<label class="form-label">{{ $t('word.password') }}</label>
</div>
<div class="col-9">
<input
v-model="credentials.password"
class="form-input"
type="password"
>
</div>
</div>
</form>
</div> </div>
</div> </div>
<div class="modal-footer">
<button class="btn btn-primary mr-2" @click.stop="sendCredentials">
{{ $t('word.send') }}
</button>
<button class="btn btn-link" @click.stop="closeModal">
{{ $t('word.close') }}
</button>
</div>
</div> </div>
</div> </Teleport>
</template> </template>
<script> <script>

View File

@ -1,68 +1,70 @@
<template> <template>
<div class="modal active"> <Teleport to="#window-content">
<a class="modal-overlay" @click.stop="closeModal" /> <div class="modal active">
<div class="modal-container p-0"> <a class="modal-overlay" @click.stop="closeModal" />
<div class="modal-header pl-2"> <div class="modal-container p-0">
<div class="modal-title h6"> <div class="modal-header pl-2">
<div class="d-flex"> <div class="modal-title h6">
<i class="mdi mdi-24px mdi-database-edit mr-1" /> <div class="d-flex">
<span class="cut-text">{{ $t('message.editSchema') }}</span> <i class="mdi mdi-24px mdi-database-edit mr-1" />
<span class="cut-text">{{ $t('message.editSchema') }}</span>
</div>
</div>
<a class="btn btn-clear c-hand" @click.stop="closeModal" />
</div>
<div class="modal-body pb-0">
<div class="content">
<form class="form-horizontal">
<div class="form-group">
<div class="col-3">
<label class="form-label">{{ $t('word.name') }}</label>
</div>
<div class="col-9">
<input
v-model="database.name"
class="form-input"
type="text"
required
:placeholder="$t('message.schemaName')"
readonly
>
</div>
</div>
<div class="form-group">
<div class="col-3">
<label class="form-label">{{ $t('word.collation') }}</label>
</div>
<div class="col-9">
<select
ref="firstInput"
v-model="database.collation"
class="form-select"
>
<option
v-for="collation in collations"
:key="collation.id"
:value="collation.collation"
>
{{ collation.collation }}
</option>
</select>
<small>{{ $t('message.serverDefault') }}: {{ defaultCollation }}</small>
</div>
</div>
</form>
</div> </div>
</div> </div>
<a class="btn btn-clear c-hand" @click.stop="closeModal" /> <div class="modal-footer">
</div> <button class="btn btn-primary mr-2" @click.stop="updateSchema">
<div class="modal-body pb-0"> {{ $t('word.update') }}
<div class="content"> </button>
<form class="form-horizontal"> <button class="btn btn-link" @click.stop="closeModal">
<div class="form-group"> {{ $t('word.close') }}
<div class="col-3"> </button>
<label class="form-label">{{ $t('word.name') }}</label>
</div>
<div class="col-9">
<input
v-model="database.name"
class="form-input"
type="text"
required
:placeholder="$t('message.schemaName')"
readonly
>
</div>
</div>
<div class="form-group">
<div class="col-3">
<label class="form-label">{{ $t('word.collation') }}</label>
</div>
<div class="col-9">
<select
ref="firstInput"
v-model="database.collation"
class="form-select"
>
<option
v-for="collation in collations"
:key="collation.id"
:value="collation.collation"
>
{{ collation.collation }}
</option>
</select>
<small>{{ $t('message.serverDefault') }}: {{ defaultCollation }}</small>
</div>
</div>
</form>
</div> </div>
</div> </div>
<div class="modal-footer">
<button class="btn btn-primary mr-2" @click.stop="updateSchema">
{{ $t('word.update') }}
</button>
<button class="btn btn-link" @click.stop="closeModal">
{{ $t('word.close') }}
</button>
</div>
</div> </div>
</div> </Teleport>
</template> </template>
<script> <script>

View File

@ -1,270 +1,272 @@
<template> <template>
<div class="modal active"> <Teleport to="#window-content">
<a class="modal-overlay" @click.stop="closeModal" /> <div class="modal active">
<div class="modal-container p-0"> <a class="modal-overlay" @click.stop="closeModal" />
<div class="modal-header pl-2"> <div class="modal-container p-0">
<div class="modal-title h6"> <div class="modal-header pl-2">
<div class="d-flex"> <div class="modal-title h6">
<i class="mdi mdi-24px mdi-database-arrow-down mr-1" /> <div class="d-flex">
<span class="cut-text">{{ $t('message.exportSchema') }}</span> <i class="mdi mdi-24px mdi-database-arrow-down mr-1" />
</div> <span class="cut-text">{{ $t('message.exportSchema') }}</span>
</div>
<a class="btn btn-clear c-hand" @click.stop="closeModal" />
</div>
<div class="modal-body pb-0">
<div class="container">
<div class="columns">
<div class="col-3">
<label class="form-label">{{ $t('message.directoryPath') }}</label>
</div>
<div class="col-9">
<fieldset class="input-group">
<input
v-model="basePath"
class="form-input"
type="text"
required
readonly
:placeholder="$t('message.schemaName')"
>
<button
type="button"
class="btn btn-primary input-group-btn"
@click.prevent="openPathDialog"
>
{{ $t('word.change') }}
</button>
</fieldset>
</div> </div>
</div> </div>
<a class="btn btn-clear c-hand" @click.stop="closeModal" />
</div> </div>
<div class="modal-body pb-0">
<div class="columns export-options"> <div class="container">
<div class="column col-8 left"> <div class="columns">
<div class="columns mb-2"> <div class="col-3">
<div class="column col-auto d-flex text-italic "> <label class="form-label">{{ $t('message.directoryPath') }}</label>
<i class="mdi mdi-file-document-outline mr-2" />
{{ filename }}
</div> </div>
<div class="col-9">
<div class="column col-auto col-ml-auto "> <fieldset class="input-group">
<button <input
class="btn btn-dark btn-sm" v-model="basePath"
:title="$t('word.refresh')" class="form-input"
@click="refresh" type="text"
> required
<i class="mdi mdi-database-refresh" /> readonly
</button> :placeholder="$t('message.schemaName')"
<button
class="btn btn-dark btn-sm"
:title="$t('message.uncheckAllTables')"
:disabled="isRefreshing"
@click="uncheckAllTables"
>
<i class="mdi mdi-file-tree-outline" />
</button>
<button
class="btn btn-dark btn-sm"
:title="$t('message.checkAllTables')"
:disabled="isRefreshing"
@click="checkAllTables"
>
<i class="mdi mdi-file-tree" />
</button>
</div>
</div>
<div class="workspace-query-results">
<div ref="table" class="table table-hover">
<div class="thead">
<div class="tr text-center">
<div class="th no-border" style="width: 50%;" />
<div class="th no-border">
<label
class="form-checkbox m-0 px-2 form-inline"
@click.prevent="toggleAllTablesOption('includeStructure')"
>
<input
type="checkbox"
:indeterminate="includeStructureStatus === 2"
:checked="!!includeStructureStatus"
>
<i class="form-icon" />
</label>
</div>
<div class="th no-border">
<label
class="form-checkbox m-0 px-2 form-inline"
@click.prevent="toggleAllTablesOption('includeContent')"
>
<input
type="checkbox"
:indeterminate="includeContentStatus === 2"
:checked="!!includeContentStatus"
>
<i class="form-icon" />
</label>
</div>
<div class="th no-border">
<label
class="form-checkbox m-0 px-2 form-inline"
@click.prevent="toggleAllTablesOption('includeDropStatement')"
>
<input
type="checkbox"
:indeterminate="includeDropStatementStatus === 2"
:checked="!!includeDropStatementStatus"
>
<i class="form-icon" />
</label>
</div>
</div>
<div class="tr">
<div class="th" style="width: 50%;">
<div class="table-column-title">
<span>{{ $t('word.table') }}</span>
</div>
</div>
<div class="th text-center">
<div class="table-column-title">
<span>{{ $t('word.structure') }}</span>
</div>
</div>
<div class="th text-center">
<div class="table-column-title">
<span>{{ $t('word.content') }}</span>
</div>
</div>
<div class="th text-center">
<div class="table-column-title">
<span>{{ $t('word.drop') }}</span>
</div>
</div>
</div>
</div>
<div class="tbody">
<div
v-for="item in tables"
:key="item.name"
class="tr"
> >
<div class="td"> <button
{{ item.table }} type="button"
class="btn btn-primary input-group-btn"
@click.prevent="openPathDialog"
>
{{ $t('word.change') }}
</button>
</fieldset>
</div>
</div>
</div>
<div class="columns export-options">
<div class="column col-8 left">
<div class="columns mb-2">
<div class="column col-auto d-flex text-italic ">
<i class="mdi mdi-file-document-outline mr-2" />
{{ filename }}
</div>
<div class="column col-auto col-ml-auto ">
<button
class="btn btn-dark btn-sm"
:title="$t('word.refresh')"
@click="refresh"
>
<i class="mdi mdi-database-refresh" />
</button>
<button
class="btn btn-dark btn-sm mx-1"
:title="$t('message.uncheckAllTables')"
:disabled="isRefreshing"
@click="uncheckAllTables"
>
<i class="mdi mdi-file-tree-outline" />
</button>
<button
class="btn btn-dark btn-sm"
:title="$t('message.checkAllTables')"
:disabled="isRefreshing"
@click="checkAllTables"
>
<i class="mdi mdi-file-tree" />
</button>
</div>
</div>
<div class="workspace-query-results">
<div ref="table" class="table table-hover">
<div class="thead">
<div class="tr text-center">
<div class="th no-border" style="width: 50%;" />
<div class="th no-border">
<label
class="form-checkbox m-0 px-2 form-inline"
@click.prevent="toggleAllTablesOption('includeStructure')"
>
<input
type="checkbox"
:indeterminate="includeStructureStatus === 2"
:checked="!!includeStructureStatus"
>
<i class="form-icon" />
</label>
</div>
<div class="th no-border">
<label
class="form-checkbox m-0 px-2 form-inline"
@click.prevent="toggleAllTablesOption('includeContent')"
>
<input
type="checkbox"
:indeterminate="includeContentStatus === 2"
:checked="!!includeContentStatus"
>
<i class="form-icon" />
</label>
</div>
<div class="th no-border">
<label
class="form-checkbox m-0 px-2 form-inline"
@click.prevent="toggleAllTablesOption('includeDropStatement')"
>
<input
type="checkbox"
:indeterminate="includeDropStatementStatus === 2"
:checked="!!includeDropStatementStatus"
>
<i class="form-icon" />
</label>
</div>
</div> </div>
<div class="td text-center"> <div class="tr">
<label class="form-checkbox m-0 px-2 form-inline"> <div class="th" style="width: 50%;">
<input <div class="table-column-title">
v-model="item.includeStructure" <span>{{ $t('word.table') }}</span>
type="checkbox" </div>
><i class="form-icon" /> </div>
</label> <div class="th text-center">
<div class="table-column-title">
<span>{{ $t('word.structure') }}</span>
</div>
</div>
<div class="th text-center">
<div class="table-column-title">
<span>{{ $t('word.content') }}</span>
</div>
</div>
<div class="th text-center">
<div class="table-column-title">
<span>{{ $t('word.drop') }}</span>
</div>
</div>
</div> </div>
<div class="td text-center"> </div>
<label class="form-checkbox m-0 px-2 form-inline">
<input <div class="tbody">
v-model="item.includeContent" <div
type="checkbox" v-for="item in tables"
><i class="form-icon" /> :key="item.name"
</label> class="tr"
</div> >
<div class="td text-center"> <div class="td">
<label class="form-checkbox m-0 px-2 form-inline"> {{ item.table }}
<input </div>
v-model="item.includeDropStatement" <div class="td text-center">
type="checkbox" <label class="form-checkbox m-0 px-2 form-inline">
><i class="form-icon" /> <input
</label> v-model="item.includeStructure"
type="checkbox"
><i class="form-icon" />
</label>
</div>
<div class="td text-center">
<label class="form-checkbox m-0 px-2 form-inline">
<input
v-model="item.includeContent"
type="checkbox"
><i class="form-icon" />
</label>
</div>
<div class="td text-center">
<label class="form-checkbox m-0 px-2 form-inline">
<input
v-model="item.includeDropStatement"
type="checkbox"
><i class="form-icon" />
</label>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> <div class="column col-4">
<div class="column col-4"> <h5 class="h5">
<h5 class="h5"> {{ $t('word.options') }}
{{ $t('word.options') }} </h5>
</h5> <span class="h6">{{ $t('word.includes') }}:</span>
<span class="h6">{{ $t('word.includes') }}:</span> <label
<label v-for="(_, key) in options.includes"
v-for="(_, key) in options.includes" :key="key"
:key="key" class="form-checkbox"
class="form-checkbox" >
> <input v-model="options.includes[key]" type="checkbox"><i class="form-icon" /> {{ $tc(`word.${key}`, 2) }}
<input v-model="options.includes[key]" type="checkbox"><i class="form-icon" /> {{ $tc(`word.${key}`, 2) }} </label>
</label> <div v-if="customizations.exportByChunks">
<div v-if="customizations.exportByChunks"> <div class="h6 mt-4 mb-2">
<div class="h6 mt-4 mb-2"> {{ $t('message.newInserStmtEvery') }}:
{{ $t('message.newInserStmtEvery') }}: </div>
<div class="columns">
<div class="column col-6">
<input
v-model.number="options.sqlInsertAfter"
type="number"
class="form-input"
>
</div>
<div class="column col-6">
<select v-model="options.sqlInsertDivider" class="form-select">
<option value="bytes">
KiB
</option>
<option value="rows">
{{ $tc('word.row', 2) }}
</option>
</select>
</div>
</div>
</div>
<div class="h6 mb-2 mt-4">
{{ $t('message.ourputFormat') }}:
</div> </div>
<div class="columns"> <div class="columns">
<div class="column col-6"> <div class="column h5 mb-4">
<input <select v-model="options.outputFormat" class="form-select">
v-model.number="options.sqlInsertAfter" <option value="sql">
type="number" {{ $t('message.singleFile', {ext: '.sql'}) }}
class="form-input"
>
</div>
<div class="column col-6">
<select v-model="options.sqlInsertDivider" class="form-select">
<option value="bytes">
KiB
</option> </option>
<option value="rows"> <option value="sql.zip">
{{ $tc('word.row', 2) }} {{ $t('message.zipCompressedFile', {ext: '.sql'}) }}
</option> </option>
</select> </select>
</div> </div>
</div> </div>
</div> </div>
<div class="h6 mb-2 mt-4">
{{ $t('message.ourputFormat') }}:
</div>
<div class="columns">
<div class="column h5 mb-4">
<select v-model="options.outputFormat" class="form-select">
<option value="sql">
{{ $t('message.singleFile', {ext: '.sql'}) }}
</option>
<option value="sql.zip">
{{ $t('message.zipCompressedFile', {ext: '.sql'}) }}
</option>
</select>
</div>
</div>
</div> </div>
</div> </div>
</div> <div class="modal-footer columns">
<div class="modal-footer columns"> <div class="column col modal-progress-wrapper text-left">
<div class="column col modal-progress-wrapper text-left"> <div v-if="progressPercentage > 0" class="export-progress">
<div v-if="progressPercentage > 0" class="export-progress"> <span class="progress-status">
<span class="progress-status"> {{ progressPercentage }}% - {{ progressStatus }}
{{ progressPercentage }}% - {{ progressStatus }} </span>
</span> <progress
<progress class="progress d-block"
class="progress d-block" :value="progressPercentage"
:value="progressPercentage" max="100"
max="100" />
/> </div>
</div>
<div class="column col-auto px-0">
<button class="btn btn-link" @click.stop="closeModal">
{{ $t('word.close') }}
</button>
<button
class="btn btn-primary mr-2"
:class="{'loading': isExporting}"
:disabled="isExporting || isRefreshing"
autofocus
@click.prevent="startExport"
>
{{ $t('word.export') }}
</button>
</div> </div>
</div>
<div class="column col-auto px-0">
<button class="btn btn-link" @click.stop="closeModal">
{{ $t('word.close') }}
</button>
<button
class="btn btn-primary mr-2"
:class="{'loading': isExporting}"
:disabled="isExporting || isRefreshing"
autofocus
@click.prevent="startExport"
>
{{ $t('word.export') }}
</button>
</div> </div>
</div> </div>
</div> </div>
</div> </Teleport>
</template> </template>
<script> <script>

View File

@ -1,186 +1,188 @@
<template> <template>
<div class="modal active"> <Teleport to="#window-content">
<a class="modal-overlay" @click.stop="closeModal" /> <div class="modal active">
<div class="modal-container p-0"> <a class="modal-overlay" @click.stop="closeModal" />
<div class="modal-header pl-2"> <div class="modal-container p-0">
<div class="modal-title h6"> <div class="modal-header pl-2">
<div class="d-flex"> <div class="modal-title h6">
<i class="mdi mdi-24px mdi-playlist-plus mr-1" /> <div class="d-flex">
<span class="cut-text">{{ $tc('message.insertRow', 2) }}</span> <i class="mdi mdi-24px mdi-playlist-plus mr-1" />
<span class="cut-text">{{ $tc('message.insertRow', 2) }}</span>
</div>
</div>
<a class="btn btn-clear c-hand" @click.stop="closeModal" />
</div>
<div class="modal-body pb-0">
<div class="content">
<form class="form-horizontal">
<fieldset :disabled="isInserting">
<div
v-for="field in fields"
:key="field.name"
class="form-group"
>
<div class="col-3 col-sm-12">
<label class="form-label" :title="field.name">{{ field.name }}</label>
</div>
<div class="column columns col-sm-12">
<FakerSelect
v-model="localRow[field.name]"
:type="field.type"
class="column columns pr-0"
:is-checked="!fieldsToExclude.includes(field.name)"
:foreign-keys="foreignKeys"
:key-usage="keyUsage"
:field="field"
:field-length="fieldLength(field)"
:field-obj="localRow[field.name]"
>
<span class="input-group-addon field-type" :class="typeClass(field.type)">
{{ field.type }} {{ wrapNumber(fieldLength(field)) }}
</span>
<label class="form-checkbox ml-3" :title="$t('word.insert')">
<input
type="checkbox"
:checked="!fieldsToExclude.includes(field.name)"
@change.prevent="toggleFields($event, field)"
><i class="form-icon" />
</label>
</FakerSelect>
</div>
</div>
</fieldset>
</form>
</div> </div>
</div> </div>
<a class="btn btn-clear c-hand" @click.stop="closeModal" /> <div class="modal-footer columns">
</div> <div class="column d-flex" :class="hasFakes ? 'col-4' : 'col-2'">
<div class="modal-body pb-0"> <div class="input-group tooltip tooltip-right" :data-tooltip="$t('message.numberOfInserts')">
<div class="content"> <input
<form class="form-horizontal"> v-model="nInserts"
<fieldset :disabled="isInserting"> type="number"
<div class="form-input"
v-for="field in fields" min="1"
:key="field.name" :disabled="isInserting"
class="form-group"
> >
<div class="col-3 col-sm-12"> <span class="input-group-addon">
<label class="form-label" :title="field.name">{{ field.name }}</label> <i class="mdi mdi-24px mdi-repeat" />
</div> </span>
<div class="column columns col-sm-12"> </div>
<FakerSelect <div
v-model="localRow[field.name]" v-if="hasFakes"
:type="field.type" class="tooltip tooltip-right ml-2"
class="column columns pr-0" :data-tooltip="$t('message.fakeDataLanguage')"
:is-checked="!fieldsToExclude.includes(field.name)"
:foreign-keys="foreignKeys"
:key-usage="keyUsage"
:field="field"
:field-length="fieldLength(field)"
:field-obj="localRow[field.name]"
>
<span class="input-group-addon field-type" :class="typeClass(field.type)">
{{ field.type }} {{ wrapNumber(fieldLength(field)) }}
</span>
<label class="form-checkbox ml-3" :title="$t('word.insert')">
<input
type="checkbox"
:checked="!fieldsToExclude.includes(field.name)"
@change.prevent="toggleFields($event, field)"
><i class="form-icon" />
</label>
</FakerSelect>
</div>
</div>
</fieldset>
</form>
</div>
</div>
<div class="modal-footer columns">
<div class="column d-flex" :class="hasFakes ? 'col-4' : 'col-2'">
<div class="input-group tooltip tooltip-right" :data-tooltip="$t('message.numberOfInserts')">
<input
v-model="nInserts"
type="number"
class="form-input"
min="1"
:disabled="isInserting"
> >
<span class="input-group-addon"> <select v-model="fakerLocale" class="form-select">
<i class="mdi mdi-24px mdi-repeat" /> <option value="ar">
</span> Arabic
</option><option value="az">
Azerbaijani
</option><option value="zh_CN">
Chinese
</option><option value="zh_TW">
Chinese (Taiwan)
</option><option value="cz">
Czech
</option><option value="nl">
Dutch
</option><option value="nl_BE">
Dutch (Belgium)
</option><option value="en">
English
</option><option value="en_AU_ocker">
English (Australia Ocker)
</option><option value="en_AU">
English (Australia)
</option><option value="en_BORK">
English (Bork)
</option><option value="en_CA">
English (Canada)
</option><option value="en_GB">
English (Great Britain)
</option><option value="en_IND">
English (India)
</option><option value="en_IE">
English (Ireland)
</option><option value="en_ZA">
English (South Africa)
</option><option value="en_US">
English (United States)
</option><option value="fa">
Farsi
</option><option value="fi">
Finnish
</option><option value="fr">
French
</option><option value="fr_CA">
French (Canada)
</option><option value="fr_CH">
French (Switzerland)
</option><option value="ge">
Georgian
</option><option value="de">
German
</option><option value="de_AT">
German (Austria)
</option><option value="de_CH">
German (Switzerland)
</option><option value="hr">
Hrvatski
</option><option value="id_ID">
Indonesia
</option><option value="it">
Italian
</option><option value="ja">
Japanese
</option><option value="ko">
Korean
</option><option value="nep">
Nepalese
</option><option value="nb_NO">
Norwegian
</option><option value="pl">
Polish
</option><option value="pt_BR">
Portuguese (Brazil)
</option><option value="pt_PT">
Portuguese (Portugal)
</option><option value="ro">
Romanian
</option><option value="ru">
Russian
</option><option value="sk">
Slovakian
</option><option value="es">
Spanish
</option><option value="es_MX">
Spanish (Mexico)
</option><option value="sv">
Swedish
</option><option value="tr">
Turkish
</option><option value="uk">
Ukrainian
</option><option value="vi">
Vietnamese
</option>
</select>
</div>
</div> </div>
<div <div class="column col-auto">
v-if="hasFakes" <button
class="tooltip tooltip-right ml-2" class="btn btn-primary mr-2"
:data-tooltip="$t('message.fakeDataLanguage')" :class="{'loading': isInserting}"
> @click.stop="insertRows"
<select v-model="fakerLocale" class="form-select"> >
<option value="ar"> {{ $t('word.insert') }}
Arabic </button>
</option><option value="az"> <button class="btn btn-link" @click.stop="closeModal">
Azerbaijani {{ $t('word.close') }}
</option><option value="zh_CN"> </button>
Chinese
</option><option value="zh_TW">
Chinese (Taiwan)
</option><option value="cz">
Czech
</option><option value="nl">
Dutch
</option><option value="nl_BE">
Dutch (Belgium)
</option><option value="en">
English
</option><option value="en_AU_ocker">
English (Australia Ocker)
</option><option value="en_AU">
English (Australia)
</option><option value="en_BORK">
English (Bork)
</option><option value="en_CA">
English (Canada)
</option><option value="en_GB">
English (Great Britain)
</option><option value="en_IND">
English (India)
</option><option value="en_IE">
English (Ireland)
</option><option value="en_ZA">
English (South Africa)
</option><option value="en_US">
English (United States)
</option><option value="fa">
Farsi
</option><option value="fi">
Finnish
</option><option value="fr">
French
</option><option value="fr_CA">
French (Canada)
</option><option value="fr_CH">
French (Switzerland)
</option><option value="ge">
Georgian
</option><option value="de">
German
</option><option value="de_AT">
German (Austria)
</option><option value="de_CH">
German (Switzerland)
</option><option value="hr">
Hrvatski
</option><option value="id_ID">
Indonesia
</option><option value="it">
Italian
</option><option value="ja">
Japanese
</option><option value="ko">
Korean
</option><option value="nep">
Nepalese
</option><option value="nb_NO">
Norwegian
</option><option value="pl">
Polish
</option><option value="pt_BR">
Portuguese (Brazil)
</option><option value="pt_PT">
Portuguese (Portugal)
</option><option value="ro">
Romanian
</option><option value="ru">
Russian
</option><option value="sk">
Slovakian
</option><option value="es">
Spanish
</option><option value="es_MX">
Spanish (Mexico)
</option><option value="sv">
Swedish
</option><option value="tr">
Turkish
</option><option value="uk">
Ukrainian
</option><option value="vi">
Vietnamese
</option>
</select>
</div> </div>
</div> </div>
<div class="column col-auto">
<button
class="btn btn-primary mr-2"
:class="{'loading': isInserting}"
@click.stop="insertRows"
>
{{ $t('word.insert') }}
</button>
<button class="btn btn-link" @click.stop="closeModal">
{{ $t('word.close') }}
</button>
</div>
</div> </div>
</div> </div>
</div> </Teleport>
</template> </template>
<script> <script>

View File

@ -1,98 +1,100 @@
<template> <template>
<div class="modal active"> <Teleport to="#window-content">
<a class="modal-overlay" @click.stop="closeModal" /> <div class="modal active">
<div class="modal-container p-0 pb-4"> <a class="modal-overlay" @click.stop="closeModal" />
<div class="modal-header pl-2"> <div class="modal-container p-0 pb-4">
<div class="modal-title h6"> <div class="modal-header pl-2">
<div class="d-flex"> <div class="modal-title h6">
<i class="mdi mdi-24px mdi-history mr-1" /> <div class="d-flex">
<span class="cut-text">{{ $t('word.history') }}: {{ connectionName }}</span> <i class="mdi mdi-24px mdi-history mr-1" />
<span class="cut-text">{{ $t('word.history') }}: {{ connectionName }}</span>
</div>
</div> </div>
<a class="btn btn-clear c-hand" @click.stop="closeModal" />
</div> </div>
<a class="btn btn-clear c-hand" @click.stop="closeModal" /> <div class="modal-body p-0 workspace-query-results">
</div> <div
<div class="modal-body p-0 workspace-query-results"> v-if="history.length"
<div ref="searchForm"
v-if="history.length" class="form-group has-icon-right p-2 m-0"
ref="searchForm"
class="form-group has-icon-right p-2 m-0"
>
<input
v-model="searchTerm"
class="form-input"
type="text"
:placeholder="$t('message.searchForQueries')"
> >
<i v-if="!searchTerm" class="form-icon mdi mdi-magnify mdi-18px pr-4" /> <input
<i v-model="searchTerm"
v-else class="form-input"
class="form-icon c-hand mdi mdi-backspace mdi-18px pr-4" type="text"
@click="searchTerm = ''" :placeholder="$t('message.searchForQueries')"
/>
</div>
<div
v-if="history.length"
ref="tableWrapper"
class="vscroll px-1 "
:style="{'height': resultsSize+'px'}"
>
<div ref="table">
<BaseVirtualScroll
ref="resultTable"
:items="filteredHistory"
:item-height="66"
:visible-height="resultsSize"
:scroll-element="scrollElement"
> >
<template #default="{ items }"> <i v-if="!searchTerm" class="form-icon mdi mdi-magnify mdi-18px pr-4" />
<div <i
v-for="query in items" v-else
:key="query.uid" class="form-icon c-hand mdi mdi-backspace mdi-18px pr-4"
class="tile my-2" @click="searchTerm = ''"
tabindex="0" />
> </div>
<div class="tile-icon"> <div
<i class="mdi mdi-code-tags pr-1" /> v-if="history.length"
</div> ref="tableWrapper"
<div class="tile-content"> class="vscroll px-1 "
<div class="tile-title"> :style="{'height': resultsSize+'px'}"
<code >
class="cut-text" <div ref="table">
:title="query.sql" <BaseVirtualScroll
v-html="highlightWord(query.sql)" ref="resultTable"
/> :items="filteredHistory"
:item-height="66"
:visible-height="resultsSize"
:scroll-element="scrollElement"
>
<template #default="{ items }">
<div
v-for="query in items"
:key="query.uid"
class="tile my-2"
tabindex="0"
>
<div class="tile-icon">
<i class="mdi mdi-code-tags pr-1" />
</div> </div>
<div class="tile-bottom-content"> <div class="tile-content">
<small class="tile-subtitle">{{ query.schema }} · {{ formatDate(query.date) }}</small> <div class="tile-title">
<div class="tile-history-buttons"> <code
<button class="btn btn-link pl-1" @click.stop="$emit('select-query', query.sql)"> class="cut-text"
<i class="mdi mdi-open-in-app pr-1" /> {{ $t('word.select') }} :title="query.sql"
</button> v-html="highlightWord(query.sql)"
<button class="btn btn-link pl-1" @click="copyQuery(query.sql)"> />
<i class="mdi mdi-content-copy pr-1" /> {{ $t('word.copy') }} </div>
</button> <div class="tile-bottom-content">
<button class="btn btn-link pl-1" @click="deleteQuery(query)"> <small class="tile-subtitle">{{ query.schema }} · {{ formatDate(query.date) }}</small>
<i class="mdi mdi-delete-forever pr-1" /> {{ $t('word.delete') }} <div class="tile-history-buttons">
</button> <button class="btn btn-link pl-1" @click.stop="$emit('select-query', query.sql)">
<i class="mdi mdi-open-in-app pr-1" /> {{ $t('word.select') }}
</button>
<button class="btn btn-link pl-1" @click="copyQuery(query.sql)">
<i class="mdi mdi-content-copy pr-1" /> {{ $t('word.copy') }}
</button>
<button class="btn btn-link pl-1" @click="deleteQuery(query)">
<i class="mdi mdi-delete-forever pr-1" /> {{ $t('word.delete') }}
</button>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </template>
</template> </BaseVirtualScroll>
</BaseVirtualScroll> </div>
</div> </div>
</div> <div v-else class="empty">
<div v-else class="empty"> <div class="empty-icon">
<div class="empty-icon"> <i class="mdi mdi-history mdi-48px" />
<i class="mdi mdi-history mdi-48px" /> </div>
<p class="empty-title h5">
{{ $t('message.thereIsNoQueriesYet') }}
</p>
</div> </div>
<p class="empty-title h5">
{{ $t('message.thereIsNoQueriesYet') }}
</p>
</div> </div>
</div> </div>
</div> </div>
</div> </Teleport>
</template> </template>
<script> <script>

View File

@ -1,49 +1,52 @@
<template> <template>
<div class="modal active"> <Teleport to="#window-content">
<a class="modal-overlay" @click.stop="closeModal" /> <div class="modal active">
<div class="modal-container p-0"> <a class="modal-overlay" @click.stop="closeModal" />
<div class="modal-header pl-2"> <div class="modal-container p-0">
<div class="modal-title h6"> <div class="modal-header pl-2">
<div class="d-flex"> <div class="modal-title h6">
<i class="mdi mdi-24px mdi-database-arrow-up mr-1" /> <div class="d-flex">
<span class="cut-text">{{ $t('message.importSchema') }}</span> <i class="mdi mdi-24px mdi-database-arrow-up mr-1" />
<span class="cut-text">{{ $t('message.importSchema') }}</span>
</div>
</div> </div>
<a class="btn btn-clear c-hand" @click.stop="closeModal" />
</div> </div>
<a class="btn btn-clear c-hand" @click.stop="closeModal" /> <div class="modal-body pb-0">
</div> {{ sqlFile }}
<div class="modal-body pb-0"> <div v-if="queryErrors.length > 0" class="mt-2">
{{ sqlFile }} <label>{{ $tc('message.importQueryErrors', queryErrors.length) }}</label>
<div v-if="queryErrors.length > 0" class="mt-2"> <textarea
<label>{{ $tc('message.importQueryErrors', queryErrors.length) }}</label> v-model="formattedQueryErrors"
<textarea class="form-input"
v-model="formattedQueryErrors" rows="5"
class="form-input" readonly
rows="5"
readonly
/>
</div>
</div>
<div class="modal-footer columns">
<div class="column col modal-progress-wrapper text-left">
<div class="import-progress">
<span class="progress-status">
{{ progressPercentage }}% - {{ progressStatus }} - {{ $tc('message.executedQueries', queryCount) }}
</span>
<progress
class="progress d-block"
:value="progressPercentage"
max="100"
/> />
</div> </div>
</div> </div>
<div class="column col-auto px-0"> <div class="modal-footer columns">
<button class="btn btn-link" @click.stop="closeModal"> <div class="column col modal-progress-wrapper text-left">
{{ completed ? $t('word.close') : $t('word.cancel') }} <div class="import-progress">
</button> <span class="progress-status">
{{ progressPercentage }}% - {{ progressStatus }} - {{ $tc('message.executedQueries', queryCount) }}
</span>
<progress
class="progress d-block"
:value="progressPercentage"
max="100"
/>
</div>
</div>
<div class="column col-auto px-0">
<button class="btn btn-link" @click.stop="closeModal">
{{ completed ? $t('word.close') : $t('word.cancel') }}
</button>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> <Teleport to="#window-content" />
</teleport>
</template> </template>
<script> <script>

View File

@ -1,68 +1,70 @@
<template> <template>
<div class="modal active"> <Teleport to="#window-content">
<a class="modal-overlay" @click.stop="closeModal" /> <div class="modal active">
<div class="modal-container p-0"> <a class="modal-overlay" @click.stop="closeModal" />
<div class="modal-header pl-2"> <div class="modal-container p-0">
<div class="modal-title h6"> <div class="modal-header pl-2">
<div class="d-flex"> <div class="modal-title h6">
<i class="mdi mdi-24px mdi-database-plus mr-1" /> <div class="d-flex">
<span class="cut-text">{{ $t('message.createNewSchema') }}</span> <i class="mdi mdi-24px mdi-database-plus mr-1" />
<span class="cut-text">{{ $t('message.createNewSchema') }}</span>
</div>
</div>
<a class="btn btn-clear c-hand" @click.stop="closeModal" />
</div>
<div class="modal-body pb-0">
<div class="content">
<form class="form-horizontal" @submit.prevent="createSchema">
<div class="form-group">
<div class="col-3">
<label class="form-label">{{ $t('word.name') }}</label>
</div>
<div class="col-9">
<input
ref="firstInput"
v-model="database.name"
class="form-input"
type="text"
required
:placeholder="$t('message.schemaName')"
>
</div>
</div>
<div v-if="customizations.collations" class="form-group">
<div class="col-3">
<label class="form-label">{{ $t('word.collation') }}</label>
</div>
<div class="col-9">
<select v-model="database.collation" class="form-select">
<option
v-for="collation in collations"
:key="collation.id"
:value="collation.collation"
>
{{ collation.collation }}
</option>
</select>
<small>{{ $t('message.serverDefault') }}: {{ defaultCollation }}</small>
</div>
</div>
</form>
</div> </div>
</div> </div>
<a class="btn btn-clear c-hand" @click.stop="closeModal" /> <div class="modal-footer">
</div> <button
<div class="modal-body pb-0"> class="btn btn-primary mr-2"
<div class="content"> :class="{'loading': isLoading}"
<form class="form-horizontal" @submit.prevent="createSchema"> @click.stop="createSchema"
<div class="form-group"> >
<div class="col-3"> {{ $t('word.add') }}
<label class="form-label">{{ $t('word.name') }}</label> </button>
</div> <button class="btn btn-link" @click.stop="closeModal">
<div class="col-9"> {{ $t('word.close') }}
<input </button>
ref="firstInput"
v-model="database.name"
class="form-input"
type="text"
required
:placeholder="$t('message.schemaName')"
>
</div>
</div>
<div v-if="customizations.collations" class="form-group">
<div class="col-3">
<label class="form-label">{{ $t('word.collation') }}</label>
</div>
<div class="col-9">
<select v-model="database.collation" class="form-select">
<option
v-for="collation in collations"
:key="collation.id"
:value="collation.collation"
>
{{ collation.collation }}
</option>
</select>
<small>{{ $t('message.serverDefault') }}: {{ defaultCollation }}</small>
</div>
</div>
</form>
</div> </div>
</div> </div>
<div class="modal-footer">
<button
class="btn btn-primary mr-2"
:class="{'loading': isLoading}"
@click.stop="createSchema"
>
{{ $t('word.add') }}
</button>
<button class="btn btn-link" @click.stop="closeModal">
{{ $t('word.close') }}
</button>
</div>
</div> </div>
</div> </Teleport>
</template> </template>
<script> <script>

View File

@ -1,119 +1,121 @@
<template> <template>
<div class="modal active"> <Teleport to="#window-content">
<a class="modal-overlay" @click.stop="closeModal" /> <div class="modal active">
<div class="modal-container p-0"> <a class="modal-overlay" @click.stop="closeModal" />
<div class="modal-header pl-2"> <div class="modal-container p-0">
<div class="modal-title h6"> <div class="modal-header pl-2">
<div class="d-flex"> <div class="modal-title h6">
<i class="mdi mdi-24px mdi-playlist-plus mr-1" /> <div class="d-flex">
<span class="cut-text">{{ $t('message.addNewRow') }}</span> <i class="mdi mdi-24px mdi-playlist-plus mr-1" />
<span class="cut-text">{{ $t('message.addNewRow') }}</span>
</div>
</div>
<a class="btn btn-clear c-hand" @click.stop="closeModal" />
</div>
<div class="modal-body pb-0">
<div class="content">
<form class="form-horizontal">
<fieldset :disabled="isInserting">
<div
v-for="(field, key) in fields"
:key="field.name"
class="form-group"
>
<div class="col-4 col-sm-12">
<label class="form-label" :title="field.name">{{ field.name }}</label>
</div>
<div class="input-group col-8 col-sm-12">
<ForeignKeySelect
v-if="foreignKeys.includes(field.name)"
ref="formInput"
v-model="localRow[field.name]"
class="form-select"
:key-usage="getKeyUsage(field.name)"
:disabled="fieldsToExclude.includes(field.name)"
/>
<input
v-else-if="inputProps(field).mask"
ref="formInput"
v-model="localRow[field.name]"
v-mask="inputProps(field).mask"
class="form-input"
:type="inputProps(field).type"
:disabled="fieldsToExclude.includes(field.name)"
:tabindex="key+1"
>
<input
v-else-if="inputProps(field).type === 'file'"
ref="formInput"
class="form-input"
type="file"
:disabled="fieldsToExclude.includes(field.name)"
:tabindex="key+1"
@change="filesChange($event,field.name)"
>
<input
v-else-if="inputProps(field).type === 'number'"
ref="formInput"
v-model="localRow[field.name]"
class="form-input"
step="any"
:type="inputProps(field).type"
:disabled="fieldsToExclude.includes(field.name)"
:tabindex="key+1"
>
<input
v-else
ref="formInput"
v-model="localRow[field.name]"
class="form-input"
:type="inputProps(field).type"
:disabled="fieldsToExclude.includes(field.name)"
:tabindex="key+1"
>
<span class="input-group-addon" :class="typeCLass(field.type)">
{{ field.type }} {{ wrapNumber(fieldLength(field)) }}
</span>
<label class="form-checkbox ml-3" :title="$t('word.insert')">
<input
type="checkbox"
:checked="!field.autoIncrement"
@change.prevent="toggleFields($event, field)"
><i class="form-icon" />
</label>
</div>
</div>
</fieldset>
</form>
</div> </div>
</div> </div>
<a class="btn btn-clear c-hand" @click.stop="closeModal" /> <div class="modal-footer">
</div> <div class="input-group col-3 tooltip tooltip-right" :data-tooltip="$t('message.numberOfInserts')">
<div class="modal-body pb-0"> <input
<div class="content"> v-model="nInserts"
<form class="form-horizontal"> type="number"
<fieldset :disabled="isInserting"> class="form-input"
<div min="1"
v-for="(field, key) in fields" :disabled="isInserting"
:key="field.name" >
class="form-group" <span class="input-group-addon">
> <i class="mdi mdi-24px mdi-repeat" />
<div class="col-4 col-sm-12"> </span>
<label class="form-label" :title="field.name">{{ field.name }}</label> </div>
</div> <div>
<div class="input-group col-8 col-sm-12"> <button
<ForeignKeySelect class="btn btn-primary mr-2"
v-if="foreignKeys.includes(field.name)" :class="{'loading': isInserting}"
ref="formInput" @click.stop="insertRows"
v-model="localRow[field.name]" >
class="form-select" {{ $t('word.insert') }}
:key-usage="getKeyUsage(field.name)" </button>
:disabled="fieldsToExclude.includes(field.name)" <button class="btn btn-link" @click.stop="closeModal">
/> {{ $t('word.close') }}
<input </button>
v-else-if="inputProps(field).mask" </div>
ref="formInput"
v-model="localRow[field.name]"
v-mask="inputProps(field).mask"
class="form-input"
:type="inputProps(field).type"
:disabled="fieldsToExclude.includes(field.name)"
:tabindex="key+1"
>
<input
v-else-if="inputProps(field).type === 'file'"
ref="formInput"
class="form-input"
type="file"
:disabled="fieldsToExclude.includes(field.name)"
:tabindex="key+1"
@change="filesChange($event,field.name)"
>
<input
v-else-if="inputProps(field).type === 'number'"
ref="formInput"
v-model="localRow[field.name]"
class="form-input"
step="any"
:type="inputProps(field).type"
:disabled="fieldsToExclude.includes(field.name)"
:tabindex="key+1"
>
<input
v-else
ref="formInput"
v-model="localRow[field.name]"
class="form-input"
:type="inputProps(field).type"
:disabled="fieldsToExclude.includes(field.name)"
:tabindex="key+1"
>
<span class="input-group-addon" :class="typeCLass(field.type)">
{{ field.type }} {{ wrapNumber(fieldLength(field)) }}
</span>
<label class="form-checkbox ml-3" :title="$t('word.insert')">
<input
type="checkbox"
:checked="!field.autoIncrement"
@change.prevent="toggleFields($event, field)"
><i class="form-icon" />
</label>
</div>
</div>
</fieldset>
</form>
</div>
</div>
<div class="modal-footer">
<div class="input-group col-3 tooltip tooltip-right" :data-tooltip="$t('message.numberOfInserts')">
<input
v-model="nInserts"
type="number"
class="form-input"
min="1"
:disabled="isInserting"
>
<span class="input-group-addon">
<i class="mdi mdi-24px mdi-repeat" />
</span>
</div>
<div>
<button
class="btn btn-primary mr-2"
:class="{'loading': isInserting}"
@click.stop="insertRows"
>
{{ $t('word.insert') }}
</button>
<button class="btn btn-link" @click.stop="closeModal">
{{ $t('word.close') }}
</button>
</div> </div>
</div> </div>
</div> </div>
</div> </Teleport>
</template> </template>
<script> <script>

View File

@ -1,134 +1,136 @@
<template> <template>
<div class="modal active"> <Teleport to="#window-content">
<ModalProcessesListContext <div class="modal active">
v-if="isContext" <ModalProcessesListContext
:context-event="contextEvent" v-if="isContext"
:selected-row="selectedRow" :context-event="contextEvent"
:selected-cell="selectedCell" :selected-row="selectedRow"
@copy-cell="copyCell" :selected-cell="selectedCell"
@copy-row="copyRow" @copy-cell="copyCell"
@kill-process="killProcess" @copy-row="copyRow"
@close-context="closeContext" @kill-process="killProcess"
/> @close-context="closeContext"
<a class="modal-overlay" @click.stop="closeModal" /> />
<div class="modal-container p-0 pb-4"> <a class="modal-overlay" @click.stop="closeModal" />
<div class="modal-header pl-2"> <div class="modal-container p-0 pb-4">
<div class="modal-title h6"> <div class="modal-header pl-2">
<div class="d-flex"> <div class="modal-title h6">
<i class="mdi mdi-24px mdi-memory mr-1" /> <div class="d-flex">
<span class="cut-text">{{ $t('message.processesList') }}: {{ connectionName }}</span> <i class="mdi mdi-24px mdi-memory mr-1" />
</div> <span class="cut-text">{{ $t('message.processesList') }}: {{ connectionName }}</span>
</div>
<a class="btn btn-clear c-hand" @click.stop="closeModal" />
</div>
<div class="processes-toolbar py-2 px-4">
<div class="workspace-query-buttons">
<div class="dropdown pr-1">
<div class="btn-group">
<button
class="btn btn-dark btn-sm mr-0 pr-1 d-flex"
:class="{'loading':isQuering}"
:title="`${$t('word.refresh')} (F5)`"
@click="getProcessesList"
>
<i v-if="!+autorefreshTimer" class="mdi mdi-24px mdi-refresh mr-1" />
<i v-else class="mdi mdi-24px mdi-history mdi-flip-h mr-1" />
</button>
<div class="btn btn-dark btn-sm dropdown-toggle pl-0 pr-0" tabindex="0">
<i class="mdi mdi-24px mdi-menu-down" />
</div>
<div class="menu px-3">
<span>{{ $t('word.autoRefresh') }}: <b>{{ +autorefreshTimer ? `${autorefreshTimer}s` : 'OFF' }}</b></span>
<input
v-model="autorefreshTimer"
class="slider no-border"
type="range"
min="0"
max="15"
step="0.5"
@change="setRefreshInterval"
>
</div>
</div> </div>
</div> </div>
<div class="dropdown table-dropdown"> <a class="btn btn-clear c-hand" @click.stop="closeModal" />
<button
:disabled="isQuering"
class="btn btn-dark btn-sm dropdown-toggle d-flex mr-0 pr-0"
tabindex="0"
>
<i class="mdi mdi-24px mdi-file-export mr-1" />
<span>{{ $t('word.export') }}</span>
<i class="mdi mdi-24px mdi-menu-down" />
</button>
<ul class="menu text-left">
<li class="menu-item">
<a class="c-hand" @click="downloadTable('json')">JSON</a>
</li>
<li class="menu-item">
<a class="c-hand" @click="downloadTable('csv')">CSV</a>
</li>
</ul>
</div>
</div> </div>
<div class="workspace-query-info"> <div class="processes-toolbar py-2 px-4">
<div v-if="sortedResults.length"> <div class="workspace-query-buttons">
{{ $t('word.processes') }}: <b>{{ sortedResults.length.toLocaleString() }}</b> <div class="dropdown pr-1">
</div> <div class="btn-group">
</div> <button
</div> class="btn btn-dark btn-sm mr-0 pr-1 d-flex"
<div class="modal-body py-0 workspace-query-results"> :class="{'loading':isQuering}"
<div :title="`${$t('word.refresh')} (F5)`"
ref="tableWrapper" @click="getProcessesList"
class="vscroll"
:style="{'height': resultsSize+'px'}"
>
<div ref="table" class="table table-hover">
<div class="thead">
<div class="tr">
<div
v-for="(field, index) in fields"
:key="index"
class="th c-hand"
> >
<div ref="columnResize" class="column-resizable"> <i v-if="!+autorefreshTimer" class="mdi mdi-24px mdi-refresh mr-1" />
<div class="table-column-title" @click="sort(field)"> <i v-else class="mdi mdi-24px mdi-history mdi-flip-h mr-1" />
<span>{{ field.toUpperCase() }}</span> </button>
<i <div class="btn btn-dark btn-sm dropdown-toggle pl-0 pr-0" tabindex="0">
v-if="currentSort === field" <i class="mdi mdi-24px mdi-menu-down" />
class="mdi sort-icon" </div>
:class="currentSortDir === 'asc' ? 'mdi-sort-ascending':'mdi-sort-descending'" <div class="menu px-3">
/> <span>{{ $t('word.autoRefresh') }}: <b>{{ +autorefreshTimer ? `${autorefreshTimer}s` : 'OFF' }}</b></span>
<input
v-model="autorefreshTimer"
class="slider no-border"
type="range"
min="0"
max="15"
step="0.5"
@change="setRefreshInterval"
>
</div>
</div>
</div>
<div class="dropdown table-dropdown">
<button
:disabled="isQuering"
class="btn btn-dark btn-sm dropdown-toggle d-flex mr-0 pr-0"
tabindex="0"
>
<i class="mdi mdi-24px mdi-file-export mr-1" />
<span>{{ $t('word.export') }}</span>
<i class="mdi mdi-24px mdi-menu-down" />
</button>
<ul class="menu text-left">
<li class="menu-item">
<a class="c-hand" @click="downloadTable('json')">JSON</a>
</li>
<li class="menu-item">
<a class="c-hand" @click="downloadTable('csv')">CSV</a>
</li>
</ul>
</div>
</div>
<div class="workspace-query-info">
<div v-if="sortedResults.length">
{{ $t('word.processes') }}: <b>{{ sortedResults.length.toLocaleString() }}</b>
</div>
</div>
</div>
<div class="modal-body py-0 workspace-query-results">
<div
ref="tableWrapper"
class="vscroll"
:style="{'height': resultsSize+'px'}"
>
<div ref="table" class="table table-hover">
<div class="thead">
<div class="tr">
<div
v-for="(field, index) in fields"
:key="index"
class="th c-hand"
>
<div ref="columnResize" class="column-resizable">
<div class="table-column-title" @click="sort(field)">
<span>{{ field.toUpperCase() }}</span>
<i
v-if="currentSort === field"
class="mdi sort-icon"
:class="currentSortDir === 'asc' ? 'mdi-sort-ascending':'mdi-sort-descending'"
/>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<BaseVirtualScroll
ref="resultTable"
:items="sortedResults"
:item-height="22"
class="tbody"
:visible-height="resultsSize"
:scroll-element="scrollElement"
>
<template #default="{ items }">
<ModalProcessesListRow
v-for="row in items"
:key="row.id"
class="process-row"
:row="row"
@select-row="selectRow(row.id)"
@contextmenu="contextMenu"
@stop-refresh="stopRefresh"
/>
</template>
</BaseVirtualScroll>
</div> </div>
<BaseVirtualScroll
ref="resultTable"
:items="sortedResults"
:item-height="22"
class="tbody"
:visible-height="resultsSize"
:scroll-element="scrollElement"
>
<template #default="{ items }">
<ModalProcessesListRow
v-for="row in items"
:key="row.id"
class="process-row"
:row="row"
@select-row="selectRow(row.id)"
@contextmenu="contextMenu"
@stop-refresh="stopRefresh"
/>
</template>
</BaseVirtualScroll>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </Teleport>
</template> </template>
<script> <script>

View File

@ -1,318 +1,320 @@
<template> <template>
<div id="settings" class="modal active"> <Teleport to="#window-content">
<a class="modal-overlay c-hand" @click="closeModal" /> <div id="settings" class="modal active">
<div class="modal-container"> <a class="modal-overlay c-hand" @click="closeModal" />
<div class="modal-header pl-2"> <div class="modal-container">
<div class="modal-title h6"> <div class="modal-header pl-2">
<div class="d-flex"> <div class="modal-title h6">
<i class="mdi mdi-24px mdi-cog mr-1" /> <div class="d-flex">
<span class="cut-text">{{ $t('word.settings') }}</span> <i class="mdi mdi-24px mdi-cog mr-1" />
<span class="cut-text">{{ $t('word.settings') }}</span>
</div>
</div> </div>
<a class="btn btn-clear c-hand" @click="closeModal" />
</div> </div>
<a class="btn btn-clear c-hand" @click="closeModal" /> <div class="modal-body p-0">
</div> <div class="panel">
<div class="modal-body p-0"> <div class="panel-nav">
<div class="panel"> <ul class="tab tab-block">
<div class="panel-nav"> <li
<ul class="tab tab-block"> class="tab-item c-hand"
<li :class="{'active': selectedTab === 'general'}"
class="tab-item c-hand" @click="selectTab('general')"
:class="{'active': selectedTab === 'general'}" >
@click="selectTab('general')" <a class="tab-link">{{ $t('word.general') }}</a>
> </li>
<a class="tab-link">{{ $t('word.general') }}</a> <li
</li> class="tab-item c-hand"
<li :class="{'active': selectedTab === 'themes'}"
class="tab-item c-hand" @click="selectTab('themes')"
:class="{'active': selectedTab === 'themes'}" >
@click="selectTab('themes')" <a class="tab-link">{{ $t('word.themes') }}</a>
> </li>
<a class="tab-link">{{ $t('word.themes') }}</a> <li
</li> v-if="updateStatus !== 'disabled'"
<li class="tab-item c-hand"
v-if="updateStatus !== 'disabled'" :class="{'active': selectedTab === 'update'}"
class="tab-item c-hand" @click="selectTab('update')"
:class="{'active': selectedTab === 'update'}" >
@click="selectTab('update')" <a class="tab-link" :class="{'badge badge-update': hasUpdates}">{{ $t('word.update') }}</a>
> </li>
<a class="tab-link" :class="{'badge badge-update': hasUpdates}">{{ $t('word.update') }}</a> <li
</li> class="tab-item c-hand"
<li :class="{'active': selectedTab === 'changelog'}"
class="tab-item c-hand" @click="selectTab('changelog')"
:class="{'active': selectedTab === 'changelog'}" >
@click="selectTab('changelog')" <a class="tab-link">{{ $t('word.changelog') }}</a>
> </li>
<a class="tab-link">{{ $t('word.changelog') }}</a> <li
</li> class="tab-item c-hand"
<li :class="{'active': selectedTab === 'about'}"
class="tab-item c-hand" @click="selectTab('about')"
:class="{'active': selectedTab === 'about'}" >
@click="selectTab('about')" <a class="tab-link">{{ $t('word.about') }}</a>
> </li>
<a class="tab-link">{{ $t('word.about') }}</a> </ul>
</li> </div>
</ul> <div v-show="selectedTab === 'general'" class="panel-body py-4">
</div> <div class="container">
<div v-show="selectedTab === 'general'" class="panel-body py-4"> <form class="form-horizontal columns">
<div class="container"> <div class="column col-12 h6 text-uppercase mb-1">
<form class="form-horizontal columns"> {{ $t('word.application') }}
<div class="column col-12 h6 text-uppercase mb-1"> </div>
{{ $t('word.application') }} <div class="column col-9 col-sm-12 mb-2">
</div> <div class="form-group">
<div class="column col-9 col-sm-12 mb-2"> <div class="col-7 col-sm-12">
<div class="form-group"> <label class="form-label">
<div class="col-7 col-sm-12"> <i class="mdi mdi-18px mdi-translate mr-1" />
<label class="form-label"> {{ $t('word.language') }}
<i class="mdi mdi-18px mdi-translate mr-1" /> </label>
{{ $t('word.language') }} </div>
</label> <div class="col-5 col-sm-12">
</div> <select
<div class="col-5 col-sm-12"> v-model="localLocale"
<select class="form-select"
v-model="localLocale" @change="changeLocale(localLocale)"
class="form-select"
@change="changeLocale(localLocale)"
>
<option
v-for="(locale, key) in locales"
:key="key"
:value="locale.code"
> >
{{ locale.name }} <option
</option> v-for="(locale, key) in locales"
</select> :key="key"
:value="locale.code"
>
{{ locale.name }}
</option>
</select>
</div>
</div> </div>
</div> <div class="form-group">
<div class="form-group"> <div class="col-7 col-sm-12">
<div class="col-7 col-sm-12"> <label class="form-label">
<label class="form-label"> {{ $t('message.dataTabPageSize') }}
{{ $t('message.dataTabPageSize') }} </label>
</label> </div>
</div> <div class="col-5 col-sm-12">
<div class="col-5 col-sm-12"> <select
<select v-model="localPageSize"
v-model="localPageSize" class="form-select"
class="form-select" @change="changePageSize(+localPageSize)"
@change="changePageSize(+localPageSize)"
>
<option
v-for="size in pageSizes"
:key="size"
> >
{{ size }} <option
</option> v-for="size in pageSizes"
</select> :key="size"
>
{{ size }}
</option>
</select>
</div>
</div>
<div class="form-group mb-0">
<div class="col-7 col-sm-12">
<label class="form-label">
{{ $t('message.restorePreviourSession') }}
</label>
</div>
<div class="col-5 col-sm-12">
<label class="form-switch d-inline-block" @click.prevent="toggleRestoreSession">
<input type="checkbox" :checked="restoreTabs">
<i class="form-icon" />
</label>
</div>
</div>
<div class="form-group mb-0">
<div class="col-7 col-sm-12">
<label class="form-label">
{{ $t('message.disableBlur') }}
</label>
</div>
<div class="col-5 col-sm-12">
<label class="form-switch d-inline-block" @click.prevent="toggleDisableBlur">
<input type="checkbox" :checked="disableBlur">
<i class="form-icon" />
</label>
</div>
</div>
<div class="form-group">
<div class="col-7 col-sm-12">
<label class="form-label">
{{ $t('message.notificationsTimeout') }}
</label>
</div>
<div class="col-5 col-sm-12">
<div class="input-group">
<input
v-model="localTimeout"
class="form-input"
type="number"
min="1"
@focusout="checkNotificationsTimeout"
>
<span class="input-group-addon">{{ $t('word.seconds') }}</span>
</div>
</div>
</div> </div>
</div> </div>
<div class="form-group mb-0">
<div class="col-7 col-sm-12"> <div class="column col-12 h6 mt-4 text-uppercase mb-1">
<label class="form-label"> {{ $t('word.editor') }}
{{ $t('message.restorePreviourSession') }} </div>
</label> <div class="column col-9 col-sm-12">
<div class="form-group mb-0">
<div class="col-7 col-sm-12">
<label class="form-label">
{{ $t('word.autoCompletion') }}
</label>
</div>
<div class="col-5 col-sm-12">
<label class="form-switch d-inline-block" @click.prevent="toggleAutoComplete">
<input type="checkbox" :checked="selectedAutoComplete">
<i class="form-icon" />
</label>
</div>
</div> </div>
<div class="col-5 col-sm-12"> <div class="form-group mb-0">
<label class="form-switch d-inline-block" @click.prevent="toggleRestoreSession"> <div class="col-7 col-sm-12">
<input type="checkbox" :checked="restoreTabs"> <label class="form-label">
<i class="form-icon" /> {{ $t('message.wrapLongLines') }}
</label> </label>
</div>
<div class="col-5 col-sm-12">
<label class="form-switch d-inline-block" @click.prevent="toggleLineWrap">
<input type="checkbox" :checked="selectedLineWrap">
<i class="form-icon" />
</label>
</div>
</div> </div>
</div> </div>
<div class="form-group mb-0"> </form>
<div class="col-7 col-sm-12"> </div>
<label class="form-label"> </div>
{{ $t('message.disableBlur') }}
</label> <div v-show="selectedTab === 'themes'" class="panel-body py-4">
</div> <div class="container">
<div class="col-5 col-sm-12"> <div class="columns">
<label class="form-switch d-inline-block" @click.prevent="toggleDisableBlur"> <div class="column col-12 h6 text-uppercase mb-2">
<input type="checkbox" :checked="disableBlur"> {{ $t('message.applicationTheme') }}
<i class="form-icon" /> </div>
</label> <div
class="column col-6 c-hand theme-block"
:class="{'selected': applicationTheme === 'dark'}"
@click="changeApplicationTheme('dark')"
>
<img src="../images/dark.png" class="img-responsive img-fit-cover s-rounded">
<div class="theme-name text-light">
<i class="mdi mdi-moon-waning-crescent mdi-48px" />
<div class="h6 mt-4">
{{ $t('word.dark') }}
</div>
</div> </div>
</div> </div>
<div class="form-group"> <div
<div class="col-7 col-sm-12"> class="column col-6 c-hand theme-block"
<label class="form-label"> :class="{'selected': applicationTheme === 'light'}"
{{ $t('message.notificationsTimeout') }} @click="changeApplicationTheme('light')"
</label> >
</div> <img src="../images/light.png" class="img-responsive img-fit-cover s-rounded">
<div class="col-5 col-sm-12"> <div class="theme-name text-dark">
<div class="input-group"> <i class="mdi mdi-white-balance-sunny mdi-48px" />
<input <div class="h6 mt-4">
v-model="localTimeout" {{ $t('word.light') }}
class="form-input"
type="number"
min="1"
@focusout="checkNotificationsTimeout"
>
<span class="input-group-addon">{{ $t('word.seconds') }}</span>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="column col-12 h6 mt-4 text-uppercase mb-1"> <div class="columns mt-4">
{{ $t('word.editor') }} <div class="column col-12 h6 text-uppercase mb-2 mt-4">
</div> {{ $t('message.editorTheme') }}
<div class="column col-9 col-sm-12">
<div class="form-group mb-0">
<div class="col-7 col-sm-12">
<label class="form-label">
{{ $t('word.autoCompletion') }}
</label>
</div>
<div class="col-5 col-sm-12">
<label class="form-switch d-inline-block" @click.prevent="toggleAutoComplete">
<input type="checkbox" :checked="selectedAutoComplete">
<i class="form-icon" />
</label>
</div>
</div> </div>
<div class="form-group mb-0"> <div class="column col-6 h5 mb-4">
<div class="col-7 col-sm-12"> <select
<label class="form-label"> v-model="localEditorTheme"
{{ $t('message.wrapLongLines') }} class="form-select"
</label> @change="changeEditorTheme(localEditorTheme)"
</div>
<div class="col-5 col-sm-12">
<label class="form-switch d-inline-block" @click.prevent="toggleLineWrap">
<input type="checkbox" :checked="selectedLineWrap">
<i class="form-icon" />
</label>
</div>
</div>
</div>
</form>
</div>
</div>
<div v-show="selectedTab === 'themes'" class="panel-body py-4">
<div class="container">
<div class="columns">
<div class="column col-12 h6 text-uppercase mb-2">
{{ $t('message.applicationTheme') }}
</div>
<div
class="column col-6 c-hand theme-block"
:class="{'selected': applicationTheme === 'dark'}"
@click="changeApplicationTheme('dark')"
>
<img src="../images/dark.png" class="img-responsive img-fit-cover s-rounded">
<div class="theme-name text-light">
<i class="mdi mdi-moon-waning-crescent mdi-48px" />
<div class="h6 mt-4">
{{ $t('word.dark') }}
</div>
</div>
</div>
<div
class="column col-6 c-hand theme-block"
:class="{'selected': applicationTheme === 'light'}"
@click="changeApplicationTheme('light')"
>
<img src="../images/light.png" class="img-responsive img-fit-cover s-rounded">
<div class="theme-name text-dark">
<i class="mdi mdi-white-balance-sunny mdi-48px" />
<div class="h6 mt-4">
{{ $t('word.light') }}
</div>
</div>
</div>
</div>
<div class="columns mt-4">
<div class="column col-12 h6 text-uppercase mb-2 mt-4">
{{ $t('message.editorTheme') }}
</div>
<div class="column col-6 h5 mb-4">
<select
v-model="localEditorTheme"
class="form-select"
@change="changeEditorTheme(localEditorTheme)"
>
<optgroup
v-for="group in editorThemes"
:key="group.group"
:label="group.group"
> >
<option <optgroup
v-for="theme in group.themes" v-for="group in editorThemes"
:key="theme.name" :key="group.group"
:value="theme.code" :label="group.group"
:selected="editorTheme === theme.code"
> >
{{ theme.name }} <option
</option> v-for="theme in group.themes"
</optgroup> :key="theme.name"
</select> :value="theme.code"
</div> :selected="editorTheme === theme.code"
<div class="column col-6 mb-4"> >
<div class="btn-group btn-group-block"> {{ theme.name }}
<button </option>
class="btn btn-dark cut-text" </optgroup>
:class="{'active': editorFontSize === 'small'}" </select>
@click="changeEditorFontSize('small')" </div>
> <div class="column col-6 mb-4">
{{ $t('word.small') }} <div class="btn-group btn-group-block">
</button> <button
<button class="btn btn-dark cut-text"
class="btn btn-dark cut-text" :class="{'active': editorFontSize === 'small'}"
:class="{'active': editorFontSize === 'medium'}" @click="changeEditorFontSize('small')"
@click="changeEditorFontSize('medium')" >
> {{ $t('word.small') }}
{{ $t('word.medium') }} </button>
</button> <button
<button class="btn btn-dark cut-text"
class="btn btn-dark cut-text" :class="{'active': editorFontSize === 'medium'}"
:class="{'active': editorFontSize === 'large'}" @click="changeEditorFontSize('medium')"
@click="changeEditorFontSize('large')" >
> {{ $t('word.medium') }}
{{ $t('word.large') }} </button>
</button> <button
class="btn btn-dark cut-text"
:class="{'active': editorFontSize === 'large'}"
@click="changeEditorFontSize('large')"
>
{{ $t('word.large') }}
</button>
</div>
</div>
<div class="column col-12">
<BaseTextEditor
:model-value="exampleQuery"
mode="sql"
:workspace="workspace"
:read-only="true"
:height="270"
/>
</div> </div>
</div>
<div class="column col-12">
<BaseTextEditor
:model-value="exampleQuery"
mode="sql"
:workspace="workspace"
:read-only="true"
:height="270"
/>
</div> </div>
</div> </div>
</div> </div>
</div>
<div v-show="selectedTab === 'update'" class="panel-body py-4"> <div v-show="selectedTab === 'update'" class="panel-body py-4">
<ModalSettingsUpdate /> <ModalSettingsUpdate />
</div> </div>
<div v-show="selectedTab === 'changelog'" class="panel-body py-4"> <div v-show="selectedTab === 'changelog'" class="panel-body py-4">
<ModalSettingsChangelog /> <ModalSettingsChangelog />
</div> </div>
<div v-show="selectedTab === 'about'" class="panel-body py-4"> <div v-show="selectedTab === 'about'" class="panel-body py-4">
<div class="text-center"> <div class="text-center">
<img src="../images/logo.svg" width="128"> <img src="../images/logo.svg" width="128">
<h4>{{ appName }}</h4> <h4>{{ appName }}</h4>
<p class="mb-2"> <p class="mb-2">
{{ $t('word.version') }} {{ appVersion }}<br> {{ $t('word.version') }} {{ appVersion }}<br>
<a class="c-hand" @click="openOutside('https://github.com/antares-sql/antares')"><i class="mdi mdi-github d-inline" /> GitHub</a> <a class="c-hand" @click="openOutside('https://twitter.com/AntaresSQL')"><i class="mdi mdi-twitter d-inline" /> Twitter</a> <a class="c-hand" @click="openOutside('https://antares-sql.app/')"><i class="mdi mdi-web d-inline" /> Website</a><br> <a class="c-hand" @click="openOutside('https://github.com/antares-sql/antares')"><i class="mdi mdi-github d-inline" /> GitHub</a> <a class="c-hand" @click="openOutside('https://twitter.com/AntaresSQL')"><i class="mdi mdi-twitter d-inline" /> Twitter</a> <a class="c-hand" @click="openOutside('https://antares-sql.app/')"><i class="mdi mdi-web d-inline" /> Website</a><br>
<small>{{ $t('word.author') }} <a class="c-hand" @click="openOutside('https://github.com/Fabio286')">{{ appAuthor }}</a></small><br> <small>{{ $t('word.author') }} <a class="c-hand" @click="openOutside('https://github.com/Fabio286')">{{ appAuthor }}</a></small><br>
</p> </p>
<div class="mb-2"> <div class="mb-2">
<small class="d-block text-uppercase">{{ $t('word.contributors') }}:</small> <small class="d-block text-uppercase">{{ $t('word.contributors') }}:</small>
<div class="d-block py-1"> <div class="d-block py-1">
<small v-for="(contributor, i) in otherContributors" :key="i">{{ i !== 0 ? ', ' : '' }}{{ contributor }}</small> <small v-for="(contributor, i) in otherContributors" :key="i">{{ i !== 0 ? ', ' : '' }}{{ contributor }}</small>
</div>
<small>{{ $t('message.madeWithJS') }}</small>
</div> </div>
<small>{{ $t('message.madeWithJS') }}</small>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </Teleport>
</template> </template>
<script> <script>

View File

@ -4,7 +4,7 @@
@mouseenter="clearTimeouts" @mouseenter="clearTimeouts"
@mouseleave="rearmTimeouts" @mouseleave="rearmTimeouts"
> >
<transition-group tag="div" name="slide-fade"> <TransitionGroup tag="div" name="slide-fade">
<BaseNotification <BaseNotification
v-for="notification in latestNotifications" v-for="notification in latestNotifications"
:key="notification.uid" :key="notification.uid"
@ -12,7 +12,7 @@
:status="notification.status" :status="notification.status"
@close="removeNotification(notification.uid)" @close="removeNotification(notification.uid)"
/> />
</transition-group> </TransitionGroup>
</div> </div>
</template> </template>

View File

@ -811,48 +811,5 @@ export default {
} }
} }
} }
.workspace-query-results {
overflow: auto;
white-space: nowrap;
.table {
width: auto;
border-collapse: separate;
.th {
position: sticky;
top: 0;
border: 2px solid;
border-left: none;
border-bottom-width: 2px;
padding: 0;
font-weight: 700;
font-size: 0.7rem;
z-index: 1;
> div {
padding: 0.1rem 0.2rem;
min-width: -webkit-fill-available;
}
}
.td {
border-right: 2px solid;
border-bottom: 2px solid;
padding: 0 0.2rem;
text-overflow: ellipsis;
max-width: 200px;
white-space: nowrap;
overflow: hidden;
font-size: 0.7rem;
position: relative;
&:focus {
outline: none;
}
}
}
}
} }
</style> </style>

View File

@ -152,7 +152,7 @@
</template> </template>
<template #body> <template #body>
<div class="mb-2"> <div class="mb-2">
<transition name="jump-down"> <Transition name="jump-down">
<div v-if="contentInfo.size"> <div v-if="contentInfo.size">
<img <img
v-if="isImage" v-if="isImage"
@ -173,7 +173,7 @@
</button> </button>
</div> </div>
</div> </div>
</transition> </Transition>
<div class="editor-field-info"> <div class="editor-field-info">
<div> <div>
<b>{{ $t('word.size') }}</b>: {{ formatBytes(editingContent.length) }}<br> <b>{{ $t('word.size') }}</b>: {{ formatBytes(editingContent.length) }}<br>

View File

@ -1,7 +1,7 @@
.table { .table {
border-collapse: collapse; border-collapse: collapse;
border-spacing: 0;
width: 100%; width: 100%;
border-spacing: 0;
display: table; display: table;
table-layout: fixed; table-layout: fixed;

View File

@ -87,6 +87,50 @@ option:checked {
} }
} }
.workspace-query-results {
overflow: auto;
white-space: nowrap;
.table {
width: auto;
border-collapse: separate;
.th {
position: sticky;
top: 0;
border: 2px solid;
border-left: none;
border-bottom-width: 2px;
padding: 0;
font-weight: 700;
font-size: 0.7rem;
z-index: 1;
> div {
padding: 0.1rem 0.2rem;
min-width: -webkit-fill-available;
}
}
.td {
border-right: 2px solid;
border-bottom: 2px solid;
padding: 0 0.2rem;
text-overflow: ellipsis;
max-width: 200px;
white-space: nowrap;
overflow: hidden;
font-size: 0.7rem;
position: relative;
&:focus {
outline: none;
}
}
}
}
.workspace-tabs { .workspace-tabs {
align-content: baseline; align-content: baseline;

View File

@ -181,37 +181,6 @@
} }
} }
.workspace-query-results {
.table {
.th {
border-color: darken($bg-color-light-gray, 80%);
background-color: $body-bg-dark;
}
.tr {
background-color: darken($bg-color-light-gray, 80%);
.td:first-child {
border-left: 2px solid $body-bg-dark;
}
.td {
border-color: $body-bg-dark;
&:focus {
box-shadow: inset 0 0 0 2px darken($body-font-color-dark, 40%);
background-color: rgba($color: #000, $alpha: 0.3);
}
.editable-field {
box-shadow: inset 0 0 0 2px darken($body-font-color-dark, 40%);
background-color: rgba($color: #000, $alpha: 0.3);
}
}
}
}
}
.workspace-tabs { .workspace-tabs {
.tab-block { .tab-block {
background: $bg-color-light-dark; background: $bg-color-light-dark;
@ -233,6 +202,37 @@
} }
} }
.workspace-query-results {
.table {
.th {
border-color: darken($bg-color-light-gray, 80%);
background-color: $body-bg-dark;
}
.tr {
background-color: darken($bg-color-light-gray, 80%);
.td:first-child {
border-left: 2px solid $body-bg-dark;
}
.td {
border-color: $body-bg-dark;
&:focus {
box-shadow: inset 0 0 0 2px darken($body-font-color-dark, 40%);
background-color: rgba($color: #000, $alpha: 0.3);
}
.editable-field {
box-shadow: inset 0 0 0 2px darken($body-font-color-dark, 40%);
background-color: rgba($color: #000, $alpha: 0.3);
}
}
}
}
}
.connection-panel { .connection-panel {
.panel { .panel {
background: rgba($bg-color-light-dark, 50%); background: rgba($bg-color-light-dark, 50%);

View File

@ -217,33 +217,33 @@
} }
} }
} }
}
.workspace-query-results { .workspace-query-results {
.table { .table {
.th { .th {
background: $body-bg; background: $body-bg;
border-color: lighten($bg-color-light-gray, 2%); border-color: lighten($bg-color-light-gray, 2%);
}
.tr {
background-color: lighten($bg-color-light-gray, 2%);
.td:first-child {
border-left: 2px solid $body-bg;
} }
.tr { .td {
background-color: lighten($bg-color-light-gray, 2%); border-color: $body-bg;
.td:first-child { &:focus {
border-left: 2px solid $body-bg; box-shadow: inset 0 0 0 2px lighten($body-font-color, 10%);
background-color: $body-font-color-dark;
} }
.td { .editable-field {
border-color: $body-bg; box-shadow: inset 0 0 0 2px lighten($body-font-color, 10%);
background-color: $body-font-color-dark;
&:focus {
box-shadow: inset 0 0 0 2px lighten($body-font-color, 10%);
background-color: $body-font-color-dark;
}
.editable-field {
box-shadow: inset 0 0 0 2px lighten($body-font-color, 10%);
background-color: $body-font-color-dark;
}
} }
} }
} }