Browse Source

feat(gui-v2): lookup cell

Signed-off-by: Pranav C <pranavxc@gmail.com>
pull/3003/head
Pranav C 2 years ago
parent
commit
4a099b65ba
  1. 5
      packages/nc-gui-v2/components/smartsheet/VirtualCell.vue
  2. 4
      packages/nc-gui-v2/components/virtual-cell/BelongsTo.vue
  3. 4
      packages/nc-gui-v2/components/virtual-cell/Formula.vue
  4. 4
      packages/nc-gui-v2/components/virtual-cell/HasMany.vue
  5. 71
      packages/nc-gui-v2/components/virtual-cell/Lookup.vue
  6. 4
      packages/nc-gui-v2/components/virtual-cell/ManyToMany.vue
  7. 4
      packages/nc-gui-v2/components/virtual-cell/Rollup.vue

5
packages/nc-gui-v2/components/smartsheet/VirtualCell.vue

@ -1,7 +1,7 @@
<script setup lang="ts"> <script setup lang="ts">
import type { ColumnType } from 'nocodb-sdk' import type { ColumnType } from 'nocodb-sdk'
import { provide, useVirtualCell } from '#imports' import { provide, useVirtualCell } from '#imports'
import { ColumnInj } from '~/context' import { ColumnInj, ValueInj } from '~/context'
import { NavigateDir } from '~/lib' import { NavigateDir } from '~/lib'
interface Props { interface Props {
@ -14,7 +14,7 @@ const { column, modelValue: value } = defineProps<Props>()
const emit = defineEmits(['update:modelValue', 'navigate']) const emit = defineEmits(['update:modelValue', 'navigate'])
provide(ColumnInj, column) provide(ColumnInj, column)
provide('value', value) provide(ValueInj, value)
const { isLookup, isBt, isRollup, isMm, isHm, isFormula, isCount } = useVirtualCell(column) const { isLookup, isBt, isRollup, isMm, isHm, isFormula, isCount } = useVirtualCell(column)
</script> </script>
@ -31,6 +31,7 @@ const { isLookup, isBt, isRollup, isMm, isHm, isFormula, isCount } = useVirtualC
<VirtualCellRollup v-else-if="isRollup" /> <VirtualCellRollup v-else-if="isRollup" />
<VirtualCellFormula v-else-if="isFormula" /> <VirtualCellFormula v-else-if="isFormula" />
<VirtualCellCount v-else-if="isCount" /> <VirtualCellCount v-else-if="isCount" />
<VirtualCellLookup v-else-if="isLookup" />
</div> </div>
</template> </template>

4
packages/nc-gui-v2/components/virtual-cell/BelongsTo.vue

@ -1,11 +1,11 @@
<script setup lang="ts"> <script setup lang="ts">
import type { ColumnType } from 'nocodb-sdk' import type { ColumnType } from 'nocodb-sdk'
import ItemChip from './components/ItemChip.vue' import ItemChip from './components/ItemChip.vue'
import { ColumnInj } from '~/context' import { ColumnInj, ValueInj } from '~/context'
import { useBelongsTo } from '#imports' import { useBelongsTo } from '#imports'
const column = inject(ColumnInj) const column = inject(ColumnInj)
const value = inject('value') const value = inject(ValueInj)
const active = false const active = false
const localState = null const localState = null

4
packages/nc-gui-v2/components/virtual-cell/Formula.vue

@ -1,12 +1,12 @@
<script lang="ts" setup> <script lang="ts" setup>
import { computed, useProject } from '#imports' import { computed, useProject } from '#imports'
import { ColumnInj } from '~/context' import { ColumnInj, ValueInj } from '~/context'
import { handleTZ } from '~/utils/dateTimeUtils' import { handleTZ } from '~/utils/dateTimeUtils'
import { replaceUrlsWithLink } from '~/utils/urlUtils' import { replaceUrlsWithLink } from '~/utils/urlUtils'
const column = inject(ColumnInj) const column = inject(ColumnInj)
const value = inject('value') const value = inject(ValueInj)
const { isPg } = useProject() const { isPg } = useProject()

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

@ -1,11 +1,11 @@
<script setup lang="ts"> <script setup lang="ts">
import type { ColumnType } from 'nocodb-sdk' import type { ColumnType } from 'nocodb-sdk'
import ItemChip from './components/ItemChip.vue' import ItemChip from './components/ItemChip.vue'
import { ColumnInj } from '~/context' import { ColumnInj, ValueInj } from '~/context'
import { useHasMany } from '#imports' import { useHasMany } from '#imports'
const column = inject(ColumnInj) const column = inject(ColumnInj)
const value = inject('value') const value = inject(ValueInj)
const active = false const active = false
const { childMeta, loadChildMeta, primaryValueProp } = useHasMany(column as ColumnType) const { childMeta, loadChildMeta, primaryValueProp } = useHasMany(column as ColumnType)

71
packages/nc-gui-v2/components/virtual-cell/Lookup.vue

@ -1,40 +1,59 @@
<script lang="ts" setup> <script lang="ts" setup>
import { ColumnType, LinkToAnotherRecordType, LookupType, isVirtualCol } from 'nocodb-sdk' import type { ColumnType, LinkToAnotherRecordType, LookupType } from 'nocodb-sdk'
import { RelationTypes, isVirtualCol, UITypes } from 'nocodb-sdk'
import { useColumn } from '~/composables' import { useColumn } from '~/composables'
import { ColumnInj, EditModeInj, MetaInj, ReadonlyInj, ValueInj } from '~/context' import { ColumnInj, MetaInj, ReadonlyInj, ValueInj } from '~/context'
const { metas, getMeta } = useMetas()
const {metas, getMeta} = useMetas(); provide(ReadonlyInj, true)
provide(ReadonlyInj, true); const column = inject(ColumnInj) as ColumnType & { colOptions: LookupType }
const meta = inject(MetaInj)
const value = inject(ValueInj)
const arrValue = Array.isArray(value) ? value : [value]
const column = inject(ColumnInj) as ColumnType & { colOptions: LookupType }; const relationColumn = meta?.value.columns?.find((c) => c.id === column.colOptions.fk_relation_column_id) as ColumnType & {
const meta = inject(MetaInj); colOptions: LinkToAnotherRecordType
const value = inject(ValueInj); }
await getMeta(relationColumn.colOptions.fk_related_model_id as string)
const lookupTableMeta = metas?.value[relationColumn.colOptions.fk_related_model_id as string]
const lookupColumn = lookupTableMeta?.columns?.find((c) => c.id === column.colOptions.fk_lookup_column_id) as ColumnType
const relationColumn = meta?.value.columns?.find(c => c.id === column.colOptions.fk_relation_column_id) as ColumnType & { colOptions: LinkToAnotherRecordType }; provide(MetaInj, ref(lookupTableMeta))
await getMeta(relationColumn.colOptions.fk_related_model_id as string);
const lookupTableMeta = metas?.value[relationColumn.colOptions.fk_related_model_id as string];
const lookupColumn = lookupTableMeta?.columns?.find(c => c.id === column.colOptions.fk_lookup_column_id) as ColumnType;
provide(MetaInj, ref(lookupTableMeta));
const lookupColumnMetaProps = useColumn(lookupColumn) const lookupColumnMetaProps = useColumn(lookupColumn)
</script> </script>
<template> <template>
<div class="w-full h-full"> <div class="w-full h-full flex gap-1">
{{lookupColumnMetaProps}} <template v-if="lookupColumn">
<SmartsheetVirtualCell <!-- Render virtual cell -->
:edit-enabled="false" v-if="isVirtualCol(lookupColumn)" v-model="value" :column="lookupColumn" <div v-if="isVirtualCol(lookupColumn)">
/> <template
v-if="lookupColumn.uidt === UITypes.LinkToAnotherRecord && lookupColumn.colOptions.type === RelationTypes.BELONGS_TO"
<SmartsheetCell >
v-else <SmartsheetVirtualCell
v-model="value" v-for="(v, i) of arrValue"
:column="lookupColumn" :key="i"
:edit-enabled="false" :edit-enabled="false"
/> :model-value="v"
:column="lookupColumn"
/>
</template>
<SmartsheetVirtualCell v-else :edit-enabled="false" :model-value="arrValue" :column="lookupColumn" />
</div>
<!-- Render normal cell -->
<template v-else>
<!-- For attachment cell avoid adding chip style -->
<div v-for="(v, i) in arrValue" :key="i"
:class="{'bg-gray-100 px-2 rounded-full':!lookupColumnMetaProps.isAttachment}">
<SmartsheetCell :model-value="v" :column="lookupColumn" :edit-enabled="false" />
</div>
</template>
</template>
</div> </div>
</template> </template>

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

@ -1,11 +1,11 @@
<script setup lang="ts"> <script setup lang="ts">
import type { ColumnType } from 'nocodb-sdk' import type { ColumnType } from 'nocodb-sdk'
import ItemChip from './components/ItemChip.vue' import ItemChip from './components/ItemChip.vue'
import { ColumnInj } from '~/context' import { ColumnInj, ValueInj } from '~/context'
import { useManyToMany } from '#imports' import { useManyToMany } from '#imports'
const column = inject(ColumnInj) const column = inject(ColumnInj)
const value = inject('value') const value = inject(ValueInj)
const active = false const active = false
const isLocked = false const isLocked = false

4
packages/nc-gui-v2/components/virtual-cell/Rollup.vue

@ -1,5 +1,7 @@
<script setup lang="ts"> <script setup lang="ts">
const value = inject('value') import { ValueInj } from '~/context'
const value = inject(ValueInj)
</script> </script>
<template> <template>

Loading…
Cancel
Save