Browse Source

refactor: update uidt icons

Signed-off-by: Pranav C <pranavxc@gmail.com>
pull/5343/head
Pranav C 2 years ago
parent
commit
7b3f4c21ed
  1. 1
      packages/nc-gui/components.d.ts
  2. 6
      packages/nc-gui/components/account/Token.vue
  3. 8
      packages/nc-gui/components/account/UserList.vue
  4. 2
      packages/nc-gui/components/account/UsersModal.vue
  5. 6
      packages/nc-gui/components/api-client/Headers.vue
  6. 6
      packages/nc-gui/components/api-client/Params.vue
  7. 55
      packages/nc-gui/components/dashboard/TreeView.vue
  8. 4
      packages/nc-gui/components/dashboard/settings/AppStore.vue
  9. 4
      packages/nc-gui/components/dashboard/settings/DataSources.vue
  10. 13
      packages/nc-gui/components/dashboard/settings/Modal.vue
  11. 10
      packages/nc-gui/components/dashboard/settings/app-store/AppInstall.vue
  12. 3
      packages/nc-gui/components/dashboard/settings/data-sources/CreateBase.vue
  13. 3
      packages/nc-gui/components/dashboard/settings/data-sources/EditBase.vue
  14. 4
      packages/nc-gui/components/general/MiniSidebar.vue
  15. 3
      packages/nc-gui/components/smartsheet/Form.vue
  16. 5
      packages/nc-gui/components/smartsheet/Grid.vue
  17. 8
      packages/nc-gui/components/smartsheet/Kanban.vue
  18. 4
      packages/nc-gui/components/smartsheet/column/SelectOptions.vue
  19. 13
      packages/nc-gui/components/smartsheet/expanded-form/Header.vue
  20. 74
      packages/nc-gui/components/smartsheet/header/CellIcon.ts
  21. 10
      packages/nc-gui/components/smartsheet/header/Menu.vue
  22. 12
      packages/nc-gui/components/smartsheet/sidebar/MenuBottom.vue
  23. 18
      packages/nc-gui/components/smartsheet/sidebar/RenameableMenuItem.vue
  24. 4
      packages/nc-gui/components/smartsheet/sidebar/toolbar/DeleteTable.vue
  25. 2
      packages/nc-gui/components/smartsheet/toolbar/AddRow.vue
  26. 4
      packages/nc-gui/components/smartsheet/toolbar/ColumnFilter.vue
  27. 5
      packages/nc-gui/components/smartsheet/toolbar/ColumnFilterMenu.vue
  28. 8
      packages/nc-gui/components/smartsheet/toolbar/ExportSubActions.vue
  29. 3
      packages/nc-gui/components/smartsheet/toolbar/FieldsMenu.vue
  30. 3
      packages/nc-gui/components/smartsheet/toolbar/LockType.vue
  31. 4
      packages/nc-gui/components/smartsheet/toolbar/RowHeight.vue
  32. 7
      packages/nc-gui/components/smartsheet/toolbar/SearchData.vue
  33. 8
      packages/nc-gui/components/smartsheet/toolbar/ShareView.vue
  34. 5
      packages/nc-gui/components/smartsheet/toolbar/SharedViewList.vue
  35. 7
      packages/nc-gui/components/smartsheet/toolbar/SortListMenu.vue
  36. 4
      packages/nc-gui/components/smartsheet/toolbar/ViewActions.vue
  37. 18
      packages/nc-gui/components/tabs/auth/ApiTokenManagement.vue
  38. 7
      packages/nc-gui/components/tabs/auth/UserManagement.vue
  39. 3
      packages/nc-gui/components/tabs/auth/user-management/ShareBase.vue
  40. 3
      packages/nc-gui/components/tabs/auth/user-management/UsersModal.vue
  41. 3
      packages/nc-gui/components/template/Editor.vue
  42. 4
      packages/nc-gui/components/virtual-cell/HasMany.vue
  43. 4
      packages/nc-gui/components/virtual-cell/ManyToMany.vue
  44. 4
      packages/nc-gui/components/virtual-cell/components/ListChildItems.vue
  45. 17
      packages/nc-gui/components/webhook/List.vue
  46. 3
      packages/nc-gui/layouts/base.vue
  47. 3
      packages/nc-gui/pages/[projectType]/[projectId]/index.vue
  48. 3
      packages/nc-gui/pages/index/index/create-external.vue
  49. 4
      packages/nc-gui/pages/index/index/index.vue
  50. 7
      packages/nc-gui/pages/projects/index.vue
  51. 10
      packages/nc-gui/pages/projects/index/index.vue
  52. 9
      packages/nc-gui/pages/projects/index/list.vue
  53. 86
      packages/nc-gui/utils/columnUtils.ts
  54. 75
      packages/nc-gui/utils/iconUtils.ts
  55. 5
      packages/nc-gui/utils/viewUtils.ts

1
packages/nc-gui/components.d.ts vendored

@ -81,6 +81,7 @@ declare module '@vue/runtime-core' {
ClaritySuccessLine: typeof import('~icons/clarity/success-line')['default']
EvaEmailOutline: typeof import('~icons/eva/email-outline')['default']
IcBaselineMoreVert: typeof import('~icons/ic/baseline-more-vert')['default']
Icon: typeof import('~icons/ic/on')['default']
IcOutlineInsertDriveFile: typeof import('~icons/ic/outline-insert-drive-file')['default']
IcRoundEdit: typeof import('~icons/ic/round-edit')['default']
IcRoundKeyboardArrowDown: typeof import('~icons/ic/round-keyboard-arrow-down')['default']

6
packages/nc-gui/components/account/Token.vue

@ -2,7 +2,7 @@
import type { VNodeRef } from '@vue/runtime-core'
import { Empty, Modal, message } from 'ant-design-vue'
import type { ApiTokenType, RequestParams, UserType } from 'nocodb-sdk'
import { extractSdkResponseErrorMsg, useApi, useCopy, useNuxtApp } from '#imports'
import { extractSdkResponseErrorMsg, iconMap, useApi, useCopy, useNuxtApp } from '#imports'
const { api, isLoading } = useApi()
@ -175,7 +175,7 @@ const descriptionInput: VNodeRef = (el) => (el as HTMLInputElement)?.focus()
<a-button type="text" class="!rounded-md" @click="copyToken(record.token)">
<template #icon>
<MdiContentCopy class="flex mx-auto h-[1rem]" />
<component :is="iconMap.copy" class="flex mx-auto h-[1rem]" />
</template>
</a-button>
</a-tooltip>
@ -198,7 +198,7 @@ const descriptionInput: VNodeRef = (el) => (el as HTMLInputElement)?.focus()
<a-menu data-testid="nc-token-row-action-icon">
<a-menu-item>
<div class="flex flex-row items-center py-3 h-[1rem] nc-delete-token" @click="deleteToken(record.token)">
<MdiDeleteOutline class="flex" />
<component :is="iconMap.delete" class="flex" />
<div class="text-xs pl-2">{{ $t('general.remove') }}</div>
</div>
</a-menu-item>

8
packages/nc-gui/components/account/UserList.vue

@ -1,7 +1,7 @@
<script lang="ts" setup>
import { Modal, message } from 'ant-design-vue'
import type { OrgUserReqType, RequestParams, UserType } from 'nocodb-sdk'
import { Role, extractSdkResponseErrorMsg, useApi, useCopy, useDashboard, useNuxtApp } from '#imports'
import { Role, extractSdkResponseErrorMsg, iconMap, useApi, useCopy, useDashboard, useNuxtApp } from '#imports'
import type { User } from '~/lib'
const { api, isLoading } = useApi()
@ -256,20 +256,20 @@ const copyPasswordResetUrl = async (user: User) => {
</a-menu-item>
<a-menu-item>
<div class="flex flex-row items-center py-3" @click="copyInviteUrl(record)">
<MdiContentCopy class="flex h-[1rem] text-gray-500" />
<component :is="iconMap.copy" class="flex h-[1rem] text-gray-500" />
<div class="text-xs pl-2">{{ $t('activity.copyInviteURL') }}</div>
</div>
</a-menu-item>
</template>
<a-menu-item>
<div class="flex flex-row items-center py-3" @click="copyPasswordResetUrl(record)">
<MdiContentCopy class="flex h-[1rem] text-gray-500" />
<component :is="iconMap.copy" class="flex h-[1rem] text-gray-500" />
<div class="text-xs pl-2">{{ $t('activity.copyPasswordResetURL') }}</div>
</div>
</a-menu-item>
<a-menu-item>
<div class="flex flex-row items-center py-3" @click="deleteUser(text)">
<MdiDeleteOutline data-testid="nc-super-user-delete" class="flex h-[1rem] text-gray-500" />
<component :is="iconMap.delete" data-testid="nc-super-user-delete" class="flex h-[1rem] text-gray-500" />
<div class="text-xs pl-2">{{ $t('general.delete') }}</div>
</div>
</a-menu-item>

2
packages/nc-gui/components/account/UsersModal.vue

@ -139,7 +139,7 @@ const emailInput: VNodeRef = (el) => (el as HTMLInputElement)?.focus()
<a-button type="text" class="!rounded-md -mt-0.5" @click="copyUrl">
<template #icon>
<MdiContentCopy class="flex mx-auto text-green-700 h-[1rem]" />
<component :is="iconMap.copy" class="flex mx-auto text-green-700 h-[1rem]" />
</template>
</a-button>
</div>

6
packages/nc-gui/components/api-client/Headers.vue

@ -1,5 +1,5 @@
<script setup lang="ts">
import { useVModel } from '#imports'
import { iconMap, useVModel } from '#imports'
const props = defineProps<{
modelValue: any[]
@ -116,7 +116,7 @@ const filterOption = (input: string, option: Option) => {
<td class="relative">
<div v-if="idx !== 0" class="absolute flex flex-col justify-start mt-2 -right-6 top-0">
<MdiDeleteOutline class="cursor-pointer" @click="deleteHeaderRow(idx)" />
<component :is="iconMap.delete" class="cursor-pointer" @click="deleteHeaderRow(idx)" />
</div>
</td>
</tr>
@ -125,7 +125,7 @@ const filterOption = (input: string, option: Option) => {
<td :colspan="12" class="text-center">
<a-button type="default" class="!bg-gray-100 rounded-md border-none mr-1" @click="addHeaderRow">
<template #icon>
<MdiPlus class="flex mx-auto" />
<component :is="iconMap.plus" class="flex mx-auto" />
</template>
</a-button>
</td>

6
packages/nc-gui/components/api-client/Params.vue

@ -1,5 +1,5 @@
<script setup lang="ts">
import { useVModel } from '#imports'
import { iconMap, useVModel } from '#imports'
const props = defineProps<{
modelValue: any[]
@ -59,7 +59,7 @@ const deleteParamRow = (i: number) => vModel.value.splice(i, 1)
<td class="relative">
<div v-if="idx !== 0" class="absolute flex flex-col justify-start mt-2 -right-6 top-0">
<MdiDeleteOutline class="cursor-pointer" @click="deleteParamRow(idx)" />
<component :is="iconMap.delete" class="cursor-pointer" @click="deleteParamRow(idx)" />
</div>
</td>
</tr>
@ -68,7 +68,7 @@ const deleteParamRow = (i: number) => vModel.value.splice(i, 1)
<td :colspan="12" class="text-center">
<a-button type="default" class="!bg-gray-100 rounded-md border-none mr-1" @click="addParamRow">
<template #icon>
<MdiPlus class="flex mx-auto" />
<component :is="iconMap.plus" class="flex mx-auto" />
</template>
</a-button>
</td>

55
packages/nc-gui/components/dashboard/TreeView.vue

@ -32,7 +32,7 @@ import {
} from '#imports'
import PhEyeThin from '~icons/ph/EyeThin'
import PhTableThin from '~icons/ph/TableThin'
import { iconMap } from '~/utils';
import { iconMap } from '~/utils'
const { isMobileMode } = useGlobal()
@ -375,7 +375,7 @@ const setIcon = async (icon: string, table: TableType) => {
<Transition name="layout" mode="out-in">
<MdiClose v-if="searchActive" class="text-gray-500 text-lg mx-1 mt-0.5" @click="onSearchCloseIconClick" />
<component :is="iconMap['search']" v-else class="text-gray-500 text-lg mx-1 mt-0.5" @click="toggleSearchActive(true)" />
<component :is="iconMap.search" v-else class="text-gray-500 text-lg mx-1 mt-0.5" @click="toggleSearchActive(true)" />
</Transition>
</div>
<div
@ -407,7 +407,7 @@ const setIcon = async (icon: string, table: TableType) => {
<a-dropdown v-if="!isSharedBase" :trigger="['click']" overlay-class-name="nc-dropdown-import-menu" @click.stop>
<Transition name="slide-right" mode="out-in">
<MdiDotsVertical v-if="!searchActive" class="hover:text-accent outline-0" />
<component :is="iconMap['three-dot-vertical']" v-if="!searchActive" class="hover:text-accent outline-0" />
</Transition>
<template #overlay>
@ -472,13 +472,17 @@ const setIcon = async (icon: string, table: TableType) => {
<div
v-if="isUIAllowed('table-create')"
class="group flex items-center gap-2 pl-2 pr-3 py-2 text-primary/70 hover:(text-primary/100) cursor-pointer select-none"
@click="openTableCreateDialog(bases[0].id)">
<component :is="iconMap['plus']" class="w-5" />
@click="openTableCreateDialog(bases[0].id)"
>
<component :is="iconMap.plus" class="w-5" />
<span class="text-gray-500 group-hover:(text-primary/100) flex-1 nc-add-new-table">{{ $t('tooltip.addTable') }}</span>
<a-dropdown v-if="!isSharedBase" :trigger="['click']" overlay-class-name="nc-dropdown-import-menu" @click.stop>
<MdiDotsVertical class="transition-opacity opacity-0 group-hover:opacity-100 nc-import-menu outline-0" />
<component
:is="iconMap['three-dot-vertical']"
class="transition-opacity opacity-0 group-hover:opacity-100 nc-import-menu outline-0"
/>
<template #overlay>
<a-menu class="!py-0 rounded text-sm">
@ -490,7 +494,7 @@ const setIcon = async (icon: string, table: TableType) => {
@click="openAirtableImportDialog(bases[0].id)"
>
<div class="color-transition nc-project-menu-item group">
<MdiTableLarge class="group-hover:text-accent" />
<component :is="iconMap.table" class="group-hover:text-accent" />
Airtable
</div>
</a-menu-item>
@ -501,7 +505,7 @@ const setIcon = async (icon: string, table: TableType) => {
@click="openQuickImportDialog('csv', bases[0].id)"
>
<div class="color-transition nc-project-menu-item group">
<MdiFileDocumentOutline class="group-hover:text-accent" />
<component :is="iconMap.csv" class="group-hover:text-accent" />
CSV file
</div>
</a-menu-item>
@ -512,7 +516,7 @@ const setIcon = async (icon: string, table: TableType) => {
@click="openQuickImportDialog('json', bases[0].id)"
>
<div class="color-transition nc-project-menu-item group">
<MdiCodeJson class="group-hover:text-accent" />
<component :is="iconMap.code" class="group-hover:text-accent" />
JSON file
</div>
</a-menu-item>
@ -523,7 +527,7 @@ const setIcon = async (icon: string, table: TableType) => {
@click="openQuickImportDialog('excel', bases[0].id)"
>
<div class="color-transition nc-project-menu-item group">
<MdiFileExcel class="group-hover:text-accent" />
<component :is="iconMap.excel" class="group-hover:text-accent" />
Microsoft Excel
</div>
</a-menu-item>
@ -658,7 +662,10 @@ const setIcon = async (icon: string, table: TableType) => {
:trigger="['click']"
@click.stop
>
<MdiDotsVertical class="transition-opacity opacity-0 group-hover:opacity-100 outline-0" />
<component
:is="iconMap['three-dot-vertical']"
class="transition-opacity opacity-0 group-hover:opacity-100 outline-0"
/>
<template #overlay>
<a-menu class="!py-0 rounded text-sm">
@ -724,8 +731,8 @@ const setIcon = async (icon: string, table: TableType) => {
v-if="index === '0' && isUIAllowed('table-create')"
class="group flex items-center gap-2 pl-8 pr-3 py-2 text-primary/70 hover:(text-primary/100) cursor-pointer select-none"
@click="openTableCreateDialog(bases[0].id)"
>
<component :is="iconMap['plus']" />
>
<component :is="iconMap.plus" />
<span class="text-gray-500 group-hover:(text-primary/100) flex-1 nc-add-new-table">{{
$t('tooltip.addTable')
@ -737,7 +744,10 @@ const setIcon = async (icon: string, table: TableType) => {
overlay-class-name="nc-dropdown-import-menu"
@click.stop
>
<MdiDotsVertical class="transition-opacity opacity-0 group-hover:opacity-100 nc-import-menu outline-0" />
<component
:is="iconMap['three-dot-vertical']"
class="transition-opacity opacity-0 group-hover:opacity-100 nc-import-menu outline-0"
/>
<template #overlay>
<a-menu class="!py-0 rounded text-sm">
@ -811,8 +821,7 @@ const setIcon = async (icon: string, table: TableType) => {
class="group flex items-center gap-2 pl-8 pr-3 py-2 text-primary/70 hover:(text-primary/100) cursor-pointer select-none"
@click="openTableCreateDialog(base.id)"
>
<component :is="
iconMap['plus']" />
<component :is="iconMap.plus" />
<span class="text-gray-500 group-hover:(text-primary/100) flex-1 nc-add-new-table">{{
$t('tooltip.addTable')
@ -824,7 +833,10 @@ iconMap['plus']" />
overlay-class-name="nc-dropdown-import-menu"
@click.stop
>
<MdiDotsVertical class="transition-opacity opacity-0 group-hover:opacity-100 nc-import-menu outline-0" />
<component
:is="iconMap['three-dot-vertical']"
class="transition-opacity opacity-0 group-hover:opacity-100 nc-import-menu outline-0"
/>
<template #overlay>
<a-menu class="!py-0 rounded text-sm">
@ -958,7 +970,10 @@ iconMap['plus']" />
:trigger="['click']"
@click.stop
>
<MdiDotsVertical class="transition-opacity opacity-0 group-hover:opacity-100 outline-0" />
<component
:is="iconMap['three-dot-vertical']"
class="transition-opacity opacity-0 group-hover:opacity-100 outline-0"
/>
<template #overlay>
<a-menu class="!py-0 rounded text-sm">
@ -1028,9 +1043,7 @@ iconMap['plus']" />
<a-divider class="!my-0" />
<div class="flex items-start flex-col justify-start px-2 py-3 gap-2">
<LazyGeneralAddBaseButton
class="color-transition py-1.5 px-2 cursor-pointer select-none hover:text-primary"
/>
<LazyGeneralAddBaseButton class="color-transition py-1.5 px-2 cursor-pointer select-none hover:text-primary" />
<LazyGeneralHelpAndSupport class="color-transition px-2 text-gray-500 cursor-pointer select-none hover:text-accent" />

4
packages/nc-gui/components/dashboard/settings/AppStore.vue

@ -1,5 +1,5 @@
<script setup lang="ts">
import { extractSdkResponseErrorMsg, message, onMounted, useI18n, useNuxtApp } from '#imports'
import { extractSdkResponseErrorMsg, iconMap, message, onMounted, useI18n, useNuxtApp } from '#imports'
const { t } = useI18n()
@ -132,7 +132,7 @@ onMounted(async () => {
<a-button v-else size="small" type="primary" @click="showInstallPluginModal(app)">
<div class="flex flex-row justify-center items-center caption capitalize nc-app-store-card-install">
<MdiPlus />
<component :is="iconMap.plus" />
Install
</div>
</a-button>

4
packages/nc-gui/components/dashboard/settings/DataSources.vue

@ -7,7 +7,7 @@ import Metadata from './Metadata.vue'
import UIAcl from './UIAcl.vue'
import Erd from './Erd.vue'
import { ClientType, DataSourcesSubTab } from '~/lib'
import { storeToRefs, useNuxtApp, useProject } from '#imports'
import { iconMap, storeToRefs, useNuxtApp, useProject } from '#imports'
interface Props {
state: string
@ -357,7 +357,7 @@ watch(
</a-button>
<a-button v-if="!base.is_meta" class="nc-action-btn cursor-pointer outline-0" @click="deleteBase(base)">
<div class="flex items-center gap-2 text-red-500 font-light">
<MdiDeleteOutline class="text-lg group-hover:text-accent" />
<component :is="iconMap.delete" class="text-lg group-hover:text-accent" />
Delete
</div>
</a-button>

13
packages/nc-gui/components/dashboard/settings/Modal.vue

@ -2,11 +2,8 @@
import type { FunctionalComponent, SVGAttributes } from 'vue'
import DataSources from './DataSources.vue'
import Misc from './Misc.vue'
import { iconMap } from '~/utils'
import { DataSourcesSubTab, useI18n, useNuxtApp, useUIPermission, useVModel, watch } from '#imports'
import TeamFillIcon from '~icons/ri/team-fill'
import MultipleTableIcon from '~icons/mdi/table-multiple'
import NotebookOutline from '~icons/mdi/notebook-outline'
import FolderCog from '~icons/mdi/folder-cog'
interface Props {
modelValue: boolean
@ -54,7 +51,7 @@ const dataSourcesAwakened = ref(false)
const tabsInfo: TabGroup = {
teamAndAuth: {
title: t('title.teamAndAuth'),
icon: TeamFillIcon,
icon: iconMap['users-icon'],
subTabs: {
...(isUIAllowed('userMgmtTab')
? {
@ -82,7 +79,7 @@ const tabsInfo: TabGroup = {
dataSources: {
// Data Sources
title: 'Data Sources',
icon: MultipleTableIcon,
icon: iconMap.datasource,
subTabs: {
dataSources: {
title: 'Data Sources',
@ -97,7 +94,7 @@ const tabsInfo: TabGroup = {
audit: {
// Audit
title: t('title.audit'),
icon: NotebookOutline,
icon: iconMap.book,
subTabs: {
audit: {
// Audit
@ -112,7 +109,7 @@ const tabsInfo: TabGroup = {
projectSettings: {
// Project Settings
title: 'Project Settings',
icon: FolderCog,
icon: iconMap.settings,
subTabs: {
misc: {
// Misc

10
packages/nc-gui/components/dashboard/settings/app-store/AppInstall.vue

@ -1,6 +1,6 @@
<script setup lang="ts">
import type { PluginTestReqType, PluginType } from 'nocodb-sdk'
import { extractSdkResponseErrorMsg, message, onMounted, ref, useI18n, useNuxtApp } from '#imports'
import { extractSdkResponseErrorMsg, iconMap, message, onMounted, ref, useI18n, useNuxtApp } from '#imports'
const { id } = defineProps<{
id: string
@ -209,7 +209,11 @@ onMounted(async () => {
v-if="itemIndex !== 0 && columnIndex === plugin.formDetails.items.length - 1"
class="absolute flex flex-col justify-start mt-2 -right-6 top-0"
>
<MdiDeleteOutline class="hover:text-red-400 cursor-pointer" @click="deleteFormRow(itemIndex)" />
<component
:is="iconMap.delete"
class="hover:text-red-400 cursor-pointer"
@click="deleteFormRow(itemIndex)"
/>
</div>
</a-form-item>
</td>
@ -220,7 +224,7 @@ onMounted(async () => {
<td :colspan="plugin.formDetails.items.length" class="text-center">
<a-button type="default" class="!bg-gray-100 rounded-md border-none mr-1" @click="addSetting">
<template #icon>
<MdiPlus class="flex mx-auto" />
<component :is="iconMap.plus" class="flex mx-auto" />
</template>
</a-button>
</td>

3
packages/nc-gui/components/dashboard/settings/data-sources/CreateBase.vue

@ -15,6 +15,7 @@ import {
generateUniqueName,
getDefaultConnectionConfig,
getTestDatabaseName,
iconMap,
nextTick,
onMounted,
projectTitleValidator,
@ -569,7 +570,7 @@ watch(
</div>
</div>
<a-button type="dashed" class="w-full caption mt-2" @click="addNewParam">
<div class="flex items-center justify-center"><MdiPlus /></div>
<div class="flex items-center justify-center"><component :is="iconMap.plus" /></div>
</a-button>
</a-card>
</a-form-item>

3
packages/nc-gui/components/dashboard/settings/data-sources/EditBase.vue

@ -15,6 +15,7 @@ import {
fieldRequiredValidator,
getDefaultConnectionConfig,
getTestDatabaseName,
iconMap,
onMounted,
projectTitleValidator,
readFile,
@ -541,7 +542,7 @@ onMounted(async () => {
</div>
</div>
<a-button type="dashed" class="w-full caption mt-2" @click="addNewParam">
<div class="flex items-center justify-center"><MdiPlus /></div>
<div class="flex items-center justify-center"><component :is="iconMap.plus" /></div>
</a-button>
</a-card>
</a-form-item>

4
packages/nc-gui/components/general/MiniSidebar.vue

@ -1,5 +1,5 @@
<script lang="ts" setup>
import { computed, navigateTo, storeToRefs, useGlobal, useProject, useRoute, useSidebar } from '#imports'
import { computed, iconMap, navigateTo, storeToRefs, useGlobal, useProject, useRoute, useSidebar } from '#imports'
const { signOut, signedIn, user, currentVersion } = useGlobal()
@ -84,7 +84,7 @@ const logout = async () => {
class="group flex items-center gap-2 py-2 hover:text-primary"
@click="navigateTo('/project/create')"
>
<MdiPlus class="text-lg group-hover:text-accent" />
<component :is="iconMap.plus" class="text-lg group-hover:text-accent" />
{{ $t('activity.createProject') }}
</div>
</a-menu-item>

3
packages/nc-gui/components/smartsheet/Form.vue

@ -10,6 +10,7 @@ import {
computed,
createEventHook,
extractSdkResponseErrorMsg,
iconMap,
inject,
message,
onClickOutside,
@ -490,7 +491,7 @@ watch(view, (nextView) => {
<a-dropdown v-model:visible="showColumnDropdown" :trigger="['click']" overlay-class-name="nc-dropdown-form-add-column">
<button type="button" class="group w-full mt-2" @click.stop="showColumnDropdown = true">
<span class="flex items-center flex-wrap justify-center gap-2 prose-sm text-gray-400">
<MdiPlus class="color-transition transform group-hover:(text-accent scale-125)" />
<component :is="iconMap.plus" class="color-transition transform group-hover:(text-accent scale-125)" />
<!-- Add new field to this table -->
<span class="color-transition group-hover:text-primary break-words">
{{ $t('activity.addField') }}

5
packages/nc-gui/components/smartsheet/Grid.vue

@ -23,6 +23,7 @@ import {
createEventHook,
enumColor,
extractPkFromRow,
iconMap,
inject,
isColumnRequiredAndNull,
isDrawerOrModalExist,
@ -762,7 +763,7 @@ const closeAddColumnDropdown = () => {
overlay-class-name="nc-dropdown-grid-add-column"
>
<div class="h-full w-[60px] flex items-center justify-center">
<MdiPlus class="text-sm nc-column-add" />
<component :is="iconMap.plus" class="text-sm nc-column-add" />
</div>
<template #overlay>
@ -900,7 +901,7 @@ const closeAddColumnDropdown = () => {
@click="addEmptyRow()"
>
<div class="px-2 w-full flex items-center text-gray-500">
<MdiPlus class="text-pint-500 text-xs ml-2 text-primary" />
<component :is="iconMap.plus" class="text-pint-500 text-xs ml-2 text-primary" />
<span class="ml-1">
{{ $t('activity.addRow') }}

8
packages/nc-gui/components/smartsheet/Kanban.vue

@ -12,6 +12,7 @@ import {
IsPublicInj,
MetaInj,
OpenNewRecordFormHookInj,
iconMap,
inject,
isImage,
isLTAR,
@ -382,7 +383,7 @@ watch(view, async (nextView) => {
"
>
<div class="py-2 flex gap-2 items-center">
<mdi-plus class="text-gray-500" />
<component :is="iconMap.plus" class="text-gray-500" />
{{ $t('activity.addNewRecord') }}
</div>
</a-menu-item>
@ -524,7 +525,8 @@ watch(view, async (nextView) => {
<a-layout-footer>
<div v-if="formattedData.get(stack.title) && countByStack.get(stack.title) >= 0" class="mt-5 text-center">
<!-- Stack Title -->
<mdi-plus
<component
:is="iconMap.plus"
v-if="!isPublic && !isLocked"
class="text-pint-500 text-lg text-primary cursor-pointer"
@click="
@ -594,7 +596,7 @@ watch(view, async (nextView) => {
<a-divider class="!m-0 !p-0" />
<a-menu-item v-if="contextMenuTarget" @click="deleteRow(contextMenuTarget)">
<div v-e="['a:kanban:delete-record']" class="nc-project-menu-item nc-kanban-context-menu-item">
<MdiDeleteOutline class="flex" />
<component :is="iconMap.delete" class="flex" />
<!-- Delete Record -->
{{ $t('activity.deleteRecord') }}
</div>

4
packages/nc-gui/components/smartsheet/column/SelectOptions.vue

@ -1,7 +1,7 @@
<script setup lang="ts">
import Draggable from 'vuedraggable'
import { UITypes } from 'nocodb-sdk'
import { IsKanbanInj, enumColor, onMounted, useColumnCreateStoreOrThrow, useVModel, watch } from '#imports'
import { IsKanbanInj, enumColor, iconMap, onMounted, useColumnCreateStoreOrThrow, useVModel, watch } from '#imports'
interface Option {
color: string
@ -231,7 +231,7 @@ watch(inputs, () => {
</div>
<a-button type="dashed" class="w-full caption mt-2" @click="addNewOption()">
<div class="flex items-center">
<MdiPlus />
<component :is="iconMap.plus" />
<span class="flex-auto">Add option</span>
</div>
</a-button>

13
packages/nc-gui/components/smartsheet/expanded-form/Header.vue

@ -3,6 +3,7 @@ import { message } from 'ant-design-vue'
import type { ViewType } from 'nocodb-sdk'
import {
ReloadRowDataHookInj,
iconMap,
isMac,
useExpandedFormStoreOrThrow,
useSmartsheetRowStoreOrThrow,
@ -156,7 +157,7 @@ const onConfirmDeleteRowClick = async () => {
</a-dropdown-button>
<a-dropdown>
<MdiDotsVertical class="nc-icon-transition" />
<component :is="iconMap['three-dot-vertical']" class="nc-icon-transition" />
<template #overlay>
<a-menu>
<a-menu-item v-if="!isNew" @click="loadRow">
@ -167,13 +168,19 @@ const onConfirmDeleteRowClick = async () => {
</a-menu-item>
<a-menu-item v-if="isUIAllowed('xcDatatableEditable') && !isNew" @click="!isNew && emit('duplicateRow')">
<div v-e="['c:row-expand:duplicate']" class="py-2 flex gap-2 a">
<MdiContentCopy class="nc-icon-transition cursor-pointer select-none nc-duplicate-row text-gray-500 mx-1 min-w-4" />
<component
:is="iconMap.copy"
class="nc-icon-transition cursor-pointer select-none nc-duplicate-row text-gray-500 mx-1 min-w-4"
/>
{{ $t('activity.duplicateRow') }}
</div>
</a-menu-item>
<a-menu-item v-if="isUIAllowed('xcDatatableEditable') && !isNew" @click="!isNew && onDeleteRowClick()">
<div v-e="['c:row-expand:delete']" class="py-2 flex gap-2 items-center">
<MdiDeleteOutline class="nc-icon-transition cursor-pointer select-none nc-delete-row text-gray-500 mx-1 min-w-4" />
<component
:is="iconMap.delete"
class="nc-icon-transition cursor-pointer select-none nc-delete-row text-gray-500 mx-1 min-w-4"
/>
{{ $t('activity.deleteRow') }}
</div>
</a-menu-item>

74
packages/nc-gui/components/smartsheet/header/CellIcon.ts

@ -34,79 +34,57 @@ import {
toRef,
useProject,
} from '#imports'
import FilePhoneIcon from '~icons/ph/text-align-left-thin'
import KeyIcon from '~icons/ph/text-align-left-thin'
import JSONIcon from '~icons/ph/text-align-left-thin'
import ClockIcon from '~icons/ph/alarm-thin'
import WebIcon from '~icons/ph/planet-thin'
import TextAreaIcon from '~icons/ph/text-align-left-thin'
import StringIcon from '~icons/ph/text-aa-thin'
import BooleanIcon from '~icons/ph/check-square-thin'
import CalendarIcon from '~icons/ph/calendar-blank-thin'
import SingleSelectIcon from '~icons/ph/caret-circle-down-thin'
import MultiSelectIcon from '~icons/ph/list-bullets-thin'
import DatetimeIcon from '~icons/ph/calendar-thin'
import GeoDataIcon from '~icons/ph/map-pin-thin'
import RatingIcon from '~icons/ph/star-thin'
import GenericIcon from '~icons/ph/square-thin'
import NumericIcon from '~icons/ph/number-square-one-thin'
import AttachmentIcon from '~icons/ph/image-thin'
import EmailIcon from '~icons/ph/envelope-thin'
import CurrencyIcon from '~icons/ph/currency-circle-dollar-thin'
import PercentIcon from '~icons/ph/percent-thin'
import DecimalIcon from '~icons/mdi/decimal'
import SpecificDBTypeIcon from '~icons/ph/database-thin'
import DurationIcon from '~icons/ph/clock-clockwise-thin'
import { iconMap } from '~/utils'
const renderIcon = (column: ColumnType, abstractType: any) => {
if (isPrimaryKey(column)) {
return KeyIcon
return iconMap.key
} else if (isSpecificDBType(column)) {
return SpecificDBTypeIcon
return iconMap['specific-db-type']
} else if (isJSON(column)) {
return JSONIcon
return iconMap.json
} else if (isDate(column, abstractType)) {
return CalendarIcon
return iconMap.calendar
} else if (isDateTime(column, abstractType)) {
return DatetimeIcon
return iconMap.datetime
} else if (isGeoData(column)) {
return GeoDataIcon
return iconMap['geo-data']
} else if (isSet(column)) {
return MultiSelectIcon
return iconMap['multi-select']
} else if (isSingleSelect(column)) {
return SingleSelectIcon
return iconMap['single-select']
} else if (isBoolean(column, abstractType)) {
return BooleanIcon
return iconMap.boolean
} else if (isTextArea(column)) {
return TextAreaIcon
return iconMap['long-text']
} else if (isEmail(column)) {
return EmailIcon
return iconMap.email
} else if (isYear(column, abstractType)) {
return CalendarIcon
return iconMap.calendar
} else if (isTime(column, abstractType)) {
return ClockIcon
return iconMap.calendar
} else if (isRating(column)) {
return RatingIcon
return iconMap.rating
} else if (isAttachment(column)) {
return AttachmentIcon
return iconMap.image
} else if (isDecimal(column)) {
return DecimalIcon
return iconMap.decimal
} else if (isPhoneNumber(column)) {
return FilePhoneIcon
return iconMap['file-phone']
} else if (isURL(column)) {
return WebIcon
return iconMap.web
} else if (isCurrency(column)) {
return CurrencyIcon
return iconMap.currency
} else if (isDuration(column)) {
return DurationIcon
return iconMap.duration
} else if (isPercent(column)) {
return PercentIcon
return iconMap.percent
} else if (isInt(column, abstractType) || isFloat(column, abstractType)) {
return NumericIcon
return iconMap.numeric
} else if (isString(column, abstractType)) {
return StringIcon
return iconMap.text
} else {
return GenericIcon
return iconMap.generic
}
}
@ -133,7 +111,7 @@ export default defineComponent({
return () => {
if (!column.value) return null
return h(renderIcon(column.value, abstractType.value), { class: 'text-black mx-1', style:{ fontSize: '16px'} })
return h(renderIcon(column.value, abstractType.value), { class: 'text-black mx-1', style: { fontSize: '16px' } })
}
},
})

10
packages/nc-gui/components/smartsheet/header/Menu.vue

@ -11,6 +11,7 @@ import {
SmartsheetStoreEvents,
extractSdkResponseErrorMsg,
getUniqueColumnName,
iconMap,
inject,
message,
useI18n,
@ -213,13 +214,16 @@ const hideField = async () => {
<template>
<a-dropdown v-if="!isLocked" placement="bottomRight" :trigger="['click']" overlay-class-name="nc-dropdown-column-operations">
<MdiMenuDown class="h-full text-grey nc-ui-dt-dropdown cursor-pointer outline-0" />
<component
:is="iconMap['arrow-down']"
class="text-grey !text-0.5rem h-full text-grey nc-ui-dt-dropdown cursor-pointer outline-0 mr-2"
/>
<template #overlay>
<a-menu class="shadow bg-white">
<a-menu-item @click="emit('edit')">
<div class="nc-column-edit nc-header-menu-item">
<MdiPencil class="text-primary" />
<component :is="iconMap.edit" class="text-primary" />
<!-- Edit -->
{{ $t('general.edit') }}
</div>
@ -290,7 +294,7 @@ const hideField = async () => {
<a-menu-item v-if="!column?.pv" @click="deleteColumn">
<div class="nc-column-delete nc-header-menu-item">
<MdiDeleteOutline class="text-error" />
<component :is="iconMap.delete" class="text-error" />
<!-- Delete -->
{{ $t('general.delete') }}
</div>

12
packages/nc-gui/components/smartsheet/sidebar/MenuBottom.vue

@ -1,6 +1,6 @@
<script lang="ts" setup>
import { ViewTypes } from 'nocodb-sdk'
import { useNuxtApp, useSmartsheetStoreOrThrow, viewIcons } from '#imports'
import { iconMap, useNuxtApp, useSmartsheetStoreOrThrow, viewIcons } from '#imports'
const emits = defineEmits<Emits>()
@ -43,7 +43,7 @@ function onOpenModal(type: ViewTypes, title = '') {
<div class="flex-1" />
<mdi-plus class="group-hover:text-primary" />
<component :is="iconMap.plus" class="group-hover:text-primary" />
</div>
</a-tooltip>
</a-menu-item>
@ -65,7 +65,7 @@ function onOpenModal(type: ViewTypes, title = '') {
<div class="flex-1" />
<mdi-plus class="group-hover:text-primary" />
<component :is="iconMap.plus" class="group-hover:text-primary" />
</div>
</a-tooltip>
</a-menu-item>
@ -88,7 +88,7 @@ function onOpenModal(type: ViewTypes, title = '') {
<div class="flex-1" />
<mdi-plus class="group-hover:text-primary" />
<component :is="iconMap.plus" class="group-hover:text-primary" />
</div>
</a-tooltip>
</a-menu-item>
@ -110,7 +110,7 @@ function onOpenModal(type: ViewTypes, title = '') {
<div class="flex-1" />
<mdi-plus class="group-hover:text-primary" />
<component :is="iconMap.plus" class="group-hover:text-primary" />
</div>
</a-tooltip>
</a-menu-item>
@ -132,7 +132,7 @@ function onOpenModal(type: ViewTypes, title = '') {
<div class="flex-1" />
<mdi-plus class="group-hover:text-primary" />
<component :is="iconMap.plus" class="group-hover:text-primary" />
</div>
</a-tooltip>
</a-menu-item>

18
packages/nc-gui/components/smartsheet/sidebar/RenameableMenuItem.vue

@ -3,7 +3,17 @@ import type { VNodeRef } from '@vue/runtime-core'
import type { KanbanType, ViewType, ViewTypes } from 'nocodb-sdk'
import type { WritableComputedRef } from '@vue/reactivity'
import { Tooltip } from 'ant-design-vue'
import { IsLockedInj, inject, message, onKeyStroke, useDebounceFn, useNuxtApp, useUIPermission, useVModel } from '#imports'
import {
IsLockedInj,
iconMap,
inject,
message,
onKeyStroke,
useDebounceFn,
useNuxtApp,
useUIPermission,
useVModel,
} from '#imports'
interface Props {
view: ViewType
@ -199,7 +209,11 @@ function onStopEdit() {
{{ $t('activity.copyView') }}
</template>
<MdiContentCopy class="!hidden !group-hover:block text-gray-500 nc-view-copy-icon" @click.stop="onDuplicate" />
<component
:is="iconMap.copy"
class="!hidden !group-hover:block text-gray-500 nc-view-copy-icon"
@click.stop="onDuplicate"
/>
</a-tooltip>
<template v-if="!vModel.is_default">

4
packages/nc-gui/components/smartsheet/sidebar/toolbar/DeleteTable.vue

@ -1,5 +1,5 @@
<script setup lang="ts">
import { MetaInj, inject, useSidebar, useTable } from '#imports'
import { MetaInj, iconMap, inject, useSidebar, useTable } from '#imports'
const meta = inject(MetaInj)!
@ -13,7 +13,7 @@ const { isOpen } = useSidebar('nc-right-sidebar')
<template #title> {{ $t('activity.deleteTable') }} </template>
<div class="nc-sidebar-right-item hover:after:bg-red-500 group">
<MdiDeleteOutline class="cursor-pointer" @click="deleteTable(meta)" />
<component :is="iconMap.delete" class="cursor-pointer" @click="deleteTable(meta)" />
</div>
</a-tooltip>
</template>

2
packages/nc-gui/components/smartsheet/toolbar/AddRow.vue

@ -13,7 +13,7 @@ const onClick = () => {
<template>
<a-tooltip placement="bottom">
<template #title> {{ $t('activity.addRow') }} </template>
<IonImageOutline/>
<IonImageOutline />
<div
v-e="['c:row:add:grid-top']"
:class="{ 'group': !isLocked, 'disabled-ring': isLocked }"

4
packages/nc-gui/components/smartsheet/toolbar/ColumnFilter.vue

@ -363,7 +363,7 @@ defineExpose({
<div class="flex gap-2 mb-2 mt-4">
<a-button class="elevation-0 text-capitalize" type="primary" ghost @click.stop="addFilter">
<div class="flex items-center gap-1">
<MdiPlus />
<component :is="iconMap.plus" />
<!-- Add Filter -->
{{ $t('activity.addFilter') }}
</div>
@ -372,7 +372,7 @@ defineExpose({
<a-button v-if="!webHook" class="text-capitalize !text-gray-500" @click.stop="addFilterGroup">
<div class="flex items-center gap-1">
<!-- Add Filter Group -->
<MdiPlus />
<component :is="iconMap.plus" />
{{ $t('activity.addFilterGroup') }}
</div>
</a-button>

5
packages/nc-gui/components/smartsheet/toolbar/ColumnFilterMenu.vue

@ -14,6 +14,7 @@ import {
useViewFilters,
watch,
} from '#imports'
import { iconMap } from '~/utils'
const isLocked = inject(IsLockedInj, ref(false))
@ -74,10 +75,10 @@ useMenuCloseOnEsc(open)
<div :class="{ 'nc-active-btn': filtersLength }">
<a-button v-e="['c:filter']" class="nc-filter-menu-btn nc-toolbar-btn txt-sm" :disabled="isLocked">
<div class="flex items-center gap-1">
<PhFunnelThin/>
<PhFunnelThin />
<!-- Filter -->
<span v-if="!isMobileMode" class="text-capitalize !text-xs font-weight-normal">{{ $t('activity.filter') }}</span>
<MdiMenuDown class="text-grey" />
<component :is="iconMap['arrow-down']" class="text-grey !text-0.5rem" />
<span v-if="filtersLength" class="nc-count-badge">{{ filtersLength }}</span>
</div>

8
packages/nc-gui/components/smartsheet/toolbar/ExportSubActions.vue

@ -16,7 +16,7 @@ import {
useProject,
useSmartsheetStoreOrThrow,
} from '#imports'
import { iconMap } from '~/utils';
import { iconMap } from '~/utils'
const { t } = useI18n()
@ -100,8 +100,7 @@ const exportFile = async (exportType: ExportTypes) => {
<template>
<a-menu-item>
<div v-e="['a:actions:download-csv']" class="nc-project-menu-item" @click="exportFile(ExportTypes.CSV)">
<component :is="
iconMap.download" class="text-gray-500" />
<component :is="iconMap.csv" class="text-gray-500" />
<!-- Download as CSV -->
{{ $t('activity.downloadCSV') }}
</div>
@ -109,8 +108,7 @@ iconMap.download" class="text-gray-500" />
<a-menu-item>
<div v-e="['a:actions:download-excel']" class="nc-project-menu-item" @click="exportFile(ExportTypes.EXCEL)">
<component :is="
iconMap.download" class="text-gray-500" />
<component :is="iconMap.excel" class="text-gray-500" />
<!-- Download as XLSX -->
{{ $t('activity.downloadExcel') }}
</div>

3
packages/nc-gui/components/smartsheet/toolbar/FieldsMenu.vue

@ -11,6 +11,7 @@ import {
MetaInj,
ReloadViewDataHookInj,
computed,
iconMap,
inject,
ref,
resolveComponent,
@ -161,7 +162,7 @@ useMenuCloseOnEsc(open)
<!-- Fields -->
<span v-if="!isMobileMode" class="text-capitalize !text-xs font-weight-normal">{{ $t('objects.fields') }}</span>
<MdiMenuDown class="text-grey" />
<component :is="iconMap['arrow-down']" class="text-grey !text-0.5rem" />
<span v-if="numberOfHiddenFields" class="nc-count-badge">{{ numberOfHiddenFields }}</span>
</div>

3
packages/nc-gui/components/smartsheet/toolbar/LockType.vue

@ -1,8 +1,5 @@
<script setup lang="ts">
import { iconMap } from '~/utils'
import MdiLockOutlineIcon from '~icons/mdi/lock-outline'
import MdiAccountIcon from '~icons/mdi/account'
import MdiAccountGroupIcon from '~icons/mdi/account-group'
import { LockType } from '~/lib'
import { ActiveViewInj, inject } from '#imports'

4
packages/nc-gui/components/smartsheet/toolbar/RowHeight.vue

@ -1,6 +1,6 @@
<script setup lang="ts">
import type { GridType } from 'nocodb-sdk'
import { ActiveViewInj, IsLockedInj, inject, ref, storeToRefs, useMenuCloseOnEsc } from '#imports'
import { ActiveViewInj, IsLockedInj, iconMap, inject, ref, storeToRefs, useMenuCloseOnEsc } from '#imports'
const { isSharedBase } = storeToRefs(useProject())
@ -45,7 +45,7 @@ useMenuCloseOnEsc(open)
<div class="flex items-center gap-1">
<PhSplitVerticalThin />
<!-- Row Height -->
<MdiMenuDown class="text-grey" />
<component :is="iconMap['arrow-down']" class="text-grey !text-0.5rem" />
</div>
</a-button>
</div>

7
packages/nc-gui/components/smartsheet/toolbar/SearchData.vue

@ -11,7 +11,7 @@ import {
useSmartsheetStoreOrThrow,
} from '#imports'
import { iconMap } from '~/utils';
import { iconMap } from '~/utils'
const reloadData = inject(ReloadViewDataHookInj)!
@ -57,10 +57,9 @@ function onPressEnter() {
:class="{ '!bg-gray-100 ': isDropdownOpen }"
@click="isDropdownOpen = !isDropdownOpen"
>
<component :is="
iconMap['search']" class="text-grey" />
<component :is="iconMap.search" class="text-grey" />
<MdiMenuDown class="text-grey" />
<component :is="iconMap['arrow-down']" class="text-grey !text-0.5rem" />
<a-select
v-model:value="search.field"

8
packages/nc-gui/components/smartsheet/toolbar/ShareView.vue

@ -5,6 +5,7 @@ import tinycolor from 'tinycolor2'
import {
computed,
extractSdkResponseErrorMsg,
iconMap,
isRtlLang,
message,
projectThemeColors,
@ -275,7 +276,12 @@ const copyIframeCode = async () => {
<MdiOpenInNew class="text-sm text-gray-500" />
</a>
<MdiContentCopy v-e="['c:view:share:copy-url']" class="text-gray-500 text-sm cursor-pointer" @click="copyLink" />
<component
:is="iconMap.copy"
v-e="['c:view:share:copy-url']"
class="text-gray-500 text-sm cursor-pointer"
@click="copyLink"
/>
</div>
<div

5
packages/nc-gui/components/smartsheet/toolbar/SharedViewList.vue

@ -3,6 +3,7 @@ import { ViewTypes } from 'nocodb-sdk'
import {
Empty,
extractSdkResponseErrorMsg,
iconMap,
message,
onMounted,
parseProp,
@ -162,8 +163,8 @@ const deleteLink = async (id: string) => {
<a-table-column key="id" :title="$t('labels.actions')" data-index="title">
<template #default="{ record }">
<div class="text-sm flex gap-2" :title="text">
<MdiContentCopy class="cursor-pointer" @click="copyLink(record)" />
<MdiDeleteOutline class="cursor-pointer" @click="deleteLink(record.id)" />
<component :is="iconMap.copy" class="cursor-pointer" @click="copyLink(record)" />
<component :is="iconMap.delete" class="cursor-pointer" @click="deleteLink(record.id)" />
</div>
</template>
</a-table-column>

7
packages/nc-gui/components/smartsheet/toolbar/SortListMenu.vue

@ -8,6 +8,7 @@ import {
ReloadViewDataHookInj,
computed,
getSortDirectionOptions,
iconMap,
inject,
ref,
useMenuCloseOnEsc,
@ -75,11 +76,11 @@ useMenuCloseOnEsc(open)
<div :class="{ 'nc-badge nc-active-btn': sorts?.length }">
<a-button v-e="['c:sort']" class="nc-sort-menu-btn nc-toolbar-btn" :disabled="isLocked">
<div class="flex items-center gap-1">
<PhSortAscendingThin/>
<PhSortAscendingThin />
<!-- Sort -->
<span v-if="!isMobileMode" class="text-capitalize !text-xs font-weight-normal">{{ $t('activity.sort') }}</span>
<MdiMenuDown class="text-grey" />
<component :is="iconMap['arrow-down']" class="text-grey !text-0.5rem" />
<span v-if="sorts?.length" class="nc-count-badge">{{ sorts.length }}</span>
</div>
@ -131,7 +132,7 @@ useMenuCloseOnEsc(open)
<a-button class="text-capitalize mb-1 mt-4" type="primary" ghost @click.stop="addSort">
<div class="flex gap-1 items-center">
<MdiPlus />
<component :is="iconMap.plus" />
<!-- Add Sort Option -->
{{ $t('activity.addSort') }}
</div>

4
packages/nc-gui/components/smartsheet/toolbar/ViewActions.vue

@ -118,7 +118,7 @@ useMenuCloseOnEsc(open)
<component :is="Icon" class="text-gray-500" :class="`nc-icon-${selectedView?.lock_type}`" />
<MdiMenuDown class="text-grey" />
<component :is="iconMap['arrow-down']" class="text-grey !text-0.5rem" />
</div>
</a-button>
@ -225,7 +225,7 @@ useMenuCloseOnEsc(open)
class="py-2 flex gap-2 items-center"
@click="showWebhookDrawer = true"
>
<component :is="iconMap['hook']" class="text-gray-500" />
<component :is="iconMap.hook" class="text-gray-500" />
{{ $t('objects.webhooks') }}
</div>
</a-menu-item>

18
packages/nc-gui/components/tabs/auth/ApiTokenManagement.vue

@ -1,6 +1,16 @@
<script setup lang="ts">
import type { ApiTokenType } from 'nocodb-sdk'
import { extractSdkResponseErrorMsg, message, onMounted, storeToRefs, useCopy, useI18n, useNuxtApp, useProject } from '#imports'
import {
extractSdkResponseErrorMsg,
iconMap,
message,
onMounted,
storeToRefs,
useCopy,
useI18n,
useNuxtApp,
useProject,
} from '#imports'
interface ApiToken extends ApiTokenType {
show?: boolean
@ -167,7 +177,7 @@ onMounted(() => {
<!-- Add New Token -->
<a-button size="middle" type="primary" ghost @click="openNewTokenModal">
<div class="flex flex-row justify-center items-center caption capitalize space-x-1">
<MdiPlus />
<component :is="iconMap.plus" />
<div>{{ $t('activity.newToken') }}</div>
</div>
</a-button>
@ -212,7 +222,7 @@ onMounted(() => {
<a-button type="text" class="!rounded-md" @click="copyToken(item.token)">
<template #icon>
<MdiContentCopy class="flex mx-auto h-[1rem]" />
<component :is="iconMap.copy" class="flex mx-auto h-[1rem]" />
</template>
</a-button>
</a-tooltip>
@ -235,7 +245,7 @@ onMounted(() => {
<a-menu>
<a-menu-item>
<div class="flex flex-row items-center py-3 h-[1rem]" @click="openDeleteModal(item)">
<MdiDeleteOutline class="flex" />
<component :is="iconMap.delete" class="flex" />
<div class="text-xs pl-2">{{ $t('general.remove') }}</div>
</div>
</a-menu-item>

7
packages/nc-gui/components/tabs/auth/UserManagement.vue

@ -3,6 +3,7 @@ import { OrgUserRoles } from 'nocodb-sdk'
import type { ProjectUserReqType, RequestParams } from 'nocodb-sdk'
import {
extractSdkResponseErrorMsg,
iconMap,
message,
onBeforeMount,
projectRoleTagColors,
@ -311,7 +312,7 @@ const isSuperAdmin = (user: { main_roles?: string }) => {
<a-button type="text" class="!rounded-md nc-user-invite" @click="inviteUser(user)">
<template #icon>
<MdiPlus class="flex mx-auto h-[1.1rem] text-gray-500" />
<component :is="iconMap.plus" class="flex mx-auto h-[1.1rem] text-gray-500" />
</template>
</a-button>
</a-tooltip>
@ -324,7 +325,7 @@ const isSuperAdmin = (user: { main_roles?: string }) => {
<a-button v-e="['c:user:delete']" type="text" class="!rounded-md nc-user-delete" @click="onDelete(user)">
<template #icon>
<MdiDeleteOutline class="flex mx-auto h-[1.1rem] text-gray-500" />
<component :is="iconMap.delete" class="flex mx-auto h-[1.1rem] text-gray-500" />
</template>
</a-button>
</a-tooltip>
@ -355,7 +356,7 @@ const isSuperAdmin = (user: { main_roles?: string }) => {
</a-menu-item>
<a-menu-item>
<div class="flex flex-row items-center py-3" @click="copyInviteUrl(user)">
<MdiContentCopy class="flex h-[1rem] text-gray-500" />
<component :is="iconMap.copy" class="flex h-[1rem] text-gray-500" />
<div class="text-xs pl-2">{{ $t('activity.copyInviteURL') }}</div>
</div>
</a-menu-item>

3
packages/nc-gui/components/tabs/auth/user-management/ShareBase.vue

@ -1,6 +1,7 @@
<script setup lang="ts">
import {
extractSdkResponseErrorMsg,
iconMap,
message,
onMounted,
storeToRefs,
@ -181,7 +182,7 @@ onMounted(() => {
<a-button type="text" class="!rounded-md mr-1 -mt-1.5 h-[1rem]" @click="copyUrl">
<template #icon>
<MdiContentCopy class="flex mx-auto text-gray-600" />
<component :is="iconMap.copy" class="flex mx-auto text-gray-600" />
</template>
</a-button>
</a-tooltip>

3
packages/nc-gui/components/tabs/auth/user-management/UsersModal.vue

@ -6,6 +6,7 @@ import {
computed,
emailValidator,
extractSdkResponseErrorMsg,
iconMap,
message,
onMounted,
projectRoleTagColors,
@ -204,7 +205,7 @@ watch(
<a-button type="text" class="!rounded-md -mt-0.5" @click="copyUrl">
<template #icon>
<MdiContentCopy class="flex mx-auto text-green-700 h-[1rem]" />
<component :is="iconMap.copy" class="flex mx-auto text-green-700 h-[1rem]" />
</template>
</a-button>
</div>

3
packages/nc-gui/components/template/Editor.vue

@ -17,6 +17,7 @@ import {
getDateFormat,
getDateTimeFormat,
getUIDTIcon,
iconMap,
inject,
message,
nextTick,
@ -888,7 +889,7 @@ function isSelectDisabled(uidt: string, disableSelect = false) {
<a-button class="group" @click="addNewColumnRow(tableIdx, 'SingleLineText')">
<div class="flex items-center gap-1">
<mdi-plus class="group-hover:!text-accent text-lg" />
<component :is="iconMap.plus" class="group-hover:!text-accent text-lg" />
</div>
</a-button>
</a-tooltip>

4
packages/nc-gui/components/virtual-cell/HasMany.vue

@ -10,6 +10,7 @@ import {
ReloadRowDataHookInj,
RowInj,
computed,
iconMap,
inject,
ref,
useProvideLTARStore,
@ -118,7 +119,8 @@ useSelectedCellKeyupListener(inject(ActiveCellInj, ref(false)), (e: KeyboardEven
@click.stop="childListDlg = true"
/>
<MdiPlus
<component
:is="iconMap.plus"
v-if="!readOnly && isUIAllowed('xcDatatableEditable')"
class="select-none text-sm nc-action-icon text-gray-500/50 hover:text-gray-500 nc-plus"
@click.stop="listItemsDlg = true"

4
packages/nc-gui/components/virtual-cell/ManyToMany.vue

@ -12,6 +12,7 @@ import {
RowInj,
computed,
createEventHook,
iconMap,
inject,
ref,
useProvideLTARStore,
@ -120,7 +121,8 @@ useSelectedCellKeyupListener(inject(ActiveCellInj, ref(false)), (e: KeyboardEven
@click.stop="childListDlg = true"
/>
<MdiPlus
<component
:is="iconMap.plus"
v-if="!readOnly && isUIAllowed('xcDatatableEditable')"
class="text-sm nc-action-icon text-gray-500/50 hover:text-gray-500 nc-plus"
@click.stop="listItemsDlg = true"

4
packages/nc-gui/components/virtual-cell/components/ListChildItems.vue

@ -10,6 +10,7 @@ import {
ReadonlyInj,
computed,
h,
iconMap,
inject,
ref,
useLTARStoreOrThrow,
@ -156,7 +157,8 @@ const onClick = (row: Row) => {
data-testid="nc-child-list-icon-unlink"
@click.stop="unlinkRow(row)"
/>
<MdiDeleteOutline
<component
:is="iconMap.delete"
v-if="!readonly && !isPublic"
class="text-xs text-grey hover:(!text-red-500) cursor-pointer"
data-testid="nc-child-list-icon-delete"

17
packages/nc-gui/components/webhook/List.vue

@ -1,6 +1,17 @@
<script setup lang="ts">
import type { FilterReqType, HookReqType, HookType } from 'nocodb-sdk'
import { MetaInj, extractSdkResponseErrorMsg, inject, message, onMounted, parseProp, ref, useI18n, useNuxtApp } from '#imports'
import {
MetaInj,
extractSdkResponseErrorMsg,
iconMap,
inject,
message,
onMounted,
parseProp,
ref,
useI18n,
useNuxtApp,
} from '#imports'
const emit = defineEmits(['edit', 'add'])
@ -143,14 +154,14 @@ onMounted(() => {
<template #title>
{{ $t('activity.copyWebhook') }}
</template>
<MdiContentCopy class="text-xl nc-hook-copy-icon" @click.stop="copyHook(item)" />
<component :is="iconMap.copy" class="text-xl nc-hook-copy-icon" @click.stop="copyHook(item)" />
</a-tooltip>
<a-tooltip placement="left">
<template #title>
{{ $t('activity.deleteWebhook') }}
</template>
<MdiDeleteOutline class="text-xl nc-hook-delete-icon" @click.stop="deleteHook(item, index)" />
<component :is="iconMap.delete" class="text-xl nc-hook-delete-icon" @click.stop="deleteHook(item, index)" />
</a-tooltip>
</div>
</div>

3
packages/nc-gui/layouts/base.vue

@ -78,7 +78,8 @@ hooks.hook('page:finish', () => {
<template v-if="signedIn">
<a-dropdown :trigger="['click']" overlay-class-name="nc-dropdown-user-accounts-menu">
<MdiDotsVertical
<component
:is="iconMap['three-dot-vertical']"
data-testid="nc-menu-accounts"
class="md:text-xl cursor-pointer hover:text-accent nc-menu-accounts"
@click.prevent

3
packages/nc-gui/pages/[projectType]/[projectId]/index.vue

@ -382,8 +382,7 @@ useEventListener(document, 'keydown', async (e: KeyboardEvent) => {
class="nc-project-menu-item group"
@click.stop="copyAuthToken"
>
<component :is="
iconMap['copy']" class="group-hover:text-accent" />
<component :is="iconMap.copy" class="group-hover:text-accent" />
{{ $t('activity.account.authToken') }}
</div>
</a-menu-item>

3
packages/nc-gui/pages/index/index/create-external.vue

@ -15,6 +15,7 @@ import {
generateUniqueName,
getDefaultConnectionConfig,
getTestDatabaseName,
iconMap,
message,
navigateTo,
nextTick,
@ -563,7 +564,7 @@ onMounted(async () => {
</div>
<a-button type="dashed" class="w-full caption mt-2" @click="addNewParam">
<div class="flex items-center justify-center">
<MdiPlus />
<component :is="iconMap.plus" />
</div>
</a-button>
</a-card>

4
packages/nc-gui/pages/index/index/index.vue

@ -8,6 +8,7 @@ import {
computed,
definePageMeta,
extractSdkResponseErrorMsg,
iconMap,
message,
navigateTo,
onBeforeMount,
@ -261,7 +262,8 @@ const copyProjectMeta = async () => {
<div class="flex items-center gap-2">
<MdiEditOutline v-e="['c:project:edit:rename']" class="nc-action-btn" @click.stop="navigateTo(`/${text}`)" />
<MdiDeleteOutline
<component
:is="iconMap.delete"
class="nc-action-btn"
:data-testid="`delete-project-${record.title}`"
@click.stop="deleteProject(record)"

7
packages/nc-gui/pages/projects/index.vue

@ -2,10 +2,9 @@
import { Modal, message } from 'ant-design-vue'
import type { ProjectType } from 'nocodb-sdk'
import { useI18n } from 'vue-i18n'
import { extractSdkResponseErrorMsg, navigateTo, useNuxtApp, useRoute } from '#imports'
import { extractSdkResponseErrorMsg, iconMap, navigateTo, useNuxtApp, useRoute } from '#imports'
import MaterialSymbolsFormatListBulletedRounded from '~icons/material-symbols/format-list-bulleted-rounded'
import MaterialSymbolsGridView from '~icons/material-symbols/grid-view'
import MdiPlus from '~icons/mdi/plus'
import MdiDatabaseOutline from '~icons/mdi/database-outline'
import MdiFolderOutline from '~icons/mdi/folder-outline'
@ -69,7 +68,7 @@ const deleteProject = (project: ProjectType) => {
class="color-transition hover:(bg-gray-100) mr-auto select-none flex items-center gap-2 leading-8 cursor-pointer rounded-full border-1 border-gray-300 px-5 py-2 shadow prose-lg font-semibold"
@click="props.onClick"
>
<MdiPlus class="text-primary text-2xl" />
<component :is="iconMap.plus" class="text-primary text-2xl" />
{{ $t('title.newProj') }}
</div>
</template>
@ -79,7 +78,7 @@ const deleteProject = (project: ProjectType) => {
class="grid grid-cols-12 cursor-pointer hover:bg-gray-200 flex items-center p-2"
@click="navigateTo('/project/create')"
>
<MdiPlus class="col-span-2 mr-1 mt-[1px] text-primary text-lg" />
<component :is="iconMap.plus" class="col-span-2 mr-1 mt-[1px] text-primary text-lg" />
<div class="col-span-10 text-sm xl:text-md">{{ $t('activity.createProject') }}</div>
</div>
<div

10
packages/nc-gui/pages/projects/index/index.vue

@ -1,9 +1,7 @@
<script lang="ts" setup>
import type { ProjectType } from 'nocodb-sdk'
import { navigateTo, useColors, useNuxtApp } from '#imports'
import { iconMap, navigateTo, useColors, useNuxtApp } from '#imports'
import MdiMenuDown from '~icons/mdi/menu-down'
import MdiDeleteOutline from '~icons/mdi/delete-outline'
import MdiPlus from '~icons/mdi/plus'
import MdiDatabaseOutline from '~icons/mdi/database-outline'
import MdiEditOutline from '~icons/mdi/edit-outline'
@ -42,7 +40,7 @@ const formatTitle = (title?: string) =>
:style="{ '--thumbnail-color': '#1348ba' }"
@click="props.onClick"
>
<MdiPlus />
<component :is="iconMap.plus" />
</div>
<div class="prose-lg font-semibold">
{{ $t('title.newProj') }}
@ -53,7 +51,7 @@ const formatTitle = (title?: string) =>
class="grid grid-cols-12 cursor-pointer hover:bg-gray-200 flex items-center p-2"
@click="navigateTo('/project/create')"
>
<MdiPlus class="col-span-2 mr-1 mt-[1px] text-primary text-lg" />
<component :is="iconMap.plus" class="col-span-2 mr-1 mt-[1px] text-primary text-lg" />
<div class="col-span-10 text-sm xl:text-md">{{ $t('activity.createProject') }}</div>
</div>
<div
@ -76,7 +74,7 @@ const formatTitle = (title?: string) =>
<a-menu>
<a-menu-item @click.stop="emit('delete-project', project)">
<div class="grid grid-cols-6 cursor-pointer flex items-center p-2">
<MdiDeleteOutline class="col-span-2 mr-1 mt-[1px] text-red text-lg" />
<component :is="iconMap.delete" class="col-span-2 mr-1 mt-[1px] text-red text-lg" />
<div class="col-span-4 text-sm xl:text-md">{{ $t('general.delete') }}</div>
</div>
</a-menu-item>

9
packages/nc-gui/pages/projects/index/list.vue

@ -1,7 +1,6 @@
<script lang="ts" setup>
import type { ProjectType } from 'nocodb-sdk'
import { navigateTo } from '#app'
import MdiDeleteOutline from '~icons/mdi/delete-outline'
import { iconMap, navigateTo } from '#imports'
import MdiEditOutline from '~icons/mdi/edit-outline'
interface Props {
@ -38,7 +37,11 @@ const openProject = async (project: ProjectType) => {
<div class="font-semibold capitalize">{{ project.title || 'Untitled' }}</div>
<div>{{ project.updated_at }}</div>
<div class="flex justify-center">
<MdiDeleteOutline class="text-gray-500 hover:text-red-500 mr-2" @click.stop="emit('delete-project', project)" />
<component
:is="iconMap.delete"
class="text-gray-500 hover:text-red-500 mr-2"
@click.stop="emit('delete-project', project)"
/>
<MdiEditOutline class="text-gray-500 hover:text-primary mr-2" @click.stop="navigateTo(`/project/${project.id}`)" />
</div>
</div>

86
packages/nc-gui/utils/columnUtils.ts

@ -1,122 +1,96 @@
import type { ColumnType, LinkToAnotherRecordType } from 'nocodb-sdk'
import { RelationTypes, UITypes } from 'nocodb-sdk'
import { iconMap } from '~/utils/iconUtils'
import LinkVariant from '~icons/mdi/link-variant'
import QrCodeScan from '~icons/mdi/qrcode-scan'
import BarcodeScan from '~icons/mdi/barcode-scan'
import FormatColorText from '~icons/mdi/format-color-text'
import TextSubject from '~icons/mdi/text-subject'
import JSONIcon from '~icons/mdi/code-json'
import SpecificDBTypeIcon from '~icons/mdi/database-settings'
import Attachment from '~icons/mdi/attachment'
import Marker from '~icons/mdi/map-marker'
import CheckboxMarkedOutline from '~icons/mdi/checkbox-marked-outline'
import FormatListBulletedSquare from '~icons/mdi/format-list-bulleted-square'
import ArrowDownDropCircle from '~icons/mdi/arrow-down-drop-circle'
import CalendarMonth from '~icons/mdi/calendar-month'
import Calendar from '~icons/mdi/calendar'
import Clock from '~icons/mdi/clock'
import FilePhone from '~icons/mdi/file-phone'
import Email from '~icons/mdi/email'
import Web from '~icons/mdi/web'
import Numeric from '~icons/mdi/numeric'
import Decimal from '~icons/mdi/decimal'
import CurrencyUsdCircleOutline from '~icons/mdi/currency-usd-circle-outline'
import PercentOutline from '~icons/mdi/percent-outline'
import TimerOutline from '~icons/mdi/timer-outline'
import Star from '~icons/mdi/star'
import MathIntegral from '~icons/mdi/math-integral'
import MovieRoll from '~icons/mdi/movie-roll'
import CalendarClock from '~icons/mdi/calendar-clock'
import ID from '~icons/mdi/identifier'
import RulerSquareCompass from '~icons/mdi/ruler-square-compass'
import MdiTextSearchVariant from '~icons/mdi/text-search-variant'
const uiTypes = [
{
name: UITypes.LinkToAnotherRecord,
icon: LinkVariant,
icon: iconMap.link,
virtual: 1,
},
{
name: UITypes.Lookup,
icon: MdiTextSearchVariant,
icon: iconMap.lookup,
virtual: 1,
},
{
name: UITypes.SingleLineText,
icon: FormatColorText,
icon: iconMap.text,
},
{
name: UITypes.LongText,
icon: TextSubject,
icon: iconMap['long-text'],
},
{
name: UITypes.Attachment,
icon: Attachment,
icon: iconMap.image,
},
{
name: UITypes.Checkbox,
icon: CheckboxMarkedOutline,
icon: iconMap.boolean,
},
{
name: UITypes.MultiSelect,
icon: FormatListBulletedSquare,
icon: iconMap['multi-select'],
},
{
name: UITypes.SingleSelect,
icon: ArrowDownDropCircle,
icon: iconMap['single-select'],
},
{
name: UITypes.Date,
icon: CalendarMonth,
icon: iconMap.calendar,
},
{
name: UITypes.Year,
icon: Calendar,
icon: iconMap.calendar,
},
{
name: UITypes.Time,
icon: Clock,
icon: iconMap.clock,
},
{
name: UITypes.PhoneNumber,
icon: FilePhone,
icon: iconMap['file-phone'],
},
{
name: UITypes.Email,
icon: Email,
icon: iconMap.email,
},
{
name: UITypes.URL,
icon: Web,
icon: iconMap.web,
},
{
name: UITypes.Number,
icon: Numeric,
icon: iconMap.numeric,
},
{
name: UITypes.Decimal,
icon: Decimal,
icon: iconMap.decimal,
},
{
name: UITypes.Currency,
icon: CurrencyUsdCircleOutline,
icon: iconMap.currency,
},
{
name: UITypes.Percent,
icon: PercentOutline,
icon: iconMap.percent,
},
{
name: UITypes.Duration,
icon: TimerOutline,
icon: iconMap.duration,
},
{
name: UITypes.Rating,
icon: Star,
icon: iconMap.rating,
},
{
name: UITypes.Formula,
icon: MathIntegral,
icon: iconMap.formula,
virtual: 1,
},
{
@ -126,34 +100,34 @@ const uiTypes = [
},
{
name: UITypes.DateTime,
icon: CalendarClock,
icon: iconMap.datetime,
},
{
name: UITypes.QrCode,
icon: QrCodeScan,
icon: iconMap['qr-code'],
virtual: 1,
},
{
name: UITypes.Barcode,
icon: BarcodeScan,
icon: iconMap['bar-code'],
virtual: 1,
},
{
name: UITypes.Geometry,
icon: RulerSquareCompass,
icon: iconMap.calculator,
},
{
name: UITypes.GeoData,
icon: Marker,
icon: iconMap['geo-data'],
},
{
name: UITypes.JSON,
icon: JSONIcon,
icon: iconMap.json,
},
{
name: UITypes.SpecificDBType,
icon: SpecificDBTypeIcon,
icon: iconMap['specific-db-type'],
},
]
@ -163,7 +137,7 @@ const getUIDTIcon = (uidt: UITypes | string) => {
...uiTypes,
{
name: UITypes.CreateTime,
icon: CalendarClock,
icon: iconMap.calendar,
},
{
name: UITypes.ID,

75
packages/nc-gui/utils/iconUtils.ts

@ -31,7 +31,42 @@ import PhCopySimpleThin from '~icons/ph/copy-simple-thin'
import PhClipboardThin from '~icons/ph/clipboard-text-thin'
import PhGearThin from '~icons/ph/gear-thin'
import PhImageThin from '~icons/ph/image-thin'
import PhHardDriveThin from '~icons/ph/hard-drives-thin'
import PhBookThin from '~icons/ph/book-bookmark-thin'
import PhCaretDownLight from '~icons/ph/caret-down-light'
import PhDotsThreeOutlineVerticalThin from '~icons/ph/dots-three-outline-vertical-thin'
import PhExcelThin from '~icons/ph/microsoft-excel-logo-thin'
import PhCsvThin from '~icons/ph/file-csv-thin'
import PhBracketsCurlyThin from '~icons/ph/brackets-curly-thin'
import PhTrashThin from '~icons/ph/trash-thin'
import PhPencilSimpleThin from '~icons/ph/pencil-simple-thin'
import PhLinkSimpleThin from '~icons/ph/link-simple-thin'
import PhListMagnifyingGlassThin from '~icons/ph/list-magnifying-glass-thin'
import PhStringIcon from '~icons/ph/text-aa-thin'
import PhTextAreaIcon from '~icons/ph/text-align-left-thin'
import FilePhoneIcon from '~icons/ph/phone-call-thin'
import KeyIcon from '~icons/ph/key-thin'
import ClockIcon from '~icons/ph/alarm-thin'
import WebIcon from '~icons/ph/planet-thin'
import BooleanIcon from '~icons/ph/check-square-thin'
import CalendarIcon from '~icons/ph/calendar-blank-thin'
import SingleSelectIcon from '~icons/ph/caret-circle-down-thin'
import MultiSelectIcon from '~icons/ph/list-bullets-thin'
import DatetimeIcon from '~icons/ph/calendar-thin'
import GeoDataIcon from '~icons/ph/map-pin-thin'
import RatingIcon from '~icons/ph/star-thin'
import GenericIcon from '~icons/ph/square-thin'
import NumericIcon from '~icons/ph/number-square-one-thin'
import EmailIcon from '~icons/ph/envelope-thin'
import CurrencyIcon from '~icons/ph/currency-circle-dollar-thin'
import PercentIcon from '~icons/ph/percent-thin'
import DecimalIcon from '~icons/mdi/decimal'
import SpecificDBTypeIcon from '~icons/ph/database-thin'
import DurationIcon from '~icons/ph/clock-clockwise-thin'
import PhFunctionDuotone from '~icons/ph/function-duotone'
import PhQrCodeThin from '~icons/ph/qr-code-thin'
import PhBarcodeThin from '~icons/ph/barcode-thin'
import PhCalculatorThin from '~icons/ph/calculator-thin'
export const iconMap = {
'mdi-check-bold': MdiCheckBold,
@ -65,6 +100,44 @@ export const iconMap = {
'clipboard': PhClipboardThin,
'settings': PhGearThin,
'image': PhImageThin,
'datasource': PhHardDriveThin,
'book': PhBookThin,
'arrow-down': PhCaretDownLight,
'three-dot-vertical': PhDotsThreeOutlineVerticalThin,
'table': PhTableThin,
'excel': PhExcelThin,
'csv': PhCsvThin,
'code': PhBracketsCurlyThin,
'delete': PhTrashThin,
'edit': PhPencilSimpleThin,
'link': PhLinkSimpleThin,
'lookup': PhListMagnifyingGlassThin,
'text': PhStringIcon,
'long-text': PhTextAreaIcon,
'clock': ClockIcon,
'web': WebIcon,
'boolean': BooleanIcon,
'calendar': CalendarIcon,
'single-select': SingleSelectIcon,
'multi-select': MultiSelectIcon,
'datetime': DatetimeIcon,
'geo-data': GeoDataIcon,
'rating': RatingIcon,
'generic': GenericIcon,
'numeric': NumericIcon,
'email': EmailIcon,
'currency': CurrencyIcon,
'percent': PercentIcon,
'decimal': DecimalIcon,
'specific-db-type': SpecificDBTypeIcon,
'duration': DurationIcon,
'file-phone': FilePhoneIcon,
'formula': PhFunctionDuotone,
'key': KeyIcon,
'json': PhBracketsCurlyThin,
'qr-code': PhQrCodeThin,
'bar-code': PhBarcodeThin,
'calculator': PhCalculatorThin,
} as const
export const getMdiIcon = (type: string): any => {

5
packages/nc-gui/utils/viewUtils.ts

@ -1,13 +1,8 @@
import { ViewTypes } from 'nocodb-sdk'
import { themeV2Colors } from '#imports'
import MdiGridIcon from '~icons/mdi/grid-large'
import MdiFormIcon from '~icons/mdi/form-select'
import MdiCalendarIcon from '~icons/mdi/calendar'
import MdiGalleryIcon from '~icons/mdi/camera-image'
import MdiKanbanIcon from '~icons/mdi/tablet-dashboard'
import MdiMapIcon from '~icons/mdi/map-outline'
import MdiEyeIcon from '~icons/mdi/eye-circle-outline'
import type { Language } from '~/lib'
import PhTableThin from '~icons/ph/TableThin'
import PhImageThin from '~icons/ph/ImageThin'

Loading…
Cancel
Save