diff --git a/lib/zin/wg/docapp/js/v1.js b/lib/zin/wg/docapp/js/v1.js index a3374f6821..3f47da8aa0 100644 --- a/lib/zin/wg/docapp/js/v1.js +++ b/lib/zin/wg/docapp/js/v1.js @@ -103,7 +103,7 @@ window.reloadZentaoList = function(blockID) * * @returns {object} */ -function getDocApp() +window.getDocApp = function() { if(!currentDocApp) { @@ -395,7 +395,7 @@ function mergeDocFormData(doc, formData) return doc; } -function showSaveFailedAlert(error) +window.showSaveFailedAlert = function(error) { zui.Modal.alert( { @@ -2048,7 +2048,7 @@ function getSortableOptions(type) } } -function checkResponse(res) +window.checkResponse = function(res) { if(typeof res === 'string') res = JSON.parse(res); if(typeof res !== 'object' || !res) return true; diff --git a/module/doc/control.php b/module/doc/control.php index 568f3c0b1f..81aa7c00e3 100755 --- a/module/doc/control.php +++ b/module/doc/control.php @@ -2293,6 +2293,7 @@ class doc extends control if($modalType == 'doc') { $title = $parentID ? $this->lang->doc->addSubDoc : $this->lang->doc->create; + if($objectType == 'template') $title = $this->lang->docTemplate->create; if($isDraft == 'no') $title = $this->lang->settings; } if($modalType == 'chapter') $title = $isCreate ? $this->lang->doc->addChapter : $this->lang->doc->editChapter; diff --git a/module/doc/js/browsetemplate.ui.js b/module/doc/js/browsetemplate.ui.js index b134ba3358..a666329bf9 100644 --- a/module/doc/js/browsetemplate.ui.js +++ b/module/doc/js/browsetemplate.ui.js @@ -1,4 +1,5 @@ const savingDocData = {}; +let docBasicModal = {}; /** * 获取文档界面上的表格初始化选项。 * Get the table initialization options on the doc UI. @@ -83,16 +84,42 @@ function mergeDocFormData(doc, formData) return doc; } -function showDocBasicModal(docID, isDraft = false) +function showDocBasicModal(parentID, docID, isDraft, modalType = 'doc') { const docApp = getDocApp(); - const spaceType = docApp.spaceType; const spaceID = docApp.spaceID; const libID = docApp.libID; const moduleID = docApp.moduleID; - isDraft = isDraft ? 'yes' : 'no'; - const url = $.createLink('doc', 'setDocBasic', `objectType=template&objectID=${spaceID}&libID=${libID}&moduleID=${moduleID}&docID=${docID}&isDraft=${isDraft}`); - zui.Modal.open({url: url}); + const url = $.createLink('doc', 'setDocBasic', `objectType=template&objectID=${spaceID}&libID=${libID}&moduleID=${moduleID}&parentID=${parentID || 0}&docID=${docID || 0}&isDraft=${isDraft ? 'yes' : 'no'}&modalType=${modalType}`); + + if(docBasicModal.doc === docID && docBasicModal.current) + { + docBasicModal.current.show(); + } + else + { + if(docBasicModal.current) docBasicModal.current.destroy(); + docBasicModal.doc = docID; + zui.Modal.open( + { + ref : docBasicModal, + url : url, + destroyOnHide: false, + cache : true, + request: { + error: error => { + if(docBasicModal.current) docBasicModal.current.hide(); + showSaveFailedAlert(error); + } + }, + onHidden: () => { + if(!docBasicModal.keepOnHide && docBasicModal.current) docBasicModal.current.destroy(); + }, + $onDestroy: () => { + if(docBasicModal.current) docBasicModal = {}; + } + }); + } return new Promise((resolve) => {window.docBasicModalResolver = resolve;}); } @@ -103,7 +130,7 @@ function showDocSettingModal(_, args) const docID = args[0] || doc.id; const docType = args[1] || doc.contentType; const saveEdited = args[2] || 0; - showDocBasicModal(docID).then(formData => { + showDocBasicModal(0, docID).then(formData => { savingDocData[docID] = formData; if(saveEdited == 1) { @@ -137,9 +164,14 @@ function showDocSettingModal(_, args) * @param {FormData} formData * @returns */ -function submitNewDoc(doc, spaceID, libID, moduleID, formData) +function submitNewDoc(doc, spaceID, libID, moduleID, formData, afterCreate) { - const docApp = getDocApp(); + const docApp = getDocApp(); + + if(docApp.isSavingDoc) return; + docApp.isSavingDoc = true; + $(docApp.element).find('[zui-command^="saveDoc"],[zui-command^="saveNewDoc"]').attr('disabled', true); + const spaceType = docApp.signals.spaceType.value; const module = docApp.treeMap.modules.get(moduleID); const url = $.createLink('doc', 'createTemplate', `libID=${libID}&moduleID=${moduleID}`); @@ -181,17 +213,34 @@ function submitNewDoc(doc, spaceID, libID, moduleID, formData) try { const data = JSON.parse(res); + if(!checkResponse(data)) return; if(typeof data !== 'object' || data.result === 'fail') { throw new Error(getErrorMessage(data)); } - resolve($.extend(doc, {id: data.id}, docData, data.doc, {status: doc.status || data.status})); + const newDoc = $.extend(doc, {id: data.id}, docData, data.doc, {status: doc.status || data.status}); + if (!newDoc.space.includes('.')) { + newDoc.space = `${spaceType}.${docData[spaceType]}`; + } + resolve(newDoc); + if(afterCreate) + { + docApp.load(null, null, null, {noLoading: true, picks: 'doc'}).then(() => { + afterCreate(newDoc); + }); + } } catch (error) { - zui.Modal.alert(error.message); + showSaveFailedAlert(error); reject(error); } + }).fail(error => { + resolve(false); + showSaveFailedAlert(error); + }).complete(() => { + docApp.isSavingDoc = false; + $(docApp.element).find('[zui-command^="saveDoc"],[zui-command^="saveNewDoc"]').removeAttr('disabled'); }); }); } @@ -202,7 +251,7 @@ function submitNewDoc(doc, spaceID, libID, moduleID, formData) */ function handleCreateDoc(doc, spaceID, libID, moduleID) { - return showDocBasicModal(0, doc.status === 'draft').then((formData) => { + return showDocBasicModal(0, 0, doc.status === 'draft').then((formData) => { moduleID = parseInt(formData.get('module')); return submitNewDoc(doc, spaceID, libID, moduleID, formData); }); @@ -389,12 +438,25 @@ window.setDocAppOptions = function(_, options) // Override the method. /* 扩展文档模板命令定义。 Extend the doc app command definition. */ $.extend(window.docAppCommands, { - startCreateTemplate: function() + startCreateTemplate: function(_, args) { const docApp = getDocApp(); const hasModules = docApp.props.hasModules; if(!hasModules) return zui.Modal.alert(getLang('createTypeFirst')); - docApp.startCreateDoc(); + + const {spaceID, libID, moduleID} = docApp; + return showDocBasicModal(args?.[0] ?? 0, 0, true, 'doc').then((formData) => { + zui.Editor.loadModule().then(() => { + const emptyDoc = zui.Editor.createEmptyDoc(); + const snapshot = zui.Editor.toSnapshot(emptyDoc); + const doc = {contentType: 'doc', status: 'draft', content: JSON.stringify(snapshot)}; + return submitNewDoc(doc, 0, libID, moduleID, formData, (newDoc) => { + docApp.selectDoc(newDoc.id); + docApp.startEditDoc(newDoc.id); + }); + }); + + }); }, deleteDoc: function(_, args) { diff --git a/module/doc/ui/setdocbasic.template.html.php b/module/doc/ui/setdocbasic.template.html.php index a0dc725866..bb8756d7cd 100644 --- a/module/doc/ui/setdocbasic.template.html.php +++ b/module/doc/ui/setdocbasic.template.html.php @@ -24,10 +24,17 @@ formPanel setData('officeTypes', $this->config->doc->officeTypes), setData('docType', isset($doc) ? $doc->users : 'undefined'), set::title($title), - set::submitBtnText($isDraft ? $lang->doc->saveDraft : (empty($docID) ? $lang->doc->release : $lang->save)), + set::submitBtnText($lang->save), on::change('[name=lib]')->call('loadLibModules', jsRaw("event, 'docTemplate'")), set::ajax(array('beforeSubmit' => jsRaw('window.beforeSetDocBasicInfo'))), formGroup + ( + set::label($modalType == 'chapter' ? $lang->doc->chapterName : $lang->docTemplate->title), + set::name('title'), + set::required(true), + set::value(isset($doc) ? $doc->title : '') + ), + formGroup ( set::label($lang->docTemplate->scope), set::required(true), @@ -39,12 +46,23 @@ formPanel set::required(true), picker(set::name('module'), set::items($modules), set::value($moduleID), set::required(true)) ), + ($modalType != 'chapter' || !$isCreate) ? formGroup + ( + set::label($lang->doc->module), + picker + ( + set::name('parent'), + set::items($modalType != 'chapter' ? array('m_0' => '/') + $chapterAndDocs : $chapterAndDocs), + set::value($parentID ? $parentID : "m_$moduleID"), + set::required(true) + ), + ) : null, formGroup ( set::label($lang->docTemplate->desc), textarea(set::name('desc'), set::value($docID ? $doc->templateDesc : ''), set::rows(3)) ), - $isDraft ? null : formGroup + formGroup ( set::label($lang->doclib->control), radioList @@ -56,7 +74,7 @@ formPanel on::change('toggleWhiteList') ) ), - $isDraft ? null : formGroup + formGroup ( setID('whiteListBox'), setClass((isset($doc) && $libID == $doc->lib && $objectType != 'mine' && $doc->acl == 'private') ? '' : 'hidden'), @@ -67,7 +85,7 @@ formPanel inputGroup ( setClass('w-full'), - $lang->doc->groups, + $lang->doc->groupLabel, picker ( set::name('groups[]'), @@ -81,7 +99,7 @@ formPanel setClass('w-full'), userPicker ( - set::label($lang->doc->users), + set::label($lang->doc->userLabel), set::items($users), set::value(isset($doc) ? $doc->users : null) )