diff --git a/src/common/carousel/carousel.scss b/src/common/carousel/carousel.scss index 1d865cd4efb47f6506dbde9fe6686d3f8a49e124..c5b37960c4a5963527d82f8b0b7753e6f40e77c0 100644 --- a/src/common/carousel/carousel.scss +++ b/src/common/carousel/carousel.scss @@ -1,8 +1,10 @@ $carousel: ( + // 间距 img-padding: 0, ); @include b('carousel') { @include set-component-css-var('carousel', $carousel); + height: 100%; .van-swipe { diff --git a/src/common/cropping/cropping.scss b/src/common/cropping/cropping.scss index 57502f83f6a35385c3af6ac5f794a9dbcba6c67c..b63b234e08202a981e60396f8e7ed324f7cb0689 100644 --- a/src/common/cropping/cropping.scss +++ b/src/common/cropping/cropping.scss @@ -1,82 +1,109 @@ +$cropping: ( + // 颜色 + area-color: getCssVar(color, bg, overlay), + area-bg-color: transparent, + cancel-btn-color: getCssVar(color, black), + cancel-btn-bg-color: getCssVar(color, white), + confirm-btn-color: getCssVar(color, white), + confirm-btn-bg-color: getCssVar(color, primary), + + // 高度 + footer-height: rem(50px), + + // 间距 + footer-gap: getCssVar(spacing, base), + btn-padding: getCssVar(spacing, tight) getCssVar(spacing, base), + + // 圆角 + btn-border-radius: getCssVar(border-radius, small), + + // 边框 + area-border: 1px solid getCssVar(color, border), + footer-border-top: 1px solid getCssVar(color, border), + btn-border: 1px solid getCssVar(color, border), +); @include b('cropping') { + @include set-component-css-var(cropping, $cropping); + + display: flex; + flex-direction: column; + width: 100%; + height: 100%; + overflow: hidden; + user-select: none; + + @include e('content') { display: flex; + flex: 1; flex-direction: column; - gap: getCssVar(spacing, tight); + align-items: center; width: 100%; height: 100%; overflow: hidden; - user-select: none; - @include e('content') { - display: flex; - flex: 1; - flex-direction: column; - gap: getCssVar(spacing, tight); - align-items: center; + @include m('crop') { + position: relative; width: 100%; height: 100%; overflow: hidden; - @include m('crop') { - position: relative; - width: 100%; - height: 100%; - overflow: hidden; - } - @include m('croparea') { - position: absolute; - top: 50%; - left: 50%; - z-index: 10; - box-sizing: border-box; - overflow: hidden; - color: rgb(0 0 0 / 50%); - cursor: move; - content: ''; - background: transparent; - border: 1px solid rgb(255 255 255 / 50%); - box-shadow: 0 0 0 9999em; - transform: translate(-50%, -50%); - } - @include m('img') { - position: absolute; - inset: 0; - top: 50%; - left: 50%; - max-width: 100%; - max-height: 100%; - user-select: none; - transform: translate(-50%, -50%); - } } - @include e('footer') { - display: flex; - flex-shrink: 0; - gap: getCssVar(spacing, base); - align-items: center; - justify-content: center; - width: 100%; - height: 50px; + @include m('croparea') { + position: absolute; + top: 50%; + left: 50%; + z-index: 10; + box-sizing: border-box; overflow: hidden; - border-top: 1px solid getCssVar(color, border); - @include m('cancel') { - width: 45%; - padding: getCssVar(spacing, tight) getCssVar(spacing, base); - text-align: center; - cursor: pointer; - border: 1px solid getCssVar(color, border); - border-radius: getCssVar(border-radius, small); - - } - @include m('confirm') { - width: 45%; - padding: getCssVar(spacing, tight) getCssVar(spacing, base); - color: getCssVar(color, white); - text-align: center; - cursor: pointer; - background-color: getCssVar(color, primary); - border: 1px solid getCssVar(color, border); - border-radius: getCssVar(border-radius, small); + color: getCssVar(cropping, area-color); + cursor: move; + content: ''; + background: getCssVar(cropping, area-bg-color); + border: getCssVar(cropping, area-border); + box-shadow: 0 0 0 9999em; + transform: translate(-50%, -50%); + } + @include m('img') { + position: absolute; + inset: 0; + top: 50%; + left: 50%; + max-width: 100%; + max-height: 100%; + user-select: none; + transform: translate(-50%, -50%); + } + } + @include e('footer') { + display: flex; + flex-shrink: 0; + gap: getCssVar(cropping, footer-gap); + align-items: center; + justify-content: center; + width: 100%; + height: getCssVar(cropping, footer-height); + overflow: hidden; + background-color: getCssVar(cropping, area-color); + border-top: getCssVar(cropping, footer-border-top); + @include m('cancel') { + width: 45%; + padding: getCssVar(cropping, btn-padding); + color: getCssVar(cropping, cancel-btn-color); + text-align: center; + cursor: pointer; + background-color: getCssVar(cropping, cancel-btn-bg-color); + border: getCssVar(cropping, btn-border); + border-radius: getCssVar(cropping, btn-border-radius); + } + @include m('confirm') { + width: 45%; + padding: getCssVar(cropping, btn-padding); + color: getCssVar(cropping, confirm-btn-color); + text-align: center; + cursor: pointer; + background-color: getCssVar(cropping, confirm-btn-bg-color); + border: getCssVar(cropping, btn-border); + border-radius: getCssVar(cropping, btn-border-radius); - } } } +} \ No newline at end of file diff --git a/src/editor/array/ibiz-array/ibiz-array.tsx b/src/editor/array/ibiz-array/ibiz-array.tsx index f4df74611527ea48e3a71b8bf2fd97b90f9d4e3c..07bba54bf2458f8288cbca5310207ce5cd9cd381 100644 --- a/src/editor/array/ibiz-array/ibiz-array.tsx +++ b/src/editor/array/ibiz-array/ibiz-array.tsx @@ -15,14 +15,13 @@ import './ibiz-array.scss'; * * @description 使用van-field组件封装,提供数组数据的输入能力,其呈现样式为多个携带自增自减按钮的输入框。支持编辑器类型包含:`数组编辑器` * @primary - * @editorparams {"name":"size","parameterType":"'large' | 'normal'","defaultvalue":"'normal'","description":"van-field组件的size属性"} * @editorparams {"name":"limit","parameterType":"number","defaultvalue":0,"description":"默认不限制输入项数量,若设置了非零的限制数,当输入项数量超出该限制时,自增按钮将隐藏"} * @editorparams {"name":"maxlength","parameterType":"number","description":"设置单个输入框可输入内容的最大长度"} * @editorparams {"name":"showwordlimit","parameterType":"boolean","defaultvalue":false,"description":"是否显示字数限制统计,仅在设置了maxlength属性时生效"} * @editorparams {"name":"triggermode","parameterType":"'blur' |' input'","defaultvalue":"'blur'","description":"指定编辑器触发 `change` 值变更事件的模式,input: 输入框输入时触发事件,blur:输入框blur时触发事件"} * @editorparams {"name":"readonly","parameterType":"boolean","defaultvalue":false,"description":"设置编辑器是否为只读态"} * @ignoreprops autoFocus | overflowMode - * @ignoreemits infoTextChange + * @ignoreemits infoTextChange | enter */ export const IBizArray = defineComponent({ name: 'IBizArray', diff --git a/src/editor/dropdown-list/ibiz-cascader-dropdown/ibiz-cascader-dropdown.scss b/src/editor/dropdown-list/ibiz-cascader-dropdown/ibiz-cascader-dropdown.scss index 1fe64898fa65a40d8bb481b6d9277ca76618a824..824086c4efecb23120e677399497fd8b0018684d 100644 --- a/src/editor/dropdown-list/ibiz-cascader-dropdown/ibiz-cascader-dropdown.scss +++ b/src/editor/dropdown-list/ibiz-cascader-dropdown/ibiz-cascader-dropdown.scss @@ -1,9 +1,42 @@ +$cascader-dropdown: ( + // 颜色 + color: getCssVar(editor, default, text-color), + disabled-color: getCssVar(editor, disabled, text-color), + readonly-color: getCssVar(editor, readonly, text-color), + placeholder-color: getCssVar(editor, default, placeholder-color), + + // 字体大小 + font-size: getCssVar(editor, default, font-size), + + // 行高 + line-height: getCssVar(editor, default, line-height), + + // 文本对齐 + text-align: getCssVar(form-item-container, editor-align), +); + @include b(cascader-dropdown) { + @include set-component-css-var(cascader-dropdown, $cascader-dropdown); + height: 100%; + font-size: getCssVar(cascader-dropdown, font-size); + line-height: getCssVar(cascader-dropdown, line-height); + color: getCssVar(cascader-dropdown, color); - .van-field { - font-size: getCssVar('form-item', 'font-size'); + --van-field-input-text-color: #{getCssVar(cascader-dropdown, color)}; + --van-cell-text-color: #{getCssVar(cascader-dropdown, color)}; + --van-cell-value-color: #{getCssVar(cascader-dropdown, color)}; + --van-cell-line-height: #{getCssVar(cascader-dropdown, line-height)}; + --van-cell-font-size: #{getCssVar(cascader-dropdown, font-size)}; + --van-cell-value-font-size: #{getCssVar(cascader-dropdown, font-size)}; + --van-field-input-disabled-text-color: #{getCssVar(cascader-dropdown, disabled-color)}; + + input::placeholder { + color: getCssVar(cascader-dropdown, placeholder-color); + -webkit-text-fill-color: getCssVar(cascader-dropdown, placeholder-color); + } + .van-field { &::after { display: none; } @@ -14,21 +47,21 @@ } @include m(disabled) { - color: getCssVar('form-item', 'disabled-color'); + color: getCssVar(cascader-dropdown, disabled-color); - --van-field-input-text-color: #{getCssVar('form-item', 'disabled-color')}; + --van-field-input-disabled-text-color: #{getCssVar(cascader-dropdown, disabled-color)}; } @include m(readonly) { - --van-field-input-text-color: #{getCssVar('form-item', 'readonly-color')}; + --van-field-input-text-color: #{getCssVar(cascader-dropdown, readonly-color)}; - color: getCssVar('form-item', 'readonly-color'); + color: getCssVar(cascader-dropdown, readonly-color); } input { - text-align: getCssVar(form-item-container, editor-align); + text-align: getCssVar(cascader-dropdown, text-align); } - &.#{bem('cascader','','readonly')} { - text-align: getCssVar(form-item-container, editor-align); + &.#{bem('cascader-dropdown','','readonly')} { + text-align: getCssVar(cascader-dropdown, text-align); } } diff --git a/src/editor/dropdown-list/ibiz-cascader-dropdown/ibiz-cascader-dropdown.tsx b/src/editor/dropdown-list/ibiz-cascader-dropdown/ibiz-cascader-dropdown.tsx index 1dc4e891367d4d24e8508ef1359957c9cb5f57c5..beadf5b3d7dbea8fcda929cfbe208ce4709dfb6b 100644 --- a/src/editor/dropdown-list/ibiz-cascader-dropdown/ibiz-cascader-dropdown.tsx +++ b/src/editor/dropdown-list/ibiz-cascader-dropdown/ibiz-cascader-dropdown.tsx @@ -13,7 +13,9 @@ import './ibiz-cascader-dropdown.scss'; /** * 移动端级联下拉列表(单选) * @primary - * @description 使用van-cascader组件,用于选择树形代码表数据。基于`移动端下拉列表(单选)`编辑器扩展,编辑器样式代码名称为:CASCADER + * @description 使用van-cascader组件,用于选择树型代码表数据。基于`移动端下拉列表(单选)`编辑器扩展,编辑器样式代码名称为:CASCADER + * @editorparams {name:pvaluefield,parameterType:string,description:设置级联下拉列表代码表项的父值属性,将其以树型结构展示} + * @editorparams {name:readonly,parameterType:boolean,defaultvalue:false,description:设置编辑器是否为只读态} * @ignoreprops autoFocus | overflowMode * @ignoreemits infoTextChange | enter */ diff --git a/src/editor/index.ts b/src/editor/index.ts index e568c42ea7641300f66aaa1d7828e8f2a020938f..8f9f395ea68026d0b980baabf3e4068de2a7fa65 100644 --- a/src/editor/index.ts +++ b/src/editor/index.ts @@ -1,7 +1,7 @@ import { registerEditorProvider } from '@ibiz-template/runtime'; import { App, defineAsyncComponent } from 'vue'; import { NotSupportedEditor } from './not-supported-editor/not-supported-editor'; -import { IBizSpan, SpanEditorProvider } from './span'; +import { IBizSpan, IBizSpanLink, SpanEditorProvider } from './span'; import { IBizInput, IBizInputNumber, @@ -60,6 +60,7 @@ export const IBizEditor = { v.component(IBizInputNumber.name, IBizInputNumber); v.component(IBizSignature.name, IBizSignature); v.component(IBizSpan.name, IBizSpan); + v.component(IBizSpanLink.name, IBizSpanLink); v.component(IBizSwitch.name, IBizSwitch); v.component(IBizRadio.name, IBizRadio); v.component(IBizDropdown.name, IBizDropdown); @@ -117,6 +118,12 @@ export const IBizEditor = { () => new SpanEditorProvider(), ); + // 标签(数据链接) + registerEditorProvider( + 'SPAN_LINK', + () => new SpanEditorProvider('SPAN_LINK'), + ); + // 文本框 const textBoxEditorProvider = new TextBoxEditorProvider(); registerEditorProvider('MOBTEXT', () => textBoxEditorProvider); @@ -164,7 +171,7 @@ export const IBizEditor = { // 级联下拉 registerEditorProvider( - 'ROPDOWNLIST_CASCADER', + 'DROPDOWNLIST_CASCADER', () => new DropDownListEditorProvider('MOBDROPDOWNLIST_CASCADER'), ); @@ -322,6 +329,10 @@ export const IBizEditor = { 'PICTURE_ONE_RAW', () => new FileUploaderEditorProvider('PICTURE_ONE_RAW'), ); + registerEditorProvider( + 'PICTURE_CROPPING', + () => new FileUploaderEditorProvider('PICTURE_CROPPING'), + ); // 数值范围 registerEditorProvider( 'MOBNUMBERRANGE', diff --git a/src/editor/span/span-link/span-link.scss b/src/editor/span/span-link/span-link.scss index 16eb5698c9c91b429cfdf315deccf9faf3e636f7..dc272709fc011ca693db56be97fbffb54d569d97 100644 --- a/src/editor/span/span-link/span-link.scss +++ b/src/editor/span/span-link/span-link.scss @@ -1,12 +1,33 @@ +$span-link: ( + // 颜色 + color: getCssVar(color, primary), + disabled-color: getCssVar(editor, disabled, text-color), + readonly-color: getCssVar(editor, readonly, text-color), + + // 字体大小 + font-size: getCssVar(editor, default, font-size), + + // 行高 + line-height: getCssVar(editor, default, line-height), + + // 文本对齐 + text-align: getCssVar(form-item-container, editor-align), +); + @include b(span-link) { - color: getCssVar('form-item', 'hover-color'); + @include set-component-css-var(span-link, $span-link); + + font-size: getCssVar(span-link, font-size); + line-height: getCssVar(span-link, line-height); + color: getCssVar(span-link, color); + text-align: getCssVar(span-link, text-align); cursor: pointer; - text-align: getCssVar(form-item-container, editor-align); @include m(disabled) { + color: getCssVar(span-link, disabled-color); cursor: not-allowed; } @include m(readonly) { - color: getCssVar('form-item', 'readonly-color'); + color: getCssVar(span-link, readonly-color); } } diff --git a/src/editor/upload/ibiz-carousel/ibiz-carousel.tsx b/src/editor/upload/ibiz-carousel/ibiz-carousel.tsx index 5b14186c7ae83e3d05ef9305f2d5533350d5910e..6439c1d60ab9d8fda58e640571cb18754550c1d1 100644 --- a/src/editor/upload/ibiz-carousel/ibiz-carousel.tsx +++ b/src/editor/upload/ibiz-carousel/ibiz-carousel.tsx @@ -15,7 +15,7 @@ import { UploadEditorController } from '../upload-editor.controller'; * @description 使用van-swipe组件,用于对图片数组进行轮播,提供了自动轮播,设置轮播动画时长,显示项指示器以及支持手势滑动的功能。是预制类型,类型为:FIELD_CAROUSEL_PICTURE * @editorparams {name:autoplay,parameterType:number,defaultvalue:3000,description:轮播间隔,van-swipe组件的autoplay属性} * @editorparams {name:duration,parameterType:number,defaultvalue:500,description:动画时长,van-swipe组件的duration属性} - * @editorparams {name:showIndicators,parameterType:boolean,defaultvalue:true,description:是否显示指示器,van-swipe组件的show-indicators属性} + * @editorparams {name:showindicators,parameterType:boolean,defaultvalue:true,description:是否显示指示器,van-swipe组件的show-indicators属性} * @editorparams {name:touchable,parameterType:boolean,defaultvalue:true,description:是否可以通过手势滑动,van-swipe组件的touchable属性} * @ignoreprops autoFocus | overflowMode * @ignoreemits blur | focus | enter | change | infoTextChange @@ -54,6 +54,9 @@ export const IBizEditorCarousel = defineComponent({ if (editorModel.editorParams.showIndicators) { showIndicators = editorModel.editorParams.showIndicators === 'true'; } + if (editorModel.editorParams.showindicators) { + showIndicators = editorModel.editorParams.showindicators === 'true'; + } if (editorModel.editorParams.touchable) { touchable = editorModel.editorParams.touchable === 'true'; } diff --git a/src/editor/upload/ibiz-image-cropping/ibiz-image-cropping.scss b/src/editor/upload/ibiz-image-cropping/ibiz-image-cropping.scss index 7be9bb06400bcc0d58b069e78ee52b09047c5ce7..471010cf7ca1c79ddd4efac479e6994653c68115 100644 --- a/src/editor/upload/ibiz-image-cropping/ibiz-image-cropping.scss +++ b/src/editor/upload/ibiz-image-cropping/ibiz-image-cropping.scss @@ -1,4 +1,14 @@ +$image-upload-cropping: ( + // 圆角 + border-radius: rem(4px), + + // 文本对齐 + text-align: getCssVar(form-item-container, editor-align), +); + @include b('image-upload-cropping') { + @include set-component-css-var(image-upload-cropping, $image-upload-cropping); + .van-uploader__preview { .van-uploader__file-icon { display: none; @@ -31,14 +41,14 @@ img { width: 100%; height: 100%; - border-radius: rem(4px); + border-radius: getCssVar(image-upload-cropping, border-radius); } } .van-uploader { display: flex; flex-direction: row; - justify-content: getCssVar(form-item-container, editor-align); + justify-content: getCssVar(image-upload-cropping, text-align); } } diff --git a/src/editor/upload/ibiz-image-cropping/ibiz-image-cropping.tsx b/src/editor/upload/ibiz-image-cropping/ibiz-image-cropping.tsx index 265239ee6086e9ec556452ecd0d3eb2d83abe94f..74e9fb05cc0928b9fd3a89f1d5f2eb025541e729 100644 --- a/src/editor/upload/ibiz-image-cropping/ibiz-image-cropping.tsx +++ b/src/editor/upload/ibiz-image-cropping/ibiz-image-cropping.tsx @@ -14,14 +14,21 @@ import { UploadEditorController } from '../upload-editor.controller'; /** * 图片裁剪上传(扩展) * @primary - * @description 使用van-uploader组件和van-popup组件,用于对指定的图片进行裁剪,并根据裁剪内容生成新的图片后将其进行上传。基于`移动端图片控件(单项)`编辑器扩展,编辑器样式代码名称为:CROPPING - * @editorparams {name:multiple,parameterType:boolean,description:是否支持多选文件} - * @editorparams {name:accept,parameterType:string,description:允许上传的文件类型} - * @editorparams {name:STOPPROPAGATION,parameterType:boolean,description:是否阻止默认点击} - * @editorparams {name:cropWidth,parameterType:number,description:裁剪宽度} - * @editorparams {name:cropHeight,parameterType:number,description:裁剪高度} - * @editorparams {name:uploadParams,parameterType:IData,description:上传参数} - * @editorparams {name:exportParams,parameterType:IData,description:下载参数} + * @description 使用van-uploader组件和van-popup组件,用于对指定的图片进行裁剪,并根据裁剪内容生成新的图片后将其进行上传。基于`移动端图片控件`编辑器扩展,编辑器样式代码名称为:CROPPING + * @editorparams {name:multiple,parameterType:boolean,description:是否支持选择多个图片上传} + * @editorparams {name:accept,parameterType:string,description:允许上传的文件类型,van-uploader组件的accept属性} + * @editorparams {name:stoppropagation,parameterType:boolean,description:是否阻止默认点击} + * @editorparams {name:cropwidth,parameterType:number,description:裁剪宽度} + * @editorparams {name:cropheight,parameterType:number,description:裁剪高度} + * @editorparams {name:uploadparams,parameterType:string,description:上传参数,图片上传时,用于计算上传路径} + * @editorparams {name:exportparams,parameterType:string,description:下载参数,图片下载时,用于计算下载路径} + * @editorparams {name:osscat,parameterType:string,description:用于计算上传和下载路径的OSS参数} + * @editorparams {name:imgcompresslimit,parameterType:number,defaultvalue:1024,description:图片压缩范围(超过该范围进行压缩,单位kb)} + * @editorparams {name:imgcompressquality,parameterType:number,defaultvalue:0,description:图片压缩质量(0-1,为0时不压缩,默认为0)} + * @editorparams {name:imgcompressmaxwidth,parameterType:number,defaultvalue:1280,description:压缩图片最大宽度,默认为1280px} + * @editorparams {"name":"appentitytag","parameterType":"string","description":"在应用启用下载授权时,用于指定当前文件所属实体。该参数值会作为验证下载权限的依据。配置格式为(应用代码名称.实体代码名称),示例:mob.master"} + * @editorparams {"name":"datafieldtag","parameterType":"string","description":"在应用启用下载授权时,用于指定当前文件所关联的数据属性。完成配置后,将自动从容器数据(涵盖表单数据、表格行数据、面板数据)、上下文环境以及视图参数中获取该属性的实际值,将其作为验证下载权限的依据"} + * @editorparams {name:readonly,parameterType:boolean,defaultvalue:false,description:设置编辑器是否为只读态} * @ignoreprops autoFocus | overflowMode * @ignoreemits blur | focus | enter | infoTextChange */ @@ -41,7 +48,10 @@ export const IBizImageCropping = defineComponent({ const tempFile: Ref = ref(); // 是否阻止默认点击 - const result = c.editorParams?.STOPPROPAGATION !== 'false'; + let result = c.editorParams?.STOPPROPAGATION !== 'false'; + if (c.editorParams?.stoppropagation) { + result = c.editorParams.stoppropagation !== 'false'; + } const cropRect: IData = {}; @@ -50,11 +60,21 @@ export const IBizImageCropping = defineComponent({ cropareaWidth: Number(c.editorParams.cropWidth), }); } + if (c.editorParams?.cropwidth) { + Object.assign(cropRect, { + cropareaWidth: Number(c.editorParams.cropwidth), + }); + } if (c.editorParams?.cropHeight) { Object.assign(cropRect, { cropareaHeight: Number(c.editorParams.cropHeight), }); } + if (c.editorParams?.cropheight) { + Object.assign(cropRect, { + cropareaHeight: Number(c.editorParams.cropheight), + }); + } const { uploadUrl, headers, diff --git a/src/editor/upload/upload-editor.provider.ts b/src/editor/upload/upload-editor.provider.ts index 8b315c7840ed9d9dfe71010805200f8762b2afa0..6685ae407ff3e296405f91f41aee03d8c47a15f0 100644 --- a/src/editor/upload/upload-editor.provider.ts +++ b/src/editor/upload/upload-editor.provider.ts @@ -33,6 +33,7 @@ export class FileUploaderEditorProvider implements IEditorProvider { componentName = 'IBizImageSelect'; break; case 'MOBPICTURE_CROPPING': + case 'PICTURE_CROPPING': componentName = 'IBizImageCropping'; break; case 'CAROUSEL':