v1.php 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. <?php
  2. /**
  3. * The docApp widget class file of zin module of ZenTaoPMS.
  4. *
  5. * @copyright Copyright 2024 禅道软件(青岛)有限公司(ZenTao Software (Qingdao) Co., Ltd. www.zentao.net)
  6. * @license ZPL(https://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
  7. * @author Hao Sun <sunhao@easycorp.ltd>
  8. * @package zin
  9. * @link http://www.zentao.net
  10. */
  11. namespace zin;
  12. class docViewer extends wg
  13. {
  14. /**
  15. * @var mixed[]
  16. */
  17. protected static $defineProps = array
  18. (
  19. 'doc' => 'array|string|int'
  20. );
  21. public static function getPageJS()
  22. {
  23. $docAppJS = file_get_contents(dirname(__DIR__) . DS . 'docapp' . DS . 'js' . DS . 'v1.js');
  24. $appendJS = file_get_contents(__DIR__ . DS . 'js' . DS . 'v1.js');
  25. return $docAppJS . js::scope($appendJS);
  26. }
  27. public static function getPageCSS()
  28. {
  29. return file_get_contents(dirname(__DIR__) . DS . 'docapp' . DS . 'css' . DS . 'v1.css');
  30. }
  31. protected function build()
  32. {
  33. global $app, $lang, $config;
  34. /**
  35. * 定义文档应用接口链接。
  36. * Define the fetcher links for doc app.
  37. */
  38. $docFetcher = createLink('doc', 'ajaxGetDoc', 'docID={docID}&version={version}');
  39. $uploadUrl = createLink('file', 'ajaxUpload', 'uid={uid}&objectType={objectType}&objectID={objectID}&extra={extra}&field={field}&api={api}&gid={gid}');
  40. $downloadUrl = createLink('file', 'ajaxQuery', 'fileID={gid}&objectType={objectType}&objectID={objectID}&title={title}&extra={extra}');
  41. $fileInfoUrl = createLink('file', 'ajaxQuery', 'fileID={gid}&objectType={objectType}&objectID={objectID}&title={title}&extra={extra}', 'json');
  42. /**
  43. * 定义文档界面上的文件下载链接。
  44. * Define the file download link for doc app.
  45. */
  46. $sessionStr = session_name() . '=' . session_id();
  47. $fileUrl = $this->prop('fileUrl');
  48. if(empty($fileUrl))
  49. {
  50. $fileUrl = createLink('file', 'download', 'fileID={id}');
  51. $fileUrl .= strpos($fileUrl, '?') === false ? '?' : '&';
  52. $fileUrl .= $sessionStr;
  53. }
  54. /**
  55. * Setting language data for frontend. Use getLang('xxx') in js/app.ui.js.
  56. * 设置前端语言数据。 在 js/app.ui.js 中使用 getLang('xxx') 来访问语言数据。
  57. */
  58. $app->loadLang('file');
  59. $app->loadLang('api');
  60. $langData = $lang->doc->docLang;
  61. $langData->filePreview = $lang->file->preview;
  62. $langData->fileDownload = $lang->file->download;
  63. $langData->fileDelete = $lang->file->delete;
  64. $langData->fileRename = $lang->file->edit;
  65. $langData->fileConfirmDelete = $lang->file->confirmDelete;
  66. $langData->deleted = $lang->file->deleted;
  67. $langData->createApi = $lang->api->createApi;
  68. $langData->apifilterTypes = $lang->api->filterTypes;
  69. $langData->module = $lang->api->module;
  70. $langData->struct = $lang->api->struct;
  71. $langData->releases = $lang->api->releases;
  72. $langData->noApi = $lang->api->noApi;
  73. $langData->version = $lang->api->version;
  74. $langData->defaultVersion = $lang->api->defaultVersion;
  75. $langData->createStruct = $lang->api->createStruct;
  76. $langData->createRelease = $lang->api->createRelease;
  77. $langData->libTypeList = $lang->api->libTypeList;
  78. $langData->latestVersion = $lang->api->latestVersion;
  79. $langData->template = $lang->doc->template;
  80. /**
  81. * 合并语言数据。
  82. * Merge the language data.
  83. */
  84. if($this->hasProp('langData')) $langData = array_merge((array)$langData, (array)$this->prop('langData'));
  85. /**
  86. * 界面模式 URL 格式化模版。
  87. * URL format for view mode change.
  88. */
  89. $viewModeUrl = $this->prop('viewModeUrl');
  90. if(!$this->hasProp('viewModeUrl'))
  91. {
  92. $viewModeUrl = createLink($app->rawModule, '{mode}', 'docID={docID}');
  93. }
  94. $hasZentaoSlashMenu = $this->prop('hasZentaoSlashMenu');
  95. if($hasZentaoSlashMenu === null ) $hasZentaoSlashMenu = true;
  96. $app->control->loadModel('file');
  97. $canDownload = common::hasPriv('file', 'download');
  98. $fileListProps = array();
  99. if($canDownload)
  100. {
  101. $previewLink = helper::createLink('file', 'download', "fileID={id}&mouse=left");
  102. jsVar('previewLang', $lang->file->preview);
  103. jsVar('downloadLang', $lang->file->download);
  104. jsVar('previewLink', $previewLink);
  105. jsVar('downloadLink', $fileUrl);
  106. jsVar('libreOfficeTurnon', isset($config->file->libreOfficeTurnon) && $config->file->libreOfficeTurnon == 1);
  107. $fileListProps['fileUrl'] = $fileUrl;
  108. $fileListProps['target'] = '_blank';
  109. $fileListProps['hoverItemActions'] = true;
  110. $fileListProps['itemProps'] = array('target' => '_blank');
  111. $fileListProps['fileActions'] = jsCallback('file')->do('return getFileActions(file)');
  112. }
  113. else
  114. {
  115. $fileUrl = '';
  116. }
  117. $canPreviewOffice = $canDownload && isset($config->file->libreOfficeTurnon) and $config->file->libreOfficeTurnon == 1;
  118. $historyPanelProps = $this->prop('historyPanel');
  119. if(empty($historyPanelProps)) $historyPanelProps = array();
  120. if(is_array($historyPanelProps)) $historyPanelProps['fileListProps'] = $fileListProps;
  121. return zui::docViewer
  122. (
  123. set::_class('shadow rounded ring canvas'),
  124. set::_style(array('height' => 'calc(100vh - 72px)')),
  125. set::_id('docApp'),
  126. set::docViewer(true),
  127. set::token(session_id()),
  128. set::awarenessUser(array('id' => $app->user->id, 'account' => $app->user->account, 'name' => $app->user->realname, 'avatar' => $app->user->avatar)),
  129. set::onModeChange(jsRaw('window.onDocAppModeChange')),
  130. set::width('100%'),
  131. set::height('100%'),
  132. set::userMap(data('users')),
  133. set::currentUser($app->user->account),
  134. set::privs(array()),
  135. set::uploadUrl($uploadUrl),
  136. set::downloadUrl($downloadUrl),
  137. set::sessionStr($sessionStr),
  138. set::fileUrl($fileUrl),
  139. set::viewModeUrl($viewModeUrl),
  140. set::langData($langData),
  141. set::historyPanel($historyPanelProps),
  142. set::showToolbar(true),
  143. set::canPreviewOffice($canPreviewOffice),
  144. set::fileInfoUrl($fileInfoUrl),
  145. set::getTableOptions(null),
  146. set::mode('view'),
  147. set::noSidebar(true),
  148. set::noSpace('hidden'),
  149. set::homeName(false),
  150. set::noDocSwitcher(true),
  151. set('$options', jsRaw('window.setDocAppOptions')),
  152. set($this->props)
  153. );
  154. }
  155. }