Built files from Bizgaze WebServer
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

index.themes.builder.js 112KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678
  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 = {}));
  1022. var Unibase;
  1023. (function (Unibase) {
  1024. let Platform;
  1025. (function (Platform) {
  1026. let Layouts;
  1027. (function (Layouts) {
  1028. let Components;
  1029. (function (Components) {
  1030. class LayoutBuilder_Template {
  1031. loadTemplate() {
  1032. let instance = this;
  1033. let html = `
  1034. <div class="biz-wrapper biz-wrapper2 layout-builder d-none drawer-small drawer-right biz-drawer-push biz-drawer-pushright ">
  1035. <!-- Drawer Push -->
  1036. <div id="drawer_push" class="biz-drawer drawer-wthout-footer drawer-small drawer-right biz-drawer-toggle">
  1037. <div class="drawer-header">
  1038. <div class="drawer-text"> Settings </div>
  1039. <button type="button" class="drawer-close close">
  1040. <span aria-hidden="true">&times;</span>
  1041. </button>
  1042. </div>
  1043. <div class="drawer-body">
  1044. <div data-simplebar class="simple-scroll-bar pb-15">
  1045. <div class="drawer-content-wrap">
  1046. <div class="collapse-simple">
  1047. <div class="card dipsplay-modes">
  1048. <div class="card-header">
  1049. <a href="javascript:;" class="no-collapse">Display Modes</a>
  1050. </div>
  1051. <div class="title-devider"></div>
  1052. <div id="dipsplay-modes-section">
  1053. <div class="card-body buttons-wrap">
  1054. </div>
  1055. <div class="custom-mode-section">
  1056. <button class="btn custom-mode-btn btn-outline text-dark btn-wth-icon icon-left mb-15 mr-2 w-100"><span><span class="icon-label"><span class="fa fa-plus"></span></span><span class="btn-text">Custom Mode</span></span></button>
  1057. <div class="custom-mode-input-section d-none">
  1058. <input type="text" class="form-control custom-mode-input shadow-none" placeholder="Enter mode name">
  1059. <a href="javascript:;" class="btn btn-theme px-2 ml-2" type="button" onclick="Unibase.Platform.Layouts.Components.LayoutBuilder.Instance().addDisplayMode()">Add</a>
  1060. </div>
  1061. </div>
  1062. </div>
  1063. </div>
  1064. <div class="card background-colors d-none">
  1065. <div class="card-header d-flex justify-content-between align-items-center">
  1066. <a href="javascript:;" class="no-collapse">Background Colors</a>
  1067. <button class="btn btn-outline-danger btn-xs font-12 display-mode-reset-btn" id="displayModeResetBtn" onclick="Unibase.Platform.Layouts.Components.LayoutBuilder.Instance().resetDisplayMode()" title="Reset Display Mode">Reset</button>
  1068. </div>
  1069. <div class="title-devider"></div>
  1070. <div>
  1071. <div class="color-pickr-container" data-name="PrimaryColor">
  1072. <span>Primary</span>
  1073. <input id="color-picker-PrimaryColor" value='#276cb8' />
  1074. </div>
  1075. <div class="color-pickr-container" data-name="SecondaryColor">
  1076. <span>Secondary</span>
  1077. <input id="color-picker-SecondaryColor" value='#276cb8' />
  1078. </div>
  1079. <div class="color-pickr-container" data-name="HighlightColor">
  1080. <span>Highlight </span>
  1081. <input id="color-picker-HighlightColor" value='' />
  1082. </div>
  1083. <div class="color-pickr-container" data-name="TransparentPrimaryColor">
  1084. <span>Transparent</span>
  1085. <input id="color-picker-TransparentPrimaryColor" value='' />
  1086. </div>
  1087. </div>
  1088. </div>
  1089. <div class="card text-colors d-none">
  1090. <div class="card-header">
  1091. <a href="javascript:;" class="no-collapse">Text Colors</a>
  1092. </div>
  1093. <div class="title-devider"></div>
  1094. <div>
  1095. <div class="color-pickr-container" data-name="PrimaryTextColor">
  1096. <span>Primary</span>
  1097. <input id="color-picker-PrimaryTextColor" value='' />
  1098. </div>
  1099. <div class="color-pickr-container" data-name="SecondaryTextColor">
  1100. <span>Secondary</span>
  1101. <input id="color-picker-SecondaryTextColor" value='' />
  1102. </div>
  1103. </div>
  1104. </div>
  1105. <div class="card color-palettes">
  1106. <div class="card-header">
  1107. <a href="javascript:;" class="no-collapse">Palettes</a>
  1108. </div>
  1109. <div class="title-devider"></div>
  1110. <div>
  1111. <select class="form-control" id="palettesSelect"><option></option></select>
  1112. </div>
  1113. </div>
  1114. <div class="card logo-settings">
  1115. <div class="card-header">
  1116. <a href="javascript:;" class="no-collapse">Logo Settings</a>
  1117. </div>
  1118. <div class="title-devider"></div>
  1119. <div class="card-body logo-setting-body pa-0" id="logoSettingsBody">
  1120. </div>
  1121. </div>
  1122. <div class="card collapse-simple toggle-nav-parent-group-options pb-0">
  1123. <div class="card-header">
  1124. <a role="button" data-toggle="collapse" href="#layoutSettings" aria-expanded="true">Layout Nav Settings</a>
  1125. </div>
  1126. <div class="title-devider"></div>
  1127. <div class="collapse show" id="layoutSettings">
  1128. <ul class="nav-parent-groups-list" id="navParentGroupsList">
  1129. </ul>
  1130. </div>
  1131. </div>
  1132. </div>
  1133. </div>
  1134. </div>
  1135. </div>
  1136. </div>
  1137. <!-- /Drawer Push -->
  1138. <!-- Main Content -->
  1139. <div class="biz-pg-wrapper py-0 layout-builder">
  1140. <div class="biz-pg-body">
  1141. <div class="biz-bldr-wrap bldr__aside__left form-bldr-wrap">
  1142. <header class="bldr-head">
  1143. <div class="d-flex align-items-center">
  1144. <a class="btn btn-icon btn-flush-theme mr-1" data-target="#drawer_push" data-drawer="push-normal" href="javascript:;"><span class="btn-icon-wrap"><i class="la la-fill-drip font-25"></i></span></a>Settings
  1145. </div>
  1146. <div class="bldr-options-wrap">
  1147. <a href="javascript:;" class="btn btn-theme px-4" type="button" onclick="Unibase.Platform.Layouts.Components.LayoutBuilder.Instance().saveTheme()">Save</a>
  1148. <a class="btn btn-layout-builder-close btn-outline-danger px-4 ml-3" href="javascript:;" id="">Close</a>
  1149. </div>
  1150. <div class="form-error-message ml-0 l-0" id="layoutBuilderErrMsg"></div>
  1151. </header>
  1152. <div class="bldr-aside-left">
  1153. <ul class="nav nav-light nav-tabs d-none">
  1154. <li class="nav-item">
  1155. <a class="nav-link active" data-toggle="tab" href="#tab_outline">
  1156. <span class="nav-link-text">Components</span>
  1157. </a>
  1158. </li>
  1159. <li class="nav-item">
  1160. <a class="nav-link" data-toggle="tab" href="#tab_column">
  1161. <span class="nav-link-text">Fileld</span>
  1162. </a>
  1163. </li>
  1164. </ul>
  1165. ${instance.getLeftHtml()}
  1166. </div>
  1167. <div class="bldr-body">
  1168. <header class="bldr-sec-head justify-content-center">
  1169. <ul class="nav nav-line nav-tabs nav-light">
  1170. <li class="nav-item">
  1171. <a class="nav-link active" data-toggle="tab" href="#dashboard">
  1172. <span class="nav-link-text">Preview</span>
  1173. </a>
  1174. </li>
  1175. <!-- <li class="nav-item">
  1176. <a class="nav-link" data-toggle="tab" href="#tab_builder">
  1177. <span class="nav-link-text">Code Builder</span>
  1178. </a>
  1179. </li> -->
  1180. </ul>
  1181. <div class="left-aside-togglable"></div>
  1182. <a class="btn btn-icon btn-flush-theme flush-soft-hover active drawer-toggle-link" data-target="#drawer_push" data-drawer="push-normal" href="#"><span class="btn-icon-wrap"><span class="fa fa-cog"></span></span></a>
  1183. </header>
  1184. <div data-simplebar class="simple-scroll-bar custom-scollable-container layoutbuilder-simple-scroll-bar" style="overflow:hidden;">
  1185. <div class="tab-content">
  1186. <div class="tab-pane fade show active layout-builder-dashboard p-relative" id="dashboardpo">
  1187. <div id="bizgaze_body" style="margin-topx: 60px;">
  1188. <div class="biz-wrapper biz__icon__menu biz__fullheight__menu biz__submenu biz__bottom__nav__menu">
  1189. <div class="biz-pg-wrapper SecondaryColor SecondaryTextColor" style="min-height: 937px;margin-right: 0px;position: fixed;top: 0;left: 410px;width: 100%;">
  1190. <!-- Container -->
  1191. <div class="_bizgaze_detail_container col-sm SecondaryColor" id="_modal_bizgaze_edit_1620714971">
  1192. </div>
  1193. </div>
  1194. <!-- /Container -->
  1195. </div>
  1196. </div>
  1197. </div>
  1198. </div>
  1199. </div>
  1200. </div>
  1201. </div>
  1202. </div>
  1203. </div>
  1204. </div>
  1205. `;
  1206. return html;
  1207. }
  1208. getLeftHtml() {
  1209. let html = `<div data-simplebar class="simple-scroll-bar" style="overflow-x: hidden;">
  1210. <div class="tab-content" style="padding-bottom : 5rem;">
  1211. <div class="tab-pane fade show active" id="tab_outline">
  1212. <div class="collapse-simple">
  1213. <div class="card layout pb-0">
  1214. <div class="card-header">
  1215. <a href="javascript:;" class="no-collapse biz-primary-text-color-removed pt-0">Layout</a>
  1216. </div>
  1217. <div class="title-devider biz-border-color"></div>
  1218. <p class="biz-primary-text-color-removed">Choose your preferred layout</p>
  1219. <div id="menu-layouts">
  1220. <div class="card-body pb-0">
  1221. <div class="row layout-row checkbox-container">
  1222. </div>
  1223. </div>
  1224. </div>
  1225. </div>
  1226. <div class="card detail pb-0">
  1227. <div class="card-header">
  1228. <a href="javascript:;" class="no-collapse biz-primary-text-color-removed">Details</a>
  1229. </div>
  1230. <div class="title-devider biz-border-color"></div>
  1231. <p class="biz-primary-text-color-removed">Choose your preferred view</p>
  1232. <div id="detail-list-view">
  1233. <div class="card-body pb-0">
  1234. <div class="row detail-row checkbox-container">
  1235. </div>
  1236. <div class="align-items-center d-flex justify-content-between mb-10 pl-0">
  1237. <span class="text-capitalize mb-0">Enable Structures</span>
  1238. <label class="switch mb-0" for="isStructSettingsEnableChk"><input id="isStructSettingsEnableChk" class="isStructSettingsEnableChk" type="checkbox" ><span></span></label>
  1239. </div>
  1240. </div>
  1241. </div>
  1242. </div>
  1243. <div class="card background-change">
  1244. <div class="card-header">
  1245. <a href="javascript:;" class="no-collapse biz-primary-text-color-removed">Background Image</a>
  1246. </div>
  1247. <div class="title-devider biz-border-color"></div>
  1248. <div id="background-image-view">
  1249. <div class="card-body">
  1250. <div class="row dropdown-menu-scrollbar checkbox-container">
  1251. </div>
  1252. </div>
  1253. </div>
  1254. <div class="card-body thumbnail-input-card p-2 py-3 d-flex flex-column align-items-center font-14 p-relative">
  1255. <input type="file" class="imagepickerThumbnail" id="imagepickerThumbnail" accept="image/*" required>
  1256. <span>Upload from Computer</span>
  1257. <img src="tenants/themes/compact/imgs/cloud.svg" alt="folder icon" class="w-15 h-15">
  1258. <div class="progress-wrap w-100 d-none">
  1259. <div class="progress mt-2">
  1260. <div class="progress-bar" role="progressbar" style="width: 0%" aria-valuenow="75" aria-valuemin="0" aria-valuemax="100"></div>
  1261. </div>
  1262. <h6 class="text-dark progress-text ml-20 font-13">0%</h6>
  1263. </div>
  1264. </div>
  1265. </div>
  1266. </div>
  1267. </div>
  1268. <div class="tab-pane fade" id="tab_column">
  1269. </div>
  1270. </div>
  1271. </div>`;
  1272. return html;
  1273. }
  1274. static Instance() {
  1275. return new LayoutBuilder_Template();
  1276. }
  1277. }
  1278. Components.LayoutBuilder_Template = LayoutBuilder_Template;
  1279. })(Components = Layouts.Components || (Layouts.Components = {}));
  1280. })(Layouts = Platform.Layouts || (Platform.Layouts = {}));
  1281. })(Platform = Unibase.Platform || (Unibase.Platform = {}));
  1282. })(Unibase || (Unibase = {}));
  1283. var Unibase;
  1284. (function (Unibase) {
  1285. let Themes;
  1286. (function (Themes) {
  1287. let Compact;
  1288. (function (Compact) {
  1289. let Components;
  1290. (function (Components) {
  1291. class UserTheme extends Unibase.Platform.Core.BaseComponent {
  1292. constructor() {
  1293. super(...arguments);
  1294. this.layoutElement = '#user-themes #menu-layouts .card-body .row.layout-row a';
  1295. this.detailsViewElement = '#user-themes #detail-list-view .card-body .row.detail-row a';
  1296. this.backgroundImageElement = '#user-themes #background-image-view .card-body .row a';
  1297. this.displayModeElement = '#user-themes #theme-switcher-colors .card-body .row a';
  1298. this.currentUserTheme = {
  1299. LayoutId: 0,
  1300. DetailsViewId: 0,
  1301. DisplayModeId: 0,
  1302. BackgroundImageId: 0,
  1303. ThemeId: 0,
  1304. IsCompanyTheme: false,
  1305. };
  1306. }
  1307. userTheme(isCompany, companyId, roleId, isRole) {
  1308. let instance = this;
  1309. var _fileCacheHelper = Unibase.Platform.Helpers.FileCacheHelper.Instance();
  1310. Unibase.Platform.Helpers.FileCacheHelper.Instance().loadCssFiles(['platform/layout/components/layoutbuilder/style.layoutbuilder.css'], function () {
  1311. if (companyId == undefined || companyId == "" || companyId == null) {
  1312. companyId = 0;
  1313. }
  1314. if (roleId == undefined || roleId == "" || roleId == null) {
  1315. roleId = 0;
  1316. }
  1317. Unibase.Platform.Layouts.Managers.ThemeLayoutManager.Instance().getLayoutBuilderInfo(companyId, roleId).then(function (response) {
  1318. $(".biz-wrapper").addClass("biz-settings-toggle");
  1319. $(".hk-wrapper").addClass("biz-settings-toggle");
  1320. / Plain Html /;
  1321. let leftHtml = Unibase.Platform.Layouts.Components.LayoutBuilder_Template.Instance().getLeftHtml();
  1322. let onclick = "Unibase.Themes.Compact.Components.UserTheme.Instance().saveUserTheme()";
  1323. if (isCompany || isRole) {
  1324. onclick = "Unibase.Themes.Compact.Components.UserTheme.Instance().saveCompanyTheme()";
  1325. }
  1326. let html = `
  1327. <div class="user-themes" id="user-themes">
  1328. <div class="user-themes-header"></div>
  1329. <div class="user-themes-body">
  1330. ${leftHtml}
  1331. </div>
  1332. <div class="user-themes-footer">
  1333. <a href="javascript:;" class="btn btn-theme px-4 w-100" type="button" onclick="` + onclick + `">Apply</a>
  1334. </div>
  1335. </div>`;
  1336. $("#settings-panel-body").html(html);
  1337. $("#settings-panel-head-title").html("Themes");
  1338. let themeSwitchHtml = ` <div class="card theme-switcher">
  1339. <div class="card-header">
  1340. <a href="javascript:;" class="no-collapse biz-primary-text-color-removed" > Theme Switcher </a>
  1341. </div>
  1342. <div class="title-devider biz-border-color-removed"> </div>
  1343. <div id="theme-switcher-colors">
  1344. <div class="card-body pb-0" >
  1345. <div class="row dropdown-menu-scrollbar checkbox-container">
  1346. </div>
  1347. </div>
  1348. </div>
  1349. </div>`;
  1350. $("#user-themes .background-change").before(themeSwitchHtml);
  1351. response.result.LayoutInfo.forEach((layout) => {
  1352. let curLayout = layout;
  1353. let layoutId = curLayout.LayoutId;
  1354. curLayout.Thumbnail = curLayout.Thumbnail.replace(".png", ".svg");
  1355. $("#user-themes #menu-layouts .layout-row").append(`<a href="javascript:;" class="col-6 p-0 pr-2 p-relative" data-id="${layoutId}" data-index="${curLayout.LayoutIndex}">
  1356. <img src="${curLayout.Thumbnail}" class="rounded w-100 h-100" data-dynamic="1" onerror="ReloadImage(event)" title="${curLayout.LayoutName}" />
  1357. <i class="zmdi zmdi-check"></i>
  1358. </a>`);
  1359. });
  1360. $(instance.layoutElement).click(function () {
  1361. $(instance.layoutElement).removeClass('active');
  1362. $(this).addClass('active');
  1363. let id = Number($(this).attr('data-id'));
  1364. instance.currentUserTheme.LayoutId = id;
  1365. });
  1366. response.result.DetailViewInfo.forEach((viewLayout) => {
  1367. if (viewLayout.DetailsViewName != "Popup") {
  1368. let id = viewLayout.DetailsViewId;
  1369. $("#user-themes #detail-list-view .detail-row").append(`<a href="javascript:;" class="col-6 p-0 mb-2 pr-2 p-relative" data-id="${id}">
  1370. <img src="${viewLayout.Thumbnail}" class="rounded w-100 h-100" data-dynamic="1" onerror="ReloadImage(event)" title="${viewLayout.DetailsViewName}" />
  1371. <i class="zmdi zmdi-check"></i>
  1372. </a>`);
  1373. }
  1374. });
  1375. $('.isStructSettingsEnableChk').parent().siblings().remove();
  1376. $('[for="isStructSettingsEnableChk"]').remove();
  1377. $(instance.detailsViewElement).click(function () {
  1378. $(instance.detailsViewElement).removeClass('active');
  1379. $(this).addClass('active');
  1380. let id = Number($(this).attr('data-id'));
  1381. instance.currentUserTheme.DetailsViewId = id;
  1382. });
  1383. response.result.DisplayModesInfo.forEach((displayMode) => {
  1384. $("#user-themes #theme-switcher-colors .row").append(`<a href="javascript:;" class="p-relative mr-2 mb-2" data-id="${displayMode.DisplayModeId}" title="${displayMode.DisplayModeName}">
  1385. <div class="p-relative color-box border biz-border-color-removed" style="background-color:${displayMode.PrimaryColor}">
  1386. </div>
  1387. <i class="zmdi zmdi-check"></i>
  1388. </a>`);
  1389. });
  1390. $(instance.displayModeElement).click(function () {
  1391. $(instance.displayModeElement).removeClass('active');
  1392. $(this).addClass('active');
  1393. $(`${instance.backgroundImageElement}.solid-color .color-box`).css("background-color", $(this).find('.color-box').css("background-color"));
  1394. $(`${instance.backgroundImageElement}.solid-color color-box`).addClass('active');
  1395. let id = Number($(this).attr('data-id'));
  1396. instance.currentUserTheme.DisplayModeId = id;
  1397. });
  1398. let solidColorImage = `<a href="javascript:;" class="col-4 p-relative px-1 solid-color active" data-id="0">
  1399. <div class="p-relative color-box border biz-border-color-removed" style="height:65px">
  1400. </div>
  1401. <i class="zmdi zmdi-check"></i>
  1402. </a>`;
  1403. $("#user-themes #background-image-view .row").append(solidColorImage);
  1404. response.result.BackgroundImages.forEach((backgroundImage) => {
  1405. let IsDefaultClass = backgroundImage.IsDefault ? 'default' : '';
  1406. $("#user-themes #background-image-view .row").append(`<a href="javascript:;" class="col-4 p-relative px-1 ${IsDefaultClass}" data-url="${backgroundImage.Thumbnail}" data-id="${backgroundImage.BackgroundImageId}">
  1407. <div class="p-relative">
  1408. <img src="${backgroundImage.Thumbnail}" class="rounded w-100" data-dynamic="1" onerror = "ReloadImage(event)" />
  1409. <div class="delete" data-id="${backgroundImage.BackgroundImageId}">
  1410. <i class="fa fa-trash"></i>
  1411. </div>
  1412. </div>
  1413. <i class="zmdi zmdi-check"></i>
  1414. </a>`);
  1415. });
  1416. $(instance.backgroundImageElement).click(function () {
  1417. $(instance.backgroundImageElement).removeClass('active');
  1418. $(this).addClass('active');
  1419. instance.currentUserTheme.BackgroundImageId = Number($(this).attr('data-id'));
  1420. });
  1421. let currentTheme = Unibase.Themes.Compact.Components.Index.Instance().currentTheme;
  1422. if (isCompany || isRole) {
  1423. currentTheme = response.result.CompanyTheme;
  1424. if (currentTheme === '') {
  1425. instance.currentUserTheme.LayoutId = 0;
  1426. instance.currentUserTheme.DetailsViewId = 0;
  1427. instance.currentUserTheme.DisplayModeId = 0;
  1428. instance.currentUserTheme.BackgroundImageId = 0;
  1429. instance.currentUserTheme.ThemeId = 0;
  1430. }
  1431. if (isRole && $(".hdn_themeid").length === 0) {
  1432. $('._bizgaze_popup_container').last().find('.section_Hidden').append(`<input type="hidden" class="hdn_themeid" value="0"><input type="hidden" class="hdn_displaymodeid" value="0">`);
  1433. }
  1434. if (currentTheme === '' && $(".hdn_themeid").val() != "0") {
  1435. instance.bindSelectedUserThemeSettings();
  1436. return;
  1437. }
  1438. }
  1439. $(`${instance.layoutElement}[data-id="${currentTheme.layoutId}"]`).click();
  1440. $(`${instance.detailsViewElement}[data-id="${currentTheme.detailsViewId}"]`).click();
  1441. $(`${instance.displayModeElement}[data-id="${currentTheme.displayModeId}"]`).click();
  1442. $(`${instance.backgroundImageElement}[data-id="${currentTheme.backgroundImageId}"]`).click();
  1443. instance.currentUserTheme.ThemeId = currentTheme.themeId;
  1444. instance.currentUserTheme.IsCompanyTheme = currentTheme.isCompanyTheme;
  1445. });
  1446. });
  1447. }
  1448. bindSelectedUserThemeSettings() {
  1449. const instance = this;
  1450. const currentTheme = JSON.parse($(".hdn_themeid").val().toString());
  1451. const { LayoutId, DetailsViewId, DisplayModeId, BackgroundImageId } = currentTheme;
  1452. $(`${instance.layoutElement}[data-id="${LayoutId}"]`).trigger('click');
  1453. $(`${instance.detailsViewElement}[data-id="${DetailsViewId}"]`).trigger('click');
  1454. $(`${instance.displayModeElement}[data-id="${DisplayModeId}"]`).trigger('click');
  1455. $(`${instance.backgroundImageElement}[data-id="${BackgroundImageId}"]`).trigger('click');
  1456. }
  1457. init(isCompany, companyId) {
  1458. let instance = this;
  1459. var _fileCacheHelper = Unibase.Platform.Helpers.FileCacheHelper.Instance();
  1460. Unibase.Platform.Helpers.FileCacheHelper.Instance().loadCssFiles(['platform/layout/components/layoutbuilder/style.layoutbuilder.css'], function () {
  1461. Unibase.Platform.Helpers.FileCacheHelper.Instance().loadJsFiles(['platform/core/infos/status.js', 'platform/layout/managers/themelayoutmanager.js'], function () {
  1462. if (companyId == undefined || companyId == "" || companyId == null) {
  1463. companyId = 0;
  1464. }
  1465. Unibase.Platform.Layouts.Managers.ThemeLayoutManager.Instance().getLayoutBuilderInfo(companyId, 0).then(function (response) {
  1466. $(".biz-wrapper").addClass("biz-settings-toggle");
  1467. $(".hk-wrapper").addClass("biz-settings-toggle");
  1468. let leftHtml = Unibase.Platform.Layouts.Components.LayoutBuilder_Template.Instance().getLeftHtml();
  1469. let onclick = "Unibase.Themes.Compact.Components.UserTheme.Instance().saveUserTheme()";
  1470. if (isCompany) {
  1471. onclick = "Unibase.Themes.Compact.Components.UserTheme.Instance().saveCompanyTheme()";
  1472. }
  1473. let html = `<div class="user-themes" id="user-themes">
  1474. <div class="user-themes-header"></div>
  1475. <div class="user-themes-body">
  1476. ${leftHtml}
  1477. </div>
  1478. <div class="user-themes-footer">
  1479. <a href="javascript:;" class="btn btn-theme px-4 w-100" type="button" onclick="` + onclick + `">Apply</a>
  1480. </div>
  1481. </div>`;
  1482. $("#settings-panel-body").html(html);
  1483. $("#settings-panel-head-title").html("Themes");
  1484. let themeSwitchHtml = `<div class="card theme-switcher">
  1485. <div class="card-header">
  1486. <a href="javascript:;" class="no-collapse biz-primary-text-color-removed" > Theme Switcher </a>
  1487. </div>
  1488. <div class="title-devider biz-border-color-removed"> </div>
  1489. <div id="theme-switcher-colors">
  1490. <div class="card-body pb-0" >
  1491. <div class="row dropdown-menu-scrollbar checkbox-container">
  1492. </div>
  1493. </div>
  1494. </div>
  1495. </div>`;
  1496. $("#user-themes .background-change").before(themeSwitchHtml);
  1497. response.result.LayoutInfo.forEach((layout) => {
  1498. let curLayout = layout;
  1499. let layoutId = curLayout.LayoutId;
  1500. curLayout.Thumbnail = curLayout.Thumbnail.replace(".png", ".svg");
  1501. $("#user-themes #menu-layouts .layout-row").append(`<a href="javascript:;" class="col-6 p-0 pr-2 p-relative" data-id="${layoutId}" data-index="${curLayout.LayoutIndex}">
  1502. <img src="${curLayout.Thumbnail}" class="rounded w-100 h-100" data-dynamic="1" onerror="ReloadImage(event)" title="${curLayout.LayoutName}" />
  1503. <i class="zmdi zmdi-check"></i>
  1504. </a>`);
  1505. });
  1506. $(instance.layoutElement).click(function () {
  1507. $(instance.layoutElement).removeClass('active');
  1508. $(this).addClass('active');
  1509. let id = Number($(this).attr('data-id'));
  1510. instance.currentUserTheme.LayoutId = id;
  1511. });
  1512. response.result.DetailViewInfo.forEach((viewLayout) => {
  1513. if (viewLayout.DetailsViewName != "Popup") {
  1514. let id = viewLayout.DetailsViewId;
  1515. $("#user-themes #detail-list-view .detail-row").append(`<a href="javascript:;" class="col-6 p-0 mb-2 pr-2 p-relative" data-id="${id}">
  1516. <img src="${viewLayout.Thumbnail}" class="rounded w-100 h-100" data-dynamic="1" onerror="ReloadImage(event)" title="${viewLayout.DetailsViewName}" />
  1517. <i class="zmdi zmdi-check"></i>
  1518. </a>`);
  1519. }
  1520. });
  1521. $(instance.detailsViewElement).click(function () {
  1522. $(instance.detailsViewElement).removeClass('active');
  1523. $(this).addClass('active');
  1524. let id = Number($(this).attr('data-id'));
  1525. instance.currentUserTheme.DetailsViewId = id;
  1526. });
  1527. response.result.DisplayModesInfo.forEach((displayMode) => {
  1528. $("#user-themes #theme-switcher-colors .row").append(`<a href="javascript:;" class="p-relative mr-2 mb-2" data-id="${displayMode.DisplayModeId}" title="${displayMode.DisplayModeName}">
  1529. <div class="p-relative color-box border biz-border-color-removed" style="background-color:${displayMode.PrimaryColor}">
  1530. </div>
  1531. <i class="zmdi zmdi-check"></i>
  1532. </a>`);
  1533. });
  1534. $(instance.displayModeElement).click(function () {
  1535. $(instance.displayModeElement).removeClass('active');
  1536. $(this).addClass('active');
  1537. $(`${instance.backgroundImageElement}.solid-color .color-box`).css("background-color", $(this).find('.color-box').css("background-color"));
  1538. $(`${instance.backgroundImageElement}.solid-color color-box`).addClass('active');
  1539. let id = Number($(this).attr('data-id'));
  1540. instance.currentUserTheme.DisplayModeId = id;
  1541. });
  1542. let solidColorImage = `<a href="javascript:;" class="col-4 p-relative px-1 solid-color active" data-id="0">
  1543. <div class="p-relative color-box border biz-border-color-removed" style="height:65px">
  1544. </div>
  1545. <i class="zmdi zmdi-check"></i>
  1546. </a>`;
  1547. $("#user-themes #background-image-view .row").append(solidColorImage);
  1548. response.result.BackgroundImages.forEach((backgroundImage) => {
  1549. let IsDefaultClass = backgroundImage.IsDefault ? 'default' : '';
  1550. $("#user-themes #background-image-view .row").append(`<a href="javascript:;" class="col-4 p-relative px-1 ${IsDefaultClass}" data-url="${backgroundImage.Thumbnail}" data-id="${backgroundImage.BackgroundImageId}">
  1551. <div class="p-relative">
  1552. <img src="${backgroundImage.Thumbnail}" class="rounded w-100" data-dynamic="1" onerror = "ReloadImage(event)" />
  1553. <div class="delete" data-id="${backgroundImage.BackgroundImageId}">
  1554. <i class="fa fa-trash"></i>
  1555. </div>
  1556. </div>
  1557. <i class="zmdi zmdi-check"></i>
  1558. </a>`);
  1559. });
  1560. $(instance.backgroundImageElement).click(function () {
  1561. $(instance.backgroundImageElement).removeClass('active');
  1562. $(this).addClass('active');
  1563. instance.currentUserTheme.BackgroundImageId = Number($(this).attr('data-id'));
  1564. });
  1565. let currentTheme = Unibase.Themes.Compact.Components.Index.Instance().currentTheme;
  1566. if (isCompany) {
  1567. currentTheme = response.result.CompanyTheme;
  1568. }
  1569. $(`${instance.layoutElement}[data-id="${currentTheme.layoutId}"]`).click();
  1570. $(`${instance.detailsViewElement}[data-id="${currentTheme.detailsViewId}"]`).click();
  1571. $(`${instance.displayModeElement}[data-id="${currentTheme.displayModeId}"]`).click();
  1572. $(`${instance.backgroundImageElement}[data-id="${currentTheme.backgroundImageId}"]`).click();
  1573. instance.currentUserTheme.ThemeId = currentTheme.themeId;
  1574. instance.currentUserTheme.IsCompanyTheme = currentTheme.isCompanyTheme;
  1575. });
  1576. });
  1577. });
  1578. }
  1579. saveCompanyTheme() {
  1580. let instance = this;
  1581. let postData = {
  1582. LayoutId: instance.currentUserTheme.LayoutId,
  1583. ThemeId: instance.currentUserTheme.ThemeId || 0,
  1584. DetailsViewId: instance.currentUserTheme.DetailsViewId,
  1585. DisplayModeId: instance.currentUserTheme.DisplayModeId,
  1586. BackgroundImageId: instance.currentUserTheme.BackgroundImageId
  1587. };
  1588. const placeholder = $('._bizgaze_popup_container').last().find('.form-error-message').first().attr('id');
  1589. if (!postData.LayoutId && !postData.DetailsViewId && !postData.DisplayModeId) {
  1590. MessageHelper.Instance().showError('Select Theme.', placeholder);
  1591. return;
  1592. }
  1593. if (!postData.LayoutId) {
  1594. MessageHelper.Instance().showError('Select Preferred Layout in Theme.', placeholder);
  1595. return;
  1596. }
  1597. else if (!postData.DetailsViewId) {
  1598. MessageHelper.Instance().showError('Select Preferred Details View in Theme.', placeholder);
  1599. return;
  1600. }
  1601. else if (!postData.DisplayModeId) {
  1602. MessageHelper.Instance().showError('Select Theme Switcher.', placeholder);
  1603. return;
  1604. }
  1605. $(".hdn_themeid").val(JSON.stringify(postData));
  1606. $(".hdn_displaymodeid").val(instance.currentUserTheme.DisplayModeId);
  1607. $(".biz-wrapper,.hk-wrapper").removeClass("biz-settings-toggle");
  1608. }
  1609. saveUserTheme() {
  1610. let instance = this;
  1611. let postData = {
  1612. LayoutId: instance.currentUserTheme.LayoutId,
  1613. ThemeId: instance.currentUserTheme.IsCompanyTheme ? 0 : instance.currentUserTheme.ThemeId,
  1614. DetailsViewId: instance.currentUserTheme.DetailsViewId,
  1615. DisplayModeId: instance.currentUserTheme.DisplayModeId,
  1616. BackgroundImageId: instance.currentUserTheme.BackgroundImageId
  1617. };
  1618. Unibase.Platform.Layouts.Managers.ThemeLayoutManager.Instance().saveUserTheme(postData).then(function (response) {
  1619. if (response.status == Unibase.Data.Status.Success) {
  1620. MessageHelper.Instance().showSuccess(response.message, '');
  1621. Unibase.Platform.Layouts.Components.LayoutBuilder.Instance().refrshLayout(response);
  1622. }
  1623. });
  1624. }
  1625. static Instance() {
  1626. if (this.instance === undefined) {
  1627. this.instance = new UserTheme();
  1628. }
  1629. return this.instance;
  1630. }
  1631. }
  1632. Components.UserTheme = UserTheme;
  1633. })(Components = Compact.Components || (Compact.Components = {}));
  1634. })(Compact = Themes.Compact || (Themes.Compact = {}));
  1635. })(Themes = Unibase.Themes || (Unibase.Themes = {}));
  1636. })(Unibase || (Unibase = {}));