Commit f771a7e7 authored by rockyl's avatar rockyl

内容太多,懒得写

parent 480c0363
...@@ -6,9 +6,9 @@ ...@@ -6,9 +6,9 @@
import {fetchApi} from "./common"; import {fetchApi} from "./common";
export async function fetchAll(currentPage, pageSize) { export async function fetchAll(currentPage, pageSize, onlyMine) {
return await fetchApi('/api/project/query', { return await fetchApi('/api/project/query', {
params: {currentPage, pageSize,}, params: {currentPage, pageSize, isAll: onlyMine ? 0 : 1},
errMessage: 'Failed to fetch projects', errMessage: 'Failed to fetch projects',
}) })
} }
...@@ -45,6 +45,14 @@ export async function fetchOne(id) { ...@@ -45,6 +45,14 @@ export async function fetchOne(id) {
}) })
} }
export async function fetchHistory(id, currentPage, pageSize) {
return await fetchApi('/api/project/history', {
params: {id, currentPage, pageSize},
method: 'get',
errMessage: 'Failed to history',
})
}
export async function saveOne(project) { export async function saveOne(project) {
return await fetchApi('/api/project/update', { return await fetchApi('/api/project/update', {
params: project, params: project,
......
// import { set, lensPath } from 'ramda';
import properties from '../../../utils/properties';
export default {
component: require('./index.vue'),
properties: {
...properties.node,
...properties.textinput
},
props: {
type: 'textinput'
},
title: 'textinput'
};
<template>
<div
class="zero-custom-text"
:class="showPlaceholder && 'placeholder'"
v-html="addNBSP + selfText"
></div>
</template>
<style>
.zero-custom-text.placeholder:after {
content: '请输入';
font-style: italic;
font-size: 12px;
}
</style>
<script>
export default {
name: 'customLabel',
props: {
properties: {
type: Object,
default: () => {}
},
isTyping: Boolean
},
data() {
return {
};
},
computed: {
showPlaceholder() {
return (
!this.isTyping &&
typeof this.properties.text !== 'undefined' &&
!this.properties.text.replace(/\s|(&nbsp;)/g, '')
);
},
addNBSP() {
return this.selfText.replace(/\s/g, '') ? '' : '&nbsp;';
},
selfText() {
return this.properties.text || '文字';
}
}
};
</script>
...@@ -32,6 +32,7 @@ export const fileTypeIcon = { ...@@ -32,6 +32,7 @@ export const fileTypeIcon = {
'.json': 'file-text', '.json': 'file-text',
'.zip': 'file-zip', '.zip': 'file-zip',
'.fnt': 'file-font', '.fnt': 'file-font',
'.mp3': 'file-music',
'.jpg': 't', '.jpg': 't',
'.jpeg': 't', '.jpeg': 't',
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
"Exit": "Exit", "Exit": "Exit",
"Props": "Props", "Props": "Props",
"Behavior": "Behavior", "Behavior": "Behavior",
"Only mine": "Only mine",
"Add": "Add", "Add": "Add",
"Delete": "Delete", "Delete": "Delete",
"Delete all": "Delete all", "Delete all": "Delete all",
...@@ -24,6 +25,7 @@ ...@@ -24,6 +25,7 @@
"Edit": "Edit", "Edit": "Edit",
"EditEnv": "EditEnv", "EditEnv": "EditEnv",
"EditCustomModule": "EditCustomModule", "EditCustomModule": "EditCustomModule",
"Script": "Script",
"ID": "ID", "ID": "ID",
"Name": "Name", "Name": "Name",
"Alias": "Alias", "Alias": "Alias",
...@@ -80,6 +82,12 @@ ...@@ -80,6 +82,12 @@
"Env editor": "Env editor", "Env editor": "Env editor",
"As inline": "As inline", "As inline": "As inline",
"Project": "Project", "Project": "Project",
"Missing behavior": "Missing behavior",
"Input event name": "Input event name",
"Invalid event name": "Invalid event name",
"Event name exists": "Event name exists",
"Builtin event should add directly": "Builtin event should add directly",
"Rename event": "Rename event",
"Env constant": "Env constant", "Env constant": "Env constant",
"Custom module": "Custom module", "Custom module": "Custom module",
"Copy template to clipboard": "Copy template to clipboard", "Copy template to clipboard": "Copy template to clipboard",
...@@ -97,6 +105,7 @@ ...@@ -97,6 +105,7 @@
"Fetching projects": "Fetching projects…", "Fetching projects": "Fetching projects…",
"Failed to fetch env": "Failed to fetch env", "Failed to fetch env": "Failed to fetch env",
"Failed to fetch projects": "Failed to fetch projects", "Failed to fetch projects": "Failed to fetch projects",
"Failed to fetch history": "Failed to fetch history",
"Failed to fetch project": "Failed to fetch project", "Failed to fetch project": "Failed to fetch project",
"Failed to create project": "Failed to create project", "Failed to create project": "Failed to create project",
"Failed to duplicate project": "Failed to duplicate project", "Failed to duplicate project": "Failed to duplicate project",
...@@ -111,6 +120,7 @@ ...@@ -111,6 +120,7 @@
"Remote Version": "Remote Version", "Remote Version": "Remote Version",
"Confirm to exit the editor": "Confirm to exit the editor?", "Confirm to exit the editor": "Confirm to exit the editor?",
"Confirm to publish": "Confirm to publish?", "Confirm to publish": "Confirm to publish?",
"Are you sure to delete it's process": "Are you sure to delete it's process",
"Are you sure to delete this asset": "Are you sure to delete this asset", "Are you sure to delete this asset": "Are you sure to delete this asset",
"Are you sure to delete all assets": "Are you sure to delete all assets", "Are you sure to delete all assets": "Are you sure to delete all assets",
"Are you sure to delete this item": "Are you sure to delete this item", "Are you sure to delete this item": "Are you sure to delete this item",
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
"Exit": "退出", "Exit": "退出",
"Props": "属性", "Props": "属性",
"Behavior": "行为", "Behavior": "行为",
"Only mine": "仅显示我的",
"Add": "添加", "Add": "添加",
"Delete": "删除", "Delete": "删除",
"Delete all": "删除全部", "Delete all": "删除全部",
...@@ -24,6 +25,7 @@ ...@@ -24,6 +25,7 @@
"Edit": "编辑", "Edit": "编辑",
"EditEnv": "编辑环境", "EditEnv": "编辑环境",
"EditCustomModule": "编辑自定义模块", "EditCustomModule": "编辑自定义模块",
"Script": "脚本",
"ID": "ID", "ID": "ID",
"Name": "名字", "Name": "名字",
"Alias": "别名", "Alias": "别名",
...@@ -53,6 +55,7 @@ ...@@ -53,6 +55,7 @@
"Saving": "保存中…", "Saving": "保存中…",
"Divider": "分流节点", "Divider": "分流节点",
"Custom": "自定义节点", "Custom": "自定义节点",
"Custom event": "自定义事件",
"Entry": "入口", "Entry": "入口",
"Packing": "打包", "Packing": "打包",
"Type": "类型", "Type": "类型",
...@@ -80,6 +83,15 @@ ...@@ -80,6 +83,15 @@
"Env editor": "环境编辑器", "Env editor": "环境编辑器",
"As inline": "作为内联", "As inline": "作为内联",
"Project": "项目", "Project": "项目",
"Missing behavior": "行为丢失",
"Add behavior": "添加行为",
"Edit trigger": "编辑触发",
"Delete trigger": "删除触发",
"Input event name": "输入事件名",
"Rename event": "事件重命名",
"Invalid event name": "无效的事件名",
"Event name exists": "事件名已存在",
"Builtin event should add directly": "内部事件请直接添加",
"Env constant": "自定义常量", "Env constant": "自定义常量",
"Custom module": "自定义模块", "Custom module": "自定义模块",
"Copy template to clipboard": "复制模板到粘贴板", "Copy template to clipboard": "复制模板到粘贴板",
...@@ -97,6 +109,7 @@ ...@@ -97,6 +109,7 @@
"Fetching projects": "获取项目列表…", "Fetching projects": "获取项目列表…",
"Failed to fetch env": "获取环境失败", "Failed to fetch env": "获取环境失败",
"Failed to fetch projects": "获取项目列表失败", "Failed to fetch projects": "获取项目列表失败",
"Failed to fetch history": "获取历史记录失败",
"Failed to fetch project": "获取项目失败", "Failed to fetch project": "获取项目失败",
"Failed to create project": "创建项目失败", "Failed to create project": "创建项目失败",
"Failed to duplicate project": "复制项目失败", "Failed to duplicate project": "复制项目失败",
...@@ -111,6 +124,7 @@ ...@@ -111,6 +124,7 @@
"Remote Version": "远程版本", "Remote Version": "远程版本",
"Confirm to exit the editor": "确定退出编辑器吗?", "Confirm to exit the editor": "确定退出编辑器吗?",
"Confirm to publish": "确定发布吗?", "Confirm to publish": "确定发布吗?",
"Are you sure to delete it's process": "确定删除这对应的过程吗",
"Are you sure to delete this asset": "确定删除这个素材吗", "Are you sure to delete this asset": "确定删除这个素材吗",
"Are you sure to delete all assets": "确定删除全部素材吗", "Are you sure to delete all assets": "确定删除全部素材吗",
"Are you sure to delete this item": "确定删除这一项吗", "Are you sure to delete this item": "确定删除这一项吗",
...@@ -147,6 +161,8 @@ ...@@ -147,6 +161,8 @@
"image": "图片", "image": "图片",
"label": "标签", "label": "标签",
"rect": "矩形", "rect": "矩形",
"circle": "圆形",
"textinput": "输入框",
"scrollView": "滚动视图" "scrollView": "滚动视图"
}, },
"panes": { "panes": {
......
...@@ -8,6 +8,7 @@ import Vue from "vue"; ...@@ -8,6 +8,7 @@ import Vue from "vue";
import i18n from "../../i18n"; import i18n from "../../i18n";
import generateUUID from "uuid/v4"; import generateUUID from "uuid/v4";
import {clonePureObj, metaInUse, updateProcesses} from "../../utils"; import {clonePureObj, metaInUse, updateProcesses} from "../../utils";
import {arrayFind} from "element-ui/src/utils/util";
export const behaviorStore = { export const behaviorStore = {
state: { state: {
...@@ -15,8 +16,6 @@ export const behaviorStore = { ...@@ -15,8 +16,6 @@ export const behaviorStore = {
currentBehavior: null, currentBehavior: null,
processContext: [], processContext: [],
originData: null, originData: null,
originBehaviors: null,
behaviors: null,
currentProcess: null, currentProcess: null,
processStack: [], processStack: [],
...@@ -30,49 +29,18 @@ export const behaviorStore = { ...@@ -30,49 +29,18 @@ export const behaviorStore = {
}, },
}, },
mutations: { mutations: {
behavior_startEdit(state, {originData, behaviors, event}) { behavior_startEdit(state, {originData, behavior}) {
state.originData = originData; state.originData = originData;
state.originBehaviors = behaviors;
state.behaviors = clonePureObj(behaviors);
state.data = clonePureObj(originData); state.data = clonePureObj(originData);
state.currentBehavior = clonePureObj(behavior);
if (state.behaviors.length > 0) {
state.currentBehavior = state.behaviors[0];
} else {
let metaUUID = generateUUID();
state.currentBehavior = state.behaviors[0] = {
uuid: generateUUID(),
alias: event,
meta: metaUUID,
};
let subEntryUUID = generateUUID();
state.data.processes.push({
id: metaUUID,
name: event,
props: {},
subEntry: subEntryUUID,
sub: {
[subEntryUUID]: {
uuid: subEntryUUID,
alias: i18n.t('Entry'),
meta: 'entry',
design: {
x: 10,
y: 10,
}
},
}, },
}); behavior_save(state) {
} state.originData.processes = state.data.processes;
}, },
addProcessMeta(state, meta) { addProcessMeta(state, meta) {
state.data.processes.push(meta); state.data.processes.push(meta);
return process; return process;
}, },
behavior_save(state) {
state.originData.processes = state.data.processes;
state.originBehaviors[0] = state.currentBehavior;
},
updateProcesses(state, {targetMetaID, replaceMetaID}) { updateProcesses(state, {targetMetaID, replaceMetaID}) {
updateProcesses(state.data.processes, targetMetaID, replaceMetaID); updateProcesses(state.data.processes, targetMetaID, replaceMetaID);
}, },
...@@ -84,14 +52,7 @@ export const behaviorStore = { ...@@ -84,14 +52,7 @@ export const behaviorStore = {
container = state.data.processes; container = state.data.processes;
} }
if (container) { if (container) {
for (let i = 0, li = container.length; i < li; i++) { deleteProcessMeta(meta.id, container);
const process = container[i];
if (process.id === meta.id) {
container.splice(i, 1);
break;
}
}
} }
}, },
clearProcessStack(state) { clearProcessStack(state) {
...@@ -156,6 +117,10 @@ export const behaviorStore = { ...@@ -156,6 +117,10 @@ export const behaviorStore = {
} }
}, },
actions: { actions: {
behavior_save({commit, state}) {
commit('behavior_save');
return state.currentBehavior;
},
addCustomProcessMeta({commit, state}, {masterProcess, isInline, processId}) { addCustomProcessMeta({commit, state}, {masterProcess, isInline, processId}) {
let meta = { let meta = {
id: generateUUID(), id: generateUUID(),
...@@ -209,9 +174,51 @@ function addProcessMeta(commit, isInline, masterProcess, meta) { ...@@ -209,9 +174,51 @@ function addProcessMeta(commit, isInline, masterProcess, meta) {
} }
function searchMeta(processes, keyword, path) { function searchMeta(processes, keyword, path) {
for(let process of processes){ for (let process of processes) {
/*if(process.id === keyword || process.name === keyword){ /*if(process.id === keyword || process.name === keyword){
}*/ }*/
} }
} }
export function addBehavior(alias, processes) {
let metaUUID = generateUUID();
let behavior = {
uuid: generateUUID(),
meta: metaUUID,
};
let subEntryUUID = generateUUID();
processes.push({
id: metaUUID,
name: alias,
props: {},
subEntry: subEntryUUID,
sub: {
[subEntryUUID]: {
uuid: subEntryUUID,
alias: i18n.t('Entry'),
meta: 'entry',
design: {
x: 10,
y: 10,
}
},
},
});
return behavior;
}
export function deleteProcessMeta(metaId, processes) {
for (let i = 0, li = processes.length; i < li; i++) {
const process = processes[i];
if (process.id === metaId) {
processes.splice(i, 1);
break;
}
}
}
export function findProcess(metaId, processes) {
return arrayFind(processes, process => process.id === metaId);
}
...@@ -11,7 +11,7 @@ export const envStore = { ...@@ -11,7 +11,7 @@ export const envStore = {
state: { state: {
initialized: false, initialized: false,
name: 'Zeroing Editor', name: 'Zeroing Editor',
version: '1.0.2', version: '1.0.3',
templates: { templates: {
builtin: ['blank'], builtin: ['blank'],
custom: [], custom: [],
...@@ -19,7 +19,6 @@ export const envStore = { ...@@ -19,7 +19,6 @@ export const envStore = {
processes: [], processes: [],
scripts: [], scripts: [],
customs: [], customs: [],
projectCount: 0,
}, },
mutations: { mutations: {
updateEnv(state, env) { updateEnv(state, env) {
......
...@@ -12,6 +12,7 @@ import { template } from "../../template"; ...@@ -12,6 +12,7 @@ import { template } from "../../template";
import { importView, uploadFile } from "../../api/project"; import { importView, uploadFile } from "../../api/project";
import events from "@/global-events"; import events from "@/global-events";
import {packImages} from "../../utils/sheet-pack"; import {packImages} from "../../utils/sheet-pack";
import {addBehavior, deleteProcessMeta, findProcess} from "./behavior";
const defaultOptions = { const defaultOptions = {
pageTitle: 'no title', pageTitle: 'no title',
...@@ -315,8 +316,8 @@ export const projectStore = { ...@@ -315,8 +316,8 @@ export const projectStore = {
}) })
}, },
replaceAsset(state, {uuid, url}) { replaceAsset(state, {uuid, url}) {
for(let asset of state.data.assets){ for (let asset of state.data.assets) {
if(asset.uuid === uuid){ if (asset.uuid === uuid) {
asset.url = url; asset.url = url;
} }
} }
...@@ -451,7 +452,10 @@ export const projectStore = { ...@@ -451,7 +452,10 @@ export const projectStore = {
}, },
assets(state) { assets(state) {
return state.data.assets; return state.data.assets;
} },
getProcess: state => behavior => {
return findProcess(behavior.meta, state.data.processes);
},
}, },
actions: { actions: {
saveToLocal({ getters, commit }) { saveToLocal({ getters, commit }) {
...@@ -621,7 +625,7 @@ export const projectStore = { ...@@ -621,7 +625,7 @@ export const projectStore = {
}, },
async packProject({state}, debug) { async packProject({state}, debug) {
let packedAssets; let packedAssets;
if(!debug){ if (!debug) {
packedAssets = await packAssets(state.data.assets); packedAssets = await packAssets(state.data.assets);
} }
const result = await projectApi.pack(state.id, debug, packedAssets); const result = await projectApi.pack(state.id, debug, packedAssets);
...@@ -638,8 +642,20 @@ export const projectStore = { ...@@ -638,8 +642,20 @@ export const projectStore = {
}; };
localStorage.setItem('preview-project-' + project.id, JSON.stringify(data)); localStorage.setItem('preview-project-' + project.id, JSON.stringify(data));
localStorage.setItem('preview-ts', Date.now().toString()); localStorage.setItem('preview-ts', Date.now().toString());
},
addBehaviorDirect({state}, {behaviors, alias}) {
let behavior = addBehavior(alias, state.data.processes);
behaviors.push(behavior);
},
deleteBehaviorDirect({state}, {behaviors, index, deleteMeta}) {
let behavior = behaviors.splice(index, 1)[0];
if(deleteMeta){
deleteProcessMeta(behavior.meta, state.data.processes);
} }
}, },
},
}; };
async function uploadFiles(files) { async function uploadFiles(files) {
......
...@@ -4,11 +4,16 @@ ...@@ -4,11 +4,16 @@
import {projectApi} from "../../api"; import {projectApi} from "../../api";
export const projectsStore = { export const projectsStore = {
state: [], state: {
projectCount: 0,
projects: [],
},
mutations: { mutations: {
updateProjects(state, projects) { updateProjects(state, {projects, projectCount}) {
state.splice(0); state.projects.splice(0);
state.push(...projects); state.projects.push(...projects);
state.projectCount = projectCount;
}, },
addProject(state, project) { addProject(state, project) {
state.unshift(project); state.unshift(project);
...@@ -25,13 +30,16 @@ export const projectsStore = { ...@@ -25,13 +30,16 @@ export const projectsStore = {
}, },
}, },
actions: { actions: {
async fetchProjects({commit}, {currentPage, pageSize}) { async fetchProjects({commit, state}, {currentPage, pageSize, onlyMine}) {
const projects = await projectApi.fetchAll(currentPage, pageSize); const data = await projectApi.fetchAll(currentPage, pageSize, onlyMine);
commit('updateProjects', projects); commit('updateProjects', data);
}, },
async fetchProject({commit}, projectId) { async fetchProject({commit}, projectId) {
return await projectApi.fetchOne(projectId); return await projectApi.fetchOne(projectId);
}, },
async fetchHistory({commit}, {projectId, currentPage, pageSize}) {
return await projectApi.fetchHistory(projectId, currentPage, pageSize);
},
async createProject({commit}, data) { async createProject({commit}, data) {
const project = await projectApi.createOne(data); const project = await projectApi.createOne(data);
commit('addProject', project); commit('addProject', project);
......
...@@ -34,7 +34,7 @@ content="width=device-width,initial-scale=1, minimum-scale=1, maximum-scale=1, u ...@@ -34,7 +34,7 @@ content="width=device-width,initial-scale=1, minimum-scale=1, maximum-scale=1, u
<body> <body>
<div id="$CONTAINER_ID$" style="line-height:0;font-size:0"></div> <div id="$CONTAINER_ID$" style="line-height:0;font-size:0"></div>
<script src="${process.env.NODE_ENV === 'development' ? 'http://10.10.94.134:4002/dist/index.js' : 'http://yun.duiba.com.cn/editor/zeroing/libs/engine.d20665eae76962ad21c153fe7a719130b08e292c.js.js'}"></script> <script src="${process.env.NODE_ENV === 'development' ? 'http://10.10.94.134:4002/dist/index.js' : 'http://yun.duiba.com.cn/editor/zeroing/libs/engine.d20665eae76962ad21c153fe7a719130b08e292c.js'}"></script>
$SCRIPTS$ $SCRIPTS$
<script> <script>
engine.launch('//yun.duiba.com.cn/aurora/$VERSION$-data.json'); engine.launch('//yun.duiba.com.cn/aurora/$VERSION$-data.json');
......
...@@ -37,7 +37,7 @@ $dock-pin-width: 9px; ...@@ -37,7 +37,7 @@ $dock-pin-width: 9px;
overflow: hidden; overflow: hidden;
font-size: 14px; font-size: 14px;
.current-node{ .current-node {
background-color: $--color-text-secondary; background-color: $--color-text-secondary;
color: $--color-white; color: $--color-white;
border-radius: 5px; border-radius: 5px;
...@@ -64,13 +64,13 @@ $dock-pin-width: 9px; ...@@ -64,13 +64,13 @@ $dock-pin-width: 9px;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
.el-button{ .el-button {
padding: 3px; padding: 3px;
margin-top: 2px; margin-top: 2px;
margin-right: 2px; margin-right: 2px;
} }
.top-bar{ .top-bar {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: flex-start; align-items: flex-start;
...@@ -85,7 +85,7 @@ $dock-pin-width: 9px; ...@@ -85,7 +85,7 @@ $dock-pin-width: 9px;
} }
.operate-bar{ .operate-bar {
padding: 3px; padding: 3px;
border-bottom: 1px solid $--border-color-light; border-bottom: 1px solid $--border-color-light;
...@@ -122,6 +122,7 @@ $dock-pin-width: 9px; ...@@ -122,6 +122,7 @@ $dock-pin-width: 9px;
visibility: visible; visibility: visible;
} }
} }
/*&:hover { /*&:hover {
border-color: $block-border-hover-background-color; border-color: $block-border-hover-background-color;
...@@ -148,6 +149,10 @@ $dock-pin-width: 9px; ...@@ -148,6 +149,10 @@ $dock-pin-width: 9px;
align-self: flex-end; align-self: flex-end;
visibility: hidden; visibility: hidden;
.el-link {
padding: 3px 2px 2px 2px;
}
.el-link + .el-link { .el-link + .el-link {
margin-left: 5px; margin-left: 5px;
} }
...@@ -163,7 +168,7 @@ $dock-pin-width: 9px; ...@@ -163,7 +168,7 @@ $dock-pin-width: 9px;
color: white; color: white;
display: flex; display: flex;
i{ i {
display: block; display: block;
//color: $--color-warning; //color: $--color-warning;
margin-right: 3px; margin-right: 3px;
...@@ -321,7 +326,30 @@ $dock-pin-width: 9px; ...@@ -321,7 +326,30 @@ $dock-pin-width: 9px;
.scrollbar-view { .scrollbar-view {
padding-right: 10px; padding-right: 10px;
.input-wrapper {
.label {
p {
margin: 0;
//text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
.alias {
line-height: 16px;
font-size: 14px;
}
.property-name {
line-height: 12px;
font-size: 12px;
color: $--color-text-secondary;
} }
}
}
}
.el-form-item__content { .el-form-item__content {
display: flex; display: flex;
...@@ -356,7 +384,7 @@ $dock-pin-width: 9px; ...@@ -356,7 +384,7 @@ $dock-pin-width: 9px;
flex: 1; flex: 1;
} }
.vue-codemirror{ .vue-codemirror {
flex: 1; flex: 1;
height: 0; height: 0;
} }
...@@ -421,3 +449,23 @@ $dock-pin-width: 9px; ...@@ -421,3 +449,23 @@ $dock-pin-width: 9px;
margin-top: 5px; margin-top: 5px;
} }
} }
.property-name-popover{
p {
margin: 0;
//text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
.alias {
line-height: 16px;
font-size: 14px;
}
.property-name {
line-height: 12px;
font-size: 12px;
color: $--color-text-secondary;
}
}
...@@ -41,6 +41,7 @@ ...@@ -41,6 +41,7 @@
.pane-container { .pane-container {
flex: 1; flex: 1;
height: 0;
} }
} }
......
@import "var";
.inspector-tabs { .inspector-tabs {
flex: 1; flex: 1;
border: 0 !important; border: 0 !important;
...@@ -6,6 +8,11 @@ ...@@ -6,6 +8,11 @@
&>:last-child{ &>:last-child{
flex: 1; flex: 1;
height: 0;
}
.el-collapse-item__header{
height: 25px;
} }
.el-tabs__item { .el-tabs__item {
...@@ -45,12 +52,93 @@ ...@@ -45,12 +52,93 @@
} }
} }
.zero-inspector-behavior-form { .zero-inspector-behavior {
height: 100%; height: 100%;
display: flex;
flex-direction: column;
.add-trigger{
align-self: flex-start;
}
.scrollbar{ .scrollbar{
margin-top: 5px;
height: 100%; height: 100%;
} }
.el-button + .el-button {
margin-left: 2px;
}
.trigger-list{
color: $--color-text-regular;
font-size: 12px;
padding-right: 10px;
.trigger-item + .trigger-item {
margin-top: 5px;
}
.trigger-item {
border: 1px solid lightgray;
border-radius: 3px;
padding: 3px;
.el-button{
padding: 3px;
}
.top-bar{
display: flex;
justify-content: space-between;
align-items: center;
.name{
color: $--color-primary;
font-size: 14px;
font-weight: bold;
flex: 1;
cursor: default;
}
}
.behavior-list {
.behavior-item {
&:hover {
& > .delete-button {
visibility: visible;
}
}
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 2px;
.name-field{
flex: 1;
margin-left: 3px;
}
.missing-behavior{
color: $--color-danger;
}
.name-input {
border: 0;
outline: transparent;
}
.edit-button {
}
.delete-button {
visibility: hidden;
}
}
}
}
}
} }
} }
...@@ -22,6 +22,10 @@ export const componentsMap = [ ...@@ -22,6 +22,10 @@ export const componentsMap = [
label: '圆形', label: '圆形',
value: 'circle' value: 'circle'
}, },
{
label: '输入框',
value: 'textinput'
},
{ {
label: '滚动视图', label: '滚动视图',
value: 'scrollView' value: 'scrollView'
...@@ -298,7 +302,7 @@ export const styles = { ...@@ -298,7 +302,7 @@ export const styles = {
delete cmpSelfProps[prop]; delete cmpSelfProps[prop];
}); });
if (component.type === 'label') { if (component.type === 'label' || component.type === 'textinput') {
// 如果是label类型,把fillColor转换为color // 如果是label类型,把fillColor转换为color
cmpSelfProps.color = cmpSelfProps.fillColor; cmpSelfProps.color = cmpSelfProps.fillColor;
delete cmpSelfProps.fillColor; delete cmpSelfProps.fillColor;
......
...@@ -3,6 +3,14 @@ ...@@ -3,6 +3,14 @@
export default { export default {
node: { node: {
groupName: '基础', groupName: '基础',
visible: {
title: '是否可见',
type: 'switch',
props: {
width: 40
},
value: true
},
x: { x: {
title: 'x坐标', title: 'x坐标',
type: 'inputNumber', type: 'inputNumber',
...@@ -117,14 +125,6 @@ export default { ...@@ -117,14 +125,6 @@ export default {
}, },
value: true value: true
}, },
visible: {
title: '是否可见',
type: 'switch',
props: {
width: 40
},
value: true
}
}, },
label: { label: {
...@@ -139,6 +139,14 @@ export default { ...@@ -139,6 +139,14 @@ export default {
type: 'input', type: 'input',
value: '' value: ''
}, },
bold: {
title: '粗体',
type: 'switch',
props: {
width: 40
},
value: false,
},
fillColor: { fillColor: {
title: '颜色', title: '颜色',
type: 'colorPicker', type: 'colorPicker',
...@@ -188,6 +196,43 @@ export default { ...@@ -188,6 +196,43 @@ export default {
value: 'top' value: 'top'
}, },
}, },
textinput: {
groupName: '输入框',
text: {
title: '文本内容',
type: 'textArea',
value: ''
},
fillColor: {
title: '颜色',
type: 'colorPicker',
value: '#000'
},
size: {
title: '字体大小',
type: 'inputNumber',
/*type: 'swSelect',
props: {
optionType: 'fontSize'
},*/
value: 12
},
maxLength: {
title: '最大长度',
type: 'inputNumber',
value: undefined,
},
placeholder: {
title: '提示文字',
type: 'input',
value: ''
},
placeholderColor: {
title: '提示颜色',
type: 'colorPicker',
value: '#666666'
},
},
image: { image: {
groupName: '来源', groupName: '来源',
source: { source: {
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
<views splitpanes-min="20" :splitpanes-size="getSize(2, 0)"></views> <views splitpanes-min="20" :splitpanes-size="getSize(2, 0)"></views>
<playground splitpanes-min="20" :splitpanes-size="getSize(2, 1)"></playground> <playground splitpanes-min="20" :splitpanes-size="getSize(2, 1)"></playground>
</split-panes> </split-panes>
<assets splitpanes-min="20" :splitpanes-size="getSize(1, 1)"></assets> <assets splitpanes-min="25" :splitpanes-size="getSize(1, 1)"></assets>
</split-panes> </split-panes>
<inspector splitpanes-min="20" :splitpanes-size="getSize(0, 1)"></inspector> <inspector splitpanes-min="20" :splitpanes-size="getSize(0, 1)"></inspector>
</split-panes> </split-panes>
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
<img @dragstart="assetDragStart(data)" v-if="showThumbnail" draggable="true" class="thumbnail" :src="thumbnailUrl" <img @dragstart="assetDragStart(data)" v-if="showThumbnail" draggable="true" class="thumbnail" :src="thumbnailUrl"
alt="thumb" @dblclick="onDbclick()"> alt="thumb" @dblclick="onDbclick()">
<div class="operate-bar"> <div class="operate-bar">
<el-button circle size="mini" type="success" icon="el-icon-upload2" @dblclick.native.stop <el-button circle size="mini" type="success" icon="icon-upload" @dblclick.native.stop
@click="onClickReplace"/> @click="onClickReplace"/>
<el-button circle size="mini" type="success" icon="el-icon-edit" @dblclick.native.stop @click="onClickEdit"/> <el-button circle size="mini" type="success" icon="el-icon-edit" @dblclick.native.stop @click="onClickEdit"/>
<el-button circle size="mini" type="danger" icon="el-icon-delete" @dblclick.native.stop <el-button circle size="mini" type="danger" icon="el-icon-delete" @dblclick.native.stop
......
This diff is collapsed.
<template>
<div class="zero-inspector-behavior-form" v-if="activeComponent.uuid">
<el-scrollbar class="scrollbar" wrap-class="wrap-x-hidden">
<el-form ref="form" size="mini" label-width="60px">
<div v-for="(evn, key) in eventsObj" :key="key">
<el-form-item :label="$t('Event') + ':'">
<div>{{events[key]}}</div>
<div >
<!--<el-tooltip :content="$t('Trigger once')" placement="top">
<el-switch v-model="evn.once" @change="v => handleOnceChange(key, v)"></el-switch>
</el-tooltip>-->
<el-button size="mini" @click="showBehaviorEditor(evn, key)" style="margin-left: 20px;" icon="el-icon-edit">
<!--<i v-if="evn.behaviors && evn.behaviors.length" class="el-icon-check el-icon&#45;&#45;right"></i>-->
</el-button>
<el-button icon="el-icon-delete" size="mini" v-if="evn.behaviors && evn.behaviors.length" @click="deleteBehavior(key)">
</el-button>
</div>
</el-form-item>
</div>
</el-form>
</el-scrollbar>
<behavior-editor-dialog :behaviors="behaviors" @change="isPreview => handleBehaviorsChange(isPreview)" ref="behaviorEditorDialog"></behavior-editor-dialog>
</div>
</template>
<script>
import { mapGetters } from 'vuex';
import _ from 'lodash';
import BehaviorEditorDialog from '../dialogs/BehaviorEditorDialog';
import events from "@/global-events.js"
export default {
name: 'BehaviorTab2',
data() {
let eventsObj = {};
const events = this.$t('events');
Object.keys(events).forEach(event => {
eventsObj[event] = {
once: false,
behaviors: []
};
});
return {
events,
eventsObj,
behaviors: [],
currentEvent: ''
};
},
components: { BehaviorEditorDialog },
computed: {
...mapGetters(['activeComponent', 'componentList'])
},
methods: {
showBehaviorEditor(evn, key) {
this.currentEvent = key;
this.behaviors = evn.behaviors || [];
this.$refs.behaviorEditorDialog.show(this.behaviors, this.activeComponent.name + '_' + key);
},
/**
* 当前选中组件发生变化时,更新eventsObj的数据
*/
updateEventsObj() {
let _events = this.activeComponent.events || {};
_.forIn(this.eventsObj, (value, key) => {
if (_events[key]) {
this.$set(this.eventsObj, key, _.cloneDeep(_events[key]));
} else {
value.once = false;
value.behaviors = [];
}
});
},
/**
* 是否只执行一次
*/
handleOnceChange(key, v) {
let _event = this.eventsObj[key];
// 如果没有behavior,once没有用处,则不执行
if (_event.behaviors && _event.behaviors.length) {
let event = {};
event[key] = {
once: v,
behaviors: _event.behaviors
};
let events = this.activeComponent.events;
this.$store.dispatch('modifyActiveView', {
events: _.merge({}, events, event)
});
}
},
/**
* 行为发生变化,同步数据
*/
handleBehaviorsChange(isPreview) {
if (this.currentEvent /* && v && v.length*/) {
let event = {};
let currentEvent = this.eventsObj[this.currentEvent];
event[this.currentEvent] = Object.assign(currentEvent /*, { behaviors: v }*/);
let events = this.activeComponent.events;
this.$store.dispatch('modifyActiveView', {
events: _.merge({}, events, event)
});
this.updateEventsObj();
}
if(isPreview){
events.$emit('saveAndPreview')
}
},
/**
* 删除行为
*/
deleteBehavior(key) {
let _events = this.activeComponent.events || {};
delete _events[key];
this.$store.dispatch('modifyActiveView', {
events: _events
});
this.updateEventsObj();
}
},
watch: {
'activeComponent.uuid': function() {
this.updateEventsObj();
console.log('activeComponent.uuid change');
}
}
};
</script>
<style scoped>
</style>
\ No newline at end of file
...@@ -3,8 +3,7 @@ ...@@ -3,8 +3,7 @@
<el-scrollbar class="scrollbar" wrap-class="wrap-x-hidden"> <el-scrollbar class="scrollbar" wrap-class="wrap-x-hidden">
<el-form ref="form" size="mini" :model="form" label-width="80px" @submit.native.prevent> <el-form ref="form" size="mini" :model="form" label-width="80px" @submit.native.prevent>
<el-collapse v-model="configColl"> <el-collapse v-model="configColl">
<el-collapse-item title="配置" name="properties"> <el-collapse-item :title="$t('Props')" name="properties">
<div class="zero-inspector-props-group">
<el-form-item label="名称"> <el-form-item label="名称">
<el-input v-model="form.name" @input="v => handleChange('name', v)"></el-input> <el-input v-model="form.name" @input="v => handleChange('name', v)"></el-input>
</el-form-item> </el-form-item>
...@@ -24,9 +23,8 @@ ...@@ -24,9 +23,8 @@
</el-tooltip> </el-tooltip>
</el-form-item> </el-form-item>
</template> </template>
</div>
</el-collapse-item> </el-collapse-item>
<el-collapse-item title="脚本" name="scripts"> <el-collapse-item :title="$t('Script')" name="scripts">
<el-collapse accordion v-if="activeComponent.scripts && activeComponent.scripts.length"> <el-collapse accordion v-if="activeComponent.scripts && activeComponent.scripts.length">
<template v-for="(script, index) in activeComponent.scripts"> <template v-for="(script, index) in activeComponent.scripts">
<el-collapse-item :title="getScriptName(script.script)" :key="script + index"> <el-collapse-item :title="getScriptName(script.script)" :key="script + index">
...@@ -42,16 +40,12 @@ ...@@ -42,16 +40,12 @@
</template> </template>
</el-collapse> </el-collapse>
<div style="padding-top: 15px;text-align: center;"> <div style="padding-top: 15px;text-align: center;">
<el-popover <el-dropdown trigger="click" @command="handleAddScript" placement="top" size="small">
placement="top" <el-button size="mini">{{$t('Add')}}</el-button>
width="300" <el-dropdown-menu slot="dropdown">
v-model="scriptDialog" <el-dropdown-item v-for="(script, key) of scripts" :command="script.id" :key="key">{{script.name}}</el-dropdown-item>
trigger="manual"> </el-dropdown-menu>
<div class="script-config-dialog"> </el-dropdown>
<el-tree :data="scripts" :props="defaultProps" @node-click="handleNodeClick"></el-tree>
</div>
<el-button slot="reference" @click="scriptDialog = !scriptDialog" size="mini">add script</el-button>
</el-popover>
</div> </div>
</el-collapse-item> </el-collapse-item>
</el-collapse> </el-collapse>
...@@ -61,7 +55,7 @@ ...@@ -61,7 +55,7 @@
</template> </template>
<script> <script>
import { mapGetters } from 'vuex'; import { mapGetters, mapState } from 'vuex';
import _ from 'lodash'; import _ from 'lodash';
import { componentsMap, getCmpProps } from '../../../utils/common'; import { componentsMap, getCmpProps } from '../../../utils/common';
import dynamicComponent from '../components/dynamicComponent'; import dynamicComponent from '../components/dynamicComponent';
...@@ -152,33 +146,26 @@ export default { ...@@ -152,33 +146,26 @@ export default {
data() { data() {
return { return {
componentsMap, componentsMap,
scriptDialog: false,
form: { form: {
name: '', name: '',
type: '', type: '',
properties: {}, properties: {},
scripts: [] scripts: []
}, },
defaultProps: {
children: 'children',
label: 'name'
},
configColl: ['properties'] configColl: ['properties']
}; };
}, },
computed: { computed: {
...mapGetters(['activeComponent', 'activeComponentCopy', 'componentList']), ...mapGetters(['activeComponent', 'activeComponentCopy', 'componentList']),
...mapState({
scripts(state){
return state.env.scripts;
}
}),
cmpProps: function() { cmpProps: function() {
// 获取properties.js中的默认配置 // 获取properties.js中的默认配置
return getCmpProps(this.activeComponent.type); return getCmpProps(this.activeComponent.type);
}, },
scripts: function() {
console.log('scripts', this.$store.state.env.scripts);
return _.filter(this.$store.state.env.scripts, s => {
return s !== null && s !== undefined;
});
}
}, },
watch: { watch: {
activeComponent: { activeComponent: {
...@@ -199,10 +186,9 @@ export default { ...@@ -199,10 +186,9 @@ export default {
/** /**
* 脚本预设对象选中 * 脚本预设对象选中
*/ */
handleNodeClick(script) { handleAddScript(command) {
console.log('handleNodeClick', script); console.log('handleAddScript', command);
this.$store.dispatch('addNodeScript', script.id); this.$store.dispatch('addNodeScript', command);
this.scriptDialog = false;
}, },
/** /**
* 基础属性发生改变 * 基础属性发生改变
...@@ -316,17 +302,11 @@ export default { ...@@ -316,17 +302,11 @@ export default {
.zero-inspector-props-form { .zero-inspector-props-form {
width: 100%; width: 100%;
padding-right: 10px; padding-right: 10px;
.el-form-item--mini.el-form-item {
margin-bottom: 10px;
}
.el-divider__text { .el-divider__text {
background-color: #e9e9e9; background-color: #e9e9e9;
} }
.zero-inspector-props-group { .zero-inspector-props-group {
width: 100%; max-height: 500px;
max-height: 600px;
overflow-x: hidden;
overflow-y: auto;
} }
} }
.script-config-dialog { .script-config-dialog {
......
...@@ -12,21 +12,23 @@ ...@@ -12,21 +12,23 @@
</el-dropdown-menu> </el-dropdown-menu>
</el-dropdown> </el-dropdown>
</div> </div>
<el-input v-model="filterText" size="mini"/>
<el-scrollbar class="tree-scrollbar" wrap-class="wrap-x-hidden"> <el-scrollbar class="tree-scrollbar" wrap-class="wrap-x-hidden">
<el-tree <el-tree
ref="tree"
:data="views" :data="views"
:props="defaultProps" :props="defaultProps"
:expand-on-click-node="false" :expand-on-click-node="false"
:default-expanded-keys="expandedKeys" :default-expanded-keys="expandedKeys"
draggable draggable
ref="tree"
node-key="uuid" node-key="uuid"
highlight-current highlight-current
:default-expand-all="false" :default-expand-all="false"
@node-click="handleNodeClick"
empty-text="" empty-text=""
:allow-drag="allowDrag" :allow-drag="allowDrag"
:allow-drop="allowDrop" :allow-drop="allowDrop"
:filter-node-method="filterNodeMethod"
@node-click="handleNodeClick"
> >
<div slot-scope="{ node, data }" class="tree-node"> <div slot-scope="{ node, data }" class="tree-node">
<div class="node-name"> <div class="node-name">
...@@ -67,6 +69,7 @@ ...@@ -67,6 +69,7 @@
components: {Pane}, components: {Pane},
data() { data() {
return { return {
filterText: '',
defaultProps: { defaultProps: {
children: 'children', children: 'children',
label: 'name' label: 'name'
...@@ -88,9 +91,20 @@ ...@@ -88,9 +91,20 @@
this.$refs.tree.setCheckedKeys([val]); // 设置选中节点 this.$refs.tree.setCheckedKeys([val]); // 设置选中节点
this.$refs.tree.setCurrentKey(val); // 设置高亮节点 this.$refs.tree.setCurrentKey(val); // 设置高亮节点
this.expandedKeys = [val]; // 展开对应的节点 this.expandedKeys = [val]; // 展开对应的节点
} },
filterText(val) {
this.updateFilter();
},
}, },
methods: { methods: {
updateFilter(){
if(this.$refs.tree){
this.$refs.tree.filter(this.filterText);
}
},
filterNodeMethod(value, data) {
return data.name.toUpperCase().indexOf(value.toUpperCase()) >= 0;
},
allowDrag(draggingNode) { allowDrag(draggingNode) {
return draggingNode.parent.parent; return draggingNode.parent.parent;
}, },
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
}, },
methods: { methods: {
parseName(process){ parseName(process){
return process.data.alias || process.meta.name; return process.meta.name;
}, },
onClickItem(process, index){ onClickItem(process, index){
this.$emit('pop', index); this.$emit('pop', index);
......
<template> <template>
<el-form-item class="input-wrapper" :label="property.alias || propertyName" content-float="right" <el-form-item class="input-wrapper" :label="propertyName" content-float="right"
:content-width="contentWidth" :labelOffsetTop="labelOffsetTop"> :content-width="contentWidth" :labelOffsetTop="labelOffsetTop">
<el-tooltip placement="top" class="label" slot="label" trigger="hover" :open-delay="500" :enterable="false">
<div slot="content" class="property-name-popover">
<p>{{$t('Alias')}}{{property.alias}}</p>
<p>{{$t('Name')}}{{propertyName}}</p>
</div>
<div>
<p class="alias">{{property.alias}}</p>
<p class="property-name">{{propertyName}}</p>
</div>
</el-tooltip>
<template v-if="linked"> <template v-if="linked">
<span class="linked">Linked to parent</span> <span class="linked">Linked to parent</span>
</template> </template>
...@@ -48,13 +58,11 @@ ...@@ -48,13 +58,11 @@
default: 0, default: 0,
}, },
}, },
data(){ data() {
return { return {}
}
}, },
watch: { watch: {
value(v){ value(v) {
} }
}, },
......
<template>
<el-checkbox v-model="editValue"/>
</template>
<script>
export default {
name: "EnabledSetter",
props: ['target'],
computed: {
editValue: {
get() {
return !this.target.disabled;
},
set(v) {
this.$set(this.target, 'disabled', !v);
}
}
},
methods: {}
}
</script>
<style scoped>
</style>
\ No newline at end of file
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
</template> </template>
<script> <script>
import {mapState, mapMutations} from 'vuex' import {mapState, mapMutations, mapActions} from 'vuex'
import BehaviorEditor from "../behavior-editor/BehaviorEditor"; import BehaviorEditor from "../behavior-editor/BehaviorEditor";
import events from "@/global-events.js" import events from "@/global-events.js"
...@@ -36,19 +36,26 @@ ...@@ -36,19 +36,26 @@
}); });
}, },
methods: { methods: {
show(behaviors, event) { show(behavior, behaviors) {
this.behaviors = behaviors;
this.behavior_startEdit({ this.behavior_startEdit({
originData: this.data, originData: this.data,
behaviors, behavior,
event,
}); });
this.editorReady = false; this.editorReady = false;
this.visible = true; this.visible = true;
}, },
onSave(isPreview) { async onSave(isPreview) {
this.behavior_save(); const behavior = await this.behavior_save();
for (let i = 0, li = this.behaviors.length; i < li; i++) {
const b = this.behaviors[i];
if (b.uuid === behavior.uuid) {
this.$set(this.behaviors, i, behavior);
break;
}
}
this.$emit('change', isPreview); this.$emit('change', isPreview);
if(!isPreview){ if (!isPreview) {
this.visible = false; this.visible = false;
} }
}, },
...@@ -77,9 +84,11 @@ ...@@ -77,9 +84,11 @@
}, },
...mapMutations([ ...mapMutations([
'behavior_startEdit', 'behavior_startEdit',
'behavior_save',
'behavior_cancel', 'behavior_cancel',
]), ]),
...mapActions([
'behavior_save',
])
} }
} }
</script> </script>
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
<main> <main>
<div class="project-list"> <div class="project-list">
<el-table <el-table
:data="projects" :data="projects.projects"
:empty-text="$t('No projects')" :empty-text="$t('No projects')"
height="100%" height="100%"
> >
...@@ -23,6 +23,11 @@ ...@@ -23,6 +23,11 @@
<el-table-column <el-table-column
fixed="right" fixed="right"
width="140"> width="140">
<template slot="header" slot-scope="scope">
<el-checkbox
v-model="onlyMine"
size="mini">{{$t('Only mine')}}</el-checkbox>
</template>
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button
@click.native.prevent="selectProject(scope.row)" @click.native.prevent="selectProject(scope.row)"
...@@ -36,7 +41,7 @@ ...@@ -36,7 +41,7 @@
</el-button> </el-button>
<el-button <el-button
@click.native.prevent="exportProject(scope.row)" @click.native.prevent="exportProject(scope.row)"
type="warning" icon="el-icon-receiving" type="warning" icon="icon-download"
size="small" circle plain> size="small" circle plain>
</el-button> </el-button>
<!--<el-button <!--<el-button
...@@ -58,7 +63,7 @@ ...@@ -58,7 +63,7 @@
:current-page.sync="currentPage" :current-page.sync="currentPage"
:page-size="pageSize" :page-size="pageSize"
layout="prev, pager, next, jumper" layout="prev, pager, next, jumper"
:total="env.projectCount"> :total="projects.projectCount">
</el-pagination> </el-pagination>
</div> </div>
<create-project-dialog ref="createProjectDialog" @success="onCreateProject"/> <create-project-dialog ref="createProjectDialog" @success="onCreateProject"/>
...@@ -83,6 +88,7 @@ ...@@ -83,6 +88,7 @@
appVersion: 'v1.0.0', appVersion: 'v1.0.0',
currentPage: 1, currentPage: 1,
pageSize: PAGE_SIZE, pageSize: PAGE_SIZE,
onlyMine: true,
} }
}, },
mounted() { mounted() {
...@@ -95,6 +101,11 @@ ...@@ -95,6 +101,11 @@
'env', 'env',
]), ]),
}, },
watch: {
onlyMine(){
this.handleCurrentChange(1);
}
},
methods: { methods: {
prepare() { prepare() {
return Promise.all([ return Promise.all([
...@@ -157,12 +168,14 @@ ...@@ -157,12 +168,14 @@
lock: true, lock: true,
text: this.$t('In processing'), text: this.$t('In processing'),
}); });
await this.fetchProjects({currentPage: page, pageSize: this.pageSize}); this.currentPage = page;
await this.fetchProjects({currentPage: page, pageSize: this.pageSize, onlyMine: this.onlyMine});
loading.close(); loading.close();
}, },
...mapActions([ ...mapActions([
'fetchProjects', 'fetchProjects',
'fetchProject', 'fetchProject',
'fetchHistory',
'createProject', 'createProject',
'deleteProject', 'deleteProject',
'updateEnv', 'updateEnv',
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment