Add email tool tracking

This commit is contained in:
2023-12-07 12:49:45 +08:00
parent 46b07de8b8
commit 84a96833ff
48 changed files with 320 additions and 114 deletions

View File

@@ -20,7 +20,7 @@ protected function schedule(Schedule $schedule)
{ {
$schedule->command('sitemap:generate')->everySixHours()->name('sitemap-generate-every-six-hours'); $schedule->command('sitemap:generate')->everySixHours()->name('sitemap-generate-every-six-hours');
$schedule->call(function () { $schedule->call(function () {
$url_to_crawl = UrlToCrawl::where('is_crawling', false)->inRandomOrder()->first(); $url_to_crawl = UrlToCrawl::where('is_crawling', false)->inRandomOrder()->first();

View File

@@ -2,8 +2,8 @@
namespace App\Helpers\FirstParty\SitemapCrawler; namespace App\Helpers\FirstParty\SitemapCrawler;
use Spatie\Crawler\CrawlProfiles\CrawlProfile;
use Psr\Http\Message\UriInterface; use Psr\Http\Message\UriInterface;
use Spatie\Crawler\CrawlProfiles\CrawlProfile;
class CustomCrawlProfile extends CrawlProfile class CustomCrawlProfile extends CrawlProfile
{ {
@@ -20,9 +20,7 @@ public function shouldCrawl(UriInterface $url): bool
if ($url->getQuery() !== '') { if ($url->getQuery() !== '') {
return false; return false;
} }
return ($this->callback)($url); return ($this->callback)($url);
} }
} }

View File

@@ -0,0 +1,54 @@
<?php
namespace App\Http\Controllers\BasicAuthAdmin;
use App\Http\Controllers\Controller;
use App\Models\AiTool;
use Illuminate\Http\Request;
class AIToolListController extends Controller
{
public function index(Request $request)
{
$view = $request->input('view', 'all');
$ai_tool_list = AiTool::orderBy('created_at', 'DESC')
->when($view == 'emailed', function ($query) {
$query->where('has_emailed', true);
})
->when($view == 'not_emailed', function ($query) {
$query->where('has_emailed', false);
})
->when($view == 'all', function ($query) {
})
->orderBy('created_at', 'DESC')
->paginate(50);
$ai_tool_list_count =
$counts = (object) [
'all' => AiTool::count(),
'emailed' => AiTool::where('has_emailed', true)->count(),
'not_emailed' => AiTool::where('has_emailed', false)->count(),
];
return view('ba.aitoollist', compact('ai_tool_list', 'counts', 'view'));
}
public function setToEmailed(Request $request)
{
$ai_tool = AiTool::find($request->input('id'));
if (is_null($ai_tool)) {
return redirect()->back()->with('error', 'AI Tool not found.');
}
$ai_tool->has_emailed = true;
$ai_tool->email = $request->input('email');
if ($ai_tool->save()) {
return redirect()->back()->with('success', 'Saved successfully.');
}
}
}

View File

@@ -6,23 +6,21 @@
use App\Models\SubmitTool; use App\Models\SubmitTool;
use App\Models\UrlToCrawl; use App\Models\UrlToCrawl;
use App\Notifications\AiToolSubmitted; use App\Notifications\AiToolSubmitted;
use Artesaos\SEOTools\Facades\SEOTools;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Notification; use Notification;
use Artesaos\SEOTools\Facades\SEOMeta;
use Artesaos\SEOTools\Facades\SEOTools;
class FrontSubmitToolController extends Controller class FrontSubmitToolController extends Controller
{ {
public function index(Request $request) public function index(Request $request)
{ {
SEOTools::metatags(); SEOTools::metatags();
SEOTools::twitter(); SEOTools::twitter();
SEOTools::opengraph(); SEOTools::opengraph();
SEOTools::jsonLd(); SEOTools::jsonLd();
SEOTools::setTitle('Free AI Tool Submission', false); SEOTools::setTitle('Free AI Tool Submission', false);
SEOTools::setDescription('Submit your AI tool for free into AIBuddyTool to get free backlinks and traffic. Limited slots available!'); SEOTools::setDescription('Submit your AI tool for free into AIBuddyTool to get free backlinks and traffic. Limited slots available!');
$submitted_tool_count = SubmitTool::whereIn('status', ['initial', 'queued_for_crawl', 'crawled'])->count(); $submitted_tool_count = SubmitTool::whereIn('status', ['initial', 'queued_for_crawl', 'crawled'])->count();

View File

@@ -44,6 +44,7 @@ class AiTool extends Model
'view_count' => 'int', 'view_count' => 'int',
'is_ai_tool' => 'bool', 'is_ai_tool' => 'bool',
'qna' => 'object', 'qna' => 'object',
'has_emailed' => 'bool',
]; ];
protected $fillable = [ protected $fillable = [
@@ -62,6 +63,8 @@ class AiTool extends Model
'qna', 'qna',
'external_url 'external_url
', ',
'has_emailed',
'email',
]; ];
protected function screenshotImg(): Attribute protected function screenshotImg(): Attribute

View File

@@ -2,7 +2,6 @@
use App\Helpers\FirstParty\SitemapCrawler\CustomCrawlProfile; use App\Helpers\FirstParty\SitemapCrawler\CustomCrawlProfile;
use GuzzleHttp\RequestOptions; use GuzzleHttp\RequestOptions;
use Spatie\Sitemap\Crawler\Profile;
return [ return [

View File

@@ -0,0 +1,30 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('ai_tools', function (Blueprint $table) {
$table->boolean('has_emailed')->default(false);
$table->string('email')->nullable();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('ai_tools', function (Blueprint $table) {
$table->dropColumn('has_emailed');
$table->dropColumn(('email'));
});
}
};

View File

@@ -1 +1 @@
import{_ as a,l as r,c as n,a as t,o as c}from"./app-front-d6902e40.js";const m={name:"GetEmbedCode",mixins:[],components:{},props:["url","name"],data:()=>({imgSrc:"https://cdn.aibuddytool.com/featured-on-aibuddytool-1-1000.webp",showToast:!1}),computed:{embedCode(){return"<!-- "+this.name+' featured by AiBuddyTool.com --><a href="'+this.url+'" target="_blank"><img alt="'+this.name+'" style="width: 250px; height: auto" src="'+this.imgSrc+'"></a>'}},methods:{getEmbedCode(){const e=document.createElement("textarea");e.value=this.embedCode,document.body.appendChild(e),e.select(),document.execCommand("copy"),document.body.removeChild(e),r("Copied! Paste the HTML embed code at the bottom of your business website footer.",{position:"bottom-center",type:"success",timeout:3e3,closeOnClick:!0,pauseOnFocusLoss:!0,pauseOnHover:!0,draggable:!0,draggablePercent:.6,showCloseButtonOnHover:!1,hideProgressBar:!1,closeButton:!0,icon:!0,rtl:!1})}},mounted(){}},u={class:"d-grid gap-2 mx-auto",style:{width:"250px"}},i=["src"];function l(e,o,b,p,h,s){return c(),n("div",null,[t("div",u,[t("img",{style:{width:"250px",height:"auto"},src:e.imgSrc,alt:"Featured banner"},null,8,i),t("button",{onClick:o[0]||(o[0]=(...d)=>s.getEmbedCode&&s.getEmbedCode(...d)),class:"btn btn-sm btn-outline-primary px-3"}," Get HTML embed code ")])])}const f=a(m,[["render",l]]);export{f as default}; import{_ as a,l as r,c as n,a as t,o as c}from"./app-front-b9536f4d.js";const m={name:"GetEmbedCode",mixins:[],components:{},props:["url","name"],data:()=>({imgSrc:"https://cdn.aibuddytool.com/featured-on-aibuddytool-1-1000.webp",showToast:!1}),computed:{embedCode(){return"<!-- "+this.name+' featured by AiBuddyTool.com --><a href="'+this.url+'" target="_blank"><img alt="'+this.name+'" style="width: 250px; height: auto" src="'+this.imgSrc+'"></a>'}},methods:{getEmbedCode(){const e=document.createElement("textarea");e.value=this.embedCode,document.body.appendChild(e),e.select(),document.execCommand("copy"),document.body.removeChild(e),r("Copied! Paste the HTML embed code at the bottom of your business website footer.",{position:"bottom-center",type:"success",timeout:3e3,closeOnClick:!0,pauseOnFocusLoss:!0,pauseOnHover:!0,draggable:!0,draggablePercent:.6,showCloseButtonOnHover:!1,hideProgressBar:!1,closeButton:!0,icon:!0,rtl:!1})}},mounted(){}},u={class:"d-grid gap-2 mx-auto",style:{width:"250px"}},i=["src"];function l(e,o,b,p,h,s){return c(),n("div",null,[t("div",u,[t("img",{style:{width:"250px",height:"auto"},src:e.imgSrc,alt:"Featured banner"},null,8,i),t("button",{onClick:o[0]||(o[0]=(...d)=>s.getEmbedCode&&s.getEmbedCode(...d)),class:"btn btn-sm btn-outline-primary px-3"}," Get HTML embed code ")])])}const f=a(m,[["render",l]]);export{f as default};

Binary file not shown.

Binary file not shown.

View File

@@ -1,4 +1,4 @@
import Qn from"./VueEditorJs-c40f6d08.js";import{r as Ft,_ as Mr}from"./NativeImageBlock-3623204f.js";import{L as hn}from"./bundle-f4b2cd77.js";import{H as yn}from"./bundle-7ca97fea.js";import{g as Cr,d as Pr,b as ua,r as zt,e as ne,f as vt,u as nn,t as da,h as ct,i as rn,w as Nt,j as Z,o as R,c as Q,k as _t,m as nt,n as Fe,p as _e,q as ie,s as ze,v as ft,x as j,y as Qe,z as gn,A as Pe,B as G,C as Gn,T as Sr,D as Ce,E as he,a as J,F as ot,G as we,H as It,I as rt,J as Ve,K as Zt,L as At,M as yt,N as wa,O as Or,P as Nr,Q as Ar,_ as $r,R as Ir,S as Er,U as Yr,V as Ia,W as Ur,X as Lr,Y as wn}from"./app-front-d6902e40.js";var Xn={exports:{}};/*! import Qn from"./VueEditorJs-04c9fa58.js";import{r as Ft,_ as Mr}from"./NativeImageBlock-68fd4e62.js";import{L as hn}from"./bundle-84836216.js";import{H as yn}from"./bundle-1ccfe0bb.js";import{g as Cr,d as Pr,b as ua,r as zt,e as ne,f as vt,u as nn,t as da,h as ct,i as rn,w as Nt,j as Z,o as R,c as Q,k as _t,m as nt,n as Fe,p as _e,q as ie,s as ze,v as ft,x as j,y as Qe,z as gn,A as Pe,B as G,C as Gn,T as Sr,D as Ce,E as he,a as J,F as ot,G as we,H as It,I as rt,J as Ve,K as Zt,L as At,M as yt,N as wa,O as Or,P as Nr,Q as Ar,_ as $r,R as Ir,S as Er,U as Yr,V as Ia,W as Ur,X as Lr,Y as wn}from"./app-front-b9536f4d.js";var Xn={exports:{}};/*!
* Image tool * Image tool
* *
* @version 2.8.1 * @version 2.8.1

Binary file not shown.

View File

@@ -1 +1 @@
import{_ as t,l as e,c as s,o}from"./app-front-d6902e40.js";const r={name:"ToastMessage",mixins:[],components:{},props:["type","message","timeout"],data:()=>({}),watch:{},computed:{},methods:{triggerMounted(){this.type=="error"&&e(this.message,{position:"bottom-center",type:"error",timeout:3e3,closeOnClick:!0,pauseOnFocusLoss:!0,pauseOnHover:!0,draggable:!0,draggablePercent:.6,showCloseButtonOnHover:!1,hideProgressBar:!1,closeButton:!0,icon:!0,rtl:!1}),this.type=="success"&&e(this.message,{position:"bottom-center",type:"success",timeout:3e3,closeOnClick:!0,pauseOnFocusLoss:!0,pauseOnHover:!0,draggable:!0,draggablePercent:.6,showCloseButtonOnHover:!1,hideProgressBar:!1,closeButton:!0,icon:!0,rtl:!1})}},mounted(){this.triggerMounted()}};function a(n,u,c,i,l,p){return o(),s("div")}const m=t(r,[["render",a]]);export{m as default}; import{_ as t,l as e,c as s,o}from"./app-front-b9536f4d.js";const r={name:"ToastMessage",mixins:[],components:{},props:["type","message","timeout"],data:()=>({}),watch:{},computed:{},methods:{triggerMounted(){this.type=="error"&&e(this.message,{position:"bottom-center",type:"error",timeout:3e3,closeOnClick:!0,pauseOnFocusLoss:!0,pauseOnHover:!0,draggable:!0,draggablePercent:.6,showCloseButtonOnHover:!1,hideProgressBar:!1,closeButton:!0,icon:!0,rtl:!1}),this.type=="success"&&e(this.message,{position:"bottom-center",type:"success",timeout:3e3,closeOnClick:!0,pauseOnFocusLoss:!0,pauseOnHover:!0,draggable:!0,draggablePercent:.6,showCloseButtonOnHover:!1,hideProgressBar:!1,closeButton:!0,icon:!0,rtl:!1})}},mounted(){this.triggerMounted()}};function a(n,u,c,i,l,p){return o(),s("div")}const m=t(r,[["render",a]]);export{m as default};

View File

@@ -1,4 +1,4 @@
import{_ as Oe,a1 as Zt,f as Ne,c as De,r as Re,h as Pe,o as Fe}from"./app-front-d6902e40.js";var He=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function xt(s){return s&&s.__esModule&&Object.prototype.hasOwnProperty.call(s,"default")?s.default:s}function Ct(){}Object.assign(Ct,{default:Ct,register:Ct,revert:function(){},__esModule:!0});Element.prototype.matches||(Element.prototype.matches=Element.prototype.matchesSelector||Element.prototype.mozMatchesSelector||Element.prototype.msMatchesSelector||Element.prototype.oMatchesSelector||Element.prototype.webkitMatchesSelector||function(s){const t=(this.document||this.ownerDocument).querySelectorAll(s);let e=t.length;for(;--e>=0&&t.item(e)!==this;);return e>-1});Element.prototype.closest||(Element.prototype.closest=function(s){let t=this;if(!document.documentElement.contains(t))return null;do{if(t.matches(s))return t;t=t.parentElement||t.parentNode}while(t!==null);return null});Element.prototype.prepend||(Element.prototype.prepend=function(s){const t=document.createDocumentFragment();Array.isArray(s)||(s=[s]),s.forEach(e=>{const o=e instanceof Node;t.appendChild(o?e:document.createTextNode(e))}),this.insertBefore(t,this.firstChild)});Element.prototype.scrollIntoViewIfNeeded||(Element.prototype.scrollIntoViewIfNeeded=function(s){s=arguments.length===0?!0:!!s;const t=this.parentNode,e=window.getComputedStyle(t,null),o=parseInt(e.getPropertyValue("border-top-width")),i=parseInt(e.getPropertyValue("border-left-width")),n=this.offsetTop-t.offsetTop<t.scrollTop,r=this.offsetTop-t.offsetTop+this.clientHeight-o>t.scrollTop+t.clientHeight,a=this.offsetLeft-t.offsetLeft<t.scrollLeft,l=this.offsetLeft-t.offsetLeft+this.clientWidth-i>t.scrollLeft+t.clientWidth,c=n&&!r;(n||r)&&s&&(t.scrollTop=this.offsetTop-t.offsetTop-t.clientHeight/2-o+this.clientHeight/2),(a||l)&&s&&(t.scrollLeft=this.offsetLeft-t.offsetLeft-t.clientWidth/2-i+this.clientWidth/2),(n||r||a||l)&&!s&&this.scrollIntoView(c)});window.requestIdleCallback=window.requestIdleCallback||function(s){const t=Date.now();return setTimeout(function(){s({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-t))}})},1)};window.cancelIdleCallback=window.cancelIdleCallback||function(s){clearTimeout(s)};let je=(s=21)=>crypto.getRandomValues(new Uint8Array(s)).reduce((t,e)=>(e&=63,e<36?t+=e.toString(36):e<62?t+=(e-26).toString(36).toUpperCase():e>62?t+="-":t+="_",t),"");var se=(s=>(s.VERBOSE="VERBOSE",s.INFO="INFO",s.WARN="WARN",s.ERROR="ERROR",s))(se||{});const E={BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,LEFT:37,UP:38,DOWN:40,RIGHT:39,DELETE:46,META:91},ze={LEFT:0,WHEEL:1,RIGHT:2,BACKWARD:3,FORWARD:4};function mt(s,t,e="log",o,i="color: inherit"){if(!("console"in window)||!window.console[e])return;const n=["info","log","warn","error"].includes(e),r=[];switch(mt.logLevel){case"ERROR":if(e!=="error")return;break;case"WARN":if(!["error","warn"].includes(e))return;break;case"INFO":if(!n||s)return;break}o&&r.push(o);const a="Editor.js 2.28.0",l=`line-height: 1em; import{_ as Oe,a1 as Zt,f as Ne,c as De,r as Re,h as Pe,o as Fe}from"./app-front-b9536f4d.js";var He=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function xt(s){return s&&s.__esModule&&Object.prototype.hasOwnProperty.call(s,"default")?s.default:s}function Ct(){}Object.assign(Ct,{default:Ct,register:Ct,revert:function(){},__esModule:!0});Element.prototype.matches||(Element.prototype.matches=Element.prototype.matchesSelector||Element.prototype.mozMatchesSelector||Element.prototype.msMatchesSelector||Element.prototype.oMatchesSelector||Element.prototype.webkitMatchesSelector||function(s){const t=(this.document||this.ownerDocument).querySelectorAll(s);let e=t.length;for(;--e>=0&&t.item(e)!==this;);return e>-1});Element.prototype.closest||(Element.prototype.closest=function(s){let t=this;if(!document.documentElement.contains(t))return null;do{if(t.matches(s))return t;t=t.parentElement||t.parentNode}while(t!==null);return null});Element.prototype.prepend||(Element.prototype.prepend=function(s){const t=document.createDocumentFragment();Array.isArray(s)||(s=[s]),s.forEach(e=>{const o=e instanceof Node;t.appendChild(o?e:document.createTextNode(e))}),this.insertBefore(t,this.firstChild)});Element.prototype.scrollIntoViewIfNeeded||(Element.prototype.scrollIntoViewIfNeeded=function(s){s=arguments.length===0?!0:!!s;const t=this.parentNode,e=window.getComputedStyle(t,null),o=parseInt(e.getPropertyValue("border-top-width")),i=parseInt(e.getPropertyValue("border-left-width")),n=this.offsetTop-t.offsetTop<t.scrollTop,r=this.offsetTop-t.offsetTop+this.clientHeight-o>t.scrollTop+t.clientHeight,a=this.offsetLeft-t.offsetLeft<t.scrollLeft,l=this.offsetLeft-t.offsetLeft+this.clientWidth-i>t.scrollLeft+t.clientWidth,c=n&&!r;(n||r)&&s&&(t.scrollTop=this.offsetTop-t.offsetTop-t.clientHeight/2-o+this.clientHeight/2),(a||l)&&s&&(t.scrollLeft=this.offsetLeft-t.offsetLeft-t.clientWidth/2-i+this.clientWidth/2),(n||r||a||l)&&!s&&this.scrollIntoView(c)});window.requestIdleCallback=window.requestIdleCallback||function(s){const t=Date.now();return setTimeout(function(){s({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-t))}})},1)};window.cancelIdleCallback=window.cancelIdleCallback||function(s){clearTimeout(s)};let je=(s=21)=>crypto.getRandomValues(new Uint8Array(s)).reduce((t,e)=>(e&=63,e<36?t+=e.toString(36):e<62?t+=(e-26).toString(36).toUpperCase():e>62?t+="-":t+="_",t),"");var se=(s=>(s.VERBOSE="VERBOSE",s.INFO="INFO",s.WARN="WARN",s.ERROR="ERROR",s))(se||{});const E={BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,LEFT:37,UP:38,DOWN:40,RIGHT:39,DELETE:46,META:91},ze={LEFT:0,WHEEL:1,RIGHT:2,BACKWARD:3,FORWARD:4};function mt(s,t,e="log",o,i="color: inherit"){if(!("console"in window)||!window.console[e])return;const n=["info","log","warn","error"].includes(e),r=[];switch(mt.logLevel){case"ERROR":if(e!=="error")return;break;case"WARN":if(!["error","warn"].includes(e))return;break;case"INFO":if(!n||s)return;break}o&&r.push(o);const a="Editor.js 2.28.0",l=`line-height: 1em;
color: #006FEA; color: #006FEA;
display: inline-block; display: inline-block;
font-size: 11px; font-size: 11px;
@@ -80,4 +80,4 @@ import{_ as Oe,a1 as Zt,f as Ne,c as De,r as Re,h as Pe,o as Fe}from"./app-front
* @license Apache-2.0 * @license Apache-2.0
* @see Editor.js <https://editorjs.io> * @see Editor.js <https://editorjs.io>
* @author CodeX Team <https://codex.so> * @author CodeX Team <https://codex.so>
*/class Si{static get version(){return"2.28.0"}constructor(t){let e=()=>{};z(t)&&R(t.onReady)&&(e=t.onReady);const o=new Ti(t);this.isReady=o.isReady.then(()=>{this.exportAPI(o),e()})}exportAPI(t){const e=["configuration"],o=()=>{Object.values(t.moduleInstances).forEach(i=>{R(i.destroy)&&i.destroy(),i.listeners.removeAll()}),t=null;for(const i in this)Object.prototype.hasOwnProperty.call(this,i)&&delete this[i];Object.setPrototypeOf(this,null)};e.forEach(i=>{this[i]=t[i]}),this.destroy=o,Object.setPrototypeOf(this,t.moduleInstances.API.methods),delete this.exportAPI,Object.entries({blocks:{clear:"clear",render:"render"},caret:{focus:"focus"},events:{on:"on",off:"off",emit:"emit"},saver:{save:"save"}}).forEach(([i,n])=>{Object.entries(n).forEach(([r,a])=>{this[a]=t.moduleInstances.API.methods[i][r]})})}}const Tt={header:Zt(()=>import("./bundle-7ca97fea.js").then(s=>s.b),["assets/bundle-7ca97fea.js","assets/app-front-d6902e40.js","assets/app-front-935fc652.css"]),list:Zt(()=>import("./bundle-f4b2cd77.js").then(s=>s.b),["assets/bundle-f4b2cd77.js","assets/app-front-d6902e40.js","assets/app-front-935fc652.css"])},Ii=Ne({name:"vue-editor-js",props:{holder:{type:String,default:()=>"vue-editor-js",require:!0},config:{type:Object,default:()=>({}),require:!0},initialized:{type:Function,default:()=>{}}},setup:(s,t)=>{const e=Re({editor:null});function o(r){i(),e.editor=new Si({holder:r.holder||"vue-editor-js",...r.config,onChange:(a,l)=>{n()}}),r.initialized(e.editor)}function i(){e.editor&&(e.editor.destroy(),e.editor=null)}function n(){console.log("saveEditor"),e.editor&&e.editor.save().then(r=>{console.log(r),t.emit("saved",r)})}return Pe(r=>o(s)),{props:s,state:e}},methods:{useTools(s,t){const e=Object.keys(Tt),o={...s.customTools};return e.every(i=>!s[i])?(e.forEach(i=>o[i]={class:Tt[i]}),Object.keys(t).forEach(i=>{o[i]!==void 0&&o[i]!==null&&(o[i].config=t[i])}),o):(e.forEach(i=>{const n=s[i];if(n&&(o[i]={class:Tt[i]},typeof n=="object")){const r=Object.assign({},s[i]);delete r.class,o[i]=Object.assign(o[i],r)}}),Object.keys(t).forEach(i=>{o[i]!==void 0&&o[i]!==null&&(o[i].config=t[i])}),o)}}}),Mi=["id"];function _i(s,t,e,o,i,n){return Fe(),De("div",{id:s.holder},null,8,Mi)}const Li=Oe(Ii,[["render",_i]]);export{Tt as PLUGINS,Li as default}; */class Si{static get version(){return"2.28.0"}constructor(t){let e=()=>{};z(t)&&R(t.onReady)&&(e=t.onReady);const o=new Ti(t);this.isReady=o.isReady.then(()=>{this.exportAPI(o),e()})}exportAPI(t){const e=["configuration"],o=()=>{Object.values(t.moduleInstances).forEach(i=>{R(i.destroy)&&i.destroy(),i.listeners.removeAll()}),t=null;for(const i in this)Object.prototype.hasOwnProperty.call(this,i)&&delete this[i];Object.setPrototypeOf(this,null)};e.forEach(i=>{this[i]=t[i]}),this.destroy=o,Object.setPrototypeOf(this,t.moduleInstances.API.methods),delete this.exportAPI,Object.entries({blocks:{clear:"clear",render:"render"},caret:{focus:"focus"},events:{on:"on",off:"off",emit:"emit"},saver:{save:"save"}}).forEach(([i,n])=>{Object.entries(n).forEach(([r,a])=>{this[a]=t.moduleInstances.API.methods[i][r]})})}}const Tt={header:Zt(()=>import("./bundle-1ccfe0bb.js").then(s=>s.b),["assets/bundle-1ccfe0bb.js","assets/app-front-b9536f4d.js","assets/app-front-935fc652.css"]),list:Zt(()=>import("./bundle-84836216.js").then(s=>s.b),["assets/bundle-84836216.js","assets/app-front-b9536f4d.js","assets/app-front-935fc652.css"])},Ii=Ne({name:"vue-editor-js",props:{holder:{type:String,default:()=>"vue-editor-js",require:!0},config:{type:Object,default:()=>({}),require:!0},initialized:{type:Function,default:()=>{}}},setup:(s,t)=>{const e=Re({editor:null});function o(r){i(),e.editor=new Si({holder:r.holder||"vue-editor-js",...r.config,onChange:(a,l)=>{n()}}),r.initialized(e.editor)}function i(){e.editor&&(e.editor.destroy(),e.editor=null)}function n(){console.log("saveEditor"),e.editor&&e.editor.save().then(r=>{console.log(r),t.emit("saved",r)})}return Pe(r=>o(s)),{props:s,state:e}},methods:{useTools(s,t){const e=Object.keys(Tt),o={...s.customTools};return e.every(i=>!s[i])?(e.forEach(i=>o[i]={class:Tt[i]}),Object.keys(t).forEach(i=>{o[i]!==void 0&&o[i]!==null&&(o[i].config=t[i])}),o):(e.forEach(i=>{const n=s[i];if(n&&(o[i]={class:Tt[i]},typeof n=="object")){const r=Object.assign({},s[i]);delete r.class,o[i]=Object.assign(o[i],r)}}),Object.keys(t).forEach(i=>{o[i]!==void 0&&o[i]!==null&&(o[i].config=t[i])}),o)}}}),Mi=["id"];function _i(s,t,e,o,i,n){return Fe(),De("div",{id:s.holder},null,8,Mi)}const Li=Oe(Ii,[["render",_i]]);export{Tt as PLUGINS,Li as default};

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

View File

@@ -1,4 +1,4 @@
import{g as N}from"./app-front-d6902e40.js";function P(x,H){for(var g=0;g<H.length;g++){const b=H[g];if(typeof b!="string"&&!Array.isArray(b)){for(const l in b)if(l!=="default"&&!(l in x)){const n=Object.getOwnPropertyDescriptor(b,l);n&&Object.defineProperty(x,l,n.get?n:{enumerable:!0,get:()=>b[l]})}}}return Object.freeze(Object.defineProperty(x,Symbol.toStringTag,{value:"Module"}))}var E={exports:{}};(function(x,H){(function(g,b){x.exports=b()})(window,function(){return function(g){var b={};function l(n){if(b[n])return b[n].exports;var i=b[n]={i:n,l:!1,exports:{}};return g[n].call(i.exports,i,i.exports,l),i.l=!0,i.exports}return l.m=g,l.c=b,l.d=function(n,i,h){l.o(n,i)||Object.defineProperty(n,i,{enumerable:!0,get:h})},l.r=function(n){typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},l.t=function(n,i){if(1&i&&(n=l(n)),8&i||4&i&&typeof n=="object"&&n&&n.__esModule)return n;var h=Object.create(null);if(l.r(h),Object.defineProperty(h,"default",{enumerable:!0,value:n}),2&i&&typeof n!="string")for(var m in n)l.d(h,m,(function(f){return n[f]}).bind(null,m));return h},l.n=function(n){var i=n&&n.__esModule?function(){return n.default}:function(){return n};return l.d(i,"a",i),i},l.o=function(n,i){return Object.prototype.hasOwnProperty.call(n,i)},l.p="/",l(l.s=5)}([function(g,b,l){var n=l(1);typeof n=="string"&&(n=[[g.i,n,""]]);var i={hmr:!0,transform:void 0,insertInto:void 0};l(3)(n,i),n.locals&&(g.exports=n.locals)},function(g,b,l){(g.exports=l(2)(!1)).push([g.i,`/** import{g as N}from"./app-front-b9536f4d.js";function P(x,H){for(var g=0;g<H.length;g++){const b=H[g];if(typeof b!="string"&&!Array.isArray(b)){for(const l in b)if(l!=="default"&&!(l in x)){const n=Object.getOwnPropertyDescriptor(b,l);n&&Object.defineProperty(x,l,n.get?n:{enumerable:!0,get:()=>b[l]})}}}return Object.freeze(Object.defineProperty(x,Symbol.toStringTag,{value:"Module"}))}var E={exports:{}};(function(x,H){(function(g,b){x.exports=b()})(window,function(){return function(g){var b={};function l(n){if(b[n])return b[n].exports;var i=b[n]={i:n,l:!1,exports:{}};return g[n].call(i.exports,i,i.exports,l),i.l=!0,i.exports}return l.m=g,l.c=b,l.d=function(n,i,h){l.o(n,i)||Object.defineProperty(n,i,{enumerable:!0,get:h})},l.r=function(n){typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},l.t=function(n,i){if(1&i&&(n=l(n)),8&i||4&i&&typeof n=="object"&&n&&n.__esModule)return n;var h=Object.create(null);if(l.r(h),Object.defineProperty(h,"default",{enumerable:!0,value:n}),2&i&&typeof n!="string")for(var m in n)l.d(h,m,(function(f){return n[f]}).bind(null,m));return h},l.n=function(n){var i=n&&n.__esModule?function(){return n.default}:function(){return n};return l.d(i,"a",i),i},l.o=function(n,i){return Object.prototype.hasOwnProperty.call(n,i)},l.p="/",l(l.s=5)}([function(g,b,l){var n=l(1);typeof n=="string"&&(n=[[g.i,n,""]]);var i={hmr:!0,transform:void 0,insertInto:void 0};l(3)(n,i),n.locals&&(g.exports=n.locals)},function(g,b,l){(g.exports=l(2)(!1)).push([g.i,`/**
* Plugin styles * Plugin styles
*/ */
.ce-header { .ce-header {

Binary file not shown.

View File

@@ -1,4 +1,4 @@
import{g as E}from"./app-front-d6902e40.js";function P(_,j){for(var v=0;v<j.length;v++){const p=j[v];if(typeof p!="string"&&!Array.isArray(p)){for(const c in p)if(c!=="default"&&!(c in _)){const o=Object.getOwnPropertyDescriptor(p,c);o&&Object.defineProperty(_,c,o.get?o:{enumerable:!0,get:()=>p[c]})}}}return Object.freeze(Object.defineProperty(_,Symbol.toStringTag,{value:"Module"}))}var T={exports:{}};(function(_,j){(function(v,p){_.exports=p()})(window,function(){return function(v){var p={};function c(o){if(p[o])return p[o].exports;var l=p[o]={i:o,l:!1,exports:{}};return v[o].call(l.exports,l,l.exports,c),l.l=!0,l.exports}return c.m=v,c.c=p,c.d=function(o,l,d){c.o(o,l)||Object.defineProperty(o,l,{enumerable:!0,get:d})},c.r=function(o){typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(o,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(o,"__esModule",{value:!0})},c.t=function(o,l){if(1&l&&(o=c(o)),8&l||4&l&&typeof o=="object"&&o&&o.__esModule)return o;var d=Object.create(null);if(c.r(d),Object.defineProperty(d,"default",{enumerable:!0,value:o}),2&l&&typeof o!="string")for(var f in o)c.d(d,f,(function(b){return o[b]}).bind(null,f));return d},c.n=function(o){var l=o&&o.__esModule?function(){return o.default}:function(){return o};return c.d(l,"a",l),l},c.o=function(o,l){return Object.prototype.hasOwnProperty.call(o,l)},c.p="/",c(c.s=4)}([function(v,p,c){var o=c(1),l=c(2);typeof(l=l.__esModule?l.default:l)=="string"&&(l=[[v.i,l,""]]);var d={insert:"head",singleton:!1};o(l,d),v.exports=l.locals||{}},function(v,p,c){var o,l=function(){return o===void 0&&(o=!!(window&&document&&document.all&&!window.atob)),o},d=function(){var r={};return function(i){if(r[i]===void 0){var s=document.querySelector(i);if(window.HTMLIFrameElement&&s instanceof window.HTMLIFrameElement)try{s=s.contentDocument.head}catch{s=null}r[i]=s}return r[i]}}(),f=[];function b(r){for(var i=-1,s=0;s<f.length;s++)if(f[s].identifier===r){i=s;break}return i}function S(r,i){for(var s={},u=[],m=0;m<r.length;m++){var g=r[m],y=i.base?g[0]+i.base:g[0],C=s[y]||0,O="".concat(y," ").concat(C);s[y]=C+1;var L=b(O),M={css:g[1],media:g[2],sourceMap:g[3]};L!==-1?(f[L].references++,f[L].updater(M)):f.push({identifier:O,updater:h(M,i),references:1}),u.push(O)}return u}function k(r){var i=document.createElement("style"),s=r.attributes||{};if(s.nonce===void 0){var u=c.nc;u&&(s.nonce=u)}if(Object.keys(s).forEach(function(g){i.setAttribute(g,s[g])}),typeof r.insert=="function")r.insert(i);else{var m=d(r.insert||"head");if(!m)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");m.appendChild(i)}return i}var w,x=(w=[],function(r,i){return w[r]=i,w.filter(Boolean).join(` import{g as E}from"./app-front-b9536f4d.js";function P(_,j){for(var v=0;v<j.length;v++){const p=j[v];if(typeof p!="string"&&!Array.isArray(p)){for(const c in p)if(c!=="default"&&!(c in _)){const o=Object.getOwnPropertyDescriptor(p,c);o&&Object.defineProperty(_,c,o.get?o:{enumerable:!0,get:()=>p[c]})}}}return Object.freeze(Object.defineProperty(_,Symbol.toStringTag,{value:"Module"}))}var T={exports:{}};(function(_,j){(function(v,p){_.exports=p()})(window,function(){return function(v){var p={};function c(o){if(p[o])return p[o].exports;var l=p[o]={i:o,l:!1,exports:{}};return v[o].call(l.exports,l,l.exports,c),l.l=!0,l.exports}return c.m=v,c.c=p,c.d=function(o,l,d){c.o(o,l)||Object.defineProperty(o,l,{enumerable:!0,get:d})},c.r=function(o){typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(o,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(o,"__esModule",{value:!0})},c.t=function(o,l){if(1&l&&(o=c(o)),8&l||4&l&&typeof o=="object"&&o&&o.__esModule)return o;var d=Object.create(null);if(c.r(d),Object.defineProperty(d,"default",{enumerable:!0,value:o}),2&l&&typeof o!="string")for(var f in o)c.d(d,f,(function(b){return o[b]}).bind(null,f));return d},c.n=function(o){var l=o&&o.__esModule?function(){return o.default}:function(){return o};return c.d(l,"a",l),l},c.o=function(o,l){return Object.prototype.hasOwnProperty.call(o,l)},c.p="/",c(c.s=4)}([function(v,p,c){var o=c(1),l=c(2);typeof(l=l.__esModule?l.default:l)=="string"&&(l=[[v.i,l,""]]);var d={insert:"head",singleton:!1};o(l,d),v.exports=l.locals||{}},function(v,p,c){var o,l=function(){return o===void 0&&(o=!!(window&&document&&document.all&&!window.atob)),o},d=function(){var r={};return function(i){if(r[i]===void 0){var s=document.querySelector(i);if(window.HTMLIFrameElement&&s instanceof window.HTMLIFrameElement)try{s=s.contentDocument.head}catch{s=null}r[i]=s}return r[i]}}(),f=[];function b(r){for(var i=-1,s=0;s<f.length;s++)if(f[s].identifier===r){i=s;break}return i}function S(r,i){for(var s={},u=[],m=0;m<r.length;m++){var g=r[m],y=i.base?g[0]+i.base:g[0],C=s[y]||0,O="".concat(y," ").concat(C);s[y]=C+1;var L=b(O),M={css:g[1],media:g[2],sourceMap:g[3]};L!==-1?(f[L].references++,f[L].updater(M)):f.push({identifier:O,updater:h(M,i),references:1}),u.push(O)}return u}function k(r){var i=document.createElement("style"),s=r.attributes||{};if(s.nonce===void 0){var u=c.nc;u&&(s.nonce=u)}if(Object.keys(s).forEach(function(g){i.setAttribute(g,s[g])}),typeof r.insert=="function")r.insert(i);else{var m=d(r.insert||"head");if(!m)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");m.appendChild(i)}return i}var w,x=(w=[],function(r,i){return w[r]=i,w.filter(Boolean).join(`
`)});function a(r,i,s,u){var m=s?"":u.media?"@media ".concat(u.media," {").concat(u.css,"}"):u.css;if(r.styleSheet)r.styleSheet.cssText=x(i,m);else{var g=document.createTextNode(m),y=r.childNodes;y[i]&&r.removeChild(y[i]),y.length?r.insertBefore(g,y[i]):r.appendChild(g)}}function e(r,i,s){var u=s.css,m=s.media,g=s.sourceMap;if(m?r.setAttribute("media",m):r.removeAttribute("media"),g&&btoa&&(u+=` `)});function a(r,i,s,u){var m=s?"":u.media?"@media ".concat(u.media," {").concat(u.css,"}"):u.css;if(r.styleSheet)r.styleSheet.cssText=x(i,m);else{var g=document.createTextNode(m),y=r.childNodes;y[i]&&r.removeChild(y[i]),y.length?r.insertBefore(g,y[i]):r.appendChild(g)}}function e(r,i,s){var u=s.css,m=s.media,g=s.sourceMap;if(m?r.setAttribute("media",m):r.removeAttribute("media"),g&&btoa&&(u+=`
/*# sourceMappingURL=data:application/json;base64,`.concat(btoa(unescape(encodeURIComponent(JSON.stringify(g))))," */")),r.styleSheet)r.styleSheet.cssText=u;else{for(;r.firstChild;)r.removeChild(r.firstChild);r.appendChild(document.createTextNode(u))}}var t=null,n=0;function h(r,i){var s,u,m;if(i.singleton){var g=n++;s=t||(t=k(i)),u=a.bind(null,s,g,!1),m=a.bind(null,s,g,!0)}else s=k(i),u=e.bind(null,s,i),m=function(){(function(y){if(y.parentNode===null)return!1;y.parentNode.removeChild(y)})(s)};return u(r),function(y){if(y){if(y.css===r.css&&y.media===r.media&&y.sourceMap===r.sourceMap)return;u(r=y)}else m()}}v.exports=function(r,i){(i=i||{}).singleton||typeof i.singleton=="boolean"||(i.singleton=l());var s=S(r=r||[],i);return function(u){if(u=u||[],Object.prototype.toString.call(u)==="[object Array]"){for(var m=0;m<s.length;m++){var g=b(s[m]);f[g].references--}for(var y=S(u,i),C=0;C<s.length;C++){var O=b(s[C]);f[O].references===0&&(f[O].updater(),f.splice(O,1))}s=y}}}},function(v,p,c){(p=c(3)(!1)).push([v.i,`.cdx-list { /*# sourceMappingURL=data:application/json;base64,`.concat(btoa(unescape(encodeURIComponent(JSON.stringify(g))))," */")),r.styleSheet)r.styleSheet.cssText=u;else{for(;r.firstChild;)r.removeChild(r.firstChild);r.appendChild(document.createTextNode(u))}}var t=null,n=0;function h(r,i){var s,u,m;if(i.singleton){var g=n++;s=t||(t=k(i)),u=a.bind(null,s,g,!1),m=a.bind(null,s,g,!0)}else s=k(i),u=e.bind(null,s,i),m=function(){(function(y){if(y.parentNode===null)return!1;y.parentNode.removeChild(y)})(s)};return u(r),function(y){if(y){if(y.css===r.css&&y.media===r.media&&y.sourceMap===r.sourceMap)return;u(r=y)}else m()}}v.exports=function(r,i){(i=i||{}).singleton||typeof i.singleton=="boolean"||(i.singleton=l());var s=S(r=r||[],i);return function(u){if(u=u||[],Object.prototype.toString.call(u)==="[object Array]"){for(var m=0;m<s.length;m++){var g=b(s[m]);f[g].references--}for(var y=S(u,i),C=0;C<s.length;C++){var O=b(s[C]);f[O].references===0&&(f[O].updater(),f.splice(O,1))}s=y}}}},function(v,p,c){(p=c(3)(!1)).push([v.i,`.cdx-list {
margin: 0; margin: 0;

Binary file not shown.

View File

@@ -3,25 +3,25 @@
"file": "assets/NativeImageBlock-e3b0c442.css", "file": "assets/NativeImageBlock-e3b0c442.css",
"src": "NativeImageBlock.css" "src": "NativeImageBlock.css"
}, },
"_NativeImageBlock-3623204f.js": { "_NativeImageBlock-68fd4e62.js": {
"css": [ "css": [
"assets/NativeImageBlock-e3b0c442.css" "assets/NativeImageBlock-e3b0c442.css"
], ],
"file": "assets/NativeImageBlock-3623204f.js", "file": "assets/NativeImageBlock-68fd4e62.js",
"imports": [ "imports": [
"resources/js/app-front.js" "resources/js/app-front.js"
], ],
"isDynamicEntry": true "isDynamicEntry": true
}, },
"_bundle-7ca97fea.js": { "_bundle-1ccfe0bb.js": {
"file": "assets/bundle-7ca97fea.js", "file": "assets/bundle-1ccfe0bb.js",
"imports": [ "imports": [
"resources/js/app-front.js" "resources/js/app-front.js"
], ],
"isDynamicEntry": true "isDynamicEntry": true
}, },
"_bundle-f4b2cd77.js": { "_bundle-84836216.js": {
"file": "assets/bundle-f4b2cd77.js", "file": "assets/bundle-84836216.js",
"imports": [ "imports": [
"resources/js/app-front.js" "resources/js/app-front.js"
], ],
@@ -45,17 +45,17 @@
], ],
"dynamicImports": [ "dynamicImports": [
"resources/js/vue/GetEmbedCode.vue", "resources/js/vue/GetEmbedCode.vue",
"_NativeImageBlock-3623204f.js", "_NativeImageBlock-68fd4e62.js",
"resources/js/vue/PostEditor.vue", "resources/js/vue/PostEditor.vue",
"resources/js/vue/ToastMessage.vue", "resources/js/vue/ToastMessage.vue",
"resources/js/vue/VueEditorJs.vue" "resources/js/vue/VueEditorJs.vue"
], ],
"file": "assets/app-front-d6902e40.js", "file": "assets/app-front-b9536f4d.js",
"isEntry": true, "isEntry": true,
"src": "resources/js/app-front.js" "src": "resources/js/app-front.js"
}, },
"resources/js/vue/GetEmbedCode.vue": { "resources/js/vue/GetEmbedCode.vue": {
"file": "assets/GetEmbedCode-1d44bdf3.js", "file": "assets/GetEmbedCode-6f92c617.js",
"imports": [ "imports": [
"resources/js/app-front.js" "resources/js/app-front.js"
], ],
@@ -70,19 +70,19 @@
"css": [ "css": [
"assets/PostEditor-8d534a4a.css" "assets/PostEditor-8d534a4a.css"
], ],
"file": "assets/PostEditor-3a06f7cf.js", "file": "assets/PostEditor-404ecaec.js",
"imports": [ "imports": [
"resources/js/vue/VueEditorJs.vue", "resources/js/vue/VueEditorJs.vue",
"_NativeImageBlock-3623204f.js", "_NativeImageBlock-68fd4e62.js",
"_bundle-f4b2cd77.js", "_bundle-84836216.js",
"_bundle-7ca97fea.js", "_bundle-1ccfe0bb.js",
"resources/js/app-front.js" "resources/js/app-front.js"
], ],
"isDynamicEntry": true, "isDynamicEntry": true,
"src": "resources/js/vue/PostEditor.vue" "src": "resources/js/vue/PostEditor.vue"
}, },
"resources/js/vue/ToastMessage.vue": { "resources/js/vue/ToastMessage.vue": {
"file": "assets/ToastMessage-cef385bb.js", "file": "assets/ToastMessage-35fcfb39.js",
"imports": [ "imports": [
"resources/js/app-front.js" "resources/js/app-front.js"
], ],
@@ -91,10 +91,10 @@
}, },
"resources/js/vue/VueEditorJs.vue": { "resources/js/vue/VueEditorJs.vue": {
"dynamicImports": [ "dynamicImports": [
"_bundle-7ca97fea.js", "_bundle-1ccfe0bb.js",
"_bundle-f4b2cd77.js" "_bundle-84836216.js"
], ],
"file": "assets/VueEditorJs-c40f6d08.js", "file": "assets/VueEditorJs-04c9fa58.js",
"imports": [ "imports": [
"resources/js/app-front.js" "resources/js/app-front.js"
], ],

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@@ -4,8 +4,8 @@
<div class="container-xl"> <div class="container-xl">
<ul class="navbar-nav"> <ul class="navbar-nav">
<li class="nav-item @if (request()->routeIs('home')) active @endif"> <li class="nav-item @if (request()->routeIs('front.home')) active @endif">
<a class="nav-link" href="{{ route('home') }}"> <a class="nav-link" href="{{ route('front.home') }}">
<span <span
class="nav-link-icon d-md-none d-lg-inline-block"><!-- Download SVG icon from http://tabler-icons.io/i/home --> class="nav-link-icon d-md-none d-lg-inline-block"><!-- Download SVG icon from http://tabler-icons.io/i/home -->
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-door-exit" <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-door-exit"
@@ -44,7 +44,7 @@ class="nav-link-icon d-md-none d-lg-inline-block"><!-- Download SVG icon from ht
</a> </a>
</li> </li>
--}} --}}
<li class="nav-item @if (request()->routeIs('posts.manage')) active @endif"> {{-- <li class="nav-item @if (request()->routeIs('posts.manage')) active @endif">
<a class="nav-link" href="{{ route('posts.manage') }}"> <a class="nav-link" href="{{ route('posts.manage') }}">
<span <span
class="nav-link-icon d-md-none d-lg-inline-block"><!-- Download SVG icon from http://tabler-icons.io/i/home --> class="nav-link-icon d-md-none d-lg-inline-block"><!-- Download SVG icon from http://tabler-icons.io/i/home -->
@@ -64,7 +64,7 @@ class="nav-link-icon d-md-none d-lg-inline-block"><!-- Download SVG icon from ht
{{ __('Posts') }} {{ __('Posts') }}
</span> </span>
</a> </a>
</li> </li> --}}
{{-- {{--
<li class="nav-item @if (request()->routeIs('users.index')) active @endif"> <li class="nav-item @if (request()->routeIs('users.index')) active @endif">
<a class="nav-link" href="{{ route('users.index') }}"> <a class="nav-link" href="{{ route('users.index') }}">

View File

@@ -0,0 +1,117 @@
@extends('admin.layouts.app')
@section('content')
<div class="container py-5">
@if ($view == 'all')
<h1>All AI Tool List ({{ $counts->all }})</h1>
@elseif ($view == 'emailed')
<h1>Emailed AI Tool List ({{ $counts->emailed }})</h1>
@elseif ($view == 'not_emailed')
<h1>Not Emailed AI Tool List ({{ $counts->not_emailed }})</h1>
@endif
<p>Please do not share this list to others.</p>
<div class="d-flex justify-content-center mb-5 gap-2">
<a class="btn btn-light border-primary {{ $view == 'all' ? 'fw-bolder' : '' }}"
href="{{ route('ba.ai-tool-list', ['view' => 'all']) }}">All AI Tools ({{ $counts->all }})</a>
<a class="btn btn-light border-primary {{ $view == 'emailed' ? 'fw-bolder' : '' }}"
href="{{ route('ba.ai-tool-list', ['view' => 'emailed']) }}">Emailed ({{ $counts->emailed }})</a>
<a class="btn btn-light border-primary {{ $view == 'not_emailed' ? 'fw-bolder' : '' }}"
href="{{ route('ba.ai-tool-list', ['view' => 'not_emailed']) }}">Not Emailed
({{ $counts->not_emailed }})</a>
</div>
<div class="row">
@if ($ai_tool_list->count() > 0)
@foreach ($ai_tool_list as $ai_tool)
<div class="col-12">
<div class="card mb-2">
<div class="card-body">
<div class="row">
<div class="col">
<a style="font-size: 1.3em;" class="fw-bold mb-4" rel="noopener noreferrer nofollow"
target="_blank"
href="{{ route('front.aitool.show', ['ai_tool_slug' => $ai_tool->slug]) }}">{{ $ai_tool->tool_name }}</a><br>
<b>ID</b>: {{ $ai_tool->id }}<br>
<b>Added</b>: {{ $ai_tool->created_at->toDateTimeString() }}
</div>
@if ($ai_tool->has_emailed)
<div class="col d-flex">
<span class="align-self-center text-success">
Already emailed
</span>
</div>
<div class="col d-flex">
<span class="align-self-center text-success">
{{ $ai_tool->email }}
</span>
</div>
@else
<div class="col d-flex">
<span class="align-self-center text-danger">
Not yet emailed
</span>
</div>
<div class="col d-inline-flex justify-content-end">
<!-- Button trigger modal -->
<button type="button" class="btn btn-outline-primary d-inline"
data-bs-toggle="modal" data-bs-target="#staticBackdrop{{ $ai_tool->id }}">
Set to emailed
</button>
<!-- Modal -->
<form class="align-self-center" action="{{ route('ba.ai-tool-list.post') }}"
method="POST">
@csrf
<input type="hidden" name="id" value="{{ $ai_tool->id }}">
<div class="modal fade" id="staticBackdrop{{ $ai_tool->id }}"
data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1"
aria-labelledby="staticBackdropLabel{{ $ai_tool->id }}"
aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5"
id="staticBackdropLabel{{ $ai_tool->id }}">Set to
Emailed</h1>
<button type="button" class="btn-close"
data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<input required type="text" class="form-control"
name="email"
placeholder="Enter AI Tool Email (aitoolemail@email.com)">
</div>
<div class="modal-footer">
<button class="btn btn-outline-primary" type="submit">I
have emailed, Save</button>
</div>
</div>
</div>
</div>
</form>
</div>
@endif
</div>
</div>
</div>
</div>
@endforeach
@else
<div class="col-12">
<div class="card">
<div class="card-body p-5 text-center">
<p>No records found.</p>
</div>
</div>
</div>
@endif
</div>
</div>
@endsection

View File

@@ -14,7 +14,7 @@ class="btn btn-link d-inline-flex text-decoration-none hover-grow text-center ga
</a> </a>
</div> </div>
{{-- <div class="align-self-center"> {{-- <div class="align-self-center">
<a href="{{ route('front.submit-tool') }}">Submit your AI Tool <span <a href="{{ route('front.submit-tool') }}">Submit your AI Tool <span
class="badge text-bg-primary text-white">FREE!</span></a> class="badge text-bg-primary text-white">FREE!</span></a>
</div> --}} </div> --}}

View File

@@ -20,7 +20,8 @@
<p class="mb-3">Perks of a new AI tool directory: <span <p class="mb-3">Perks of a new AI tool directory: <span
class="bg-highlighter-pink py-1 px-2 fw-bold ">free tool submission!</span> We are grateful class="bg-highlighter-pink py-1 px-2 fw-bold ">free tool submission!</span> We are grateful
for your initial support and we wish to reward our early adopters with AI tool submission at for your initial support and we wish to reward our early adopters with AI tool submission at
<span class="bg-highlighter-yellow py-1 px-2 fw-bold">$0 charge.</span></p> <span class="bg-highlighter-yellow py-1 px-2 fw-bold">$0 charge.</span>
</p>
<p class="mb-3"> <p class="mb-3">
While our platform is still relatively new, we are commited to becoming one of the leading AI While our platform is still relatively new, we are commited to becoming one of the leading AI

View File

@@ -1,6 +1,6 @@
@php @php
$class = ''; $class = '';
if ('center' === $data['alignment']) { if ('center' === $data['alignment']) {
$class = 'text-center'; $class = 'text-center';
} elseif ('left' === $data['alignment']) { } elseif ('left' === $data['alignment']) {

View File

@@ -1,17 +1,17 @@
<image:image> <image:image>
@if (! empty($image->url)) @if (!empty($image->url))
<image:loc>{{ url($image->url) }}</image:loc> <image:loc>{{ url($image->url) }}</image:loc>
@endif @endif
@if (! empty($image->caption)) @if (!empty($image->caption))
<image:caption>{{ $image->caption }}</image:caption> <image:caption>{{ $image->caption }}</image:caption>
@endif @endif
@if (! empty($image->geo_location)) @if (!empty($image->geo_location))
<image:geo_location>{{ $image->geo_location }}</image:geo_location> <image:geo_location>{{ $image->geo_location }}</image:geo_location>
@endif @endif
@if (! empty($image->title)) @if (!empty($image->title))
<image:title>{{ $image->title }}</image:title> <image:title>{{ $image->title }}</image:title>
@endif @endif
@if (! empty($image->license)) @if (!empty($image->license))
<image:license>{{ $image->license }}</image:license> <image:license>{{ $image->license }}</image:license>
@endif @endif
</image:image> </image:image>

View File

@@ -5,7 +5,7 @@
</news:publication> </news:publication>
<news:title>{{ $news->title }}</news:title> <news:title>{{ $news->title }}</news:title>
<news:publication_date>{{ $news->publicationDate->toW3cString() }}</news:publication_date> <news:publication_date>{{ $news->publicationDate->toW3cString() }}</news:publication_date>
@foreach($news->options as $tag => $value) @foreach ($news->options as $tag => $value)
<news:{{$tag}}>{{$value}}</news:{{$tag}}> <news:{{ $tag }}>{{ $value }}</news:{{ $tag }}>
@endforeach @endforeach
</news:news> </news:news>

View File

@@ -1,6 +1,9 @@
<?= '<'.'?'.'xml version="1.0" encoding="UTF-8"?>'."\n"; ?> <?= '<' . '?' . 'xml version="1.0" encoding="UTF-8"?>' . "\n" ?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9"> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml"
@foreach($tags as $tag) xmlns:image="http://www.google.com/schemas/sitemap-image/1.1"
@include('sitemap::' . $tag->getType()) xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"
@endforeach xmlns:news="http://www.google.com/schemas/sitemap-news/0.9">
@foreach ($tags as $tag)
@include('sitemap::' . $tag->getType())
@endforeach
</urlset> </urlset>

View File

@@ -1,6 +1,6 @@
<?= '<'.'?'.'xml version="1.0" encoding="UTF-8"?>'."\n" ?> <?= '<' . '?' . 'xml version="1.0" encoding="UTF-8"?>' . "\n" ?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
@foreach($tags as $tag) @foreach ($tags as $tag)
@include('sitemap::sitemapIndex/' . $tag->getType()) @include('sitemap::sitemapIndex/' . $tag->getType())
@endforeach @endforeach
</sitemapindex> </sitemapindex>

View File

@@ -1,8 +1,8 @@
<sitemap> <sitemap>
@if (! empty($tag->url)) @if (!empty($tag->url))
<loc>{{ url($tag->url) }}</loc> <loc>{{ url($tag->url) }}</loc>
@endif @endif
@if (! empty($tag->lastModificationDate)) @if (!empty($tag->lastModificationDate))
<lastmod>{{ $tag->lastModificationDate->format(DateTime::ATOM) }}</lastmod> <lastmod>{{ $tag->lastModificationDate->format(DateTime::ATOM) }}</lastmod>
@endif @endif
</sitemap> </sitemap>

View File

@@ -1,19 +1,19 @@
<url> <url>
@if (! empty($tag->url)) @if (!empty($tag->url))
<loc>{{ url($tag->url) }}</loc> <loc>{{ url($tag->url) }}</loc>
@endif @endif
@if (count($tag->alternates)) @if (count($tag->alternates))
@foreach ($tag->alternates as $alternate) @foreach ($tag->alternates as $alternate)
<xhtml:link rel="alternate" hreflang="{{ $alternate->locale }}" href="{{ url($alternate->url) }}" /> <xhtml:link rel="alternate" hreflang="{{ $alternate->locale }}" href="{{ url($alternate->url) }}" />
@endforeach @endforeach
@endif
@if (! empty($tag->lastModificationDate))
<lastmod>{{ $tag->lastModificationDate->format(DateTime::ATOM) }}</lastmod>
@endif
@if (! empty($tag->changeFrequency))
<changefreq>{{ $tag->changeFrequency }}</changefreq>
@endif @endif
<priority>{{ number_format($tag->priority,1) }}</priority> @if (!empty($tag->lastModificationDate))
<lastmod>{{ $tag->lastModificationDate->format(DateTime::ATOM) }}</lastmod>
@endif
@if (!empty($tag->changeFrequency))
<changefreq>{{ $tag->changeFrequency }}</changefreq>
@endif
<priority>{{ number_format($tag->priority, 1) }}</priority>
@each('sitemap::image', $tag->images, 'image') @each('sitemap::image', $tag->images, 'image')
@each('sitemap::video', $tag->videos, 'video') @each('sitemap::video', $tag->videos, 'video')
@each('sitemap::news', $tag->news, 'news') @each('sitemap::news', $tag->news, 'news')

View File

@@ -2,22 +2,22 @@
<video:thumbnail_loc>{{ $video->thumbnailLoc }}</video:thumbnail_loc> <video:thumbnail_loc>{{ $video->thumbnailLoc }}</video:thumbnail_loc>
<video:title>{{ $video->title }}</video:title> <video:title>{{ $video->title }}</video:title>
<video:description>{{ $video->description }}</video:description> <video:description>{{ $video->description }}</video:description>
@if ($video->contentLoc) @if ($video->contentLoc)
<video:content_loc>{{ $video->contentLoc }}</video:content_loc> <video:content_loc>{{ $video->contentLoc }}</video:content_loc>
@endif @endif
@if ($video->playerLoc) @if ($video->playerLoc)
<video:player_loc>{{ $video->playerLoc }}</video:player_loc> <video:player_loc>{{ $video->playerLoc }}</video:player_loc>
@endif @endif
@foreach($video->options as $tag => $value) @foreach ($video->options as $tag => $value)
<video:{{$tag}}>{{$value}}</video:{{$tag}}> <video:{{ $tag }}>{{ $value }}</video:{{ $tag }}>
@endforeach @endforeach
@foreach($video->allow as $tag => $value) @foreach ($video->allow as $tag => $value)
<video:{{$tag}} relationship="allow">{{$value}}</video:{{$tag}}> <video:{{ $tag }} relationship="allow">{{ $value }}</video:{{ $tag }}>
@endforeach @endforeach
@foreach($video->deny as $tag => $value) @foreach ($video->deny as $tag => $value)
<video:{{$tag}} relationship="deny">{{$value}}</video:{{$tag}}> <video:{{ $tag }} relationship="deny">{{ $value }}</video:{{ $tag }}>
@endforeach @endforeach
@foreach($video->tags as $tag) @foreach ($video->tags as $tag)
<video:tag>{{ $tag }}</video:tag> <video:tag>{{ $tag }}</video:tag>
@endforeach @endforeach
</video:video> </video:video>

View File

@@ -17,8 +17,6 @@
Auth::routes(); Auth::routes();
// Route::prefix('admin')->middleware('auth')->group(function () { // Route::prefix('admin')->middleware('auth')->group(function () {
// Route::get('/', [App\Http\Controllers\Admin\DashboardController::class, 'index'])->name('dashboard'); // Route::get('/', [App\Http\Controllers\Admin\DashboardController::class, 'index'])->name('dashboard');
@@ -45,7 +43,6 @@
// Route::get('/prime/;ogin', [App\Http\Controllers\Admin\AdminLoginController::class, 'index'])->name('admin.login'); // Route::get('/prime/;ogin', [App\Http\Controllers\Admin\AdminLoginController::class, 'index'])->name('admin.login');
Route::get('/', [App\Http\Controllers\Front\FrontHomeController::class, 'index'])->name('front.home'); Route::get('/', [App\Http\Controllers\Front\FrontHomeController::class, 'index'])->name('front.home');
Route::prefix('discover')->group(function () { Route::prefix('discover')->group(function () {
@@ -87,3 +84,9 @@
Route::get('/privacy', [App\Http\Controllers\Front\FrontHomeController::class, 'privacy'])->name('front.privacy')->middleware('cacheResponse:2630000'); Route::get('/privacy', [App\Http\Controllers\Front\FrontHomeController::class, 'privacy'])->name('front.privacy')->middleware('cacheResponse:2630000');
Route::get('/disclaimer', [App\Http\Controllers\Front\FrontHomeController::class, 'disclaimer'])->name('front.disclaimer')->middleware('cacheResponse:2630000'); Route::get('/disclaimer', [App\Http\Controllers\Front\FrontHomeController::class, 'disclaimer'])->name('front.disclaimer')->middleware('cacheResponse:2630000');
Route::prefix('ba')->middleware('horizonBasicAuth')->group(function () {
Route::get('ai-tool-list', [App\Http\Controllers\BasicAuthAdmin\AIToolListController::class, 'index'])->name('ba.ai-tool-list');
Route::post('ai-tool-list/set-to-emailed', [App\Http\Controllers\BasicAuthAdmin\AIToolListController::class, 'setToEmailed'])->name('ba.ai-tool-list.post');
});