diff --git a/markdown/readme/languages/spanish.md b/markdown/readme/languages/spanish.md index 12692193c2..935bc07e08 100644 --- a/markdown/readme/languages/spanish.md +++ b/markdown/readme/languages/spanish.md @@ -194,8 +194,8 @@ Por favor diríjase a [Contribution Guide](https://github.com/nocodb/nocodb/blob # Por qué estamos construyendo esto? -La mayoría de las empresas de Internet emplean una hoja de cálculo o una base de datos para resolver sus necesidades comerciales. Las hojas de cálculo son utilizadas por billones de personas o más de manera colaborativa todos los días. Sin embargo, estamos lejos de trabajar a velocidades similares en bases de datos, ya que son herramientas computacionalmente más poderosas. Los intentos de resolver esto con soluciones SaaS han significado horribles controles de acceso, dependencia de un proveedor, dependencia de datos, cambios abruptos de precios y lo que es más importante, un techo de cristal sobre lo que es posible en el futuro." +La mayoría de las empresas de Internet emplean una hoja de cálculo o una base de datos para resolver sus necesidades comerciales. Las hojas de cálculo son utilizadas por billones de personas o más de manera colaborativa todos los días. Sin embargo, estamos lejos de trabajar a velocidades similares en bases de datos, ya que son herramientas computacionalmente más poderosas. Los intentos de resolver esto con soluciones SaaS han significado horribles controles de acceso, dependencia de un proveedor, dependencia de datos, cambios abruptos de precios y lo que es más importante, un techo de cristal sobre lo que es posible en el futuro. # Nuestra misión -Nuestra misión es proporcionar la interfaz sin-código más potente para bases de datos, la cual es open-source para negocios de Internet en el mundo. Esto no solo democratizaría el acceso a una poderosa herramienta de computación, sino que también producirá a billones de personas o más con habilidades radicales de perfección y construcción en Internet." +Nuestra misión es proporcionar la interfaz sin-código más potente para bases de datos, la cual es open-source para negocios de Internet en el mundo. Esto no solo democratizaría el acceso a una poderosa herramienta de computación, sino que también producirá a miles de millones de personas o más con habilidades radicales de perfección y construcción en Internet. diff --git a/packages/nc-gui/assets/nc-icons/credit-card.svg b/packages/nc-gui/assets/nc-icons/credit-card.svg index 06b6025ea3..213df64d29 100644 --- a/packages/nc-gui/assets/nc-icons/credit-card.svg +++ b/packages/nc-gui/assets/nc-icons/credit-card.svg @@ -1,4 +1,4 @@ - - + + diff --git a/packages/nc-gui/assets/nc-icons/layers.svg b/packages/nc-gui/assets/nc-icons/layers.svg index 1d23789b83..82faffa520 100644 --- a/packages/nc-gui/assets/nc-icons/layers.svg +++ b/packages/nc-gui/assets/nc-icons/layers.svg @@ -1,8 +1,8 @@ - - - + + + diff --git a/packages/nc-gui/components.d.ts b/packages/nc-gui/components.d.ts index f8954cf149..70144a9a06 100644 --- a/packages/nc-gui/components.d.ts +++ b/packages/nc-gui/components.d.ts @@ -76,6 +76,7 @@ declare module '@vue/runtime-core' { CilFullscreen: typeof import('~icons/cil/fullscreen')['default'] CilFullscreenExit: typeof import('~icons/cil/fullscreen-exit')['default'] ClaritySuccessLine: typeof import('~icons/clarity/success-line')['default'] + IcBaselineArrowOutward: typeof import('~icons/ic/baseline-arrow-outward')['default'] IcBaselineMoreVert: typeof import('~icons/ic/baseline-more-vert')['default'] IcOutlineInsertDriveFile: typeof import('~icons/ic/outline-insert-drive-file')['default'] IcRoundEdit: typeof import('~icons/ic/round-edit')['default'] @@ -123,6 +124,7 @@ declare module '@vue/runtime-core' { MdiCodeTags: typeof import('~icons/mdi/code-tags')['default'] MdiContentCopy: typeof import('~icons/mdi/content-copy')['default'] MdiCurrencyUsd: typeof import('~icons/mdi/currency-usd')['default'] + MdiDeleteOutline: typeof import('~icons/mdi/delete-outline')['default'] MdiDiscord: typeof import('~icons/mdi/discord')['default'] MdiDotsHorizontal: typeof import('~icons/mdi/dots-horizontal')['default'] MdiDotsVertical: typeof import('~icons/mdi/dots-vertical')['default'] @@ -130,9 +132,13 @@ declare module '@vue/runtime-core' { MdiFileDocumentMultipleOutline: typeof import('~icons/mdi/file-document-multiple-outline')['default'] MdiFileDocumentOutline: typeof import('~icons/mdi/file-document-outline')['default'] MdiFlag: typeof import('~icons/mdi/flag')['default'] + MdiFormatBold: typeof import('~icons/mdi/format-bold')['default'] + MdiFormatItalic: typeof import('~icons/mdi/format-italic')['default'] + MdiFormatUnderline: typeof import('~icons/mdi/format-underline')['default'] MdiHeart: typeof import('~icons/mdi/heart')['default'] MdiHistory: typeof import('~icons/mdi/history')['default'] MdiKeyStar: typeof import('~icons/mdi/key-star')['default'] + MdiLink: typeof import('~icons/mdi/link')['default'] MdiLinkVariant: typeof import('~icons/mdi/link-variant')['default'] MdiLoading: typeof import('~icons/mdi/loading')['default'] MdiLogin: typeof import('~icons/mdi/login')['default'] diff --git a/packages/nc-gui/components/cell/DatePicker.vue b/packages/nc-gui/components/cell/DatePicker.vue index abf01f6584..fc0c16ea25 100644 --- a/packages/nc-gui/components/cell/DatePicker.vue +++ b/packages/nc-gui/components/cell/DatePicker.vue @@ -32,8 +32,6 @@ const columnMeta = inject(ColumnInj, null)! const readOnly = inject(ReadonlyInj, ref(false)) -const isLockedMode = inject(IsLockedInj, ref(false)) - const isEditColumn = inject(EditColumnInj, ref(false)) const active = inject(ActiveCellInj, ref(false)) @@ -188,9 +186,7 @@ useSelectedCellKeyupListener(active, (e: KeyboardEvent) => { const isOpen = computed(() => { if (readOnly.value) return false - return ((readOnly.value || (localState.value && isPk)) && !active.value && !editable.value) || isLockedMode.value - ? false - : open.value + return (readOnly.value || (localState.value && isPk)) && !active.value && !editable.value ? false : open.value }) // use the default date picker open sync only to close the picker diff --git a/packages/nc-gui/components/cell/DateTimePicker.vue b/packages/nc-gui/components/cell/DateTimePicker.vue index 11ccba81b6..fa8a588a4b 100644 --- a/packages/nc-gui/components/cell/DateTimePicker.vue +++ b/packages/nc-gui/components/cell/DateTimePicker.vue @@ -37,8 +37,6 @@ const active = inject(ActiveCellInj, ref(false)) const editable = inject(EditModeInj, ref(false)) -const isLockedMode = inject(IsLockedInj, ref(false)) - const { t } = useI18n() const isEditColumn = inject(EditColumnInj, ref(false)) @@ -126,9 +124,7 @@ const open = ref(false) const isOpen = computed(() => { if (readOnly.value) return false - return readOnly.value || (localState.value && isPk) || isLockedMode.value - ? false - : open.value && (active.value || editable.value) + return readOnly.value || (localState.value && isPk) ? false : open.value && (active.value || editable.value) }) const randomClass = `picker_${Math.floor(Math.random() * 99999)}` diff --git a/packages/nc-gui/components/cell/MultiSelect.vue b/packages/nc-gui/components/cell/MultiSelect.vue index d8fe577a99..d02db8decc 100644 --- a/packages/nc-gui/components/cell/MultiSelect.vue +++ b/packages/nc-gui/components/cell/MultiSelect.vue @@ -49,8 +49,6 @@ const column = inject(ColumnInj)! const readOnly = inject(ReadonlyInj)! -const isLockedMode = inject(IsLockedInj, ref(false)) - const isEditable = inject(EditModeInj, ref(false)) const activeCell = inject(ActiveCellInj, ref(false)) @@ -134,9 +132,13 @@ const vModel = computed({ const selectedTitles = computed(() => modelValue - ? typeof modelValue === 'string' - ? isMysql(column.value.source_id) - ? modelValue.split(',').sort((a, b) => { + ? Array.isArray(modelValue) + ? modelValue + : isMysql(column.value.source_id) + ? modelValue + .toString() + .split(',') + .sort((a, b) => { const opa = options.value.find((el) => el.title === a) const opb = options.value.find((el) => el.title === b) if (opa && opb) { @@ -144,8 +146,7 @@ const selectedTitles = computed(() => } return 0 }) - : modelValue.split(',') - : modelValue + : modelValue.toString().split(',') : [], ) @@ -343,11 +344,7 @@ const selectedOpts = computed(() => {
+
{ :bordered="false" clear-icon :show-search="!isMobileMode" - :show-arrow="editAllowed && !(readOnly || isLockedMode)" + :show-arrow="editAllowed && !readOnly" :open="isOpen && editAllowed" - :disabled="readOnly || !editAllowed || isLockedMode" + :disabled="readOnly || !editAllowed" :class="{ 'caret-transparent': !hasEditRoles }" :dropdown-class-name="`nc-dropdown-multi-select-cell ${isOpen ? 'active' : ''}`" @search="search" diff --git a/packages/nc-gui/components/cell/RichText.vue b/packages/nc-gui/components/cell/RichText.vue new file mode 100644 index 0000000000..7f48430ea8 --- /dev/null +++ b/packages/nc-gui/components/cell/RichText.vue @@ -0,0 +1,347 @@ + + + + + diff --git a/packages/nc-gui/components/cell/RichText/LinkOptions.vue b/packages/nc-gui/components/cell/RichText/LinkOptions.vue new file mode 100644 index 0000000000..ddae15f26b --- /dev/null +++ b/packages/nc-gui/components/cell/RichText/LinkOptions.vue @@ -0,0 +1,244 @@ + + + + + diff --git a/packages/nc-gui/components/cell/RichText/SelectedBubbleMenu.vue b/packages/nc-gui/components/cell/RichText/SelectedBubbleMenu.vue new file mode 100644 index 0000000000..51b939b264 --- /dev/null +++ b/packages/nc-gui/components/cell/RichText/SelectedBubbleMenu.vue @@ -0,0 +1,381 @@ + + + + + diff --git a/packages/nc-gui/components/cell/RichText/SelectedBubbleMenuPopup.vue b/packages/nc-gui/components/cell/RichText/SelectedBubbleMenuPopup.vue new file mode 100644 index 0000000000..63132a18f8 --- /dev/null +++ b/packages/nc-gui/components/cell/RichText/SelectedBubbleMenuPopup.vue @@ -0,0 +1,68 @@ + + + diff --git a/packages/nc-gui/components/cell/SingleSelect.vue b/packages/nc-gui/components/cell/SingleSelect.vue index 0afc0e4c4b..9acccd11e2 100644 --- a/packages/nc-gui/components/cell/SingleSelect.vue +++ b/packages/nc-gui/components/cell/SingleSelect.vue @@ -43,8 +43,6 @@ const column = inject(ColumnInj)! const readOnly = inject(ReadonlyInj)! -const isLockedMode = inject(IsLockedInj, ref(false)) - const isEditable = inject(EditModeInj, ref(false)) const activeCell = inject(ActiveCellInj, ref(false)) @@ -264,11 +262,7 @@ const selectedOpt = computed(() => {