mirror of https://github.com/nocodb/nocodb
Daniel Spaude
2 years ago
62 changed files with 1636 additions and 904 deletions
@ -0,0 +1,25 @@
|
||||
<script setup lang="ts"> |
||||
interface Props { |
||||
srcs: string[] |
||||
alt?: string |
||||
} |
||||
|
||||
const props = defineProps<Props>() |
||||
|
||||
const index = ref(0) |
||||
|
||||
const onError = () => index.value++ |
||||
</script> |
||||
|
||||
<template> |
||||
<LazyNuxtImg |
||||
v-if="index < props.srcs.length" |
||||
class="m-auto" |
||||
:src="props.srcs[index]" |
||||
:alt="props?.alt || ''" |
||||
placeholder |
||||
quality="75" |
||||
@error="onError" |
||||
/> |
||||
<MdiFileImageBox v-else /> |
||||
</template> |
@ -0,0 +1,40 @@
|
||||
import { mimeTypes, openLink, useGlobal } from '#imports' |
||||
|
||||
const useAttachment = () => { |
||||
const { appInfo } = useGlobal() |
||||
|
||||
const getPossibleAttachmentSrc = (item: Record<string, any>) => { |
||||
const res: string[] = [] |
||||
if (item?.path) res.push(`${appInfo.value.ncSiteUrl}/${item.path}`) |
||||
if (item?.url) res.push(item.url) |
||||
return res |
||||
} |
||||
|
||||
const getAttachmentSrc = async (item: Record<string, any>) => { |
||||
if (item?.data) { |
||||
return item.data |
||||
} |
||||
const sources = getPossibleAttachmentSrc(item) |
||||
const mimeType = mimeTypes[item?.mimetype?.split('/')?.pop() || 'txt'] |
||||
for (const source of sources) { |
||||
// test if the source is accessible or not
|
||||
const res = await fetch(source) |
||||
if (res.ok && res.headers.get('Content-Type') === mimeType) { |
||||
return source |
||||
} |
||||
} |
||||
return null |
||||
} |
||||
|
||||
const openAttachment = async (item: Record<string, any>) => { |
||||
openLink(await getAttachmentSrc(item)) |
||||
} |
||||
|
||||
return { |
||||
getAttachmentSrc, |
||||
getPossibleAttachmentSrc, |
||||
openAttachment, |
||||
} |
||||
} |
||||
|
||||
export default useAttachment |
@ -0,0 +1,714 @@
|
||||
const mimeTypes: Record<string, string> = { |
||||
'123': 'application/vnd.lotus-1-2-3', |
||||
'x3d': 'application/vnd.hzn-3d-crossword', |
||||
'3gp': 'video/3gpp', |
||||
'3g2': 'video/3gpp2', |
||||
'mseq': 'application/vnd.mseq', |
||||
'pwn': 'application/vnd.3m.post-it-notes', |
||||
'plb': 'application/vnd.3gpp.pic-bw-large', |
||||
'psb': 'application/vnd.3gpp.pic-bw-small', |
||||
'pvb': 'application/vnd.3gpp.pic-bw-var', |
||||
'tcap': 'application/vnd.3gpp2.tcap', |
||||
'7z': 'application/x-7z-compressed', |
||||
'abw': 'application/x-abiword', |
||||
'ace': 'application/x-ace-compressed', |
||||
'acc': 'application/vnd.americandynamics.acc', |
||||
'acu': 'application/vnd.acucobol', |
||||
'atc': 'application/vnd.acucorp', |
||||
'adp': 'audio/adpcm', |
||||
'aab': 'application/x-authorware-bin', |
||||
'aam': 'application/x-authorware-map', |
||||
'aas': 'application/x-authorware-seg', |
||||
'air': 'application/vnd.adobe.air-application-installer-package+zip', |
||||
'swf': 'application/x-shockwave-flash', |
||||
'fxp': 'application/vnd.adobe.fxp', |
||||
'pdf': 'application/pdf', |
||||
'ppd': 'application/vnd.cups-ppd', |
||||
'dir': 'application/x-director', |
||||
'xdp': 'application/vnd.adobe.xdp+xml', |
||||
'xfdf': 'application/vnd.adobe.xfdf', |
||||
'aac': 'audio/x-aac', |
||||
'ahead': 'application/vnd.ahead.space', |
||||
'azf': 'application/vnd.airzip.filesecure.azf', |
||||
'azs': 'application/vnd.airzip.filesecure.azs', |
||||
'azw': 'application/vnd.amazon.ebook', |
||||
'ami': 'application/vnd.amiga.ami', |
||||
'/A': 'application/andrew-inset', |
||||
'apk': 'application/vnd.android.package-archive', |
||||
'cii': 'application/vnd.anser-web-certificate-issue-initiation', |
||||
'fti': 'application/vnd.anser-web-funds-transfer-initiation', |
||||
'atx': 'application/vnd.antix.game-component', |
||||
'dmg': 'application/x-apple-diskimage', |
||||
'mpkg': 'application/vnd.apple.installer+xml', |
||||
'aw': 'application/applixware', |
||||
'les': 'application/vnd.hhe.lesson-player', |
||||
'swi': 'application/vnd.aristanetworks.swi', |
||||
's': 'text/x-asm', |
||||
'atomcat': 'application/atomcat+xml', |
||||
'atomsvc': 'application/atomsvc+xml', |
||||
'atom, .xml': 'application/atom+xml', |
||||
'ac': 'application/pkix-attr-cert', |
||||
'aif': 'audio/x-aiff', |
||||
'avi': 'video/x-msvideo', |
||||
'aep': 'application/vnd.audiograph', |
||||
'dxf': 'image/vnd.dxf', |
||||
'dwf': 'model/vnd.dwf', |
||||
'par': 'text/plain-bas', |
||||
'bcpio': 'application/x-bcpio', |
||||
'bin': 'application/octet-stream', |
||||
'bmp': 'image/bmp', |
||||
'torrent': 'application/x-bittorrent', |
||||
'cod': 'application/vnd.rim.cod', |
||||
'mpm': 'application/vnd.blueice.multipass', |
||||
'bmi': 'application/vnd.bmi', |
||||
'sh': 'application/x-sh', |
||||
'btif': 'image/prs.btif', |
||||
'rep': 'application/vnd.businessobjects', |
||||
'bz': 'application/x-bzip', |
||||
'bz2': 'application/x-bzip2', |
||||
'csh': 'application/x-csh', |
||||
'c': 'text/x-c', |
||||
'cdxml': 'application/vnd.chemdraw+xml', |
||||
'css': 'text/css', |
||||
'cdx': 'chemical/x-cdx', |
||||
'cml': 'chemical/x-cml', |
||||
'csml': 'chemical/x-csml', |
||||
'cdbcmsg': 'application/vnd.contact.cmsg', |
||||
'cla': 'application/vnd.claymore', |
||||
'c4g': 'application/vnd.clonk.c4group', |
||||
'sub': 'image/vnd.dvb.subtitle', |
||||
'cdmia': 'application/cdmi-capability', |
||||
'cdmic': 'application/cdmi-container', |
||||
'cdmid': 'application/cdmi-domain', |
||||
'cdmio': 'application/cdmi-object', |
||||
'cdmiq': 'application/cdmi-queue', |
||||
'c11amc': 'application/vnd.cluetrust.cartomobile-config', |
||||
'c11amz': 'application/vnd.cluetrust.cartomobile-config-pkg', |
||||
'ras': 'image/x-cmu-raster', |
||||
'dae': 'model/vnd.collada+xml', |
||||
'csv': 'text/csv', |
||||
'cpt': 'application/mac-compactpro', |
||||
'wmlc': 'application/vnd.wap.wmlc', |
||||
'cgm': 'image/cgm', |
||||
'ice': 'x-conference/x-cooltalk', |
||||
'cmx': 'image/x-cmx', |
||||
'xar': 'application/vnd.xara', |
||||
'cmc': 'application/vnd.cosmocaller', |
||||
'cpio': 'application/x-cpio', |
||||
'clkx': 'application/vnd.crick.clicker', |
||||
'clkk': 'application/vnd.crick.clicker.keyboard', |
||||
'clkp': 'application/vnd.crick.clicker.palette', |
||||
'clkt': 'application/vnd.crick.clicker.template', |
||||
'clkw': 'application/vnd.crick.clicker.wordbank', |
||||
'wbs': 'application/vnd.criticaltools.wbs+xml', |
||||
'cryptonote': 'application/vnd.rig.cryptonote', |
||||
'cif': 'chemical/x-cif', |
||||
'cmdf': 'chemical/x-cmdf', |
||||
'cu': 'application/cu-seeme', |
||||
'cww': 'application/prs.cww', |
||||
'curl': 'text/vnd.curl', |
||||
'dcurl': 'text/vnd.curl.dcurl', |
||||
'mcurl': 'text/vnd.curl.mcurl', |
||||
'scurl': 'text/vnd.curl.scurl', |
||||
'car': 'application/vnd.curl.car', |
||||
'pcurl': 'application/vnd.curl.pcurl', |
||||
'cmp': 'application/vnd.yellowriver-custom-menu', |
||||
'dssc': 'application/dssc+der', |
||||
'xdssc': 'application/dssc+xml', |
||||
'deb': 'application/x-debian-package', |
||||
'uva': 'audio/vnd.dece.audio', |
||||
'uvi': 'image/vnd.dece.graphic', |
||||
'uvh': 'video/vnd.dece.hd', |
||||
'uvm': 'video/vnd.dece.mobile', |
||||
'uvu': 'video/vnd.uvvu.mp4', |
||||
'uvp': 'video/vnd.dece.pd', |
||||
'uvs': 'video/vnd.dece.sd', |
||||
'uvv': 'video/vnd.dece.video', |
||||
'dvi': 'application/x-dvi', |
||||
'seed': 'application/vnd.fdsn.seed', |
||||
'dtb': 'application/x-dtbook+xml', |
||||
'res': 'application/x-dtbresource+xml', |
||||
'ait': 'application/vnd.dvb.ait', |
||||
'svc': 'application/vnd.dvb.service', |
||||
'eol': 'audio/vnd.digital-winds', |
||||
'djvu': 'image/vnd.djvu', |
||||
'dtd': 'application/xml-dtd', |
||||
'mlp': 'application/vnd.dolby.mlp', |
||||
'wad': 'application/x-doom', |
||||
'dpg': 'application/vnd.dpgraph', |
||||
'dra': 'audio/vnd.dra', |
||||
'dfac': 'application/vnd.dreamfactory', |
||||
'dts': 'audio/vnd.dts', |
||||
'dtshd': 'audio/vnd.dts.hd', |
||||
'dwg': 'image/vnd.dwg', |
||||
'geo': 'application/vnd.dynageo', |
||||
'es': 'application/ecmascript', |
||||
'mag': 'application/vnd.ecowin.chart', |
||||
'mmr': 'image/vnd.fujixerox.edmics-mmr', |
||||
'rlc': 'image/vnd.fujixerox.edmics-rlc', |
||||
'exi': 'application/exi', |
||||
'mgz': 'application/vnd.proteus.magazine', |
||||
'epub': 'application/epub+zip', |
||||
'eml': 'message/rfc822', |
||||
'nml': 'application/vnd.enliven', |
||||
'xpr': 'application/vnd.is-xpr', |
||||
'xif': 'image/vnd.xiff', |
||||
'xfdl': 'application/vnd.xfdl', |
||||
'emma': 'application/emma+xml', |
||||
'ez2': 'application/vnd.ezpix-album', |
||||
'ez3': 'application/vnd.ezpix-package', |
||||
'fst': 'image/vnd.fst', |
||||
'fvt': 'video/vnd.fvt', |
||||
'fbs': 'image/vnd.fastbidsheet', |
||||
'fe_launch': 'application/vnd.denovo.fcselayout-link', |
||||
'f4v': 'video/x-f4v', |
||||
'flv': 'video/x-flv', |
||||
'fpx': 'image/vnd.fpx', |
||||
'npx': 'image/vnd.net-fpx', |
||||
'flx': 'text/vnd.fmi.flexstor', |
||||
'fli': 'video/x-fli', |
||||
'ftc': 'application/vnd.fluxtime.clip', |
||||
'fdf': 'application/vnd.fdf', |
||||
'f': 'text/x-fortran', |
||||
'mif': 'application/vnd.mif', |
||||
'fm': 'application/vnd.framemaker', |
||||
'fh': 'image/x-freehand', |
||||
'fsc': 'application/vnd.fsc.weblaunch', |
||||
'fnc': 'application/vnd.frogans.fnc', |
||||
'ltf': 'application/vnd.frogans.ltf', |
||||
'ddd': 'application/vnd.fujixerox.ddd', |
||||
'xdw': 'application/vnd.fujixerox.docuworks', |
||||
'xbd': 'application/vnd.fujixerox.docuworks.binder', |
||||
'oas': 'application/vnd.fujitsu.oasys', |
||||
'oa2': 'application/vnd.fujitsu.oasys2', |
||||
'oa3': 'application/vnd.fujitsu.oasys3', |
||||
'fg5': 'application/vnd.fujitsu.oasysgp', |
||||
'bh2': 'application/vnd.fujitsu.oasysprs', |
||||
'spl': 'application/x-futuresplash', |
||||
'fzs': 'application/vnd.fuzzysheet', |
||||
'g3': 'image/g3fax', |
||||
'gmx': 'application/vnd.gmx', |
||||
'gtw': 'model/vnd.gtw', |
||||
'txd': 'application/vnd.genomatix.tuxedo', |
||||
'ggb': 'application/vnd.geogebra.file', |
||||
'ggt': 'application/vnd.geogebra.tool', |
||||
'gdl': 'model/vnd.gdl', |
||||
'gex': 'application/vnd.geometry-explorer', |
||||
'gxt': 'application/vnd.geonext', |
||||
'g2w': 'application/vnd.geoplan', |
||||
'g3w': 'application/vnd.geospace', |
||||
'gsf': 'application/x-font-ghostscript', |
||||
'bdf': 'application/x-font-bdf', |
||||
'gtar': 'application/x-gtar', |
||||
'texinfo': 'application/x-texinfo', |
||||
'gnumeric': 'application/x-gnumeric', |
||||
'kml': 'application/vnd.google-earth.kml+xml', |
||||
'kmz': 'application/vnd.google-earth.kmz', |
||||
'gpx': 'application/gpx+xml', |
||||
'gqf': 'application/vnd.grafeq', |
||||
'gif': 'image/gif', |
||||
'gv': 'text/vnd.graphviz', |
||||
'gac': 'application/vnd.groove-account', |
||||
'ghf': 'application/vnd.groove-help', |
||||
'gim': 'application/vnd.groove-identity-message', |
||||
'grv': 'application/vnd.groove-injector', |
||||
'gtm': 'application/vnd.groove-tool-message', |
||||
'tpl': 'application/vnd.groove-tool-template', |
||||
'vcg': 'application/vnd.groove-vcard', |
||||
'h261': 'video/h261', |
||||
'h263': 'video/h263', |
||||
'h264': 'video/h264', |
||||
'hpid': 'application/vnd.hp-hpid', |
||||
'hps': 'application/vnd.hp-hps', |
||||
'hdf': 'application/x-hdf', |
||||
'rip': 'audio/vnd.rip', |
||||
'hbci': 'application/vnd.hbci', |
||||
'jlt': 'application/vnd.hp-jlyt', |
||||
'pcl': 'application/vnd.hp-pcl', |
||||
'hpgl': 'application/vnd.hp-hpgl', |
||||
'hvs': 'application/vnd.yamaha.hv-script', |
||||
'hvd': 'application/vnd.yamaha.hv-dic', |
||||
'hvp': 'application/vnd.yamaha.hv-voice', |
||||
'sfd-hdstx': 'application/vnd.hydrostatix.sof-data', |
||||
'stk': 'application/hyperstudio', |
||||
'hal': 'application/vnd.hal+xml', |
||||
'html': 'text/html', |
||||
'irm': 'application/vnd.ibm.rights-management', |
||||
'sc': 'application/vnd.ibm.secure-container', |
||||
'ics': 'text/calendar', |
||||
'icc': 'application/vnd.iccprofile', |
||||
'ico': 'image/x-icon', |
||||
'igl': 'application/vnd.igloader', |
||||
'ief': 'image/ief', |
||||
'ivp': 'application/vnd.immervision-ivp', |
||||
'ivu': 'application/vnd.immervision-ivu', |
||||
'rif': 'application/reginfo+xml', |
||||
'3dml': 'text/vnd.in3d.3dml', |
||||
'spot': 'text/vnd.in3d.spot', |
||||
'igs': 'model/iges', |
||||
'i2g': 'application/vnd.intergeo', |
||||
'cdy': 'application/vnd.cinderella', |
||||
'xpw': 'application/vnd.intercon.formnet', |
||||
'fcs': 'application/vnd.isac.fcs', |
||||
'ipfix': 'application/ipfix', |
||||
'cer': 'application/pkix-cert', |
||||
'pki': 'application/pkixcmp', |
||||
'crl': 'application/pkix-crl', |
||||
'pkipath': 'application/pkix-pkipath', |
||||
'igm': 'application/vnd.insors.igm', |
||||
'rcprofile': 'application/vnd.ipunplugged.rcprofile', |
||||
'irp': 'application/vnd.irepository.package+xml', |
||||
'jad': 'text/vnd.sun.j2me.app-descriptor', |
||||
'jar': 'application/java-archive', |
||||
'class': 'application/java-vm', |
||||
'jnlp': 'application/x-java-jnlp-file', |
||||
'ser': 'application/java-serialized-object', |
||||
'java': 'text/x-java-source,java', |
||||
'js': 'application/javascript', |
||||
'json': 'application/json', |
||||
'joda': 'application/vnd.joost.joda-archive', |
||||
'jpm': 'video/jpm', |
||||
'jpeg': 'image/x-citrix-jpeg', |
||||
'jpg': 'image/x-citrix-jpeg', |
||||
'pjpeg': 'image/pjpeg', |
||||
'jpgv': 'video/jpeg', |
||||
'ktz': 'application/vnd.kahootz', |
||||
'mmd': 'application/vnd.chipnuts.karaoke-mmd', |
||||
'karbon': 'application/vnd.kde.karbon', |
||||
'chrt': 'application/vnd.kde.kchart', |
||||
'kfo': 'application/vnd.kde.kformula', |
||||
'flw': 'application/vnd.kde.kivio', |
||||
'kon': 'application/vnd.kde.kontour', |
||||
'kpr': 'application/vnd.kde.kpresenter', |
||||
'ksp': 'application/vnd.kde.kspread', |
||||
'kwd': 'application/vnd.kde.kword', |
||||
'htke': 'application/vnd.kenameaapp', |
||||
'kia': 'application/vnd.kidspiration', |
||||
'kne': 'application/vnd.kinar', |
||||
'sse': 'application/vnd.kodak-descriptor', |
||||
'lasxml': 'application/vnd.las.las+xml', |
||||
'latex': 'application/x-latex', |
||||
'lbd': 'application/vnd.llamagraphics.life-balance.desktop', |
||||
'lbe': 'application/vnd.llamagraphics.life-balance.exchange+xml', |
||||
'jam': 'application/vnd.jam', |
||||
'apr': 'application/vnd.lotus-approach', |
||||
'pre': 'application/vnd.lotus-freelance', |
||||
'nsf': 'application/vnd.lotus-notes', |
||||
'org': 'application/vnd.lotus-organizer', |
||||
'scm': 'application/vnd.lotus-screencam', |
||||
'lwp': 'application/vnd.lotus-wordpro', |
||||
'lvp': 'audio/vnd.lucent.voice', |
||||
'm3u': 'audio/x-mpegurl', |
||||
'm4v': 'video/x-m4v', |
||||
'hqx': 'application/mac-binhex40', |
||||
'portpkg': 'application/vnd.macports.portpkg', |
||||
'mgp': 'application/vnd.osgeo.mapguide.package', |
||||
'mrc': 'application/marc', |
||||
'mrcx': 'application/marcxml+xml', |
||||
'mxf': 'application/mxf', |
||||
'nbp': 'application/vnd.wolfram.player', |
||||
'ma': 'application/mathematica', |
||||
'mathml': 'application/mathml+xml', |
||||
'mbox': 'application/mbox', |
||||
'mc1': 'application/vnd.medcalcdata', |
||||
'mscml': 'application/mediaservercontrol+xml', |
||||
'cdkey': 'application/vnd.mediastation.cdkey', |
||||
'mwf': 'application/vnd.mfer', |
||||
'mfm': 'application/vnd.mfmp', |
||||
'msh': 'model/mesh', |
||||
'mads': 'application/mads+xml', |
||||
'mets': 'application/mets+xml', |
||||
'mods': 'application/mods+xml', |
||||
'meta4': 'application/metalink4+xml', |
||||
'mcd': 'application/vnd.mcd', |
||||
'flo': 'application/vnd.micrografx.flo', |
||||
'igx': 'application/vnd.micrografx.igx', |
||||
'es3': 'application/vnd.eszigno3+xml', |
||||
'mdb': 'application/x-msaccess', |
||||
'asf': 'video/x-ms-asf', |
||||
'exe': 'application/x-msdownload', |
||||
'cil': 'application/vnd.ms-artgalry', |
||||
'cab': 'application/vnd.ms-cab-compressed', |
||||
'ims': 'application/vnd.ms-ims', |
||||
'application': 'application/x-ms-application', |
||||
'clp': 'application/x-msclip', |
||||
'mdi': 'image/vnd.ms-modi', |
||||
'eot': 'application/vnd.ms-fontobject', |
||||
'xls': 'application/vnd.ms-excel', |
||||
'xlam': 'application/vnd.ms-excel.addin.macroenabled.12', |
||||
'xlsb': 'application/vnd.ms-excel.sheet.binary.macroenabled.12', |
||||
'xltm': 'application/vnd.ms-excel.template.macroenabled.12', |
||||
'xlsm': 'application/vnd.ms-excel.sheet.macroenabled.12', |
||||
'chm': 'application/vnd.ms-htmlhelp', |
||||
'crd': 'application/x-mscardfile', |
||||
'lrm': 'application/vnd.ms-lrm', |
||||
'mvb': 'application/x-msmediaview', |
||||
'mny': 'application/x-msmoney', |
||||
'pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation', |
||||
'sldx': 'application/vnd.openxmlformats-officedocument.presentationml.slide', |
||||
'ppsx': 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', |
||||
'potx': 'application/vnd.openxmlformats-officedocument.presentationml.template', |
||||
'xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', |
||||
'xltx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', |
||||
'docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', |
||||
'dotx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', |
||||
'obd': 'application/x-msbinder', |
||||
'thmx': 'application/vnd.ms-officetheme', |
||||
'onetoc': 'application/onenote', |
||||
'pya': 'audio/vnd.ms-playready.media.pya', |
||||
'pyv': 'video/vnd.ms-playready.media.pyv', |
||||
'ppt': 'application/vnd.ms-powerpoint', |
||||
'ppam': 'application/vnd.ms-powerpoint.addin.macroenabled.12', |
||||
'sldm': 'application/vnd.ms-powerpoint.slide.macroenabled.12', |
||||
'pptm': 'application/vnd.ms-powerpoint.presentation.macroenabled.12', |
||||
'ppsm': 'application/vnd.ms-powerpoint.slideshow.macroenabled.12', |
||||
'potm': 'application/vnd.ms-powerpoint.template.macroenabled.12', |
||||
'mpp': 'application/vnd.ms-project', |
||||
'pub': 'application/x-mspublisher', |
||||
'scd': 'application/x-msschedule', |
||||
'xap': 'application/x-silverlight-app', |
||||
'stl': 'application/vnd.ms-pki.stl', |
||||
'cat': 'application/vnd.ms-pki.seccat', |
||||
'vsd': 'application/vnd.visio', |
||||
'vsdx': 'application/vnd.visio2013', |
||||
'wm': 'video/x-ms-wm', |
||||
'wma': 'audio/x-ms-wma', |
||||
'wax': 'audio/x-ms-wax', |
||||
'wmx': 'video/x-ms-wmx', |
||||
'wmd': 'application/x-ms-wmd', |
||||
'wpl': 'application/vnd.ms-wpl', |
||||
'wmz': 'application/x-ms-wmz', |
||||
'wmv': 'video/x-ms-wmv', |
||||
'wvx': 'video/x-ms-wvx', |
||||
'wmf': 'application/x-msmetafile', |
||||
'trm': 'application/x-msterminal', |
||||
'doc': 'application/msword', |
||||
'docm': 'application/vnd.ms-word.document.macroenabled.12', |
||||
'dotm': 'application/vnd.ms-word.template.macroenabled.12', |
||||
'wri': 'application/x-mswrite', |
||||
'wps': 'application/vnd.ms-works', |
||||
'xbap': 'application/x-ms-xbap', |
||||
'xps': 'application/vnd.ms-xpsdocument', |
||||
'mid': 'audio/midi', |
||||
'mpy': 'application/vnd.ibm.minipay', |
||||
'afp': 'application/vnd.ibm.modcap', |
||||
'rms': 'application/vnd.jcp.javame.midlet-rms', |
||||
'tmo': 'application/vnd.tmobile-livetv', |
||||
'prc': 'application/x-mobipocket-ebook', |
||||
'mbk': 'application/vnd.mobius.mbk', |
||||
'dis': 'application/vnd.mobius.dis', |
||||
'plc': 'application/vnd.mobius.plc', |
||||
'mqy': 'application/vnd.mobius.mqy', |
||||
'msl': 'application/vnd.mobius.msl', |
||||
'txf': 'application/vnd.mobius.txf', |
||||
'daf': 'application/vnd.mobius.daf', |
||||
'fly': 'text/vnd.fly', |
||||
'mpc': 'application/vnd.mophun.certificate', |
||||
'mpn': 'application/vnd.mophun.application', |
||||
'mj2': 'video/mj2', |
||||
'mpga': 'audio/mpeg', |
||||
'mxu': 'video/vnd.mpegurl', |
||||
'mpeg': 'video/mpeg', |
||||
'm21': 'application/mp21', |
||||
'mp4a': 'audio/mp4', |
||||
'mp4': 'application/mp4', |
||||
'm3u8': 'application/vnd.apple.mpegurl', |
||||
'mus': 'application/vnd.musician', |
||||
'msty': 'application/vnd.muvee.style', |
||||
'mxml': 'application/xv+xml', |
||||
'ngdat': 'application/vnd.nokia.n-gage.data', |
||||
'n-gage': 'application/vnd.nokia.n-gage.symbian.install', |
||||
'ncx': 'application/x-dtbncx+xml', |
||||
'nc': 'application/x-netcdf', |
||||
'nlu': 'application/vnd.neurolanguage.nlu', |
||||
'dna': 'application/vnd.dna', |
||||
'nnd': 'application/vnd.noblenet-directory', |
||||
'nns': 'application/vnd.noblenet-sealer', |
||||
'nnw': 'application/vnd.noblenet-web', |
||||
'rpst': 'application/vnd.nokia.radio-preset', |
||||
'rpss': 'application/vnd.nokia.radio-presets', |
||||
'n3': 'text/n3', |
||||
'edm': 'application/vnd.novadigm.edm', |
||||
'edx': 'application/vnd.novadigm.edx', |
||||
'ext': 'application/vnd.novadigm.ext', |
||||
'gph': 'application/vnd.flographit', |
||||
'ecelp4800': 'audio/vnd.nuera.ecelp4800', |
||||
'ecelp7470': 'audio/vnd.nuera.ecelp7470', |
||||
'ecelp9600': 'audio/vnd.nuera.ecelp9600', |
||||
'oda': 'application/oda', |
||||
'ogx': 'application/ogg', |
||||
'oga': 'audio/ogg', |
||||
'ogv': 'video/ogg', |
||||
'dd2': 'application/vnd.oma.dd2+xml', |
||||
'oth': 'application/vnd.oasis.opendocument.text-web', |
||||
'opf': 'application/oebps-package+xml', |
||||
'qbo': 'application/vnd.intu.qbo', |
||||
'oxt': 'application/vnd.openofficeorg.extension', |
||||
'osf': 'application/vnd.yamaha.openscoreformat', |
||||
'weba': 'audio/webm', |
||||
'webm': 'video/webm', |
||||
'odc': 'application/vnd.oasis.opendocument.chart', |
||||
'otc': 'application/vnd.oasis.opendocument.chart-template', |
||||
'odb': 'application/vnd.oasis.opendocument.database', |
||||
'odf': 'application/vnd.oasis.opendocument.formula', |
||||
'odft': 'application/vnd.oasis.opendocument.formula-template', |
||||
'odg': 'application/vnd.oasis.opendocument.graphics', |
||||
'otg': 'application/vnd.oasis.opendocument.graphics-template', |
||||
'odi': 'application/vnd.oasis.opendocument.image', |
||||
'oti': 'application/vnd.oasis.opendocument.image-template', |
||||
'odp': 'application/vnd.oasis.opendocument.presentation', |
||||
'otp': 'application/vnd.oasis.opendocument.presentation-template', |
||||
'ods': 'application/vnd.oasis.opendocument.spreadsheet', |
||||
'ots': 'application/vnd.oasis.opendocument.spreadsheet-template', |
||||
'odt': 'application/vnd.oasis.opendocument.text', |
||||
'odm': 'application/vnd.oasis.opendocument.text-master', |
||||
'ott': 'application/vnd.oasis.opendocument.text-template', |
||||
'ktx': 'image/ktx', |
||||
'sxc': 'application/vnd.sun.xml.calc', |
||||
'stc': 'application/vnd.sun.xml.calc.template', |
||||
'sxd': 'application/vnd.sun.xml.draw', |
||||
'std': 'application/vnd.sun.xml.draw.template', |
||||
'sxi': 'application/vnd.sun.xml.impress', |
||||
'sti': 'application/vnd.sun.xml.impress.template', |
||||
'sxm': 'application/vnd.sun.xml.math', |
||||
'sxw': 'application/vnd.sun.xml.writer', |
||||
'sxg': 'application/vnd.sun.xml.writer.global', |
||||
'stw': 'application/vnd.sun.xml.writer.template', |
||||
'otf': 'application/x-font-otf', |
||||
'osfpvg': 'application/vnd.yamaha.openscoreformat.osfpvg+xml', |
||||
'dp': 'application/vnd.osgi.dp', |
||||
'pdb': 'application/vnd.palm', |
||||
'p': 'text/x-pascal', |
||||
'paw': 'application/vnd.pawaafile', |
||||
'pclxl': 'application/vnd.hp-pclxl', |
||||
'efif': 'application/vnd.picsel', |
||||
'pcx': 'image/x-pcx', |
||||
'psd': 'image/vnd.adobe.photoshop', |
||||
'prf': 'application/pics-rules', |
||||
'pic': 'image/x-pict', |
||||
'chat': 'application/x-chat', |
||||
'p10': 'application/pkcs10', |
||||
'p12': 'application/x-pkcs12', |
||||
'p7m': 'application/pkcs7-mime', |
||||
'p7s': 'application/pkcs7-signature', |
||||
'p7r': 'application/x-pkcs7-certreqresp', |
||||
'p7b': 'application/x-pkcs7-certificates', |
||||
'p8': 'application/pkcs8', |
||||
'plf': 'application/vnd.pocketlearn', |
||||
'pnm': 'image/x-portable-anymap', |
||||
'pbm': 'image/x-portable-bitmap', |
||||
'pcf': 'application/x-font-pcf', |
||||
'pfr': 'application/font-tdpfr', |
||||
'pgn': 'application/x-chess-pgn', |
||||
'pgm': 'image/x-portable-graymap', |
||||
'png': 'image/x-png', |
||||
'ppm': 'image/x-portable-pixmap', |
||||
'pskcxml': 'application/pskc+xml', |
||||
'pml': 'application/vnd.ctc-posml', |
||||
'ai': 'application/postscript', |
||||
'pfa': 'application/x-font-type1', |
||||
'pbd': 'application/vnd.powerbuilder6', |
||||
'pgp': 'application/pgp-signature', |
||||
'box': 'application/vnd.previewsystems.box', |
||||
'ptid': 'application/vnd.pvi.ptid1', |
||||
'pls': 'application/pls+xml', |
||||
'str': 'application/vnd.pg.format', |
||||
'ei6': 'application/vnd.pg.osasli', |
||||
'dsc': 'text/prs.lines.tag', |
||||
'psf': 'application/x-font-linux-psf', |
||||
'qps': 'application/vnd.publishare-delta-tree', |
||||
'wg': 'application/vnd.pmi.widget', |
||||
'qxd': 'application/vnd.quark.quarkxpress', |
||||
'esf': 'application/vnd.epson.esf', |
||||
'msf': 'application/vnd.epson.msf', |
||||
'ssf': 'application/vnd.epson.ssf', |
||||
'qam': 'application/vnd.epson.quickanime', |
||||
'qfx': 'application/vnd.intu.qfx', |
||||
'qt': 'video/quicktime', |
||||
'rar': 'application/x-rar-compressed', |
||||
'ram': 'audio/x-pn-realaudio', |
||||
'rmp': 'audio/x-pn-realaudio-plugin', |
||||
'rsd': 'application/rsd+xml', |
||||
'rm': 'application/vnd.rn-realmedia', |
||||
'bed': 'application/vnd.realvnc.bed', |
||||
'mxl': 'application/vnd.recordare.musicxml', |
||||
'musicxml': 'application/vnd.recordare.musicxml+xml', |
||||
'rnc': 'application/relax-ng-compact-syntax', |
||||
'rdz': 'application/vnd.data-vision.rdz', |
||||
'rdf': 'application/rdf+xml', |
||||
'rp9': 'application/vnd.cloanto.rp9', |
||||
'jisp': 'application/vnd.jisp', |
||||
'rtf': 'application/rtf', |
||||
'rtx': 'text/richtext', |
||||
'link66': 'application/vnd.route66.link66+xml', |
||||
'rss, .xml': 'application/rss+xml', |
||||
'shf': 'application/shf+xml', |
||||
'st': 'application/vnd.sailingtracker.track', |
||||
'svg': 'image/svg+xml', |
||||
'sus': 'application/vnd.sus-calendar', |
||||
'sru': 'application/sru+xml', |
||||
'setpay': 'application/set-payment-initiation', |
||||
'setreg': 'application/set-registration-initiation', |
||||
'sema': 'application/vnd.sema', |
||||
'semd': 'application/vnd.semd', |
||||
'semf': 'application/vnd.semf', |
||||
'see': 'application/vnd.seemail', |
||||
'snf': 'application/x-font-snf', |
||||
'spq': 'application/scvp-vp-request', |
||||
'spp': 'application/scvp-vp-response', |
||||
'scq': 'application/scvp-cv-request', |
||||
'scs': 'application/scvp-cv-response', |
||||
'sdp': 'application/sdp', |
||||
'etx': 'text/x-setext', |
||||
'movie': 'video/x-sgi-movie', |
||||
'ifm': 'application/vnd.shana.informed.formdata', |
||||
'itp': 'application/vnd.shana.informed.formtemplate', |
||||
'iif': 'application/vnd.shana.informed.interchange', |
||||
'ipk': 'application/vnd.shana.informed.package', |
||||
'tfi': 'application/thraud+xml', |
||||
'shar': 'application/x-shar', |
||||
'rgb': 'image/x-rgb', |
||||
'slt': 'application/vnd.epson.salt', |
||||
'aso': 'application/vnd.accpac.simply.aso', |
||||
'imp': 'application/vnd.accpac.simply.imp', |
||||
'twd': 'application/vnd.simtech-mindmapper', |
||||
'csp': 'application/vnd.commonspace', |
||||
'saf': 'application/vnd.yamaha.smaf-audio', |
||||
'mmf': 'application/vnd.smaf', |
||||
'spf': 'application/vnd.yamaha.smaf-phrase', |
||||
'teacher': 'application/vnd.smart.teacher', |
||||
'svd': 'application/vnd.svd', |
||||
'rq': 'application/sparql-query', |
||||
'srx': 'application/sparql-results+xml', |
||||
'gram': 'application/srgs', |
||||
'grxml': 'application/srgs+xml', |
||||
'ssml': 'application/ssml+xml', |
||||
'skp': 'application/vnd.koan', |
||||
'sgml': 'text/sgml', |
||||
'sdc': 'application/vnd.stardivision.calc', |
||||
'sda': 'application/vnd.stardivision.draw', |
||||
'sdd': 'application/vnd.stardivision.impress', |
||||
'smf': 'application/vnd.stardivision.math', |
||||
'sdw': 'application/vnd.stardivision.writer', |
||||
'sgl': 'application/vnd.stardivision.writer-global', |
||||
'sm': 'application/vnd.stepmania.stepchart', |
||||
'sit': 'application/x-stuffit', |
||||
'sitx': 'application/x-stuffitx', |
||||
'sdkm': 'application/vnd.solent.sdkm+xml', |
||||
'xo': 'application/vnd.olpc-sugar', |
||||
'au': 'audio/basic', |
||||
'wqd': 'application/vnd.wqd', |
||||
'sis': 'application/vnd.symbian.install', |
||||
'smi': 'application/smil+xml', |
||||
'xsm': 'application/vnd.syncml+xml', |
||||
'bdm': 'application/vnd.syncml.dm+wbxml', |
||||
'xdm': 'application/vnd.syncml.dm+xml', |
||||
'sv4cpio': 'application/x-sv4cpio', |
||||
'sv4crc': 'application/x-sv4crc', |
||||
'sbml': 'application/sbml+xml', |
||||
'tsv': 'text/tab-separated-values', |
||||
'tiff': 'image/tiff', |
||||
'tao': 'application/vnd.tao.intent-module-archive', |
||||
'tar': 'application/x-tar', |
||||
'tcl': 'application/x-tcl', |
||||
'tex': 'application/x-tex', |
||||
'tfm': 'application/x-tex-tfm', |
||||
'tei': 'application/tei+xml', |
||||
'txt': 'text/plain', |
||||
'dxp': 'application/vnd.spotfire.dxp', |
||||
'sfs': 'application/vnd.spotfire.sfs', |
||||
'tsd': 'application/timestamped-data', |
||||
'tpt': 'application/vnd.trid.tpt', |
||||
'mxs': 'application/vnd.triscape.mxs', |
||||
't': 'text/troff', |
||||
'tra': 'application/vnd.trueapp', |
||||
'ttf': 'application/x-font-ttf', |
||||
'ttl': 'text/turtle', |
||||
'umj': 'application/vnd.umajin', |
||||
'uoml': 'application/vnd.uoml+xml', |
||||
'unityweb': 'application/vnd.unity', |
||||
'ufd': 'application/vnd.ufdl', |
||||
'uri': 'text/uri-list', |
||||
'utz': 'application/vnd.uiq.theme', |
||||
'ustar': 'application/x-ustar', |
||||
'uu': 'text/x-uuencode', |
||||
'vcs': 'text/x-vcalendar', |
||||
'vcf': 'text/x-vcard', |
||||
'vcd': 'application/x-cdlink', |
||||
'vsf': 'application/vnd.vsf', |
||||
'wrl': 'model/vrml', |
||||
'vcx': 'application/vnd.vcx', |
||||
'mts': 'model/vnd.mts', |
||||
'vtu': 'model/vnd.vtu', |
||||
'vis': 'application/vnd.visionary', |
||||
'viv': 'video/vnd.vivo', |
||||
'ccxml': 'application/ccxml+xml,', |
||||
'vxml': 'application/voicexml+xml', |
||||
'src': 'application/x-wais-source', |
||||
'wbxml': 'application/vnd.wap.wbxml', |
||||
'wbmp': 'image/vnd.wap.wbmp', |
||||
'wav': 'audio/x-wav', |
||||
'davmount': 'application/davmount+xml', |
||||
'woff': 'application/x-font-woff', |
||||
'wspolicy': 'application/wspolicy+xml', |
||||
'webp': 'image/webp', |
||||
'wtb': 'application/vnd.webturbo', |
||||
'wgt': 'application/widget', |
||||
'hlp': 'application/winhlp', |
||||
'wml': 'text/vnd.wap.wml', |
||||
'wmls': 'text/vnd.wap.wmlscript', |
||||
'wmlsc': 'application/vnd.wap.wmlscriptc', |
||||
'wpd': 'application/vnd.wordperfect', |
||||
'stf': 'application/vnd.wt.stf', |
||||
'wsdl': 'application/wsdl+xml', |
||||
'xbm': 'image/x-xbitmap', |
||||
'xpm': 'image/x-xpixmap', |
||||
'xwd': 'image/x-xwindowdump', |
||||
'der': 'application/x-x509-ca-cert', |
||||
'fig': 'application/x-xfig', |
||||
'xhtml': 'application/xhtml+xml', |
||||
'xml': 'application/xml', |
||||
'xdf': 'application/xcap-diff+xml', |
||||
'xenc': 'application/xenc+xml', |
||||
'xer': 'application/patch-ops-error+xml', |
||||
'rl': 'application/resource-lists+xml', |
||||
'rs': 'application/rls-services+xml', |
||||
'rld': 'application/resource-lists-diff+xml', |
||||
'xslt': 'application/xslt+xml', |
||||
'xop': 'application/xop+xml', |
||||
'xpi': 'application/x-xpinstall', |
||||
'xspf': 'application/xspf+xml', |
||||
'xul': 'application/vnd.mozilla.xul+xml', |
||||
'xyz': 'chemical/x-xyz', |
||||
'yaml': 'text/yaml', |
||||
'yang': 'application/yang', |
||||
'yin': 'application/yin+xml', |
||||
'zir': 'application/vnd.zul', |
||||
'zip': 'application/zip', |
||||
'zmm': 'application/vnd.handheld-entertainment+xml', |
||||
'zaz': 'application/vnd.zzazz.deck+xml', |
||||
} |
||||
|
||||
const mimeIcons = { |
||||
pdf: 'mdi-pdf-box', |
||||
|
||||
docx: 'mdi-file-word-outline', |
||||
dotx: 'mdi-file-word-outline', |
||||
odt: 'mdi-file-word-outline', |
||||
odm: 'mdi-file-word-outline', |
||||
ott: 'mdi-file-word-outline', |
||||
|
||||
ppt: 'mdi-file-powerpoint-box', |
||||
pptx: 'mdi-file-powerpoint-box', |
||||
sldx: 'mdi-file-powerpoint-box', |
||||
ppsx: 'mdi-file-powerpoint-box', |
||||
potx: 'mdi-file-powerpoint-box', |
||||
|
||||
xls: 'mdi-file-excel-outline', |
||||
xlam: 'mdi-file-excel-outline', |
||||
xlsb: 'mdi-file-excel-outline', |
||||
xltm: 'mdi-file-excel-outline', |
||||
xlsm: 'mdi-file-excel-outline', |
||||
} |
||||
|
||||
export { mimeTypes, mimeIcons } |
@ -0,0 +1,3 @@
|
||||
import { populateMeta } from "./populateMeta"; |
||||
|
||||
export { populateMeta } |
@ -0,0 +1,276 @@
|
||||
import Project from '../../../models/Project'; |
||||
import Column from '../../../models/Column'; |
||||
import Model from '../../../models/Model'; |
||||
import NcHelp from '../../../utils/NcHelp'; |
||||
import Base from '../../../models/Base'; |
||||
import View from '../../../models/View'; |
||||
import NcConnectionMgrv2 from '../../../utils/common/NcConnectionMgrv2'; |
||||
import getTableNameAlias, { getColumnNameAlias } from '../../helpers/getTableName'; |
||||
import LinkToAnotherRecordColumn from '../../../models/LinkToAnotherRecordColumn'; |
||||
import getColumnUiType from '../../helpers/getColumnUiType'; |
||||
import mapDefaultPrimaryValue from '../../helpers/mapDefaultPrimaryValue'; |
||||
import { extractAndGenerateManyToManyRelations } from '../metaDiffApis'; |
||||
import { ModelTypes, UITypes, ViewTypes } from 'nocodb-sdk'; |
||||
import { IGNORE_TABLES } from '../../../utils/common/BaseApiBuilder'; |
||||
|
||||
export async function populateMeta(base: Base, project: Project): Promise<any> { |
||||
const info = { |
||||
type: 'rest', |
||||
apiCount: 0, |
||||
tablesCount: 0, |
||||
relationsCount: 0, |
||||
viewsCount: 0, |
||||
client: base?.getConnectionConfig()?.client, |
||||
timeTaken: 0, |
||||
}; |
||||
|
||||
const t = process.hrtime(); |
||||
const sqlClient = await NcConnectionMgrv2.getSqlClient(base); |
||||
let order = 1; |
||||
const models2: { [tableName: string]: Model } = {}; |
||||
|
||||
const virtualColumnsInsert = []; |
||||
|
||||
/* Get all relations */ |
||||
const relations = (await sqlClient.relationListAll())?.data?.list; |
||||
|
||||
info.relationsCount = relations.length; |
||||
|
||||
let tables = (await sqlClient.tableList())?.data?.list |
||||
?.filter(({ tn }) => !IGNORE_TABLES.includes(tn)) |
||||
?.map((t) => { |
||||
t.order = ++order; |
||||
t.title = getTableNameAlias(t.tn, project.prefix, base); |
||||
t.table_name = t.tn; |
||||
return t; |
||||
}); |
||||
|
||||
/* filter based on prefix */ |
||||
if (base.is_meta && project?.prefix) { |
||||
tables = tables.filter((t) => { |
||||
return t?.tn?.startsWith(project?.prefix); |
||||
}); |
||||
} |
||||
|
||||
info.tablesCount = tables.length; |
||||
|
||||
tables.forEach((t) => { |
||||
t.title = getTableNameAlias(t.tn, project.prefix, base); |
||||
}); |
||||
|
||||
relations.forEach((r) => { |
||||
r.title = getTableNameAlias(r.tn, project.prefix, base); |
||||
r.rtitle = getTableNameAlias(r.rtn, project.prefix, base); |
||||
}); |
||||
|
||||
// await this.syncRelations();
|
||||
|
||||
const tableMetasInsert = tables.map((table) => { |
||||
return async () => { |
||||
/* filter relation where this table is present */ |
||||
const tableRelations = relations.filter( |
||||
(r) => r.tn === table.tn || r.rtn === table.tn |
||||
); |
||||
|
||||
const columns: Array< |
||||
Omit<Column, 'column_name' | 'title'> & { |
||||
cn: string; |
||||
system?: boolean; |
||||
} |
||||
> = (await sqlClient.columnList({ tn: table.tn }))?.data?.list; |
||||
|
||||
const hasMany = |
||||
table.type === 'view' |
||||
? [] |
||||
: tableRelations.filter((r) => r.rtn === table.tn); |
||||
const belongsTo = |
||||
table.type === 'view' |
||||
? [] |
||||
: tableRelations.filter((r) => r.tn === table.tn); |
||||
|
||||
mapDefaultPrimaryValue(columns); |
||||
|
||||
// add vitual columns
|
||||
const virtualColumns = [ |
||||
...hasMany.map((hm) => { |
||||
return { |
||||
uidt: UITypes.LinkToAnotherRecord, |
||||
type: 'hm', |
||||
hm, |
||||
title: `${hm.title} List`, |
||||
}; |
||||
}), |
||||
...belongsTo.map((bt) => { |
||||
// find and mark foreign key column
|
||||
const fkColumn = columns.find((c) => c.cn === bt.cn); |
||||
if (fkColumn) { |
||||
fkColumn.uidt = UITypes.ForeignKey; |
||||
fkColumn.system = true; |
||||
} |
||||
|
||||
return { |
||||
uidt: UITypes.LinkToAnotherRecord, |
||||
type: 'bt', |
||||
bt, |
||||
title: `${bt.rtitle}`, |
||||
}; |
||||
}), |
||||
]; |
||||
|
||||
// await Model.insert(project.id, base.id, meta);
|
||||
|
||||
/* create nc_models and its rows if it doesn't exists */ |
||||
models2[table.table_name] = await Model.insert(project.id, base.id, { |
||||
table_name: table.tn || table.table_name, |
||||
title: table.title, |
||||
type: table.type || 'table', |
||||
order: table.order, |
||||
}); |
||||
|
||||
// table crud apis
|
||||
info.apiCount += 5; |
||||
|
||||
let colOrder = 1; |
||||
|
||||
for (const column of columns) { |
||||
await Column.insert({ |
||||
uidt: column.uidt || getColumnUiType(base, column), |
||||
fk_model_id: models2[table.tn].id, |
||||
...column, |
||||
title: getColumnNameAlias(column.cn, base), |
||||
column_name: column.cn, |
||||
order: colOrder++, |
||||
}); |
||||
} |
||||
virtualColumnsInsert.push(async () => { |
||||
const columnNames = {}; |
||||
for (const column of virtualColumns) { |
||||
// generate unique name if there is any duplicate column name
|
||||
let c = 0; |
||||
while (`${column.title}${c || ''}` in columnNames) { |
||||
c++; |
||||
} |
||||
column.title = `${column.title}${c || ''}`; |
||||
columnNames[column.title] = true; |
||||
|
||||
const rel = column.hm || column.bt; |
||||
|
||||
const rel_column_id = (await models2?.[rel.tn]?.getColumns())?.find( |
||||
(c) => c.column_name === rel.cn |
||||
)?.id; |
||||
|
||||
const tnId = models2?.[rel.tn]?.id; |
||||
|
||||
const ref_rel_column_id = ( |
||||
await models2?.[rel.rtn]?.getColumns() |
||||
)?.find((c) => c.column_name === rel.rcn)?.id; |
||||
|
||||
const rtnId = models2?.[rel.rtn]?.id; |
||||
|
||||
try { |
||||
await Column.insert<LinkToAnotherRecordColumn>({ |
||||
project_id: project.id, |
||||
db_alias: base.id, |
||||
fk_model_id: models2[table.tn].id, |
||||
cn: column.cn, |
||||
title: column.title, |
||||
uidt: column.uidt, |
||||
type: column.hm ? 'hm' : column.mm ? 'mm' : 'bt', |
||||
// column_id,
|
||||
fk_child_column_id: rel_column_id, |
||||
fk_parent_column_id: ref_rel_column_id, |
||||
fk_index_name: rel.fkn, |
||||
ur: rel.ur, |
||||
dr: rel.dr, |
||||
order: colOrder++, |
||||
fk_related_model_id: column.hm ? tnId : rtnId, |
||||
system: column.system, |
||||
}); |
||||
|
||||
// nested relations data apis
|
||||
info.apiCount += 5; |
||||
} catch (e) { |
||||
console.log(e); |
||||
} |
||||
} |
||||
}); |
||||
}; |
||||
}); |
||||
|
||||
/* handle xc_tables update in parallel */ |
||||
await NcHelp.executeOperations(tableMetasInsert, base.type); |
||||
await NcHelp.executeOperations(virtualColumnsInsert, base.type); |
||||
await extractAndGenerateManyToManyRelations(Object.values(models2)); |
||||
|
||||
let views: Array<{ order: number; table_name: string; title: string }> = ( |
||||
await sqlClient.viewList() |
||||
)?.data?.list |
||||
// ?.filter(({ tn }) => !IGNORE_TABLES.includes(tn))
|
||||
?.map((v) => { |
||||
v.order = ++order; |
||||
v.table_name = v.view_name; |
||||
v.title = getTableNameAlias(v.view_name, project.prefix, base); |
||||
return v; |
||||
}); |
||||
|
||||
/* filter based on prefix */ |
||||
if (base.is_meta && project?.prefix) { |
||||
views = tables.filter((t) => { |
||||
return t?.tn?.startsWith(project?.prefix); |
||||
}); |
||||
} |
||||
|
||||
info.viewsCount = views.length; |
||||
|
||||
const viewMetasInsert = views.map((table) => { |
||||
return async () => { |
||||
const columns = (await sqlClient.columnList({ tn: table.table_name })) |
||||
?.data?.list; |
||||
|
||||
/* create nc_models and its rows if it doesn't exists */ |
||||
models2[table.table_name] = await Model.insert(project.id, base.id, { |
||||
table_name: table.table_name, |
||||
title: getTableNameAlias(table.table_name, project.prefix, base), |
||||
// todo: sanitize
|
||||
type: ModelTypes.VIEW, |
||||
order: table.order, |
||||
}); |
||||
|
||||
let colOrder = 1; |
||||
|
||||
// view apis
|
||||
info.apiCount += 2; |
||||
|
||||
for (const column of columns) { |
||||
await Column.insert({ |
||||
fk_model_id: models2[table.table_name].id, |
||||
...column, |
||||
title: getColumnNameAlias(column.cn, base), |
||||
order: colOrder++, |
||||
uidt: getColumnUiType(base, column), |
||||
}); |
||||
} |
||||
}; |
||||
}); |
||||
|
||||
await NcHelp.executeOperations(viewMetasInsert, base.type); |
||||
|
||||
// fix pv column for created grid views
|
||||
const models = await Model.list({ project_id: project.id, base_id: base.id }); |
||||
|
||||
for (const model of models) { |
||||
const views = await model.getViews() |
||||
for (const view of views) { |
||||
if (view.type === ViewTypes.GRID) { |
||||
await View.fixPVColumnForView(view.id); |
||||
} |
||||
} |
||||
} |
||||
|
||||
const t1 = process.hrtime(t); |
||||
const t2 = t1[0] + t1[1] / 1000000000; |
||||
|
||||
(info as any).timeTaken = t2.toFixed(1); |
||||
|
||||
return info; |
||||
} |
@ -0,0 +1,72 @@
|
||||
import { NcUpgraderCtx } from './NcUpgrader'; |
||||
import { MetaTable } from '../utils/globals'; |
||||
|
||||
// before 0.104.3, primary value column can be in any position in table
|
||||
// with this upgrade we introduced sticky primary column feature
|
||||
// this upgrader will make primary value column first column in grid views
|
||||
|
||||
export default async function ({ ncMeta }: NcUpgraderCtx) { |
||||
const grid_columns = await ncMeta.metaList2(null, null, MetaTable.GRID_VIEW_COLUMNS); |
||||
const grid_views = [...new Set(grid_columns.map((col) => col.fk_view_id))] |
||||
|
||||
for (const view_id of grid_views) { |
||||
// get a list of view columns sorted by order
|
||||
const view_columns = await ncMeta.metaList2(null, null, MetaTable.GRID_VIEW_COLUMNS, { |
||||
condition: { |
||||
fk_view_id: view_id, |
||||
}, |
||||
orderBy: { |
||||
order: 'asc', |
||||
}, |
||||
}); |
||||
const view_columns_meta = [] |
||||
|
||||
// get column meta for each view column
|
||||
for (const col of view_columns) { |
||||
const col_meta = await ncMeta.metaGet(null, null, MetaTable.COLUMNS, { id: col.fk_column_id }); |
||||
view_columns_meta.push(col_meta); |
||||
} |
||||
|
||||
const primary_value_column_meta = view_columns_meta.find((col) => col.pv); |
||||
|
||||
if (primary_value_column_meta) { |
||||
const primary_value_column = view_columns.find((col) => col.fk_column_id === primary_value_column_meta.id); |
||||
const primary_value_column_index = view_columns.findIndex((col) => col.fk_column_id === primary_value_column_meta.id); |
||||
const view_orders = view_columns.map((col) => col.order); |
||||
const view_min_order = Math.min(...view_orders); |
||||
|
||||
// if primary_value_column is not visible, make it visible
|
||||
if (!primary_value_column.show) { |
||||
await ncMeta.metaUpdate( |
||||
null, |
||||
null, |
||||
MetaTable.GRID_VIEW_COLUMNS, |
||||
{ show: true }, |
||||
primary_value_column.id, |
||||
); |
||||
} |
||||
|
||||
if (primary_value_column.order === view_min_order && view_orders.filter((o) => o === view_min_order).length === 1) { |
||||
// if primary_value_column is in first order do nothing
|
||||
continue; |
||||
} else { |
||||
// if primary_value_column not in first order, move it to the start of array
|
||||
if (primary_value_column_index !== 0) { |
||||
const temp_pv = view_columns.splice(primary_value_column_index, 1); |
||||
view_columns.unshift(...temp_pv); |
||||
} |
||||
|
||||
// update order of all columns in view to match the order in array
|
||||
for (let i = 0; i < view_columns.length; i++) { |
||||
await ncMeta.metaUpdate( |
||||
null, |
||||
null, |
||||
MetaTable.GRID_VIEW_COLUMNS, |
||||
{ order: i + 1 }, |
||||
view_columns[i].id |
||||
); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue