PeopleDetail.js 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577
  1. MWF.xDesktop.requireApp("Attendance", "Explorer", null, false);
  2. MWF.xDesktop.requireApp("Organization", "Selector.package", null, false);
  3. MWF.xApplication.Attendance.PeopleDetail = new Class({
  4. Extends: MWF.widget.Common,
  5. Implements: [Options, Events],
  6. options: {
  7. "style": "default"
  8. },
  9. initialize: function(node, app, actions, options){
  10. this.setOptions(options);
  11. this.app = app;
  12. this.path = "/x_component_Attendance/$PeopleDetail/";
  13. this.cssPath = "/x_component_Attendance/$PeopleDetail/"+this.options.style+"/css.wcss";
  14. this._loadCss();
  15. this.actions = actions;
  16. this.node = $(node);
  17. },
  18. load: function(){
  19. this.loadTab();
  20. },
  21. loadTab : function(){
  22. this.tabNode = new Element("div",{"styles" : this.css.tabNode }).inject(this.node)
  23. this.detailArea = new Element("div",{"styles" : this.css.tabPageContainer }).inject(this.tabNode)
  24. //this.selfHolidayArea = new Element("div",{"styles" : this.css.tabPageContainer }).inject(this.tabNode)
  25. this.detailStaticArea = new Element("div",{"styles" : this.css.tabPageContainer }).inject(this.tabNode)
  26. //this.selfHolidayStaticArea = new Element("div",{"styles" : this.css.tabPageContainer }).inject(this.tabNode)
  27. MWF.require("MWF.widget.Tab", function(){
  28. this.tabs = new MWF.widget.Tab(this.tabNode, {"style": "attendance"});
  29. this.tabs.load();
  30. this.detailPage = this.tabs.addTab(this.detailArea, "个人出勤明细", false);
  31. this.detailPage.contentNodeArea.set("class","detailPage");
  32. this.detailPage.addEvent("show",function(){
  33. if( !this.detailExplorer ){
  34. this.detailExplorer = new MWF.xApplication.Attendance.PeopleDetail.Explorer( this.detailArea, this );
  35. this.detailExplorer.load();
  36. }
  37. }.bind(this))
  38. //this.selfHolidayPage = this.tabs.addTab(this.selfHolidayArea, "个人休假明细", false);
  39. //this.selfHolidayPage.contentNodeArea.set("class","selfHolidayPage");
  40. //this.selfHolidayPage.addEvent("show",function(){
  41. // if( !this.selfHolidayExplorer ){
  42. // this.selfHolidayExplorer = new MWF.xApplication.Attendance.PeopleDetail.SelfHolidayExplorer( this.selfHolidayArea, this );
  43. // this.selfHolidayExplorer.load();
  44. // }
  45. //}.bind(this))
  46. this.detailStaticPage = this.tabs.addTab(this.detailStaticArea, "个人出勤率统计", false);
  47. this.detailStaticPage.contentNodeArea.set("class","detailStaticPage");
  48. this.detailStaticPage.addEvent("show",function(){
  49. if( !this.detailStaticExplorer ){
  50. this.detailStaticExplorer = new MWF.xApplication.Attendance.PeopleDetail.DetailStaticExplorer( this.detailStaticArea, this );
  51. this.detailStaticExplorer.load();
  52. }
  53. }.bind(this))
  54. //this.selfHolidayStaticPage = this.tabs.addTab(this.selfHolidayStaticArea, "个人休假统计", false);
  55. //this.selfHolidayStaticPage.contentNodeArea.set("class","selfHolidayStaticPage");
  56. //this.selfHolidayStaticPage.addEvent("show",function(){
  57. // if( !this.selfHolidayStaticExplorer ){
  58. // this.selfHolidayStaticExplorer = new MWF.xApplication.Attendance.PeopleDetail.SelfHolidayStaticExplorer( this.selfHolidayStaticArea, this );
  59. // this.selfHolidayStaticExplorer.load();
  60. // }
  61. //}.bind(this))
  62. this.tabs.pages[0].showTab();
  63. }.bind(this));
  64. }
  65. })
  66. MWF.xApplication.Attendance.PeopleDetail.Explorer = new Class({
  67. Extends: MWF.xApplication.Attendance.Explorer,
  68. Implements: [Options, Events],
  69. initialize: function(node, parent, options){
  70. this.setOptions(options);
  71. this.parent = parent;
  72. this.app = parent.app;
  73. this.css = parent.css;
  74. this.path = parent.path;
  75. this.actions = parent.actions;
  76. this.node = $(node);
  77. this.initData();
  78. if (!this.peopleActions) this.peopleActions = new MWF.xAction.org.express.RestActions();
  79. },
  80. initData: function(){
  81. this.toolItemNodes = [];
  82. },
  83. reload: function(){
  84. this.node.empty();
  85. this.load();
  86. },
  87. load: function(){
  88. this.loadFilter();
  89. this.loadContentNode();
  90. this.setNodeScroll();
  91. },
  92. loadFilter : function(){
  93. this.fileterNode = new Element("div.fileterNode", {
  94. "styles" : this.css.fileterNode
  95. }).inject(this.node)
  96. var table = new Element("table", {
  97. "width" : "100%", "border" : "0", "cellpadding" : "5", "cellspacing" : "0", "styles" : this.css.filterTable, "class" : "filterTable"
  98. }).inject( this.fileterNode );
  99. table.setStyle("width","1000px");
  100. var tr = new Element("tr").inject(table);
  101. this.createPersonTd( tr )
  102. this.createYearSelectTd( tr )
  103. this.createMonthSelectTd( tr )
  104. this.createDateSelectTd( tr )
  105. this.createIsAbsent(tr)
  106. this.createIsLate( tr )
  107. //this.createIsLeaveEarlier( tr )
  108. this.createLackOfTimeCount(tr)
  109. this.createActionTd( tr )
  110. },
  111. createPersonTd : function(tr){
  112. var _self = this;
  113. var td = new Element("td", { "styles" : this.css.filterTableTitle, "text" : "人员" }).inject(tr);
  114. var td = new Element("td", { "styles" : this.css.filterTableValue }).inject(tr);
  115. this.q_empName = new MDomItem( td, {
  116. "name" : "q_empName",
  117. "event" : {
  118. "click" : function(el){ _self.selecePerson(); }
  119. }
  120. }, true, this.app );
  121. this.q_empName.load();
  122. },
  123. createYearSelectTd : function( tr ){
  124. var _self = this;
  125. var td = new Element("td", { "styles" : this.css.filterTableTitle, "text" : "年度" }).inject(tr);
  126. var td = new Element("td", { "styles" : this.css.filterTableValue }).inject(tr);
  127. this.cycleYear = new MDomItem( td, {
  128. "name" : "cycleYear",
  129. "type" : "select",
  130. "selectValue" : function(){
  131. var years = [];
  132. var year = new Date().getFullYear();
  133. for(var i=0; i<6; i++ ){
  134. years.push( year-- );
  135. }
  136. return years;
  137. },
  138. "event" : {
  139. "change" : function(){ if(_self.dateSelecterTd)_self.createDateSelectTd() }
  140. }
  141. }, true, this.app );
  142. this.cycleYear.load();
  143. },
  144. createMonthSelectTd : function( tr ){
  145. var _self = this;
  146. var td = new Element("td", { "styles" : this.css.filterTableTitle, "text" : "月份" }).inject(tr);
  147. var td = new Element("td", { "styles" : this.css.filterTableValue }).inject(tr);
  148. this.cycleMonth = new MDomItem( td, {
  149. "name" : "cycleMonth",
  150. "type" : "select",
  151. "defaultValue" : function(){
  152. var month = (new Date().getMonth() + 1 ).toString();
  153. return month.length == 1 ? "0"+month : month;
  154. },
  155. "selectValue" :["","01","02","03","04","05","06","07","08","09","10","11","12"],
  156. "event" : {
  157. "change" : function(){ if(_self.dateSelecterTd)_self.createDateSelectTd() }
  158. }
  159. }, true, this.app );
  160. this.cycleMonth.load();
  161. },
  162. createDateSelectTd : function( tr ){
  163. var _self = this;
  164. if( tr ){
  165. var td = new Element("td", { "styles" : this.css.filterTableTitle, "text" : "日期" }).inject(tr);
  166. this.dateSelecterTd = new Element("td", { "styles" : this.css.filterTableValue }).inject(tr);
  167. }
  168. if( this.q_date ){
  169. this.dateSelecterTd.empty();
  170. }
  171. this.q_date = new MDomItem( this.dateSelecterTd, {
  172. "name" : "q_date",
  173. "type" : "select",
  174. "selectValue" : function(){
  175. var year = parseInt(_self.cycleYear.getValue());
  176. var month = parseInt(_self.cycleMonth.getValue())-1;
  177. var date = new Date(year, month, 1);
  178. var days = [];
  179. days.push("");
  180. while (date.getMonth() === month) {
  181. var d = date.getDate().toString();
  182. if( d.length == 1 )d = "0"+d
  183. days.push( d );
  184. date.setDate(date.getDate() + 1);
  185. }
  186. return days;
  187. }
  188. }, true, this.app );
  189. this.q_date.load();
  190. },
  191. createIsAbsent: function(tr){
  192. var td = new Element("td", { "styles" : this.css.filterTableTitle, "text" : "缺勤" }).inject(tr);
  193. var td = new Element("td", { "styles" : this.css.filterTableValue }).inject(tr);
  194. this.isAbsent = new MDomItem( td, {
  195. "name" : "isAbsent",
  196. "type" : "select",
  197. "selectValue" : ["","true","false"],
  198. "selectText" : ["","缺勤","未缺勤"],
  199. }, true, this.app );
  200. this.isAbsent.load();
  201. },
  202. //createIsLeaveEarlier: function(tr){
  203. // var td = new Element("td", { "styles" : this.css.filterTableTitle, "text" : "早退" }).inject(tr);
  204. // var td = new Element("td", { "styles" : this.css.filterTableValue }).inject(tr);
  205. // this.isLeaveEarlier = new MDomItem( td, {
  206. // "name" : "isLeaveEarlier",
  207. // "type" : "select",
  208. // "selectValue" : ["-1","true","false"],
  209. // "selectText" : ["","早退","未早退"],
  210. // }, true, this.app );
  211. // this.isLeaveEarlier.load();
  212. //},
  213. createLackOfTimeCount: function(tr){
  214. var td = new Element("td", { "styles" : this.css.filterTableTitle, "text" : "工时不足" }).inject(tr);
  215. var td = new Element("td", { "styles" : this.css.filterTableValue }).inject(tr);
  216. this.isLackOfTime = new MDomItem( td, {
  217. "name" : "isLackOfTime",
  218. "type" : "select",
  219. "selectValue" : ["","true","false"],
  220. "selectText" : ["","是","否"],
  221. }, true, this.app );
  222. this.isLackOfTime.load();
  223. },
  224. createIsLate: function(tr){
  225. var td = new Element("td", { "styles" : this.css.filterTableTitle, "text" : "迟到" }).inject(tr);
  226. var td = new Element("td", { "styles" : this.css.filterTableValue }).inject(tr);
  227. this.isLate = new MDomItem( td, {
  228. "name" : "isLate",
  229. "type" : "select",
  230. "selectValue" : ["","true","false"],
  231. "selectText" : ["","迟到","未迟到"],
  232. }, true, this.app );
  233. this.isLate.load();
  234. },
  235. createActionTd : function( tr ){
  236. var td = new Element("td", { "styles" : this.css.filterTableValue }).inject(tr);
  237. var input = new Element("button",{
  238. "text" : "查询",
  239. "styles" : this.css.filterButton
  240. }).inject(td);
  241. input.addEvent("click", function(){
  242. if( this.q_empName.getValue().trim() == "" ){
  243. this.app.notice( "请先选择员工", "error" );
  244. return;
  245. }
  246. var filterData = {
  247. q_empName : this.q_empName.getValue(),
  248. cycleYear : this.cycleYear.getValue(),
  249. cycleMonth : this.cycleMonth.getValue()
  250. }
  251. if( this.isAbsent && this.isAbsent.getValue()!="" ){
  252. filterData.isAbsent = this.getBoolean( this.isAbsent.getValue() );
  253. }
  254. if( this.isLeaveEarlier && this.isLeaveEarlier.getValue()!="" ){
  255. filterData.isLeaveEarlier = this.getBoolean( this.isLeaveEarlier.getValue() );
  256. }
  257. if( this.isLate && this.isLate.getValue()!="" ){
  258. filterData.isLate = this.getBoolean( this.isLate.getValue() );
  259. }
  260. if( this.isLackOfTime && this.isLackOfTime.getValue()!="" ){
  261. filterData.isLackOfTime = this.getBoolean( this.isLackOfTime.getValue() );
  262. }
  263. if( this.q_date && this.q_date.getValue()!="" ){
  264. filterData.q_date = this.cycleYear.getValue() + "-" + this.cycleMonth.getValue() + "-" + this.q_date.getValue();
  265. }
  266. this.loadView( filterData );
  267. }.bind(this))
  268. },
  269. getBoolean : function( value ){
  270. if( value === "true" )return true;
  271. if( value === "false" )return false;
  272. return value;
  273. },
  274. selecePerson: function(){
  275. var options = {
  276. "type": "person",
  277. "title": "选择人员",
  278. "count" : "1",
  279. "onComplete": function(items){
  280. var names = [];
  281. items.each(function(item){
  282. names.push(item.data.name);
  283. }.bind(this));
  284. this.q_empName.setValue( names.join(",") )
  285. }.bind(this)
  286. };
  287. if( !this.app.isAdmin() && this.app.isDepartmentManager() ){
  288. options.departments = this.app.manageDepartments;
  289. }
  290. var selector = new MWF.OrgSelector(this.app.content, options);
  291. },
  292. loadContentNode: function(){
  293. this.elementContentNode = new Element("div", {
  294. "styles": this.css.elementContentNode
  295. }).inject(this.node);
  296. this.app.addEvent("resize", function(){this.setContentSize();}.bind(this));
  297. },
  298. loadView : function( filterData ){
  299. this.elementContentNode.empty();
  300. if( this.view )delete this.view;
  301. this.view = new MWF.xApplication.Attendance.PeopleDetail.View(this.elementContentNode, this.app,this );
  302. this.view.filterData = filterData
  303. this.view.load();
  304. this.setContentSize();
  305. },
  306. setContentSize: function(){
  307. var tabNodeSize = this.parent.tabs ? this.parent.tabs.tabNodeContainer.getSize() : {"x":0,"y":0};
  308. var fileterNodeSize = this.fileterNode ? this.fileterNode.getSize() : {"x":0,"y":0};
  309. var nodeSize = this.parent.node.getSize();
  310. var pt = this.elementContentNode.getStyle("padding-top").toFloat();
  311. var pb = this.elementContentNode.getStyle("padding-bottom").toFloat();
  312. //var filterSize = this.filterNode.getSize();
  313. var height = nodeSize.y-tabNodeSize.y-pt-pb-fileterNodeSize.y-20;
  314. this.elementContentNode.setStyle("height", ""+height+"px");
  315. this.pageCount = (height/40).toInt()+5;
  316. if (this.view && this.view.items.length<this.pageCount){
  317. this.view.loadElementList(this.pageCount-this.view.items.length);
  318. }
  319. }
  320. });
  321. MWF.xApplication.Attendance.PeopleDetail.SelfHolidayExplorer = new Class({
  322. Extends: MWF.xApplication.Attendance.PeopleDetail.Explorer,
  323. loadView : function( filterData ){
  324. this.elementContentNode.empty();
  325. if( this.view )delete this.view;
  326. this.view = new MWF.xApplication.Attendance.PeopleDetail.SelfHolidayView(this.elementContentNode, this.app,this );
  327. this.view.filterData = filterData
  328. this.view.load();
  329. this.setContentSize();
  330. }
  331. })
  332. MWF.xApplication.Attendance.PeopleDetail.DetailStaticExplorer = new Class({
  333. Extends: MWF.xApplication.Attendance.PeopleDetail.Explorer,
  334. loadFilter : function(){
  335. this.fileterNode = new Element("div.fileterNode", {
  336. "styles" : this.css.fileterNode
  337. }).inject(this.node)
  338. var table = new Element("table", {
  339. "width" : "100%", "border" : "0", "cellpadding" : "5", "cellspacing" : "0", "styles" : this.css.filterTable, "class" : "filterTable"
  340. }).inject( this.fileterNode );
  341. table.setStyle("width","460px");
  342. var tr = new Element("tr").inject(table);
  343. this.createPersonTd(tr)
  344. this.createYearSelectTd( tr )
  345. this.createMonthSelectTd( tr )
  346. //this.createDateSelectTd( tr )
  347. this.createActionTd( tr )
  348. },
  349. createMonthSelectTd : function( tr ){
  350. var _self = this;
  351. var td = new Element("td", { "styles" : this.css.filterTableTitle, "text" : "月份" }).inject(tr);
  352. var td = new Element("td", { "styles" : this.css.filterTableValue }).inject(tr);
  353. this.cycleMonth = new MDomItem( td, {
  354. "name" : "cycleMonth",
  355. "type" : "select",
  356. "selectValue" :["","01","02","03","04","05","06","07","08","09","10","11","12"],
  357. "event" : {
  358. "change" : function(){ if(_self.dateSelecterTd)_self.createDateSelectTd() }
  359. }
  360. }, true, this.app );
  361. this.cycleMonth.load();
  362. },
  363. createActionTd : function( tr ){
  364. var td = new Element("td", { "styles" : this.css.filterTableValue }).inject(tr);
  365. var input = new Element("button",{
  366. "text" : "查询",
  367. "styles" : this.css.filterButton
  368. }).inject(td);
  369. input.addEvent("click", function(){
  370. if( this.q_empName.getValue().trim() == "" ){
  371. this.app.notice( "请先选择员工", "error" );
  372. return;
  373. }
  374. var filterData = {
  375. q_empName : this.q_empName.getValue(),
  376. cycleYear : this.cycleYear.getValue(),
  377. cycleMonth : this.cycleMonth.getValue()
  378. }
  379. if( this.isAbsent && this.isAbsent.getValue()!="" ){
  380. filterData.isAbsent = this.isAbsent.getValue();
  381. }
  382. if( this.isLeaveEarlier && this.isLeaveEarlier.getValue()!="" ){
  383. filterData.isLeaveEarlier = this.isLeaveEarlier.getValue();
  384. }
  385. if( this.isLate && this.isLate.getValue()!="" ){
  386. filterData.isLate = this.isLate.getValue();
  387. }
  388. if( this.q_date && this.q_date.getValue()!="" ){
  389. filterData.q_date = this.cycleYear.getValue() + "-" + this.cycleMonth.getValue() + "-" + this.q_date.getValue();
  390. }
  391. this.loadView( filterData );
  392. }.bind(this))
  393. },
  394. loadView : function( filterData ){
  395. this.elementContentNode.empty();
  396. if( this.view )delete this.view;
  397. this.view = new MWF.xApplication.Attendance.PeopleDetail.DetailStaticView(this.elementContentNode, this.app,this );
  398. this.view.filterData = filterData;
  399. this.view.listItemUrl = this.path+"listItem_detailStatic.json";
  400. this.view.load();
  401. this.setContentSize();
  402. }
  403. })
  404. MWF.xApplication.Attendance.PeopleDetail.SelfHolidayStaticExplorer = new Class({
  405. Extends: MWF.xApplication.Attendance.PeopleDetail.Explorer,
  406. loadView : function( filterData ){
  407. this.elementContentNode.empty();
  408. if( this.view )delete this.view;
  409. this.view = new MWF.xApplication.Attendance.PeopleDetail.SelfHolidayStaticView(this.elementContentNode, this.app,this );
  410. this.view.filterData = filterData
  411. this.view.load();
  412. this.setContentSize();
  413. }
  414. })
  415. MWF.xApplication.Attendance.PeopleDetail.View = new Class({
  416. Extends: MWF.xApplication.Attendance.Explorer.View,
  417. _createItem: function(data){
  418. return new MWF.xApplication.Attendance.PeopleDetail.Document(this.table, data, this.explorer, this);
  419. },
  420. _getCurrentPageData: function(callback, count){
  421. if(!count)count=20;
  422. var id = (this.items.length) ? this.items[this.items.length-1].data.id : "(0)";
  423. var filter = this.filterData || {};
  424. filter.key = this.sortField || this.sortFieldDefault || "";
  425. filter.order = this.sortType || this.sortTypeDefault || "";
  426. this.actions.listDetailFilterNext( id, count, filter, function(json){
  427. if( callback )callback(json);
  428. }.bind(this))
  429. //this.actions.listDetailFilter( filter, function(json){
  430. // if( callback )callback(json);
  431. //}.bind(this))
  432. },
  433. _removeDocument: function(documentData, all){
  434. },
  435. _createDocument: function(){
  436. },
  437. _openDocument: function( documentData ){
  438. }
  439. })
  440. MWF.xApplication.Attendance.PeopleDetail.SelfHolidayView = new Class({
  441. Extends: MWF.xApplication.Attendance.Explorer.View,
  442. _createItem: function(data){
  443. return new MWF.xApplication.Attendance.PeopleDetail.SelfHolidayDocument(this.table, data, this.explorer, this);
  444. },
  445. _getCurrentPageData: function(callback, count){
  446. var filter = this.filterData || {};
  447. this.actions.listDetailFilter( filter, function(json){
  448. if( callback )callback(json);
  449. }.bind(this))
  450. },
  451. _removeDocument: function(documentData, all){
  452. },
  453. _createDocument: function(){
  454. },
  455. _openDocument: function( documentData ){
  456. }
  457. })
  458. MWF.xApplication.Attendance.PeopleDetail.DetailStaticView = new Class({
  459. Extends: MWF.xApplication.Attendance.Explorer.View,
  460. _createItem: function(data){
  461. return new MWF.xApplication.Attendance.PeopleDetail.DetailStaticDocument(this.table, data, this.explorer, this);
  462. },
  463. _getCurrentPageData: function(callback, count){
  464. var filter = this.filterData || {};
  465. if( filter.cycleMonth == "" )filter.cycleMonth="(0)";
  466. this.actions.listStaticMonthPerson( filter.q_empName, filter.cycleYear,filter.cycleMonth, function(json){
  467. var data = json.data;
  468. data.sort( function( a, b ){
  469. return parseInt( b.statisticYear + b.statisticMonth ) - parseInt( a.statisticYear + a.statisticMonth )
  470. })
  471. json.data = data;
  472. if( callback )callback(json);
  473. }.bind(this))
  474. },
  475. _removeDocument: function(documentData, all){
  476. },
  477. _createDocument: function(){
  478. },
  479. _openDocument: function( documentData ){
  480. }
  481. })
  482. MWF.xApplication.Attendance.PeopleDetail.SelfHolidayStaticView = new Class({
  483. Extends: MWF.xApplication.Attendance.Explorer.View,
  484. _createItem: function(data){
  485. return new MWF.xApplication.Attendance.PeopleDetail.SelfHolidayStaticDocument(this.table, data, this.explorer, this);
  486. },
  487. _getCurrentPageData: function(callback, count){
  488. var filter = this.filterData || {};
  489. this.actions.listPeopleDetailFilter( filter, function(json){
  490. if( callback )callback(json);
  491. }.bind(this))
  492. },
  493. _removeDocument: function(documentData, all){
  494. },
  495. _createDocument: function(){
  496. },
  497. _openDocument: function( documentData ){
  498. }
  499. })
  500. MWF.xApplication.Attendance.PeopleDetail.Document = new Class({
  501. Extends: MWF.xApplication.Attendance.Explorer.Document
  502. })
  503. MWF.xApplication.Attendance.PeopleDetail.SelfHolidayDocument = new Class({
  504. Extends: MWF.xApplication.Attendance.Explorer.Document
  505. })
  506. MWF.xApplication.Attendance.PeopleDetail.DetailStaticDocument = new Class({
  507. Extends: MWF.xApplication.Attendance.Explorer.Document
  508. })
  509. MWF.xApplication.Attendance.PeopleDetail.SelfHolidayStaticDocument = new Class({
  510. Extends: MWF.xApplication.Attendance.Explorer.Document
  511. })