Update (config): enable canonical

Update (migration): Add category type
Add (admin): Add post cliffhanger
This commit is contained in:
2023-08-03 19:46:32 +08:00
parent 8d11ccf2de
commit 500714d7bf
41 changed files with 366 additions and 229 deletions

View File

@@ -80,6 +80,7 @@ public function postUpsert(Request $request)
'title' => $request->input('title'), 'title' => $request->input('title'),
'slug' => $request->input('slug'), 'slug' => $request->input('slug'),
'excerpt' => $request->input('excerpt'), 'excerpt' => $request->input('excerpt'),
'cliffhanger' => $request->input('cliffhanger'),
'author_id' => intval($request->input('author_id', 1)), 'author_id' => intval($request->input('author_id', 1)),
'featured' => filter_var($request->input('featured'), FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE), 'featured' => filter_var($request->input('featured'), FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE),
'featured_image' => $request->input('featured_image'), 'featured_image' => $request->input('featured_image'),

View File

@@ -121,9 +121,19 @@ public function countryCategory(Request $request, $country, $category)
SEOTools::opengraph(); SEOTools::opengraph();
SEOTools::jsonLd(); SEOTools::jsonLd();
$this_month = now()->format('F Y');
$country_name = get_country_name_by_iso($country_locale->country_iso); $country_name = get_country_name_by_iso($country_locale->country_iso);
SEOTools::setTitle("Top {$category->name} Reviews in {$country_name}"); //dd($category->type);
if ($category->type == 'review') {
SEOTools::setTitle("Top {$category->name} Reviews for {$this_month} in {$country_name}");
} elseif ($category->type == 'deals') {
SEOTools::setTitle("{$this_month} Latest Deals, Coupon Codes & Vouchers for {$country_name}");
} elseif ($category->type == 'launch') {
SEOTools::setTitle("New {$this_month} Product Launches in {$country_name}");
}
$category_name = strtolower($category->name); $category_name = strtolower($category->name);

View File

@@ -45,6 +45,7 @@ class Category extends Model
]; ];
protected $fillable = [ protected $fillable = [
'type',
'country_locale_id', 'country_locale_id',
'name', 'name',
'short_name', 'short_name',

View File

@@ -49,6 +49,7 @@ class Post extends Model implements Feedable
protected $fillable = [ protected $fillable = [
'title', 'title',
'slug', 'slug',
'cliffhanger',
'excerpt', 'excerpt',
'author_id', 'author_id',
'featured_image', 'featured_image',

View File

@@ -14,7 +14,7 @@
'description' => 'Find top-rated product reviews at ProductAlert. Discover the latest trends, best brands, and right prices. Your guide to making the best purchase decisions!', // set false to total remove 'description' => 'Find top-rated product reviews at ProductAlert. Discover the latest trends, best brands, and right prices. Your guide to making the best purchase decisions!', // set false to total remove
'separator' => ' - ', 'separator' => ' - ',
'keywords' => [], 'keywords' => [],
'canonical' => false, // Set to null or 'full' to use Url::full(), set to 'current' to use Url::current(), set false to total remove 'canonical' => 'full', // Set to null or 'full' to use Url::full(), set to 'current' to use Url::current(), set false to total remove
'robots' => false, // Set to 'all', 'none' or any combination of index/noindex and follow/nofollow 'robots' => false, // Set to 'all', 'none' or any combination of index/noindex and follow/nofollow
], ],
/* /*

View File

@@ -0,0 +1,28 @@
<?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('categories', function (Blueprint $table) {
$table->enum('type', ['review', 'launch', 'deals'])->default('review')->after('id');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('categories', function (Blueprint $table) {
$table->dropColumn('type');
});
}
};

View File

@@ -0,0 +1,28 @@
<?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('posts', function (Blueprint $table) {
$table->string('cliffhanger')->after('excerpt')->nullable();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('posts', function (Blueprint $table) {
$table->dropColumn('cliffhanger');
});
}
};

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{_ as Le,a0 as Zt,c as Oe,i as Ne,r as Re,o as De,h as Pe}from"./admin-app-e35bae28.js";import"./index-8746c87e.js";var Fe=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 St(){}Object.assign(St,{default:St,register:St,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)});let He=(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 oe=(s=>(s.VERBOSE="VERBOSE",s.INFO="INFO",s.WARN="WARN",s.ERROR="ERROR",s))(oe||{});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},je={LEFT:0,WHEEL:1,RIGHT:2,BACKWARD:3,FORWARD:4};function gt(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(gt.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.27.2",l=`line-height: 1em; import{_ as Le,a0 as Zt,c as Oe,i as Ne,r as Re,o as De,h as Pe}from"./admin-app-c0ef582d.js";import"./index-8746c87e.js";var Fe=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 St(){}Object.assign(St,{default:St,register:St,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)});let He=(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 oe=(s=>(s.VERBOSE="VERBOSE",s.INFO="INFO",s.WARN="WARN",s.ERROR="ERROR",s))(oe||{});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},je={LEFT:0,WHEEL:1,RIGHT:2,BACKWARD:3,FORWARD:4};function gt(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(gt.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.27.2",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 Le,a0 as Zt,c as Oe,i as Ne,r as Re,o as De,h as Pe}from"./admin-app
* @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 yi{static get version(){return"2.27.2"}constructor(t){let e=()=>{};z(t)&&D(t.onReady)&&(e=t.onReady);const o=new wi(t);this.isReady=o.isReady.then(()=>{this.exportAPI(o),e()})}exportAPI(t){const e=["configuration"],o=()=>{Object.values(t.moduleInstances).forEach(i=>{D(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-41424f0c.js").then(s=>s.b),["assets/bundle-41424f0c.js","assets/admin-app-e35bae28.js","assets/index-8746c87e.js","assets/admin-app-935fc652.css"]),list:Zt(()=>import("./bundle-b72e7d36.js").then(s=>s.b),["assets/bundle-b72e7d36.js","assets/admin-app-e35bae28.js","assets/index-8746c87e.js","assets/admin-app-935fc652.css"])},Ei=Oe({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 yi({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 De(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)}}}),Si=["id"];function Ci(s,t,e,o,i,n){return Pe(),Ne("div",{id:s.holder},null,8,Si)}const Ii=Le(Ei,[["render",Ci]]);export{Tt as PLUGINS,Ii as default}; */class yi{static get version(){return"2.27.2"}constructor(t){let e=()=>{};z(t)&&D(t.onReady)&&(e=t.onReady);const o=new wi(t);this.isReady=o.isReady.then(()=>{this.exportAPI(o),e()})}exportAPI(t){const e=["configuration"],o=()=>{Object.values(t.moduleInstances).forEach(i=>{D(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-7b5ccf90.js").then(s=>s.b),["assets/bundle-7b5ccf90.js","assets/admin-app-c0ef582d.js","assets/index-8746c87e.js","assets/admin-app-935fc652.css"]),list:Zt(()=>import("./bundle-dbffa4bb.js").then(s=>s.b),["assets/bundle-dbffa4bb.js","assets/admin-app-c0ef582d.js","assets/index-8746c87e.js","assets/admin-app-935fc652.css"])},Ei=Oe({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 yi({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 De(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)}}}),Si=["id"];function Ci(s,t,e,o,i,n){return Pe(),Ne("div",{id:s.holder},null,8,Si)}const Ii=Le(Ei,[["render",Ci]]);export{Tt as PLUGINS,Ii as default};

File diff suppressed because one or more lines are too long

View File

@@ -1,4 +1,4 @@
import{g as N}from"./admin-app-e35bae28.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"./admin-app-c0ef582d.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"./admin-app-e35bae28.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"./admin-app-c0ef582d.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.

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@@ -3,25 +3,25 @@
"file": "assets/NativeImageBlock-e3b0c442.css", "file": "assets/NativeImageBlock-e3b0c442.css",
"src": "NativeImageBlock.css" "src": "NativeImageBlock.css"
}, },
"_NativeImageBlock-33ab90b8.js": { "_NativeImageBlock-610fd8da.js": {
"css": [ "css": [
"assets/NativeImageBlock-e3b0c442.css" "assets/NativeImageBlock-e3b0c442.css"
], ],
"file": "assets/NativeImageBlock-33ab90b8.js", "file": "assets/NativeImageBlock-610fd8da.js",
"imports": [ "imports": [
"resources/js/admin-app.js" "resources/js/admin-app.js"
], ],
"isDynamicEntry": true "isDynamicEntry": true
}, },
"_bundle-41424f0c.js": { "_bundle-7b5ccf90.js": {
"file": "assets/bundle-41424f0c.js", "file": "assets/bundle-7b5ccf90.js",
"imports": [ "imports": [
"resources/js/admin-app.js" "resources/js/admin-app.js"
], ],
"isDynamicEntry": true "isDynamicEntry": true
}, },
"_bundle-b72e7d36.js": { "_bundle-dbffa4bb.js": {
"file": "assets/bundle-b72e7d36.js", "file": "assets/bundle-dbffa4bb.js",
"imports": [ "imports": [
"resources/js/admin-app.js" "resources/js/admin-app.js"
], ],
@@ -47,11 +47,11 @@
"assets/admin-app-935fc652.css" "assets/admin-app-935fc652.css"
], ],
"dynamicImports": [ "dynamicImports": [
"_NativeImageBlock-33ab90b8.js", "_NativeImageBlock-610fd8da.js",
"resources/js/vue/PostEditor.vue", "resources/js/vue/PostEditor.vue",
"resources/js/vue/VueEditorJs.vue" "resources/js/vue/VueEditorJs.vue"
], ],
"file": "assets/admin-app-e35bae28.js", "file": "assets/admin-app-c0ef582d.js",
"imports": [ "imports": [
"_index-8746c87e.js" "_index-8746c87e.js"
], ],
@@ -74,12 +74,12 @@
"css": [ "css": [
"assets/PostEditor-8d534a4a.css" "assets/PostEditor-8d534a4a.css"
], ],
"file": "assets/PostEditor-c29a9e44.js", "file": "assets/PostEditor-8fdf28c3.js",
"imports": [ "imports": [
"resources/js/vue/VueEditorJs.vue", "resources/js/vue/VueEditorJs.vue",
"_NativeImageBlock-33ab90b8.js", "_NativeImageBlock-610fd8da.js",
"_bundle-b72e7d36.js", "_bundle-dbffa4bb.js",
"_bundle-41424f0c.js", "_bundle-7b5ccf90.js",
"resources/js/admin-app.js", "resources/js/admin-app.js",
"_index-8746c87e.js" "_index-8746c87e.js"
], ],
@@ -88,10 +88,10 @@
}, },
"resources/js/vue/VueEditorJs.vue": { "resources/js/vue/VueEditorJs.vue": {
"dynamicImports": [ "dynamicImports": [
"_bundle-41424f0c.js", "_bundle-7b5ccf90.js",
"_bundle-b72e7d36.js" "_bundle-dbffa4bb.js"
], ],
"file": "assets/VueEditorJs-c635dcbc.js", "file": "assets/VueEditorJs-fc69dbb5.js",
"imports": [ "imports": [
"resources/js/admin-app.js", "resources/js/admin-app.js",
"_index-8746c87e.js" "_index-8746c87e.js"
@@ -105,7 +105,7 @@
"src": "resources/sass/admin-app.scss" "src": "resources/sass/admin-app.scss"
}, },
"resources/sass/front-app.scss": { "resources/sass/front-app.scss": {
"file": "assets/front-app-af471554.css", "file": "assets/front-app-1a35e3f2.css",
"isEntry": true, "isEntry": true,
"src": "resources/sass/front-app.scss" "src": "resources/sass/front-app.scss"
} }

Binary file not shown.

View File

@@ -52,3 +52,21 @@ footer.image-caption {
text-align: center; text-align: center;
opacity: 0.7; opacity: 0.7;
} }
.glow-1 {
-webkit-box-shadow: 0px 0px 9px 5px rgba(45, 255, 196, 0.38);
-moz-box-shadow: 0px 0px 9px 5px rgba(45, 255, 196, 0.38);
box-shadow: 0px 0px 9px 5px rgba(45, 255, 196, 0.38);
}
.glow-2 {
-webkit-box-shadow: 0px 0px 9px 5px rgba(238, 46, 255, 0.38);
-moz-box-shadow: 0px 0px 9px 5px rgba(238, 46, 255, 0.38);
box-shadow: 0px 0px 9px 5px rgba(238, 46, 255, 0.38);
}
.glow-3 {
-webkit-box-shadow: 0px 0px 9px 5px rgba(46, 147, 255, 0.38);
-moz-box-shadow: 0px 0px 9px 5px rgba(46, 147, 255, 0.38);
box-shadow: 0px 0px 9px 5px rgba(46, 147, 255, 0.38);
}

View File

@@ -17,6 +17,24 @@
</small> </small>
</div> </div>
<div class="form-floating mb-3">
<textarea
v-model="post.cliffhanger"
class="form-control"
style="min-height: 150px"
placeholder="Enter a post cliffhanger"
></textarea>
<label>Write a post cliffhanger (optional)</label>
<div class="alert mt-1">
Cliffhanger examples: "<i
>Can Alpinestars Tech-Air redefine motorcycle safety? Find out
now.</i
>" or "<i
>Are they worth the hype? Stay tuned for our in-depth review."</i
>
</div>
</div>
<div class="form-floating mb-3"> <div class="form-floating mb-3">
<textarea <textarea
v-model="post.excerpt" v-model="post.excerpt"
@@ -222,8 +240,9 @@ export default {
title: "", title: "",
slug: "", slug: "",
excerpt: "", excerpt: "",
cliffhanger: "",
author_id: null, author_id: null,
featured: false, featured: true,
publish_date: null, publish_date: null,
featured_image: null, featured_image: null,
body: { body: {
@@ -592,6 +611,7 @@ export default {
tmp.slug = post.slug; tmp.slug = post.slug;
tmp.publish_date = post.publish_date; tmp.publish_date = post.publish_date;
tmp.excerpt = post.excerpt; tmp.excerpt = post.excerpt;
tmp.cliffhanger = post.cliffhanger;
tmp.author_id = post.author_id; tmp.author_id = post.author_id;
tmp.featured = post.featured; tmp.featured = post.featured;
tmp.featured_image = post.featured_image; tmp.featured_image = post.featured_image;

View File

@@ -1,4 +1,4 @@
const Ziggy = {"url":"https:\/\/productalert.co","port":null,"defaults":{},"routes":{"debugbar.openhandler":{"uri":"_debugbar\/open","methods":["GET","HEAD"]},"debugbar.clockwork":{"uri":"_debugbar\/clockwork\/{id}","methods":["GET","HEAD"]},"debugbar.assets.css":{"uri":"_debugbar\/assets\/stylesheets","methods":["GET","HEAD"]},"debugbar.assets.js":{"uri":"_debugbar\/assets\/javascript","methods":["GET","HEAD"]},"debugbar.cache.delete":{"uri":"_debugbar\/cache\/{key}\/{tags?}","methods":["DELETE"]},"sanctum.csrf-cookie":{"uri":"sanctum\/csrf-cookie","methods":["GET","HEAD"]},"ignition.healthCheck":{"uri":"_ignition\/health-check","methods":["GET","HEAD"]},"ignition.executeSolution":{"uri":"_ignition\/execute-solution","methods":["POST"]},"ignition.updateConfig":{"uri":"_ignition\/update-config","methods":["POST"]},"api.auth.login.post":{"uri":"api\/login","methods":["POST"]},"api.auth.logout.post":{"uri":"api\/logout","methods":["POST"]},"api.admin.post.get":{"uri":"api\/admin\/post\/{id}","methods":["GET","HEAD"]},"api.admin.country-locales":{"uri":"api\/admin\/country-locales","methods":["GET","HEAD"]},"api.admin.categories":{"uri":"api\/admin\/categories\/{country_locale_slug}","methods":["GET","HEAD"]},"api.admin.authors":{"uri":"api\/admin\/authors","methods":["GET","HEAD"]},"api.admin.upload.cloud.image":{"uri":"api\/admin\/image\/upload","methods":["POST"]},"api.admin.post.upsert":{"uri":"api\/admin\/admin\/post\/upsert","methods":["POST"]},"feeds.main":{"uri":"posts.rss","methods":["GET","HEAD"]},"login":{"uri":"login","methods":["GET","HEAD"]},"logout":{"uri":"logout","methods":["POST"]},"register":{"uri":"register","methods":["GET","HEAD"]},"password.request":{"uri":"password\/reset","methods":["GET","HEAD"]},"password.email":{"uri":"password\/email","methods":["POST"]},"password.reset":{"uri":"password\/reset\/{token}","methods":["GET","HEAD"]},"password.update":{"uri":"password\/reset","methods":["POST"]},"password.confirm":{"uri":"password\/confirm","methods":["GET","HEAD"]},"dashboard":{"uri":"admin","methods":["GET","HEAD"]},"about":{"uri":"admin\/about","methods":["GET","HEAD"]},"users.index":{"uri":"admin\/users","methods":["GET","HEAD"]},"posts.manage":{"uri":"admin\/posts","methods":["GET","HEAD"]},"posts.manage.edit":{"uri":"admin\/posts\/edit\/{post_id}","methods":["GET","HEAD"]},"posts.manage.delete":{"uri":"admin\/posts\/delete\/{post_id}","methods":["GET","HEAD"]},"posts.manage.indexing":{"uri":"admin\/posts\/indexing\/{post_id}","methods":["GET","HEAD"]},"posts.manage.new":{"uri":"admin\/posts\/new","methods":["GET","HEAD"]},"profile.show":{"uri":"admin\/profile","methods":["GET","HEAD"]},"profile.update":{"uri":"admin\/profile","methods":["PUT"]},"home":{"uri":"\/","methods":["GET","HEAD"]},"home.country":{"uri":"{country}","methods":["GET","HEAD"]},"home.country.posts":{"uri":"{country}\/posts","methods":["GET","HEAD"]},"home.country.post":{"uri":"{country}\/posts\/{post_slug}","methods":["GET","HEAD"]},"home.country.category":{"uri":"{country}\/{category}","methods":["GET","HEAD"]}}}; const Ziggy = {"url":"https:\/\/productalert.co","port":null,"defaults":{},"routes":{"debugbar.openhandler":{"uri":"_debugbar\/open","methods":["GET","HEAD"]},"debugbar.clockwork":{"uri":"_debugbar\/clockwork\/{id}","methods":["GET","HEAD"]},"debugbar.assets.css":{"uri":"_debugbar\/assets\/stylesheets","methods":["GET","HEAD"]},"debugbar.assets.js":{"uri":"_debugbar\/assets\/javascript","methods":["GET","HEAD"]},"debugbar.cache.delete":{"uri":"_debugbar\/cache\/{key}\/{tags?}","methods":["DELETE"]},"sanctum.csrf-cookie":{"uri":"sanctum\/csrf-cookie","methods":["GET","HEAD"]},"ignition.healthCheck":{"uri":"_ignition\/health-check","methods":["GET","HEAD"]},"ignition.executeSolution":{"uri":"_ignition\/execute-solution","methods":["POST"]},"ignition.updateConfig":{"uri":"_ignition\/update-config","methods":["POST"]},"api.auth.login.post":{"uri":"api\/login","methods":["POST"]},"api.auth.logout.post":{"uri":"api\/logout","methods":["POST"]},"api.admin.post.get":{"uri":"api\/admin\/post\/{id}","methods":["GET","HEAD"]},"api.admin.country-locales":{"uri":"api\/admin\/country-locales","methods":["GET","HEAD"]},"api.admin.categories":{"uri":"api\/admin\/categories\/{country_locale_slug}","methods":["GET","HEAD"]},"api.admin.authors":{"uri":"api\/admin\/authors","methods":["GET","HEAD"]},"api.admin.upload.cloud.image":{"uri":"api\/admin\/image\/upload","methods":["POST"]},"api.admin.post.upsert":{"uri":"api\/admin\/admin\/post\/upsert","methods":["POST"]},"feeds.main":{"uri":"posts.rss","methods":["GET","HEAD"]},"login":{"uri":"login","methods":["GET","HEAD"]},"logout":{"uri":"logout","methods":["POST"]},"register":{"uri":"register","methods":["GET","HEAD"]},"password.request":{"uri":"password\/reset","methods":["GET","HEAD"]},"password.email":{"uri":"password\/email","methods":["POST"]},"password.reset":{"uri":"password\/reset\/{token}","methods":["GET","HEAD"]},"password.update":{"uri":"password\/reset","methods":["POST"]},"password.confirm":{"uri":"password\/confirm","methods":["GET","HEAD"]},"dashboard":{"uri":"admin","methods":["GET","HEAD"]},"admin.changelog":{"uri":"admin\/changelog","methods":["GET","HEAD"]},"about":{"uri":"admin\/about","methods":["GET","HEAD"]},"users.index":{"uri":"admin\/users","methods":["GET","HEAD"]},"posts.manage":{"uri":"admin\/posts","methods":["GET","HEAD"]},"posts.manage.edit":{"uri":"admin\/posts\/edit\/{post_id}","methods":["GET","HEAD"]},"posts.manage.delete":{"uri":"admin\/posts\/delete\/{post_id}","methods":["GET","HEAD"]},"posts.manage.indexing":{"uri":"admin\/posts\/indexing\/{post_id}","methods":["GET","HEAD"]},"posts.manage.new":{"uri":"admin\/posts\/new","methods":["GET","HEAD"]},"profile.show":{"uri":"admin\/profile","methods":["GET","HEAD"]},"profile.update":{"uri":"admin\/profile","methods":["PUT"]},"home":{"uri":"\/","methods":["GET","HEAD"]},"home.country":{"uri":"{country}","methods":["GET","HEAD"]},"home.country.posts":{"uri":"{country}\/posts","methods":["GET","HEAD"]},"home.country.post":{"uri":"{country}\/posts\/{post_slug}","methods":["GET","HEAD"]},"home.country.category":{"uri":"{country}\/{category}","methods":["GET","HEAD"]}}};
if (typeof window !== 'undefined' && typeof window.Ziggy !== 'undefined') { if (typeof window !== 'undefined' && typeof window.Ziggy !== 'undefined') {
Object.assign(Ziggy.routes, window.Ziggy.routes); Object.assign(Ziggy.routes, window.Ziggy.routes);

View File

@@ -0,0 +1,47 @@
@extends('layouts.admin.app')
@section('content')
<div class="container-xl">
<!-- Page title -->
<div class="page-header d-print-none">
<h2 class="page-title">
{{ __('Changelog') }}
</h2>
</div>
</div>
<div class="page-body">
<div class="container-xl">
<div class="card">
<div class="card-body">
<p class="fw-bold mb-0">Change Log 3/8/2023 7.43pm</p>
<ul>
<li>(Improvement) Improve post UI outside front</li>
<li>(Fix) SEO problems</li>
<li>(Feature) Add cliffhanger field in post</li>
</ul>
<p class="fw-bold mb-0">Change Log 2/8/2023 12.03am</p>
<ul>
<li>(Feature) Add Delete Forever button</li>
<li>(Feature) Add Index to Search Engines button</li>
<li>(Feature) Auto set author on new post</li>
<li>(Feature) Only publish status must fill in all post fields, others status can save with minimum
title and
slug only</li>
<li>(Fix) Post list has timezone error</li>
</ul>
<p class="fw-bold mb-0">Change Log 1/8/2023 10.35pm</p>
<ul>
<li>(Feature) Auto set category on new post</li>
<li>(Feature) Auto set author on new post</li>
<li>(Feature) Only publish status must fill in all post fields, others status can save with minimum
title and
slug only</li>
<li>(Fix) Post list has timezone error</li>
</ul>
</div>
</div>
</div>
</div>
@endsection

View File

@@ -2,25 +2,14 @@
<div class="card-body"> <div class="card-body">
<h3 class="">Webmaster Announcement</h3> <h3 class="">Webmaster Announcement</h3>
<div class="text-muted"> <div class="text-muted">
<p class="fw-bold mb-0">Change Log 2/8/2023 12.03am</p> <p class="fw-bold mb-0">Change Log 3/8/2023 7.43pm</p>
<ul> <ul>
<li>(Feature) Add Delete Forever button</li> <li>(Improvement) Improve post UI outside front</li>
<li>(Feature) Add Index to Search Engines button</li> <li>(Fix) SEO problems</li>
<li>(Feature) Auto set author on new post</li> <li>(Feature) Add cliffhanger field in post</li>
<li>(Feature) Only publish status must fill in all post fields, others status can save with minimum
title and
slug only</li>
<li>(Fix) Post list has timezone error</li>
</ul>
<p class="fw-bold mb-0">Change Log 1/8/2023 10.35pm</p>
<ul>
<li>(Feature) Auto set category on new post</li>
<li>(Feature) Auto set author on new post</li>
<li>(Feature) Only publish status must fill in all post fields, others status can save with minimum
title and
slug only</li>
<li>(Fix) Post list has timezone error</li>
</ul> </ul>
</div>
</div>
<a href="{{ route('admin.changelog') }}">View all changelogs here</a>
</div> </div>
</div> </div>

View File

@@ -17,54 +17,9 @@
<h3 class="h4 fw-bold text-center mb-3">Featured Articles</h3> <h3 class="h4 fw-bold text-center mb-3">Featured Articles</h3>
<div class="row g-3 justify-content-center"> <div class="row g-3 justify-content-center">
@foreach ($featured_posts as $post) @foreach ($featured_posts as $post)
<div class="col-12 col-xl-3"> <div class="col-9 col-md-6 col-xl-3">
<div class="card shadow-sm" style="height:100%;"> @include('front.partials.featured_post_card', ['post' => $post])
<a href="{{ route('home.country.post', ['country' => $country_locale->country_iso, 'post_slug' => $post->slug]) }}"
class="text-decoration-none">
<div class="card-img-top ratio ratio-16x9">
<div class="lqip-loader">
<!-- Use the LQIP image with the appropriate URL -->
<img src="{{ $post->featured_image }}" alt="Photo of {{ $post->name }}">
<!-- Use the final JPEG image with the appropriate URL -->
<img class="lqip-frozen" src="{{ $post->featured_image_lqip }}"
alt="Placeholder image of {{ $post->name }}">
</div>
</div>
</a>
<div class="card-body d-flex justify-content-between flex-column">
<div class="mb-2">
<p class="card-text fw-bold">
<a href="{{ route('home.country.post', ['country' => $country_locale->country_iso, 'post_slug' => $post->slug]) }}"
class="text-decoration-none">{{ $post->title }}</a>
</p>
</div>
<div>
<p class="card-text mb-0">
<small>in </small>
@foreach ($post->post_categories as $post_category)
<small><a class="text-decoration-none"
href="{{ route('home.country.category', ['country' => $country_locale->country_iso, 'category' => $post_category->category->slug]) }}">{{ $post_category->category->name }}</a>
</small>
@if (!$loop->last)
,
@endif
@endforeach
{{-- <small class="text-body-secondary ms-2">3 min read</small> --}}
</p>
<div class="d-flex justify-content-between align-items-center">
<small
class="text-body-secondary">{{ $post->publish_date->format('j F Y') }}</small>
{{-- <small class="text-body-secondary">9 min read</small> --}}
</div>
</div>
</div>
</div>
</div> </div>
@endforeach @endforeach
@@ -83,55 +38,9 @@ class="text-body-secondary">{{ $post->publish_date->format('j F Y') }}</small>
{{ get_country_name_by_iso($country_locale->country_iso) }}</h3> {{ get_country_name_by_iso($country_locale->country_iso) }}</h3>
<div class="row g-3"> <div class="row g-3">
@foreach ($latest_posts as $post) @foreach ($latest_posts as $post)
<div class="col-lg-6"> <div class="col-12 col-lg-6">
<div class="card" style="height:100%;"> @include('front.partials.small_list_card', ['post' => $post])
<div class="row g-0">
<div class="col-md-5">
<a href="{{ route('home.country.post', ['country' => $country_locale->country_iso, 'post_slug' => $post->slug]) }}"
class="text-decoration-none">
<div class="img-fluid rounded-start ratio ratio-16x9">
<div class="lqip-loader">
<!-- Use the LQIP image with the appropriate URL -->
<img src="{{ $post->featured_image }}"
alt="Photo of {{ $post->name }}">
<!-- Use the final JPEG image with the appropriate URL -->
<img class="lqip-frozen" src="{{ $post->featured_image_lqip }}"
alt="Placeholder image of {{ $post->name }}">
</div>
</div>
</a>
</div>
<div class="col-md-7">
<div class="card-body d-flex justify-content-between flex-column"
style="height:100%;">
<div>
<a href="{{ route('home.country.post', ['country' => $country_locale->country_iso, 'post_slug' => $post->slug]) }}"
class="text-decoration-none">
<p class="card-title fw-bold">{{ $post->title }}</p>
</a>
</div>
<div class="d-flex justify-content-between align-items-center">
<p class="card-text mb-0">
<small>in </small>
@foreach ($post->post_categories as $post_category)
<small><a class="text-decoration-none"
href="{{ route('home.country.category', ['country' => $country_locale->country_iso, 'category' => $post_category->category->slug]) }}">{{ $post_category->category->name }}</a>
</small>
@if (!$loop->last)
,
@endif
@endforeach
{{-- <small class="text-body-secondary ms-2">3 min read</small> --}}
</p>
<small
class="text-body-secondary">{{ $post->publish_date->format('j F Y') }}</small>
</div>
</div>
</div>
</div>
</div>
</div> </div>
@endforeach @endforeach

View File

@@ -23,42 +23,7 @@
<div class="my-3"> <div class="my-3">
<div class="card mb-3"> @include('front.partials.post_list_card', ['post' => $post])
<div class="card-body">
<h5 class="card-title">
<a class="text-decoration-none fw-bold"
href="{{ route('home.country.post', ['country' => $country_locale->country_iso, 'post_slug' => $post->slug]) }}">{{ $post->title }}</a>
</h5>
<p class="card-text">
in
@foreach ($post->post_categories as $post_category)
<small><a class="text-decoration-none"
href="{{ route('home.country.category', ['country' => $country_locale->country_iso, 'category' => $post_category->category->slug]) }}">{{ $post_category->category->name }}</a>
</small>
@endforeach
<small
class="text-body-secondary ms-2">{{ $post->publish_date->format('j F Y') }}</small>
</p>
</div>
<a class="card-img-top"
href="{{ route('home.country.post', ['country' => $country_locale->country_iso, 'post_slug' => $post->slug]) }}">
<div class="img-fluid rounded-start ratio ratio-16x9">
<div class="lqip-loader">
<!-- Use the LQIP image with the appropriate URL -->
<img src="{{ $post->featured_image }}" alt="Photo of {{ $post->name }}">
<!-- Use the final JPEG image with the appropriate URL -->
<img class="lqip-frozen" src="{{ $post->featured_image_lqip }}"
alt="Placeholder image of {{ $post->name }}">
</div>
</div>
</a>
</div>
</div> </div>
@endforeach @endforeach

View File

@@ -22,42 +22,7 @@
<div class="my-3"> <div class="my-3">
<div class="card mb-3"> @include('front.partials.post_list_card', ['post' => $post])
<div class="card-body">
<h5 class="card-title">
<a class="text-decoration-none fw-bold"
href="{{ route('home.country.post', ['country' => $country_locale->country_iso, 'post_slug' => $post->slug]) }}">{{ $post->title }}</a>
</h5>
<p class="card-text">
in
@foreach ($post->post_categories as $post_category)
<small><a class="text-decoration-none"
href="{{ route('home.country.category', ['country' => $country_locale->country_iso, 'category' => $post_category->category->slug]) }}">{{ $post_category->category->name }}</a>
</small>
@endforeach
<small
class="text-body-secondary ms-2">{{ $post->publish_date->format('j F Y') }}</small>
{{-- <small class="text-body-secondary ms-2">3 min read</small> --}}
</p>
</div>
<a class="card-img-top"
href="{{ route('home.country.post', ['country' => $country_locale->country_iso, 'post_slug' => $post->slug]) }}">
<div class="img-fluid rounded-start ratio ratio-16x9">
<div class="lqip-loader">
<!-- Use the LQIP image with the appropriate URL -->
<img src="{{ $post->featured_image }}" alt="Photo of {{ $post->name }}">
<!-- Use the final JPEG image with the appropriate URL -->
<img class="lqip-frozen" src="{{ $post->featured_image_lqip }}"
alt="Placeholder image of {{ $post->name }}">
</div>
</div>
</a>
</div>
</div> </div>

View File

@@ -0,0 +1,57 @@
<div class="card border-0 glow-{{ $loop->index + 1 }}" style="height:100%;">
<a href="{{ route('home.country.post', ['country' => $country_locale->country_iso, 'post_slug' => $post->slug]) }}"
class="text-decoration-none">
<div class="card-img-top ratio ratio-16x9">
<div class="lqip-loader">
<!-- Use the LQIP image with the appropriate URL -->
<img class="img-fluid rounded-top" src="{{ $post->featured_image }}"
alt="Photo of {{ $post->name }}">
<!-- Use the final JPEG image with the appropriate URL -->
<img class="img-fluid lqip-frozen" src="{{ $post->featured_image_lqip }}"
alt="Placeholder image of {{ $post->name }}">
</div>
</div>
</a>
<div class="card-body d-flex justify-content-between flex-column">
<div class="mb-2">
<p class="card-text fw-bold">
<a href="{{ route('home.country.post', ['country' => $country_locale->country_iso, 'post_slug' => $post->slug]) }}"
class="text-decoration-none">{{ $post->title }}</a>
</p>
</div>
@if (!is_empty($post->cliffhanger))
<div class="mb-3">
<small class="text-secondary">{{ $post->cliffhanger }}</small>
</div>
@else
<div class="mb-3">
<small class="text-secondary">{{ $post->excerpt }}</small>
</div>
@endif
<div>
<p class="card-text mb-0">
<small>in </small>
@foreach ($post->post_categories as $post_category)
<small><a class="text-decoration-none"
href="{{ route('home.country.category', ['country' => $country_locale->country_iso, 'category' => $post_category->category->slug]) }}">{{ $post_category->category->name }}</a>
</small>
@if (!$loop->last)
,
@endif
@endforeach
{{-- <small class="text-body-secondary ms-2">3 min read</small> --}}
</p>
<div class="d-flex justify-content-between align-items-center">
<small
class="text-body-secondary">{{ $post->publish_date->format('j F Y') }}</small>
{{-- <small class="text-body-secondary">9 min read</small> --}}
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,48 @@
<div class="card border-0 shadow-lg mb-34">
<div class="card-body">
<h5 class="card-title">
<a class="text-decoration-none fw-bold"
href="{{ route('home.country.post', ['country' => $country_locale->country_iso, 'post_slug' => $post->slug]) }}">{{ $post->title }}</a>
</h5>
@if (!is_empty($post->cliffhanger))
<div class="mb-3">
<small class="text-secondary">{{ $post->cliffhanger }}</small>
</div>
@else
<div class="mb-3">
<small class="text-secondary">{{ $post->excerpt }}</small>
</div>
@endif
<p class="card-text">
in
@foreach ($post->post_categories as $post_category)
<small><a class="text-decoration-none"
href="{{ route('home.country.category', ['country' => $country_locale->country_iso, 'category' => $post_category->category->slug]) }}">{{ $post_category->category->name }}</a>
</small>
@endforeach
<small
class="text-body-secondary ms-2">{{ $post->publish_date->format('j F Y') }}</small>
{{-- <small class="text-body-secondary ms-2">3 min read</small> --}}
</p>
</div>
<a class="card-img-top"
href="{{ route('home.country.post', ['country' => $country_locale->country_iso, 'post_slug' => $post->slug]) }}">
<div class="img-fluid rounded-start ratio ratio-16x9">
<div class="lqip-loader">
<!-- Use the LQIP image with the appropriate URL -->
<img class="img-fluid rounded-bottom" src="{{ $post->featured_image }}"
alt="Photo of {{ $post->name }}">
<!-- Use the final JPEG image with the appropriate URL -->
<img class="lqip-frozen img-fluid rounded-bottom"
src="{{ $post->featured_image_lqip }}"
alt="Placeholder image of {{ $post->name }}">
</div>
</div>
</a>
</div>

View File

@@ -0,0 +1,48 @@
<div class="card border-0 shadow-lg" style="height:100%;">
<div class="row g-0">
<div class="col-5 p-3 m-auto">
<a href="{{ route('home.country.post', ['country' => $country_locale->country_iso, 'post_slug' => $post->slug]) }}"
class="text-decoration-none">
<div class="ratio ratio-16x9">
<div class="lqip-loader img-fluid rounded ">
<!-- Use the LQIP image with the appropriate URL -->
<img class="img-fluid" src="{{ $post->featured_image }}"
alt="Photo of {{ $post->name }}">
<!-- Use the final JPEG image with the appropriate URL -->
<img class="lqip-frozen img-fluid rounded "
src="{{ $post->featured_image_lqip }}"
alt="Placeholder image of {{ $post->name }}">
</div>
</div>
</a>
</div>
<div class="col-7">
<div class="card-body d-flex justify-content-between flex-column"
style="height:100%;">
<div>
<a href="{{ route('home.country.post', ['country' => $country_locale->country_iso, 'post_slug' => $post->slug]) }}"
class="text-decoration-none">
<p class="card-title fw-bold">{{ $post->title }}</p>
</a>
</div>
<div class="d-flex justify-content-between align-items-center">
<p class="card-text mb-0">
<small>in </small>
@foreach ($post->post_categories as $post_category)
<small><a class="text-decoration-none"
href="{{ route('home.country.category', ['country' => $country_locale->country_iso, 'category' => $post_category->category->slug]) }}">{{ $post_category->category->name }}</a>
</small>
@if (!$loop->last)
,
@endif
@endforeach
{{-- <small class="text-body-secondary ms-2">3 min read</small> --}}
</p>
<small
class="text-body-secondary">{{ $post->publish_date->format('j F Y') }}</small>
</div>
</div>
</div>
</div>
</div>

View File

@@ -21,6 +21,8 @@
Route::get('/', [App\Http\Controllers\Admin\DashboardController::class, 'index'])->name('dashboard'); Route::get('/', [App\Http\Controllers\Admin\DashboardController::class, 'index'])->name('dashboard');
Route::view('/changelog', 'admin.changelog')->name('admin.changelog');
Route::view('about', 'admin.about')->name('about'); Route::view('about', 'admin.about')->name('about');
Route::get('users', [\App\Http\Controllers\Admin\UserController::class, 'index'])->name('users.index'); Route::get('users', [\App\Http\Controllers\Admin\UserController::class, 'index'])->name('users.index');