move.js 71 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274
  1. "use strict";
  2. /**
  3. * @package PhpMyAdmin-Designer
  4. */
  5. /* global DesignerObjects */
  6. // js/designer/objects.js
  7. /* global DesignerHistory, historyArray, selectField */
  8. // js/designer/history.js
  9. /* global contr, db, designerTablesEnabled, displayField, hTabs, jTabs, selectedPage:writable, server */
  10. // js/designer/init.js
  11. /* global DesignerPage */
  12. // js/designer/page.js
  13. /* global themeImagePath */
  14. // templates/javascript/variables.twig
  15. var DesignerMove = {};
  16. var change = 0; // variable to track any change in designer layout.
  17. var showRelationLines = true;
  18. var alwaysShowText = false;
  19. AJAX.registerTeardown('designer/move.js', function () {
  20. $(document).off('fullscreenchange');
  21. $('#selflink').show();
  22. });
  23. AJAX.registerOnload('designer/move.js', function () {
  24. var $content = $('#page_content');
  25. var $img = $('#toggleFullscreen').find('img');
  26. var $span = $img.siblings('span');
  27. $content.css({
  28. 'margin-left': '3px'
  29. });
  30. $(document).on('fullscreenchange', function () {
  31. if (!$.fn.fullScreen() || !$content.fullScreen()) {
  32. $content.removeClass('content_fullscreen').css({
  33. 'width': 'auto',
  34. 'height': 'auto'
  35. });
  36. $('#osn_tab').css({
  37. 'width': 'auto',
  38. 'height': 'auto'
  39. });
  40. $img.attr('src', $img.data('enter')).attr('title', $span.data('enter'));
  41. $span.text($span.data('enter')); // Saving the fullscreen state in config when
  42. // designer exists fullscreen mode via ESC key
  43. var valueSent = 'off';
  44. DesignerMove.saveValueInConfig('full_screen', valueSent);
  45. }
  46. });
  47. $('#selflink').hide();
  48. });
  49. DesignerMove.markSaved = function () {
  50. change = 0;
  51. $('#saved_state').text('');
  52. };
  53. DesignerMove.markUnsaved = function () {
  54. change = 1;
  55. $('#saved_state').text('*');
  56. };
  57. var mainDirection = $('html').attr('dir') === 'rtl' ? 'right' : 'left'; // Will be used to multiply the offsetLeft by -1 if the direction is rtl.
  58. var directionEffect = mainDirection === 'right' ? -1 : 1;
  59. var curClick = null;
  60. var smS = 0;
  61. var smAdd = 10;
  62. var sLeft = 0;
  63. var sRight = 0;
  64. var onRelation = 0;
  65. var onGrid = 0;
  66. var onDisplayField = 0; // relation_style: 0 - angular 1 - direct
  67. var onAngularDirect = 1;
  68. var clickField = 0;
  69. var linkRelation = '';
  70. var canvasWidth = 0;
  71. var canvasHeight = 0;
  72. var osnTabWidth = 0;
  73. var osnTabHeight = 0;
  74. var heightField = 7;
  75. var globX;
  76. var globY;
  77. var timeoutId;
  78. var layerMenuCurClick = 0;
  79. var fromArray = [];
  80. var menuMoved = false;
  81. var gridSize = 10; // ------------------------------------------------------------------------------
  82. var isIe = document.all && !window.opera;
  83. if (isIe) {
  84. window.onscroll = DesignerMove.generalScroll;
  85. document.onselectstart = function () {
  86. return false;
  87. };
  88. }
  89. DesignerMove.mouseDown = function (e) {
  90. globX = isIe ? e.clientX + document.body.scrollLeft : e.pageX;
  91. globY = isIe ? e.clientY + document.body.scrollTop : e.pageY;
  92. if (e.target.tagName === 'SPAN') {
  93. curClick = e.target.parentNode.parentNode.parentNode.parentNode;
  94. } else if (e.target.className === 'tab_zag_2') {
  95. curClick = e.target.parentNode.parentNode.parentNode;
  96. } else if (e.target.id === 'layer_menu_sizer_btn') {
  97. layerMenuCurClick = 1;
  98. } else if (e.target.className === 'M_butt') {
  99. return false;
  100. }
  101. if (curClick !== null) {
  102. document.getElementById('canvas').style.display = 'none';
  103. curClick.style.zIndex = 2;
  104. }
  105. };
  106. DesignerMove.mouseMove = function (e) {
  107. if (e.preventDefault) {
  108. e.preventDefault();
  109. }
  110. var newDx = isIe ? e.clientX + document.body.scrollLeft : e.pageX;
  111. var newDy = isIe ? e.clientY + document.body.scrollTop : e.pageY;
  112. var deltaX = globX - newDx;
  113. var deltaY = globY - newDy;
  114. globX = newDx;
  115. globY = newDy;
  116. if (curClick !== null) {
  117. DesignerMove.markUnsaved();
  118. var $curClick = $(curClick);
  119. var curX = parseFloat($curClick.attr('data-' + mainDirection) || $curClick.css(mainDirection));
  120. var curY = parseFloat($curClick.attr('data-top') || $curClick.css('top'));
  121. var newX = curX - directionEffect * deltaX;
  122. var newY = curY - deltaY;
  123. $curClick.attr('data-' + mainDirection, newX);
  124. $curClick.attr('data-top', newY);
  125. if (onGrid) {
  126. newX = parseInt(newX / gridSize) * gridSize;
  127. newY = parseInt(newY / gridSize) * gridSize;
  128. }
  129. if (newX < 0) {
  130. newX = 0;
  131. } else if (newY < 0) {
  132. newY = 0;
  133. }
  134. $curClick.css(mainDirection, newX + 'px');
  135. $curClick.css('top', newY + 'px');
  136. } else if (layerMenuCurClick) {
  137. if (menuMoved) {
  138. deltaX = -deltaX;
  139. }
  140. var $layerMenu = $('#layer_menu');
  141. var newWidth = $layerMenu.width() + directionEffect * deltaX;
  142. if (newWidth < 150) {
  143. newWidth = 150;
  144. }
  145. $layerMenu.width(newWidth);
  146. }
  147. if (onRelation || onDisplayField) {
  148. document.getElementById('designer_hint').style.left = globX + 20 + 'px';
  149. document.getElementById('designer_hint').style.top = globY + 20 + 'px';
  150. }
  151. };
  152. DesignerMove.mouseUp = function () {
  153. if (curClick !== null) {
  154. document.getElementById('canvas').style.display = 'inline-block';
  155. DesignerMove.reload();
  156. curClick.style.zIndex = 1;
  157. curClick = null;
  158. }
  159. layerMenuCurClick = 0;
  160. }; // ------------------------------------------------------------------------------
  161. DesignerMove.canvasPos = function () {
  162. canvasWidth = document.getElementById('canvas').width = osnTabWidth - 3;
  163. canvasHeight = document.getElementById('canvas').height = osnTabHeight - 3;
  164. if (isIe) {
  165. document.getElementById('canvas').style.width = (osnTabWidth - 3 ? osnTabWidth - 3 : 0) + 'px';
  166. document.getElementById('canvas').style.height = (osnTabHeight - 3 ? osnTabHeight - 3 : 0) + 'px';
  167. }
  168. };
  169. DesignerMove.osnTabPos = function () {
  170. osnTabWidth = parseInt(document.getElementById('osn_tab').style.width, 10);
  171. osnTabHeight = parseInt(document.getElementById('osn_tab').style.height, 10);
  172. };
  173. DesignerMove.setDefaultValuesFromSavedState = function () {
  174. if ($('#angular_direct_button').attr('class') === 'M_butt') {
  175. onAngularDirect = 0;
  176. } else {
  177. onAngularDirect = 1;
  178. }
  179. DesignerMove.angularDirect();
  180. if ($('#grid_button').attr('class') === 'M_butt') {
  181. onGrid = 1;
  182. } else {
  183. onGrid = 0;
  184. }
  185. DesignerMove.grid();
  186. var $relLineInvert = $('#relLineInvert');
  187. if ($relLineInvert.attr('class') === 'M_butt') {
  188. showRelationLines = false;
  189. $relLineInvert.attr('class', 'M_butt');
  190. } else {
  191. showRelationLines = true;
  192. $relLineInvert.attr('class', 'M_butt_Selected_down');
  193. }
  194. DesignerMove.relationLinesInvert();
  195. if ($('#pin_Text').attr('class') === 'M_butt_Selected_down') {
  196. alwaysShowText = true;
  197. DesignerMove.showText();
  198. } else {
  199. alwaysShowText = false;
  200. }
  201. var $keySbAll = $('#key_SB_all');
  202. if ($keySbAll.attr('class') === 'M_butt_Selected_down') {
  203. $keySbAll.trigger('click');
  204. $keySbAll.toggleClass('M_butt_Selected_down');
  205. $keySbAll.toggleClass('M_butt');
  206. }
  207. var $keyLeftRight = $('#key_Left_Right');
  208. if ($keyLeftRight.attr('class') === 'M_butt_Selected_down') {
  209. $keyLeftRight.trigger('click');
  210. }
  211. };
  212. DesignerMove.main = function () {
  213. // ---CROSS
  214. document.getElementById('layer_menu').style.top = -1000 + 'px'; // fast scroll
  215. DesignerMove.osnTabPos();
  216. DesignerMove.canvasPos();
  217. DesignerMove.smallTabRefresh();
  218. DesignerMove.reload();
  219. DesignerMove.setDefaultValuesFromSavedState();
  220. if (isIe) {
  221. DesignerMove.generalScroll();
  222. }
  223. };
  224. DesignerMove.resizeOsnTab = function () {
  225. var maxX = 0;
  226. var maxY = 0;
  227. for (var key in jTabs) {
  228. var kX = parseInt(document.getElementById(key).style[mainDirection], 10) + document.getElementById(key).offsetWidth;
  229. var kY = parseInt(document.getElementById(key).style.top, 10) + document.getElementById(key).offsetHeight;
  230. maxX = maxX < kX ? kX : maxX;
  231. maxY = maxY < kY ? kY : maxY;
  232. }
  233. osnTabWidth = maxX + 50;
  234. osnTabHeight = maxY + 50;
  235. DesignerMove.canvasPos();
  236. };
  237. /**
  238. * refreshes display, must be called after state changes
  239. */
  240. DesignerMove.reload = function () {
  241. DesignerMove.resizeOsnTab();
  242. var n;
  243. var x1;
  244. var x2;
  245. var a = [];
  246. var K;
  247. var key;
  248. var key2;
  249. var key3;
  250. DesignerMove.clear();
  251. for (K in contr) {
  252. for (key in contr[K]) {
  253. // contr name
  254. for (key2 in contr[K][key]) {
  255. // table name
  256. for (key3 in contr[K][key][key2]) {
  257. // field name
  258. if (!document.getElementById('check_vis_' + key2).checked || !document.getElementById('check_vis_' + contr[K][key][key2][key3][0]).checked) {
  259. // if hide
  260. continue;
  261. }
  262. var x1Left = document.getElementById(key2).offsetLeft + 1;
  263. var x1Right = x1Left + document.getElementById(key2).offsetWidth;
  264. var x2Left = document.getElementById(contr[K][key][key2][key3][0]).offsetLeft;
  265. var x2Right = x2Left + document.getElementById(contr[K][key][key2][key3][0]).offsetWidth;
  266. a[0] = Math.abs(x1Left - x2Left);
  267. a[1] = Math.abs(x1Left - x2Right);
  268. a[2] = Math.abs(x1Right - x2Left);
  269. a[3] = Math.abs(x1Right - x2Right);
  270. n = sLeft = sRight = 0;
  271. for (var i = 1; i < 4; i++) {
  272. if (a[n] > a[i]) {
  273. n = i;
  274. }
  275. }
  276. if (n === 1) {
  277. x1 = x1Left - smS;
  278. x2 = x2Right + smS;
  279. if (x1 < x2) {
  280. n = 0;
  281. }
  282. }
  283. if (n === 2) {
  284. x1 = x1Right + smS;
  285. x2 = x2Left - smS;
  286. if (x1 > x2) {
  287. n = 0;
  288. }
  289. }
  290. if (n === 3) {
  291. x1 = x1Right + smS;
  292. x2 = x2Right + smS;
  293. sRight = 1;
  294. }
  295. if (n === 0) {
  296. x1 = x1Left - smS;
  297. x2 = x2Left - smS;
  298. sLeft = 1;
  299. }
  300. var rowOffsetTop = 0;
  301. var tabHideButton = document.getElementById('id_hide_tbody_' + key2);
  302. if (tabHideButton.innerHTML === 'v') {
  303. var fromColumn = document.getElementById(key2 + '.' + key3);
  304. if (fromColumn) {
  305. rowOffsetTop = fromColumn.offsetTop;
  306. } else {
  307. continue;
  308. }
  309. }
  310. var y1 = document.getElementById(key2).offsetTop + rowOffsetTop + heightField;
  311. rowOffsetTop = 0;
  312. tabHideButton = document.getElementById('id_hide_tbody_' + contr[K][key][key2][key3][0]);
  313. if (tabHideButton.innerHTML === 'v') {
  314. var toColumn = document.getElementById(contr[K][key][key2][key3][0] + '.' + contr[K][key][key2][key3][1]);
  315. if (toColumn) {
  316. rowOffsetTop = toColumn.offsetTop;
  317. } else {
  318. continue;
  319. }
  320. }
  321. var y2 = document.getElementById(contr[K][key][key2][key3][0]).offsetTop + rowOffsetTop + heightField;
  322. var osnTab = document.getElementById('osn_tab');
  323. DesignerMove.line0(x1 + directionEffect * osnTab.offsetLeft, y1 - osnTab.offsetTop, x2 + directionEffect * osnTab.offsetLeft, y2 - osnTab.offsetTop, DesignerMove.getColorByTarget(contr[K][key][key2][key3][0] + '.' + contr[K][key][key2][key3][1]));
  324. }
  325. }
  326. }
  327. }
  328. };
  329. /**
  330. * draws a line from x1:y1 to x2:y2 with color
  331. */
  332. DesignerMove.line = function (x1, y1, x2, y2, colorLine) {
  333. var canvas = document.getElementById('canvas');
  334. var ctx = canvas.getContext('2d');
  335. ctx.strokeStyle = colorLine;
  336. ctx.lineWidth = 1;
  337. ctx.beginPath();
  338. ctx.moveTo(x1, y1);
  339. ctx.lineTo(x2, y2);
  340. ctx.stroke();
  341. };
  342. /**
  343. * draws a relation/constraint line, whether angular or not
  344. */
  345. DesignerMove.line0 = function (x1, y1, x2, y2, colorLine) {
  346. if (!showRelationLines) {
  347. return;
  348. }
  349. DesignerMove.circle(x1, y1, 3, 3, colorLine);
  350. DesignerMove.rect(x2 - 1, y2 - 2, 4, 4, colorLine);
  351. if (onAngularDirect) {
  352. DesignerMove.line2(x1, y1, x2, y2, colorLine);
  353. } else {
  354. DesignerMove.line3(x1, y1, x2, y2, colorLine);
  355. }
  356. };
  357. /**
  358. * draws a angular relation/constraint line
  359. */
  360. DesignerMove.line2 = function (x1, y1, x2, y2, colorLine) {
  361. var x1Local = x1;
  362. var x2Local = x2;
  363. if (sRight) {
  364. x1Local += smAdd;
  365. x2Local += smAdd;
  366. } else if (sLeft) {
  367. x1Local -= smAdd;
  368. x2Local -= smAdd;
  369. } else if (x1 < x2) {
  370. x1Local += smAdd;
  371. x2Local -= smAdd;
  372. } else {
  373. x1Local -= smAdd;
  374. x2Local += smAdd;
  375. }
  376. DesignerMove.line(x1, y1, x1Local, y1, colorLine);
  377. DesignerMove.line(x2, y2, x2Local, y2, colorLine);
  378. DesignerMove.line(x1Local, y1, x2Local, y2, colorLine);
  379. };
  380. /**
  381. * draws a relation/constraint line
  382. */
  383. DesignerMove.line3 = function (x1, y1, x2, y2, colorLine) {
  384. var x1Local = x1;
  385. var x2Local = x2;
  386. if (sRight) {
  387. if (x1 < x2) {
  388. x1Local += x2 - x1 + smAdd;
  389. x2Local += smAdd;
  390. } else {
  391. x2Local += x1 - x2 + smAdd;
  392. x1Local += smAdd;
  393. }
  394. DesignerMove.line(x1, y1, x1Local, y1, colorLine);
  395. DesignerMove.line(x2, y2, x2Local, y2, colorLine);
  396. DesignerMove.line(x1Local, y1, x2Local, y2, colorLine);
  397. return;
  398. }
  399. if (sLeft) {
  400. if (x1 < x2) {
  401. x2Local -= x2 - x1 + smAdd;
  402. x1Local -= smAdd;
  403. } else {
  404. x1Local -= x1 - x2 + smAdd;
  405. x2Local -= smAdd;
  406. }
  407. DesignerMove.line(x1, y1, x1Local, y1, colorLine);
  408. DesignerMove.line(x2, y2, x2Local, y2, colorLine);
  409. DesignerMove.line(x1Local, y1, x2Local, y2, colorLine);
  410. return;
  411. }
  412. var xS = (x1 + x2) / 2;
  413. DesignerMove.line(x1, y1, xS, y1, colorLine);
  414. DesignerMove.line(xS, y2, x2, y2, colorLine);
  415. DesignerMove.line(xS, y1, xS, y2, colorLine);
  416. };
  417. DesignerMove.circle = function (x, y, r, w, color) {
  418. var ctx = document.getElementById('canvas').getContext('2d');
  419. ctx.beginPath();
  420. ctx.moveTo(x, y);
  421. ctx.lineWidth = w;
  422. ctx.strokeStyle = color;
  423. ctx.arc(x, y, r, 0, 2 * Math.PI, true);
  424. ctx.stroke();
  425. };
  426. DesignerMove.clear = function () {
  427. var canvas = document.getElementById('canvas');
  428. var ctx = canvas.getContext('2d');
  429. ctx.clearRect(0, 0, canvasWidth, canvasHeight);
  430. };
  431. DesignerMove.rect = function (x1, y1, w, h, color) {
  432. var ctx = document.getElementById('canvas').getContext('2d');
  433. ctx.fillStyle = color;
  434. ctx.fillRect(x1, y1, w, h);
  435. }; // --------------------------- FULLSCREEN -------------------------------------
  436. DesignerMove.toggleFullscreen = function () {
  437. var valueSent = '';
  438. var $img = $('#toggleFullscreen').find('img');
  439. var $span = $img.siblings('span');
  440. var $content = $('#page_content');
  441. if (!$content.fullScreen()) {
  442. $img.attr('src', $img.data('exit')).attr('title', $span.data('exit'));
  443. $span.text($span.data('exit'));
  444. $content.addClass('content_fullscreen').css({
  445. 'width': screen.width - 5,
  446. 'height': screen.height - 5
  447. });
  448. $('#osn_tab').css({
  449. 'width': screen.width + 'px',
  450. 'height': screen.height
  451. });
  452. valueSent = 'on';
  453. $content.fullScreen(true);
  454. } else {
  455. $img.attr('src', $img.data('enter')).attr('title', $span.data('enter'));
  456. $span.text($span.data('enter'));
  457. $content.removeClass('content_fullscreen').css({
  458. 'width': 'auto',
  459. 'height': 'auto'
  460. });
  461. $('#osn_tab').css({
  462. 'width': 'auto',
  463. 'height': 'auto'
  464. });
  465. $content.fullScreen(false);
  466. valueSent = 'off';
  467. }
  468. DesignerMove.saveValueInConfig('full_screen', valueSent);
  469. };
  470. DesignerMove.addTableToTablesList = function (index, tableDom) {
  471. var db = $(tableDom).find('.small_tab_pref').attr('db');
  472. var table = $(tableDom).find('.small_tab_pref').attr('table_name');
  473. var dbEncoded = $(tableDom).find('.small_tab_pref').attr('db_url');
  474. var tableEncoded = $(tableDom).find('.small_tab_pref').attr('table_name_url');
  475. var tableIsChecked = $(tableDom).css('display') === 'block' ? 'checked' : '';
  476. var checkboxStatus = tableIsChecked === 'checked' ? Messages.strHide : Messages.strShow;
  477. var $newTableLine = $('<tr>' + ' <td title="' + Messages.strStructure + '"' + ' width="1px"' + ' class="L_butt2_1">' + ' <img alt=""' + ' db="' + dbEncoded + '"' + ' table_name="' + tableEncoded + '"' + ' class="scroll_tab_struct"' + ' src="' + themeImagePath + 'designer/exec.png"/>' + ' </td>' + ' <td width="1px">' + ' <input class="scroll_tab_checkbox"' + ' title="' + checkboxStatus + '"' + ' id="check_vis_' + dbEncoded + '.' + tableEncoded + '"' + ' style="margin:0;"' + ' type="checkbox"' + ' value="' + dbEncoded + '.' + tableEncoded + '"' + tableIsChecked + ' />' + ' </td>' + ' <td class="designer_Tabs"' + ' designer_url_table_name="' + dbEncoded + '.' + tableEncoded + '">' + $('<div/>').text(db + '.' + table).html() + '</td>' + '</tr>');
  478. $('#id_scroll_tab table').first().append($newTableLine);
  479. $($newTableLine).find('.scroll_tab_struct').on('click', function () {
  480. DesignerMove.startTabUpd(db, table);
  481. });
  482. $($newTableLine).on('click', '.designer_Tabs2,.designer_Tabs', function () {
  483. DesignerMove.selectTab($(this).attr('designer_url_table_name'));
  484. });
  485. $($newTableLine).find('.scroll_tab_checkbox').on('click', function () {
  486. $(this).attr('title', function (i, currentvalue) {
  487. return currentvalue === Messages.strHide ? Messages.strShow : Messages.strHide;
  488. });
  489. DesignerMove.visibleTab(this, $(this).val());
  490. });
  491. var $tablesCounter = $('#tables_counter');
  492. $tablesCounter.text(parseInt($tablesCounter.text(), 10) + 1);
  493. };
  494. DesignerMove.addOtherDbTables = function () {
  495. var buttonOptions = {};
  496. buttonOptions[Messages.strGo] = function () {
  497. var db = $('#add_table_from').val();
  498. var table = $('#add_table').val(); // Check if table already imported or not.
  499. var $table = $('[id="' + encodeURIComponent(db) + '.' + encodeURIComponent(table) + '"]');
  500. if ($table.length !== 0) {
  501. Functions.ajaxShowMessage(Functions.sprintf(Messages.strTableAlreadyExists, db + '.' + table), undefined, 'error');
  502. return;
  503. }
  504. $.post('index.php?route=/database/designer', {
  505. 'ajax_request': true,
  506. 'dialog': 'add_table',
  507. 'db': db,
  508. 'table': table,
  509. 'server': CommonParams.get('server')
  510. }, function (data) {
  511. var $newTableDom = $(data.message);
  512. $newTableDom.find('a').first().remove();
  513. var dbEncoded = $($newTableDom).find('.small_tab_pref').attr('db_url');
  514. var tableEncoded = $($newTableDom).find('.small_tab_pref').attr('table_name_url');
  515. if (typeof dbEncoded === 'string' && typeof tableEncoded === 'string') {
  516. // Do not try to add if attr not found !
  517. $('#container-form').append($newTableDom);
  518. DesignerMove.enableTableEvents(null, $newTableDom);
  519. DesignerMove.addTableToTablesList(null, $newTableDom);
  520. jTabs[dbEncoded + '.' + tableEncoded] = 1;
  521. DesignerMove.markUnsaved();
  522. }
  523. });
  524. $(this).dialog('close');
  525. };
  526. buttonOptions[Messages.strCancel] = function () {
  527. $(this).dialog('close');
  528. };
  529. var $selectDb = $('<select id="add_table_from"></select>');
  530. $selectDb.append('<option value="">' + Messages.strNone + '</option>');
  531. var $selectTable = $('<select id="add_table"></select>');
  532. $selectTable.append('<option value="">' + Messages.strNone + '</option>');
  533. $.post('index.php?route=/sql', {
  534. 'ajax_request': true,
  535. 'sql_query': 'SHOW databases;',
  536. 'server': CommonParams.get('server')
  537. }, function (data) {
  538. $(data.message).find('table.table_results.data.ajax').find('td.data').each(function () {
  539. var val = $(this)[0].innerText;
  540. $selectDb.append($('<option></option>').val(val).text(val));
  541. });
  542. });
  543. var $form = $('<form action="" class="ajax"></form>').append($selectDb).append($selectTable);
  544. $('<div id="page_add_tables_dialog"></div>').append($form).dialog({
  545. appendTo: '#page_content',
  546. title: Messages.strAddTables,
  547. width: 500,
  548. modal: true,
  549. buttons: buttonOptions,
  550. close: function close() {
  551. $(this).remove();
  552. }
  553. });
  554. $('#add_table_from').on('change', function () {
  555. if ($(this).val()) {
  556. var dbName = $(this).val();
  557. var sqlQuery = 'SHOW tables;';
  558. $.post('index.php?route=/sql', {
  559. 'ajax_request': true,
  560. 'sql_query': sqlQuery,
  561. 'db': dbName,
  562. 'server': CommonParams.get('server')
  563. }, function (data) {
  564. $selectTable.html('');
  565. var rows = $(data.message).find('table.table_results.data.ajax').find('td.data');
  566. if (rows.length === 0) {
  567. $selectTable.append('<option value="">' + Messages.strNone + '</option>');
  568. }
  569. rows.each(function () {
  570. var val = $(this)[0].innerText;
  571. $selectTable.append($('<option></option>').val(val).text(val));
  572. });
  573. });
  574. }
  575. });
  576. }; // ------------------------------ NEW ------------------------------------------
  577. DesignerMove.new = function () {
  578. DesignerMove.promptToSaveCurrentPage(function () {
  579. DesignerMove.loadPage(-1);
  580. });
  581. }; // ------------------------------ SAVE ------------------------------------------
  582. // (del?) no for pdf
  583. DesignerMove.save = function (url) {
  584. for (var key in jTabs) {
  585. document.getElementById('t_x_' + key + '_').value = parseInt(document.getElementById(key).style.left, 10);
  586. document.getElementById('t_y_' + key + '_').value = parseInt(document.getElementById(key).style.top, 10);
  587. document.getElementById('t_v_' + key + '_').value = document.getElementById('id_tbody_' + key).style.display === 'none' ? 0 : 1;
  588. document.getElementById('t_h_' + key + '_').value = document.getElementById('check_vis_' + key).checked ? 1 : 0;
  589. }
  590. document.getElementById('container-form').action = url;
  591. $('#container-form').trigger('submit');
  592. };
  593. DesignerMove.getUrlPos = function (forceString) {
  594. var key;
  595. if (designerTablesEnabled || forceString) {
  596. var poststr = '';
  597. var argsep = CommonParams.get('arg_separator');
  598. var i = 1;
  599. for (key in jTabs) {
  600. poststr += argsep + 't_x[' + i + ']=' + parseInt(document.getElementById(key).style.left, 10);
  601. poststr += argsep + 't_y[' + i + ']=' + parseInt(document.getElementById(key).style.top, 10);
  602. poststr += argsep + 't_v[' + i + ']=' + (document.getElementById('id_tbody_' + key).style.display === 'none' ? 0 : 1);
  603. poststr += argsep + 't_h[' + i + ']=' + (document.getElementById('check_vis_' + key).checked ? 1 : 0);
  604. poststr += argsep + 't_db[' + i + ']=' + $(document.getElementById(key)).attr('db_url');
  605. poststr += argsep + 't_tbl[' + i + ']=' + $(document.getElementById(key)).attr('table_name_url');
  606. i++;
  607. }
  608. return poststr;
  609. } else {
  610. var coords = [];
  611. for (key in jTabs) {
  612. if (document.getElementById('check_vis_' + key).checked) {
  613. var x = parseInt(document.getElementById(key).style.left, 10);
  614. var y = parseInt(document.getElementById(key).style.top, 10);
  615. var tbCoords = new DesignerObjects.TableCoordinate($(document.getElementById(key)).attr('db_url'), $(document.getElementById(key)).attr('table_name_url'), -1, x, y);
  616. coords.push(tbCoords);
  617. }
  618. }
  619. return coords;
  620. }
  621. };
  622. DesignerMove.save2 = function (callback) {
  623. if (designerTablesEnabled) {
  624. var argsep = CommonParams.get('arg_separator');
  625. var poststr = 'operation=savePage' + argsep + 'save_page=same' + argsep + 'ajax_request=true';
  626. poststr += argsep + 'server=' + server + argsep + 'db=' + encodeURIComponent(db) + argsep + 'selected_page=' + selectedPage;
  627. poststr += DesignerMove.getUrlPos();
  628. var $msgbox = Functions.ajaxShowMessage(Messages.strProcessingRequest);
  629. $.post('index.php?route=/database/designer', poststr, function (data) {
  630. if (data.success === false) {
  631. Functions.ajaxShowMessage(data.error, false);
  632. } else {
  633. Functions.ajaxRemoveMessage($msgbox);
  634. Functions.ajaxShowMessage(Messages.strModificationSaved);
  635. DesignerMove.markSaved();
  636. if (typeof callback !== 'undefined') {
  637. callback();
  638. }
  639. }
  640. });
  641. } else {
  642. var name = $('#page_name').html().trim();
  643. DesignerPage.saveToSelectedPage(db, selectedPage, name, DesignerMove.getUrlPos(), function () {
  644. DesignerMove.markSaved();
  645. if (typeof callback !== 'undefined') {
  646. callback();
  647. }
  648. });
  649. }
  650. };
  651. DesignerMove.submitSaveDialogAndClose = function (callback) {
  652. var $form = $('#save_page');
  653. var name = $form.find('input[name="selected_value"]').val().trim();
  654. if (name === '') {
  655. Functions.ajaxShowMessage(Messages.strEnterValidPageName, false);
  656. return;
  657. }
  658. $('#page_save_dialog').dialog('close');
  659. if (designerTablesEnabled) {
  660. var $msgbox = Functions.ajaxShowMessage(Messages.strProcessingRequest);
  661. Functions.prepareForAjaxRequest($form);
  662. $.post($form.attr('action'), $form.serialize() + DesignerMove.getUrlPos(), function (data) {
  663. if (data.success === false) {
  664. Functions.ajaxShowMessage(data.error, false);
  665. } else {
  666. Functions.ajaxRemoveMessage($msgbox);
  667. DesignerMove.markSaved();
  668. if (data.id) {
  669. selectedPage = data.id;
  670. }
  671. $('#page_name').text(name);
  672. if (typeof callback !== 'undefined') {
  673. callback();
  674. }
  675. }
  676. });
  677. } else {
  678. DesignerPage.saveToNewPage(db, name, DesignerMove.getUrlPos(), function (page) {
  679. DesignerMove.markSaved();
  680. if (page.pgNr) {
  681. selectedPage = page.pgNr;
  682. }
  683. $('#page_name').text(page.pageDescr);
  684. if (typeof callback !== 'undefined') {
  685. callback();
  686. }
  687. });
  688. }
  689. };
  690. DesignerMove.save3 = function (callback) {
  691. if (selectedPage !== -1) {
  692. DesignerMove.save2(callback);
  693. } else {
  694. var buttonOptions = {};
  695. buttonOptions[Messages.strGo] = function () {
  696. var $form = $('#save_page');
  697. $form.trigger('submit');
  698. };
  699. buttonOptions[Messages.strCancel] = function () {
  700. $(this).dialog('close');
  701. };
  702. var $form = $('<form action="index.php?route=/database/designer" method="post" name="save_page" id="save_page" class="ajax"></form>').append('<input type="hidden" name="server" value="' + server + '">').append($('<input type="hidden" name="db" />').val(db)).append('<input type="hidden" name="operation" value="savePage">').append('<input type="hidden" name="save_page" value="new">').append('<label for="selected_value">' + Messages.strPageName + '</label>:<input type="text" name="selected_value">');
  703. $form.on('submit', function (e) {
  704. e.preventDefault();
  705. DesignerMove.submitSaveDialogAndClose(callback);
  706. });
  707. $('<div id="page_save_dialog"></div>').append($form).dialog({
  708. appendTo: '#page_content',
  709. title: Messages.strSavePage,
  710. width: 300,
  711. modal: true,
  712. buttons: buttonOptions,
  713. close: function close() {
  714. $(this).remove();
  715. }
  716. });
  717. }
  718. }; // ------------------------------ EDIT PAGES ------------------------------------------
  719. DesignerMove.editPages = function () {
  720. DesignerMove.promptToSaveCurrentPage(function () {
  721. var buttonOptions = {};
  722. buttonOptions[Messages.strGo] = function () {
  723. var $form = $('#edit_delete_pages');
  724. var selected = $form.find('select[name="selected_page"]').val();
  725. if (selected === '0') {
  726. Functions.ajaxShowMessage(Messages.strSelectPage, 2000);
  727. return;
  728. }
  729. $(this).dialog('close');
  730. DesignerMove.loadPage(selected);
  731. };
  732. buttonOptions[Messages.strCancel] = function () {
  733. $(this).dialog('close');
  734. };
  735. var $msgbox = Functions.ajaxShowMessage();
  736. $.post('index.php?route=/database/designer', {
  737. 'ajax_request': true,
  738. 'server': server,
  739. 'db': db,
  740. 'dialog': 'edit'
  741. }, function (data) {
  742. if (data.success === false) {
  743. Functions.ajaxShowMessage(data.error, false);
  744. } else {
  745. Functions.ajaxRemoveMessage($msgbox);
  746. if (!designerTablesEnabled) {
  747. DesignerPage.createPageList(db, function (options) {
  748. $('#selected_page').append(options);
  749. });
  750. }
  751. $('<div id="page_edit_dialog"></div>').append(data.message).dialog({
  752. appendTo: '#page_content',
  753. title: Messages.strOpenPage,
  754. width: 350,
  755. modal: true,
  756. buttons: buttonOptions,
  757. close: function close() {
  758. $(this).remove();
  759. }
  760. });
  761. }
  762. }); // end $.post()
  763. });
  764. }; // ----------------------------- DELETE PAGES ---------------------------------------
  765. DesignerMove.deletePages = function () {
  766. var buttonOptions = {};
  767. buttonOptions[Messages.strGo] = function () {
  768. var $form = $('#edit_delete_pages');
  769. var selected = $form.find('select[name="selected_page"]').val();
  770. if (selected === '0') {
  771. Functions.ajaxShowMessage(Messages.strSelectPage, 2000);
  772. return;
  773. }
  774. var $messageBox = Functions.ajaxShowMessage(Messages.strProcessingRequest);
  775. var deletingCurrentPage = selected === selectedPage;
  776. Functions.prepareForAjaxRequest($form);
  777. if (designerTablesEnabled) {
  778. $.post($form.attr('action'), $form.serialize(), function (data) {
  779. if (data.success === false) {
  780. Functions.ajaxShowMessage(data.error, false);
  781. } else {
  782. Functions.ajaxRemoveMessage($messageBox);
  783. if (deletingCurrentPage) {
  784. DesignerMove.loadPage(null);
  785. } else {
  786. Functions.ajaxShowMessage(Messages.strSuccessfulPageDelete);
  787. }
  788. }
  789. }); // end $.post()
  790. } else {
  791. DesignerPage.deletePage(selected, function (success) {
  792. if (!success) {
  793. Functions.ajaxShowMessage('Error', false);
  794. } else {
  795. Functions.ajaxRemoveMessage($messageBox);
  796. if (deletingCurrentPage) {
  797. DesignerMove.loadPage(null);
  798. } else {
  799. Functions.ajaxShowMessage(Messages.strSuccessfulPageDelete);
  800. }
  801. }
  802. });
  803. }
  804. $(this).dialog('close');
  805. };
  806. buttonOptions[Messages.strCancel] = function () {
  807. $(this).dialog('close');
  808. };
  809. var $msgbox = Functions.ajaxShowMessage();
  810. $.post('index.php?route=/database/designer', {
  811. 'ajax_request': true,
  812. 'server': server,
  813. 'db': db,
  814. 'dialog': 'delete'
  815. }, function (data) {
  816. if (data.success === false) {
  817. Functions.ajaxShowMessage(data.error, false);
  818. } else {
  819. Functions.ajaxRemoveMessage($msgbox);
  820. if (!designerTablesEnabled) {
  821. DesignerPage.createPageList(db, function (options) {
  822. $('#selected_page').append(options);
  823. });
  824. }
  825. $('<div id="page_delete_dialog"></div>').append(data.message).dialog({
  826. appendTo: '#page_content',
  827. title: Messages.strDeletePage,
  828. width: 350,
  829. modal: true,
  830. buttons: buttonOptions,
  831. close: function close() {
  832. $(this).remove();
  833. }
  834. });
  835. }
  836. }); // end $.post()
  837. }; // ------------------------------ SAVE AS PAGES ---------------------------------------
  838. DesignerMove.saveAs = function () {
  839. var buttonOptions = {};
  840. buttonOptions[Messages.strGo] = function () {
  841. var $form = $('#save_as_pages');
  842. var selectedValue = $form.find('input[name="selected_value"]').val().trim();
  843. var $selectedPage = $form.find('select[name="selected_page"]');
  844. var choice = $form.find('input[name="save_page"]:checked').val();
  845. var name = '';
  846. if (choice === 'same') {
  847. if ($selectedPage.val() === '0') {
  848. Functions.ajaxShowMessage(Messages.strSelectPage, 2000);
  849. return;
  850. }
  851. name = $selectedPage.find('option:selected').text();
  852. } else if (choice === 'new') {
  853. if (selectedValue === '') {
  854. Functions.ajaxShowMessage(Messages.strEnterValidPageName, 2000);
  855. return;
  856. }
  857. name = selectedValue;
  858. }
  859. var $msgbox = Functions.ajaxShowMessage(Messages.strProcessingRequest);
  860. if (designerTablesEnabled) {
  861. Functions.prepareForAjaxRequest($form);
  862. $.post($form.attr('action'), $form.serialize() + DesignerMove.getUrlPos(), function (data) {
  863. if (data.success === false) {
  864. Functions.ajaxShowMessage(data.error, false);
  865. } else {
  866. Functions.ajaxRemoveMessage($msgbox);
  867. DesignerMove.markSaved();
  868. if (data.id) {
  869. selectedPage = data.id;
  870. }
  871. DesignerMove.loadPage(selectedPage);
  872. }
  873. }); // end $.post()
  874. } else {
  875. if (choice === 'same') {
  876. var selectedPageId = $selectedPage.find('option:selected').val();
  877. DesignerPage.saveToSelectedPage(db, selectedPageId, name, DesignerMove.getUrlPos(), function (page) {
  878. Functions.ajaxRemoveMessage($msgbox);
  879. DesignerMove.markSaved();
  880. if (page.pgNr) {
  881. selectedPage = page.pgNr;
  882. }
  883. DesignerMove.loadPage(selectedPage);
  884. });
  885. } else if (choice === 'new') {
  886. DesignerPage.saveToNewPage(db, name, DesignerMove.getUrlPos(), function (page) {
  887. Functions.ajaxRemoveMessage($msgbox);
  888. DesignerMove.markSaved();
  889. if (page.pgNr) {
  890. selectedPage = page.pgNr;
  891. }
  892. DesignerMove.loadPage(selectedPage);
  893. });
  894. }
  895. }
  896. $(this).dialog('close');
  897. };
  898. buttonOptions[Messages.strCancel] = function () {
  899. $(this).dialog('close');
  900. };
  901. var $msgbox = Functions.ajaxShowMessage();
  902. $.post('index.php?route=/database/designer', {
  903. 'ajax_request': true,
  904. 'server': server,
  905. 'db': db,
  906. 'dialog': 'save_as'
  907. }, function (data) {
  908. if (data.success === false) {
  909. Functions.ajaxShowMessage(data.error, false);
  910. } else {
  911. Functions.ajaxRemoveMessage($msgbox);
  912. if (!designerTablesEnabled) {
  913. DesignerPage.createPageList(db, function (options) {
  914. $('#selected_page').append(options);
  915. });
  916. }
  917. $('<div id="page_save_as_dialog"></div>').append(data.message).dialog({
  918. appendTo: '#page_content',
  919. title: Messages.strSavePageAs,
  920. width: 450,
  921. modal: true,
  922. buttons: buttonOptions,
  923. close: function close() {
  924. $(this).remove();
  925. }
  926. }); // select current page by default
  927. if (selectedPage !== -1) {
  928. $('select[name="selected_page"]').val(selectedPage);
  929. }
  930. }
  931. }); // end $.post()
  932. };
  933. DesignerMove.promptToSaveCurrentPage = function (callback) {
  934. if (change === 1 || selectedPage === -1) {
  935. var buttonOptions = {};
  936. buttonOptions[Messages.strYes] = function () {
  937. $(this).dialog('close');
  938. DesignerMove.save3(callback);
  939. };
  940. buttonOptions[Messages.strNo] = function () {
  941. $(this).dialog('close');
  942. callback();
  943. };
  944. buttonOptions[Messages.strCancel] = function () {
  945. $(this).dialog('close');
  946. };
  947. $('<div id="prompt_save_dialog"></div>').append('<div>' + Messages.strLeavingPage + '</div>').dialog({
  948. appendTo: '#page_content',
  949. title: Messages.strSavePage,
  950. width: 300,
  951. modal: true,
  952. buttons: buttonOptions,
  953. close: function close() {
  954. $(this).remove();
  955. }
  956. });
  957. } else {
  958. callback();
  959. }
  960. }; // ------------------------------ EXPORT PAGES ---------------------------------------
  961. DesignerMove.exportPages = function () {
  962. var buttonOptions = {};
  963. buttonOptions[Messages.strGo] = function () {
  964. $('#id_export_pages').trigger('submit');
  965. $(this).dialog('close');
  966. };
  967. buttonOptions[Messages.strCancel] = function () {
  968. $(this).dialog('close');
  969. };
  970. var $msgbox = Functions.ajaxShowMessage();
  971. var argsep = CommonParams.get('arg_separator');
  972. $.post('index.php?route=/database/designer', {
  973. 'ajax_request': true,
  974. 'server': server,
  975. 'db': db,
  976. 'dialog': 'export',
  977. 'selected_page': selectedPage
  978. }, function (data) {
  979. if (data.success === false) {
  980. Functions.ajaxShowMessage(data.error, false);
  981. } else {
  982. Functions.ajaxRemoveMessage($msgbox);
  983. var $form = $(data.message);
  984. if (!designerTablesEnabled) {
  985. $form.append('<input type="hidden" name="offline_export" value="true">');
  986. }
  987. $.each(DesignerMove.getUrlPos(true).substring(1).split(argsep), function () {
  988. var pair = this.split('=');
  989. var input = $('<input type="hidden">');
  990. input.attr('name', pair[0]);
  991. input.attr('value', pair[1]);
  992. $form.append(input);
  993. });
  994. var $formatDropDown = $form.find('#plugins');
  995. $formatDropDown.on('change', function () {
  996. var format = $formatDropDown.val();
  997. $form.find('.format_specific_options').hide();
  998. $form.find('#' + format + '_options').show();
  999. }).trigger('change');
  1000. $('<div id="page_export_dialog"></div>').append($form).dialog({
  1001. appendTo: '#page_content',
  1002. title: Messages.strExportRelationalSchema,
  1003. width: 550,
  1004. modal: true,
  1005. buttons: buttonOptions,
  1006. close: function close() {
  1007. $(this).remove();
  1008. }
  1009. });
  1010. }
  1011. }); // end $.post()
  1012. };
  1013. DesignerMove.loadPage = function (page) {
  1014. if (designerTablesEnabled) {
  1015. var paramPage = '';
  1016. var argsep = CommonParams.get('arg_separator');
  1017. if (page !== null) {
  1018. paramPage = argsep + 'page=' + page;
  1019. }
  1020. $('<a href="index.php?route=/database/designer&server=' + server + argsep + 'db=' + encodeURIComponent(db) + paramPage + '"></a>').appendTo($('#page_content')).trigger('click');
  1021. } else {
  1022. if (page === null) {
  1023. DesignerPage.showTablesInLandingPage(db);
  1024. } else if (page > -1) {
  1025. DesignerPage.loadHtmlForPage(page);
  1026. } else if (page === -1) {
  1027. DesignerPage.showNewPageTables(true);
  1028. }
  1029. }
  1030. DesignerMove.markSaved();
  1031. };
  1032. DesignerMove.grid = function () {
  1033. var valueSent = '';
  1034. if (!onGrid) {
  1035. onGrid = 1;
  1036. valueSent = 'on';
  1037. document.getElementById('grid_button').className = 'M_butt_Selected_down';
  1038. } else {
  1039. document.getElementById('grid_button').className = 'M_butt';
  1040. onGrid = 0;
  1041. valueSent = 'off';
  1042. }
  1043. DesignerMove.saveValueInConfig('snap_to_grid', valueSent);
  1044. };
  1045. DesignerMove.angularDirect = function () {
  1046. var valueSent = '';
  1047. if (onAngularDirect) {
  1048. onAngularDirect = 0;
  1049. valueSent = 'angular';
  1050. document.getElementById('angular_direct_button').className = 'M_butt_Selected_down';
  1051. } else {
  1052. onAngularDirect = 1;
  1053. valueSent = 'direct';
  1054. document.getElementById('angular_direct_button').className = 'M_butt';
  1055. }
  1056. DesignerMove.saveValueInConfig('angular_direct', valueSent);
  1057. DesignerMove.reload();
  1058. };
  1059. DesignerMove.saveValueInConfig = function (indexSent, valueSent) {
  1060. $.post('index.php?route=/database/designer', {
  1061. 'operation': 'save_setting_value',
  1062. 'index': indexSent,
  1063. 'ajax_request': true,
  1064. 'server': server,
  1065. 'value': valueSent
  1066. }, function (data) {
  1067. if (data.success === false) {
  1068. Functions.ajaxShowMessage(data.error, false);
  1069. }
  1070. });
  1071. }; // ++++++++++++++++++++++++++++++ RELATION ++++++++++++++++++++++++++++++++++++++
  1072. DesignerMove.startRelation = function () {
  1073. if (onDisplayField) {
  1074. return;
  1075. }
  1076. if (!onRelation) {
  1077. document.getElementById('foreign_relation').style.display = '';
  1078. onRelation = 1;
  1079. document.getElementById('designer_hint').innerHTML = Messages.strSelectReferencedKey;
  1080. document.getElementById('designer_hint').style.display = 'block';
  1081. document.getElementById('rel_button').className = 'M_butt_Selected_down';
  1082. } else {
  1083. document.getElementById('designer_hint').innerHTML = '';
  1084. document.getElementById('designer_hint').style.display = 'none';
  1085. document.getElementById('rel_button').className = 'M_butt';
  1086. clickField = 0;
  1087. onRelation = 0;
  1088. }
  1089. }; // table field
  1090. DesignerMove.clickField = function (db, T, f, pk) {
  1091. var pkLocal = parseInt(pk);
  1092. var argsep = CommonParams.get('arg_separator');
  1093. if (onRelation) {
  1094. if (!clickField) {
  1095. // .style.display=='none' .style.display = 'none'
  1096. if (!pkLocal) {
  1097. alert(Messages.strPleaseSelectPrimaryOrUniqueKey);
  1098. return; // 0;
  1099. } // PK
  1100. if (jTabs[db + '.' + T] !== 1) {
  1101. document.getElementById('foreign_relation').style.display = 'none';
  1102. }
  1103. clickField = 1;
  1104. linkRelation = 'DB1=' + db + argsep + 'T1=' + T + argsep + 'F1=' + f;
  1105. document.getElementById('designer_hint').innerHTML = Messages.strSelectForeignKey;
  1106. } else {
  1107. DesignerMove.startRelation(); // hidden hint...
  1108. if (jTabs[db + '.' + T] !== 1 || !pkLocal) {
  1109. document.getElementById('foreign_relation').style.display = 'none';
  1110. }
  1111. var left = globX - (document.getElementById('layer_new_relation').offsetWidth >> 1);
  1112. document.getElementById('layer_new_relation').style.left = left + 'px';
  1113. var top = globY - document.getElementById('layer_new_relation').offsetHeight;
  1114. document.getElementById('layer_new_relation').style.top = top + 'px';
  1115. document.getElementById('layer_new_relation').style.display = 'block';
  1116. linkRelation += argsep + 'DB2=' + db + argsep + 'T2=' + T + argsep + 'F2=' + f;
  1117. }
  1118. }
  1119. if (onDisplayField) {
  1120. var fieldNameToSend = decodeURIComponent(f);
  1121. var newDisplayFieldClass = 'tab_field';
  1122. var oldTabField = document.getElementById('id_tr_' + T + '.' + displayField[T]); // if is display field
  1123. if (displayField[T] === f) {
  1124. // The display field is already the one defined, user wants to remove it
  1125. newDisplayFieldClass = 'tab_field';
  1126. delete displayField[T];
  1127. if (oldTabField) {
  1128. // Clear the style
  1129. // Set display field class on old item
  1130. oldTabField.className = 'tab_field';
  1131. }
  1132. fieldNameToSend = '';
  1133. } else {
  1134. newDisplayFieldClass = 'tab_field_3';
  1135. if (displayField[T]) {
  1136. // Had a previous one, clear it
  1137. if (oldTabField) {
  1138. // Set display field class on old item
  1139. oldTabField.className = 'tab_field';
  1140. }
  1141. delete displayField[T];
  1142. }
  1143. displayField[T] = f;
  1144. var tabField = document.getElementById('id_tr_' + T + '.' + displayField[T]);
  1145. if (tabField) {
  1146. // Set new display field class
  1147. tabField.className = newDisplayFieldClass;
  1148. }
  1149. }
  1150. onDisplayField = 0;
  1151. document.getElementById('designer_hint').innerHTML = '';
  1152. document.getElementById('designer_hint').style.display = 'none';
  1153. document.getElementById('display_field_button').className = 'M_butt';
  1154. var $msgbox = Functions.ajaxShowMessage(Messages.strProcessingRequest);
  1155. $.post('index.php?route=/database/designer', {
  1156. 'operation': 'setDisplayField',
  1157. 'ajax_request': true,
  1158. 'server': server,
  1159. 'db': db,
  1160. 'table': T,
  1161. 'field': fieldNameToSend
  1162. }, function (data) {
  1163. if (data.success === false) {
  1164. Functions.ajaxShowMessage(data.error, false);
  1165. } else {
  1166. Functions.ajaxRemoveMessage($msgbox);
  1167. Functions.ajaxShowMessage(Messages.strModificationSaved);
  1168. }
  1169. });
  1170. }
  1171. };
  1172. DesignerMove.newRelation = function () {
  1173. document.getElementById('layer_new_relation').style.display = 'none';
  1174. var argsep = CommonParams.get('arg_separator');
  1175. linkRelation += argsep + 'server=' + server + argsep + 'db=' + db + argsep + 'db2=p';
  1176. linkRelation += argsep + 'on_delete=' + document.getElementById('on_delete').value + argsep + 'on_update=' + document.getElementById('on_update').value;
  1177. linkRelation += argsep + 'operation=addNewRelation' + argsep + 'ajax_request=true';
  1178. var $msgbox = Functions.ajaxShowMessage(Messages.strProcessingRequest);
  1179. $.post('index.php?route=/database/designer', linkRelation, function (data) {
  1180. if (data.success === false) {
  1181. Functions.ajaxShowMessage(data.error, false);
  1182. } else {
  1183. Functions.ajaxRemoveMessage($msgbox);
  1184. DesignerMove.loadPage(selectedPage);
  1185. }
  1186. }); // end $.post()
  1187. }; // -------------------------- create tables -------------------------------------
  1188. DesignerMove.startTableNew = function () {
  1189. CommonParams.set('table', '');
  1190. CommonActions.refreshMain('index.php?route=/table/create');
  1191. };
  1192. DesignerMove.startTabUpd = function (db, table) {
  1193. CommonParams.set('db', db);
  1194. CommonParams.set('table', table);
  1195. CommonActions.refreshMain('index.php?route=/table/structure');
  1196. }; // --------------------------- hide tables --------------------------------------
  1197. // max/min all tables
  1198. DesignerMove.smallTabAll = function (idThis) {
  1199. var icon = idThis.children[0];
  1200. var valueSent = '';
  1201. if (icon.alt === 'v') {
  1202. $('.designer_tab .small_tab,.small_tab2').each(function (index, element) {
  1203. if ($(element).text() === 'v') {
  1204. DesignerMove.smallTab($(element).attr('table_name'), 0);
  1205. }
  1206. });
  1207. icon.alt = '>';
  1208. icon.src = icon.dataset.right;
  1209. valueSent = 'v';
  1210. } else {
  1211. $('.designer_tab .small_tab,.small_tab2').each(function (index, element) {
  1212. if ($(element).text() !== 'v') {
  1213. DesignerMove.smallTab($(element).attr('table_name'), 0);
  1214. }
  1215. });
  1216. icon.alt = 'v';
  1217. icon.src = icon.dataset.down;
  1218. valueSent = '>';
  1219. }
  1220. DesignerMove.saveValueInConfig('small_big_all', valueSent);
  1221. $('#key_SB_all').toggleClass('M_butt_Selected_down');
  1222. $('#key_SB_all').toggleClass('M_butt');
  1223. DesignerMove.reload();
  1224. }; // invert max/min all tables
  1225. DesignerMove.smallTabInvert = function () {
  1226. for (var key in jTabs) {
  1227. DesignerMove.smallTab(key, 0);
  1228. }
  1229. DesignerMove.reload();
  1230. };
  1231. DesignerMove.relationLinesInvert = function () {
  1232. showRelationLines = !showRelationLines;
  1233. DesignerMove.saveValueInConfig('relation_lines', showRelationLines);
  1234. $('#relLineInvert').toggleClass('M_butt_Selected_down');
  1235. $('#relLineInvert').toggleClass('M_butt');
  1236. DesignerMove.reload();
  1237. };
  1238. DesignerMove.smallTabRefresh = function () {
  1239. for (var key in jTabs) {
  1240. if (document.getElementById('id_hide_tbody_' + key).innerHTML !== 'v') {
  1241. DesignerMove.smallTab(key, 0);
  1242. }
  1243. }
  1244. };
  1245. DesignerMove.smallTab = function (t, reload) {
  1246. var id = document.getElementById('id_tbody_' + t);
  1247. var idThis = document.getElementById('id_hide_tbody_' + t);
  1248. if (idThis.innerHTML === 'v') {
  1249. // ---CROSS
  1250. id.style.display = 'none';
  1251. idThis.innerHTML = '>';
  1252. } else {
  1253. id.style.display = '';
  1254. idThis.innerHTML = 'v';
  1255. }
  1256. if (reload) {
  1257. DesignerMove.reload();
  1258. }
  1259. };
  1260. DesignerMove.selectTab = function (t) {
  1261. var idZag = document.getElementById('id_zag_' + t);
  1262. if (idZag.className !== 'tab_zag_3') {
  1263. document.getElementById('id_zag_' + t).className = 'tab_zag_2';
  1264. } else {
  1265. document.getElementById('id_zag_' + t).className = 'tab_zag';
  1266. } // ----------
  1267. var idT = document.getElementById(t);
  1268. window.scrollTo(parseInt(idT.style.left, 10) - 300, parseInt(idT.style.top, 10) - 300);
  1269. setTimeout(function () {
  1270. document.getElementById('id_zag_' + t).className = 'tab_zag';
  1271. }, 800);
  1272. };
  1273. DesignerMove.canvasClick = function (id, event) {
  1274. var n = 0;
  1275. var selected = 0;
  1276. var a = [];
  1277. var Key0;
  1278. var Key1;
  1279. var Key2;
  1280. var Key3;
  1281. var Key;
  1282. var x1;
  1283. var x2;
  1284. var K;
  1285. var key;
  1286. var key2;
  1287. var key3;
  1288. var localX = isIe ? event.clientX + document.body.scrollLeft : event.pageX;
  1289. var localY = isIe ? event.clientY + document.body.scrollTop : event.pageY;
  1290. localX -= $('#osn_tab').offset().left;
  1291. localY -= $('#osn_tab').offset().top;
  1292. DesignerMove.clear();
  1293. for (K in contr) {
  1294. for (key in contr[K]) {
  1295. for (key2 in contr[K][key]) {
  1296. for (key3 in contr[K][key][key2]) {
  1297. if (!document.getElementById('check_vis_' + key2).checked || !document.getElementById('check_vis_' + contr[K][key][key2][key3][0]).checked) {
  1298. continue; // if hide
  1299. }
  1300. var x1Left = document.getElementById(key2).offsetLeft + 1; // document.getElementById(key2+"."+key3).offsetLeft;
  1301. var x1Right = x1Left + document.getElementById(key2).offsetWidth;
  1302. var x2Left = document.getElementById(contr[K][key][key2][key3][0]).offsetLeft; // +document.getElementById(contr[K][key2][key3][0]+"."+contr[K][key2][key3][1]).offsetLeft
  1303. var x2Right = x2Left + document.getElementById(contr[K][key][key2][key3][0]).offsetWidth;
  1304. a[0] = Math.abs(x1Left - x2Left);
  1305. a[1] = Math.abs(x1Left - x2Right);
  1306. a[2] = Math.abs(x1Right - x2Left);
  1307. a[3] = Math.abs(x1Right - x2Right);
  1308. n = sLeft = sRight = 0;
  1309. for (var i = 1; i < 4; i++) {
  1310. if (a[n] > a[i]) {
  1311. n = i;
  1312. }
  1313. }
  1314. if (n === 1) {
  1315. x1 = x1Left - smS;
  1316. x2 = x2Right + smS;
  1317. if (x1 < x2) {
  1318. n = 0;
  1319. }
  1320. }
  1321. if (n === 2) {
  1322. x1 = x1Right + smS;
  1323. x2 = x2Left - smS;
  1324. if (x1 > x2) {
  1325. n = 0;
  1326. }
  1327. }
  1328. if (n === 3) {
  1329. x1 = x1Right + smS;
  1330. x2 = x2Right + smS;
  1331. sRight = 1;
  1332. }
  1333. if (n === 0) {
  1334. x1 = x1Left - smS;
  1335. x2 = x2Left - smS;
  1336. sLeft = 1;
  1337. }
  1338. var y1 = document.getElementById(key2).offsetTop + document.getElementById(key2 + '.' + key3).offsetTop + heightField;
  1339. var y2 = document.getElementById(contr[K][key][key2][key3][0]).offsetTop + document.getElementById(contr[K][key][key2][key3][0] + '.' + contr[K][key][key2][key3][1]).offsetTop + heightField;
  1340. var osnTab = document.getElementById('osn_tab');
  1341. if (!selected && localX > x1 - 10 && localX < x1 + 10 && localY > y1 - 7 && localY < y1 + 7) {
  1342. DesignerMove.line0(x1 + directionEffect * osnTab.offsetLeft, y1 - osnTab.offsetTop, x2 + directionEffect * osnTab.offsetLeft, y2 - osnTab.offsetTop, 'rgba(255,0,0,1)');
  1343. selected = 1;
  1344. Key0 = contr[K][key][key2][key3][0];
  1345. Key1 = contr[K][key][key2][key3][1];
  1346. Key2 = key2;
  1347. Key3 = key3;
  1348. Key = K;
  1349. } else {
  1350. DesignerMove.line0(x1 + directionEffect * osnTab.offsetLeft, y1 - osnTab.offsetTop, x2 + directionEffect * osnTab.offsetLeft, y2 - osnTab.offsetTop, DesignerMove.getColorByTarget(contr[K][key][key2][key3][0] + '.' + contr[K][key][key2][key3][1]));
  1351. }
  1352. }
  1353. }
  1354. }
  1355. }
  1356. if (selected) {
  1357. // select relations
  1358. var left = globX - (document.getElementById('layer_upd_relation').offsetWidth >> 1);
  1359. document.getElementById('layer_upd_relation').style.left = left + 'px';
  1360. var top = globY - document.getElementById('layer_upd_relation').offsetHeight - 10;
  1361. document.getElementById('layer_upd_relation').style.top = top + 'px';
  1362. document.getElementById('layer_upd_relation').style.display = 'block';
  1363. var argsep = CommonParams.get('arg_separator');
  1364. linkRelation = 'T1=' + Key0 + argsep + 'F1=' + Key1 + argsep + 'T2=' + Key2 + argsep + 'F2=' + Key3 + argsep + 'K=' + Key;
  1365. }
  1366. };
  1367. DesignerMove.updRelation = function () {
  1368. document.getElementById('layer_upd_relation').style.display = 'none';
  1369. var argsep = CommonParams.get('arg_separator');
  1370. linkRelation += argsep + 'server=' + server + argsep + 'db=' + db;
  1371. linkRelation += argsep + 'operation=removeRelation' + argsep + 'ajax_request=true';
  1372. var $msgbox = Functions.ajaxShowMessage(Messages.strProcessingRequest);
  1373. $.post('index.php?route=/database/designer', linkRelation, function (data) {
  1374. if (data.success === false) {
  1375. Functions.ajaxShowMessage(data.error, false);
  1376. } else {
  1377. Functions.ajaxRemoveMessage($msgbox);
  1378. DesignerMove.loadPage(selectedPage);
  1379. }
  1380. }); // end $.post()
  1381. };
  1382. DesignerMove.visibleTab = function (id, tN) {
  1383. if (id.checked) {
  1384. document.getElementById(tN).style.display = 'block';
  1385. } else {
  1386. document.getElementById(tN).style.display = 'none';
  1387. }
  1388. DesignerMove.reload();
  1389. DesignerMove.markUnsaved();
  1390. }; // max/min all tables
  1391. DesignerMove.hideTabAll = function (idThis) {
  1392. if (idThis.alt === 'v') {
  1393. idThis.alt = '>';
  1394. idThis.src = idThis.dataset.right;
  1395. } else {
  1396. idThis.alt = 'v';
  1397. idThis.src = idThis.dataset.down;
  1398. }
  1399. var E = document.getElementById('container-form');
  1400. var EelementsLength = E.elements.length;
  1401. for (var i = 0; i < EelementsLength; i++) {
  1402. if (E.elements[i].type === 'checkbox' && E.elements[i].id.substring(0, 10) === 'check_vis_') {
  1403. if (idThis.alt === 'v') {
  1404. E.elements[i].checked = true;
  1405. document.getElementById(E.elements[i].value).style.display = '';
  1406. } else {
  1407. E.elements[i].checked = false;
  1408. document.getElementById(E.elements[i].value).style.display = 'none';
  1409. }
  1410. }
  1411. }
  1412. DesignerMove.reload();
  1413. };
  1414. DesignerMove.inArrayK = function (x, m) {
  1415. var b = 0;
  1416. for (var u in m) {
  1417. if (x === u) {
  1418. b = 1;
  1419. break;
  1420. }
  1421. }
  1422. return b;
  1423. };
  1424. DesignerMove.noHaveConstr = function (idThis) {
  1425. var a = [];
  1426. var K;
  1427. var key;
  1428. var key2;
  1429. var key3;
  1430. for (K in contr) {
  1431. for (key in contr[K]) {
  1432. // contr name
  1433. for (key2 in contr[K][key]) {
  1434. // table name
  1435. for (key3 in contr[K][key][key2]) {
  1436. // field name
  1437. a[key2] = a[contr[K][key][key2][key3][0]] = 1; // exist constr
  1438. }
  1439. }
  1440. }
  1441. }
  1442. if (idThis.alt === 'v') {
  1443. idThis.alt = '>';
  1444. idThis.src = idThis.dataset.right;
  1445. } else {
  1446. idThis.alt = 'v';
  1447. idThis.src = idThis.dataset.down;
  1448. }
  1449. var E = document.getElementById('container-form');
  1450. var EelementsLength = E.elements.length;
  1451. for (var i = 0; i < EelementsLength; i++) {
  1452. if (E.elements[i].type === 'checkbox' && E.elements[i].id.substring(0, 10) === 'check_vis_') {
  1453. if (!DesignerMove.inArrayK(E.elements[i].value, a)) {
  1454. if (idThis.alt === 'v') {
  1455. E.elements[i].checked = true;
  1456. document.getElementById(E.elements[i].value).style.display = '';
  1457. } else {
  1458. E.elements[i].checked = false;
  1459. document.getElementById(E.elements[i].value).style.display = 'none';
  1460. }
  1461. }
  1462. }
  1463. }
  1464. };
  1465. DesignerMove.generalScroll = function () {
  1466. // if (timeoutId)
  1467. clearTimeout(timeoutId);
  1468. timeoutId = setTimeout(function () {
  1469. document.getElementById('top_menu').style.left = document.body.scrollLeft + 'px';
  1470. document.getElementById('top_menu').style.top = document.body.scrollTop + 'px';
  1471. }, 200);
  1472. }; // max/min all tables
  1473. DesignerMove.showLeftMenu = function (idThis) {
  1474. var icon = idThis.children[0];
  1475. $('#key_Show_left_menu').toggleClass('M_butt_Selected_down');
  1476. if (icon.alt === 'v') {
  1477. document.getElementById('layer_menu').style.top = '0px';
  1478. document.getElementById('layer_menu').style.display = 'block';
  1479. icon.alt = '>';
  1480. icon.src = icon.dataset.up;
  1481. if (isIe) {
  1482. DesignerMove.generalScroll();
  1483. }
  1484. } else {
  1485. document.getElementById('layer_menu').style.top = -1000 + 'px'; // fast scroll
  1486. document.getElementById('layer_menu').style.display = 'none';
  1487. icon.alt = 'v';
  1488. icon.src = icon.dataset.down;
  1489. }
  1490. };
  1491. DesignerMove.sideMenuRight = function (idThis) {
  1492. $('#side_menu').toggleClass('right');
  1493. $('#layer_menu').toggleClass('left');
  1494. var moveMenuIcon = $(idThis.getElementsByTagName('img')[0]);
  1495. var resizeIcon = $('#layer_menu_sizer > img').toggleClass('floatleft').toggleClass('floatright');
  1496. var srcResizeIcon = resizeIcon.attr('src');
  1497. resizeIcon.attr('src', resizeIcon.attr('data-right'));
  1498. resizeIcon.attr('data-right', srcResizeIcon);
  1499. var srcMoveIcon = moveMenuIcon.attr('src');
  1500. moveMenuIcon.attr('src', moveMenuIcon.attr('data-right'));
  1501. moveMenuIcon.attr('data-right', srcMoveIcon);
  1502. menuMoved = !menuMoved;
  1503. DesignerMove.saveValueInConfig('side_menu', $('#side_menu').hasClass('right'));
  1504. $('#key_Left_Right').toggleClass('M_butt_Selected_down');
  1505. $('#key_Left_Right').toggleClass('M_butt');
  1506. };
  1507. DesignerMove.showText = function () {
  1508. $('#side_menu').find('.hidable').show();
  1509. };
  1510. DesignerMove.hideText = function () {
  1511. if (!alwaysShowText) {
  1512. $('#side_menu').find('.hidable').hide();
  1513. }
  1514. };
  1515. DesignerMove.pinText = function () {
  1516. alwaysShowText = !alwaysShowText;
  1517. $('#pin_Text').toggleClass('M_butt_Selected_down');
  1518. $('#pin_Text').toggleClass('M_butt');
  1519. DesignerMove.saveValueInConfig('pin_text', alwaysShowText);
  1520. };
  1521. DesignerMove.startDisplayField = function () {
  1522. if (onRelation) {
  1523. return;
  1524. }
  1525. if (!onDisplayField) {
  1526. onDisplayField = 1;
  1527. document.getElementById('designer_hint').innerHTML = Messages.strChangeDisplay;
  1528. document.getElementById('designer_hint').style.display = 'block';
  1529. document.getElementById('display_field_button').className = 'M_butt_Selected_down'; // '#FFEE99';gray #AAAAAA
  1530. if (isIe) {
  1531. // correct for IE
  1532. document.getElementById('display_field_button').className = 'M_butt_Selected_down_IE';
  1533. }
  1534. } else {
  1535. document.getElementById('designer_hint').innerHTML = '';
  1536. document.getElementById('designer_hint').style.display = 'none';
  1537. document.getElementById('display_field_button').className = 'M_butt';
  1538. onDisplayField = 0;
  1539. }
  1540. };
  1541. var TargetColors = [];
  1542. DesignerMove.getColorByTarget = function (target) {
  1543. var color = ''; // "rgba(0,100,150,1)";
  1544. for (var targetColor in TargetColors) {
  1545. if (TargetColors[targetColor][0] === target) {
  1546. color = TargetColors[targetColor][1];
  1547. break;
  1548. }
  1549. }
  1550. if (color.length === 0) {
  1551. var i = TargetColors.length + 1;
  1552. var d = i % 6;
  1553. var j = (i - d) / 6;
  1554. j = j % 4;
  1555. j++;
  1556. var colorCase = [[1, 0, 0], [0, 1, 0], [0, 0, 1], [1, 1, 0], [1, 0, 1], [0, 1, 1]];
  1557. var a = colorCase[d][0];
  1558. var b = colorCase[d][1];
  1559. var c = colorCase[d][2];
  1560. var e = 1 - (j - 1) / 6;
  1561. var r = Math.round(a * 200 * e);
  1562. var g = Math.round(b * 200 * e);
  1563. b = Math.round(c * 200 * e);
  1564. color = 'rgba(' + r + ',' + g + ',' + b + ',1)';
  1565. TargetColors.push([target, color]);
  1566. }
  1567. return color;
  1568. };
  1569. DesignerMove.clickOption = function (dbName, tableName, columnName, tableDbNameUrl, optionColNameString) {
  1570. var designerOptions = document.getElementById('designer_optionse');
  1571. var left = globX - (designerOptions.offsetWidth >> 1);
  1572. designerOptions.style.left = left + 'px'; // var top = Glob_Y - designerOptions.offsetHeight - 10;
  1573. designerOptions.style.top = screen.height / 4 + 'px';
  1574. designerOptions.style.display = 'block';
  1575. document.getElementById('ok_add_object_db_and_table_name_url').value = tableDbNameUrl;
  1576. document.getElementById('ok_add_object_db_name').value = dbName;
  1577. document.getElementById('ok_add_object_table_name').value = tableName;
  1578. document.getElementById('ok_add_object_col_name').value = columnName;
  1579. document.getElementById('option_col_name').innerHTML = optionColNameString;
  1580. };
  1581. DesignerMove.closeOption = function () {
  1582. document.getElementById('designer_optionse').style.display = 'none';
  1583. document.getElementById('rel_opt').value = '--';
  1584. document.getElementById('Query').value = '';
  1585. document.getElementById('new_name').value = '';
  1586. document.getElementById('operator').value = '---';
  1587. document.getElementById('groupby').checked = false;
  1588. document.getElementById('h_rel_opt').value = '--';
  1589. document.getElementById('h_operator').value = '---';
  1590. document.getElementById('having').value = '';
  1591. document.getElementById('orderby').value = '---';
  1592. };
  1593. DesignerMove.selectAll = function (tableName, dbName, idSelectAll) {
  1594. var parentIsChecked = $('#' + idSelectAll).is(':checked');
  1595. var checkboxAll = $('#container-form input[id_check_all=\'' + idSelectAll + '\']:checkbox');
  1596. checkboxAll.each(function () {
  1597. // already checked and then check parent
  1598. if (parentIsChecked === true && this.checked) {
  1599. // was checked, removing column from selected fields
  1600. // trigger unchecked event
  1601. this.click();
  1602. }
  1603. this.checked = parentIsChecked;
  1604. this.disabled = parentIsChecked;
  1605. });
  1606. if (parentIsChecked) {
  1607. selectField.push('`' + tableName + '`.*');
  1608. fromArray.push(tableName);
  1609. } else {
  1610. var i;
  1611. for (i = 0; i < selectField.length; i++) {
  1612. if (selectField[i] === '`' + tableName + '`.*') {
  1613. selectField.splice(i, 1);
  1614. }
  1615. }
  1616. var k;
  1617. for (k = 0; k < fromArray.length; k++) {
  1618. if (fromArray[k] === tableName) {
  1619. fromArray.splice(k, 1);
  1620. break;
  1621. }
  1622. }
  1623. }
  1624. DesignerMove.reload();
  1625. };
  1626. DesignerMove.tableOnOver = function (idThis, val, buil) {
  1627. var builLocal = parseInt(buil);
  1628. if (!val) {
  1629. document.getElementById('id_zag_' + idThis).className = 'tab_zag_2';
  1630. if (builLocal) {
  1631. document.getElementById('id_zag_' + idThis + '_2').className = 'tab_zag_2';
  1632. }
  1633. } else {
  1634. document.getElementById('id_zag_' + idThis).className = 'tab_zag';
  1635. if (builLocal) {
  1636. document.getElementById('id_zag_' + idThis + '_2').className = 'tab_zag';
  1637. }
  1638. }
  1639. };
  1640. /**
  1641. * This function stores selected column information in selectField[]
  1642. * In case column is checked it add else it deletes
  1643. */
  1644. DesignerMove.storeColumn = function (tableName, colName, checkboxId) {
  1645. var i;
  1646. var k;
  1647. var selectKeyField = '`' + tableName + '`.`' + colName + '`';
  1648. if (document.getElementById(checkboxId).checked === true) {
  1649. selectField.push(selectKeyField);
  1650. fromArray.push(tableName);
  1651. } else {
  1652. for (i = 0; i < selectField.length; i++) {
  1653. if (selectField[i] === selectKeyField) {
  1654. selectField.splice(i, 1);
  1655. break;
  1656. }
  1657. }
  1658. for (k = 0; k < fromArray.length; k++) {
  1659. if (fromArray[k] === tableName) {
  1660. fromArray.splice(k, 1);
  1661. break;
  1662. }
  1663. }
  1664. }
  1665. };
  1666. /**
  1667. * This function builds object and adds them to historyArray
  1668. * first it does a few checks on each object, then makes an object(where,rename,groupby,aggregate,orderby)
  1669. * then a new history object is made and finally all these history objects are added to historyArray[]
  1670. */
  1671. DesignerMove.addObject = function (dbName, tableName, colName, dbTableNameUrl) {
  1672. var p;
  1673. var whereObj;
  1674. var rel = document.getElementById('rel_opt');
  1675. var sum = 0;
  1676. var init = historyArray.length;
  1677. if (rel.value !== '--') {
  1678. if (document.getElementById('Query').value === '') {
  1679. Functions.ajaxShowMessage(Functions.sprintf(Messages.strQueryEmpty));
  1680. return;
  1681. }
  1682. p = document.getElementById('Query');
  1683. whereObj = new DesignerHistory.Where(rel.value, p.value); // make where object
  1684. historyArray.push(new DesignerHistory.HistoryObj(colName, whereObj, tableName, hTabs[dbTableNameUrl], 'Where'));
  1685. sum = sum + 1;
  1686. }
  1687. if (document.getElementById('new_name').value !== '') {
  1688. var renameObj = new DesignerHistory.Rename(document.getElementById('new_name').value); // make Rename object
  1689. historyArray.push(new DesignerHistory.HistoryObj(colName, renameObj, tableName, hTabs[dbTableNameUrl], 'Rename'));
  1690. sum = sum + 1;
  1691. }
  1692. if (document.getElementById('operator').value !== '---') {
  1693. var aggregateObj = new DesignerHistory.Aggregate(document.getElementById('operator').value);
  1694. historyArray.push(new DesignerHistory.HistoryObj(colName, aggregateObj, tableName, hTabs[dbTableNameUrl], 'Aggregate'));
  1695. sum = sum + 1; // make aggregate operator
  1696. }
  1697. if (document.getElementById('groupby').checked === true) {
  1698. historyArray.push(new DesignerHistory.HistoryObj(colName, 'GroupBy', tableName, hTabs[dbTableNameUrl], 'GroupBy'));
  1699. sum = sum + 1; // make groupby
  1700. }
  1701. if (document.getElementById('h_rel_opt').value !== '--') {
  1702. if (document.getElementById('having').value === '') {
  1703. return;
  1704. }
  1705. whereObj = new DesignerHistory.Having(document.getElementById('h_rel_opt').value, document.getElementById('having').value, document.getElementById('h_operator').value); // make where object
  1706. historyArray.push(new DesignerHistory.HistoryObj(colName, whereObj, tableName, hTabs[dbTableNameUrl], 'Having'));
  1707. sum = sum + 1; // make having
  1708. }
  1709. if (document.getElementById('orderby').value !== '---') {
  1710. var orderByObj = new DesignerHistory.OrderBy(document.getElementById('orderby').value);
  1711. historyArray.push(new DesignerHistory.HistoryObj(colName, orderByObj, tableName, hTabs[dbTableNameUrl], 'OrderBy'));
  1712. sum = sum + 1; // make orderby
  1713. }
  1714. Functions.ajaxShowMessage(Functions.sprintf(Messages.strObjectsCreated, sum)); // output sum new objects created
  1715. var existingDiv = document.getElementById('ab');
  1716. existingDiv.innerHTML = DesignerHistory.display(init, historyArray.length);
  1717. DesignerMove.closeOption();
  1718. $('#ab').accordion('refresh');
  1719. };
  1720. DesignerMove.enablePageContentEvents = function () {
  1721. $('#page_content').off('mousedown');
  1722. $('#page_content').off('mouseup');
  1723. $('#page_content').off('mousemove');
  1724. $('#page_content').on('mousedown', function (e) {
  1725. DesignerMove.mouseDown(e);
  1726. });
  1727. $('#page_content').on('mouseup', function (e) {
  1728. DesignerMove.mouseUp(e);
  1729. });
  1730. $('#page_content').on('mousemove', function (e) {
  1731. DesignerMove.mouseMove(e);
  1732. });
  1733. };
  1734. /**
  1735. * This function enables the events on table items.
  1736. * It helps to enable them on page loading and when a table is added on the fly.
  1737. */
  1738. DesignerMove.enableTableEvents = function (index, element) {
  1739. $(element).on('click', '.select_all_1', function () {
  1740. DesignerMove.selectAll($(this).attr('table_name'), $(this).attr('db_name'), $(this).attr('id'));
  1741. });
  1742. $(element).on('click', '.small_tab,.small_tab2', function () {
  1743. DesignerMove.smallTab($(this).attr('table_name'), 1);
  1744. });
  1745. $(element).on('click', '.small_tab_pref_1', function () {
  1746. DesignerMove.startTabUpd($(this).attr('db_url'), $(this).attr('table_name_url'));
  1747. });
  1748. $(element).on('click', '.select_all_store_col', function () {
  1749. DesignerMove.storeColumn($(this).attr('table_name'), $(this).attr('col_name'), $(this).attr('id'));
  1750. });
  1751. $(element).on('click', '.small_tab_pref_click_opt', function () {
  1752. DesignerMove.clickOption($(this).attr('db_name'), $(this).attr('table_name'), $(this).attr('col_name'), $(this).attr('db_table_name_url'), $(this).attr('option_col_name_modal'));
  1753. });
  1754. $(element).on('click', '.tab_field_2,.tab_field_3,.tab_field', function () {
  1755. var params = $(this).attr('click_field_param').split(',');
  1756. DesignerMove.clickField(params[3], params[0], params[1], params[2]);
  1757. });
  1758. $(element).find('.tab_zag_noquery').on('mouseover', function () {
  1759. DesignerMove.tableOnOver($(this).attr('table_name'), 0, $(this).attr('query_set'));
  1760. });
  1761. $(element).find('.tab_zag_noquery').on('mouseout', function () {
  1762. DesignerMove.tableOnOver($(this).attr('table_name'), 1, $(this).attr('query_set'));
  1763. });
  1764. $(element).find('.tab_zag_query').on('mouseover', function () {
  1765. DesignerMove.tableOnOver($(this).attr('table_name'), 0, 1);
  1766. });
  1767. $(element).find('.tab_zag_query').on('mouseout', function () {
  1768. DesignerMove.tableOnOver($(this).attr('table_name'), 1, 1);
  1769. });
  1770. DesignerMove.enablePageContentEvents();
  1771. };
  1772. AJAX.registerTeardown('designer/move.js', function () {
  1773. $('#side_menu').off('mouseenter mouseleave');
  1774. $('#key_Show_left_menu').off('click');
  1775. $('#toggleFullscreen').off('click');
  1776. $('#newPage').off('click');
  1777. $('#editPage').off('click');
  1778. $('#savePos').off('click');
  1779. $('#SaveAs').off('click');
  1780. $('#delPages').off('click');
  1781. $('#StartTableNew').off('click');
  1782. $('#rel_button').off('click');
  1783. $('#StartTableNew').off('click');
  1784. $('#display_field_button').off('click');
  1785. $('#reloadPage').off('click');
  1786. $('#angular_direct_button').off('click');
  1787. $('#grid_button').off('click');
  1788. $('#key_SB_all').off('click');
  1789. $('#SmallTabInvert').off('click');
  1790. $('#relLineInvert').off('click');
  1791. $('#exportPages').off('click');
  1792. $('#query_builder').off('click');
  1793. $('#key_Left_Right').off('click');
  1794. $('#pin_Text').off('click');
  1795. $('#canvas').off('click');
  1796. $('#key_HS_all').off('click');
  1797. $('#key_HS').off('click');
  1798. $('.scroll_tab_struct').off('click');
  1799. $('.scroll_tab_checkbox').off('click');
  1800. $('#id_scroll_tab').find('tr').off('click', '.designer_Tabs2,.designer_Tabs');
  1801. $('.designer_tab').off('click', '.select_all_1');
  1802. $('.designer_tab').off('click', '.small_tab,.small_tab2');
  1803. $('.designer_tab').off('click', '.small_tab_pref_1');
  1804. $('.tab_zag_noquery').off('mouseover');
  1805. $('.tab_zag_noquery').off('mouseout');
  1806. $('.tab_zag_query').off('mouseover');
  1807. $('.tab_zag_query').off('mouseout');
  1808. $('.designer_tab').off('click', '.tab_field_2,.tab_field_3,.tab_field');
  1809. $('.designer_tab').off('click', '.select_all_store_col');
  1810. $('.designer_tab').off('click', '.small_tab_pref_click_opt');
  1811. $('#del_button').off('click');
  1812. $('#cancel_button').off('click');
  1813. $('#ok_add_object').off('click');
  1814. $('#cancel_close_option').off('click');
  1815. $('#ok_new_rel_panel').off('click');
  1816. $('#cancel_new_rel_panel').off('click');
  1817. $('#page_content').off('mouseup');
  1818. $('#page_content').off('mousedown');
  1819. $('#page_content').off('mousemove');
  1820. });
  1821. AJAX.registerOnload('designer/move.js', function () {
  1822. $('#key_Show_left_menu').on('click', function () {
  1823. DesignerMove.showLeftMenu(this);
  1824. return false;
  1825. });
  1826. $('#toggleFullscreen').on('click', function () {
  1827. DesignerMove.toggleFullscreen();
  1828. return false;
  1829. });
  1830. $('#addOtherDbTables').on('click', function () {
  1831. DesignerMove.addOtherDbTables();
  1832. return false;
  1833. });
  1834. $('#newPage').on('click', function () {
  1835. DesignerMove.new();
  1836. return false;
  1837. });
  1838. $('#editPage').on('click', function () {
  1839. DesignerMove.editPages();
  1840. return false;
  1841. });
  1842. $('#savePos').on('click', function () {
  1843. DesignerMove.save3();
  1844. return false;
  1845. });
  1846. $('#SaveAs').on('click', function () {
  1847. DesignerMove.saveAs();
  1848. $(document).on('ajaxStop', function () {
  1849. $('#selected_value').on('click', function () {
  1850. $('#savePageNewRadio').prop('checked', true);
  1851. });
  1852. });
  1853. return false;
  1854. });
  1855. $('#delPages').on('click', function () {
  1856. DesignerMove.deletePages();
  1857. return false;
  1858. });
  1859. $('#StartTableNew').on('click', function () {
  1860. DesignerMove.startTableNew();
  1861. return false;
  1862. });
  1863. $('#rel_button').on('click', function () {
  1864. DesignerMove.startRelation();
  1865. return false;
  1866. });
  1867. $('#display_field_button').on('click', function () {
  1868. DesignerMove.startDisplayField();
  1869. return false;
  1870. });
  1871. $('#reloadPage').on('click', function () {
  1872. DesignerMove.loadPage(selectedPage);
  1873. });
  1874. $('#angular_direct_button').on('click', function () {
  1875. DesignerMove.angularDirect();
  1876. return false;
  1877. });
  1878. $('#grid_button').on('click', function () {
  1879. DesignerMove.grid();
  1880. return false;
  1881. });
  1882. $('#key_SB_all').on('click', function () {
  1883. DesignerMove.smallTabAll(this);
  1884. return false;
  1885. });
  1886. $('#SmallTabInvert').on('click', function () {
  1887. DesignerMove.smallTabInvert();
  1888. return false;
  1889. });
  1890. $('#relLineInvert').on('click', function () {
  1891. DesignerMove.relationLinesInvert();
  1892. return false;
  1893. });
  1894. $('#exportPages').on('click', function () {
  1895. DesignerMove.exportPages();
  1896. return false;
  1897. });
  1898. $('#query_builder').on('click', function () {
  1899. DesignerHistory.buildQuery('SQL Query on Database', 0);
  1900. });
  1901. $('#key_Left_Right').on('click', function () {
  1902. DesignerMove.sideMenuRight(this);
  1903. return false;
  1904. });
  1905. $('#side_menu').on('mouseenter', function () {
  1906. DesignerMove.showText();
  1907. return false;
  1908. });
  1909. $('#side_menu').on('mouseleave', function () {
  1910. DesignerMove.hideText();
  1911. return false;
  1912. });
  1913. $('#pin_Text').on('click', function () {
  1914. DesignerMove.pinText(this);
  1915. return false;
  1916. });
  1917. $('#canvas').on('click', function (event) {
  1918. DesignerMove.canvasClick(this, event);
  1919. });
  1920. $('#key_HS_all').on('click', function () {
  1921. DesignerMove.hideTabAll(this);
  1922. return false;
  1923. });
  1924. $('#key_HS').on('click', function () {
  1925. DesignerMove.noHaveConstr(this);
  1926. return false;
  1927. });
  1928. $('.designer_tab').each(DesignerMove.enableTableEvents);
  1929. $('.designer_tab').each(DesignerMove.addTableToTablesList);
  1930. $('input#del_button').on('click', function () {
  1931. DesignerMove.updRelation();
  1932. });
  1933. $('input#cancel_button').on('click', function () {
  1934. document.getElementById('layer_upd_relation').style.display = 'none';
  1935. DesignerMove.reload();
  1936. });
  1937. $('input#ok_add_object').on('click', function () {
  1938. DesignerMove.addObject($('#ok_add_object_db_name').val(), $('#ok_add_object_table_name').val(), $('#ok_add_object_col_name').val(), $('#ok_add_object_db_and_table_name_url').val());
  1939. });
  1940. $('input#cancel_close_option').on('click', function () {
  1941. DesignerMove.closeOption();
  1942. });
  1943. $('input#ok_new_rel_panel').on('click', function () {
  1944. DesignerMove.newRelation();
  1945. });
  1946. $('input#cancel_new_rel_panel').on('click', function () {
  1947. document.getElementById('layer_new_relation').style.display = 'none';
  1948. });
  1949. DesignerMove.enablePageContentEvents();
  1950. });