filesjs.ejs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. <style>
  2. #file-right-view {
  3. position: relative;
  4. }
  5. #file-right-spr.file-main-resizer {
  6. position: absolute;
  7. top: 0;
  8. bottom: 0;
  9. left: 0;
  10. width: 12px;
  11. height: 100%;
  12. margin-left: 0;
  13. float: none;
  14. cursor: col-resize;
  15. z-index: 20;
  16. user-select: none;
  17. }
  18. #file-right-spr .file-main-resizer-button {
  19. position: absolute;
  20. top: 50%;
  21. left: 1px;
  22. width: 10px;
  23. height: 42px;
  24. display: flex;
  25. align-items: center;
  26. justify-content: center;
  27. transform: translateY(-50%);
  28. border: 1px solid #b8c2cc;
  29. border-radius: 0 4px 4px 0;
  30. background-color: #fff;
  31. color: #7d8790;
  32. box-shadow: 1px 0 3px rgba(0, 0, 0, .12);
  33. pointer-events: none;
  34. transition: border-color .15s, background-color .15s, color .15s;
  35. }
  36. #file-right-spr:hover .file-main-resizer-button {
  37. border-color: #409eff;
  38. background-color: #ecf5ff;
  39. color: #409eff;
  40. }
  41. </style>
  42. <div class="panel-content">
  43. <div class="panel-title fluid">
  44. <div class="title-main d-flex justify-content-between">
  45. <div>资料管理/<%- ctx.subProject.name %><span class="ml-4" id="file-count"></span></div>
  46. <div class="ml-auto">
  47. <% if (canManageDir) { %>
  48. <a href="/sp/<%- ctx.subProject.id %>/config-dir" class="btn btn-outline-primary btn-sm ml-1">配置目录</a>
  49. <% } %>
  50. </div>
  51. </div>
  52. </div>
  53. <div class="content-wrap row pr-46">
  54. <div class="d-flex flex-nowrap w-100 sub-content">
  55. <div class="c-body" id="left-view" style="width: 100%; min-width: 0; flex: 0 0 auto;">
  56. <div class="sjs-height-0 d-flex flex-nowrap w-100" style="margin-left: 0 !important; overflow: hidden;">
  57. <div class="border-right" id="file-left-view" style="width: 22%; min-width: 160px; flex: 0 0 auto; overflow: hidden;">
  58. <div class="d-flex flex-row">
  59. <div class="btn-group">
  60. <button type="button" class="btn btn-sm text-primary dropdown-toggle" data-toggle="dropdown" id="zhankai" aria-expanded="false">显示层级</button>
  61. <div class="dropdown-menu" aria-labelledby="zhankai" x-placement="bottom-start" style="position: absolute; transform: translate3d(0px, 21px, 0px); top: 0px; left: 0px; will-change: transform;">
  62. <a class="dropdown-item" name="showLevel" tag="1" href="javascript: void(0);">第一层</a>
  63. <a class="dropdown-item" name="showLevel" tag="2" href="javascript: void(0);">第二层</a>
  64. <a class="dropdown-item" name="showLevel" tag="3" href="javascript: void(0);">第三层</a>
  65. <a class="dropdown-item" name="showLevel" tag="4" href="javascript: void(0);">第四层</a>
  66. <a class="dropdown-item" name="showLevel" tag="last" href="javascript: void(0);">最底层</a>
  67. </div>
  68. </div>
  69. <div class="p-2 js-can-edit-dir" style="display:none;"><a href="javascript: void(0);" id="add-slibing">添加同级</a></div>
  70. <div class="p-2 js-can-edit-dir" style="display:none;"><a href="javascript: void(0);" id="add-child">添加子级</a></div>
  71. </div>
  72. <div id="filing-spread" style="width: 100%; height: calc(100% - 40px);"></div>
  73. </div>
  74. <div id="file-right-view" style="width: 76%; min-width: 0; flex: 0 0 auto; overflow: hidden;">
  75. <div class="resize-x file-main-resizer" id="file-right-spr" r-Type="width" div1="#file-left-view" div2="#file-right-view" title="拖动调整目录和文件区域宽度" a-type="percent" store-id="file-detail-sjs" store-version="1.0.0" min="20">
  76. <span class="file-main-resizer-button" aria-hidden="true">&#8942;</span>
  77. </div>
  78. <div class="ml-2" id="file-view" style="display: none; min-width: 0; overflow: hidden;">
  79. <div class="d-flex flex-nowrap align-items-stretch w-100" style="min-width: 0;">
  80. <div class="flex-grow-1 pr-2" style="min-width: 0; overflow-x: auto;">
  81. <div class="d-flex flex-row">
  82. <div class="py-2 pr-2 js-can-upload" style="display:none;"><a href="#add-file" data-toggle="modal" data-target="#add-file">上传文件</a></div>
  83. <div class="py-2 pr-2 js-can-upload" style="display:none;"><a href="#add-big-file" data-toggle="modal" data-target="#add-big-file">大文件上传</a></div>
  84. <div class="p-2 js-can-upload" id="rela-file-btn" style="display:none;"><a href="#rela-file" data-toggle="modal" data-target="#rela-file">引用文件</a></div>
  85. <div class="p-2"><a href="javascript: void(0)" id="batch-del-file-btn">批量删除</a></div>
  86. <div class="p-2"><a href="javascript: void(0)" id="batch-download">批量下载</a></div>
  87. <div class="p-2">
  88. <span id="showPage">
  89. <a href="javascript:void(0);" class="page-select ml-3" content="pre"><i class="fa fa-chevron-left"></i></a>
  90. <span id="curPage">1</span>/<span id="curTotalPage">10</span>
  91. <a href="javascript:void(0);" class="page-select mr-3" content="next"><i class="fa fa-chevron-right"></i></a>
  92. </span>
  93. </div>
  94. </div>
  95. <table class="table table-hover table-bordered" style="min-width: 590px;">
  96. <thead>
  97. <tr class="text-center">
  98. <th width="60px">选择</th>
  99. <th>文件名称 <span name="file-sort" field="filename" tag="filename|desc"><i class="fa fa-sort" aria-hidden="true"></i></span></th>
  100. <th width="70px">锁定 <i class="fa fa-info-circle text-muted" title="锁定后,任何用户均不能编辑、移动或删除该文件"></i></th>
  101. <th width="10%">上传人</th>
  102. <th width="20%">上传时间 <span name="file-sort" field="create_time" tag="create_time|asc"><i class="fa fa-sort-amount-desc" aria-hidden="true"></i></span></th>
  103. <th width="10%">文件类型</th>
  104. <th width="60px">操作</th>
  105. </tr>
  106. </thead>
  107. <tbody id="file-list">
  108. </tbody>
  109. </table>
  110. </div>
  111. <div class="border ml-2" style="width: 250px; flex: 0 1 250px; min-width: 180px; max-width: 320px; min-height: 260px; overflow: hidden;">
  112. <div class="font-weight-bold text-center border-bottom py-2">上报说明</div>
  113. <div id="filing-upload-tips" class="p-3 text-muted"
  114. style="white-space: pre-wrap; overflow-wrap: anywhere; max-height: calc(100vh - 230px); overflow-y: auto;">暂无上报说明</div>
  115. </div>
  116. </div>
  117. </div>
  118. </div>
  119. </div>
  120. </div>
  121. <div class="c-body" id="right-view" style="display: none; width: 33%; min-width: 0; flex: 0 0 auto; overflow: hidden;">
  122. <div class="resize-x" id="right-spr" r-Type="width" div1="#left-view" div2="#right-view" title="调整大小" a-type="percent"></div>
  123. <div class="tab-content">
  124. <div id="search" class="tab-pane tab-select-show mr-1">
  125. <div class="sjs-bar mt-1">
  126. <div class="input-group input-group-sm pb-1">
  127. <div class="input-group-prepend">
  128. <select class="input-group-text" id="search-filter">
  129. <option value="cur">当前分类</option>
  130. <option value="all">全部分类</option>
  131. </select>
  132. </div>
  133. <input id="search-keyword" type="text" class="form-control" autocomplete="off" placeholder="输入文件名称查找" aria-label="Recipient\'s username" aria-describedby="button-addon2">
  134. <div class="input-group-append"><button class="btn btn-outline-secondary" type="button">搜索</button></div>
  135. </div>
  136. </div>
  137. <div class="sjs-sh scroll-y">
  138. <table class="table table-bordered">
  139. <tr class="text-center"><th>文件名称</th><th width="15%">上传人</th><th width="15%">操作</th></tr>
  140. <tbody id="search-list"></tbody>
  141. </table>
  142. </div>
  143. </div>
  144. <div id="reference" class="tab-pane tab-select-show">
  145. </div>
  146. </div>
  147. </div>
  148. </div>
  149. <!--右侧菜单-->
  150. <div class="side-menu">
  151. <ul class="nav flex-column right-nav" id="side-menu">
  152. <li>
  153. <a class="nav-link" content="#search" href="javascript: void(0);">查找定位</a>
  154. </li>
  155. <li>
  156. <a class="nav-link" content="#reference" href="javascript: void(0);">参考文件</a>
  157. </li>
  158. </ul>
  159. </div>
  160. </div>
  161. </div>
  162. <% if (needFilingInitialization) { %>
  163. <div class="modal fade" id="filing-initialization-modal" data-backdrop="static" data-keyboard="false">
  164. <div class="modal-dialog" role="document">
  165. <div class="modal-content">
  166. <div class="modal-header">
  167. <h5 class="modal-title">初始化资料目录</h5>
  168. </div>
  169. <div class="modal-body px-4 py-4" style="min-height: 205px;">
  170. <div class="d-flex flex-wrap justify-content-between mb-3">
  171. <label class="mb-0 mr-3">
  172. <input type="radio" name="filing-initialization-type" value="blank" checked class="mr-1">新创建目录
  173. </label>
  174. <label class="mb-0 mr-3">
  175. <input type="radio" name="filing-initialization-type" value="template" class="mr-1">从模板库中选取
  176. </label>
  177. <label class="mb-0">
  178. <input type="radio" name="filing-initialization-type" value="project" class="mr-1">从其他项目中选取
  179. </label>
  180. </div>
  181. <div id="filing-initialization-description" class="text-muted mb-3">从空白目录开始创建资料目录</div>
  182. <div id="filing-initialization-template-wrap" style="display:none;">
  183. <select class="form-control form-control-sm" id="filing-initialization-template">
  184. <option value="">选择系统模板库</option>
  185. <% for (const template of filingInitializationTemplates) { %>
  186. <option value="<%= template.id %>"><%= template.name %></option>
  187. <% } %>
  188. </select>
  189. </div>
  190. <div id="filing-initialization-project-wrap" style="display:none;">
  191. <select class="form-control form-control-sm" id="filing-initialization-project">
  192. <option value="">选择项目</option>
  193. <% for (const project of filingInitializationProjects) { %>
  194. <option value="<%= project.id %>"><%= project.name %></option>
  195. <% } %>
  196. </select>
  197. <% if (filingInitializationProjects.length === 0) { %>
  198. <small class="form-text text-warning">当前账号暂无其他可复制目录的项目</small>
  199. <% } %>
  200. </div>
  201. </div>
  202. <div class="modal-footer">
  203. <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
  204. <button type="button" class="btn btn-sm btn-primary" id="filing-initialization-ok">确定</button>
  205. </div>
  206. </div>
  207. </div>
  208. </div>
  209. <% } %>
  210. <script>
  211. let canFiling = false;
  212. let canUpload = false;
  213. const filing = JSON.parse(unescape('<%- escape(JSON.stringify(filing)) %>'));
  214. const category = JSON.parse(unescape('<%- escape(JSON.stringify(categoryData)) %>'));
  215. const whiteList = JSON.parse('<%- JSON.stringify(fileUploadWhitelist) %>');
  216. let canEdit = false;
  217. let canLockFile = false;
  218. const filingPermissionMap = JSON.parse(unescape('<%- escape(JSON.stringify(filingPermissionMap)) %>'));
  219. const projectFileLocked = <%- Boolean(ctx.subProject.lock_file) %>;
  220. const fileReferenceList = JSON.parse('<%- JSON.stringify(fileReferenceList) %>');
  221. const needFilingInitialization = <%- Boolean(needFilingInitialization) %>;
  222. </script>