modular_model.js 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827
  1. /**********************************************************************************
  2. * modular_model.js
  3. *
  4. * Modular 프레임워크의 모델과 관련된 부분이 포함되어 있는 스크립트 파일
  5. * 'Modular.model' 이라는 네임스페이스를 사용하고 있음
  6. *
  7. * @author 김선엽(sunyoupk@udapsoft.co.kr)
  8. **********************************************************************************/
  9. /*=============================================================
  10. *
  11. * SearchOperator 구현
  12. *
  13. =============================================================*/
  14. /**
  15. * 조회 연산자를 포함하고 있는 객체
  16. */
  17. Modular.model.SearchOperator = {
  18. GREATER : ">",
  19. GREATER_EQUAL : ">=",
  20. LESS : "<",
  21. LESS_EQUAL : "<=",
  22. LIKE_BOTH : "LIKE_BOTH",
  23. LIKE_NONE : "LIKE_NONE",
  24. LIKE_LEFT : "LIKE_LEFT",
  25. LIKE_RIGHT : "LIKE_RIGHT",
  26. BETWEEN : "BETWEEN",
  27. EQUALS : "=",
  28. IN : "IN",
  29. IS_NULL : "IS NULL",
  30. NOT_LIKE_BOTH : "NOT LIKE_BOTH",
  31. NOT_LIKE_NONE : "NOT LIKE_NONE",
  32. NOT_LIKE_LEFT : "NOT LIKE_LEFT",
  33. NOT_LIKE_RIGHT : "NOT LIKE_RIGHT",
  34. NOT_BETWEEN : "NOT BETWEEN",
  35. NOT_EQUALS : "<>",
  36. NOT_IN : "NOT IN",
  37. IS_NOT_NULL : "IS NOT NULL",
  38. /**
  39. * 비교 연산자 배열
  40. */
  41. compareOperator: new Array(),
  42. /**
  43. * 기간 연산자 배열
  44. */
  45. rangeOperator: new Array(),
  46. /**
  47. * 복수 연산자 배열
  48. */
  49. multiOperator: new Array(),
  50. /**
  51. * 연산자 유형 별로 분류 작업을 수행하는 초기화 함수
  52. */
  53. initialize : function() {
  54. this.compareOperator.push(this.GREATER);
  55. this.compareOperator.push(this.GREATER_EQUAL);
  56. this.compareOperator.push(this.LESS);
  57. this.compareOperator.push(this.LESS_EQUAL);
  58. this.compareOperator.push(this.LIKE_BOTH);
  59. this.compareOperator.push(this.LIKE_NONE);
  60. this.compareOperator.push(this.LIKE_LEFT);
  61. this.compareOperator.push(this.LIKE_RIGHT);
  62. this.compareOperator.push(this.EQUALS);
  63. this.compareOperator.push(this.IS_NULL);
  64. this.compareOperator.push(this.NOT_LIKE_BOTH);
  65. this.compareOperator.push(this.NOT_LIKE_NONE);
  66. this.compareOperator.push(this.NOT_LIKE_LEFT);
  67. this.compareOperator.push(this.NOT_LIKE_RIGHT);
  68. this.compareOperator.push(this.NOT_EQUALS);
  69. this.compareOperator.push(this.IS_NOT_NULL);
  70. this.rangeOperator.push(this.BETWEEN);
  71. this.rangeOperator.push(this.NOT_BETWEEN);
  72. this.multiOperator.push(this.IN);
  73. this.multiOperator.push(this.NOT_IN);
  74. },
  75. /**
  76. * 주어진 연산자가 비교 연산자인지를 리턴합니다.
  77. *
  78. * @param op {Modular.model.SearchOperator} 연산자
  79. * @return {boolean} 비교 연산자 여부
  80. */
  81. isCompareOperator : function(op) {
  82. if (Modular.Utils.hasText(op)) {
  83. for (var i =0; i < this.compareOperator.length; i++) {
  84. if (this.compareOperator[i].toLowerCase() == op.toLowerCase()) {
  85. return true;
  86. }//end if
  87. }//end for
  88. }//end if
  89. return false;
  90. },
  91. /**
  92. * 주어진 연산자가 기간 연산자인지를 리턴합니다.
  93. *
  94. * @param op {Modular.model.SearchOperator} 연산자
  95. * @return {boolean} 기간 연산자 여부
  96. */
  97. isRangeOperator : function(op) {
  98. if (Modular.Utils.hasText(op)) {
  99. for (var i =0; i < this.rangeOperator.length; i++) {
  100. if (this.rangeOperator[i].toLowerCase() == op.toLowerCase()) {
  101. return true;
  102. }//end if
  103. }//end for
  104. }//end if
  105. return false;
  106. },
  107. /**
  108. * 주어진 연산자가 복수 연산자인지를 리턴합니다.
  109. *
  110. * @param op {Modular.model.SearchOperator} 연산자
  111. * @return {boolean} 복수 연산자 여부
  112. */
  113. isMultiOperator : function(op) {
  114. if (Modular.Utils.hasText(op)) {
  115. for (var i =0; i < this.multiOperator.length; i++) {
  116. if (this.multiOperator[i].toLowerCase() == op.toLowerCase()) {
  117. return true;
  118. }//end if
  119. }//end for
  120. }//end if
  121. return false;
  122. }
  123. };
  124. Modular.model.SearchOperator.initialize();
  125. /*=============================================================
  126. *
  127. * Condition 구현
  128. *
  129. =============================================================*/
  130. /**
  131. * Condition 생성자 함수
  132. *
  133. * @param key {String} 조회조건 키
  134. * @param operator {Modular.model.SearchOperator} 조회조건 연산자
  135. * @param value {String} 조회조건 값
  136. * @param mapping {String} 조회조건 자동 매핑 여부
  137. */
  138. Modular.model.Condition = function (key, operator, value, mapping) {
  139. this.key = key;
  140. this.operator = Modular.Utils.hasText(operator) ? operator : Modular.model.SearchOperator.EQUALS;
  141. this.value = value || "";
  142. this.type = "normal";
  143. this.mapping = mapping;
  144. if (!Modular.model.SearchOperator.isCompareOperator(this.operator)) {
  145. throw new Error( "[" + operator + "]는 지원하지 않는 연산자 입니다." );
  146. }//end if
  147. };//end of constructor
  148. /*=============================================================
  149. *
  150. * RangeCondition 구현
  151. *
  152. =============================================================*/
  153. /**
  154. * RangeCondition 생성자 함수
  155. *
  156. * @param key {String} 조회조건 키
  157. * @param operator {Modular.model.SearchOperator} 조회조건 연산자
  158. * @param fKey {String} 조회조건 시작 값의 키
  159. * @param tKey {String} 조회조건 종료 값의 키
  160. * @param mapping {String} 조회조건 자동 매핑 여부
  161. */
  162. Modular.model.RangeCondition = function (key, operator, fKey, tKey, mapping) {
  163. this.key = key;
  164. this.operator = Modular.Utils.hasText(operator) ? operator : Modular.model.SearchOperator.BETWEEN;
  165. this.fKey = fKey;
  166. this.tKey = tKey;
  167. this.fValue = "";
  168. this.tValue = "";
  169. this.type = "range";
  170. this.mapping = mapping;
  171. if (!Modular.model.SearchOperator.isRangeOperator(this.operator)) {
  172. throw new Error( "[" + operator + "]는 지원하지 않는 연산자 입니다.");
  173. }//end if
  174. };//end of constructor
  175. /*=============================================================
  176. *
  177. * MultiCondition 구현
  178. *
  179. =============================================================*/
  180. /**
  181. * MultiCondition 생성자 함수
  182. *
  183. * @param key {String} 조회조건 키
  184. * @param operator {Modular.model.SearchOperator} 조회조건 연산자
  185. * @param mapping {String} 조회조건 자동 매핑 여부
  186. */
  187. Modular.model.MultiCondition = function (key, operator, mapping) {
  188. this.key = key;
  189. this.operator = Modular.Utils.hasText(operator) ? operator : Modular.model.SearchOperator.IN;
  190. this.value = [];
  191. this.type = "multi";
  192. this.mapping = mapping;
  193. if (!Modular.model.SearchOperator.isMultiOperator(this.operator)) {
  194. throw new Error("[" + operator + "]는 지원하지 않는 연산자 입니다.");
  195. }//end if
  196. };//end of constructor
  197. /*=============================================================
  198. *
  199. * SearchCondition 구현
  200. *
  201. =============================================================*/
  202. /**
  203. * SearchCondition 생성자 함수
  204. *
  205. * @param id {String} 조회조건 ID
  206. */
  207. Modular.model.SearchCondition = function (id) {
  208. this.id = id;
  209. this.sessionKey = Modular.model.PageContext.SESSION_KEY_PAGE_SEARCH_CONDITION_BACKUP_KEY_PREFIX + Modular.model.PageContext.REQUEST_URI + ":" + this.id;
  210. this.conditions = {};
  211. };//end of constructor
  212. /**
  213. * 주어진 Condition을 추가합니다.
  214. *
  215. * @param condition {Modular.model.Condition} Condition 객체
  216. */
  217. Modular.model.SearchCondition.prototype.addCondition = function (condition) {
  218. this.conditions[condition.key] = condition;
  219. };
  220. /**
  221. * 주어진 id에 해당하는 Condition 객체를 리턴합니다.
  222. *
  223. * @param key {String} Condition의 키 값
  224. */
  225. Modular.model.SearchCondition.prototype.getCondition = function (key) {
  226. return this.conditions[key];
  227. };
  228. /**
  229. * 주어진 key에 해당하는 Condition이 존재하는지 여부를 리턴합니다.
  230. *
  231. * @param key {String} Condition의 키 값
  232. * @return {boolean} Condition 존재 여부
  233. */
  234. Modular.model.SearchCondition.prototype.hasCondition = function (key) {
  235. if (this.conditions[key]) {
  236. return true;
  237. } else {
  238. return false;
  239. }//end if else
  240. };
  241. /**
  242. * 주어진 key에 해당하는 Condition에 주어진 값을 설정합니다.
  243. *
  244. * @param key {String} Condition의 키 값
  245. * @param value {Object} Condition의 값
  246. */
  247. Modular.model.SearchCondition.prototype.setCondition = function (key, value) {
  248. this.conditions[key].value = value;
  249. };
  250. /*=============================================================
  251. *
  252. * Column 구현
  253. *
  254. =============================================================*/
  255. /**
  256. * 컬럼 타입을 나타내는 상수
  257. */
  258. Modular.model.ColumnType = {
  259. /**
  260. * 문자열 타입
  261. */
  262. STRING : "string",
  263. /**
  264. * 날짜 타입
  265. */
  266. DATE : "date",
  267. /**
  268. * 숫자 타입
  269. */
  270. NUMBER : "number",
  271. /**
  272. * boolean 타입
  273. */
  274. BOOLEAN : "boolean"
  275. };
  276. /**
  277. * Column 생성자 함수
  278. *
  279. * @param id {String} 컬럼 ID
  280. * @param type {Modular.model.ColumnType} 컬럼 타입
  281. */
  282. Modular.model.Column = function (id, type) {
  283. this.id = id;
  284. this.type = type;
  285. };//end of constructor
  286. /*=============================================================
  287. *
  288. * Record 구현
  289. *
  290. =============================================================*/
  291. /**
  292. * 레코드 상태를 나타내는 상수
  293. *
  294. * TODO 서버의 상수와 동기화를 위해 JSP 형태로 변경하는 것을 고려
  295. *
  296. * 2008.11.21 - Helexis
  297. */
  298. Modular.model.RecordStatus = {
  299. /**
  300. * 레코드 상태 : 정상 - 아무일도 일어나지 않았음
  301. */
  302. NORMAL : "N",
  303. /**
  304. * 레코드 상태 : 추가 - 신규 추가된 레코드 임
  305. */
  306. INSERTED : "I",
  307. /**
  308. * 레코드 상태 : 수정 - 수정된 레코드 임
  309. */
  310. UPDATED : "U",
  311. /**
  312. * 레코드 상태 : 삭제 - 삭제된 레코드 임
  313. */
  314. DELETED : "D"
  315. };
  316. /**
  317. * Record 생성자 함수
  318. *
  319. * @param id {String} 레코드 ID
  320. * @param value {Array} 레코드 값. Array 형태임.
  321. * @param status {Modular.model.RecordStatus} 레코드 상태 값
  322. */
  323. Modular.model.Record = function (id, value, status) {
  324. this.id = id;
  325. this.cell = value || [];
  326. this.status = status || Modular.model.RecordStatus.NORMAL;
  327. };//end of constructor
  328. /**
  329. * 주어진 인덱스에 해당하는 컬럼 값을 리턴합니다.
  330. *
  331. * @param id {Number} 컬럼 인덱스
  332. * @return 컬럼 값
  333. */
  334. Modular.model.Record.prototype.getColumn = function (id) {
  335. if (Modular.Utils.hasText(id)) {
  336. var num = new Number(id);
  337. if (isNaN(num)) {
  338. return null;
  339. } else {
  340. // 인덱스라면, 그냥 컬럼 배열에서 꺼내준다.
  341. return this.cell[id];
  342. }//end if else
  343. } else {
  344. return null;
  345. }//end if
  346. };
  347. /**
  348. * 주어진 인덱스와 값을 지정된 컬럼에 설정합니다.
  349. *
  350. * @param idx 컬럼 인덱스
  351. * @param value 컬럼 값
  352. */
  353. Modular.model.Record.prototype.setColumn = function (idx, value) {
  354. var num = new Number(idx);
  355. if (isNaN(num)) {
  356. // do nothing...
  357. } else {
  358. // 인덱스라면, 그냥 컬럼을 찾아서 설정한다.
  359. this.cell[idx] = value;
  360. }//end if else
  361. };
  362. /**
  363. * 레코드가 가지는 컬럼 값을 객체의 형태로 만들어서 리턴합니다.
  364. *
  365. * @param columns {Array} 컬럼 배열
  366. * @return {Object}레코드의 ID와 값을 포함하는 객체
  367. */
  368. Modular.model.Record.getDataRow = function (columns, cell) {
  369. var row = {};
  370. jQuery.each(columns, function(idx, column) {
  371. row[column.name] = cell[idx];
  372. });
  373. return row;
  374. };
  375. /*=============================================================
  376. *
  377. * RecordSet 구현
  378. *
  379. =============================================================*/
  380. /**
  381. * RecordSet 생성자 함수
  382. *
  383. * 파라미터로 받는 객체 metadata는 아래와 같은 프로퍼티를 포함할 수 있습니다.
  384. *
  385. * - bindingClass {Object} 서버의 DTO 바인딩을 위한 클래스
  386. * - columns {Array} 레코드의 컬럼 메타 정보 배열
  387. * - volumePerPage {Number} 페이지 당 게시물 수
  388. * - currentPage {Number} 현재 페이지
  389. * - totalRecordSize {Number} 전체 게시물 수
  390. *
  391. * @param id {String} 레코드 셋 ID
  392. * @param metadata {Object} 레코드의 메타 정보를 포함하는 객체
  393. * @param records {Array} 레코드의 객체의 Array
  394. */
  395. Modular.model.RecordSet = function (id, metadata, records) {
  396. this.id = id;
  397. this.metadata = jQuery.extend({
  398. /**
  399. * 레코드 컬럼 정보
  400. */
  401. columns : [],
  402. /**
  403. * 레코드 셋이 바인딩되는 DTO 클래스 : 기본 값은 java.util.HashMap
  404. *
  405. * 기본 값을 java.util.Map으로 하는 이유는, DTO 없이 개발이 가능하도록 하기 위함임.
  406. */
  407. bindingClass : "java.util.HashMap",
  408. /**
  409. * 페이지 당 게시물 수 : 기본 값은 10
  410. */
  411. volumePerPage : 10,
  412. /**
  413. * 현재 페이지 : 기본 값은 1
  414. */
  415. currentPage : 1,
  416. /**
  417. * 전체 게시물 수
  418. */
  419. totalRecordCount : 0,
  420. /**
  421. * 테이블 내부의 페이징이나 정렬 기능을 사용할 경우, 호출할 조회 컨트롤 ID
  422. */
  423. searchControlId : "",
  424. /**
  425. * 정렬 대상 컬럼
  426. */
  427. sortColumnId : "",
  428. /**
  429. * 정렬 대상 컬럼 정렬순서
  430. */
  431. sortOrder : true,
  432. /**
  433. * 응답을 처리하기 위한 핸들러
  434. */
  435. responseHandler : false,
  436. /**
  437. * 레코드 셋의 처리 결과를 담는 객체
  438. */
  439. processResult : {}
  440. }, metadata || {});
  441. this.records = records || [];
  442. };//end of constructor
  443. /**
  444. * 주어진 ID 혹은 인덱스에 해당하는 레코드를 리턴합니다.
  445. *
  446. * @param id {String} or {Number} 레코드 ID 혹은 인덱스
  447. * @return {Modular.model.Record} Record 객체
  448. */
  449. Modular.model.RecordSet.prototype.getRecord = function (id) {
  450. if (Modular.Utils.hasText(id)) {
  451. var num = new Number(id);
  452. if (isNaN(num)) {
  453. // TODO 성능 개선 필요
  454. for (var i = 0; i < this.records.length; i++) {
  455. if (this.records[i].id == id) {
  456. return this.records[i];
  457. }//end if
  458. }//end for
  459. return null;
  460. } else {
  461. // 인덱스라면, 그냥 레코드 배열에서 꺼내준다.
  462. return this.records[id];
  463. }//end if else
  464. } else {
  465. if (isNaN(id)) {
  466. return null;
  467. }//end if
  468. return this.records[id];
  469. }//end if
  470. };
  471. /**
  472. * 레코드를 추가합니다.
  473. *
  474. * @param id {String} 레코드 ID
  475. * @param value {Array} 레코드 값. Array 형태임.
  476. * @param status {Modular.model.RecordStatus} 레코드 상태 값
  477. * @return {Modular.model.Record} 추가된 레코드 객체
  478. */
  479. Modular.model.RecordSet.prototype.addRecord = function (id, value, status) {
  480. if (this.getRecord(id)) {
  481. /*
  482. * TODO 비즈니스 로직적으로 그냥 오류를 발생시키고
  483. * 말아도 되는지 확인해 보도록!
  484. *
  485. * 2008.11.11 - Helexis
  486. */
  487. throw new Error("[" + id + "]에 해당하는 레코드가 이미 존재합니다.");
  488. }//end if
  489. var stat = status || Modular.model.RecordStatus.INSERTED;
  490. var record = new Modular.model.Record(id, value, stat);
  491. this.records.push(record);
  492. return record;
  493. };
  494. /**
  495. * 주어진 ID에 해당하는 레코드를 삭제합니다.
  496. *
  497. * @param id {String} 레코드 ID
  498. */
  499. Modular.model.RecordSet.prototype.deleteRecord = function (id) {
  500. this.getRecord(id).status = Modular.model.RecordStatus.DELETED;
  501. };
  502. /**
  503. * 레코드 셋이 가지는 모든 레코드를 객체의 배열 형태로 만들어서 리턴합니다.
  504. *
  505. * @param recordSet {Modular.model.RecordSet} 레코드 셋 객체
  506. * @return {Array} 레코드의 ID와 값을 포함하는 객체 배열
  507. */
  508. Modular.model.RecordSet.getDataRows = function (recordSet) {
  509. var rows = [];
  510. var columns = recordSet.metadata.columns;
  511. var records = recordSet.records;
  512. jQuery.each(records, function (index, record) {
  513. rows.push(Modular.model.Record.getDataRow(columns, record.cell));
  514. });
  515. return rows;
  516. };
  517. /*=============================================================
  518. *
  519. * PageContext 구현
  520. *
  521. =============================================================*/
  522. /**
  523. * 페이지 내에서 존재하는 모델을 포함하는 PageContext 객체를 생성합니다.
  524. */
  525. Modular.model.PageContext = {
  526. /**
  527. * 컨텍스트 ROOT 경로를 나타내는 상수
  528. */
  529. CONTEXT_ROOT : "",
  530. /**
  531. * 페이지 요청 URI를 나타내는 상수
  532. */
  533. REQUEST_URI : "",
  534. /**
  535. * 페이지 내부의 초기화 함수 목록
  536. */
  537. initFunctions : [],
  538. /**
  539. * 페이지 내부에서 사용하는 코드 목록
  540. */
  541. codeContext : {},
  542. /**
  543. * 페이지 내부에서 사용하는 validator 목록
  544. */
  545. validators : [],
  546. /**
  547. * 페이지 내부에서 사용하는 그리드에 열 추가 시
  548. * 임시로 사용할 레코드의 시퀀스
  549. */
  550. gridTempRecordSequence : 0,
  551. /**
  552. * 페이지 내부의 SearchCondition 목록
  553. */
  554. searchConditions : {},
  555. /**
  556. * 페이지 내부의 RecordSet 목록
  557. */
  558. recordSets : {},
  559. /**
  560. * 페이지 내부의 Control 목록
  561. */
  562. controls : {},
  563. /**
  564. * 페이지 네비게이션 히스토리 목록
  565. */
  566. navigationHistoryFunctions : [],
  567. /**
  568. * 페이지 내부의 파일 업로드 컴포넌트 목록
  569. */
  570. fileSets : {},
  571. /**
  572. * 페이지 내부의 파일 업로드 컴포넌트 뷰 목록
  573. */
  574. fileSetViews : {},
  575. /**
  576. * 조회조건에 대한 폼 값 바인딩 여부
  577. */
  578. popSearchForm : true,
  579. /**
  580. * 페이지 네비게이션 설정 데이터
  581. */
  582. navigation : {},
  583. /**
  584. * 주어진 ID에 해당하는 SearchCondition 객체를 리턴합니다.
  585. *
  586. * @param id SearchCondition ID
  587. * @return SearchCondition 객체
  588. */
  589. getSearchCondition : function (id) {
  590. return Modular.model.PageContext.searchConditions[id];
  591. },
  592. /**
  593. * 주어진 ID에 해당하는 RecordSet 객체를 리턴합니다.
  594. *
  595. * @param id RecordSet ID
  596. * @return RecordSet 객체
  597. */
  598. getRecordSet : function (id) {
  599. return Modular.model.PageContext.recordSets[id].recordSet;
  600. },
  601. /**
  602. * 주어진 ID에 해당하는 RecordSet 객체의 초기화 함수 목록를 리턴합니다.
  603. *
  604. * @param id RecordSet ID
  605. * @return 초기화 함수 목록
  606. */
  607. getRecordSetInitFunctions : function (id) {
  608. return Modular.model.PageContext.recordSets[id].initFunctions;
  609. },
  610. /**
  611. * 주어진 ID에 해당하는 Control 객체를 리턴합니다.
  612. *
  613. * @param id Control ID
  614. * @return Control 객체
  615. */
  616. getControl : function (id) {
  617. return Modular.model.PageContext.controls[id];
  618. },
  619. /**
  620. * 주어진 객체를 PageContext 에 추가합니다.
  621. *
  622. * @param t {Object} PageContext 객체에 추가할 SearchCondition/RecordSet/Control 객체
  623. */
  624. add : function (t) {
  625. if (t instanceof Modular.model.SearchCondition) {
  626. Modular.model.PageContext.searchConditions[t.id] = t;
  627. } else if (t instanceof Modular.model.RecordSet) {
  628. Modular.model.PageContext.recordSets[t.id] = {
  629. recordSet : t,
  630. initFunctions : []
  631. };
  632. } else if (t instanceof Modular.model.Control) {
  633. Modular.model.PageContext.controls[t.id] = t;
  634. }//end if else
  635. }
  636. };
  637. /*=============================================================
  638. *
  639. * Control 구현
  640. *
  641. =============================================================*/
  642. /**
  643. * 컨트롤을 생성하기 위한 생성자
  644. *
  645. * 옵션으로 다음과 같은 내용이 포함될 수 있습니다.
  646. * - id 컨트롤 ID
  647. * - eventHandler 컨트롤의 이벤트 핸들러 함수
  648. * - nextControl 다음 실행 컨트롤. 주로, 저장 후 재 조회 시 사용.
  649. *
  650. * @param o {Object} 옵션 내역을 포함하는 객체
  651. */
  652. Modular.model.Control = function (o) {
  653. var option = o || {};
  654. this.id = option.id;
  655. this.chainControl = option.chainControl;
  656. this.eventHandler = null;
  657. this.url = "";
  658. this.successMessage = option.successMessage;
  659. this.commands = [];
  660. };
  661. /**
  662. * 컨트롤에 커맨드를 추가합니다.
  663. *
  664. * @param c 커맨드
  665. */
  666. Modular.model.Control.prototype.add = function (c) {
  667. if (c && c instanceof Modular.model.Command) {
  668. this.commands.push(c);
  669. }//end if
  670. };
  671. /*=============================================================
  672. *
  673. * Command 구현
  674. *
  675. =============================================================*/
  676. /**
  677. * 커맨드 타입을 나타내는 상수
  678. */
  679. Modular.model.CommandType = {
  680. /**
  681. * 조회 타입
  682. */
  683. SEARCH : "search",
  684. /**
  685. * 추가 타입
  686. */
  687. INSERT : "insert",
  688. /**
  689. * 삭제 타입
  690. */
  691. DELETE : "delete",
  692. /**
  693. * 수정 타입
  694. */
  695. UPDATE : "update",
  696. /**
  697. * 저장 타입
  698. */
  699. SAVE : "save"
  700. };
  701. /**
  702. * 커맨드를 생성합니다.
  703. *
  704. * @param {Object} 옵션 객체
  705. */
  706. Modular.model.Command = function (option) {
  707. this.id = option.id;
  708. this.type = option.type;
  709. this.i = option.i;
  710. this.o = option.o;
  711. this.preHandle = option.preHandle;
  712. this.searchCondition = null;
  713. this.recordSets = {};
  714. };
  715. /**
  716. * 커맨드 전송 전 준비 작업을 수행합니다.
  717. */
  718. Modular.model.Command.prototype.prepare = function () {
  719. var command = this;
  720. switch (this.type) {
  721. case Modular.model.CommandType.SEARCH :
  722. /*
  723. * 조회일 경우에는 불필요하게 RecordSet 내부의 데이터가 전송되지 않도록,
  724. * RecordSet의 메타 정보만 복사하여 전송한다.
  725. */
  726. Modular.view.SearchView.setAllConditions(this.i);
  727. this.searchCondition = Modular.model.PageContext.getSearchCondition(this.i);
  728. jQuery.each(this.o, function (n, val) {
  729. var rs = Modular.model.PageContext.getRecordSet(val);
  730. command.recordSets[rs.id] = new Modular.model.RecordSet(rs.id, rs.metadata);
  731. });
  732. break;
  733. default :
  734. var rs = Modular.model.PageContext.getRecordSet(this.i);
  735. this.recordSets[rs.id] = rs;
  736. }//end switch case
  737. };
  738. /*=============================================================
  739. *
  740. * ServiceExecutionContext 구현
  741. *
  742. =============================================================*/
  743. /**
  744. * 컨트롤 객체를 사용하여 ServiceExecutionContext 객체를 초기화 합니다.
  745. *
  746. * @param control 컨트롤 객체
  747. */
  748. Modular.model.ServiceExecutionContext = function (control, flag) {
  749. jQuery.each(control.commands, function (n, command) {
  750. if (!flag) {
  751. command.preHandle.call(this);
  752. }//end if
  753. command.prepare();
  754. });
  755. this.commands = control.commands;
  756. };