1
1
mirror of https://github.com/Fabio286/antares.git synced 2025-06-05 21:59:22 +02:00

Compare commits

...

10 Commits

Author SHA1 Message Date
dependabot[bot]
67e849bc66 chore(deps): bump webpack from 5.91.0 to 5.98.0
Bumps [webpack](https://github.com/webpack/webpack) from 5.91.0 to 5.98.0.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.91.0...v5.98.0)

---
updated-dependencies:
- dependency-name: webpack
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-01 19:25:34 +00:00
eb706c3e51 fix: issue with some SSH connections, definitely 2025-02-14 20:30:47 +01:00
971df3a989 chore(release): 0.7.33 2025-02-14 18:03:57 +01:00
3129bf4baa fix: issue with some SSH connections, fixes #947 2025-02-14 17:58:49 +01:00
c6d67cef01 chore(release): 0.7.32 2025-02-14 09:12:05 +01:00
1d7053ce03 fix: black background with light theme, fixes #945 2025-02-14 09:08:45 +01:00
41e797f9e2 fix(PostgreSQL): error with materialized view tabs 2025-02-13 18:01:19 +01:00
704f70819b fix: improve error handling in SSH connection 2025-02-12 18:10:27 +01:00
49a3589536 fix: enhance SVG support in connection customization, fixes #939 2025-02-12 18:09:11 +01:00
49ada059bc chore(release): 0.7.31 2025-02-11 18:22:37 +01:00
26 changed files with 600 additions and 244 deletions

View File

@@ -2,6 +2,25 @@
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
### [0.7.33](https://github.com/antares-sql/antares/compare/v0.7.32...v0.7.33) (2025-02-14)
### Bug Fixes
* issue with some SSH connections, fixes [#947](https://github.com/antares-sql/antares/issues/947) ([3129bf4](https://github.com/antares-sql/antares/commit/3129bf4baa5e72b1d79df986605fd5fad1dce291))
### [0.7.32](https://github.com/antares-sql/antares/compare/v0.7.31...v0.7.32) (2025-02-14)
### Bug Fixes
* black background with light theme, fixes [#945](https://github.com/antares-sql/antares/issues/945) ([1d7053c](https://github.com/antares-sql/antares/commit/1d7053ce032efec8377d9500f2e24618f6381ab4))
* enhance SVG support in connection customization, fixes [#939](https://github.com/antares-sql/antares/issues/939) ([49a3589](https://github.com/antares-sql/antares/commit/49a3589536d2e75a14125be7b874e29b60fb56c4))
* improve error handling in SSH connection ([704f708](https://github.com/antares-sql/antares/commit/704f70819b21a42194d8f68cf9b58ba337f1ada7))
* **PostgreSQL:** error with materialized view tabs ([41e797f](https://github.com/antares-sql/antares/commit/41e797f9e27db66370d3ae7750c057f708af76f9))
### [0.7.31](https://github.com/antares-sql/antares/compare/v0.7.31-beta.5...v0.7.31) (2025-02-11)
### [0.7.31-beta.5](https://github.com/antares-sql/antares/compare/v0.7.31-beta.4...v0.7.31-beta.5) (2025-02-09) ### [0.7.31-beta.5](https://github.com/antares-sql/antares/compare/v0.7.31-beta.4...v0.7.31-beta.5) (2025-02-09)

672
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
{ {
"name": "antares", "name": "antares",
"productName": "Antares", "productName": "Antares",
"version": "0.7.31-beta.5", "version": "0.7.33",
"description": "A modern, fast and productivity driven SQL client with a focus in UX.", "description": "A modern, fast and productivity driven SQL client with a focus in UX.",
"license": "MIT", "license": "MIT",
"repository": "https://github.com/antares-sql/antares.git", "repository": "https://github.com/antares-sql/antares.git",
@@ -174,7 +174,7 @@
"vue-i18n": "~9.13.1", "vue-i18n": "~9.13.1",
"vue-loader": "~16.8.3", "vue-loader": "~16.8.3",
"vuedraggable": "~4.1.0", "vuedraggable": "~4.1.0",
"webpack": "^5.91.0", "webpack": "^5.98.0",
"webpack-cli": "~4.9.1" "webpack-cli": "~4.9.1"
}, },
"devDependencies": { "devDependencies": {

View File

@@ -64,9 +64,9 @@ export default (connections: Record<string, antares.Client>) => {
username: conn.sshUser, username: conn.sshUser,
password: conn.sshPass, password: conn.sshPass,
port: conn.sshPort ? conn.sshPort : 22, port: conn.sshPort ? conn.sshPort : 22,
privateKey: conn.sshKey ? fs.readFileSync(conn.sshKey).toString() : null, privateKey: conn.sshKey ? fs.readFileSync(conn.sshKey).toString() : undefined,
passphrase: conn.sshPassphrase, passphrase: conn.sshPassphrase,
keepaliveInterval: conn.sshKeepAliveInterval ? conn.sshKeepAliveInterval*1000 : null keepaliveInterval: conn.sshKeepAliveInterval ? conn.sshKeepAliveInterval*1000 : undefined
}; };
} }
@@ -90,11 +90,12 @@ export default (connections: Record<string, antares.Client>) => {
return { status: 'success' }; return { status: 'success' };
} }
catch (err) { catch (error) {
clearInterval(abortChecker); clearInterval(abortChecker);
if (error instanceof AggregateError)
if (!isLocalAborted) throw new Error(error.errors.reduce((acc, curr) => acc +' | '+ curr.message, ''));
return { status: 'error', response: err.toString() }; else if (!isLocalAborted)
return { status: 'error', response: error.toString() };
else else
return { status: 'abort', response: 'Connection aborted' }; return { status: 'abort', response: 'Connection aborted' };
} }

View File

@@ -173,13 +173,13 @@ export class MySQLClient extends BaseClient {
remotePort: this._params.port remotePort: this._params.port
}); });
dbConfig.host = (this._ssh.config as SSHConfig[] & { host: string }).host; dbConfig.host = undefined;
dbConfig.port = tunnel.localPort; dbConfig.port = tunnel.localPort;
} }
catch (err) { catch (err) {
if (this._ssh) { if (this._ssh) {
this._ssh.close();
this._ssh.closeTunnel(); this._ssh.closeTunnel();
this._ssh.close();
} }
throw err; throw err;
} }
@@ -227,8 +227,8 @@ export class MySQLClient extends BaseClient {
clearInterval(this._keepaliveTimer); clearInterval(this._keepaliveTimer);
this._keepaliveTimer = undefined; this._keepaliveTimer = undefined;
if (this._ssh) { if (this._ssh) {
this._ssh.close();
this._ssh.closeTunnel(); this._ssh.closeTunnel();
this._ssh.close();
} }
} }
@@ -302,6 +302,8 @@ export class MySQLClient extends BaseClient {
await this.connect(); await this.connect();
return this.getConnection(args, true); return this.getConnection(args, true);
} }
else if (error instanceof AggregateError)
throw new Error(error.errors.reduce((acc, curr) => acc +' | '+ curr.message, ''));
else else
throw new Error(error.message); throw new Error(error.message);
} }

View File

@@ -179,7 +179,7 @@ export class PostgreSQLClient extends BaseClient {
remotePort: this._params.port remotePort: this._params.port
}); });
dbConfig.host = (this._ssh.config as SSHConfig[] & { host: string }).host; dbConfig.host = undefined;
dbConfig.port = tunnel.localPort; dbConfig.port = tunnel.localPort;
} }
catch (err) { catch (err) {
@@ -348,7 +348,7 @@ export class PostgreSQLClient extends BaseClient {
matviewowner AS owner, matviewowner AS owner,
ispopulated AS is_populated, ispopulated AS is_populated,
definition, definition,
'materializedview' AS table_type 'materializedView' AS table_type
FROM pg_matviews FROM pg_matviews
WHERE schemaname = '${db.database}' WHERE schemaname = '${db.database}'
ORDER BY schema_name, ORDER BY schema_name,
@@ -408,8 +408,8 @@ export class PostgreSQLClient extends BaseClient {
name: table.table_name, name: table.table_name,
type: table.table_type === 'VIEW' type: table.table_type === 'VIEW'
? 'view' ? 'view'
: table.table_type === 'materializedview' : table.table_type === 'materializedView'
? 'materializedview' ? 'materializedView'
: 'table', : 'table',
rows: table.reltuples, rows: table.reltuples,
size: tableSize, size: tableSize,

View File

@@ -132,11 +132,21 @@ app.on('ready', async () => {
// mainWindow.webContents.openDevTools(); // mainWindow.webContents.openDevTools();
process.on('uncaughtException', error => { process.on('uncaughtException', error => {
mainWindow.webContents.send('unhandled-exception', error); if (error instanceof AggregateError) {
for (const e of error.errors)
mainWindow.webContents.send('unhandled-exception', e);
}
else
mainWindow.webContents.send('unhandled-exception', error);
}); });
process.on('unhandledRejection', error => { process.on('unhandledRejection', error => {
mainWindow.webContents.send('unhandled-exception', error); if (error instanceof AggregateError) {
for (const e of error.errors)
mainWindow.webContents.send('unhandled-exception', e);
}
else
mainWindow.webContents.send('unhandled-exception', error);
}); });
}); });

View File

@@ -39,11 +39,11 @@ const props = defineProps({
default: () => 'mdi' default: () => 'mdi'
}, },
flip: { flip: {
type: String as PropType<'horizontal' | 'vertical' | 'both'>, type: String as PropType<'horizontal' | 'vertical' | 'both' | null>,
default: () => null default: () => null
}, },
rotate: { rotate: {
type: Number, type: Number as PropType<number | null>,
default: () => null default: () => null
} }
}); });
@@ -55,8 +55,7 @@ const iconPath = computed(() => {
const base64 = getIconByUid(props.iconName)?.base64; const base64 = getIconByUid(props.iconName)?.base64;
const svgString = Buffer const svgString = Buffer
.from(base64, 'base64') .from(base64, 'base64')
.toString('utf-8') .toString('utf-8');
.replaceAll(/width="[^"]*"|height="[^"]*"/g, '');
return svgString; return svgString;
} }

View File

@@ -131,8 +131,10 @@ import Application from '@/ipc-api/Application';
import { camelize } from '@/libs/camelize'; import { camelize } from '@/libs/camelize';
import { unproxify } from '@/libs/unproxify'; import { unproxify } from '@/libs/unproxify';
import { SidebarElement, useConnectionsStore } from '@/stores/connections'; import { SidebarElement, useConnectionsStore } from '@/stores/connections';
import { useNotificationsStore } from '@/stores/notifications';
const connectionsStore = useConnectionsStore(); const connectionsStore = useConnectionsStore();
const { addNotification } = useNotificationsStore();
const { addIcon, removeIcon, updateConnectionOrder, getConnectionName } = connectionsStore; const { addIcon, removeIcon, updateConnectionOrder, getConnectionName } = connectionsStore;
const { customIcons } = storeToRefs(connectionsStore); const { customIcons } = storeToRefs(connectionsStore);
@@ -225,12 +227,56 @@ const removeIconHandler = () => {
isContext.value = false; isContext.value = false;
}; };
const adjustSVGContent = (svgContent: string) => {
try {
const parser = new DOMParser();
const doc = parser.parseFromString(svgContent, 'image/svg+xml');
const parseError = doc.querySelector('parsererror');
if (parseError) {
addNotification({ status: 'error', message: parseError.textContent });
return null;
}
const svg = doc.documentElement;
if (svg.tagName.toLowerCase() !== 'svg') {
addNotification({ status: 'error', message: t('application.invalidFIle') });
return null;
}
if (!svg.hasAttribute('viewBox')) {
const width = svg.getAttribute('width') || '36';
const height = svg.getAttribute('height') || '36';
svg.setAttribute('viewBox', `0 0 ${width} ${height}`);
}
svg.removeAttribute('width');
svg.removeAttribute('height');
const serializer = new XMLSerializer();
return serializer.serializeToString(svg);
}
catch (error) {
addNotification({ status: 'error', message: error.stack });
return null;
}
};
const openFile = async () => { const openFile = async () => {
const result = await Application.showOpenDialog({ properties: ['openFile'], filters: [{ name: '"SVG"', extensions: ['svg'] }] }); const result = await Application.showOpenDialog({
properties: ['openFile'],
filters: [{ name: '"SVG"', extensions: ['svg'] }]
});
if (result && !result.canceled) { if (result && !result.canceled) {
const file = result.filePaths[0]; const file = result.filePaths[0];
const content = await Application.readFile({ filePath: file, encoding: 'base64url' }); let content = await Application.readFile({ filePath: file, encoding: 'utf-8' });
addIcon(content);
content = adjustSVGContent(content);
const base64Content = Buffer.from(content).toString('base64');
addIcon(base64Content);
} }
}; };

View File

@@ -64,7 +64,7 @@
> >
<BaseIcon <BaseIcon
class="mt-1 mr-1" class="mt-1 mr-1"
:icon-name="['view', 'materializedview'].includes(element.elementType) ? 'mdiTableEye' : 'mdiTable'" :icon-name="['view', 'materializedView'].includes(element.elementType) ? 'mdiTableEye' : 'mdiTable'"
:size="18" :size="18"
/> />
<span :title="`${t('general.data').toUpperCase()}: ${t(`database.${element.elementType}`)}`"> <span :title="`${t('general.data').toUpperCase()}: ${t(`database.${element.elementType}`)}`">
@@ -81,7 +81,7 @@
<a v-else-if="element.type === 'data'" class="tab-link"> <a v-else-if="element.type === 'data'" class="tab-link">
<BaseIcon <BaseIcon
class="mt-1 mr-1" class="mt-1 mr-1"
:icon-name="['view', 'materializedview'].includes(element.elementType) ? 'mdiTableEye' : 'mdiTable'" :icon-name="['view', 'materializedView'].includes(element.elementType) ? 'mdiTableEye' : 'mdiTable'"
:size="18" :size="18"
/> />
<span :title="`${t('general.data').toUpperCase()}: ${t(`database.${element.elementType}`)}`"> <span :title="`${t('general.data').toUpperCase()}: ${t(`database.${element.elementType}`)}`">

View File

@@ -143,7 +143,7 @@
:selected-schema="selectedSchema" :selected-schema="selectedSchema"
:context-event="miscContextEvent" :context-event="miscContextEvent"
@open-create-view-tab="openCreateElementTab('view')" @open-create-view-tab="openCreateElementTab('view')"
@open-create-materializedview-tab="openCreateElementTab('materialized-view')" @open-create-materializedView-tab="openCreateElementTab('materialized-view')"
@open-create-trigger-tab="openCreateElementTab('trigger')" @open-create-trigger-tab="openCreateElementTab('trigger')"
@open-create-trigger-function-tab="openCreateElementTab('trigger-function')" @open-create-trigger-function-tab="openCreateElementTab('trigger-function')"
@open-create-routine-tab="openCreateElementTab('routine')" @open-create-routine-tab="openCreateElementTab('routine')"

View File

@@ -16,9 +16,9 @@
/> {{ t('database.createNewView') }}</span> /> {{ t('database.createNewView') }}</span>
</div> </div>
<div <div
v-if="props.selectedMisc === 'materializedview'" v-if="props.selectedMisc === 'materializedView'"
class="context-element" class="context-element"
@click="emit('open-create-materializedview-tab')" @click="emit('open-create-materializedView-tab')"
> >
<span class="d-flex"> <span class="d-flex">
<BaseIcon <BaseIcon
@@ -106,7 +106,7 @@ const props = defineProps({
const emit = defineEmits([ const emit = defineEmits([
'open-create-view-tab', 'open-create-view-tab',
'open-create-materializedview-tab', 'open-create-materializedView-tab',
'open-create-trigger-tab', 'open-create-trigger-tab',
'open-create-routine-tab', 'open-create-routine-tab',
'open-create-function-tab', 'open-create-function-tab',

View File

@@ -121,7 +121,7 @@
<summary <summary
class="accordion-header misc-name" class="accordion-header misc-name"
:class="{'text-bold': breadcrumbs.schema === database.name && breadcrumbs.trigger}" :class="{'text-bold': breadcrumbs.schema === database.name && breadcrumbs.trigger}"
@contextmenu.prevent="showMiscFolderContext($event, 'materializedview')" @contextmenu.prevent="showMiscFolderContext($event, 'materializedView')"
> >
<BaseIcon <BaseIcon
class="misc-icon mr-1" class="misc-icon mr-1"
@@ -133,7 +133,7 @@
icon-name="mdiFolderOpen" icon-name="mdiFolderOpen"
:size="18" :size="18"
/> />
{{ t('database.materializedview', 2) }} {{ t('database.materializedView', 2) }}
</summary> </summary>
<div class="accordion-body"> <div class="accordion-body">
<div> <div>
@@ -496,9 +496,9 @@ const filteredViews = computed(() => {
const filteredMatViews = computed(() => { const filteredMatViews = computed(() => {
if (props.searchMethod === 'elements') if (props.searchMethod === 'elements')
return props.database.tables.filter(table => table.name.search(searchTerm.value) >= 0 && table.type === 'materializedview'); return props.database.tables.filter(table => table.name.search(searchTerm.value) >= 0 && table.type === 'materializedView');
else else
return props.database.tables.filter(table => table.type === 'materializedview'); return props.database.tables.filter(table => table.type === 'materializedView');
}); });
const filteredTriggers = computed(() => { const filteredTriggers = computed(() => {

View File

@@ -50,7 +50,7 @@
class="text-light mt-1 mr-1" class="text-light mt-1 mr-1"
icon-name="mdiTableEye" icon-name="mdiTableEye"
:size="18" :size="18"
/> {{ t('database.materializedview') }}</span> /> {{ t('database.materializedView') }}</span>
</div> </div>
<div <div
v-if="workspace.customizations.triggerAdd" v-if="workspace.customizations.triggerAdd"

View File

@@ -48,7 +48,7 @@
/> {{ t('application.settings') }}</span> /> {{ t('application.settings') }}</span>
</div> </div>
<div <div
v-if="selectedTable && selectedTable.type === 'materializedview' && customizations.materializedViewSettings" v-if="selectedTable && selectedTable.type === 'materializedView' && customizations.materializedViewSettings"
class="context-element" class="context-element"
@click="openMaterializedViewSettingTab" @click="openMaterializedViewSettingTab"
> >

View File

@@ -195,7 +195,7 @@ const saveChanges = async () => {
uid: props.connection.uid, uid: props.connection.uid,
schema: props.schema, schema: props.schema,
elementName: localView.value.name, elementName: localView.value.name,
elementType: 'materializedview', elementType: 'materializedView',
type: 'materialized-view-props' type: 'materialized-view-props'
}); });

View File

@@ -227,7 +227,7 @@ const saveChanges = async () => {
schema: props.schema, schema: props.schema,
elementName: oldName, elementName: oldName,
elementNewName: localView.value.name, elementNewName: localView.value.name,
elementType: 'materializedview' elementType: 'materializedView'
}); });
changeBreadcrumbs({ schema: props.schema, view: localView.value.name }); changeBreadcrumbs({ schema: props.schema, view: localView.value.name });

View File

@@ -141,7 +141,7 @@ export const csCZ = {
total: 'Celkem', total: 'Celkem',
table: 'Tabulka | Tabulky', table: 'Tabulka | Tabulky',
view: 'Pohled | Pohledy', view: 'Pohled | Pohledy',
materializedview: 'Materializovaný pohled', materializedView: 'Materializovaný pohled',
definer: 'Definér', definer: 'Definér',
algorithm: 'Algoritmus', algorithm: 'Algoritmus',
trigger: 'Trigger | Triggery', trigger: 'Trigger | Triggery',

View File

@@ -141,7 +141,7 @@ export const enUS = {
total: 'Total', total: 'Total',
table: 'Table | Tables', table: 'Table | Tables',
view: 'View | Views', view: 'View | Views',
materializedview: 'Materialized view | Materialized views', materializedView: 'Materialized view | Materialized views',
definer: 'Definer', definer: 'Definer',
algorithm: 'Algorithm', algorithm: 'Algorithm',
trigger: 'Trigger | Triggers', trigger: 'Trigger | Triggers',
@@ -401,6 +401,7 @@ export const enUS = {
ignoreDuplicates: 'Ignore duplicates', ignoreDuplicates: 'Ignore duplicates',
wrongImportPassword: 'Wrong import password', wrongImportPassword: 'Wrong import password',
wrongFileFormat: 'Wrong file format', wrongFileFormat: 'Wrong file format',
invalidFile: 'Invalid file',
dataImportSuccess: 'Data successfully imported', dataImportSuccess: 'Data successfully imported',
note: 'Note | Notes', note: 'Note | Notes',
thereAreNoNotesYet: 'There are no notes yet', thereAreNoNotesYet: 'There are no notes yet',

View File

@@ -141,7 +141,7 @@ export const esES = {
total: 'Total', total: 'Total',
table: 'Tabla | Tablas', table: 'Tabla | Tablas',
view: 'Vista | Vistas', view: 'Vista | Vistas',
materializedview: 'Vista Materializada | Vistas Materializadas', materializedView: 'Vista Materializada | Vistas Materializadas',
definer: 'Definidor', definer: 'Definidor',
algorithm: 'Algoritmo', algorithm: 'Algoritmo',
trigger: 'Disparador | Disparadores', trigger: 'Disparador | Disparadores',

View File

@@ -140,7 +140,7 @@ export const heIL = {
total: 'סך הכל', total: 'סך הכל',
table: 'טבלה | טבלאות', table: 'טבלה | טבלאות',
view: 'תצוגה | תצוגות', view: 'תצוגה | תצוגות',
materializedview: 'תצוגה ממומשת | תצוגות ממומשות', materializedView: 'תצוגה ממומשת | תצוגות ממומשות',
definer: 'מגדיר', definer: 'מגדיר',
algorithm: 'אלגוריתם', algorithm: 'אלגוריתם',
trigger: 'טריגר | טריגרים', trigger: 'טריגר | טריגרים',

View File

@@ -275,7 +275,7 @@ export const nlNL = {
savedQueries: 'Opgeslagen queries', savedQueries: 'Opgeslagen queries',
searchForElements: 'Zoek naar elementen', searchForElements: 'Zoek naar elementen',
searchForSchemas: 'Zoek naar schema\'s', searchForSchemas: 'Zoek naar schema\'s',
materializedview: 'Materialized view | Materialized views', materializedView: 'Materialized view | Materialized views',
createNewMaterializedView: 'Materialized view maken', createNewMaterializedView: 'Materialized view maken',
newMaterializedView: 'Nieuwe materialized view' newMaterializedView: 'Nieuwe materialized view'
}, },

View File

@@ -270,7 +270,7 @@ export const ruRU = {
importQueryErrors: 'Внимание: {n} ошибка возникла | Внимание: {n} ошибок произошло', importQueryErrors: 'Внимание: {n} ошибка возникла | Внимание: {n} ошибок произошло',
executedQueries: '{n} запрос выполнен | {n} запросов выполнено', executedQueries: '{n} запрос выполнен | {n} запросов выполнено',
insert: 'Вставить', insert: 'Вставить',
materializedview: 'Материализованное представление | Материализованные представления', materializedView: 'Материализованное представление | Материализованные представления',
exportTable: 'Экспорт таблицы', exportTable: 'Экспорт таблицы',
createNewMaterializedView: 'Создать новое материализованное представление', createNewMaterializedView: 'Создать новое материализованное представление',
newMaterializedView: 'Новое материализованное представление', newMaterializedView: 'Новое материализованное представление',

View File

@@ -270,7 +270,7 @@ export const uzUZ = {
importQueryErrors: 'Diqqat: {n} xato yuz berdi | Diqqat: {n} xatolar yuz berdi', importQueryErrors: 'Diqqat: {n} xato yuz berdi | Diqqat: {n} xatolar yuz berdi',
executedQueries: '{n} soʻrov bajarildi | {n} soʻrovlar bajarildi', executedQueries: '{n} soʻrov bajarildi | {n} soʻrovlar bajarildi',
insert: 'Kiritish', insert: 'Kiritish',
materializedview: 'Materializatsiya qilingan korinish | Materializatsiya qilingan korinishlar', materializedView: 'Materializatsiya qilingan korinish | Materializatsiya qilingan korinishlar',
exportTable: 'Jadvalni eksport qilish', exportTable: 'Jadvalni eksport qilish',
createNewMaterializedView: 'Yangi materializatsiya qilingan korinish yaratish', createNewMaterializedView: 'Yangi materializatsiya qilingan korinish yaratish',
newMaterializedView: 'Yangi materializatsiya qilingan korinish', newMaterializedView: 'Yangi materializatsiya qilingan korinish',

View File

@@ -132,7 +132,7 @@ export const zhCN = {
total: '总计', total: '总计',
table: '表 | 表', table: '表 | 表',
view: '视图 | 视图', view: '视图 | 视图',
materializedview: '实体化视图 | 实体化视图', materializedView: '实体化视图 | 实体化视图',
definer: '定义者', definer: '定义者',
algorithm: '算法', algorithm: '算法',
trigger: '触发器 | 触发器', trigger: '触发器 | 触发器',

View File

@@ -1,5 +1,7 @@
/* stylelint-disable function-no-unknown */ /* stylelint-disable function-no-unknown */
.theme-light { .theme-light {
background: $body-bg;
::-webkit-scrollbar-track { ::-webkit-scrollbar-track {
background: #fff; background: #fff;
} }