PluginProbe ʕ •ᴥ•ʔ
Custom Twitter Feeds – A Tweets Widget or X Feed Widget / 2.7.0
Custom Twitter Feeds – A Tweets Widget or X Feed Widget v2.7.0
2.8.0 2.7.0 2.6.1 2.6.0 1.0 1.0.1 1.1 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 1.1.8 1.2 1.2.1 1.2.10 1.2.11 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.2.7 1.2.8 1.2.9 1.3 1.4 1.4.1 1.5 1.5.1 1.6 1.6.1 1.7 1.8 1.8.1 1.8.2 1.8.3 1.8.4 2.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.1 2.1.1 2.1.2 2.2 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.3.0 2.3.1 2.5.4 2.5.5 trunk
custom-twitter-feeds / admin / builder / assets / js / builder.js
custom-twitter-feeds / admin / builder / assets / js Last commit date
builder.js 1 month ago confirm-dialog.js 1 month ago date_i18n.js 1 month ago install-plugin-popup.js 1 month ago jquery.tooltipster.min.js 1 month ago oembed.js 1 month ago owl.autoheight.js 1 month ago ressources.js 1 month ago tooltip-wizard.js 1 month ago vue-color.min.js 1 month ago
builder.js
3033 lines
1 var ctfBuilder,
2 ctfStorage = window.localStorage,
3 sketch = VueColor.Sketch;
4
5
6
7
8
9
10
11 /**
12 * VueJS Global App Builder
13 *
14 * @since 2.0
15 */
16 ctfBuilder = new Vue({
17 el: '#ctf-builder-app',
18 http: {
19 emulateJSON: true,
20 emulateHTTP: true
21 },
22 components: {
23 'sketch-picker': sketch,
24 },
25 mixins: [VueClickaway.mixin],
26 data: {
27 nonce : ctf_builder.nonce,
28 template : ctf_builder.feedInitOutput,
29 templateRender : false,
30 updatedTimeStamp : new Date().getTime(),
31 feedSettingsDomOptions : null,
32 newAccountData : ctf_builder.newAccountData,
33 ctfRebrand : ctf_builder.ctfRebrand,
34 $parent : this,
35 plugins: ctf_builder.installPluginsPopup,
36 dismissLite : ctf_builder.twitter_feed_dismiss_lite,
37 supportPageUrl: ctf_builder.supportPageUrl,
38 builderUrl : ctf_builder.builderUrl,
39 pluginType : ctf_builder.pluginType,
40 genericText : ctf_builder.genericText,
41 ajaxHandler : ctf_builder.ajax_handler,
42 adminPostURL : ctf_builder.adminPostURL,
43 adminSettingsURL : ctf_builder.adminSettingsURL,
44 widgetsPageURL : ctf_builder.widgetsPageURL,
45 translatedText : ctf_builder.translatedText,
46 socialShareLink : ctf_builder.socialShareLink,
47 licenseType: ctf_builder.pluginType,
48 upgradeUrl: ctf_builder.upgradeUrl,
49 pluginUrl: ctf_builder.pluginUrl,
50
51 welcomeScreen : ctf_builder.welcomeScreen,
52 allFeedsScreen : ctf_builder.allFeedsScreen,
53 extensionsPopup : ctf_builder.extensionsPopup,
54 mainFooterScreen : ctf_builder.mainFooterScreen,
55 embedPopupScreen : ctf_builder.embedPopupScreen,
56 connectAccountScreen : ctf_builder.connectAccountScreen,
57 freeCtaShowFeatures: false,
58
59 //Add New Source
60 newSourceData : ctf_builder.newSourceData ? ctf_builder.newSourceData : null,
61 sourceConnectionURLs : ctf_builder.sourceConnectionURLs,
62 returnedApiSourcesList : [],
63 addNewSource : {
64 typeSelected : 'page',
65 manualSourceID : null,
66 manualSourceToken : null
67 },
68 selectedFeed : 'none',
69 expandedFeedID : null,
70 notificationElement : {
71 type : 'success', // success, error, warning, message
72 text : '',
73 shown : null
74 },
75 selectedSourcesToConnect : [],
76
77 selectSourceScreen : ctf_builder.selectSourceScreen,
78 customizeScreensText : ctf_builder.customizeScreens,
79 dialogBoxPopupScreen : ctf_builder.dialogBoxPopupScreen,
80 selectFeedTypeScreen : ctf_builder.selectFeedTypeScreen,
81 selectFeedTemplateScreen : ctf_builder.selectFeedTemplateScreen,
82 accountDetails : ctf_builder.accountDetails,
83 dummyLightBoxData : ctf_builder.dummyLightBoxData,
84
85 svgIcons : ctf_builder.svgIcons,
86 feedsList : ctf_builder.feeds,
87 feedTypes : ctf_builder.feedTypes,
88 advancedFeedTypes : ctf_builder.advancedFeedTypes,
89 appCredentials : ctf_builder.appCredentials,
90 appOAUTH : ctf_builder.appOAUTH,
91 socialInfo : ctf_builder.socialInfo,
92
93 feedTemplates : ctf_builder.feedTemplates,
94
95
96 links : ctf_builder.links,
97 legacyFeedsList : ctf_builder.legacyFeeds,
98 activeExtensionsFull : ctf_builder.activeExtensions,
99 activeExtensions : [],
100 inActiveExtensions : [],
101
102 dummyLightBoxScreen : false,
103
104 //Selected Feed type => User Hashtag Tagged
105 selectedFeed : ['usertimeline'],
106 selectedFeedPopup : [],
107 // Selected Feed Template
108 selectedFeedTemplate : 'default',
109
110 selectedFeedModelPopup : {
111 'usertimeline' : '',
112 'hashtag' : '',
113 'hometimeline' : ''
114 },
115 selectedFeedModel : {
116 'usertimeline' : '',
117 'hashtag' : '',
118 'hometimeline' : ''
119 },
120
121 listIdInputModel: '',
122 listUserNameInputModel : '',
123 listUserNameInputModelSearched : '',
124 listUserNameResult : [],
125 noListFound : null,
126
127 viewsActive : {
128 //Screens where the footer widget is disabled
129 footerDiabledScreens : [
130 'welcome',
131 'selectFeed'
132 ],
133
134 // welcome, selectFeed
135 pageScreen : 'welcome',
136
137 // feedsType, selectSource, feedsTypeGetProcess
138 selectedFeedSection : 'feedsType',
139
140 sourcePopup : false,
141 feedtypesPopup : false,
142 feedtypesCustomizerPopup : false,
143 feedtemplatesPopup : false,
144 sourcesListPopup : false,
145 connectAccountPopup : false,
146 // step_1 [Add New Source] , step_2 [Connect to a user pages/groups], step_3 [Add Manually]
147 sourcePopupScreen : 'redirect_1',
148
149 connectAccountStep : 'step_1',
150
151 // creation or customizer
152 sourcePopupType : 'creation',
153 extensionsPopupElement : false,
154 feedTypeElement : null,
155 feedTemplateElement : null,
156 instanceFeedActive : null,
157 clipboardCopiedNotif : false,
158 legacyFeedsShown : false,
159 editName : false,
160 embedPopup : false,
161 embedPopupScreen : 'step_1',
162 embedPopupSelectedPage : null,
163
164 moderationMode : false,
165
166 // onboarding
167 onboardingPopup : ctf_builder.allFeedsScreen.onboarding.active,
168 onboardingStep : 1,
169
170 // customizer onboarding
171 onboardingCustomizerPopup : ctf_builder.customizeScreens.onboarding.active,
172
173 // plugin install popup
174 installPluginPopup : false,
175 installPluginModal: 'facebook'
176 },
177
178 //Feeds Pagination
179 feedPagination : {
180 feedsCount : ctf_builder.feedsCount != undefined ? ctf_builder.feedsCount : null,
181 pagesNumber : 1,
182 currentPage : 1,
183 itemsPerPage : ctf_builder.itemsPerPage != undefined ? ctf_builder.itemsPerPage : null,
184 },
185
186
187
188 isCreateProcessGood : false,
189 feedCreationInfoUrl : null,
190 feedTypeOnSourcePopup : 'user',
191
192 feedsSelected : [],
193 selectedBulkAction : false,
194
195 customizerFeedDataInitial : null,
196 customizerFeedData : ctf_builder.customizerFeedData,
197 wordpressPageLists : ctf_builder.wordpressPageLists,
198 iscustomizerScreen : (ctf_builder.customizerFeedData != undefined && ctf_builder.customizerFeedData != false),
199
200 customizerSidebarBuilder : ctf_builder.customizerSidebarBuilder,
201 customizerScreens : {
202 activeTab : 'customize',
203 printedType : {},
204 printedTemplate : {},
205 activeSection : null,
206 previewScreen : 'desktop',
207 sourceExpanded : null,
208 sourcesChoosed : [],
209 inputNameWidth : '0px',
210 activeSectionData : null,
211 parentActiveSection : null, //For nested Setions
212 parentActiveSectionData : null, //For nested Setions
213 activeColorPicker : null,
214 popupBackButton : ['feedTemplates']
215 },
216 previewScreens: [
217 'desktop',
218 'tablet',
219 'mobile'
220 ],
221
222 nestedStylingSection : [
223 'post_styling_author',
224 'post_styling_tweet_text',
225 'post_styling_tweet_date',
226 'post_styling_tweet_actions',
227 'post_styling_quote_tweet',
228 'post_styling_media',
229 'post_styling_replies',
230 'post_styling_retweet',
231 'post_styling_twitter_cards',
232 'post_styling_logos'
233 ],
234 expandedCaptions : [],
235 manualAccountResp : false,
236 sourceToDelete : {},
237 feedToDelete : {},
238 dialogBox : {
239 active : false,
240 type : null, //deleteSourceCustomizer
241 icon : null,
242 heading : null,
243 description : null,
244 customButtons : undefined
245 },
246
247 feedStyle : '',
248 expandedPostText : [],
249 showedSocialShareTooltip : null,
250 showedCommentSection : [],
251
252 //LightBox Object
253 lightBox : {
254 visibility : 'hidden',
255 type : null,
256 post : null,
257 activeImage : null,
258 albumIndex : 0,
259 videoSource : null
260 },
261 highLightedSection : 'all',
262
263 shoppableFeed : {
264 postId : null,
265 postMedia : null,
266 postCaption : null,
267 postShoppableUrl : ''
268 },
269
270 moderationSettings : {
271 list_type_selected : null,
272 allow_list : [],
273 block_list : []
274 },
275 customBlockModerationlistTemp : '',
276 tooltip : {
277 text : '',
278 hover : false,
279 hoverType : 'outside'
280 },
281 //Loading Bar
282 fullScreenLoader : false,
283 appLoaded : false,
284 previewLoaded : false,
285 loadingBar : true,
286 notificationElement : {
287 type : 'success', // success, error, warning, message
288 text : '',
289 shown : null
290 },
291
292 loadingAjax : false,
293
294 },
295 watch : {
296 feedPreviewOutput : function(){
297 return this.feedPreviewMaker()
298 },
299 },
300 computed : {
301
302 feedStyleOutput : function(){
303 return this.customizerStyleMaker();
304 },
305 singleHolderData : function(){
306 return this.singleHolderParams();
307 },
308 getModerationShoppableMode : function(){
309 if( this.viewsActive.moderationMode || this.customizerScreens.activeSection == 'settings_shoppable_feed'){
310 this.moderationShoppableMode = true;
311 }else{
312 this.moderationShoppableMode = false;
313 }
314 return this.moderationShoppableMode;
315 }
316
317 },
318 updated : function(){
319 var self = this;
320 if( self.customizerFeedData ){
321 self.setShortcodeGlobalSettings(true);
322 }
323 },
324 created: function(){
325 var self = this;
326 this.$parent = self;
327 if( self.customizerFeedData ){
328 self.template = String("<div>"+self.template+"</div>");
329 self.selectedFeedModel = JSON.parse(JSON.stringify(self.initSelectedFeedTypeModel()));
330 self.selectedFeedModelPopup = JSON.parse(JSON.stringify(self.initSelectedFeedTypeModel()));
331 self.selectedFeed = self.getCustomizerSelectedFeedsType();
332 self.updatedTimeStamp = new Date().getTime();
333 self.customizerFeedDataInitial = JSON.parse(JSON.stringify(self.customizerFeedData));
334 }
335
336 if(self.customizerFeedData == undefined){
337 self.feedPagination.pagesNumber = self.feedPagination.feedsCount != null ? Math.ceil(self.feedPagination.feedsCount / self.feedPagination.itemsPerPage) : 1;
338 self.processIFConnectSuccess();
339 }
340 window.addEventListener('beforeunload', (event) => {
341 if( self.customizerFeedData ){
342 self.leaveWindowHandler(event);
343 }
344 });
345 self.activeExtensionsFull.map( element => self.activeExtensions[element['type']] = element['active'] );
346 self.activeExtensionsFull.map( element => {
347 if( element['active'] == false ){
348 element['ids'].forEach((id) => {
349 self.inActiveExtensions[id] = element['type'];
350 })
351 }
352 });
353
354 if (typeof self.newAccountData !== 'undefined') {
355 self.viewsActive.pageScreen = 'selectFeed';
356
357 }
358
359
360 self.loadingBar = false;
361 /* Onboarding - move elements so the position is in context */
362 self.positionOnboarding();
363 setTimeout(function(){
364 self.positionOnboarding();
365 }, 500);
366
367 self.appLoaded = true;
368 },
369 methods: {
370 updateColorValue : function(id){
371 var self = this;
372 self.customizerFeedData.settings[id] = (self.customizerFeedData.settings[id].a == 1) ? self.customizerFeedData.settings[id].hex : self.customizerFeedData.settings[id].hex8;
373 },
374
375
376 /**
377 * Init Selected Feed Type Sources
378 *
379 * @since 2.0
380 */
381 initSelectedFeedTypeModel : function(){
382 var self = this,
383 customizerSettings = self.customizerFeedData.settings,
384 selectedFeedModel = self.selectedFeedModel;
385
386 if(customizerSettings.type != undefined && customizerSettings.type == 'mixed' ){
387 selectedFeedModel = {
388 'usertimeline' : customizerSettings.screenname !== undefined ? customizerSettings.screenname : '' ,
389 'hashtag' : customizerSettings.hashtag !== undefined ? customizerSettings.hashtag : '' ,
390 'hometimeline' : customizerSettings.home !== undefined && customizerSettings.home == true ? 'true' : ''
391 };
392 }
393 if(customizerSettings.type != undefined && customizerSettings.type != 'mixed' ){
394 switch (customizerSettings.type) {
395 case 'usertimeline':
396 selectedFeedModel.usertimeline = self.checkNotEmpty(customizerSettings.usertimeline_text) ? customizerSettings.usertimeline_text : (self.checkNotEmpty(customizerSettings.screenname) ? customizerSettings.screenname : '');
397 break;
398 case 'hashtag':
399 selectedFeedModel.hashtag = self.checkNotEmpty(customizerSettings.hashtag_text) ? customizerSettings.hashtag_text : (self.checkNotEmpty(customizerSettings.hashtag) ? customizerSettings.hashtag : '');
400 break;
401 case 'hometimeline':
402 selectedFeedModel.hometimeline = true;
403 break;
404 }
405 }
406 return selectedFeedModel;
407 },
408
409 /**
410 * Apply Feed Popup Changes
411 *
412 * @since 2.0
413 */
414 applyFeedTypePopup : function(){
415 var self = this,
416 feedTypes = Object.entries(self.selectSourceScreen.multipleTypes);
417 selectedFeedModel = self.selectedFeedModel;
418
419 feedTypes.forEach( function(element) {
420 var feedTypeID = element[0],
421 settingName = feedTypeID == 'usertimeline' ? 'screenname' : feedTypeID;
422 self.customizerFeedData.settings[settingName] = self.selectedFeedModel[feedTypeID];
423 });
424
425 if( self.customizerFeedData ){
426 self.customizerFeedData.settings.type = self.selectedFeed[0];
427 self.cleanUnselectedFeedTypes();
428 }
429
430 },
431
432 /**
433 * Clean Unselected Feed Types
434 *
435 * @since 2.0
436 */
437 cleanUnselectedFeedTypes : function(){
438 var self = this;
439 if( !self.selectedFeed.includes('hashtag') ){
440 self.customizerFeedData.settings.hashtag_text = '';
441 self.customizerFeedData.settings.hashtag = '';
442 }
443
444 if( !self.selectedFeed.includes('usertimeline') ){
445 self.customizerFeedData.settings.usertimeline_text = '';
446 self.customizerFeedData.settings.screenname = '';
447 }
448
449 if( !self.selectedFeed.includes('search') ){
450 self.customizerFeedData.settings.search_text = '';
451 self.customizerFeedData.settings.search = '';
452 }
453
454 if( !self.selectedFeed.includes('hometimeline') ){
455 self.customizerFeedData.settings.home = '';
456 }
457
458 if( !self.selectedFeed.includes('mentionstimeline') ){
459 self.customizerFeedData.settings.mentions = '';
460 }
461
462 if( !self.selectedFeed.includes('lists') ){
463 self.customizerFeedData.settings.lists_id = '';
464 self.customizerFeedData.settings.lists = '';
465 self.customizerFeedData.settings.lists_info = '';
466 }
467 },
468
469
470 /**
471 * Leave Window Handler
472 *
473 * @since 2.0
474 */
475 leaveWindowHandler : function(ev){
476 var self = this,
477 updateFeedData = {
478 action : 'ctf_feed_saver_manager_recache_feed',
479 feedID : self.customizerFeedData.feed_info.id,
480 };
481 self.ajaxPost(updateFeedData, function(_ref){
482 var data = _ref.data;
483 });
484 },
485
486 /**
487 * Show & Hide View
488 *
489 * @since 2.0
490 */
491 activateView : function(viewName, sourcePopupType = 'creation', ajaxAction = false){
492 var self = this;
493 if(viewName === 'feedtemplatesPopupCustomizer'){
494 self.activateView('feedtemplatesPopup');
495 self.activateView('extensionsPopupElement');
496 }else{
497 if(viewName === 'extensionsPopupElement' && self.customizerFeedData !== undefined && ( self.advancedFeedTypes.map( element => element['type'] ).includes(self.viewsActive.extensionsPopupElement) ) ){
498 self.activateView('feedtypesPopup');
499 }
500 self.viewsActive[viewName] = (self.viewsActive[viewName] == false ) ? true : false;
501
502 if(viewName === 'feedtypesPopup'){
503 self.viewsActive.feedTypeElement = null;
504 self.selectedFeedPopup = JSON.parse(JSON.stringify(self.selectedFeed));
505 }
506 if(viewName === 'extensionsPopupElement' && self.customizerFeedData !== undefined){
507 //self.activateView('feedtypesPopup');
508 }
509 if(viewName == 'editName'){
510 document.getElementById("ctf-csz-hd-input").focus();
511 }
512 if(viewName == 'embedPopup' && ajaxAction == true){
513 self.saveFeedSettings();
514 }
515
516 if((viewName == 'sourcePopup' || viewName == 'sourcePopupType') && sourcePopupType == 'creationRedirect'){
517 setTimeout(function(){
518 self.$refs.addSourceRef.processIFConnect()
519 },3500);
520 }
521 }
522
523 ctfBuilder.$forceUpdate();
524 self.movePopUp();
525 },
526
527 /**
528 * Show/Hide View or Redirect to plugin dashboard page
529 *
530 * @since 2.0
531 */
532 activateViewOrRedirect: function(viewName, pluginName, plugin) {
533 var self = this;
534 if ( plugin.installed && plugin.activated ) {
535 window.location = plugin.dashboard_permalink;
536 return;
537 }
538
539 self.viewsActive[viewName] = (self.viewsActive[viewName] == false ) ? true : false;
540
541 if(viewName == 'installPluginPopup'){
542 self.viewsActive.installPluginModal = pluginName;
543 }
544
545 self.movePopUp();
546 ctfBuilder.$forceUpdate();
547 },
548
549 movePopUp : function(){
550 var overlay = document.querySelectorAll("sb-fs-boss");
551 if (overlay.length > 0) {
552 document.getElementById("wpbody-content").prepend(overlay[0]);
553 }
554 },
555
556 /**
557 * Check if View is Active
558 *
559 * @since 2.0
560 *
561 * @return boolean
562 */
563 checkActiveView : function(viewName){
564 return this.viewsActive[viewName];
565 },
566
567 /**
568 * Check if Control Is active
569 *
570 * @since 2.0
571 *
572 * @return boolean
573 */
574 checkActiveControl : function(controlId, enabled){
575 var self = this;
576 return self.customizerFeedData.settings[controlId] === enabled || self.customizerFeedData.settings[controlId] === enabled.toString();
577
578 },
579
580 /**
581 * Switch & Change Feed Screens
582 *
583 * @since 2.0
584 */
585 switchScreen: function(screenType, screenName){
586 this.viewsActive[screenType] = screenName;
587 ctfBuilder.$forceUpdate();
588 },
589
590 /**
591 * Check if Value is Empty
592 *
593 * @since 2.0
594 *
595 * @return boolean
596 */
597 checkNotEmpty : function(value){
598 return value != false && value != null && value != undefined && value.replace(/ /gi,'') != '';
599 },
600
601 /**
602 * Check if Value exists in Array Object
603 *
604 * @since 2.0
605 *
606 * @return boolean
607 */
608 checkObjectArrayElement : function(objectArray, object, byWhat){
609 var objectResult = objectArray.filter(function(elem){
610 return elem[byWhat] == object[byWhat];
611 });
612 return (objectResult.length > 0) ? true : false;
613 },
614
615 /**
616 * Check if Data Setting is Enabled
617 *
618 * @since 2.0
619 *
620 * @return boolean
621 */
622 valueIsEnabled : function(value){
623 return value == 1 || value == true || value == 'true' || value == 'on';
624 },
625
626
627 /**
628 * Parse JSON
629 *
630 * @since 2.0
631 *
632 * @return jsonObject / Boolean
633 */
634 jsonParse : function(jsonString){
635 try {
636 return JSON.parse(jsonString);
637 } catch(e) {
638 return false;
639 }
640 },
641
642
643 /**
644 * Ajax Post Action
645 *
646 * @since 2.0
647 */
648 ajaxPost : function(data, callback){
649 var self = this;
650 data['nonce'] = self.nonce;
651 self.$http.post(self.ajaxHandler,data).then(callback);
652 },
653
654 /**
655 * Check if Object has Nested Property
656 *
657 * @since 2.0
658 *
659 * @return boolean
660 */
661 hasOwnNestedProperty : function(obj,propertyPath) {
662 if (!propertyPath){return false;}var properties = propertyPath.split('.');
663 for (var i = 0; i < properties.length; i++) {
664 var prop = properties[i];
665 if (!obj || !obj.hasOwnProperty(prop)) {
666 return false;
667 } else {
668 obj = obj[prop];
669 }
670 }
671 return true;
672 },
673
674
675 /**
676 * Feed List Pagination
677 *
678 * @since 2.0
679 */
680 feedListPagination : function(type){
681 var self = this,
682 currentPage = self.feedPagination.currentPage,
683 pagesNumber = self.feedPagination.pagesNumber;
684 self.loadingBar = true;
685 if((currentPage != 1 && type == 'prev') || (currentPage < pagesNumber && type == 'next')){
686 self.feedPagination.currentPage = (type == 'next') ?
687 (currentPage < pagesNumber ? (parseInt(currentPage) + 1) : pagesNumber) :
688 (currentPage > 1 ? (parseInt(currentPage) - 1) : 1);
689
690 var postData = {
691 action : 'ctf_feed_saver_manager_get_feed_list_page',
692 page : self.feedPagination.currentPage
693 };
694 self.ajaxPost(postData, function(_ref){
695 var data = _ref.data;
696 if(data){
697 self.feedsList = data;
698 }
699 self.loadingBar = false;
700 });
701 ctfBuilder.$forceUpdate();
702 }
703 },
704
705 /**
706 * Choose Feed Type
707 *
708 * @since 2.0
709 */
710 chooseFeedType : function(feedTypeEl, iscustomizerPopup = false){
711 var self = this,
712 feedAllowedTypes = self.feedTypes.map( element => element['type'] );
713
714 if (feedTypeEl.type !== 'usertimeline') {
715 self.viewsActive.extensionsPopupElement = feedTypeEl.type
716 return;
717 }
718
719
720 ctfBuilder.$forceUpdate();
721 },
722
723 /**
724 * Choose Feed Type
725 *
726 * @since 2.0
727 */
728 selectFeedTypePopup : function( feedTypeEl ){
729 var self = this
730 if (feedTypeEl.type !== 'usertimeline') {
731 self.viewsActive.extensionsPopupElement = feedTypeEl.type
732 self.viewsActive.feedtypesPopup = false;
733 return;
734 }
735 },
736
737 /**
738 * Check Selected Feed Type
739 *
740 * @since 2.0
741 */
742 checkFeedTypeSelect : function( feedTypeEl ){
743 var self = this;
744 if(self.customizerFeedData){
745 return self.selectedFeedPopup.includes(feedTypeEl.type) && feedTypeEl.type != 'socialwall'
746 }
747 return self.selectedFeed.includes(feedTypeEl.type) && feedTypeEl.type != 'socialwall'
748 },
749
750 /**
751 * Confirm Add Feed Type Poup
752 *
753 * @since 2.0
754 */
755 addFeedTypePopup : function(){
756 var self = this;
757 self.selectedFeed = self.selectedFeedPopup;
758 self.selectedFeed = self.selectedFeed.filter((element, index) => {
759 return self.selectedFeed.indexOf(element) === index;
760 });
761 self.activateView('feedtypesPopup');
762 if( self.customizerFeedData ){
763 self.activateView('feedtypesCustomizerPopup');
764 }
765 },
766
767 /**
768 * Returns The Selected Feeds Type
769 * For Customizer PopUp
770 *
771 * @since 2.0
772 */
773 getCustomizerSelectedFeedsType : function(){
774 var self = this,
775 customizerSettings = self.customizerFeedData.settings;
776
777 switch (customizerSettings.type) {
778 case 'usertimeline':
779 return ['usertimeline'];
780 break;
781 case 'hashtag':
782 return ['hashtag'];
783 break;
784 case 'hometimeline':
785 return ['hometimeline'];
786 break;
787 case 'search':
788 return ['search'];
789 break;
790 case 'mentionstimeline':
791 return ['mentionstimeline'];
792 break;
793 case 'lists':
794 return ['lists'];
795 break;
796 default:
797 var feedTypes = [];
798 self.feedTypes.forEach( function(feed) {
799 if(self.checkNotEmpty( self.selectedFeedModel[feed.type])){
800 feedTypes.push( feed.type );
801 }
802
803 });
804 return feedTypes;
805 break;
806 }
807
808 },
809
810 /**
811 * Choose Feed Type
812 *
813 * @since 2.0
814 */
815 checkMultipleFeedType : function(){
816 return this.selectedFeed.length > 1;
817 },
818
819 /**
820 * Check if Feed Type Source is Active
821 *
822 * @since 2.0
823 */
824 checkMultipleFeedTypeActive : function(feedTypeID){
825 var self = this;
826 if(self.customizerFeedData){
827 return self.selectedFeedPopup.length >= 1 && self.selectedFeedPopup.includes(feedTypeID);
828 }
829 return self.selectedFeed.length >= 1 && self.selectedFeed.includes(feedTypeID);
830 },
831
832 /**
833 * Customizer
834 * Check if Feed Type Source is Active
835 *
836 * @since 2.0
837 */
838 checkMultipleFeedTypeActiveCustomizer : function(feedTypeID){
839 return this.customizerFeedData.settings.type == feedTypeID || ( this.customizerFeedData.settings.type == 'mixed' && this.checkFeedTypeHasSources(feedTypeID) );
840 },
841
842 /**
843 * Customizer
844 * Check if Feed Type Has Sources
845 *
846 * @since 2.0
847 */
848 checkFeedTypeHasSources : function(feedTypeID){
849 var self = this;
850 switch (feedTypeID) {
851 case 'usertimeline':
852 return self.checkNotEmpty(self.customizerFeedData.settings.screenname) && self.customizerFeedData.settings.screenname !== undefined && self.createSourcesArray(self.customizerFeedData.settings.screenname).length > 0;
853 break;
854 case 'hashtag':
855 return self.checkNotEmpty(self.customizerFeedData.settings.hashtag) && self.customizerFeedData.settings.hashtag !== undefined && self.createSourcesArray(self.customizerFeedData.settings.hashtag).length > 0;
856 break;
857 case 'hometimeline':
858 return self.customizerFeedData.settings.home !== undefined && self.valueIsEnabled(self.customizerFeedData.settings.home);
859 break;
860 case 'search':
861 return self.checkNotEmpty(self.customizerFeedData.settings.search) && self.customizerFeedData.settings.search !== undefined && self.createSourcesArray(self.customizerFeedData.settings.search).length > 0;
862 break;
863 case 'mentionstimeline':
864 return self.customizerFeedData.settings.mentions !== undefined && self.valueIsEnabled(self.customizerFeedData.settings.mentions);
865 break;
866 case 'lists':
867 return self.checkNotEmpty(self.customizerFeedData.settings.lists_info) && self.customizerFeedData.settings.lists_info !== undefined && self.jsonParse(self.customizerFeedData.settings.lists_info) !== false && Object.keys(self.jsonParse(self.customizerFeedData.settings.lists_info)).length > 0;
868 break;
869 case 'lists_ids':
870 return self.checkNotEmpty(self.customizerFeedData.settings.lists) && self.customizerFeedData.settings.lists !== undefined && self.createSourcesArray(self.customizerFeedData.settings.lists).length > 0;
871 break;
872 }
873 return false;
874 },
875
876 /**
877 * Customizer
878 * Toggle the Feed Types in Popup
879 *
880 * @since 2.0
881 */
882 openFeedTypesPopupCustomizer : function(){
883 var self = this;
884 self.selectedFeedPopup = JSON.parse(JSON.stringify(self.selectedFeed));
885 self.selectedFeedModelPopup = JSON.parse(JSON.stringify(self.selectedFeedModel));
886 self.activateView('feedtypesCustomizerPopup');
887 },
888
889 /**
890 * Customizer
891 * Toggle the Feed Types in Popup
892 *
893 * @since 2.0
894 */
895 toggleFeedTypesChooserPopup : function(){
896 var self = this;
897 self.activateView('feedtypesCustomizerPopup');
898 self.activateView('feedtypesPopup');
899 },
900
901 /**
902 * Customizer
903 * Toggle the Feed Types With Sources Popup
904 *
905 * @since 2.0
906 */
907 toggleFeedTypesSourcesPopup : function(){
908 var self = this;
909
910 self.activateView('sourcesListPopup');
911 if( self.customizerFeedData ){
912 self.activateView('feedtypesCustomizerPopup');
913 }
914 },
915
916 /**
917 * Customizer
918 * Update Feed Type
919 * & Sources/Hashtags
920 * @since 2.0
921 */
922 updateFeedTypeAndSourcesCustomizer : function(){
923 var self = this,
924 feedTypes = Object.entries(self.selectSourceScreen.multipleTypes);
925 self.selectedFeedModel = JSON.parse(JSON.stringify(self.selectedFeedModelPopup));
926
927 feedTypes.forEach( function(element) {
928 var feedTypeID = element[0];
929 if( !self.selectedFeed.includes(feedTypeID) ){
930 var settingName = feedTypeID == 'usertimeline' ? 'screenname' : feedTypeID,
931 settingValue = ( feedTypeID !== 'hometimeline' && feedTypeID !== 'mentionstimeline' ) ? '' : 'false';
932 self.customizerFeedData.settings[settingName] = '';
933 if(feedTypeID == 'lists'){
934 self.customizerFeedData.settings['lists_info'] = [];
935 }
936 }else{
937 if(feedTypeID == 'hometimeline'){
938 self.customizerFeedData.settings.home = true;
939 }
940 if(feedTypeID == 'mentionstimeline'){
941 self.customizerFeedData.settings.metions = true;
942 }
943 }
944 });
945 self.applyFeedTypePopup();
946 self.customizerControlAjaxAction('feedFlyPreview');
947 self.activateView('feedtypesCustomizerPopup');
948
949 },
950
951 /**
952 * Customizer
953 * Cancel Feed Types
954 * & Sources/Hashtags
955 * @since 2.0
956 */
957 cancelFeedTypeAndSourcesCustomizer : function(){
958 var self = this;
959 if( JSON.stringify(self.selectedFeedModelPopup) === JSON.stringify(self.selectedFeedModel) ){
960 self.viewsActive['feedtypesPopup'] = false;
961 self.viewsActive['feedtypesCustomizerPopup'] = false;
962
963 }else{
964 self.openDialogBox('unsavedFeedSources');
965 }
966
967 },
968
969
970
971
972 /**
973 * If max number of source types are added (3)
974 *
975 * @since 2.0
976 */
977 maxTypesAdded : function(){
978 if ( true /* is free version */ ) {
979 return 1;
980 }
981 return this.selectedFeed.length >= 6;
982 },
983
984 /**
985 * Check if Feed Type Source is Active
986 *
987 * @since 2.0
988 */
989 removeFeedTypeSource : function(feedTypeID){
990 var self = this;
991 if(self.selectedFeed.length > 1){
992 if(self.customizerFeedData){
993 var settingName = feedTypeID == 'usertimeline' ? 'screenname' : feedTypeID,
994 settingValue = ( feedTypeID !== 'hometimeline' && feedTypeID !== 'mentionstimeline' ) ? '' : false;
995 self.selectedFeedModelPopup[feedTypeID] = settingValue;
996 if(feedTypeID == 'lists'){
997 self.selectedFeedModelPopup['listsObject'] = {};
998 }
999
1000 }else{
1001 self.selectedFeedModel[feedTypeID] = ( feedTypeID !== 'hometimeline' && feedTypeID !== 'mentionstimeline' ) ? '' : false;
1002 if(feedTypeID == 'lists'){
1003 self.selectedFeedModel['listsObject'] = {};
1004 }
1005 }
1006 self.selectedFeed.splice(self.selectedFeed.indexOf(feedTypeID), 1);
1007 if(self.customizerFeedData){
1008 self.selectedFeedPopup = self.selectedFeed;
1009 }
1010 }
1011 },
1012
1013 /**
1014 * Choose Feed Type
1015 *
1016 * @since 2.0
1017 */
1018 checkSingleFeedType : function(feedType){
1019 return this.selectedFeed.length == 1 && this.selectedFeed[0] == feedType;
1020 },
1021
1022
1023 //Check Feed Creation Process Sources & Hashtags
1024 creationProcessCheckAppCredentials : function(){
1025 var self = this;
1026 if ( typeof self.appCredentials === 'undefined') {
1027 return false;
1028 }
1029 return self.checkNotEmpty( self.appCredentials.access_token ) && self.checkNotEmpty( self.appCredentials.access_token_secret );
1030 },
1031
1032 processIFConnectSuccess : function(){
1033 var self = this;
1034 if( ctfStorage.selectedFeed !== undefined){
1035 self.selectedFeed = ctfStorage.selectedFeed.split(',');
1036 self.viewsActive.pageScreen = 'selectFeed';
1037 self.viewsActive.selectedFeedSection = 'selectSource';
1038 }
1039 ctfStorage.removeItem("selectedFeed");
1040 },
1041
1042 connectAccountLink : function(){
1043 var self = this;
1044 ctfStorage.setItem('selectedFeed', self.selectedFeed);
1045 window.location = self.appOAUTH;
1046 },
1047
1048 /*
1049 Feed Creation Process
1050 */
1051 creationProcessCheckAction : function(){
1052 var self = this, checkBtnNext = false;
1053 switch (self.viewsActive.selectedFeedSection) {
1054 case 'feedsType':
1055 checkBtnNext = self.selectedFeed != null ? true : false;
1056 window.ctfSelectedFeed = self.selectedFeed;
1057 break;
1058 case 'selectSource':
1059 checkBtnNext = self.creationProcessCheckAppCredentials();
1060 break;
1061 /*
1062 case 'selectTemplate':
1063 checkBtnNext = self.creationProcessCheckAppCredentials();
1064 break;
1065 */
1066 case 'feedsTypeGetProcess':
1067
1068 break;
1069 }
1070 return checkBtnNext;
1071 },
1072 //Next Click in the Creation Process
1073 creationProcessNext : function(){
1074 var self = this;
1075 switch (self.viewsActive.selectedFeedSection) {
1076 case 'feedsType':
1077 if(self.selectedFeed !== null){
1078 if (self.selectedFeed === 'socialwall') {
1079 window.location.href = ctf_builder.pluginsInfo.social_wall.settingsPage;
1080 return;
1081 }
1082 if( self.creationProcessCheckAppCredentials() ){
1083 self.switchScreen('selectedFeedSection', 'selectSource');
1084 }else{
1085 self.viewsActive['connectAccountPopup'] = true;
1086 }
1087 }
1088 break;
1089 case 'selectSource':
1090 if( self.creationProcessCheckAppCredentials() ){
1091 //self.switchScreen('selectedFeedSection', 'feedsTypeGetProcess');
1092 self.isCreateProcessGood = true;
1093 }
1094 break;
1095 /*
1096 case 'selectTemplate':
1097 if( self.creationProcessCheckAppCredentials() && self.checkNotEmpty(self.selectedFeedTemplate) ){
1098 self.isCreateProcessGood = true;
1099 }
1100 break;
1101 */
1102 case 'feedsTypeGetProcess':
1103 break;
1104 }
1105 if(self.isCreateProcessGood)
1106 self.submitNewFeed();
1107
1108 },
1109 changeVideoSource : function( videoSource ){
1110 this.videosTypeInfo.type = videoSource;
1111 ctfBuilder.$forceUpdate();
1112 },
1113
1114 //Next Click in the Onboarding Process
1115 onboardingNext : function(){
1116 this.viewsActive.onboardingStep ++;
1117 this.onboardingHideShow();
1118 ctfBuilder.$forceUpdate();
1119 },
1120 //Previous Click in the Onboarding Process
1121 onboardingPrev : function(){
1122 this.viewsActive.onboardingStep --;
1123 this.onboardingHideShow();
1124 ctfBuilder.$forceUpdate();
1125 },
1126 onboardingHideShow : function() {
1127 var tooltips = document.querySelectorAll(".sb-onboarding-tooltip");
1128 for (var i = 0; i < tooltips.length; i++){
1129 tooltips[i].style.display = "none";
1130 }
1131 document.querySelectorAll(".sb-onboarding-tooltip-"+this.viewsActive.onboardingStep)[0].style.display = "block";
1132
1133 if (this.viewsActive.onboardingCustomizerPopup) {
1134 if (this.viewsActive.onboardingStep === 2) {
1135 this.switchCustomizerTab('customize');
1136 } else if (this.viewsActive.onboardingStep === 3) {
1137 this.switchCustomizerTab('settings');
1138 }
1139 }
1140
1141 },
1142 //Close Click in the Onboarding Process
1143 onboardingClose : function(){
1144 var self = this,
1145 wasActive = self.viewsActive.onboardingPopup ? 'newuser' : 'customizer';
1146
1147 document.getElementById("ctf-builder-app").classList.remove('sb-onboarding-active');
1148
1149 self.viewsActive.onboardingPopup = false;
1150 self.viewsActive.onboardingCustomizerPopup = false;
1151 this.switchCustomizerTab('customize');
1152
1153 self.viewsActive.onboardingStep = 0;
1154 var postData = {
1155 action : 'ctf_dismiss_onboarding',
1156 was_active : wasActive
1157 };
1158 self.ajaxPost(postData, function(_ref){
1159 var data = _ref.data;
1160 });
1161 ctfBuilder.$forceUpdate();
1162 },
1163 positionOnboarding : function(){
1164 var self = this,
1165 onboardingElem = document.querySelectorAll(".sb-onboarding-overlay")[0],
1166 wrapElem = document.getElementById("ctf-builder-app");
1167
1168 if (onboardingElem === null || typeof onboardingElem === 'undefined') {
1169 return;
1170 }
1171
1172 if (self.viewsActive.onboardingCustomizerPopup && self.iscustomizerScreen && self.customizerFeedData) {
1173 if (document.getElementById("sb-onboarding-tooltip-customizer-1") !== null) {
1174 wrapElem.classList.add('sb-onboarding-active');
1175
1176 var step1El = document.querySelectorAll(".ctf-csz-header")[0];
1177 step1El.appendChild(document.getElementById("sb-onboarding-tooltip-customizer-1"));
1178
1179 var step2El = document.querySelectorAll(".sb-customizer-sidebar-sec1")[0];
1180 step2El.appendChild(document.getElementById("sb-onboarding-tooltip-customizer-2"));
1181
1182 var step3El = document.querySelectorAll(".sb-customizer-sidebar-sec1")[0];
1183 step3El.appendChild(document.getElementById("sb-onboarding-tooltip-customizer-3"));
1184
1185 self.onboardingHideShow();
1186 }
1187 } else if (self.viewsActive.onboardingPopup && !self.iscustomizerScreen) {
1188 if (ctf_builder.allFeedsScreen.onboarding.type === 'single') {
1189 if (document.getElementById("sb-onboarding-tooltip-single-1") !== null) {
1190 wrapElem.classList.add('sb-onboarding-active');
1191
1192 var step1El = document.querySelectorAll(".ctf-fb-wlcm-header .sb-positioning-wrap")[0];
1193 step1El.appendChild(document.getElementById("sb-onboarding-tooltip-single-1"));
1194
1195 var step2El = document.querySelectorAll(".ctf-table-wrap")[0];
1196 step2El.appendChild(document.getElementById("sb-onboarding-tooltip-single-2"));
1197 self.onboardingHideShow();
1198 }
1199 } else {
1200 if (document.getElementById("sb-onboarding-tooltip-multiple-1") !== null) {
1201 wrapElem.classList.add('sb-onboarding-active');
1202
1203 var step1El = document.querySelectorAll(".ctf-fb-wlcm-header .sb-positioning-wrap")[0];
1204 step1El.appendChild(document.getElementById("sb-onboarding-tooltip-multiple-1"));
1205
1206 var step2El = document.querySelectorAll(".ctf-fb-lgc-ctn")[0];
1207 step2El.appendChild(document.getElementById("sb-onboarding-tooltip-multiple-2"));
1208
1209 var step3El = document.querySelectorAll(".ctf-legacy-table-wrap")[0];
1210 step3El.appendChild(document.getElementById("sb-onboarding-tooltip-multiple-3"));
1211
1212 self.activateView('legacyFeedsShown');
1213 self.onboardingHideShow();
1214 }
1215 }
1216
1217 }
1218 },
1219 //Back Click in the Creation Process
1220 creationProcessBack : function(){
1221 var self = this;
1222 switch (self.viewsActive.selectedFeedSection) {
1223 case 'feedsType':
1224 self.switchScreen('pageScreen', 'welcome');
1225 break;
1226 case 'selectSource':
1227 self.switchScreen('selectedFeedSection', 'feedsType');
1228 break;
1229 case 'feedsTypeGetProcess':
1230 self.switchScreen('selectedFeedSection', 'selectSource');
1231 break;
1232 }
1233 ctfBuilder.$forceUpdate();
1234 },
1235
1236 //Return Feed Type
1237 getFeedTypeSaver : function(){
1238 var self = this;
1239 if(self.selectedFeed.length > 1){
1240 return 'mixed';
1241 }
1242 return self.selectedFeed[0];
1243 },
1244
1245
1246 //Create & Submit New Feed
1247 submitNewFeed : function(){
1248 var self = this,
1249 newFeedData = {
1250 action : 'ctf_feed_saver_manager_builder_update',
1251 selectedFeed : self.selectedFeed,
1252 selectedFeedModel : self.selectedFeedModel,
1253 feedtemplate : self.selectedFeedTemplate,
1254 new_insert : 'true',
1255 };
1256 self.fullScreenLoader = true;
1257 self.ajaxPost(newFeedData, function(_ref){
1258 var data = _ref.data;
1259 if(data.feed_id && data.success){
1260 window.location = self.builderUrl + '&feed_id=' + data.feed_id;
1261 }
1262 });
1263 },
1264
1265
1266 //Open Add Source List Popup
1267 openSourceListPopup : function( feedTypeID ){
1268 var self = this;
1269 self.feedTypeOnSourcePopup = feedTypeID;
1270 if( self.feedTypeOnSourcePopup == 'tagged' ){
1271 self.selectedSourcesPopup = self.createSourcesArray(self.selectedSourcesTagged);
1272 }else if( self.feedTypeOnSourcePopup == 'user' ){
1273 self.selectedSourcesPopup = self.createSourcesArray(self.selectedSourcesUser);
1274 }
1275 self.activateView('sourcesListPopup');
1276 if( self.customizerFeedData ){
1277 self.activateView('feedtypesCustomizerPopup');
1278 }
1279 },
1280
1281 //Check if source is Disabled POPUP
1282 checkSourceDisabledPopup : function(source){
1283 var self = this;
1284 return (source.account_type == 'personal' && self.feedTypeOnSourcePopup == 'tagged');
1285 },
1286
1287 //Source Active POPUP
1288 isSourceSelectActivePopup : function(source){
1289 var self = this;
1290 if(self.selectedSourcesPopup.includes(source.account_id)){
1291 return (source.account_type != 'personal' && self.feedTypeOnSourcePopup == 'tagged') || self.feedTypeOnSourcePopup == 'user';
1292 }
1293 return false;
1294 },
1295
1296 //Select Sources POPUP
1297 selectSourcePopup : function( source ){
1298 var self = this;
1299 if( (source.account_type != 'personal' && self.feedTypeOnSourcePopup == 'tagged') || self.feedTypeOnSourcePopup == 'user' ){
1300 if(self.selectedSourcesPopup.includes(source.account_id)){
1301 self.selectedSourcesPopup.splice(self.selectedSourcesPopup.indexOf(source.account_id), 1);
1302 }else{
1303 self.selectedSourcesPopup.push(source.account_id);
1304 }
1305 }
1306 },
1307
1308 //Return Choosed Feed Type
1309 returnSelectedSourcesByType : function( feedType ){
1310 var self = this,
1311 sourcesListByType = [];
1312 if( feedType == 'user' ){
1313 sourcesListByType = self.sourcesList.filter(function(source){
1314 return ( self.customizerFeedData ) ? self.selectedSourcesUserPopup.includes(source.account_id) : self.selectedSourcesUser.includes(source.account_id);
1315 });
1316 }else if( feedType == 'tagged' ){
1317 sourcesListByType = self.sourcesList.filter(function(source){
1318 return ( self.customizerFeedData ) ? self.selectedSourcesTaggedPopup.includes(source.account_id) : self.selectedSourcesTagged.includes(source.account_id);
1319 });
1320 }
1321 return sourcesListByType;
1322 },
1323
1324
1325
1326 /*
1327 Return Selected Sources / Hashtags
1328 on The Customizer Control
1329 */
1330 returnSelectedSourcesByTypeCustomizer : function( feedType ){
1331 var self = this;
1332 return feedType == 'lists' ? self.selectedFeedModel.listsObject : self.selectedFeedModel[feedType].split(',');
1333 },
1334
1335
1336 //Check if source are Array
1337 createSourcesArray : function( element ){
1338 if(Array.isArray(element) && element.length == 1 && !this.checkNotEmpty(element[0]) ){
1339 return [];
1340 }
1341 return Array.isArray(element) ? Array.from(element) : Array.from( element.split(',') );
1342 },
1343
1344 // Add Source to Feed Type
1345 addSourceToFeedType : function(){
1346 var self = this;
1347 if( self.feedTypeOnSourcePopup == 'tagged' ){
1348 if(!self.customizerFeedData){
1349 self.selectedSourcesTagged = self.createSourcesArray(self.selectedSourcesPopup);
1350 self.selectedSourcesTaggedPopup = self.createSourcesArray(self.selectedSourcesTagged);
1351 }else{
1352 self.selectedSourcesTaggedPopup = self.createSourcesArray(self.selectedSourcesPopup);
1353 }
1354 }else if( self.feedTypeOnSourcePopup == 'user' ){
1355 if(!self.customizerFeedData){
1356 self.selectedSourcesUser = self.createSourcesArray(self.selectedSourcesPopup);
1357 self.selectedSourcesUserPopup = self.createSourcesArray(self.selectedSourcesUser);
1358 }else{
1359 self.selectedSourcesUserPopup = self.createSourcesArray(self.selectedSourcesPopup);
1360 }
1361 }
1362 self.activateView('sourcesListPopup');
1363 if( self.customizerFeedData ){
1364 self.activateView('feedtypesCustomizerPopup');
1365 }
1366 },
1367
1368 //Detect Hashtag Writing
1369 hashtagWriteDetectPopup : function(isProcess = false){
1370 var self = this,
1371 target = window.event;
1372 if(target.keyCode == 188 || isProcess == true){
1373 self.hashtagInputText = self.hashtagInputText.replace(',','');
1374 if(self.checkNotEmpty(self.hashtagInputText)){
1375 if(self.hashtagInputText[0] !== '#'){
1376 self.hashtagInputText = '#' + self.hashtagInputText;
1377 }
1378 self.selectedHastagsPopup = self.createSourcesArray(self.selectedHastagsPopup);
1379 self.selectedHastagsPopup.push(self.hashtagInputText);
1380 }
1381 self.hashtagInputText = '';
1382 }
1383 },
1384
1385 //Detect Hashtag Writing
1386 hashtagWriteDetect : function(isProcess = false){
1387 var self = this,
1388 target = window.event;
1389 if(target.keyCode == 188 || isProcess == true){
1390 self.hashtagInputText = self.hashtagInputText.replace(',','');
1391 if(self.checkNotEmpty(self.hashtagInputText)){
1392 if(self.hashtagInputText[0] !== '#'){
1393 self.hashtagInputText = '#' + self.hashtagInputText;
1394 }
1395 self.selectedHastags = self.createSourcesArray(self.selectedHastags);
1396 self.selectedHastags.push(self.hashtagInputText);
1397 self.selectedHastagsPopup = self.createSourcesArray(self.selectedHastags);
1398 }
1399 self.hashtagInputText = '';
1400 }
1401 },
1402
1403 //Remove Hashtag from List
1404 removeHashtag : function(hashtag){
1405 var self = this;
1406 if( self.customizerFeedData ){
1407 self.selectedHastagsPopup.splice(self.selectedHastagsPopup.indexOf(hashtag), 1);
1408 }else{
1409 self.selectedHastags.splice(self.selectedHastags.indexOf(hashtag), 1);
1410 }
1411 },
1412
1413
1414
1415 processDomList : function(selector, attributes){
1416 document.querySelectorAll(selector).forEach( function(element) {
1417 attributes.map( function(attrName) {
1418 element.setAttribute(attrName[0], attrName[1]);
1419 });
1420 });
1421 },
1422 openTooltipBig : function(){
1423 var self = this, elem = window.event.currentTarget;
1424 self.processDomList('.ctf-fb-onbrd-tltp-elem', [['data-active', 'false']]);
1425 elem.querySelector('.ctf-fb-onbrd-tltp-elem').setAttribute('data-active', 'true');
1426 ctfBuilder.$forceUpdate();
1427 },
1428 closeTooltipBig : function(){
1429 var self = this;
1430 self.processDomList('.ctf-fb-onbrd-tltp-elem', [['data-active', 'false']]);
1431 window.event.stopPropagation();
1432 ctfBuilder.$forceUpdate();
1433 },
1434
1435 /*
1436 FEEDS List Actions
1437 */
1438
1439 /**
1440 * Switch Bulk Action
1441 *
1442 * @since 2.0
1443 */
1444 bulkActionClick : function(){
1445 var self = this;
1446 switch (self.selectedBulkAction) {
1447 case 'delete':
1448 if(self.feedsSelected.length > 0){
1449 self.openDialogBox('deleteMultipleFeeds')
1450 }
1451 break;
1452 }
1453 ctfBuilder.$forceUpdate();
1454 },
1455
1456 /**
1457 * Duplicate Feed
1458 *
1459 * @since 2.0
1460 */
1461 feedActionDuplicate : function(feed){
1462 var self = this,
1463 feedsDuplicateData = {
1464 action : 'ctf_feed_saver_manager_duplicate_feed',
1465 feed_id : feed.id
1466 };
1467 self.ajaxPost(feedsDuplicateData, function(_ref){
1468 var data = _ref.data;
1469 self.feedsList = Object.values(Object.assign({}, data));
1470 //self.feedsList = data;
1471 });
1472 ctfBuilder.$forceUpdate();
1473 },
1474
1475 /**
1476 * Delete Feed
1477 *
1478 * @since 2.0
1479 */
1480 feedActionDelete : function(feeds_ids, goBack = false){
1481 var self = this,
1482 feedsDeleteData = {
1483 action : 'ctf_feed_saver_manager_delete_feeds',
1484 feeds_ids : feeds_ids
1485 };
1486 self.ajaxPost(feedsDeleteData, function(_ref){
1487 var data = _ref.data;
1488 self.feedsList = Object.values(Object.assign({}, data));
1489 self.feedsSelected = [];
1490 if( goBack === true){
1491 window.location = self.builderUrl;
1492 }
1493 });
1494 },
1495
1496 /**
1497 * View Feed Instances
1498 *
1499 * @since 2.0
1500 */
1501 viewFeedInstances : function(feed){
1502 var self = this;
1503 self.viewsActive.instanceFeedActive = feed;
1504 self.movePopUp();
1505 ctfBuilder.$forceUpdate();
1506 },
1507
1508 /**
1509 * Select All Feeds in List
1510 *
1511 * @since 2.0
1512 */
1513 selectAllFeedCheckBox : function(){
1514 var self = this;
1515 if( !self.checkAllFeedsActive() ){
1516 self.feedsSelected = [];
1517 self.feedsList.forEach( function(feed) {
1518 self.feedsSelected.push(feed.id);
1519 });
1520 }else{
1521 self.feedsSelected = [];
1522 }
1523
1524 },
1525
1526 /**
1527 * Select Single Feed in List
1528 *
1529 * @since 2.0
1530 */
1531 selectFeedCheckBox : function(feedID){
1532 if(this.feedsSelected.includes(feedID)){
1533 this.feedsSelected.splice(this.feedsSelected.indexOf(feedID),1);
1534 }else{
1535 this.feedsSelected.push(feedID);
1536 }
1537 ctfBuilder.$forceUpdate();
1538 },
1539
1540 /**
1541 * Check if All Feeds are Selected
1542 *
1543 * @since 2.0
1544 */
1545 checkAllFeedsActive : function(){
1546 var self = this,
1547 result = true;
1548 self.feedsList.forEach( function(feed) {
1549 if(!self.feedsSelected.includes(feed.id)){
1550 result = false;
1551 }
1552 });
1553
1554 return result;
1555 },
1556
1557
1558 /**
1559 * Copy text to clipboard
1560 *
1561 * @since 2.0
1562 */
1563 copyToClipBoard : function(value){
1564 var self = this;
1565 const el = document.createElement('textarea');
1566 el.className = 'ctf-fb-cp-clpboard';
1567 el.value = value;
1568 document.body.appendChild(el);
1569 el.select();
1570 document.execCommand('copy');
1571 document.body.removeChild(el);
1572 self.notificationElement = {
1573 type : 'success',
1574 text : this.genericText.copiedClipboard,
1575 shown : "shown"
1576 };
1577 setTimeout(function(){
1578 self.notificationElement.shown = "hidden";
1579 }, 3000);
1580 ctfBuilder.$forceUpdate();
1581 },
1582
1583 /*-------------------------------------------
1584 CUSTOMIZER FUNCTIONS
1585 -------------------------------------------*/
1586 /**
1587 * HighLight Section
1588 *
1589 * @since 2.0
1590 */
1591 isSectionHighLighted : function(sectionName){
1592 var self = this;
1593 return (self.highLightedSection === sectionName || self.highLightedSection === 'all')
1594 },
1595
1596 /**
1597 * Enable HightLight Section
1598 *
1599 * @since 2.0
1600 */
1601 enableHighLightSection : function(sectionId){
1602 var self = this,
1603 listPostSection = ['customize_feedlayout', 'customize_colorscheme', 'customize_posts','post_style','individual_elements'],
1604 headerSection = ['customize_header'],
1605 likeBoxSection = ['customize_likebox'],
1606 loadeMoreSection = ['customize_loadmorebutton'],
1607 domBody = document.getElementsByTagName("body")[0];
1608
1609 domBody.classList.remove("no-overflow");
1610
1611 if( listPostSection.includes(sectionId) ){
1612 self.highLightedSection = 'postList';
1613 self.scrollToHighLightedSection("ctf-tweet-items");
1614 }else if( headerSection.includes(sectionId) ){
1615 self.highLightedSection = 'header';
1616 self.scrollToHighLightedSection("ctf-header");
1617 }else if( loadeMoreSection.includes(sectionId) ){
1618 self.highLightedSection = 'loadMore';
1619 self.scrollToHighLightedSection("ctf-more");
1620 }else{
1621 self.highLightedSection = 'all';
1622 domBody.classList.remove("no-overflow");
1623 }
1624 },
1625
1626
1627 /**
1628 * Scroll to Highlighted Section
1629 *
1630 * @since 2.0
1631 */
1632 scrollToHighLightedSection : function(sectionId){
1633 const element = document.getElementById(sectionId) !== undefined && document.getElementById(sectionId) !== null ?
1634 document.getElementById(sectionId) :
1635 ( document.getElementsByClassName(sectionId)[0] !== undefined && document.getElementsByClassName(sectionId)[0] !== null ? document.getElementsByClassName(sectionId)[0] : null );
1636
1637
1638 if(element != undefined && element != null){
1639 const y = element.getBoundingClientRect().top - 120 + window.pageYOffset - 10;
1640 window.scrollTo({top: y, behavior: 'smooth'});
1641 }
1642 },
1643
1644 /**
1645 * Enable & Show Color Picker
1646 *
1647 * @since 2.0
1648 */
1649 showColorPickerPospup : function(controlId){
1650 this.customizerScreens.activeColorPicker = controlId;
1651 },
1652
1653 /**
1654 * Hide Color Picker
1655 *
1656 * @since 2.0
1657 */
1658 hideColorPickerPospup : function(){
1659 this.customizerScreens.activeColorPicker = null;
1660 },
1661
1662 switchCustomizerPreviewDevice : function(previewScreen){
1663 var self = this;
1664 self.customizerScreens.previewScreen = previewScreen;
1665 self.loadingBar = true;
1666 setTimeout(function(){
1667 self.setShortcodeGlobalSettings(true);
1668 self.loadingBar = false;
1669 },200)
1670 ctfBuilder.$forceUpdate();
1671 },
1672 switchCustomizerTab : function(tabId){
1673 var self = this,
1674 domBody = document.getElementsByTagName("body")[0];
1675 self.customizerScreens.activeTab = tabId;
1676 self.customizerScreens.activeSection = null;
1677 self.customizerScreens.activeSectionData = null;
1678 self.highLightedSection = 'all';
1679 self.dummyLightBoxScreen = false;
1680 domBody.classList.remove("no-overflow");
1681 ctfBuilder.$forceUpdate();
1682 },
1683 switchCustomizerSection : function(sectionId, section, isNested = false, isBackElements){
1684 var self = this;
1685 self.customizerScreens.parentActiveSection = null;
1686 self.customizerScreens.parentActiveSectionData = null;
1687 if(isNested){
1688 self.customizerScreens.parentActiveSection = self.customizerScreens.activeSection;
1689 self.customizerScreens.parentActiveSectionData = self.customizerScreens.activeSectionData;
1690 }
1691 self.customizerScreens.activeSection = sectionId;
1692 self.customizerScreens.activeSectionData = section;
1693 if(!isBackElements){
1694 self.enableHighLightSection(sectionId);
1695 }
1696 ctfBuilder.$forceUpdate();
1697 },
1698 switchNestedSection : function(sectionId, section){
1699 var self = this;
1700 if(section !== null){
1701 self.customizerScreens.activeSection = sectionId;
1702 self.customizerScreens.activeSectionData = section;
1703 }else{
1704 var sectionArray = sectionId['sections'];
1705 var elementSectionData = self.customizerSidebarBuilder;
1706
1707 sectionArray.map(function(elm, index){
1708 elementSectionData = (elementSectionData[elm] != undefined && elementSectionData[elm] != null) ? elementSectionData[elm] : null;
1709 });
1710 if(elementSectionData != null){
1711 self.customizerScreens.activeSection = sectionId['id'];
1712 self.customizerScreens.activeSectionData = elementSectionData;
1713 }
1714 }
1715 ctfBuilder.$forceUpdate();
1716 },
1717 backToPostElements : function(){
1718 var self = this,
1719 individual_elements = self.customizerSidebarBuilder['customize'].sections.customize_posts.nested_sections.individual_elements;
1720 self.customizerScreens.activeSection = 'customize_posts';
1721 self.customizerScreens.activeSectionData= self.customizerSidebarBuilder['customize'].sections.customize_posts;
1722 self.switchCustomizerSection('individual_elements', individual_elements, true, true);
1723 ctfBuilder.$forceUpdate();
1724
1725 },
1726
1727 changeSettingValue : function(settingID, value, doProcess = true, ajaxAction = false) {
1728 var self = this;
1729 if(Object.keys(self.inActiveExtensions).includes(settingID)){
1730 self.viewsActive.extensionsPopupElement = self.inActiveExtensions[settingID];
1731 }else{
1732 if(doProcess){
1733 self.customizerFeedData.settings[settingID] = value;
1734 }
1735 if(ajaxAction !== false){
1736 self.customizerControlAjaxAction(ajaxAction, settingID);
1737 }
1738 if(settingID === 'num' && !self.checkNotEmpty(self.customizerFeedData.settings[settingID])){
1739 self.customizerFeedData.settings[settingID] = 1;
1740 }
1741 self.regenerateLayout(settingID);
1742 }
1743 },
1744
1745 //Shortcode Global Layout Settings
1746 regenerateLayout : function(settingID) {
1747 var self = this,
1748 regenerateFeedHTML = [
1749 'layout'
1750 ],
1751 relayoutFeed = [
1752 'layout',
1753 'masonrycols',
1754 'masonrytabletcols',
1755 'masonrymobilecols',
1756 ];
1757 if( relayoutFeed.includes( settingID ) ){
1758 setTimeout(function(){
1759 self.setShortcodeGlobalSettings(true);
1760 }, 10)
1761 }
1762
1763 },
1764
1765
1766 //Get Customizer Additional CSS Classes
1767 getAdditionalCustomizerClasses : function(){
1768 var self = this,
1769 additionalCssClasses = '';
1770 return additionalCssClasses;
1771 },
1772
1773 //Shortcode Global Layout Settings
1774 setShortcodeGlobalSettings : function(flyPreview = false){
1775 var self = this,
1776 customizerSettings = self.customizerFeedData.settings;
1777 if( flyPreview === true ){
1778 window.ctf_init()
1779 }
1780 jQuery('body').find('.ctf-tweet-media').click(function(event){
1781 if( !self.valueIsEnabled( self.customizerFeedData.settings.disablelightbox ) ){
1782 self.dummyLightBoxScreen = true;
1783 event.preventDefault();
1784 }
1785 })
1786 jQuery('body').find('.ctf-more').unbind('click')
1787 },
1788
1789 detroyCarousel : function(){
1790 var self = this,
1791 customizerSettings = self.customizerFeedData.settings;
1792 },
1793
1794
1795 //Get feed Containes Classes
1796 getFeedClasses : function(){
1797 var self = this,
1798 customizerSettings = self.customizerFeedData.settings,
1799 feedClasses = 'ctf';
1800 feedClasses += ' ctf-type-' + customizerSettings.type;
1801 feedClasses += ' ctf-' + customizerSettings.layout;
1802 feedClasses += self.ctfRebrand ? ' ctf-rebranded' : '';
1803 feedClasses += ' ctf-styles ' + customizerSettings.class;
1804 feedClasses += ' ctf-feed-' + self.customizerFeedData.feed_info.id;
1805 feedClasses += (customizerSettings.tweetpoststyle != undefined) ? ' ctf-' + customizerSettings.tweetpoststyle + '-style' : '';
1806 feedClasses += self.checkNotEmpty( customizerSettings.height ) && customizerSettings.height != 0 ? ' ctf-fixed-height' : '';
1807 feedClasses += self.valueIsEnabled( customizerSettings.autoscroll ) ? ' ctf-autoscroll' : '';
1808 feedClasses += self.valueIsEnabled( customizerSettings.persistentcache ) ? ' ctf-persistent' : '';
1809 feedClasses += customizerSettings.font_method === 'fontfile' ? ' ctf-fontfile' : '';
1810 if(customizerSettings.layout === 'masonry'){
1811 feedClasses += ' masonry-' + customizerSettings.masonrycols + '-desktop';
1812 feedClasses += ' masonry-' + customizerSettings.masonrytabletcols + '-tablet';
1813 feedClasses += ' masonry-' + customizerSettings.masonrymobilecols + '-mobile';
1814 }
1815 feedClasses += self.getPaletteClass();
1816
1817 return feedClasses;
1818 },
1819
1820 /**
1821 * Get Feed Preview Global CSS Class
1822 *
1823 * @since 2.0
1824 * @return String
1825 */
1826 getPaletteClass : function(context = ''){
1827 var self = this,
1828 colorPalette = self.customizerFeedData.settings.colorpalette;
1829
1830 if(self.checkNotEmpty( colorPalette )){
1831 var feedID = colorPalette === 'custom' ? ('_' + self.customizerFeedData.feed_info.id) : '';
1832 return colorPalette !== 'inherit' ? ' ctf' + context + '_palette_' + colorPalette + feedID : '';
1833 }
1834 return '';
1835 },
1836 //Get Number of Columns depending on the Preview Screen
1837 getColsPreviewScreen : function(){
1838 var self = this,
1839 customizerSettings = self.customizerFeedData.settings;
1840
1841 if(customizerSettings.layout === 'masonry' || customizerSettings.layout === 'carousel'){
1842 switch (self.customizerScreens.previewScreen) {
1843 case 'mobile':
1844 return customizerSettings.layout === 'masonry' ? customizerSettings.masonrymobilecols : customizerSettings.carouselmobilecols;
1845 break;
1846 case 'tablet':
1847 return customizerSettings.layout === 'masonry' ? customizerSettings.masonrytabletcols : customizerSettings.carouseltabletcols;
1848 break;
1849 default:
1850 return customizerSettings.layout === 'masonry' ? customizerSettings.masonrycols : customizerSettings.carouselcols;
1851 break;
1852 }
1853 }
1854 return false;
1855 },
1856
1857 //Tablet Cols Classes
1858 getTabletColsClass : function(){
1859 var self = this,
1860 customizerSettings = self.customizerFeedData.settings;
1861
1862 return ' ctf_tab_col_' + parseInt( customizerSettings.colstablet );
1863 },
1864
1865 //Mobile Cols Classes
1866 getMobileColsClass : function(){
1867 var self = this,
1868 customizerSettings = self.customizerFeedData.settings,
1869 disableMobile = self.valueIsEnabled( customizerSettings.disablemobile );
1870
1871 if(disableMobile === 'false') disableMobile = '';
1872
1873 if ( disableMobile !== ' ctf_disable_mobile' && customizerSettings.colsmobile !== 'same' ) {
1874 var colsmobile = parseInt( customizerSettings.colsmobile ) > 0 ? parseInt( customizerSettings.colsmobile ) : 'auto';
1875 return ' ctf_mob_col_' + colsmobile;
1876 }else{
1877 var colsmobile = parseInt( customizerSettings.cols ) > 0 ? parseInt( customizerSettings.cols ) : 4;
1878 return ' ctf_disable_mobile ctf_mob_col_' + parseInt( customizerSettings.cols );
1879
1880 }
1881 },
1882
1883 //Header Classes
1884 getHeaderClass : function( headerType ){
1885 var self = this,
1886 customizerSettings = self.customizerFeedData.settings,
1887 headerClasses = 'sb_instagram_header ';
1888
1889 headerClasses += 'ctf_feed_type_'+ customizerSettings['type'];
1890 headerClasses += customizerSettings['headerstyle'] === 'centered' && headerType === 'normal' ? ' ctf_centered' : '';
1891 headerClasses += ['medium', 'large'].includes(customizerSettings['headersize']) ? ' ctf_' + customizerSettings['headersize'] : '';
1892 headerClasses += headerType === 'boxed' ? ' ctf_header_style_boxed' : '';
1893 headerClasses += self.getHeaderAvatar() === false ? ' ctf_no_avatar' : '';
1894 headerClasses += self.getPaletteClass('_header');
1895 return headerClasses;
1896 },
1897
1898 //Header Name
1899 getHeaderName : function(){
1900 var self = this,
1901 headerData = self.customizerFeedData.headerData;
1902 if( self.hasOwnNestedProperty(headerData, 'name') && self.checkNotEmpty( headerData['name'] ) ){
1903 return headerData['name'];
1904 }else if( self.hasOwnNestedProperty(headerData, 'data.full_name') ){
1905 return headerData['data']['full_name'];
1906 }
1907 return self.getHeaderUserName();
1908 },
1909
1910 //Header User Name
1911 getHeaderUserName : function(){
1912 var self = this,
1913 headerData = self.customizerFeedData.headerData;
1914 if( self.hasOwnNestedProperty(headerData, 'username') && self.checkNotEmpty( headerData['username'] ) ){
1915 return headerData['username'];
1916 }else if( self.hasOwnNestedProperty(headerData, 'user.username') ){
1917 return headerData['user']['username'];
1918 }else if( self.hasOwnNestedProperty(headerData, 'data.username') ){
1919 return headerData['data']['username'];
1920 }
1921 return '';
1922 },
1923
1924 //Header Media Count
1925 getHeaderMediaCount : function(){
1926 var self = this,
1927 headerData = self.customizerFeedData.headerData;
1928 if( self.hasOwnNestedProperty(headerData, 'data.counts.media') ){
1929 return headerData['data']['counts']['media'];
1930 }else if( self.hasOwnNestedProperty(headerData, 'counts.media') ){
1931 return headerData['counts']['media'];
1932 }else if( self.hasOwnNestedProperty(headerData, 'media_count') ){
1933 return headerData['media_count'];
1934 }
1935 return '';
1936 },
1937
1938 //Header Followers Count
1939 getHeaderFollowersCount : function(){
1940 var self = this,
1941 headerData = self.customizerFeedData.headerData;
1942 if( self.hasOwnNestedProperty(headerData, 'data.counts.followed_by') ){
1943 return headerData['data']['counts']['followed_by'];
1944 }else if( self.hasOwnNestedProperty(headerData, 'counts.followed_by') ){
1945 return headerData['counts']['followed_by'];
1946 }else if( self.hasOwnNestedProperty(headerData, 'followers_count') ){
1947 return headerData['followers_count'];
1948 }
1949 return '';
1950 },
1951
1952 //Header Avatar
1953 getHeaderAvatar : function(){
1954 var self = this,
1955 customizerSettings = self.customizerFeedData.settings,
1956 headerData = self.customizerFeedData.headerData,
1957 header = self.customizerFeedData.header;
1958 if( self.checkNotEmpty( customizerSettings['customavatar'] ) ){
1959 return customizerSettings['customavatar'];
1960 }else if( headerData['local_avatar'] != false && self.checkNotEmpty( headerData['local_avatar'] ) ){
1961 return headerData['local_avatar'];
1962 }else if( header['local_avatar_url'] != false && self.checkNotEmpty( header['local_avatar_url'] ) ){
1963 return header['local_avatar_url'];
1964 }else{
1965 if( self.hasOwnNestedProperty(headerData, 'profile_picture') ){
1966 return headerData['profile_picture'];
1967 }else if( self.hasOwnNestedProperty(headerData, 'profile_picture_url') ){
1968 return headerData['profile_picture_url'];
1969 }else if( self.hasOwnNestedProperty(headerData, 'user.profile_picture') ){
1970 return headerData['user']['profile_picture'];
1971 }else if( self.hasOwnNestedProperty(headerData, 'data.profile_picture') ){
1972 return headerData['data']['profile_picture'];
1973 }
1974 }
1975 return false;
1976 },
1977
1978 //Header Bio
1979 getHeaderBio : function(){
1980 var self = this,
1981 customizerSettings = self.customizerFeedData.settings,
1982 headerData = self.customizerFeedData.headerData;
1983
1984 if( self.checkNotEmpty( customizerSettings['custombio'] ) ){
1985 return customizerSettings['custombio'];
1986 }else if( self.hasOwnNestedProperty(headerData, 'data.bio') ){
1987 return headerData['data']['bio'];
1988 }else if( self.hasOwnNestedProperty(headerData, 'bio') ){
1989 return headerData['bio'];
1990 }else if( self.hasOwnNestedProperty(headerData, 'biography') ){
1991 return headerData['biography'];
1992 }
1993 return '';
1994 },
1995
1996
1997 //Header Text Class
1998 getTextHeaderClass : function(){
1999 var self = this,
2000 customizerSettings = self.customizerFeedData.settings,
2001 headerData = self.customizerFeedData.headerData,
2002 headerClass = 'ctf_header_text ',
2003 shouldShowBio = self.checkNotEmpty( self.getHeaderBio() ) ? self.valueIsEnabled( customizerSettings['showbio'] ) : false,
2004 shouldShowInfo = shouldShowBio || self.valueIsEnabled( customizerSettings['showfollowers'] );
2005 headerClass += !shouldShowBio ? 'ctf_no_bio ' : '',
2006 headerClass += !shouldShowInfo ? 'ctf_no_info' : '';
2007
2008 return headerClass;
2009 },
2010
2011 //Get Story Delays
2012 getStoryDelays : function(){
2013 var self = this,
2014 customizerSettings = self.customizerFeedData.settings;
2015 return self.checkNotEmpty( customizerSettings['storiestime'] ) ? Math.max( 500, parseInt( customizerSettings['storiestime']) ) : 5000;
2016 },
2017
2018 //Get Story Data
2019 getStoryData : function(){
2020 var self = this,
2021 customizerSettings = self.customizerFeedData.settings,
2022 headerData = self.customizerFeedData.headerData;
2023 if( self.hasOwnNestedProperty(headerData, 'stories') && headerData.stories.length > 0 && self.valueIsEnabled( customizerSettings['stories'] ) ){
2024 return headerData['stories'];
2025 }
2026 return false;
2027 },
2028
2029
2030 //Image Chooser
2031 imageChooser : function( settingID ){
2032 var self = this;
2033 var uploader = wp.media({
2034 frame : 'post',
2035 title : 'Media Uploader',
2036 button:{text : 'Choose Media'},
2037 library: {type: 'image'},
2038 multiple: false
2039 }).on('close',function() {
2040 var selection = uploader.state().get('selection');
2041 if(selection.length != 0){
2042 attachment = selection.first().toJSON();
2043 self.customizerFeedData.settings[settingID] = attachment.url;
2044 }
2045 }).open();
2046 },
2047
2048 //Change Switcher Settings
2049 changeSwitcherSettingValue : function(settingID, onValue, offValue, ajaxAction = false) {
2050 var self = this;
2051 self.customizerFeedData.settings[settingID] = self.customizerFeedData.settings[settingID] == onValue ? offValue : onValue;
2052 if(ajaxAction !== false){
2053 self.customizerControlAjaxAction(ajaxAction);
2054 }
2055 self.regenerateLayout(settingID);
2056 },
2057
2058 //Checkbox List
2059 changeCheckboxListValue : function(settingID, value, ajaxAction = false){
2060 var self = this,
2061 settingValue = self.customizerFeedData.settings[settingID].split(',');
2062 if(!Array.isArray(settingValue)){
2063 settingValue = [settingValue];
2064 }
2065 if(settingValue.includes(value)){
2066 settingValue.splice(settingValue.indexOf(value),1);
2067 }else{
2068 settingValue.push(value);
2069 }
2070 self.customizerFeedData.settings[settingID] = settingValue.join(',');
2071 },
2072
2073
2074 //Section Checkbox
2075 changeCheckboxSectionValue : function(settingID, value, ajaxAction = false, checkBoxAction = false){
2076 var self = this;
2077 if(checkBoxAction !== false){
2078 self.customizerFeedData.settings[settingID] = self.customizerFeedData.settings[settingID] == checkBoxAction.options.enabled ? checkBoxAction.options.disabled : checkBoxAction.options.enabled;
2079 }else{
2080 var settingValue = self.customizerFeedData.settings[settingID];
2081 if(!Array.isArray(settingValue) && settingID == 'type'){
2082 settingValue = [settingValue];
2083 }
2084 if(settingValue.includes(value)){
2085 settingValue.splice(settingValue.indexOf(value),1);
2086 }else{
2087 settingValue.push(value);
2088 }
2089 if(settingID == 'type'){
2090 self.processFeedTypesSources( settingValue );
2091 }
2092 //settingValue = (settingValue.length == 1 && settingID == 'type') ? settingValue[0] : settingValue;
2093 self.customizerFeedData.settings[settingID] = settingValue;
2094 }
2095
2096 if(ajaxAction !== false){
2097 self.customizerControlAjaxAction(ajaxAction);
2098 }
2099 event.stopPropagation()
2100
2101 },
2102 checkboxSectionValueExists : function(settingID, value){
2103 var self = this;
2104 var settingValue = self.customizerFeedData.settings[settingID];
2105 return settingValue.includes(value) ? true : false;
2106 },
2107
2108 /**
2109 * Check Control Condition
2110 *
2111 * @since 2.0
2112 */
2113 checkControlCondition : function(conditionsArray = [], checkExtensionActive = false, checkExtensionActiveDimmed = false){
2114 var self = this,
2115 isConditionTrue = 0;
2116 Object.keys(conditionsArray).map(function(condition, index){
2117 if(conditionsArray[condition].indexOf(self.customizerFeedData.settings[condition]) !== -1)
2118 isConditionTrue += 1
2119 });
2120 var extensionCondition = checkExtensionActive != undefined && checkExtensionActive != false ? self.checkExtensionActive(checkExtensionActive) : true,
2121 extensionCondition = checkExtensionActiveDimmed != undefined && checkExtensionActiveDimmed != false && !self.checkExtensionActive(checkExtensionActiveDimmed) ? false : extensionCondition;
2122
2123 return (isConditionTrue == Object.keys(conditionsArray).length) ? ( extensionCondition ) : false;
2124 },
2125
2126 /**
2127 * Check Color Override Condition
2128 *
2129 * @since 2.0
2130 */
2131 checkControlOverrideColor : function(overrideConditionsArray = []){
2132 var self = this,
2133 isConditionTrue = 0;
2134 overrideConditionsArray.map(function(condition, index){
2135 if(self.checkNotEmpty(self.customizerFeedData.settings[condition]) && self.customizerFeedData.settings[condition].replace(/ /gi,'') != '#'){
2136 isConditionTrue += 1
2137 }
2138 });
2139 return (isConditionTrue >= 1) ? true : false;
2140 },
2141
2142 /**
2143 * Show Control
2144 *
2145 * @since 2.0
2146 */
2147 isControlShown : function( control ){
2148 var self = this;
2149 if( control.checkViewDisabled != undefined ){
2150 return !self.viewsActive[control.checkViewDisabled];
2151 }
2152 if( control.checkView != undefined ){
2153 return !self.viewsActive[control.checkView];
2154 }
2155
2156 if(control.checkExtension != undefined && control.checkExtension != false && !self.checkExtensionActive(control.checkExtension)){
2157 return self.checkExtensionActive(control.checkExtension);
2158 }
2159
2160 if(control.conditionDimmed != undefined && self.checkControlCondition(control.conditionDimmed) )
2161 return self.checkControlCondition(control.conditionDimmed);
2162 if(control.overrideColorCondition != undefined){
2163 return self.checkControlOverrideColor( control.overrideColorCondition );
2164 }
2165
2166 return ( control.conditionHide != undefined && control.condition != undefined || control.checkExtension != undefined )
2167 ? self.checkControlCondition(control.condition, control.checkExtension)
2168 : true;
2169 },
2170
2171 checkExtensionActive : function(extension){
2172 var self = this;
2173 return self.activeExtensions[extension];
2174 },
2175
2176 expandSourceInfo : function(sourceId){
2177 var self = this;
2178 self.customizerScreens.sourceExpanded = (self.customizerScreens.sourceExpanded === sourceId) ? null : sourceId;
2179 window.event.stopPropagation()
2180 },
2181
2182 resetColor: function(controlId){
2183 this.customizerFeedData.settings[controlId] = '';
2184 },
2185
2186 //Source Active Customizer
2187 isSourceActiveCustomizer : function(source){
2188 var self = this;
2189 return (
2190 Array.isArray(self.customizerFeedData.settings.sources.map) ||
2191 self.customizerFeedData.settings.sources instanceof Object
2192 ) &&
2193 self.customizerScreens.sourcesChoosed.map(s => s.account_id).includes(source.account_id);
2194 //self.customizerFeedData.settings.sources.map(s => s.account_id).includes(source.account_id);
2195 },
2196 //Choose Source From Customizer
2197 selectSourceCustomizer : function(source, isRemove = false){
2198 var self = this,
2199 isMultifeed = (self.activeExtensions['multifeed'] !== undefined && self.activeExtensions['multifeed'] == true),
2200 sourcesListMap = Array.isArray(self.customizerFeedData.settings.sources) || self.customizerFeedData.settings.sources instanceof Object ? self.customizerFeedData.settings.sources.map(s => s.account_id) : [];
2201 if(isMultifeed){
2202 if(self.customizerScreens.sourcesChoosed.map(s => s.account_id).includes(source.account_id)){
2203 var indexToRemove = self.customizerScreens.sourcesChoosed.findIndex(src => src.account_id === source.account_id);
2204 self.customizerScreens.sourcesChoosed.splice(indexToRemove, 1);
2205 if(isRemove){
2206 self.customizerFeedData.settings.sources.splice(indexToRemove, 1);
2207 }
2208 }else{
2209 self.customizerScreens.sourcesChoosed.push(source);
2210 }
2211 }else{
2212 self.customizerScreens.sourcesChoosed = (sourcesListMap.includes(source)) ? [] : [source];
2213 }
2214 ctfBuilder.$forceUpdate();
2215 },
2216 closeSourceCustomizer : function(){
2217 var self = this;
2218 self.viewsActive['sourcePopup'] = false;
2219 //self.customizerFeedData.settings.sources = self.customizerScreens.sourcesChoosed;
2220 ctfBuilder.$forceUpdate();
2221 },
2222 customizerFeedTypePrint : function(){
2223 var self = this,
2224 combinedTypes = self.feedTypes.concat(self.advancedFeedTypes);
2225 result = combinedTypes.filter(function(tp){
2226 return tp.type === self.customizerFeedData.settings.feedtype
2227 });
2228 self.customizerScreens.printedType = result.length > 0 ? result[0] : [];
2229 return result.length > 0 ? true : false;
2230 },
2231 choosedFeedTypeCustomizer : function(feedType){
2232 var self = this, result = false;
2233 if(
2234 (self.viewsActive.feedTypeElement === null && self.customizerFeedData.settings.feedtype === feedType) ||
2235 (self.viewsActive.feedTypeElement !== null && self.viewsActive.feedTypeElement == feedType)
2236 ){
2237 result = true;
2238 }
2239 return result;
2240 },
2241 choosedFeedTemplateCustomizer : function(feedtemplate){
2242 var self = this, result = false;
2243 if(
2244 (self.viewsActive.feedTemplateElement === null && self.customizerFeedData.settings.feedtemplate === feedtemplate) ||
2245 (self.viewsActive.feedTemplateElement !== null && self.viewsActive.feedTemplateElement == feedtemplate)
2246 ){
2247 result = true;
2248 }
2249 return result;
2250 },
2251 updateFeedTypeCustomizer : function(){
2252 var self = this;
2253 if (self.viewsActive.feedTypeElement === 'socialwall') {
2254 window.location.href = ctf_builder.pluginsInfo.social_wall.settingsPage;
2255 return;
2256 }
2257 self.setType( self.viewsActive.feedTypeElement );
2258
2259 self.customizerFeedData.settings.feedtype = self.viewsActive.feedTypeElement;
2260 self.viewsActive.feedTypeElement = null;
2261 self.viewsActive.feedtypesPopup = false;
2262 self.customizerControlAjaxAction('feedFlyPreview');
2263 ctfBuilder.$forceUpdate();
2264 },
2265 updateInputWidth : function(){
2266 this.customizerScreens.inputNameWidth = ((document.getElementById("ctf-csz-hd-input").value.length + 6) * 8) + 'px';
2267 },
2268
2269 updateFeedTemplateCustomizer : function(){
2270 var self = this;
2271 self.customizerFeedData.settings.feedtemplate = self.viewsActive.feedTemplateElement != null ? self.viewsActive.feedTemplateElement : self.customizerFeedData.settings.feedtemplate;
2272 self.viewsActive.feedTemplateElement = null;
2273 self.viewsActive.feedtemplatesPopup = false;
2274 self.customizerControlAjaxAction('feedTemplateFlyPreview');
2275 ctfBuilder.$forceUpdate();
2276 },
2277
2278 customizerFeedTemplatePrint : function(){
2279 var self = this;
2280 result = self.feedTemplates.filter(function(tp){
2281 return tp.type === self.customizerFeedData.settings.feedtemplate
2282 });
2283 self.customizerScreens.printedTemplate = result.length > 0 ? result[0] : [];
2284 return result.length > 0 ? true : false;
2285 },
2286
2287
2288 feedPreviewMaker : function(){
2289 var self = this;
2290 return self.template;
2291 //return self.template == null ? null : "<div>" + self.template + "</div>";
2292 },
2293
2294 customizerStyleMaker : function(){
2295 var self = this;
2296 if(self.customizerSidebarBuilder){
2297 self.feedStyle = '';
2298 Object.values(self.customizerSidebarBuilder).map( function(tab) {
2299 self.customizerSectionStyle(tab.sections);
2300 });
2301 return '<style type="text/css">' + self.feedStyle + '</style>';
2302 }
2303 return false;
2304 },
2305
2306 customizerSectionStyle : function(sections){
2307 var self = this;
2308 Object.values(sections).map(function(section){
2309 if(section.controls){
2310 Object.values(section.controls).map(function(control){
2311 self.returnControlStyle(control);
2312 });
2313 }
2314 if(section.nested_sections){
2315 self.customizerSectionStyle(section.nested_sections);
2316 Object.values(section.nested_sections).map(function(nestedSections){
2317 Object.values(nestedSections.controls).map(function(nestedControl){
2318 if(nestedControl.section){
2319 self.customizerSectionStyle(nestedControl);
2320 }
2321 });
2322 });
2323 }
2324 });
2325 },
2326 returnControlStyle : function( control ){
2327 var self = this;
2328 if(control.style){
2329 Object.entries(control.style).map( function(css) {
2330 var condition = control.condition != undefined || control.checkExtension != undefined ? self.checkControlCondition(control.condition, control.checkExtension) : true;
2331 if( condition ){
2332 self.feedStyle +=
2333 css[0] + '{' +
2334 css[1].replace("{{value}}", self.customizerFeedData.settings[control.id]) +
2335 '}';
2336 }
2337 });
2338 }
2339 },
2340
2341
2342
2343
2344 /**
2345 * Customizer Control Ajax
2346 * Some of the customizer controls need to perform Ajax
2347 * Calls in order to update the preview
2348 *
2349 * @since 2.0
2350 */
2351 customizerControlAjaxAction : function( actionType, settingID = false ){
2352 var self = this;
2353 switch (actionType) {
2354 case 'feedFlyPreview':
2355 self.loadingBar = true;
2356 self.templateRender = false;
2357 var previewFeedData = {
2358 action : 'ctf_feed_saver_manager_fly_preview',
2359 feedID : self.customizerFeedData.feed_info.id,
2360 previewSettings : self.customizerFeedData.settings,
2361 feedName : self.customizerFeedData.feed_info.feed_name,
2362 };
2363 self.ajaxPost(previewFeedData, function(_ref){
2364 var data = _ref.data;
2365 if( data !== false ){
2366 self.updatedTimeStamp = new Date().getTime();
2367 self.template = String("<div>"+data.feed_html+"</div>");
2368 self.processNotification("previewUpdated");
2369 }else{
2370 self.processNotification("unkownError");
2371 }
2372 jQuery('body').find('.ctf-more').unbind('click')
2373 });
2374 break;
2375 case 'feedTemplateFlyPreview':
2376 self.loadingBar = true;
2377 self.templateRender = false;
2378 var previewFeedData = {
2379 action : 'ctf_feed_saver_manager_fly_preview',
2380 feedID : self.customizerFeedData.feed_info.id,
2381 previewSettings : self.customizerFeedData.settings,
2382 feedName : self.customizerFeedData.feed_info.feed_name,
2383 isFeedTemplatesPopup : true,
2384 };
2385 self.ajaxPost(previewFeedData, function(_ref){
2386 var data = _ref.data;
2387 if( data !== false ){
2388 self.customizerFeedData.settings = data.customizerDataSettings;
2389 self.updatedTimeStamp = new Date().getTime();
2390 self.template = String("<div>"+data.feed_html+"</div>");
2391 self.processNotification("previewUpdated");
2392 setTimeout(function(){
2393 self.setShortcodeGlobalSettings(true)
2394 }, 500)
2395 }else{
2396 self.processNotification("unkownError");
2397 }
2398 });
2399 break;
2400 case 'feedPreviewRender':
2401 setTimeout(function(){
2402 }, 150);
2403 break;
2404 }
2405 },
2406
2407
2408 /**
2409 * Ajax Action : Save Feed Settings
2410 *
2411 * @since 2.0
2412 */
2413 saveFeedSettings : function(){
2414 var self = this,
2415 sources = [],
2416 updateFeedData = {
2417 action : 'ctf_feed_saver_manager_builder_update',
2418 update_feed : 'true',
2419 feed_id : self.customizerFeedData.feed_info.id,
2420 feed_name : self.customizerFeedData.feed_info.feed_name,
2421 settings : self.customizerFeedData.settings,
2422 selectedFeed : self.selectedFeed,
2423 selectedFeedModel : self.selectedFeedModel,
2424 type : self.getFeedTypeSaver(),
2425
2426 };
2427 self.loadingBar = true;
2428 self.ajaxPost(updateFeedData, function(_ref){
2429 var data = _ref.data;
2430 if(data && data.success === true){
2431 self.processNotification('feedSaved');
2432 self.customizerFeedDataInitial = self.customizerFeedData;
2433 }else{
2434 self.processNotification('feedSavedError');
2435 }
2436 });
2437 ctfBuilder.$forceUpdate();
2438 },
2439
2440 /**
2441 * Ajax Action : Clear Single Feed Cache
2442 * Update Feed Preview Too
2443 * @since 2.0
2444 */
2445 clearSingleFeedCache : function(){
2446 var self = this,
2447 sources = [],
2448 clearFeedData = {
2449 action : 'ctf_feed_saver_manager_clear_single_feed_cache',
2450 feedID : self.customizerFeedData.feed_info.id,
2451 previewSettings : self.customizerFeedData.settings,
2452 };
2453 self.loadingBar = true;
2454 self.ajaxPost(clearFeedData, function(_ref){
2455 var data = _ref.data;
2456 if( data !== false ){
2457
2458 self.processNotification('cacheCleared');
2459 }else{
2460 self.processNotification("unkownError");
2461 }
2462 })
2463 ctfBuilder.$forceUpdate();
2464 },
2465
2466 /**
2467 * Clear & Reset Color Override
2468 *
2469 * @since 2.0
2470 */
2471 resetColorOverride : function(settingID){
2472 this.customizerFeedData.settings[settingID] = '';
2473 },
2474
2475 /**
2476 * Remove Source Form List Multifeed
2477 *
2478 * @since 2.0
2479 */
2480 removeSourceCustomizer : function(type, args = []){
2481 var self = this;
2482 Object.assign(self.customizerScreens.sourcesChoosed,self.customizerFeedData.settings.sources);
2483 self.selectSourceCustomizer(args, true);
2484 ctfBuilder.$forceUpdate();
2485 window.event.stopPropagation();
2486 },
2487
2488 /**
2489 * Custom Flied CLick
2490 * Action
2491 * @since 2.0
2492 */
2493 fieldCustomClickAction : function( clickAction ){
2494 var self = this;
2495 switch (clickAction) {
2496 case 'clearCommentCache':
2497 self.clearCommentCache();
2498 break;
2499 }
2500 },
2501
2502 /**
2503 * Clear Comment Cache
2504 * Action
2505 * @since 2.0
2506 */
2507 clearCommentCache : function(){
2508 var self = this;
2509 self.loadingBar = true;
2510 var clearCommentCacheData = {
2511 action : 'ctf_feed_saver_manager_clear_comments_cache',
2512 };
2513 self.ajaxPost(clearCommentCacheData, function(_ref){
2514 var data = _ref.data;
2515 if( data === 'success' ){
2516 self.processNotification("commentCacheCleared");
2517 }else{
2518 self.processNotification("unkownError");
2519 }
2520 });
2521 },
2522
2523
2524 /**
2525 * Open Dialog Box
2526 *
2527 * @since 2.0
2528 */
2529 openDialogBox : function(type, args = []){
2530 var self = this,
2531 icon = self.dialogBoxPopupScreen[type].icon,
2532 heading = self.dialogBoxPopupScreen[type].heading,
2533 description = self.dialogBoxPopupScreen[type].description,
2534 customButtons = self.dialogBoxPopupScreen[type].customButtons;
2535 switch (type) {
2536 case "deleteSourceCustomizer":
2537 self.sourceToDelete = args;
2538 heading = heading.replace("#", self.sourceToDelete.username);
2539 break;
2540 case "deleteSingleFeed":
2541 self.feedToDelete = args;
2542 heading = heading.replace("#", self.feedToDelete.feed_name);
2543 break;
2544 }
2545 self.dialogBox = {
2546 active : true,
2547 type : type,
2548 icon : icon,
2549 heading : heading,
2550 description : description,
2551 customButtons : customButtons
2552 };
2553 window.event.stopPropagation();
2554 },
2555
2556 /**
2557 * Confirm Dialog Box Actions
2558 *
2559 * @since 2.0
2560 */
2561 confirmDialogAction : function(){
2562 var self = this;
2563 switch (self.dialogBox.type) {
2564 case 'deleteSourceCustomizer':
2565 self.selectSourceCustomizer(self.sourceToDelete, true);
2566 self.customizerControlAjaxAction('feedFlyPreview');
2567 break;
2568 case 'deleteSingleFeed':
2569 self.feedActionDelete([self.feedToDelete.id]);
2570 break;
2571 case 'deleteMultipleFeeds':
2572 self.feedActionDelete(self.feedsSelected);
2573 break;
2574 case 'backAllToFeed':
2575 window.location = self.builderUrl;
2576 break;
2577 case 'unsavedFeedSources':
2578 self.updateFeedTypeAndSourcesCustomizer();
2579 break;
2580 case 'createMoreFeeds' :
2581 window.open('https://smashballoon.com/custom-twitter-feeds/twitter-lite-upgrade/?utm_campaign=twitter-free&utm_source=settings-builder&utm_medium=multiple-feeds&utm_content=AddNew')
2582 break;
2583 }
2584 },
2585
2586 /*
2587 closeConfirmDialog : function(){
2588 this.sourceToDelete = {};
2589 this.feedToDelete = {};
2590 this.dialogBox = {
2591 active : false,
2592 type : null,
2593 heading : null,
2594 description : null
2595 };
2596 },
2597 */
2598
2599 /**
2600 * Show Tooltip on Hover
2601 *
2602 * @since 2.0
2603 */
2604 toggleElementTooltip : function(tooltipText, type, align = 'center'){
2605 var self = this,
2606 target = window.event.currentTarget,
2607 tooltip = (target != undefined && target != null) ? document.querySelector('.sb-control-elem-tltp-content') : null;
2608 if(tooltip != null && type == 'show'){
2609 self.tooltip.text = tooltipText;
2610 var position = target.getBoundingClientRect(),
2611 left = position.left + 10,
2612 top = position.top - 10;
2613 tooltip.style.left = left + 'px';
2614 tooltip.style.top = top + 'px';
2615 tooltip.style.textAlign = align;
2616 self.tooltip.hover = true;
2617 }
2618 if(type == 'hide'){
2619 setTimeout(function(){
2620 if(self.tooltip.hoverType != 'inside'){
2621 self.tooltip.hover = false;
2622 }
2623 }, 200)
2624 }
2625 },
2626
2627 /**
2628 * Hover Tooltip
2629 *
2630 * @since 2.0
2631 */
2632 hoverTooltip : function(type, hoverType){
2633 this.tooltip.hover = type;
2634 this.tooltip.hoverType = hoverType;
2635 },
2636
2637 /**
2638 * Print Post Text
2639 *
2640 * @since 2.0
2641 */
2642 getPostText : function( postText, postID ){
2643 var self = this,
2644 customizerSettings = self.customizerFeedData.settings;
2645 postText = postText.replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/&lt;br&gt;|&lt;br \/&gt;/g, '<br>');
2646 if( self.checkNotEmpty(customizerSettings.textlength) ){
2647 return ( self.expandedCaptions.includes(postID) ? postText : postText.substring( 0, parseInt(customizerSettings.textlength) ) ) +
2648 ( postText.length > parseInt( customizerSettings.textlength ) ? ('<a href="#" class="ctf_more" onclick="ctfBuilderToggleCaption('+postID+')">...</a>') : '');
2649 }
2650 var textLength = !self.checkNotEmpty(customizerSettings.textlength) ? 50 : parseInt(customizerSettings.textlength);
2651 return postText.substring( 0, textLength);
2652 },
2653
2654 /**
2655 * Loading Bar & Notification
2656 *
2657 * @since 2.0
2658 */
2659 processNotification : function( notificationType ){
2660 var self = this,
2661 notification = self.genericText.notification[ notificationType ];
2662 self.loadingBar = false;
2663 self.notificationElement = {
2664 type : notification.type,
2665 text : notification.text,
2666 shown : "shown"
2667 };
2668 setTimeout(function(){
2669 self.notificationElement.shown = "hidden";
2670 }, 5000);
2671 },
2672
2673 checkManualEmpty : function(){
2674 var self = this;
2675 return self.checkNotEmpty(self.appCredentials.access_token) && self.checkNotEmpty(self.appCredentials.access_token_secret);
2676 },
2677
2678 closeConnectAccountPopup : function(){
2679 var self = this;
2680 self.appCredentials = {
2681 app_name : '',
2682 consumer_key : '',
2683 consumer_secret : '',
2684 access_token : '',
2685 access_token_secret : ''
2686 };
2687 self.viewsActive.connectAccountPopup = false;
2688 },
2689
2690 /**
2691 * Connect Twitter Account Manually
2692 *
2693 * @since 2.0
2694 */
2695 connectManualAccount : function(){
2696 var self = this;
2697 if( self.checkManualEmpty() ){
2698 self.loadingAjax = true;
2699 var connectManualAccountData = {
2700 action : 'ctf_feed_saver_manager_connect_manual_account',
2701 app_name : self.appCredentials.app_name,
2702 consumer_key : self.appCredentials.consumer_key,
2703 consumer_secret : self.appCredentials.consumer_secret,
2704 access_token : self.appCredentials.access_token,
2705 access_token_secret : self.appCredentials.access_token_secret
2706 };
2707 self.ajaxPost(connectManualAccountData, function(_ref){
2708 var data = _ref.data;
2709 if(data['error'] === undefined){
2710 self.accountDetails = data;
2711 self.manualAccountResp = 'success';
2712 setTimeout(function(){
2713 self.viewsActive['connectAccountPopup'] = false;
2714 self.manualAccountResp = false;
2715 }, 1000)
2716 }else{
2717 self.manualAccountResp = 'error';
2718 setTimeout(function(){
2719 self.manualAccountResp = false;
2720 }, 3000)
2721 }
2722 self.loadingAjax = false;
2723 });
2724 }
2725 },
2726
2727 /**
2728 * Add List ID to LISTS
2729 * This Will Perform and Ajax Call to see if the List Does Exist
2730 *
2731 * @since 2.0
2732 */
2733 addListIdtoList : function(){
2734
2735 },
2736
2737 /**
2738 * Search Lists By UserName
2739 *
2740 * @since 2.0
2741 */
2742 searchUserNameList : function(){
2743 var self = this,
2744 searchUserNameListsData = {
2745 action : 'ctf_feed_saver_manager_search_username_lists',
2746 listUserNameInputModel : self.listUserNameInputModel,
2747 };
2748 self.noListFound = null;
2749 self.listUserNameInputModelSearched = self.listUserNameInputModel;
2750 self.ajaxPost(searchUserNameListsData, function(_ref){
2751 var data = _ref.data;
2752 if(data !== false && data['error'] === undefined){
2753 self.listUserNameResult = self.createSourcesArray(data);
2754 }else{
2755 self.noListFound = true;
2756 }
2757 });
2758 },
2759
2760 /**
2761 * Check Twitter List By ID
2762 *
2763 * @since 2.0
2764 */
2765 checkTwitterListById : function(){
2766 var self = this,
2767 checkListByIdData = {
2768 action : 'ctf_feed_saver_manager_check_twitter_list_by_id',
2769 listIds : self.listIdInputModel,
2770 };
2771 self.ajaxPost(checkListByIdData, function(_ref){
2772 var data = _ref.data;
2773 if(data !== false && data['error'] === undefined){
2774 data.forEach( function(listItem) {
2775 self.addItemtoList(listItem);
2776 });
2777 self.listIdInputModel = '';
2778 }
2779 });
2780 },
2781
2782
2783 /**
2784 * Add Item to List ID
2785 *
2786 * @since 2.0
2787 */
2788 addItemtoList : function( listItem ){
2789 var self = this,
2790 listID = listItem.id,
2791 selectFeedModelCurrent = self.customizerFeedData ? JSON.parse( JSON.stringify( self.selectedFeedModelPopup ) ) : JSON.parse( JSON.stringify( self.selectedFeedModel ) ),
2792 listIdsArray = self.checkNotEmpty( selectFeedModelCurrent.lists ) ? selectFeedModelCurrent.lists.split(',') : [];
2793
2794 if( listIdsArray.includes( listID ) ){
2795 listIdsArray.splice( listIdsArray.indexOf( listID ) , 1 );
2796 }else{
2797 listIdsArray.push( listID );
2798 }
2799 selectFeedModelCurrent.lists = listIdsArray.join(',');
2800
2801 if( self.checkObjectArrayElement(selectFeedModelCurrent.listsObject, listItem, 'id')){
2802 selectFeedModelCurrent.listsObject.splice(selectFeedModelCurrent.listsObject.findIndex(function(el){
2803 return el.id === listItem.id;
2804 }), 1);
2805 }else{
2806 selectFeedModelCurrent.listsObject.push( listItem );
2807 }
2808
2809
2810
2811 if( self.customizerFeedData ){
2812 self.selectedFeedModelPopup = JSON.parse(JSON.stringify(selectFeedModelCurrent));
2813 }else{
2814 self.selectedFeedModel = JSON.parse(JSON.stringify(selectFeedModelCurrent));
2815 }
2816
2817 },
2818
2819 /**
2820 * Remove Single Item From List
2821 *
2822 * @since 2.0
2823 */
2824 removeSingleItemFromList : function( listItem ){
2825 var self = this,
2826 listID = listItem.id,
2827 selectFeedModelCurrent = self.customizerFeedData ? JSON.parse( JSON.stringify( self.selectedFeedModelPopup ) ) : JSON.parse( JSON.stringify( self.selectedFeedModel ) ),
2828 listIdsArray = selectFeedModelCurrent.lists.split(',');
2829
2830 if( listIdsArray.includes( listID ) ){
2831 listIdsArray.splice( listIdsArray.indexOf( listID ) , 1 );
2832 }
2833 selectFeedModelCurrent.lists = listIdsArray.join(',');
2834
2835 if( self.checkObjectArrayElement(selectFeedModelCurrent.listsObject, listItem, 'id')){
2836 selectFeedModelCurrent.listsObject.splice(selectFeedModelCurrent.listsObject.findIndex(function(el){
2837 return el.id === listItem.id;
2838 }), 1);
2839 }
2840
2841 if( self.customizerFeedData ){
2842 self.selectedFeedModelPopup = JSON.parse(JSON.stringify(selectFeedModelCurrent));
2843 }else{
2844 self.selectedFeedModel = JSON.parse(JSON.stringify(selectFeedModelCurrent));
2845 }
2846 },
2847
2848 /**
2849 * Check if Item List is Included
2850 *
2851 * @since 2.0
2852 */
2853 checkListItemIncluded : function(listItem){
2854 var self = this,
2855 listID = listItem.id,
2856 selectFeedModelCurrent = self.customizerFeedData ? JSON.parse(JSON.stringify(self.selectedFeedModelPopup)) : JSON.parse(JSON.stringify(self.selectedFeedModel)),
2857 listIdsArray = selectFeedModelCurrent.lists.split(',');
2858
2859 if( self.checkObjectArrayElement(selectFeedModelCurrent.listsObject, listItem, 'id')){
2860 return 'true';
2861 }
2862 return 'false';
2863 },
2864
2865 /**
2866 * Deselect & Remove All Lists
2867 *
2868 * @since 2.0
2869 */
2870 removeAllLists : function(){
2871 var self = this;
2872 if( self.customizerFeedData ){
2873 self.selectedFeedModelPopup.lists = '';
2874 self.selectedFeedModelPopup.listsObject = [];
2875 }else{
2876 self.selectedFeedModel.lists = '';
2877 self.selectedFeedModel.listsObject = [];
2878 }
2879 },
2880
2881 chooseFeedTemplate: function( feedTemplate, iscustomizerPopup = false ) {
2882 var self = this;
2883 self.selectedFeedTemplate = feedTemplate.type;
2884 if( iscustomizerPopup ){
2885 self.viewsActive.feedTemplateElement = feedTemplate.type;
2886 }
2887 ctfBuilder.$forceUpdate();
2888 },
2889
2890 /**
2891 * Print Twitter Handle
2892 * Checking If there is @ otherwise we add it
2893 *
2894 * @since 2.0
2895 */
2896 printUserNameTwitterHandle : function( userName ){
2897 if( this.checkNotEmpty(userName) ){
2898 return userName[0] == '@' ? userName : '@' + userName;
2899 }
2900 return '';
2901 },
2902
2903 /**
2904 * Notice Control Actions
2905 *
2906 * @since 2.0
2907 */
2908 noticeClickAction : function( action ){
2909 var self = this;
2910 switch (action) {
2911 case 'navigateToStyle':
2912 var SectionStyle = self.customizerSidebarBuilder['customize'].sections['customize_posts'];
2913 self.switchCustomizerSection('customize_posts',SectionStyle);
2914 break;
2915 case 'navigateToSettingPage':
2916 window.open(self.adminSettingsURL, '_blank');
2917 break;
2918 }
2919 },
2920
2921 /**
2922 * Format & Print Date
2923 *
2924 * @since 4.0
2925 *
2926 * @return String
2927 */
2928 printDate : function( postDate){
2929 var self = this,
2930 originalDate = Date.parse(postDate) / 1000,
2931 dateOffset = new Date(),
2932 offsetTimezone = dateOffset.getTimezoneOffset(),
2933 lengths = ["60","60","24","7","4.35","12","10"],
2934 now = dateOffset.getTime() / 1000,
2935 newTime = originalDate + offsetTimezone,
2936 printDate = '',
2937 dateFortmat = self.customizerFeedData.settings.dateformat,
2938 difference = null,
2939 formatsChoices = {
2940 '2' : 'F j',
2941 '3' : 'F j, Y',
2942 '4' : 'm.d',
2943 '5' : 'm.d.y',
2944 '6' : 'D M jS, Y',
2945 '7' : 'l F jS, Y',
2946 '8' : 'l F jS, Y - g:i a',
2947 '9' : "l M jS, 'y",
2948 '10' : 'm.d.y',
2949 '11' : 'm/d/y',
2950 '12' : 'd.m.y',
2951 '13' : 'd/m/y',
2952 '14' : 'd-m-Y, G:i',
2953 '15' : 'jS F Y, G:i',
2954 '16' : 'd M Y, G:i',
2955 '17' : 'l jS F Y, G:i',
2956 '18' : 'm.d.y - G:i',
2957 '19' : 'd.m.y - G:i',
2958 '20' : 'Y-m-d'
2959 };
2960 if(formatsChoices.hasOwnProperty(dateFortmat)){
2961 printDate = date_i18n( formatsChoices[dateFortmat], newTime );
2962 }else if(dateFortmat == 'custom'){
2963 var dateCustom = self.customizerFeedData.settings.datecustom;
2964 printDate = date_i18n( dateCustom , newTime );
2965 }
2966 else{
2967 var ctf_minute = self.translatedText.ctf_minute,
2968 ctf_hour = self.translatedText.ctf_hour,
2969 ctf_now_str = self.translatedText.ctf_now_str;
2970
2971 difference = now - newTime;
2972 if ( difference < 60 ) {
2973 printDate = ctf_now_str;
2974 } else if ( difference < (60*60) ) {
2975 printDate = Math.round( difference/60 ) + '' + ctf_minute;
2976 } else if ( difference < (60*60*24) ) {
2977 printDate = Math.round( difference/3600 ) + '' + ctf_hour;
2978 } else {
2979 var nowDate = new Date(now * 1000),
2980 newTimeDate = new Date(newTime * 1000);
2981 if( nowDate.getUTCFullYear() > newTimeDate.getUTCFullYear() ){
2982 printDate = date_i18n( 'j M Y' , newTime );
2983 }else{
2984 printDate = date_i18n( 'j M' , newTime );
2985 }
2986 }
2987 }
2988
2989 return printDate;
2990 },
2991
2992 ctaToggleFeatures: function() {
2993 this.freeCtaShowFeatures = !this.freeCtaShowFeatures;
2994 },
2995
2996 /**
2997 * Create New Feed
2998 *
2999 * @since 2.1
3000 *
3001 */
3002 createNewFeed : function () {
3003 const self = this;
3004 if( ! self.viewsActive.onboardingPopup ){
3005 if( ! self.creationProcessCheckAppCredentials() ){
3006 self.viewsActive.connectAccountPopup = true;
3007 self.viewsActive.connectAccountStep = 'step_1';
3008 } else if( self.feedsList.length >= 1 ){
3009 self.openDialogBox('createMoreFeeds');
3010 } else{
3011 self.switchScreen('pageScreen', 'selectFeed');
3012 }
3013 } else{
3014 self.switchScreen('welcome');
3015 }
3016 }
3017
3018 }
3019
3020 });
3021
3022 function ctfBuilderToggleCaption(postID){
3023 if( ctfBuilder.expandedCaptions.includes(postID) ){
3024 ctfBuilder.expandedCaptions.splice(ctfBuilder.expandedCaptions.indexOf( postID ), 1);
3025 }else{
3026 ctfBuilder.expandedCaptions.push(postID);
3027 }
3028 }
3029
3030 jQuery( document ).ready(function() {
3031 jQuery('body').find('.ctf-more').unbind('click')
3032 })
3033