Built files from Bizgaze WebServer
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

layoutbuilder.js 71KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037
  1. var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
  2. function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
  3. return new (P || (P = Promise))(function (resolve, reject) {
  4. function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
  5. function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
  6. function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
  7. step((generator = generator.apply(thisArg, _arguments || [])).next());
  8. });
  9. };
  10. var Unibase;
  11. (function (Unibase) {
  12. let Platform;
  13. (function (Platform) {
  14. let Layouts;
  15. (function (Layouts) {
  16. let Components;
  17. (function (Components) {
  18. class LayoutBuilder extends Unibase.Platform.Core.BaseComponent {
  19. constructor() {
  20. super(...arguments);
  21. this.ThemeId = 0;
  22. this.activeMode = "";
  23. this.Thumbnail = '';
  24. this.BackgroundImageId = 0;
  25. this.modes = [];
  26. this.layoutSettings = [];
  27. this.isLayoutSettingsModified = false;
  28. this.Logo = Unibase.Themes.Compact.Components.Index.Instance().Logo;
  29. this.isModeButtonClicked = false;
  30. this.backgroundImageSimplebar = ".layoutbuilder-simple-scroll-bar .simplebar-content-wrapper";
  31. this.primaryItem = '#myColorTabContent #primary .colors-wrap .color-box';
  32. this.secondaryItem = '#myColorTabContent #secondary .colors-wrap .color-box';
  33. this.highLightItem = '#myColorTabContent #highlight .colors-wrap .color-box';
  34. this.primaryTextItem = '#myTextColorTabContent #primaryText .colors-wrap .color-box';
  35. this.secondaryTextItem = '#myTextColorTabContent #secondaryText .colors-wrap .color-box';
  36. this.buttonMode = '#dipsplay-modes-section .buttons-wrap button.mode-btn';
  37. this.customModeInputSection = '#dipsplay-modes-section .custom-mode-section .custom-mode-input-section';
  38. this.customModeInput = '#dipsplay-modes-section .custom-mode-section input.custom-mode-input';
  39. this.layoutElement = '.layout-builder #menu-layouts .card-body .row.layout-row a';
  40. this.detailsViewElement = '.layout-builder #detail-list-view .card-body .row.detail-row a';
  41. this.backgroundImageElement = '.layout-builder #background-image-view .card-body .row a';
  42. this.logoElementLeft = '.layout-builder-dashboard .biz-submenu .brand-img';
  43. this.logoElementTop = '.layout-builder-dashboard .top-navbar .brand-img';
  44. this.defaultDisplayModes = [];
  45. this.instance = this;
  46. }
  47. cssFiles() {
  48. return [
  49. 'libs/dragula/dist/style.css',
  50. 'platform/layout/components/layoutbuilder/style.layoutbuilder.css',
  51. "libs/spectrum-2.0.8/dist/spectrum.css"
  52. ];
  53. }
  54. jsFiles() {
  55. return [
  56. "platform/layout/managers/themelayoutmanager.js",
  57. "libs/dragula/dist/dragula.min.js",
  58. "libs/dragula/dist/init.js",
  59. "libs/spectrum-2.0.8/dist/spectrum.js",
  60. ];
  61. }
  62. html(id, containerid) {
  63. var instance = this;
  64. let html = Unibase.Platform.Layouts.Components.LayoutBuilder_Template.Instance().loadTemplate();
  65. return html;
  66. }
  67. load(formId, containerid, callback) {
  68. $('.color-pickr-container').each((index, picker) => {
  69. let colorType = $(picker).attr('data-name');
  70. $(`.sp-container.${colorType}`).remove();
  71. });
  72. let instance = this;
  73. instance.isLayoutSettingsModified = false;
  74. instance.isModeButtonClicked = false;
  75. $(".btn-layout-builder-close").click(function () {
  76. $('.biz-wrapper').removeClass('.biz-drawer-push biz-drawer-pushright');
  77. $('#' + containerid).modal('hide');
  78. $('#' + containerid).remove();
  79. });
  80. instance.addDefaultDisplayModes();
  81. instance.fileCacheHelper.loadJsFile('platform/core/infos/status.js', function () { });
  82. Layouts.Managers.ThemeLayoutManager.Instance().getLayoutBuilderInfo(0, 0).then(function (response) {
  83. $(".preloader-it").delay(1000).fadeIn("slow");
  84. let result = response.result;
  85. if (result != null) {
  86. instance.currentTheme = response.result.CurrentTheme;
  87. let result = response.result.LayoutInfo;
  88. for (var i = 0; i < result.length; i++) {
  89. let curLayout = result[i];
  90. let layoutId = curLayout.LayoutId;
  91. curLayout.Thumbnail = curLayout.Thumbnail.replace(".png", ".svg");
  92. $(".layout-builder #menu-layouts .layout-row").append(`<a href="javascript:;" class="col-6 p-0 mb-2 pr-2 p-relative" data-id="${layoutId}" data-index="${curLayout.LayoutIndex}">
  93. <img src="${curLayout.Thumbnail}" class="rounded w-100 h-100" data-dynamic="1" onerror="ReloadImage(event)" title="${curLayout.LayoutName}" />
  94. <i class="zmdi zmdi-check"></i>
  95. </a>`);
  96. let elementId = "layoutPreviewHtml_" + layoutId;
  97. let divHtml = "<div id='" + elementId + "' class='d-none layoutpreviewhtml'> </div>";
  98. $(curLayout.AppendTo).prepend(divHtml);
  99. if (curLayout.PreviewHtml.includes('%3')) {
  100. $("#" + elementId).append(HtmlHelper.getHelper().decode(curLayout.PreviewHtml));
  101. }
  102. else {
  103. $("#" + elementId).append(curLayout.PreviewHtml);
  104. }
  105. }
  106. result = response.result.LayoutSettings;
  107. if (result) {
  108. instance.layoutSettings = [];
  109. for (let i = 0; i < result.length; i++) {
  110. let layoutSetting = result[i];
  111. let layoutSettingObj = {
  112. LayoutId: layoutSetting.LayoutId,
  113. SettingValue: layoutSetting.SettingValue,
  114. logoImgUrl: layoutSetting.LogoImageUrl,
  115. IsOverrideLogo: layoutSetting.IsOverrideLogo
  116. };
  117. instance.layoutSettings.push(layoutSettingObj);
  118. }
  119. }
  120. $(instance.layoutElement).click(function () {
  121. $(instance.layoutElement).removeClass('active');
  122. $(this).addClass('active');
  123. let id = Number($(this).attr('data-id'));
  124. instance.LayoutId = id;
  125. let elementId = "layoutPreviewHtml_" + id;
  126. $(".layoutpreviewhtml").addClass('d-none');
  127. $("#" + elementId).removeClass('d-none');
  128. $(".layout-builder-dashboard").removeClass('biz-layout-3-preview');
  129. let layoutIndex = Number($(this).attr('data-index'));
  130. if (layoutIndex == 3)
  131. $(".layout-builder-dashboard").addClass('biz-layout-3-preview');
  132. if (instance.isLayoutSettingsModified) {
  133. bootbox.confirm({
  134. message: "Do you want to save previous layout settings?",
  135. className: "layout-builder-bootbox",
  136. callback: function (result) {
  137. if (result) {
  138. instance.getLayoutSettings();
  139. MessageHelper.Instance().showSuccess('Layout Settings Saved!', '');
  140. instance.appendLayoutSettings(id);
  141. }
  142. else {
  143. instance.logoFileData = null;
  144. instance.appendLayoutSettings(id);
  145. }
  146. instance.isLayoutSettingsModified = false;
  147. }
  148. });
  149. }
  150. else {
  151. instance.appendLayoutSettings(id);
  152. }
  153. });
  154. result = response.result.DetailViewInfo;
  155. for (var i = 0; i < result.length; i++) {
  156. let viewLayout = result[i];
  157. let id = viewLayout.DetailsViewId;
  158. $(".layout-builder #detail-list-view .detail-row").append(`<a href="javascript:;" class="col-6 p-0 mb-2 pr-2 p-relative" data-id="${id}">
  159. <img src="${viewLayout.Thumbnail}" class="rounded w-100 h-100" data-dynamic="1" onerror="ReloadImage(event)" title="${viewLayout.DetailsViewName}" />
  160. <i class="zmdi zmdi-check"></i>
  161. </a>`);
  162. var elementId = "detailsViewPreviewHtml_" + id;
  163. var divHtml = "<div id='" + elementId + "' class='d-none detailsviewpreviewhtml'> </div>";
  164. $(".layout-builder-dashboard #bizgaze_body .biz-wrapper .biz-pg-wrapper ._bizgaze_detail_container").append(divHtml);
  165. $("#" + elementId).append(viewLayout.PreviewHtml);
  166. }
  167. $(instance.detailsViewElement).click(function () {
  168. $(instance.detailsViewElement).removeClass('active');
  169. $(this).addClass('active');
  170. let id = Number($(this).attr('data-id'));
  171. instance.viewId = id;
  172. let elementId = "detailsViewPreviewHtml_" + id;
  173. $(".detailsviewpreviewhtml").addClass('d-none');
  174. $("#" + elementId).removeClass('d-none');
  175. });
  176. $('.isStructSettingsEnableChk').on('click', function () {
  177. var msg, enable;
  178. enable = !$('.isStructSettingsEnableChk').prop("checked");
  179. if ($('.isStructSettingsEnableChk').prop("checked")) {
  180. msg = 'Are you sure enable structures in apps or details page ?';
  181. }
  182. else {
  183. msg = 'Are you sure? Do you want to disable structures? <br><br> All structures and layouts of widgets will be missing.You need to reconfigure.';
  184. }
  185. bootbox.confirm({
  186. message: msg,
  187. closeButton: false,
  188. buttons: {
  189. confirm: {
  190. label: 'OK',
  191. className: 'btn-success'
  192. },
  193. cancel: {
  194. label: 'Cancel',
  195. className: 'btn-danger'
  196. }
  197. },
  198. callback: function (result) {
  199. return __awaiter(this, void 0, void 0, function* () {
  200. if (result) {
  201. $('.isStructSettingsEnableChk').prop("checked", $('.isStructSettingsEnableChk').prop("checked"));
  202. }
  203. else {
  204. $('.isStructSettingsEnableChk').prop("checked", enable);
  205. }
  206. });
  207. }
  208. });
  209. });
  210. $('.isStructSettingsEnableChk').prop("checked", Unibase.Themes.Compact.Components.Index.Instance().currentTheme.isstructenable);
  211. instance.loadColorPalettes();
  212. result = response.result.DisplayModesInfo;
  213. for (let i = 0; i < result.length; i++) {
  214. let DisplayMode = result[i];
  215. let DisplayModeName = result[i].DisplayModeName;
  216. if (DisplayModeName != null) {
  217. if (DisplayModeName.toLowerCase() == "light" || DisplayModeName.toLowerCase() == "dark") {
  218. let iconClass = DisplayModeName.toLowerCase() == "light" ? "fa-sun-o text-warning" : "fa-moon-o";
  219. instance.appendDisplayMode(iconClass, DisplayMode);
  220. }
  221. else {
  222. instance.appendDisplayMode("", DisplayMode);
  223. }
  224. }
  225. }
  226. instance.enableButtonModeClick();
  227. let themeobj = Unibase.Platform.Membership.Infos.Identity.currentUser.settings.find(x => x.settingName == "themeobj").settingValue;
  228. if (themeobj != null && themeobj != "" && themeobj != undefined) {
  229. instance.currentTheme = themeobj;
  230. let currentTheme = themeobj;
  231. instance.ThemeId = currentTheme.themeId;
  232. instance.Thumbnail = currentTheme.thumbnail;
  233. instance.BackgroundImageId = currentTheme.backgroundImageId;
  234. instance.LayoutId = currentTheme.layoutId;
  235. instance.viewId = currentTheme.detailsViewId;
  236. $(`${instance.layoutElement}[data-id="${currentTheme.layoutId}"]`).click();
  237. $(`${instance.detailsViewElement}[data-id="${currentTheme.detailsViewId}"]`).click();
  238. $(`${instance.buttonMode}[data-id="${currentTheme.displayModeId}"]`).click();
  239. if (currentTheme != null) {
  240. if (currentTheme.thumbnail != "" && currentTheme.thumbnail != null) {
  241. if (currentTheme.thumbnail.includes('tenants\\default\\layoutbuilder\\backgroundimages')) {
  242. let imageUrl = `'${instance.currentTheme.thumbnail.replace(/\\/g, "/")}'`;
  243. instance.applyBackgroundImage(imageUrl);
  244. }
  245. else {
  246. Unibase.Themes.Compact.Components.Index.Instance().getImageUrl(currentTheme.thumbnail).then(function (imageUrl) {
  247. instance.applyBackgroundImage(imageUrl);
  248. });
  249. }
  250. }
  251. }
  252. $('#imagepickerThumbnail').change(function (e) {
  253. let file = e;
  254. var t = file.target.files[0].type.split('/').pop().toLowerCase();
  255. if (t != "jpeg" && t != "jpg" && t != "png" && t != "bmp" && t != "gif") {
  256. MessageHelper.Instance().showError('Please select a valid image file', 'layoutBuilderErrMsg');
  257. $("#imagepickerThumbnail").val('');
  258. return false;
  259. }
  260. Unibase.Platform.Helpers.FileHelper.Instance().getBase64(e).then(function (response) {
  261. instance.imageUploadEffect(response);
  262. $("#imagepickerThumbnail").val('');
  263. });
  264. });
  265. }
  266. $(instance.logoElementLeft).attr('src', instance.Logo);
  267. $(instance.logoElementTop).attr('src', instance.Logo);
  268. instance.appendBackgroundImages(response.result.BackgroundImages);
  269. }
  270. $(".preloader-it").delay(1000).fadeOut("slow");
  271. let el = $(".custom-scollable-container .simplebar-content-wrapper")[0];
  272. instance.addScrollOnDrag(el);
  273. $('.layout-builder').removeClass('d-none');
  274. });
  275. $('#dipsplay-modes-section .custom-mode-section button.custom-mode-btn').click(function () {
  276. $(instance.customModeInputSection).toggleClass('d-none');
  277. if (!$(instance.customModeInputSection).hasClass('d-none')) {
  278. $($(instance.customModeInput)[0]).focus();
  279. }
  280. });
  281. $(instance.customModeInput).on('keypress', function (e) {
  282. if (e.which == 13) {
  283. instance.addDisplayMode();
  284. }
  285. });
  286. if (callback !== null) {
  287. callback();
  288. }
  289. }
  290. addDisplayMode() {
  291. let instance = this;
  292. let DisplayModeName = $(instance.customModeInput).val().toString();
  293. if (DisplayModeName != '') {
  294. let isExists = false;
  295. for (let key in instance.modes) {
  296. let text = instance.modes[key].DisplayModeName.toLowerCase();
  297. if (text == DisplayModeName.toLowerCase()) {
  298. isExists = true;
  299. break;
  300. }
  301. }
  302. if (!isExists) {
  303. let postData = {
  304. DisplayModeId: 0,
  305. DisplayModeName: DisplayModeName,
  306. PrimaryColor: "black",
  307. SecondaryColor: "black",
  308. HighlightColor: "#7b6464",
  309. PrimaryTextColor: "white",
  310. SecondaryTextColor: "black",
  311. };
  312. Unibase.Platform.Layouts.Managers.ThemeLayoutManager.Instance().saveDisplayMode(postData).then(function (response) {
  313. if (response.result != null) {
  314. if (response.status == Unibase.Data.Status.Success) {
  315. MessageHelper.Instance().showSuccess(response.message, '');
  316. instance.appendDisplayMode("", response.result);
  317. $(instance.customModeInput).val('');
  318. $(instance.customModeInputSection).addClass('d-none');
  319. }
  320. }
  321. });
  322. }
  323. }
  324. }
  325. addDefaultDisplayModes() {
  326. const instance = this;
  327. instance.defaultDisplayModes['Default'] = { PrimaryColor: 'rgb(42, 46, 51)', SecondaryColor: 'rgb(232, 252, 253)', HighlightColor: 'rgb(0, 176, 255)', PrimaryTextColor: 'rgb(242, 231, 231)', SecondaryTextColor: '"rgb(15, 15, 15)', TransparentPrimaryColor: 'rgb(42, 46, 51)' };
  328. instance.defaultDisplayModes['Pine Green'] = { PrimaryColor: 'rgb(0, 109, 119)', SecondaryColor: 'rgb(131, 197, 190)', HighlightColor: 'rgb(2, 82, 89)', PrimaryTextColor: 'rgb(255, 255, 255)', SecondaryTextColor: 'rgb(0, 0, 0)', TransparentPrimaryColor: 'rgb(0, 109, 119)' };
  329. instance.defaultDisplayModes['Blue'] = { PrimaryColor: 'rgb(55, 80, 217)', SecondaryColor: 'rgb(232, 252, 253)', HighlightColor: 'rgb(26, 43, 130)', PrimaryTextColor: 'rgb(255, 255, 255)', SecondaryTextColor: 'rgb(0, 0, 0)', TransparentPrimaryColor: 'rgb(55, 80, 217)' };
  330. instance.defaultDisplayModes['Dark Grey'] = { PrimaryColor: 'rgb(25, 63, 100)', SecondaryColor: 'rgb(232, 252, 253)', HighlightColor: 'rgb(11, 41, 70)', PrimaryTextColor: 'rgb(255, 255, 255)', SecondaryTextColor: 'rgb(0, 0, 0)', TransparentPrimaryColor: 'rgb(25, 63, 100)' };
  331. instance.defaultDisplayModes['Light Blue'] = { PrimaryColor: 'rgb(47, 114, 190)', SecondaryColor: 'rgb(195, 233, 248)', HighlightColor: 'rgb(25, 88, 159)', PrimaryTextColor: 'rgb(255, 255, 255)', SecondaryTextColor: 'rgb(0, 0, 0)', TransparentPrimaryColor: 'rgb(47, 114, 190)' };
  332. instance.defaultDisplayModes['Pink'] = { PrimaryColor: 'rgb(243, 39, 110)', SecondaryColor: 'rgb(246, 248, 249)', HighlightColor: 'rgb(206, 16, 82)', PrimaryTextColor: 'rgb(255, 255, 255)', SecondaryTextColor: 'rgb(0, 0, 0)', TransparentPrimaryColor: 'rgb(0, 0, 0)' };
  333. }
  334. resetDisplayMode() {
  335. const instance = this;
  336. const displayModeName = $('#dipsplay-modes-section .mode-btn.active').attr('data-name');
  337. const displayModeSettings = instance.defaultDisplayModes[displayModeName];
  338. for (const property in displayModeSettings) {
  339. $(`#color-picker-${property}`).val(displayModeSettings[property]);
  340. const elem = $(`#color-picker-${property}`);
  341. elem.spectrum("set", displayModeSettings[property]).trigger('change');
  342. }
  343. MessageHelper.Instance().showSuccess('Display Mode reset successful.', '');
  344. $(`#displayModeResetBtn`).blur();
  345. }
  346. enableColorPicker() {
  347. let instance = this;
  348. $('.color-pickr-container').each((index, picker) => {
  349. let colorType = $(picker).attr('data-name');
  350. let activeColor = instance.modes[instance.activeMode][colorType];
  351. let element = $(`.color-pickr-container[data-name="${colorType}"] #color-picker-${colorType}`);
  352. if ($(`.sp-container.${colorType}`).length) {
  353. if (activeColor == 'none' || activeColor == '')
  354. activeColor = 'black';
  355. element.val(activeColor).trigger('change');
  356. return;
  357. }
  358. element.spectrum({
  359. color: activeColor,
  360. type: "color",
  361. showInput: true,
  362. maxSelectionSize: 1,
  363. showInitial: true,
  364. allowEmpty: false,
  365. showAlpha: true,
  366. disabled: false,
  367. localStorageKey: false,
  368. showPaletteOnly: false,
  369. togglePaletteOnly: false,
  370. clickoutFiresChange: true,
  371. containerClassName: colorType,
  372. replacerClassName: colorType,
  373. showPalette: true,
  374. palette: [
  375. ["#000", "#444", "#666", "#999", "#ccc", "#eee", "#f3f3f3", "#fff"],
  376. ["#f00", "#f90", "#ff0", "#0f0", "#0ff", "#00f", "#90f", "#f0f"],
  377. ["#f4cccc", "#fce5cd", "#fff2cc", "#d9ead3", "#d0e0e3", "#cfe2f3", "#d9d2e9", "#ead1dc"],
  378. ["#ea9999", "#f9cb9c", "#ffe599", "#b6d7a8", "#a2c4c9", "#9fc5e8", "#b4a7d6", "#d5a6bd"],
  379. ["#e06666", "#f6b26b", "#ffd966", "#93c47d", "#76a5af", "#6fa8dc", "#8e7cc3", "#c27ba0"],
  380. ["#c00", "#e69138", "#f1c232", "#6aa84f", "#45818e", "#3d85c6", "#674ea7", "#a64d79"],
  381. ["#900", "#b45f06", "#bf9000", "#38761d", "#134f5c", "#0b5394", "#351c75", "#741b47"],
  382. ["#600", "#783f04", "#7f6000", "#274e13", "#0c343d", "#073763", "#20124d", "#4c1130"]
  383. ],
  384. showSelectionPalette: true,
  385. selectionPalette: ["red", "green", "blue"],
  386. locale: 'fr',
  387. togglePaletteMoreText: 'More',
  388. togglePaletteLessText: 'Less',
  389. clearText: "",
  390. noColorSelectedText: "",
  391. showButtons: true,
  392. chooseText: "Choose",
  393. cancelText: "Cancel",
  394. move: function (color) {
  395. let convertedColor = color.toRgbString();
  396. instance.modes[instance.activeMode][colorType] = convertedColor;
  397. let colorList = convertedColor.match(/\((.*?)\)/)[1].split(',');
  398. let opacity = 0;
  399. let opacityElement = $(`.sp-container.${colorType} .sp-picker-container .sp-input-container input.opacity`);
  400. if (colorList.length > 3) {
  401. opacity = Number(colorList[3]) * 100;
  402. opacityElement.val(opacity.toFixed(2) + " %");
  403. opacityElement.removeClass('d-none');
  404. }
  405. else {
  406. opacityElement.addClass('d-none');
  407. }
  408. if (instance.isModeButtonClicked == false)
  409. instance.appendOrRemoveCss(instance.modes[instance.activeMode]);
  410. },
  411. hide: function (color) {
  412. $(this).trigger('change');
  413. }
  414. });
  415. let colorPickerContainer = $(`.sp-container.${colorType} .sp-picker-container .sp-input-container`);
  416. colorPickerContainer.addClass('d-flex').append(`<input type="text" class="opacity" title="Opacity" value="0%" disabled/>`);
  417. colorPickerContainer.find('.sp-input').trigger('change');
  418. });
  419. instance.isModeButtonClicked = false;
  420. }
  421. enableButtonModeClick() {
  422. $('body style.colorClasses').remove();
  423. let instance = this;
  424. $(instance.buttonMode).unbind('click');
  425. $(instance.buttonMode).click(function () {
  426. $(instance.buttonMode).removeClass('active');
  427. $(this).addClass('active');
  428. let modeName = $(this).attr('data-class');
  429. if (modeName == 'custom') {
  430. instance.unhideDisplayModes();
  431. }
  432. else {
  433. }
  434. instance.activeMode = $(this).find('.btn-text').html();
  435. instance.activeDisplayModeId = Number($(this).attr('data-id'));
  436. instance.isModeButtonClicked = true;
  437. instance.appendOrRemoveCss(instance.modes[instance.activeMode]);
  438. instance.enableColorPicker();
  439. let paletteId = instance.modes[instance.activeMode].PaletteId;
  440. if (paletteId === 0) {
  441. paletteId = '';
  442. }
  443. $('#palettesSelect').val(paletteId).trigger('change');
  444. if (instance.defaultDisplayModes[instance.activeMode]) {
  445. $('#displayModeResetBtn').removeClass('d-none');
  446. }
  447. else {
  448. $('#displayModeResetBtn').addClass('d-none');
  449. }
  450. });
  451. }
  452. appendBackgroundImages(backgroundImages) {
  453. let instance = this;
  454. let backGroundImagescrollBar = `#background-image-view .dropdown-menu-scrollbar`;
  455. backgroundImages.forEach((backgroundImage) => {
  456. let IsDefaultClass = backgroundImage.IsDefault ? 'default' : '';
  457. $(".layout-builder #background-image-view .row").append(`<a href="javascript:;" class="col-6 p-relative px-1 ${IsDefaultClass}" data-url="${backgroundImage.Thumbnail}" data-id="${backgroundImage.BackgroundImageId}">
  458. <div class="p-relative">
  459. <img src="${backgroundImage.Thumbnail}" class="rounded w-100" data-dynamic="1" onerror = "ReloadImage(event)" />
  460. <div class="delete" data-id="${backgroundImage.BackgroundImageId}">
  461. <i class="fa fa-trash"></i>
  462. </div>
  463. </div>
  464. <i class="zmdi zmdi-check"></i>
  465. </a>`);
  466. $(backGroundImagescrollBar).animate({ scrollTop: $(backGroundImagescrollBar).prop("scrollHeight") });
  467. $(`${instance.backgroundImageElement}[data-id="${backgroundImage.BackgroundImageId}"]`).click(function (e) {
  468. if ($(this).hasClass('active')) {
  469. $(this).removeClass('active');
  470. $($(instance.backgroundImageSimplebar)[0]).css('background-image', '').removeClass('background-image');
  471. instance.Thumbnail = "";
  472. instance.BackgroundImageId = 0;
  473. instance.unhideDisplayModes();
  474. instance.appendOrRemoveCss(instance.modes[instance.activeMode]);
  475. }
  476. else {
  477. $(instance.backgroundImageElement).removeClass('active');
  478. $(this).addClass('active');
  479. let img = $(this).find('img').attr('src');
  480. instance.Thumbnail = $(this).attr('data-url');
  481. instance.BackgroundImageId = Number($(this).attr('data-id'));
  482. if (img.includes('tenants\\default\\layoutbuilder\\backgroundimages')) {
  483. let imageUrl = `'${img.replace(/\\/g, "/")}'`;
  484. instance.applyBackgroundImage(imageUrl);
  485. }
  486. else {
  487. instance.applyBackgroundImage(img);
  488. }
  489. }
  490. });
  491. $(`${instance.backgroundImageElement}[data-id="${backgroundImage.BackgroundImageId}"] .delete`).click(function (e) {
  492. e.stopPropagation();
  493. let imageId = Number($(this).attr('data-id'));
  494. let postData = { BackgroundImageId: imageId };
  495. Unibase.Platform.Layouts.Managers.ThemeLayoutManager.Instance().deleteBackgroundImage(postData).then(function (response) {
  496. if (response.status == Unibase.Data.Status.Success)
  497. $(`${instance.backgroundImageElement}[data-id="${imageId}"]`).remove();
  498. });
  499. });
  500. if (backgroundImage.Thumbnail == instance.Thumbnail)
  501. $(`${instance.backgroundImageElement}[data-id="${backgroundImage.BackgroundImageId}"]`).addClass('active');
  502. });
  503. }
  504. appendOrRemoveCss(defaultColors) {
  505. let instance = this;
  506. if (instance.Thumbnail != "") {
  507. instance.unhideTransperentPrimaryTab();
  508. }
  509. else {
  510. instance.hideTransperentPrimaryTab();
  511. }
  512. let colors = Object.create(defaultColors);
  513. $('body style#layoutBuilderColorStyles').remove();
  514. let layoutBuilderColors = `<style id="layoutBuilderColorStyles">
  515. /* First Left Layout Start */
  516. .layout-builder-dashboard .biz-wrapper.biz__icon__menu .biz-menu.biz-primary-color .biz-submenu {
  517. background: ${colors.PrimaryColor} !important; /* Transperent Color*/
  518. opacity: 0.95;
  519. }
  520. .layout-builder-dashboard .biz-wrapper.biz__icon__menu .biz-menu.biz-primary-color .biz-main-menu,
  521. .layout-builder-dashboard .top-navbar nav.navbar {
  522. background: ${colors.PrimaryColor} !important;
  523. }
  524. @media (max-width: 1199px) {
  525. body.background-image .layout-builder-dashboard .biz-wrapper.biz__icon__menu .biz-menu.biz-primary-color .biz-main-menu,
  526. body.background-image .layout-builder-dashboard .biz-wrapper.biz__icon__menu .biz-menu.biz-primary-color .biz-submenu {
  527. background: ${colors.PrimaryColor} !important;
  528. }
  529. }
  530. .layout-builder-dashboard ._bizgaze_detail_container,
  531. .layout-builder-dashboard .biz-pg-wrapper{
  532. background: ${colors.SecondaryColor} !important;
  533. }
  534. .layout-builder-dashboard .biz-wrapper.biz__icon__menu .biz-menu.biz-primary-text-color .biz-main-menu .menu-content-wrap > .navbar-nav > .nav-item.sunbnav-active > .nav-link .nav-icon-wrap,
  535. .layout-builder-dashboard .biz-wrapper.biz__icon__menu .biz-menu.biz-highlight-color .navbar-nav li.active-item {
  536. background-color: ${colors.HighlightColor} !important;
  537. }
  538. .layout-builder-dashboard .biz-wrapper.biz__icon__menu .biz-menu.biz-primary-text-color .biz-main-menu .menu-content-wrap > .navbar-nav > .nav-item > .nav-link .nav-icon-wrap,
  539. .layout-builder-dashboard .biz-wrapper.biz__icon__menu .biz-menu.biz-primary-text-color .biz-submenu .nav-header span,
  540. .layout-builder-dashboard .biz-wrapper.biz__icon__menu .biz-menu.biz-primary-text-color .biz-submenu .nav-header a,
  541. .layout-builder-dashboard .biz-wrapper.biz__icon__menu .biz-menu.biz-primary-text-color .biz-submenu .nav-options-container ul li a {
  542. color: ${colors.PrimaryTextColor} !important
  543. }
  544. .layout-builder-dashboard .biz-pg-wrapper {
  545. color: ${colors.SecondaryTextColor} !important;
  546. }
  547. /* Second Top Layout Start*/
  548. .layout-builder-dashboard #bizgaze_body .top-navbar.hk-wrapper.hk-horizontal-nav nav.navbar.biz-primary-color,
  549. .layout-builder-dashboard #bizgaze_body .top-navbar.hk-wrapper.hk-horizontal-nav .hk-navbar.biz-primary-color nav.hk-nav .navbar-nav-wrap ul.collapsing,
  550. .layout-builder-dashboard #bizgaze_body .top-navbar.hk-wrapper.hk-horizontal-nav .hk-navbar.biz-primary-color nav.hk-nav .navbar-nav-wrap ul.collapse {
  551. background: ${colors.PrimaryColor} !important;
  552. }
  553. .simplebar-content-wrapper.background-image .layout-builder-dashboard #bizgaze_body .top-navbar.hk-wrapper.hk-horizontal-nav .hk-navbar.biz-primary-color nav.hk-nav .navbar-nav-wrap ul.collapsing,
  554. .simplebar-content-wrapper.background-image .layout-builder-dashboard #bizgaze_body .top-navbar.hk-wrapper.hk-horizontal-nav .hk-navbar.biz-primary-color nav.hk-nav .navbar-nav-wrap ul.collapse {
  555. background: ${colors.TransparentPrimaryColor} !important;
  556. }
  557. .layout-builder-dashboard #bizgaze_body .top-navbar .hk-navbar.biz-primary-text-color .navbar-nav-wrap ul li a,
  558. .layout-builder-dashboard #bizgaze_body .top-navbar .hk-navbar.biz-primary-text-color ul.navbar-nav.hk-navbar-content li.nav-item a.nav-link span {
  559. color: ${colors.PrimaryTextColor} !important
  560. }
  561. /* Third Left Layout Start */
  562. .layout-builder-dashboard #bizgaze_body .top-navbar.hk-wrapper.hk-vertical-nav .hk-navbar.biz-primary-color nav.hk-nav {
  563. background: ${colors.PrimaryColor} !important;
  564. }
  565. /* .simplebar-content-wrapper.background-image .layout-builder-dashboard #bizgaze_body .top-navbar.hk-wrapper.hk-vertical-nav.biz-layout-3-top-navbar-preview .hk-navbar.biz-primary-color nav.hk-nav {
  566. background: ${colors.TransparentPrimaryColor} !important;
  567. } */
  568. .layout-builder-dashboard #bizgaze_body .top-navbar .hk-navbar.biz-primary-text-color .navbar-toggle-btn {
  569. color: ${colors.PrimaryTextColor} !important
  570. }`;
  571. layoutBuilderColors += `
  572. </style>`;
  573. $('body').prepend(layoutBuilderColors);
  574. }
  575. appendDisplayMode(iconClass, displayMode) {
  576. let instance = this;
  577. let DisplayModeName = displayMode.DisplayModeName;
  578. let DisplayModeId = displayMode.DisplayModeId;
  579. let button = "";
  580. if (iconClass != "") {
  581. button = `<button class="btn mode-btn btn-outline btn-wth-icon icon-left mb-15 mr-2 p-relative" data-class="${DisplayModeName}" data-id="${DisplayModeId}"><span><span class="icon-label"><span class="fa ${iconClass}"></span></span><span class="btn-text">${DisplayModeName}</span></span></button>`;
  582. }
  583. else {
  584. button = `<button class="btn mode-btn btn-outline text-dark mb-15 mr-2 p-relative" data-class="custom" data-id="${DisplayModeId}" data-name="${DisplayModeName}"><span class="btn-text">${DisplayModeName}</span><i class="zmdi zmdi-close delete" data-id="${DisplayModeId}" data-name="${DisplayModeName}"></i></button>`;
  585. }
  586. $('#dipsplay-modes-section .buttons-wrap').append(button);
  587. let mode = {
  588. "DisplayModeId": DisplayModeId,
  589. "DisplayModeName": DisplayModeName,
  590. "PrimaryColor": displayMode.PrimaryColor,
  591. "TransparentPrimaryColor": displayMode.TransparentPrimaryColor,
  592. "SecondaryColor": displayMode.SecondaryColor,
  593. "HighlightColor": displayMode.HighlightColor,
  594. "PrimaryTextColor": displayMode.PrimaryTextColor,
  595. "SecondaryTextColor": displayMode.SecondaryTextColor,
  596. "PaletteId": displayMode.PaletteId
  597. };
  598. instance.modes[DisplayModeName] = mode;
  599. instance.enableButtonModeClick();
  600. $(`${instance.buttonMode} .delete[data-id="${DisplayModeId}"]`).click(function (e) {
  601. e.stopPropagation();
  602. let element = $(this);
  603. bootbox.confirm('Are you sure you want to delete?', function (result) {
  604. if (result) {
  605. let displayModeId = Number(element.attr('data-id'));
  606. let DisplayModeName = element.attr('data-name');
  607. if (DisplayModeName == "Default")
  608. return;
  609. let postData = { DisplayModeId: displayModeId };
  610. Unibase.Platform.Layouts.Managers.ThemeLayoutManager.Instance().deleteDisplayMode(postData).then(function (response) {
  611. if (response.status == Unibase.Data.Status.Success) {
  612. delete instance.modes[DisplayModeName];
  613. $(`${instance.buttonMode}[data-id="${displayModeId}"]`).remove();
  614. MessageHelper.Instance().showSuccess(response.message, '');
  615. }
  616. else if (response.status == Unibase.Data.Status.Error) {
  617. MessageHelper.Instance().showError(response.message, 'layoutBuilderErrMsg');
  618. }
  619. });
  620. }
  621. });
  622. });
  623. }
  624. loadColorPalettes() {
  625. const instance = this;
  626. instance.fileCacheHelper.loadJsFile("apps/crm/palettes/managers/palettemanager.js", function () {
  627. const palettemanager = Bizgaze.Apps.Crm.Palettes.Managers.PaletteManager.Instance();
  628. palettemanager.getPallettes().then(function (pallresponse) {
  629. const palettedata = [];
  630. if (pallresponse.result) {
  631. for (const palette of pallresponse.result) {
  632. palettedata.push({ id: palette.paletteid, text: palette.name });
  633. }
  634. }
  635. $("#palettesSelect").select2({
  636. placeholder: 'Select Palette',
  637. data: palettedata,
  638. allowClear: true,
  639. }).on('select2:select select2:clear', function () {
  640. const selectedPalette = +$(this).val();
  641. instance.modes[instance.activeMode].PaletteId = selectedPalette;
  642. });
  643. const paletteId = instance.modes[instance.activeMode].PaletteId;
  644. if (paletteId != 0) {
  645. $('#palettesSelect').val(paletteId).trigger('change');
  646. }
  647. });
  648. });
  649. }
  650. appendLayoutSettings(layoutId) {
  651. const instance = this;
  652. const navParentGroupsArr = ['dashboards', 'apps', 'reports', 'isStructures'];
  653. let layoutNavHtml = '';
  654. navParentGroupsArr.map(navGroup => {
  655. layoutNavHtml += `<li class="nav-group-item">
  656. <div class="enable-settings-control d-flex justify-content-between align-items-center mb-10 pl-0">
  657. <label class="nav-group-label font-weight-500 text-capitalize mb-0" for="${navGroup}SettingsEnableChk" data-group="${navGroup}">${navGroup}</label>
  658. <input type="checkbox" class="nav-settings-input" id="${navGroup}SettingsEnableChk" onchange="Unibase.Platform.Layouts.Components.LayoutBuilder.Instance().toggleLayoutNavSettings('${navGroup}')">
  659. </div>
  660. <div class="group-options-wrap d-none" id="${navGroup}SettingsWrap">
  661. <div class="nav-group-option d-flex justify-content-between mb-10">
  662. <span>Icon</span>
  663. <label class="switch mb-0" for="${navGroup}IconChk"><input id="${navGroup}IconChk" type="checkbox" onchange="Unibase.Platform.Layouts.Components.LayoutBuilder.Instance().onChangeLayoutNavSetting('${navGroup}','icon')"><span></span></label>
  664. </div>
  665. <div class="nav-group-option d-flex justify-content-between mb-10">
  666. <span>Title</span>
  667. <label class="switch mb-0" for="${navGroup}TitleChk"><input id="${navGroup}TitleChk" type="checkbox" onchange="Unibase.Platform.Layouts.Components.LayoutBuilder.Instance().onChangeLayoutNavSetting('${navGroup}','title')"><span></span></label>
  668. </div>
  669. </div>
  670. </li>`;
  671. }).join('');
  672. $('#navParentGroupsList').html(layoutNavHtml).attr('data-layoutid', layoutId);
  673. $('#isStructuresSettingsWrap').siblings('.enable-settings-control').addClass('hidden');
  674. $('#isStructuresSettingsWrap').remove();
  675. let layoutLogoHtml = `<input type="file" class="logo-upload-input mt-15" id="logoUploadInput" accept="image/*" onchange="Unibase.Platform.Layouts.Components.LayoutBuilder.Instance().layoutLogoUpload(event);">
  676. <div id="layoutLogoWrap" class="layout-logo-wrap mt-15 d-none">
  677. <img id="layoutLogoPreview" src="" alt="your image" class="img-fluid layout-logo-preview" data-dynamic="1" onerror="ReloadImage(event)"/>
  678. <a href="javascript:;" class="delete" id="layoutLogoDeleteBtn" onclick="Unibase.Platform.Layouts.Components.LayoutBuilder.Instance().deleteLayoutLogo(${layoutId});">
  679. <i class="fa fa-trash"></i>
  680. </a>
  681. </div>
  682. <div class="logo-override-chk-wrap d-flex justify-content-between mt-15">
  683. <span class="font-weight-500 text-capitalize">Override Company Logo</span>
  684. <label class="switch mb-0" for="logoOverrideChk"><input type="checkbox" class="logo-override-chk" id="logoOverrideChk" onchange="Unibase.Platform.Layouts.Components.LayoutBuilder.Instance().onChangeOverrideLogoSetting()"><span></span></label>
  685. </div>`;
  686. $('#logoSettingsBody').html(layoutLogoHtml).attr('data-layoutid', layoutId);
  687. instance.bindLayoutSettings(layoutId);
  688. }
  689. bindLayoutSettings(layoutId) {
  690. const instance = this;
  691. if (instance.layoutSettings.length != 0) {
  692. let layoutArrIndex = instance.layoutSettings.findIndex(x => x.LayoutId == layoutId);
  693. if (layoutArrIndex != -1) {
  694. const settingValues = JSON.parse(instance.layoutSettings[layoutArrIndex].SettingValue);
  695. $.each(settingValues, function (key, obj) {
  696. let navGroup = key.toString();
  697. if (obj.IsEnabled) {
  698. $(`#${navGroup}SettingsEnableChk`).prop('checked', true);
  699. $(`#${navGroup}SettingsWrap`).removeClass('d-none');
  700. }
  701. if (obj.Icon) {
  702. $(`#${navGroup}IconChk`).prop('checked', true);
  703. }
  704. if (obj.Title) {
  705. $(`#${navGroup}TitleChk`).prop('checked', true);
  706. }
  707. });
  708. let logoImageUrl = instance.layoutSettings[layoutArrIndex].logoImgUrl;
  709. if (logoImageUrl == "") {
  710. const logoData = instance.layoutSettings[layoutArrIndex].LogoData;
  711. if (logoData)
  712. logoImageUrl = `data:image/${logoData.FileType};base64,${logoData.FileData}`;
  713. }
  714. const isOverrideLogo = instance.layoutSettings[layoutArrIndex].IsOverrideLogo;
  715. if (logoImageUrl) {
  716. $('#layoutLogoPreview').attr('src', logoImageUrl).parent().removeClass('d-none');
  717. $('#logoOverrideChk').prop({ 'disabled': false, 'checked': isOverrideLogo });
  718. }
  719. else {
  720. $('#logoOverrideChk').prop('disabled', true);
  721. }
  722. }
  723. else {
  724. $(`#navParentGroupsList`).find('.nav-settings-input').prop('checked', true).trigger('change');
  725. instance.isLayoutSettingsModified = false;
  726. }
  727. }
  728. else {
  729. $(`#navParentGroupsList`).find('.nav-settings-input').not('#isStructuresSettingsEnableChk').prop('checked', true).trigger('change');
  730. instance.isLayoutSettingsModified = false;
  731. }
  732. }
  733. toggleLayoutNavSettings(navGroup) {
  734. const instance = this;
  735. instance.isLayoutSettingsModified = true;
  736. if ($(`#${navGroup}SettingsEnableChk`).is(':checked')) {
  737. $(`#${navGroup}SettingsWrap`).removeClass('d-none');
  738. $(`#${navGroup}SettingsWrap`).find('input:checkbox').prop('checked', true);
  739. }
  740. else {
  741. $(`#${navGroup}SettingsWrap`).addClass('d-none');
  742. $(`#${navGroup}SettingsWrap`).find('input:checkbox').prop('checked', false);
  743. }
  744. }
  745. onChangeLayoutNavSetting(navGroup, setting) {
  746. const instance = this;
  747. instance.isLayoutSettingsModified = true;
  748. let isAllSettingsChecked = false;
  749. $(`#${navGroup}SettingsWrap input:checkbox`).each(function (i, e) {
  750. if ($(e).is(':checked')) {
  751. isAllSettingsChecked = true;
  752. }
  753. });
  754. if (isAllSettingsChecked) {
  755. $(`#${navGroup}SettingsEnableChk`).prop('checked', true);
  756. }
  757. }
  758. getLayoutSettings() {
  759. const instance = this;
  760. let layoutSettingObj = {};
  761. const selectedLayoutId = Number($('#navParentGroupsList').attr('data-layoutid'));
  762. if (!selectedLayoutId) {
  763. return;
  764. }
  765. $('#navParentGroupsList .nav-group-label').each(function (i, e) {
  766. let navGroup = $(e).attr('data-group');
  767. layoutSettingObj[navGroup] = {
  768. IsEnabled: $(`#${navGroup}SettingsEnableChk`).is(':checked'),
  769. Icon: $(`#${navGroup}IconChk`).is(':checked'),
  770. Title: $(`#${navGroup}TitleChk`).is(':checked')
  771. };
  772. });
  773. let layoutsettings = {
  774. LayoutId: selectedLayoutId,
  775. SettingValue: JSON.stringify(layoutSettingObj),
  776. LogoData: instance.logoFileData,
  777. IsOverrideLogo: $('#logoOverrideChk').is(':checked')
  778. };
  779. let layoutArrIndex = instance.layoutSettings.findIndex(x => x.LayoutId == selectedLayoutId);
  780. if (layoutArrIndex != -1) {
  781. instance.layoutSettings[layoutArrIndex].SettingValue = layoutsettings.SettingValue;
  782. instance.layoutSettings[layoutArrIndex].LogoData = layoutsettings.LogoData;
  783. instance.layoutSettings[layoutArrIndex].IsOverrideLogo = layoutsettings.IsOverrideLogo;
  784. instance.layoutSettings[layoutArrIndex].logoImgUrl = "";
  785. }
  786. else {
  787. instance.layoutSettings.push(layoutsettings);
  788. }
  789. instance.logoFileData = null;
  790. }
  791. layoutLogoUpload(e) {
  792. const instance = this;
  793. const layoutId = Number($('#logoSettingsBody').attr('data-layoutid'));
  794. const inputEl = document.getElementById('logoUploadInput');
  795. const fileType = inputEl.files[0].type.split('/').pop().toLowerCase();
  796. if (fileType != "jpeg" && fileType != "jpg" && fileType != "png" && fileType != "bmp" && fileType != "gif") {
  797. MessageHelper.Instance().showError('Please select a valid image file', 'layoutBuilderErrMsg');
  798. $("#logoUploadInput").val('');
  799. return false;
  800. }
  801. else {
  802. const [file] = inputEl.files;
  803. if (file) {
  804. const reader = new FileReader();
  805. reader.onload = function () {
  806. $('#layoutLogoPreview').attr('src', `${reader.result}`).parent().removeClass('d-none');
  807. };
  808. if (file) {
  809. reader.readAsDataURL(file);
  810. }
  811. Unibase.Platform.Helpers.FileHelper.Instance().getBase64(e).then(function (response) {
  812. instance.logoFileData = response;
  813. let layoutArrIndex = instance.layoutSettings.findIndex(x => x.LayoutId == layoutId);
  814. if (layoutArrIndex != -1) {
  815. instance.layoutSettings[layoutArrIndex].LogoData = instance.logoFileData;
  816. instance.layoutSettings[layoutArrIndex].isLogoDelete = false;
  817. }
  818. });
  819. $('#logoOverrideChk').prop('disabled', false);
  820. instance.isLayoutSettingsModified = true;
  821. }
  822. }
  823. }
  824. onChangeOverrideLogoSetting() {
  825. const instance = this;
  826. instance.isLayoutSettingsModified = true;
  827. }
  828. deleteLayoutLogo(layoutId) {
  829. const instance = this;
  830. $('#layoutLogoPreview').attr('src', '').parent().addClass('d-none');
  831. $('#logoOverrideChk').prop('checked', false).attr("disabled", 'true');
  832. let layoutArrIndex = instance.layoutSettings.findIndex(x => x.LayoutId == layoutId);
  833. if (layoutArrIndex != -1) {
  834. instance.layoutSettings[layoutArrIndex].isLogoDelete = true;
  835. }
  836. instance.isLayoutSettingsModified = true;
  837. }
  838. saveTheme() {
  839. let instance = this;
  840. let modes = [];
  841. for (let key in this.modes) {
  842. let displayMode = this.modes[key];
  843. let mode = {
  844. DisplayModeId: displayMode["DisplayModeId"],
  845. DisplayModeName: displayMode.DisplayModeName,
  846. PrimaryColor: displayMode["PrimaryColor"],
  847. TransparentPrimaryColor: displayMode["TransparentPrimaryColor"],
  848. SecondaryColor: displayMode["SecondaryColor"],
  849. HighlightColor: displayMode["HighlightColor"],
  850. PrimaryTextColor: displayMode["PrimaryTextColor"],
  851. SecondaryTextColor: displayMode["SecondaryTextColor"],
  852. PaletteId: displayMode["PaletteId"],
  853. };
  854. modes.push(mode);
  855. }
  856. this.instance.getLayoutSettings();
  857. let postData = {
  858. ThemeId: this.ThemeId,
  859. LayoutId: this.LayoutId,
  860. DetailsViewId: this.viewId,
  861. DisplayModeId: this.activeDisplayModeId,
  862. BackgroundImageId: this.BackgroundImageId,
  863. DisplayModes: modes,
  864. LayoutSettings: this.layoutSettings,
  865. isStructEnable: $('.isStructSettingsEnableChk').prop("checked")
  866. };
  867. Unibase.Platform.Layouts.Managers.ThemeLayoutManager.Instance().saveTheme(postData).then(function (response) {
  868. if (response.status == Unibase.Data.Status.Success) {
  869. MessageHelper.Instance().showSuccess(response.message, '');
  870. instance.refrshLayout(response);
  871. }
  872. });
  873. }
  874. refrshLayout(response) {
  875. let result = response.result;
  876. var themeobj = Unibase.Platform.Membership.Infos.Identity.getCurrentUser().settings.find(x => x.settingName == "themeobj").settingValue;
  877. let layoutSettingsObj = {
  878. settingValue: result.LayoutSettings,
  879. isOverrideLogo: result.IsOverrideLogo,
  880. logoImageUrl: result.LogoImageUrl
  881. };
  882. var isAppStructureEnable = Unibase.Themes.Compact.Components.Index.Instance().isAppStructureEnable;
  883. if (result.IsStructEnable != undefined) {
  884. isAppStructureEnable = result.IsStructEnable;
  885. }
  886. if (themeobj != null && themeobj != "" && themeobj != undefined) {
  887. let resultObj = {
  888. layoutId: result.LayoutId,
  889. layoutIndex: result.LayoutIndex,
  890. layoutName: result.LayoutName,
  891. layoutHtmlPath: result.LayoutHtmlPath,
  892. detailsViewId: result.DetailsViewId,
  893. detailsViewIndex: result.DetailsViewIndex,
  894. thumbnail: result.Thumbnail,
  895. primaryColor: result.PrimaryColor,
  896. secondaryColor: result.SecondaryColor,
  897. highlightColor: result.HighlightColor,
  898. primaryTextColor: result.PrimaryTextColor,
  899. secondaryTextColor: result.SecondaryTextColor,
  900. transparentPrimaryColor: result.TransparentPrimaryColor,
  901. displayModeId: result.DisplayModeId,
  902. backgroundImageId: result.BackgroundImageId,
  903. themeId: result.ThemeId,
  904. layoutSettings: layoutSettingsObj,
  905. isstructenable: isAppStructureEnable,
  906. paletteId: result.PaletteId
  907. };
  908. var newobj = Unibase.Platform.Membership.Infos.Identity.getCurrentUser();
  909. newobj.settings.find(x => x.settingName == "themeobj").settingValue = resultObj;
  910. Unibase.Platform.Membership.Infos.Identity.setCurrentUser(newobj);
  911. if (isMobileApp()) {
  912. Unibase.Platform.Helpers.MobileHelper.Instance().redirectToLogin();
  913. }
  914. else {
  915. window.location.href = '#/welcome';
  916. window.location.reload();
  917. }
  918. }
  919. }
  920. applyBackgroundImage(imageURL) {
  921. let instance = this;
  922. instance.appendOrRemoveCss(instance.modes[instance.activeMode]);
  923. $($(instance.backgroundImageSimplebar)[0]).css('background-image', 'url(' + imageURL + ')').addClass('background-image');
  924. }
  925. imageUploadEffect(imageFile) {
  926. let instance = this;
  927. $('.layout-builder .background-change .progress-wrap').removeClass('d-none');
  928. $('.layout-builder .background-change .progress-wrap').addClass('d-flex');
  929. let i = 0;
  930. let isUploadCompleted = false;
  931. let uploadTimer = setInterval(() => {
  932. if (isUploadCompleted == true) {
  933. clearInterval(uploadTimer);
  934. $('.layout-builder .background-change .progress-wrap .progress .progress-bar').width(0 + '%');
  935. $('.layout-builder .background-change .progress-wrap .progress-text').html(0 + '%');
  936. $('.layout-builder .background-change .progress-wrap').removeClass('d-flex');
  937. $('.layout-builder .background-change .progress-wrap').addClass('d-none');
  938. }
  939. else {
  940. $('.layout-builder .background-change .progress-wrap .progress .progress-bar').width(i + '%');
  941. $('.layout-builder .background-change .progress-wrap .progress-text').html(i + '%');
  942. if (i < 99)
  943. i++;
  944. }
  945. }, 100);
  946. let postData = { BackgroundImageId: 0, FileData: imageFile };
  947. Unibase.Platform.Layouts.Managers.ThemeLayoutManager.Instance().saveBackgroundImage(postData).then(function (response) {
  948. if (response.status == Unibase.Data.Status.Success && response.result != null) {
  949. isUploadCompleted = true;
  950. let imageItem = response.result;
  951. instance.Thumbnail = imageItem.Thumbnail;
  952. instance.BackgroundImageId = imageItem.BackgroundImageId;
  953. $(`${instance.backgroundImageElement}`).removeClass('active');
  954. instance.appendBackgroundImages([imageItem]);
  955. Unibase.Themes.Compact.Components.Index.Instance().getImageUrl(instance.Thumbnail).then(function (imageUrl) {
  956. instance.applyBackgroundImage(imageUrl);
  957. });
  958. }
  959. });
  960. }
  961. hideTransperentPrimaryTab() {
  962. $(".background-colors ul.nav-tabs li[title='Transparent Primary']").addClass('d-none');
  963. }
  964. unhideTransperentPrimaryTab() {
  965. $(".background-colors ul.nav-tabs li[title='Transparent Primary']").removeClass('d-none');
  966. }
  967. hideDisplayModes() {
  968. $(".layout-builder .drawer-body .background-colors").addClass('d-none');
  969. $(".layout-builder .drawer-body .text-colors").addClass('d-none');
  970. }
  971. unhideDisplayModes() {
  972. $(".layout-builder .drawer-body .background-colors").removeClass('d-none');
  973. $(".layout-builder .drawer-body .text-colors").removeClass('d-none');
  974. }
  975. addScrollOnDrag(el) {
  976. let x = 0, y = 0, top = 0, left = 0;
  977. let draggingFunction = (e) => {
  978. document.addEventListener('mouseup', () => {
  979. document.removeEventListener("mousemove", draggingFunction);
  980. });
  981. el.scrollLeft = left - e.pageX + x;
  982. el.scrollTop = top - e.pageY + y;
  983. el.style.cursor = 'grab';
  984. el.style.removeProperty('user-select');
  985. };
  986. el.addEventListener('mousedown', (e) => {
  987. e.preventDefault();
  988. el.style.cursor = 'grabbing';
  989. el.style.userSelect = 'none';
  990. y = e.pageY;
  991. x = e.pageX;
  992. top = el.scrollTop;
  993. left = el.scrollLeft;
  994. document.addEventListener('mousemove', draggingFunction);
  995. });
  996. }
  997. loadBuilder(formId, installedAppId, appConfigurationId) {
  998. var formbuilderinstance = LayoutBuilder.Instance();
  999. formbuilderinstance.init();
  1000. }
  1001. init() {
  1002. var instance = this;
  1003. instance.render();
  1004. }
  1005. render() {
  1006. var layoutBuilder = Unibase.Platform.Layouts.Components.LayoutBuilder.Instance();
  1007. this.navigationHelper.popup(0, '', layoutBuilder, function (containerid) {
  1008. }, Platform.Helpers.Size.ExtraLarge);
  1009. }
  1010. static Instance() {
  1011. if (this.instance === undefined) {
  1012. this.instance = new LayoutBuilder();
  1013. }
  1014. return this.instance;
  1015. }
  1016. }
  1017. Components.LayoutBuilder = LayoutBuilder;
  1018. })(Components = Layouts.Components || (Layouts.Components = {}));
  1019. })(Layouts = Platform.Layouts || (Platform.Layouts = {}));
  1020. })(Platform = Unibase.Platform || (Unibase.Platform = {}));
  1021. })(Unibase || (Unibase = {}));