diff --git a/.github/workflows/Release.yml b/.github/workflows/Release.yml new file mode 100644 index 000000000..2e64ad8fe --- /dev/null +++ b/.github/workflows/Release.yml @@ -0,0 +1,77 @@ +name: Release + +on: + push: + tags: + - 'v*' + +jobs: + release: + if: github.repository == 'opentiny/tiny-engine' + runs-on: ubuntu-latest + permissions: + contents: write + id-token: write + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + with: + version: 9 + run_install: false + + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 18 + cache: 'pnpm' + registry-url: 'https://registry.npmjs.org' + + - name: Install dependencies + run: pnpm install + + - name: Run Build + run: pnpm run build:plugin && pnpm run build:alpha > build-alpha.log 2>&1 + + - name: Upload build logs + uses: actions/upload-artifact@v4 + with: + name: build-alpha-log + path: build-alpha.log + + - name: Parse Publish tag + id: parse_tag + run: | + tag_name="${GITHUB_REF#refs/tags/}" + if [[ "$tag_name" == *alpha* ]]; then + echo "dist_tag=alpha" >> "$GITHUB_OUTPUT" + elif [[ "$tag_name" == *beta* ]]; then + echo "dist_tag=beta" >> "$GITHUB_OUTPUT" + elif [[ "$tag_name" == *rc* ]]; then + echo "dist_tag=rc" >> "$GITHUB_OUTPUT" + else + echo "dist_tag=latest" >> "$GITHUB_OUTPUT" + fi + + - name: Verify clean working directory + run: | + if [[ -n "$(git status --porcelain)" ]]; then + echo "Working directory is not clean" + exit 1 + fi + + - name: Verify package version match tag + run: | + tag_name="${GITHUB_REF#refs/tags/}" + package_version=$(pnpm lerna list --scope=@opentiny/tiny-engine --json | jq -r '.[0].version') + if [[ "$tag_name" != "v$package_version" ]]; then + echo "Tag name $tag_name does not match package version $package_version" + exit 1 + fi + + - name: Publish package to npm + run: pnpm lerna publish from-package --dist-tag ${{steps.parse_tag.outputs.dist_tag}} --yes + env: + NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} diff --git a/.github/workflows/push-check.yml b/.github/workflows/push-check.yml index 0acaab2bd..03d23d21c 100644 --- a/.github/workflows/push-check.yml +++ b/.github/workflows/push-check.yml @@ -4,40 +4,40 @@ on: push: branches: [] pull_request: - branches: [develop,main, refactor/develop] + branches: [develop, main, refactor/develop, release/*] jobs: push-check: - runs-on: ubuntu-latest # windows-latest || macos-latest - + runs-on: ubuntu-latest # windows-latest || macos-latest + steps: - - uses: actions/checkout@v4 - - name: Install pnpm - uses: pnpm/action-setup@v4 - with: - version: 9 - - uses: actions/setup-node@v4 - with: - node-version: 18 + - uses: actions/checkout@v4 + - name: Install pnpm + uses: pnpm/action-setup@v4 + with: + version: 9 + - uses: actions/setup-node@v4 + with: + node-version: 18 - - name: Install dependencies - run: pnpm i + - name: Install dependencies + run: pnpm i - - name: Get changed files - id: get_changed_files - uses: tj-actions/changed-files@v41 - with: - files: | - **.js - **.vue - **.jsx - - name: Run ESLint - run: npx eslint ${{steps.get_changed_files.outputs.all_changed_files}} - - name: Run Build - run: pnpm run build:plugin && pnpm run build:alpha > build-alpha.log 2>&1 + - name: Get changed files + id: get_changed_files + uses: tj-actions/changed-files@v41 + with: + files: | + **.js + **.vue + **.jsx + - name: Run ESLint + run: npx eslint ${{steps.get_changed_files.outputs.all_changed_files}} + - name: Run Build + run: pnpm run build:plugin && pnpm run build:alpha > build-alpha.log 2>&1 - - name: Upload build logs - uses: actions/upload-artifact@v4 - with: - name: build-alpha-log - path: build-alpha.log + - name: Upload build logs + uses: actions/upload-artifact@v4 + with: + name: build-alpha-log + path: build-alpha.log diff --git a/designer-demo/package.json b/designer-demo/package.json index 4227e1722..f39d5ae22 100644 --- a/designer-demo/package.json +++ b/designer-demo/package.json @@ -1,7 +1,7 @@ { "name": "designer-demo", "private": true, - "version": "2.0.0", + "version": "2.1.0", "type": "module", "scripts": { "dev": "cross-env VITE_THEME=light vite", diff --git a/mockServer/package.json b/mockServer/package.json index 4ed5473c3..dfac7ce03 100644 --- a/mockServer/package.json +++ b/mockServer/package.json @@ -1,6 +1,6 @@ { "name": "@opentiny/tiny-engine-mock", - "version": "2.0.0", + "version": "2.1.0", "publishConfig": { "access": "public" }, diff --git a/packages/block-compiler/package.json b/packages/block-compiler/package.json index 923c956f3..a23b78d33 100644 --- a/packages/block-compiler/package.json +++ b/packages/block-compiler/package.json @@ -1,6 +1,6 @@ { "name": "@opentiny/tiny-engine-block-compiler", - "version": "2.0.0-rc.2", + "version": "2.1.0", "publishConfig": { "access": "public" }, @@ -27,7 +27,6 @@ "author": "OpenTiny Team", "license": "MIT", "homepage": "https://opentiny.design/tiny-engine", - "dependencies": {}, "devDependencies": { "@esbuild-plugins/node-globals-polyfill": "^0.2.3", "@esbuild-plugins/node-modules-polyfill": "^0.2.2", @@ -43,7 +42,7 @@ "peerDependencies": { "@babel/core": "^7.26.0", "@vue/babel-plugin-jsx": "^1.2.5", - "vue": "^3.4.15", - "@vue/compiler-sfc": "^3.4.15" + "@vue/compiler-sfc": "^3.4.15", + "vue": "^3.4.15" } } diff --git a/packages/block-compiler/src/index.ts b/packages/block-compiler/src/index.ts index 3c537e63f..6f2c340d8 100644 --- a/packages/block-compiler/src/index.ts +++ b/packages/block-compiler/src/index.ts @@ -58,7 +58,7 @@ export interface IResultMap { [key: string]: compiledItem } -const resolveRelativeImport = (code: string, globalGetterName = 'getBlockComponentBlobUrl') => { +const resolveRelativeImport = (code: string, globalGetterName = 'loadBlockComponent') => { const magicStr = new MagicString(code) const ast = babelParse(code, { sourceType: 'module', plugins: ['jsx'] }).program.body @@ -86,7 +86,7 @@ const resolveRelativeImport = (code: string, globalGetterName = 'getBlockCompone // 声明异步组件 const Block = defineAsyncComponent(() => import(getBlockUrl(Block))) magicStr.appendLeft( node.start!, - `const ${defaultImportId} = defineAsyncComponent(() => import(window.${globalGetterName}('${fileName}')))` + `const ${defaultImportId} = defineAsyncComponent(() => window.${globalGetterName}('${fileName}'))` ) // 移除 import Block from './Block.vue' 语句 diff --git a/packages/blockToWebComponentTemplate/package.json b/packages/blockToWebComponentTemplate/package.json index 732431244..5c6104fcf 100644 --- a/packages/blockToWebComponentTemplate/package.json +++ b/packages/blockToWebComponentTemplate/package.json @@ -1,6 +1,6 @@ { "name": "@opentiny/tiny-engine-block-build", - "version": "2.0.0", + "version": "2.1.0", "description": "translate block to webcomponent template", "main": "./dist/web-components.es.js", "type": "module", diff --git a/packages/build/vite-config/package.json b/packages/build/vite-config/package.json index cde773dd4..654ed3461 100644 --- a/packages/build/vite-config/package.json +++ b/packages/build/vite-config/package.json @@ -1,6 +1,6 @@ { "name": "@opentiny/tiny-engine-vite-config", - "version": "2.0.0", + "version": "2.1.0", "description": "", "type": "module", "main": "./index.js", diff --git a/packages/build/vite-plugin-meta-comments/package.json b/packages/build/vite-plugin-meta-comments/package.json index 9fe3c8d5f..2853da54c 100644 --- a/packages/build/vite-plugin-meta-comments/package.json +++ b/packages/build/vite-plugin-meta-comments/package.json @@ -1,6 +1,6 @@ { "name": "@opentiny/tiny-engine-vite-plugin-meta-comments", - "version": "2.0.0", + "version": "2.1.0", "description": "", "type": "module", "main": "dist/index.cjs", diff --git a/packages/builtinComponent/package.json b/packages/builtinComponent/package.json index 5ce300444..3869da894 100644 --- a/packages/builtinComponent/package.json +++ b/packages/builtinComponent/package.json @@ -1,6 +1,6 @@ { "name": "@opentiny/tiny-engine-builtin-component", - "version": "2.0.0", + "version": "2.1.0", "description": "", "main": "dist/index.mjs", "module": "dist/index.mjs", diff --git a/packages/canvas/DesignCanvas/src/DesignCanvas.vue b/packages/canvas/DesignCanvas/src/DesignCanvas.vue index 295c6fde6..bb34022cd 100644 --- a/packages/canvas/DesignCanvas/src/DesignCanvas.vue +++ b/packages/canvas/DesignCanvas/src/DesignCanvas.vue @@ -96,10 +96,11 @@ export default { // 1. 页面或区块状态是未保存状态(尝试编辑) // 2. 页面刷新或第一次进入页面(含从别的页面或区块切换到别的页面或区块) // 3. 页面上已经有弹窗,不允许重复弹窗 + // 4. 当前历史堆栈为0,且当前未保存状态和上一次未保存状态不一致,不重复弹窗 const showConfirm = !isSaved || pageSchema !== oldPageSchema - if (!showConfirm || showModal) { + if (!showConfirm || showModal || (useHistory().historyState?.index === 0 && isSaved !== oldIsSaved)) { return } diff --git a/packages/canvas/DesignCanvas/src/api/useCanvas.js b/packages/canvas/DesignCanvas/src/api/useCanvas.js index beebdc405..6048b11c9 100644 --- a/packages/canvas/DesignCanvas/src/api/useCanvas.js +++ b/packages/canvas/DesignCanvas/src/api/useCanvas.js @@ -140,6 +140,7 @@ const resetCanvasState = async (state = {}) => { const diffPatch = jsonDiffPatchInstance.diff(previousSchema, pageState.pageSchema) + canvasApi.value?.clearSelect?.() publish({ topic: 'schemaImport', data: { current: pageState.pageSchema, previous: previousSchema, diffPatch } }) } @@ -297,15 +298,18 @@ const operationTypeMap = { } } - if (position === 'after') { + if (position === 'before') { + parentNode.children.unshift(newNodeData) + } else { parentNode.children.push(newNodeData) - setNode(newNodeData, parentNode) + } - // 递归构建 nodeMap - if (Array.isArray(newNodeData?.children) && newNodeData.children.length) { - const newNode = getNode(newNodeData.id) - generateNodesMap(newNodeData.children, newNode) - } + setNode(newNodeData, parentNode) + + // 递归构建 nodeMap + if (Array.isArray(newNodeData?.children) && newNodeData.children.length) { + const newNode = getNode(newNodeData.id) + generateNodesMap(newNodeData.children, newNode) } return { @@ -555,6 +559,7 @@ export default function () { setSaved, clearCanvas, getPageSchema, + resetCanvasState, resetPageCanvasState, resetBlockCanvasState, clearCurrentState, diff --git a/packages/canvas/common/src/utils.js b/packages/canvas/common/src/utils.js index cd2731230..b6ad2502a 100644 --- a/packages/canvas/common/src/utils.js +++ b/packages/canvas/common/src/utils.js @@ -62,7 +62,8 @@ export const copyObject = (node) => { */ export const dynamicImportComponents = async ({ package: pkg, script, components }) => { if (!script) return - const scriptUrl = script.startsWith('.') ? new URL(script, location.href).href : script + const href = window.parent.location.href || location.href; // 这里要取父窗口的地址,因为在iframe中href是about:srcdoc + const scriptUrl = script.startsWith('.') ? new URL(script, href).href : script if (!window.TinyComponentLibs[pkg]) { const modules = await import(/* @vite-ignore */ scriptUrl) diff --git a/packages/canvas/container/src/components/CanvasAction.vue b/packages/canvas/container/src/components/CanvasAction.vue index da3b3809d..651e34793 100644 --- a/packages/canvas/container/src/components/CanvasAction.vue +++ b/packages/canvas/container/src/components/CanvasAction.vue @@ -253,7 +253,6 @@ export default { const findParentHasClass = (target) => { let parent = target.parentNode - let flag = false if (parent.className === undefined) { return false @@ -261,13 +260,13 @@ export default { let name = JSON.stringify(parent.className) - if (name && name.indexOf('short-cut-set') === -1 && name.indexOf('tiny-dialog-box') === -1) { - flag = findParentHasClass(parent) - } else { - flag = true + const preventClassNameList = ['short-cut-set', 'tiny-dialog-box', 'icon-popover', 'i18n-input-popover'] + + if (preventClassNameList.some((item) => name?.includes(item))) { + return true } - return flag + return findParentHasClass(parent) } const onMousedown = (event, horizontal, vertical) => { diff --git a/packages/canvas/container/src/components/CanvasResize.vue b/packages/canvas/container/src/components/CanvasResize.vue index 68a11894d..87da4c0cc 100644 --- a/packages/canvas/container/src/components/CanvasResize.vue +++ b/packages/canvas/container/src/components/CanvasResize.vue @@ -11,7 +11,7 @@ diff --git a/packages/common/component/BlockLinkField.vue b/packages/common/component/BlockLinkField.vue index f369efe74..71d4235e9 100644 --- a/packages/common/component/BlockLinkField.vue +++ b/packages/common/component/BlockLinkField.vue @@ -65,7 +65,6 @@ export default { confirm({ title: '属性名称', - status: 'custom', message: { render() { return ( diff --git a/packages/common/component/ButtonGroup.vue b/packages/common/component/ButtonGroup.vue index 81d65c995..f55498c36 100644 --- a/packages/common/component/ButtonGroup.vue +++ b/packages/common/component/ButtonGroup.vue @@ -8,12 +8,25 @@ .button-group { display: grid; grid-auto-flow: column; - column-gap: 8px; + column-gap: 4px; align-items: center; :deep(.svg-button), :deep(.tiny-button) { margin: 0; } + :deep(.tiny-button) { + padding: 0; + min-width: 40px; + } + :deep(.tiny-button + .svg-button) { + margin-left: 4px; + } + :deep(.tiny-button + .tiny-button) { + margin-left: 8px; + } + :deep(.tiny-button.tiny-button.tiny-button--default) { + border-color: var(--te-common-border-secondary); + } } diff --git a/packages/common/component/ConfigItem.vue b/packages/common/component/ConfigItem.vue index 040026780..a365cda2e 100644 --- a/packages/common/component/ConfigItem.vue +++ b/packages/common/component/ConfigItem.vue @@ -600,6 +600,11 @@ export default { :deep(.tiny-select .tiny-input__inner) { padding-right: 26px; } + :deep(.tiny-input-suffix) { + .tiny-input__inner { + padding-right: 28px; + } + } } .prop-description { diff --git a/packages/common/component/I18nInput.vue b/packages/common/component/I18nInput.vue index a155923a1..137fc3287 100644 --- a/packages/common/component/I18nInput.vue +++ b/packages/common/component/I18nInput.vue @@ -26,7 +26,7 @@ @@ -38,7 +38,7 @@ import { computed, ref, watchEffect } from 'vue' import { useTranslate } from '@opentiny/tiny-engine-meta-register' import { Input, Popover } from '@opentiny/vue' -import { IconClose, IconLanguage } from '@opentiny/vue-icon' +import { IconClose } from '@opentiny/vue-icon' import BindI18n from './BindI18n.vue' export default { @@ -47,8 +47,7 @@ export default { TinyInput: Input, BindI18n, TinyPopover: Popover, - IconClose: IconClose(), - IconLanguage: IconLanguage() + IconClose: IconClose() }, inheritAttrs: false, props: { @@ -139,6 +138,9 @@ export default { right: 0; } } +.icon-language { + color: var(--te-common-icon-secondary); +} diff --git a/packages/common/component/MetaCodeEditor.vue b/packages/common/component/MetaCodeEditor.vue index d7f86934f..c92de3a62 100644 --- a/packages/common/component/MetaCodeEditor.vue +++ b/packages/common/component/MetaCodeEditor.vue @@ -255,7 +255,8 @@ export default { minimap: { enabled: false } - } + }, + locale } } } @@ -266,7 +267,7 @@ export default { width: 100%; display: flex; text-align: center; - .tiny-button.edit-btn { + .tiny-button.tiny-button.edit-btn { color: var(--te-common-text-primary); border-color: var(--te-common-border-default); flex: 1; @@ -290,6 +291,7 @@ export default { .btn-box { display: flex; justify-content: flex-end; + width: 100%; &:has(.format-btn) { justify-content: space-between; } @@ -303,6 +305,7 @@ export default { height: 24px; padding: 4px; padding-left: 10px; + padding-right: 12px; border: 1px solid var(--ti-lowcode-meta-codeEditor-border-color); border-radius: var(--te-base-border-radius-1); diff --git a/packages/common/component/MetaListItem.vue b/packages/common/component/MetaListItem.vue index 332baf51c..1f3b59f06 100644 --- a/packages/common/component/MetaListItem.vue +++ b/packages/common/component/MetaListItem.vue @@ -61,9 +61,6 @@ @update:visible="isShow = $event" > - - - 确定删除吗? diff --git a/packages/common/component/MonacoEditor.vue b/packages/common/component/MonacoEditor.vue index 8c6fc8582..42e94833a 100644 --- a/packages/common/component/MonacoEditor.vue +++ b/packages/common/component/MonacoEditor.vue @@ -6,16 +6,21 @@
-
+
- + - + - + @@ -28,6 +33,7 @@ :options="editorOptions" language="javascript" @editorDidMount="$emit('editorDidMount', $event)" + @change="$emit('change', $event)" >
@@ -39,6 +45,8 @@ import { computed, ref, onActivated, onDeactivated } from 'vue' import { Tooltip } from '@opentiny/vue' import PublicIcon from './PublicIcon.vue' import VueMonaco from './VueMonaco.vue' +import { constants } from '@opentiny/tiny-engine-utils' +const { OPEN_DELAY } = constants export default { components: { @@ -60,8 +68,8 @@ export default { default: true } }, - emits: ['editorDidMount'], - setup(props) { + emits: ['editorDidMount', 'change', 'fullscreenChange'], + setup(props, { emit }) { const editor = ref(null) const fullscreen = ref(false) const editorOptions = computed(() => { @@ -112,6 +120,7 @@ export default { const switchFullScreen = (value) => { fullscreen.value = value + emit('fullscreenChange', value) } return { @@ -122,7 +131,8 @@ export default { fullscreen, switchFullScreen, getValue, - formatCode + formatCode, + OPEN_DELAY } } } @@ -140,7 +150,7 @@ export default { top: var(--base-top-panel-height); bottom: 0; left: calc(var(--base-nav-panel-width) + var(--base-left-panel-width)); - right: var(--base-left-panel-width); + right: var(--base-right-panel-width); z-index: 100; padding: 10px 16px 16px 16px; background-color: var(--ti-lowcode-common-component-bg); @@ -164,7 +174,7 @@ export default { color: var(--te-common-icon-secondary); } } - .fullscreen { + .engine-fullscreen { display: flex; margin-right: 20px; } diff --git a/packages/common/component/PluginBlockList.vue b/packages/common/component/PluginBlockList.vue index c1f34c5ee..071f6f284 100644 --- a/packages/common/component/PluginBlockList.vue +++ b/packages/common/component/PluginBlockList.vue @@ -53,14 +53,14 @@
@@ -74,12 +74,12 @@ @@ -205,7 +205,7 @@ export default { emits: ['click', 'iconClick', 'add', 'deleteBlock', 'openVersionPanel', 'editBlock', 'checkAll', 'cancelCheckAll'], setup(props, { emit }) { const panelState = inject('panelState', {}) - const blockUsers = inject('blockUsers') + const blockUsers = inject('blockUsers', []) const state = reactive({ activeIndex: -1, data: computed(() => props.data), @@ -741,19 +741,12 @@ export default { box-sizing: border-box; cursor: pointer; &:hover { - background-color: var(--ti-lowcode-component-block-setting-item-hover-bg); color: var(--ti-lowcode-common-primary-text-color); } .list-item-icon { font-size: 14px; color: var(--te-common-icon-secondary); } - .list-item-svg { - color: var(--te-common-icon-secondary); - } - .list-item-svg:hover { - background-color: var(--ti-lowcode-component-block-setting-item-hover-bg); - } } } diff --git a/packages/common/component/PluginPanel.vue b/packages/common/component/PluginPanel.vue index cf0fb240f..297ef4fd2 100644 --- a/packages/common/component/PluginPanel.vue +++ b/packages/common/component/PluginPanel.vue @@ -108,7 +108,10 @@ export default { align-items: center; :deep(.svg-button + .svg-button) { - margin: 0; + margin-left: 4px; + } + :deep(.svg-button + .icon-wrap) { + margin-left: 4px; } } } diff --git a/packages/common/component/PluginSetting.vue b/packages/common/component/PluginSetting.vue index b822f87b1..37e50e972 100644 --- a/packages/common/component/PluginSetting.vue +++ b/packages/common/component/PluginSetting.vue @@ -9,16 +9,17 @@
-
- - - {{ getFullScreenLabel(state.isFullScreen) }} -
- 保存 - - {{ iconButtonText }} - - + + 保存 + + {{ iconButtonText }} + +
+ + +
+ +
@@ -32,7 +33,9 @@ @@ -52,20 +45,19 @@ export default { .svg-wrap { position: relative; - .dots { + + .dot { + position: absolute; width: 6px; height: 6px; background: var(--ti-lowcode-toolbar-dot-color); border-radius: 50%; - display: inline-block; - position: absolute; - top: -2px; - right: -2px; + top: -3px; + right: 2px; z-index: 100; } -} - -.save-title { - margin: 0 6px; + .svg-icon.svg-icon.svg-icon { + color: var(--te-common-icon-primary); + } } diff --git a/packages/common/component/toolbar-built-in/ToolbarBaseIcon.vue b/packages/common/component/toolbar-built-in/ToolbarBaseIcon.vue index b763a5059..2404f3903 100644 --- a/packages/common/component/toolbar-built-in/ToolbarBaseIcon.vue +++ b/packages/common/component/toolbar-built-in/ToolbarBaseIcon.vue @@ -8,7 +8,7 @@ > + + diff --git a/packages/engine-cli/template/designer/src/composable/http/index.js b/packages/engine-cli/template/designer/src/composable/http/index.js index 26b7edae7..f11538395 100644 --- a/packages/engine-cli/template/designer/src/composable/http/index.js +++ b/packages/engine-cli/template/designer/src/composable/http/index.js @@ -1,36 +1,135 @@ +import { createApp } from 'vue' import { HttpService } from '@opentiny/tiny-engine' +import { useBroadcastChannel } from '@vueuse/core' +import { constants } from '@opentiny/tiny-engine-utils' +import Login from './Login.vue' + +const LOGIN_EXPIRED_CODE = 401 +const { BROADCAST_CHANNEL } = constants + +const { post: globalNotify } = useBroadcastChannel({ name: BROADCAST_CHANNEL.Notify }) + +const procession = { + promiseLogin: null, + mePromise: {} +} +let loginVM = null + +const showError = (url, message) => { + globalNotify({ + type: 'error', + title: '接口报错', + message: `报错接口: ${url} \n报错信息: ${message ?? ''}` + }) +} const preRequest = (config) => { + const isDevelopEnv = import.meta.env.MODE?.includes('dev') + + if (isDevelopEnv && config.url.match(/\/generate\//)) { + config.baseURL = '' + } + + const isVsCodeEnv = window.vscodeBridge + + if (isVsCodeEnv) { + config.baseURL = '' + } + return config } const preResponse = (res) => { + if (res.data?.error) { + showError(res.config?.url, res?.data?.error?.message) + + return Promise.reject(res.data.error) + } + return res.data?.data } +const openLogin = () => { + if (!window.lowcode) { + const loginDom = document.createElement('div') + document.body.appendChild(loginDom) + loginVM = createApp(Login).mount(loginDom) + + window.lowcode = { + platformCenter: { + Session: { + rebuiltCallback: function () { + loginVM.closeLogin() + + procession.mePromise.resolve('login ok') + procession.promiseLogin = null + procession.mePromise = {} + } + } + } + } + } + + return new Promise((resolve, reject) => { + if (!procession.promiseLogin) { + procession.promiseLogin = loginVM.openLogin(procession, '/api/rebuildSession') + procession.promiseLogin.then((response) => { + HttpService.apis.request(response.config).then(resolve, reject) + }) + } + }) +} + const errorResponse = (error) => { - return Promise.reject(error.message) + // 用户信息失效时,弹窗提示登录 + const { response } = error + + if (response?.status === LOGIN_EXPIRED_CODE) { + // vscode 插件环境弹出输入框提示登录 + if (window.vscodeBridge) { + return Promise.resolve(true) + } + + // 浏览器环境弹出小窗登录 + if (response?.headers['x-login-url']) { + return openLogin() + } + } + + showError(error.config?.url, error?.message) + + return response?.data.error ? Promise.reject(response.data.error) : Promise.reject(error.message) } const getConfig = (env = import.meta.env) => { + const baseURL = env.VITE_ORIGIN + // 仅在本地开发时,启用 withCredentials + const dev = env.MODE?.includes('dev') + // 获取租户 id + const getTenant = () => new URLSearchParams(location.search).get('tenant') + return { - baseURL: env.VITE_ORIGIN, + baseURL, + withCredentials: dev, headers: { - 'x-lowcode-mode': env.MODE + ...(dev && { 'x-lowcode-mode': 'develop' }), + 'x-lowcode-org': getTenant() } } } -const options = { - axiosConfig: getConfig(), - enableMock: false, - mockData: {}, - interceptors: { - request: [preRequest], - response: [[preResponse, errorResponse]] +const customizeHttpService = () => { + const options = { + axiosConfig: getConfig(), + interceptors: { + request: [preRequest], + response: [[preResponse, errorResponse]] + } } -} -HttpService.apis.setOptions(options) + HttpService.apis.setOptions(options) + + return HttpService +} -export default HttpService +export default customizeHttpService() diff --git a/packages/engine-cli/template/designer/src/preview.js b/packages/engine-cli/template/designer/src/preview.js index 4e120d4c6..eb7717c66 100644 --- a/packages/engine-cli/template/designer/src/preview.js +++ b/packages/engine-cli/template/designer/src/preview.js @@ -14,6 +14,7 @@ import { initHook, HOOK_NAME, GenerateCodeService, Breadcrumb, Media, Lang } fro import { initPreview } from '@opentiny/tiny-engine' import 'virtual:svg-icons-register' import '@opentiny/tiny-engine-theme' +import { HttpService } from './composable' const beforeAppCreate = () => { initHook(HOOK_NAME.useEnv, import.meta.env) @@ -23,7 +24,7 @@ initPreview({ registry: { root: { id: 'engine.root', - metas: [GenerateCodeService] + metas: [HttpService, GenerateCodeService] }, config: { id: 'engine.config', theme: 'light' }, toolbars: [Breadcrumb, Media, Lang] diff --git a/packages/i18n/package.json b/packages/i18n/package.json index 08549005b..6b12b4595 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -1,6 +1,6 @@ { "name": "@opentiny/tiny-engine-i18n-host", - "version": "2.0.0", + "version": "2.1.0", "publishConfig": { "access": "public" }, diff --git a/packages/layout/package.json b/packages/layout/package.json index f699c3e1b..3e905a9a8 100644 --- a/packages/layout/package.json +++ b/packages/layout/package.json @@ -1,6 +1,6 @@ { "name": "@opentiny/tiny-engine-layout", - "version": "2.0.0", + "version": "2.1.0", "scripts": { "build": "vite build" }, diff --git a/packages/layout/src/DesignPlugins.vue b/packages/layout/src/DesignPlugins.vue index 27b7c9ee6..19adc16b3 100644 --- a/packages/layout/src/DesignPlugins.vue +++ b/packages/layout/src/DesignPlugins.vue @@ -257,7 +257,7 @@ export default { &.bottom { flex: 1; - padding-bottom: 20px; + padding-bottom: 28px; } .list-item { diff --git a/packages/layout/src/DesignSettings.vue b/packages/layout/src/DesignSettings.vue index c79bcaeda..7a5aada53 100644 --- a/packages/layout/src/DesignSettings.vue +++ b/packages/layout/src/DesignSettings.vue @@ -2,7 +2,7 @@
- +
@@ -15,14 +15,15 @@ diff --git a/packages/plugins/datasource/src/DataSourceList.vue b/packages/plugins/datasource/src/DataSourceList.vue index 566ea8154..bed1f7f52 100644 --- a/packages/plugins/datasource/src/DataSourceList.vue +++ b/packages/plugins/datasource/src/DataSourceList.vue @@ -8,12 +8,13 @@ >
- + {{ item.name }}
@@ -161,23 +163,14 @@ export default { align-items: center; } .plugin-icon-data { + color: var(--te-common-icon-secondary); margin-right: 8px; - width: 18px; } } .item-handler { height: 24px; line-height: 24px; display: none; - .svg-button { - width: 16px; - height: 16px; - margin-top: 6px; - color: var(--ti-lowcode-datasource-toolbar-more-hover-color); - &:hover { - color: var(--ti-lowcode-toolbar-icon-color); - } - } } } } diff --git a/packages/plugins/datasource/src/DataSourceRecordList.vue b/packages/plugins/datasource/src/DataSourceRecordList.vue index 48008ea1f..a00c1b1b0 100644 --- a/packages/plugins/datasource/src/DataSourceRecordList.vue +++ b/packages/plugins/datasource/src/DataSourceRecordList.vue @@ -597,12 +597,14 @@ export default { } } .download { - margin: 0 12px; - text-decoration: underline; + text-decoration: none; display: inline-block; font-size: 12px; text-align: left; padding: 0; + &:hover { + text-decoration: underline; + } color: var(--te-common-text-primary); .icon-download { margin: 0 1px 4px 0; @@ -633,6 +635,7 @@ export default { align-items: center; .svg-icon { margin-right: 10px; + color: var(--te-common-icon-secondary); } } } diff --git a/packages/plugins/datasource/src/DataSourceRemoteAutoload.vue b/packages/plugins/datasource/src/DataSourceRemoteAutoload.vue index 628b22f6f..e04c69d66 100644 --- a/packages/plugins/datasource/src/DataSourceRemoteAutoload.vue +++ b/packages/plugins/datasource/src/DataSourceRemoteAutoload.vue @@ -39,14 +39,12 @@ export default { diff --git a/packages/plugins/datasource/src/DataSourceRemoteDataResult.vue b/packages/plugins/datasource/src/DataSourceRemoteDataResult.vue index e15f0e9c0..c510c6e94 100644 --- a/packages/plugins/datasource/src/DataSourceRemoteDataResult.vue +++ b/packages/plugins/datasource/src/DataSourceRemoteDataResult.vue @@ -89,12 +89,11 @@ export default { .response-data { position: relative; .resonse-header { - padding: 10px; - margin-bottom: 16px; + margin-bottom: 12px; .life-cycle-alert { - font-size: 11px; - color: var(--ti-lowcode-datasource-tip-color); + font-size: var(--te-base-font-size-base); + color: var(--te-common-text-weaken); } .title { color: var(--ti-lowcode-datasource-toolbar-breadcrumb-color); @@ -116,7 +115,10 @@ export default { z-index: 9999; .tiny-button { border-radius: 4px; - border-color: var(--te-common-border-default); + border-color: var(--te-common-border-secondary); + & + .tiny-button { + margin-left: 4px; + } } } diff --git a/packages/plugins/datasource/src/DataSourceRemoteForm.vue b/packages/plugins/datasource/src/DataSourceRemoteForm.vue index fe2f01614..174d5fda5 100644 --- a/packages/plugins/datasource/src/DataSourceRemoteForm.vue +++ b/packages/plugins/datasource/src/DataSourceRemoteForm.vue @@ -113,7 +113,8 @@ export default { } :deep(.border-input) { input { - border-radius: 0; + border-top-left-radius: 0; + border-bottom-left-radius: 0; border-left: none; } } diff --git a/packages/plugins/datasource/src/DataSourceRemotePanel.vue b/packages/plugins/datasource/src/DataSourceRemotePanel.vue index 6d4d4f580..99a6f7fef 100644 --- a/packages/plugins/datasource/src/DataSourceRemotePanel.vue +++ b/packages/plugins/datasource/src/DataSourceRemotePanel.vue @@ -251,7 +251,6 @@ export default { color: var(--ti-lowcode-datasource-toolbar-breadcrumb-color); } .send { - margin-bottom: 14px; } .tip-dot { padding-left: 4px; @@ -271,16 +270,11 @@ export default { :deep(.send-service) { text-align: right; border-top: 1px solid var(--ti-lowcode-datasource-tabs-border-color); - padding: 20px 10px; - margin-bottom: 10px; + padding: 12px 0px 0px; .use-service { text-align: left; padding-top: 5px; - - div { - margin-bottom: 5px; - } } .title { @@ -301,10 +295,28 @@ export default { overflow-y: scroll; :deep(.tiny-tabs.tiny-tabs--button-card .tiny-tabs__item) { border-radius: 4px; + &:hover { + color: var(--te-common-text-primary); + } } :deep(.tiny-tabs__content) { margin: 12px 0; } + :deep(.is-active) { + .tiny-tabs__item__title { + color: var(--te-common-text-primary); + } + } + } + :deep(.tiny-collapse) { + .tiny-collapse-item:first-child { + border-top: 0; + } + .tiny-collapse-item__header { + .tiny-collapse-item__word-overflow { + margin: var(--te-common-vertical-item-spacing-normal) 0px 0; + } + } } } } diff --git a/packages/plugins/datasource/src/Main.vue b/packages/plugins/datasource/src/Main.vue index 2f4771218..23e49fbcf 100644 --- a/packages/plugins/datasource/src/Main.vue +++ b/packages/plugins/datasource/src/Main.vue @@ -5,13 +5,13 @@ @@ -146,12 +146,6 @@ export default { } diff --git a/packages/plugins/materials/src/meta/block/src/BlockGroupFilters.vue b/packages/plugins/materials/src/meta/block/src/BlockGroupFilters.vue index 58520ed59..db5706368 100644 --- a/packages/plugins/materials/src/meta/block/src/BlockGroupFilters.vue +++ b/packages/plugins/materials/src/meta/block/src/BlockGroupFilters.vue @@ -5,9 +5,9 @@
{ + return props.filters.reduce( (result, filter) => ({ ...result, [filter.id]: [] }), {} ) + } + + const state = reactive({ + // filterValues 是一个对象。key 为 filter id,value 为选中的值,是一个数组 + filterValues: initFilterValues() }) // 不同的filter,值所在的字段可能是id或者name。这里把实际的值都映射到value字段 @@ -79,16 +83,14 @@ export default { ) }) - const getFilters = (checked, id) => { - filters[id] = checked - - emit('search', null, filters) + const handleValueChange = () => { + emit('search', state.filterValues) } return { state, selectOptions, - getFilters + handleValueChange } } } diff --git a/packages/plugins/materials/src/meta/block/src/BlockGroupPanel.vue b/packages/plugins/materials/src/meta/block/src/BlockGroupPanel.vue index 0869591a9..1a1380512 100644 --- a/packages/plugins/materials/src/meta/block/src/BlockGroupPanel.vue +++ b/packages/plugins/materials/src/meta/block/src/BlockGroupPanel.vue @@ -1,22 +1,20 @@