: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
const getDefaultContent=item=>{
content_text:item?.text_tab || i18n.tabc
api.ModuleTab=class extends api.Module{
const arr = fields.mod_settings?.tab_content_tab;
for(let i=arr.length-1;i>-1;--i){
if(!arr[i].builder_content){
arr[i].builder_content=getDefaultContent(arr[i]);
id: 'allow_tab_breakpoint',
wrap_class: 'tb_checkbox_element_allow_tab'
id: 'tab_appearance_tab',
fadeInLeft: 'fadeInLeft',
fadeInRight: 'fadeInRight',
fadeInDown: 'fadeInDown',
bounceInUp: 'bounceInUp',
bounceInDown: 'bounceInDown',
bounceInLeft: 'bounceInLeft',
bounceInRight: 'bounceInRight',
rotateInDownLeft: 'rotateInDownLeft',
rotateInDownRight: 'rotateInDownRight',
rotateInUpLeft: 'rotateInUpLeft',
slideInDown: 'slideInDown',
slideInLeft: 'slideInLeft',
slideInRight: 'slideInRight',
zoomInLeft: 'zoomInLeft',
zoomInRight: 'zoomInRight',
checked : { show : [ 'autoplay_timer', 'autoplay_c', 'pauseh', 'timerbar' ] },
not_checked : { hide : [ 'autoplay_timer', 'autoplay_c', 'pauseh', 'timerbar' ] }
options[1].options.splice(1,0,{
control:{control_type:'builderEdit'},
class:'tb_open_builder_lb',
static builderSave(settings){
layout_accordion:'minimal',
tab_appearance_tab:false,
tabs=settings.tab_content_tab;
if(settings[key]===def[key]){
if(settings.tab_appearance_tab==='|'){
delete settings.tab_appearance_tab;
if(settings.allow_tab_breakpoint!=='allow_tab'){
delete settings.tab_breakpoint;
if ( ! settings.autoplay ) {
delete settings.autoplay_timer;
delete settings.autoplay_c;
for(let i=tabs.length-1;i>-1;--i){
builder_content=tab.builder_content;
this.cleanBuilderType(builder_content);
super.builderSave(settings);
const settingsTab=settings.tab_content_tab;
for(let i=0;i<contentTab.length;++i){
if(settingsTab[i]!==undefined && contentTab[i].builder_content){
settingsTab[i].builder_content=contentTab[i].builder_content;
const isOpen=api.activeModel?.id === this.id;
const settings=this.get('mod_settings');
this.parseHtml(settings);
if(!api.isVisual && !contentTab){
contentTab=api.Helper.cloneObject(settings.tab_content_tab);
const index=Themify.convert(parent.children).indexOf(item);
const tab=this.el.querySelector('ul.tab-nav').children[index];
const id=tab.tfTag('a')[0].getAttribute('href');
this.el.querySelector('[data-id="'+id.replace('#','')+'"]').remove();
contentTab.splice(index,1);
sortRow(item,oldIndex,newIndex){
const childs=this.el.querySelector('ul.tab-nav').children,
items=this.el.tfClass('module-tab')[0].children,
tabTitle=childs[oldIndex];
for(let i=0;i<items.length;++i){
if(items[i].classList.contains('tab-content')){
const tabContent=contents[oldIndex];
if((newIndex-1)!==oldIndex && oldIndex>newIndex){
childs[newIndex].after(tabTitle);
contents[newIndex].after(tabContent);
childs[newIndex].before(tabTitle);
contents[newIndex].before(tabContent);
contentTab.splice(newIndex, 0, contentTab.splice(oldIndex, 1)[0]);
duplicateRow(vals,orig,row){
const index=Themify.convert(row.parentNode.children).indexOf(row);
const title=this.el.querySelector('ul.tab-nav').children[index],
id=title.tfTag('a')[0].getAttribute('href'),
content=this.el.querySelector('[data-id="'+id.replace('#','')+'"]'),
settings=this._getBuilderContent(content);
api.Helper.clearElementId(settings,true);
const {tabTitleWrap,tabContent}=this._getItem({builder_content:settings},{},1,true);
title.after(tabTitleWrap);
content.after(tabContent);
const settings=api.Helper.cloneObject(contentTab[index]);
if(settings.builder_content){
api.Helper.clearElementId(settings.builder_content,true);
contentTab.splice(index+1,0,settings);
_getBuilderContent(tabContent,saving){
const content=tabContent.children,
for(let i=0;i<content.length;++i){
subrows.push(api.Utils.getRowSettings(content[i],'subrow',saving));
async builderContentEdit(el){
let field=el.closest('.tb_repeatable_field'),
index=Themify.convert(field.parentNode.children).indexOf(field);
await api.LightBox.save();
await this.constructor.loadBackendLightbox();
const content_tabs=this.get('mod_settings').tab_content_tab,
for(let i=0;i<content_tabs.length;i++){
rows[i]={title:content_tabs[i].title_tab,content:content_tabs[i].builder_content || getDefaultContent()};
(new TB_BuilderContentLightbox(this,'tb_tabs_edit')).open(rows,index);
builderContentSave(data){
const settings=this.get('mod_settings'),
tabs=settings.tab_content_tab;
for(let i=tabs.length-1;i>-1;--i){
tabs[i].builder_content=data[i];
this.set('mod_settings',settings);
parseHtml(settings,saving){
const rows=settings.tab_content_tab;
const items=this.el.tfClass('module-tab')[0]?.querySelectorAll(':scope>.tab-content');
for(let i=0;i<items.length;++i){
rows[i].builder_content=this._getBuilderContent(items[i]);
_getItem(item,data,index,setCss){
let tabId='tab-' +this.id+'-'+index,
tabTitleWrap=createElement('li',{class:'tb_is_repeat'+(index===0?' current':''),'aria-expanded':index===0}),
link=createElement('a',{href:'#'+tabId}),
tabContent=createElement('',{class:'tab-content tf_clear','data-id':tabId,'aria-hidden':index!==0}),
builder_content=item.builder_content || getDefaultContent(item),
fr=createDocumentFragment(),
for(let i=0;i<builder_content.length;++i){
let subrow=new api.Subrow(builder_content[i]);
fr.appendChild(subrow.el);
containers.push(subrow.id);
if(api.is_builder_ready === true){
for(let i=0,allItems=fr.querySelectorAll('[data-cid]');i<allItems.length;++i){
settings.push(allItems[i].dataset.cid);
tabContent.appendChild(fr);
setCss??=api.bootstrap_working;
api.bootstrap(settings,undefined,!!setCss).then(()=>{
for(let i=containers.length-1;i>-1;--i){
api.Utils.runJs(api.Registry.get(containers[i]).el,'subrow');
tabContent.appendChild(fr);
if(item?.title_tab && data.style_tab!=='icon-only'){
this.constructor._setEditableContent(link,'title_tab',item.title_tab,'','tab_content_tab');
const icon=createElement('em');
icon.appendChild(api.Helper.getIcon(item.icon_tab));
tabTitleWrap.append(link,createElement('',{role:'button',class:'tb_del_btn tb_del_tab tf_close tb_disable_sorting',title:'Delete Tab'}));