提交 4f563d13 编写于 作者: 雨爱无痕

Add rename script and dir

上级 cc961ba3
......@@ -177,6 +177,24 @@ func (c *TestScriptCtrl) Delete(ctx iris.Context) {
ctx.JSON(c.SuccessResp(nil))
}
func (c *TestScriptCtrl) Rename(ctx iris.Context) {
req := serverDomain.TestScript{}
err := ctx.ReadJSON(&req)
if err != nil {
ctx.JSON(c.ErrResp(commConsts.CommErr, err.Error()))
return
}
bizErr := c.TestScriptService.Rename(req.Path, req.Name)
if bizErr != nil {
ctx.JSON(c.BizErrResp(bizErr, ""))
return
}
ctx.JSON(c.SuccessResp(nil))
}
// Extract 详情
func (c *TestScriptCtrl) Extract(ctx iris.Context) {
scriptPath := ctx.URLParam("path")
......
......@@ -30,6 +30,7 @@ func (m *TestScriptModule) Party() module.WebModule {
index.Put("/updateName", m.TestScriptCtrl.UpdateName).Name = "重命令脚本"
index.Put("/paste", m.TestScriptCtrl.Paste).Name = "粘贴脚本"
index.Put("/move", m.TestScriptCtrl.Move).Name = "移动脚本"
index.Put("/rename", m.TestScriptCtrl.Rename).Name = "重命名脚本"
index.Get("/extract", m.TestScriptCtrl.Extract).Name = "抽取脚本"
index.Post("/syncFromZentao", m.TestScriptCtrl.SyncFromZentao).Name = "从禅道导出脚本"
......
package service
import (
"os"
"path/filepath"
commConsts "github.com/easysoft/zentaoatf/internal/pkg/consts"
commDomain "github.com/easysoft/zentaoatf/internal/pkg/domain"
codeHelper "github.com/easysoft/zentaoatf/internal/pkg/helper/code"
......@@ -12,8 +15,6 @@ import (
"github.com/easysoft/zentaoatf/pkg/domain"
fileUtils "github.com/easysoft/zentaoatf/pkg/lib/file"
"github.com/kataras/iris/v12"
"os"
"path/filepath"
)
type TestScriptService struct {
......@@ -200,6 +201,20 @@ func (s *TestScriptService) Delete(pth string) (bizErr *domain.BizError) {
return
}
func (s *TestScriptService) Rename(pth string, name string) (bizErr *domain.BizError) {
dir, _ := filepath.Split(pth)
err := os.Rename(pth, dir+name)
_, ok := err.(*os.PathError)
if ok {
bizErr = &domain.BizError{Code: commConsts.ErrDirNotEmpty.Code}
} else {
bizErr = nil
}
return
}
func (s *TestScriptService) Move(req serverDomain.MoveScriptReq) (err error) {
src := req.DragKey
srcName := fileUtils.GetFileName(src)
......
......@@ -236,6 +236,7 @@ export default {
'copy': 'Copy',
'cut': 'Cut',
'paste': 'Paste',
'rename': 'Rename',
'open-in-explore': 'Open In Explore',
'open-in-terminal': 'Open In Terminal',
......
......@@ -247,6 +247,7 @@ export default {
'copy': '复制',
'cut': '剪切',
'paste': '粘贴',
'rename': '重命名',
'open-in-explore': '在资源管理器中显示',
'open-in-terminal': '从此位置打开命令行',
......
......@@ -3,7 +3,7 @@
:showModal="showModalRef"
@onCancel="cancel"
@onOk="submit"
:title="t('create')"
:title="props.path == '' ? t('create') : t('rename')"
:contentStyle="{width: '400px'}"
>
<Form>
......@@ -31,17 +31,25 @@ import FormItem from "@/components/FormItem.vue";
export interface FormWorkspaceProps {
show?: boolean;
path?: string;
name?: string;
}
const { t } = useI18n();
const props = withDefaults(defineProps<FormWorkspaceProps>(), {
show: false,
path:"",
name:"",
});
watch(props, () => {
if(!props.show){
setTimeout(() => {
validateInfos.value = {};
modelRef.value = {name:'', path:''}
}, 200);
}else{
modelRef.value.name = props.name
modelRef.value.path = props.path
}
})
......@@ -53,7 +61,7 @@ const cancel = () => {
emit("cancel", {});
};
const modelRef = ref({});
const modelRef = ref({name:'', path:''});
const rulesRef = ref({
name: [{ required: true, msg: t("pls_name") }],
});
......
......@@ -23,6 +23,9 @@
<div v-if="treeNode?.type != 'workspace'" @click="menuClick('delete')" class="menu-item">
<span>{{t('delete')}}</span>
</div>
<div v-if="treeNode?.type != 'workspace'" @click="menuClick('rename')" class="menu-item">
<span>{{t('rename')}}</span>
</div>
<div v-if="isElectron" @click="menuClick('open-in-explore')" class="menu-item">
<span>{{t('open-in-explore')}}</span>
......
......@@ -13,7 +13,7 @@
:defaultCollapsedMap="collapsedMap"
:defaultCollapsed="true"
/>
<FormNode :show="showModal" @submit="createNode" @cancel="modalClose" ref="formNode" />
<FormNode :show="showModal" @submit="createNode" @cancel="modalClose" :path="currentNode.path" :name="currentNode.title" ref="formNode" />
</div>
<Button
v-if="checkable && checkedKeys.length"
......@@ -122,6 +122,7 @@ const onToolbarClicked = (e) => {
case 'createFile':
case 'createWorkspace':
case 'createDir':
currentNode.value = {}
showModal.value = true;
toolbarAction.value = e.event.key;
break;
......@@ -380,6 +381,12 @@ let rightClickedNode = {} as any
const formNode = ref({} as any)
const createNode = (formData) => {
if(formData.path != ""){
store.dispatch('Script/renameScript', formData)
formNode.value.clearFormData()
showModal.value = false;
return;
}
const mode = 'child';
let type = 'dir';
if(toolbarAction.value === 'createFile') type = 'node'
......@@ -484,6 +491,9 @@ const menuClick = (menuKey: string, targetId: number) => {
store.dispatch('Script/deleteScript', contextNodeData.id)
},
});
} else if (menuKey === 'rename') {
showModal.value = true;
currentNode.value = contextNodeData;
} else if(menuKey == 'sync-from-zentao'){
syncFromZentao(contextNodeData)
} else if(menuKey === 'sync-to-zentao'){
......
......@@ -100,6 +100,14 @@ export async function remove(path: string): Promise<any> {
});
}
export async function rename(data: any): Promise<any> {
return request({
url: `/${apiPath}/rename`,
method: 'put',
data,
});
}
export async function updateCode(data: any): Promise<any> {
return request({
url: `/${apiPath}/updateCode`,
......
......@@ -14,6 +14,7 @@ import {
syncFromZentao,
syncToZentao,
paste, move,
rename,
scriptTreeAddAttr,
getNodeMap,
} from './service';
......@@ -51,6 +52,7 @@ export interface ModuleType extends StoreModuleType<ScriptData> {
createScript: Action<ScriptData, ScriptData>;
updateScript: Action<ScriptData, ScriptData>;
deleteScript: Action<ScriptData, ScriptData>;
renameScript: Action<ScriptData, ScriptData>;
pasteScript: Action<ScriptData, ScriptData>;
moveScript: Action<ScriptData, ScriptData>;
updateCode: Action<ScriptData, ScriptData>;
......@@ -232,6 +234,17 @@ const StoreModel: ModuleType = {
}
},
async renameScript({ dispatch, state}, data: any ) {
try {
await rename(data);
await dispatch('listScript', state.queryParams)
return true;
} catch (error) {
return false;
}
},
async changeWorkspace({ commit }, payload: any ) {
commit('setWorkspace', payload);
return true;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册