仓库支持关闭自动同步
This commit is contained in:
parent
f020cb887b
commit
398784efc4
@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<modal-inner aria-label="提交信息">
|
||||
<p>自定义<b> 提交信息</b>。</p>
|
||||
<p>自定义 <b>{{ config.name }}</b> 提交信息。</p>
|
||||
<div class="modal__content">
|
||||
<form-entry label="提交信息">
|
||||
<input slot="field" class="textfield" placeholder="提交信息非必填" type="text" v-model.trim="commitMessage" @keydown.enter="resolve()">
|
||||
|
@ -17,6 +17,15 @@
|
||||
<button class="workspace-entry__button button" @click="edit(id)" v-title="'编辑名称'">
|
||||
<icon-pen></icon-pen>
|
||||
</button>
|
||||
<template v-if="workspace.providerId === 'giteeAppData' || workspace.providerId === 'githubWorkspace'
|
||||
|| workspace.providerId === 'giteeWorkspace' || workspace.providerId === 'gitlabWorkspace' || workspace.providerId === 'giteaWorkspace'">
|
||||
<button class="workspace-entry__button button" @click="stopAutoSync(id)" v-if="workspace.autoSync == undefined || workspace.autoSync" v-title="'关闭自动同步'">
|
||||
<icon-sync-auto></icon-sync-auto>
|
||||
</button>
|
||||
<button class="workspace-entry__button button" @click="startAutoSync(id)" v-if="workspace.autoSync != undefined && !workspace.autoSync" v-title="'启动自动同步'">
|
||||
<icon-sync-stop></icon-sync-stop>
|
||||
</button>
|
||||
</template>
|
||||
<button class="workspace-entry__button button" @click="remove(id)" v-title="'删除'">
|
||||
<icon-delete></icon-delete>
|
||||
</button>
|
||||
@ -122,12 +131,53 @@ export default {
|
||||
this.info('请先关闭文档空间,然后再将其删除。');
|
||||
} else {
|
||||
try {
|
||||
await store.dispatch('modal/open', 'removeWorkspace');
|
||||
const workspace = this.workspacesById[id];
|
||||
if (!workspace) {
|
||||
return;
|
||||
}
|
||||
await store.dispatch('modal/open', {
|
||||
type: 'removeWorkspace',
|
||||
name: workspace.name,
|
||||
});
|
||||
workspaceSvc.removeWorkspace(id);
|
||||
badgeSvc.addBadge('removeWorkspace');
|
||||
} catch (e) { /* Cancel */ }
|
||||
}
|
||||
},
|
||||
async stopAutoSync(id) {
|
||||
const workspace = this.workspacesById[id];
|
||||
if (!workspace) {
|
||||
return;
|
||||
}
|
||||
await store.dispatch('modal/open', {
|
||||
type: 'stopAutoSyncWorkspace',
|
||||
name: workspace.name,
|
||||
});
|
||||
store.dispatch('workspace/patchWorkspacesById', {
|
||||
[id]: {
|
||||
...workspace,
|
||||
autoSync: false,
|
||||
},
|
||||
});
|
||||
badgeSvc.addBadge('stopAutoSyncWorkspace');
|
||||
},
|
||||
async startAutoSync(id) {
|
||||
const workspace = this.workspacesById[id];
|
||||
if (!workspace) {
|
||||
return;
|
||||
}
|
||||
await store.dispatch('modal/open', {
|
||||
type: 'autoSyncWorkspace',
|
||||
name: workspace.name,
|
||||
});
|
||||
store.dispatch('workspace/patchWorkspacesById', {
|
||||
[id]: {
|
||||
...workspace,
|
||||
autoSync: true,
|
||||
},
|
||||
});
|
||||
badgeSvc.addBadge('autoSyncWorkspace');
|
||||
},
|
||||
},
|
||||
created() {
|
||||
Object.keys(this.workspacesById).forEach(async (workspaceId) => {
|
||||
|
@ -207,6 +207,16 @@ export default [
|
||||
'文档空间删除',
|
||||
'使用“管理文档空间”对话框在本地删除文档空间。',
|
||||
),
|
||||
new Feature(
|
||||
'autoSyncWorkspace',
|
||||
'文档空间启用自动同步',
|
||||
'使用“管理文档空间”对话框启用自动同步。',
|
||||
),
|
||||
new Feature(
|
||||
'stopAutoSyncWorkspace',
|
||||
'文档空间关闭自动同步',
|
||||
'使用“管理文档空间”对话框关闭自动同步。',
|
||||
),
|
||||
],
|
||||
),
|
||||
new Feature(
|
||||
|
@ -6,6 +6,11 @@ const simpleModal = (contentHtml, rejectText, resolveText) => ({
|
||||
|
||||
/* eslint sort-keys: "error" */
|
||||
export default {
|
||||
autoSyncWorkspace: simpleModal(
|
||||
config => `<p>您将启动文档空间 <b>${config.name}</b >的自动同步。<br>启动后无法自定义提交信息。<br>你确定吗?</p>`,
|
||||
'取消',
|
||||
'确认启动',
|
||||
),
|
||||
commentDeletion: simpleModal(
|
||||
'<p>您将要删除评论。你确定吗?</p>',
|
||||
'取消',
|
||||
@ -46,7 +51,7 @@ export default {
|
||||
'确认跳转',
|
||||
),
|
||||
removeWorkspace: simpleModal(
|
||||
'<p>您将要在本地删除文档空间ß。你确定吗?</p>',
|
||||
config => `<p>您将要在本地删除文档空间<b>${config.name}</b>。你确定吗?</p>`,
|
||||
'取消',
|
||||
'确认删除',
|
||||
),
|
||||
@ -71,6 +76,11 @@ export default {
|
||||
'<p>此功能仅限于赞助商,因为它依赖于服务器资源。</p>',
|
||||
'好的,我明白了',
|
||||
),
|
||||
stopAutoSyncWorkspace: simpleModal(
|
||||
config => `<p>您将关闭文档空间 <b>${config.name}</b> 的自动同步。<br>关闭后您需要手动触发同步,但可以自定义提交信息。<br>你确定吗?</p>`,
|
||||
'取消',
|
||||
'确认关闭',
|
||||
),
|
||||
stripName: simpleModal(
|
||||
config => `<p><b>${config.item.name}</b>包含非法字符。你想去掉它们吗?</p>`,
|
||||
'取消',
|
||||
|
5
src/icons/SyncAuto.vue
Normal file
5
src/icons/SyncAuto.vue
Normal file
@ -0,0 +1,5 @@
|
||||
<template>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon" viewBox="0 0 24 24">
|
||||
<path d="M 12 18 C 8.69 18 6 15.31 6 12 C 6 11 6.25 10.03 6.7 9.2 L 5.24 7.74 C 4.46 8.97 4 10.43 4 12 C 4 16.42 7.58 20 12 20 V 23 L 16 19 L 12 15 M 12 4 V 1 L 8 5 L 12 9 V 6 C 15.31 6 18 8.69 18 12 C 18 13 17.75 13.97 17.3 14.8 L 18.76 16.26 C 19.54 15.03 20 13.57 20 12 C 20 7.58 16.42 4 12 4 Z M 11 8 L 11 13 L 16 13 L 16 11 L 13 11 L 13 8 L 11 8 Z" />
|
||||
</svg>
|
||||
</template>
|
5
src/icons/SyncStop.vue
Normal file
5
src/icons/SyncStop.vue
Normal file
@ -0,0 +1,5 @@
|
||||
<template>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon" viewBox="0 0 24 24">
|
||||
<path d="M 12 18 C 8.69 18 6 15.31 6 12 C 6 11 6.25 10.03 6.7 9.2 L 5.24 7.74 C 4.46 8.97 4 10.43 4 12 C 4 16.42 7.58 20 12 20 V 23 L 16 19 L 12 15 M 12 4 V 1 L 8 5 L 12 9 V 6 C 15.31 6 18 8.69 18 12 C 18 13 17.75 13.97 17.3 14.8 L 18.76 16.26 C 19.54 15.03 20 13.57 20 12 C 20 7.58 16.42 4 12 4 Z M 9 9 L 9 15 L 11 15 L 11 9 L 9 9 Z M 13 9 L 13 15 L 15 15 L 15 9 L 13 9 Z" />
|
||||
</svg>
|
||||
</template>
|
@ -30,6 +30,8 @@ import Login from './Login';
|
||||
import Logout from './Logout';
|
||||
import Sync from './Sync';
|
||||
import SyncOff from './SyncOff';
|
||||
import SyncAuto from './SyncAuto';
|
||||
import SyncStop from './SyncStop';
|
||||
import Upload from './Upload';
|
||||
import ViewList from './ViewList';
|
||||
import Download from './Download';
|
||||
@ -89,6 +91,8 @@ Vue.component('iconLogin', Login);
|
||||
Vue.component('iconLogout', Logout);
|
||||
Vue.component('iconSync', Sync);
|
||||
Vue.component('iconSyncOff', SyncOff);
|
||||
Vue.component('iconSyncAuto', SyncAuto);
|
||||
Vue.component('iconSyncStop', SyncStop);
|
||||
Vue.component('iconUpload', Upload);
|
||||
Vue.component('iconViewList', ViewList);
|
||||
Vue.component('iconDownload', Download);
|
||||
|
@ -134,6 +134,7 @@ export default new Provider({
|
||||
path: getAbsolutePath(syncData),
|
||||
content: '',
|
||||
sha: gitWorkspaceSvc.shaByPath[syncData.id],
|
||||
commitMessage: item.commitMessage,
|
||||
});
|
||||
|
||||
// Return sync data to save
|
||||
@ -193,7 +194,12 @@ export default new Provider({
|
||||
},
|
||||
};
|
||||
},
|
||||
async uploadWorkspaceContent({ token, content, file }) {
|
||||
async uploadWorkspaceContent({
|
||||
token,
|
||||
content,
|
||||
file,
|
||||
commitMessage,
|
||||
}) {
|
||||
const path = store.getters.gitPathsByItemId[file.id];
|
||||
const absolutePath = `${store.getters['workspace/currentWorkspace'].path || ''}${path}`;
|
||||
const sha = gitWorkspaceSvc.shaByPath[path];
|
||||
@ -203,6 +209,7 @@ export default new Provider({
|
||||
path: absolutePath,
|
||||
content: Provider.serializeContent(content),
|
||||
sha,
|
||||
commitMessage,
|
||||
});
|
||||
|
||||
// Return new sync data
|
||||
|
@ -67,6 +67,7 @@ export default new Provider({
|
||||
path: syncData.id,
|
||||
content: '',
|
||||
sha: gitWorkspaceSvc.shaByPath[syncData.id],
|
||||
commitMessage: item.commitMessage,
|
||||
});
|
||||
|
||||
// Return sync data to save
|
||||
@ -138,7 +139,12 @@ export default new Provider({
|
||||
},
|
||||
};
|
||||
},
|
||||
async uploadWorkspaceContent({ token, content, file }) {
|
||||
async uploadWorkspaceContent({
|
||||
token,
|
||||
content,
|
||||
file,
|
||||
commitMessage,
|
||||
}) {
|
||||
const path = store.getters.gitPathsByItemId[file.id];
|
||||
const res = await giteeHelper.uploadFile({
|
||||
owner: token.name,
|
||||
@ -148,6 +154,7 @@ export default new Provider({
|
||||
path,
|
||||
content: Provider.serializeContent(content),
|
||||
sha: gitWorkspaceSvc.shaByPath[path],
|
||||
commitMessage,
|
||||
});
|
||||
|
||||
// Return new sync data
|
||||
|
@ -119,6 +119,7 @@ export default new Provider({
|
||||
path: getAbsolutePath(syncData),
|
||||
content: '',
|
||||
sha: gitWorkspaceSvc.shaByPath[syncData.id],
|
||||
commitMessage: item.commitMessage,
|
||||
});
|
||||
|
||||
// Return sync data to save
|
||||
@ -178,7 +179,12 @@ export default new Provider({
|
||||
},
|
||||
};
|
||||
},
|
||||
async uploadWorkspaceContent({ token, content, file }) {
|
||||
async uploadWorkspaceContent({
|
||||
token,
|
||||
content,
|
||||
file,
|
||||
commitMessage,
|
||||
}) {
|
||||
const path = store.getters.gitPathsByItemId[file.id];
|
||||
const absolutePath = `${store.getters['workspace/currentWorkspace'].path || ''}${path}`;
|
||||
const res = await giteeHelper.uploadFile({
|
||||
@ -187,6 +193,7 @@ export default new Provider({
|
||||
path: absolutePath,
|
||||
content: Provider.serializeContent(content),
|
||||
sha: gitWorkspaceSvc.shaByPath[path],
|
||||
commitMessage,
|
||||
});
|
||||
|
||||
// Return new sync data
|
||||
|
@ -119,6 +119,7 @@ export default new Provider({
|
||||
path: getAbsolutePath(syncData),
|
||||
content: '',
|
||||
sha: gitWorkspaceSvc.shaByPath[syncData.id],
|
||||
commitMessage: item.commitMessage,
|
||||
});
|
||||
|
||||
// Return sync data to save
|
||||
@ -178,7 +179,12 @@ export default new Provider({
|
||||
},
|
||||
};
|
||||
},
|
||||
async uploadWorkspaceContent({ token, content, file }) {
|
||||
async uploadWorkspaceContent({
|
||||
token,
|
||||
content,
|
||||
file,
|
||||
commitMessage,
|
||||
}) {
|
||||
const path = store.getters.gitPathsByItemId[file.id];
|
||||
const absolutePath = `${store.getters['workspace/currentWorkspace'].path || ''}${path}`;
|
||||
const res = await githubHelper.uploadFile({
|
||||
@ -187,6 +193,7 @@ export default new Provider({
|
||||
path: absolutePath,
|
||||
content: Provider.serializeContent(content),
|
||||
sha: gitWorkspaceSvc.shaByPath[path],
|
||||
commitMessage,
|
||||
});
|
||||
|
||||
// Return new sync data
|
||||
|
@ -134,6 +134,7 @@ export default new Provider({
|
||||
path: getAbsolutePath(syncData),
|
||||
content: '',
|
||||
sha: gitWorkspaceSvc.shaByPath[syncData.id],
|
||||
commitMessage: item.commitMessage,
|
||||
});
|
||||
|
||||
// Return sync data to save
|
||||
@ -193,7 +194,12 @@ export default new Provider({
|
||||
},
|
||||
};
|
||||
},
|
||||
async uploadWorkspaceContent({ token, content, file }) {
|
||||
async uploadWorkspaceContent({
|
||||
token,
|
||||
content,
|
||||
file,
|
||||
commitMessage,
|
||||
}) {
|
||||
const path = store.getters.gitPathsByItemId[file.id];
|
||||
const absolutePath = `${store.getters['workspace/currentWorkspace'].path || ''}${path}`;
|
||||
const sha = gitWorkspaceSvc.shaByPath[path];
|
||||
@ -203,6 +209,7 @@ export default new Provider({
|
||||
path: absolutePath,
|
||||
content: Provider.serializeContent(content),
|
||||
sha,
|
||||
commitMessage,
|
||||
});
|
||||
|
||||
// Return new sync data
|
||||
|
@ -148,7 +148,10 @@ const createPublishLocation = (publishLocation, featureId) => {
|
||||
let commitMsg = '';
|
||||
if (gitProviderIds.indexOf(publishLocation.providerId) > -1) {
|
||||
try {
|
||||
const { commitMessage } = await store.dispatch('modal/open', { type: 'commitMessage' });
|
||||
const { commitMessage } = await store.dispatch('modal/open', {
|
||||
type: 'commitMessage',
|
||||
name: currentFile.name,
|
||||
});
|
||||
commitMsg = commitMessage;
|
||||
} catch (e) {
|
||||
return;
|
||||
|
@ -73,6 +73,14 @@ const isAutoSyncReady = () => {
|
||||
return Date.now() > autoSyncEvery + getLastStoredSyncActivity();
|
||||
};
|
||||
|
||||
/**
|
||||
* 是否已启用工作空间的自动同步 没有配置 默认是启用了的
|
||||
*/
|
||||
const isEnableAutoSyncWorkspace = () => {
|
||||
const workspace = store.getters['workspace/currentWorkspace'];
|
||||
return workspace.autoSync === undefined || workspace.autoSync;
|
||||
};
|
||||
|
||||
/**
|
||||
* Update the lastSyncActivity, assuming we have the lock.
|
||||
*/
|
||||
@ -361,7 +369,7 @@ const syncFile = async (fileId, syncContext = new SyncContext()) => {
|
||||
return content;
|
||||
};
|
||||
|
||||
const uploadContent = async (content, ifNotTooLate) => {
|
||||
const uploadContent = async (content, ifNotTooLate, commitMessage) => {
|
||||
// On simple provider, call simply uploadContent
|
||||
if (syncLocation.id !== 'main') {
|
||||
return provider.uploadContent(token, content, syncLocation, ifNotTooLate);
|
||||
@ -377,6 +385,7 @@ const syncFile = async (fileId, syncContext = new SyncContext()) => {
|
||||
updateSyncData(await provider.uploadWorkspaceContent({
|
||||
token,
|
||||
content,
|
||||
commitMessage,
|
||||
// Use deepCopy to freeze item
|
||||
file: utils.deepCopy(store.state.file.itemsById[fileId]),
|
||||
contentSyncData: oldContentSyncData,
|
||||
@ -485,6 +494,22 @@ const syncFile = async (fileId, syncContext = new SyncContext()) => {
|
||||
syncContext.restartSkipContents = true;
|
||||
}
|
||||
|
||||
const currentWorkspace = store.getters['workspace/currentWorkspace'];
|
||||
const isGit = !!store.getters['workspace/currentWorkspaceIsGit'];
|
||||
let commitMsg = '';
|
||||
// 是git 并且未配置自动同步或启用了自动同步 并且文档类型是content
|
||||
if (isGit && (currentWorkspace.autoSync !== undefined && !currentWorkspace.autoSync)) {
|
||||
const file = store.state.file.itemsById[fileId];
|
||||
try {
|
||||
const { commitMessage } = await store.dispatch('modal/open', {
|
||||
type: 'commitMessage',
|
||||
name: file.name,
|
||||
});
|
||||
commitMsg = commitMessage;
|
||||
} catch (e) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
// Upload merged content
|
||||
const item = {
|
||||
...mergedContent,
|
||||
@ -493,6 +518,7 @@ const syncFile = async (fileId, syncContext = new SyncContext()) => {
|
||||
const syncLocationToStore = await uploadContent(
|
||||
item,
|
||||
tooLateChecker(restartContentSyncAfter),
|
||||
commitMsg,
|
||||
);
|
||||
|
||||
// Replace sync location if modified
|
||||
@ -938,6 +964,7 @@ export default {
|
||||
&& networkSvc.isUserActive()
|
||||
&& isSyncWindow()
|
||||
&& isAutoSyncReady()
|
||||
&& isEnableAutoSyncWorkspace()
|
||||
) {
|
||||
requestSync();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user