Updating kanga.world to latest (slightly broken) code.

This commit is contained in:
Scott Duensing 2022-01-06 18:47:25 -06:00
parent d079f0ae33
commit ad883d4669
39 changed files with 462 additions and 3994 deletions

2
.gitignore vendored
View file

@ -16,3 +16,5 @@ kanga.world/index.php
kanga.world/site/config/config.php kanga.world/site/config/config.php
kanga.world/content/home/*/ kanga.world/content/home/*/
kanga.world/content/1_home/*/ kanga.world/content/1_home/*/
kanga.world/site/plugins/kangaworld-integration/settings.json
kanga.world/site/plugins/kangaworld-integration/settings.json.backup

File diff suppressed because one or more lines are too long

View file

@ -5,6 +5,10 @@ a:active:not(.dropdown-item):not(.nav-link) {
color: #ff0000; color: #ff0000;
} }
h5 a {
text-decoration: none;
}
h3 { h3 {
color: #e64946; color: #e64946;
font-weight: bold; font-weight: bold;
@ -12,6 +16,13 @@ h3 {
margin-bottom: 25px; margin-bottom: 25px;
} }
h5 {
color: #e64946;
font-weight: bold;
border-bottom: 2px solid #e64946;
margin-bottom: 25px;
}
.imagecenter { .imagecenter {
display: block; display: block;
margin-left: auto; margin-left: auto;
@ -83,6 +94,15 @@ h3 {
font-weight: bold; font-weight: bold;
} }
.prev {
width: 100%;
text-align: right;
}
.next {
width: 100%;
}
.columns { .columns {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

View file

@ -1,10 +0,0 @@
css_dir = "."
sass_dir = "."
images_dir = "."
fonts_dir = "fonts"
relative_assets = true
output_style = :compact
line_comments = false
preferred_syntax = :scss

View file

@ -1,14 +0,0 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>Generated by Fontastic.me</metadata>
<defs>
<font id="slick" horiz-adv-x="512">
<font-face font-family="slick" units-per-em="512" ascent="480" descent="-32"/>
<missing-glyph horiz-adv-x="512" />
<glyph unicode="&#8594;" d="M241 113l130 130c4 4 6 8 6 13 0 5-2 9-6 13l-130 130c-3 3-7 5-12 5-5 0-10-2-13-5l-29-30c-4-3-6-7-6-12 0-5 2-10 6-13l87-88-87-88c-4-3-6-8-6-13 0-5 2-9 6-12l29-30c3-3 8-5 13-5 5 0 9 2 12 5z m234 143c0-40-9-77-29-110-20-34-46-60-80-80-33-20-70-29-110-29-40 0-77 9-110 29-34 20-60 46-80 80-20 33-29 70-29 110 0 40 9 77 29 110 20 34 46 60 80 80 33 20 70 29 110 29 40 0 77-9 110-29 34-20 60-46 80-80 20-33 29-70 29-110z"/>
<glyph unicode="&#8592;" d="M296 113l29 30c4 3 6 7 6 12 0 5-2 10-6 13l-87 88 87 88c4 3 6 8 6 13 0 5-2 9-6 12l-29 30c-3 3-8 5-13 5-5 0-9-2-12-5l-130-130c-4-4-6-8-6-13 0-5 2-9 6-13l130-130c3-3 7-5 12-5 5 0 10 2 13 5z m179 143c0-40-9-77-29-110-20-34-46-60-80-80-33-20-70-29-110-29-40 0-77 9-110 29-34 20-60 46-80 80-20 33-29 70-29 110 0 40 9 77 29 110 20 34 46 60 80 80 33 20 70 29 110 29 40 0 77-9 110-29 34-20 60-46 80-80 20-33 29-70 29-110z"/>
<glyph unicode="&#8226;" d="M475 256c0-40-9-77-29-110-20-34-46-60-80-80-33-20-70-29-110-29-40 0-77 9-110 29-34 20-60 46-80 80-20 33-29 70-29 110 0 40 9 77 29 110 20 34 46 60 80 80 33 20 70 29 110 29 40 0 77-9 110-29 34-20 60-46 80-80 20-33 29-70 29-110z"/>
<glyph unicode="&#97;" d="M475 439l0-128c0-5-1-9-5-13-4-4-8-5-13-5l-128 0c-8 0-13 3-17 11-3 7-2 14 4 20l40 39c-28 26-62 39-100 39-20 0-39-4-57-11-18-8-33-18-46-32-14-13-24-28-32-46-7-18-11-37-11-57 0-20 4-39 11-57 8-18 18-33 32-46 13-14 28-24 46-32 18-7 37-11 57-11 23 0 44 5 64 15 20 9 38 23 51 42 2 1 4 3 7 3 3 0 5-1 7-3l39-39c2-2 3-3 3-6 0-2-1-4-2-6-21-25-46-45-76-59-29-14-60-20-93-20-30 0-58 5-85 17-27 12-51 27-70 47-20 19-35 43-47 70-12 27-17 55-17 85 0 30 5 58 17 85 12 27 27 51 47 70 19 20 43 35 70 47 27 12 55 17 85 17 28 0 55-5 81-15 26-11 50-26 70-45l37 37c6 6 12 7 20 4 8-4 11-9 11-17z"/>
</font></defs></svg>

Before

Width:  |  Height:  |  Size: 2.1 KiB

View file

@ -1,204 +0,0 @@
@charset 'UTF-8';
/* Slider */
.slick-loading .slick-list
{
background: #fff url('./ajax-loader.gif') center center no-repeat;
}
/* Icons */
@font-face
{
font-family: 'slick';
font-weight: normal;
font-style: normal;
src: url('./fonts/slick.eot');
src: url('./fonts/slick.eot?#iefix') format('embedded-opentype'), url('./fonts/slick.woff') format('woff'), url('./fonts/slick.ttf') format('truetype'), url('./fonts/slick.svg#slick') format('svg');
}
/* Arrows */
.slick-prev,
.slick-next
{
font-size: 0;
line-height: 0;
position: absolute;
top: 50%;
display: block;
width: 20px;
height: 20px;
padding: 0;
-webkit-transform: translate(0, -50%);
-ms-transform: translate(0, -50%);
transform: translate(0, -50%);
cursor: pointer;
color: transparent;
border: none;
outline: none;
background: transparent;
}
.slick-prev:hover,
.slick-prev:focus,
.slick-next:hover,
.slick-next:focus
{
color: transparent;
outline: none;
background: transparent;
}
.slick-prev:hover:before,
.slick-prev:focus:before,
.slick-next:hover:before,
.slick-next:focus:before
{
opacity: 1;
}
.slick-prev.slick-disabled:before,
.slick-next.slick-disabled:before
{
opacity: .25;
}
.slick-prev:before,
.slick-next:before
{
font-family: 'slick';
font-size: 20px;
line-height: 1;
opacity: .75;
color: white;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.slick-prev
{
left: -25px;
}
[dir='rtl'] .slick-prev
{
right: -25px;
left: auto;
}
.slick-prev:before
{
content: '←';
}
[dir='rtl'] .slick-prev:before
{
content: '→';
}
.slick-next
{
right: -25px;
}
[dir='rtl'] .slick-next
{
right: auto;
left: -25px;
}
.slick-next:before
{
content: '→';
}
[dir='rtl'] .slick-next:before
{
content: '←';
}
/* Dots */
.slick-dotted.slick-slider
{
margin-bottom: 30px;
}
.slick-dots
{
position: absolute;
bottom: -25px;
display: block;
width: 100%;
padding: 0;
margin: 0;
list-style: none;
text-align: center;
}
.slick-dots li
{
position: relative;
display: inline-block;
width: 20px;
height: 20px;
margin: 0 5px;
padding: 0;
cursor: pointer;
}
.slick-dots li button
{
font-size: 0;
line-height: 0;
display: block;
width: 20px;
height: 20px;
padding: 5px;
cursor: pointer;
color: transparent;
border: 0;
outline: none;
background: transparent;
}
.slick-dots li button:hover,
.slick-dots li button:focus
{
outline: none;
}
.slick-dots li button:hover:before,
.slick-dots li button:focus:before
{
opacity: 1;
}
.slick-dots li button:before
{
font-family: 'slick';
font-size: 6px;
line-height: 20px;
position: absolute;
top: 0;
left: 0;
width: 20px;
height: 20px;
content: '•';
text-align: center;
opacity: .25;
color: black;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.slick-dots li.slick-active button:before
{
opacity: .75;
color: black;
}

View file

@ -1,168 +0,0 @@
@charset "UTF-8";
// Default Variables
@slick-font-path: "./fonts/";
@slick-font-family: "slick";
@slick-loader-path: "./";
@slick-arrow-color: white;
@slick-dot-color: black;
@slick-dot-color-active: @slick-dot-color;
@slick-prev-character: "←";
@slick-next-character: "→";
@slick-dot-character: "•";
@slick-dot-size: 6px;
@slick-opacity-default: 0.75;
@slick-opacity-on-hover: 1;
@slick-opacity-not-active: 0.25;
/* Slider */
.slick-loading .slick-list{
background: #fff url('@{slick-loader-path}ajax-loader.gif') center center no-repeat;
}
/* Arrows */
.slick-prev,
.slick-next {
position: absolute;
display: block;
height: 20px;
width: 20px;
line-height: 0px;
font-size: 0px;
cursor: pointer;
background: transparent;
color: transparent;
top: 50%;
-webkit-transform: translate(0, -50%);
-ms-transform: translate(0, -50%);
transform: translate(0, -50%);
padding: 0;
border: none;
outline: none;
&:hover, &:focus {
outline: none;
background: transparent;
color: transparent;
&:before {
opacity: @slick-opacity-on-hover;
}
}
&.slick-disabled:before {
opacity: @slick-opacity-not-active;
}
}
.slick-prev:before, .slick-next:before {
font-family: @slick-font-family;
font-size: 20px;
line-height: 1;
color: @slick-arrow-color;
opacity: @slick-opacity-default;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
& when ( @slick-font-family = 'slick' ) {
/* Icons */
@font-face {
font-family: 'slick';
font-weight: normal;
font-style: normal;
src: url('@{slick-font-path}slick.eot');
src: url('@{slick-font-path}slick.eot?#iefix') format('embedded-opentype'), url('@{slick-font-path}slick.woff') format('woff'), url('@{slick-font-path}slick.ttf') format('truetype'), url('@{slick-font-path}slick.svg#slick') format('svg');
}
}
}
.slick-prev {
left: -25px;
[dir="rtl"] & {
left: auto;
right: -25px;
}
&:before {
content: @slick-prev-character;
[dir="rtl"] & {
content: @slick-next-character;
}
}
}
.slick-next {
right: -25px;
[dir="rtl"] & {
left: -25px;
right: auto;
}
&:before {
content: @slick-next-character;
[dir="rtl"] & {
content: @slick-prev-character;
}
}
}
/* Dots */
.slick-dotted .slick-slider {
margin-bottom: 30px;
}
.slick-dots {
position: absolute;
bottom: -25px;
list-style: none;
display: block;
text-align: center;
padding: 0;
margin: 0;
width: 100%;
li {
position: relative;
display: inline-block;
height: 20px;
width: 20px;
margin: 0 5px;
padding: 0;
cursor: pointer;
button {
border: 0;
background: transparent;
display: block;
height: 20px;
width: 20px;
outline: none;
line-height: 0px;
font-size: 0px;
color: transparent;
padding: 5px;
cursor: pointer;
&:hover, &:focus {
outline: none;
&:before {
opacity: @slick-opacity-on-hover;
}
}
&:before {
position: absolute;
top: 0;
left: 0;
content: @slick-dot-character;
width: 20px;
height: 20px;
font-family: @slick-font-family;
font-size: @slick-dot-size;
line-height: 20px;
text-align: center;
color: @slick-dot-color;
opacity: @slick-opacity-not-active;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
}
&.slick-active button:before {
color: @slick-dot-color-active;
opacity: @slick-opacity-default;
}
}
}

View file

@ -1,194 +0,0 @@
@charset "UTF-8";
// Default Variables
// Slick icon entity codes outputs the following
// "\2190" outputs ascii character ""
// "\2192" outputs ascii character ""
// "\2022" outputs ascii character ""
$slick-font-path: "./fonts/" !default;
$slick-font-family: "slick" !default;
$slick-loader-path: "./" !default;
$slick-arrow-color: white !default;
$slick-dot-color: black !default;
$slick-dot-color-active: $slick-dot-color !default;
$slick-prev-character: "\2190" !default;
$slick-next-character: "\2192" !default;
$slick-dot-character: "\2022" !default;
$slick-dot-size: 6px !default;
$slick-opacity-default: 0.75 !default;
$slick-opacity-on-hover: 1 !default;
$slick-opacity-not-active: 0.25 !default;
@function slick-image-url($url) {
@if function-exists(image-url) {
@return image-url($url);
}
@else {
@return url($slick-loader-path + $url);
}
}
@function slick-font-url($url) {
@if function-exists(font-url) {
@return font-url($url);
}
@else {
@return url($slick-font-path + $url);
}
}
/* Slider */
.slick-list {
.slick-loading & {
background: #fff slick-image-url("ajax-loader.gif") center center no-repeat;
}
}
/* Icons */
@if $slick-font-family == "slick" {
@font-face {
font-family: "slick";
src: slick-font-url("slick.eot");
src: slick-font-url("slick.eot?#iefix") format("embedded-opentype"), slick-font-url("slick.woff") format("woff"), slick-font-url("slick.ttf") format("truetype"), slick-font-url("slick.svg#slick") format("svg");
font-weight: normal;
font-style: normal;
}
}
/* Arrows */
.slick-prev,
.slick-next {
position: absolute;
display: block;
height: 20px;
width: 20px;
line-height: 0px;
font-size: 0px;
cursor: pointer;
background: transparent;
color: transparent;
top: 50%;
-webkit-transform: translate(0, -50%);
-ms-transform: translate(0, -50%);
transform: translate(0, -50%);
padding: 0;
border: none;
outline: none;
&:hover, &:focus {
outline: none;
background: transparent;
color: transparent;
&:before {
opacity: $slick-opacity-on-hover;
}
}
&.slick-disabled:before {
opacity: $slick-opacity-not-active;
}
&:before {
font-family: $slick-font-family;
font-size: 20px;
line-height: 1;
color: $slick-arrow-color;
opacity: $slick-opacity-default;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
}
.slick-prev {
left: -25px;
[dir="rtl"] & {
left: auto;
right: -25px;
}
&:before {
content: $slick-prev-character;
[dir="rtl"] & {
content: $slick-next-character;
}
}
}
.slick-next {
right: -25px;
[dir="rtl"] & {
left: -25px;
right: auto;
}
&:before {
content: $slick-next-character;
[dir="rtl"] & {
content: $slick-prev-character;
}
}
}
/* Dots */
.slick-dotted.slick-slider {
margin-bottom: 30px;
}
.slick-dots {
position: absolute;
bottom: -25px;
list-style: none;
display: block;
text-align: center;
padding: 0;
margin: 0;
width: 100%;
li {
position: relative;
display: inline-block;
height: 20px;
width: 20px;
margin: 0 5px;
padding: 0;
cursor: pointer;
button {
border: 0;
background: transparent;
display: block;
height: 20px;
width: 20px;
outline: none;
line-height: 0px;
font-size: 0px;
color: transparent;
padding: 5px;
cursor: pointer;
&:hover, &:focus {
outline: none;
&:before {
opacity: $slick-opacity-on-hover;
}
}
&:before {
position: absolute;
top: 0;
left: 0;
content: $slick-dot-character;
width: 20px;
height: 20px;
font-family: $slick-font-family;
font-size: $slick-dot-size;
line-height: 20px;
text-align: center;
color: $slick-dot-color;
opacity: $slick-opacity-not-active;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
}
&.slick-active button:before {
color: $slick-dot-color-active;
opacity: $slick-opacity-default;
}
}
}

View file

@ -1,119 +0,0 @@
/* Slider */
.slick-slider
{
position: relative;
display: block;
box-sizing: border-box;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-webkit-touch-callout: none;
-khtml-user-select: none;
-ms-touch-action: pan-y;
touch-action: pan-y;
-webkit-tap-highlight-color: transparent;
}
.slick-list
{
position: relative;
display: block;
overflow: hidden;
margin: 0;
padding: 0;
}
.slick-list:focus
{
outline: none;
}
.slick-list.dragging
{
cursor: pointer;
cursor: hand;
}
.slick-slider .slick-track,
.slick-slider .slick-list
{
-webkit-transform: translate3d(0, 0, 0);
-moz-transform: translate3d(0, 0, 0);
-ms-transform: translate3d(0, 0, 0);
-o-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
}
.slick-track
{
position: relative;
top: 0;
left: 0;
display: block;
margin-left: auto;
margin-right: auto;
}
.slick-track:before,
.slick-track:after
{
display: table;
content: '';
}
.slick-track:after
{
clear: both;
}
.slick-loading .slick-track
{
visibility: hidden;
}
.slick-slide
{
display: none;
float: left;
height: 100%;
min-height: 1px;
}
[dir='rtl'] .slick-slide
{
float: right;
}
.slick-slide img
{
display: block;
}
.slick-slide.slick-loading img
{
display: none;
}
.slick-slide.dragging img
{
pointer-events: none;
}
.slick-initialized .slick-slide
{
display: block;
}
.slick-loading .slick-slide
{
visibility: hidden;
}
.slick-vertical .slick-slide
{
display: block;
height: auto;
border: 1px solid transparent;
}
.slick-arrow.slick-hidden {
display: none;
}

File diff suppressed because it is too large Load diff

View file

@ -1,100 +0,0 @@
/* Slider */
.slick-slider {
position: relative;
display: block;
box-sizing: border-box;
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-ms-touch-action: pan-y;
touch-action: pan-y;
-webkit-tap-highlight-color: transparent;
}
.slick-list {
position: relative;
overflow: hidden;
display: block;
margin: 0;
padding: 0;
&:focus {
outline: none;
}
&.dragging {
cursor: pointer;
cursor: hand;
}
}
.slick-slider .slick-track,
.slick-slider .slick-list {
-webkit-transform: translate3d(0, 0, 0);
-moz-transform: translate3d(0, 0, 0);
-ms-transform: translate3d(0, 0, 0);
-o-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
}
.slick-track {
position: relative;
left: 0;
top: 0;
display: block;
margin-left: auto;
margin-right: auto;
&:before,
&:after {
content: "";
display: table;
}
&:after {
clear: both;
}
.slick-loading & {
visibility: hidden;
}
}
.slick-slide {
float: left;
height: 100%;
min-height: 1px;
[dir="rtl"] & {
float: right;
}
img {
display: block;
}
&.slick-loading img {
display: none;
}
display: none;
&.dragging img {
pointer-events: none;
}
.slick-initialized & {
display: block;
}
.slick-loading & {
visibility: hidden;
}
.slick-vertical & {
display: block;
height: auto;
border: 1px solid transparent;
}
}
.slick-arrow.slick-hidden {
display: none;
}

File diff suppressed because one or more lines are too long

View file

@ -1,100 +0,0 @@
/* Slider */
.slick-slider {
position: relative;
display: block;
box-sizing: border-box;
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-ms-touch-action: pan-y;
touch-action: pan-y;
-webkit-tap-highlight-color: transparent;
}
.slick-list {
position: relative;
overflow: hidden;
display: block;
margin: 0;
padding: 0;
&:focus {
outline: none;
}
&.dragging {
cursor: pointer;
cursor: hand;
}
}
.slick-slider .slick-track,
.slick-slider .slick-list {
-webkit-transform: translate3d(0, 0, 0);
-moz-transform: translate3d(0, 0, 0);
-ms-transform: translate3d(0, 0, 0);
-o-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
}
.slick-track {
position: relative;
left: 0;
top: 0;
display: block;
margin-left: auto;
margin-right: auto;
&:before,
&:after {
content: "";
display: table;
}
&:after {
clear: both;
}
.slick-loading & {
visibility: hidden;
}
}
.slick-slide {
float: left;
height: 100%;
min-height: 1px;
[dir="rtl"] & {
float: right;
}
img {
display: block;
}
&.slick-loading img {
display: none;
}
display: none;
&.dragging img {
pointer-events: none;
}
.slick-initialized & {
display: block;
}
.slick-loading & {
visibility: hidden;
}
.slick-vertical & {
display: block;
height: auto;
border: 1px solid transparent;
}
}
.slick-arrow.slick-hidden {
display: none;
}

View file

@ -1,4 +1,4 @@
Title: Welcome! Title: News
---- ----

View file

@ -0,0 +1,5 @@
Title: Source Code
----
Redirect: https://skunkworks.kangaroopunch.com/skunkworks/kpmpgsmkii

View file

@ -0,0 +1,5 @@
Title: Chat
----
Redirect: https://discord.gg/AMA8zbYwQD

View file

@ -0,0 +1,4 @@
title: News Image
icon: image
accept:
type: image

View file

@ -15,4 +15,3 @@ sections:
extends: sections/news extends: sections/news
headline: Published headline: Published
status: listed status: listed
layout: cards

View file

@ -1,6 +1,6 @@
title: News Article title: News Article
icon: document icon: document
num: '{{ page.date }}' #num: '{{ page.date }}'
options: options:
changeTemplate: news changeTemplate: news
@ -25,13 +25,19 @@ columns:
width: 1/2 width: 1/2
sections: sections:
image: image:
headline: News Article Image
type: files type: files
template: newsimage
required: true required: true
layout: cards layout: cards
ratio: 1/1 ratio: 1/1
max: 1 max: 1
accept: accept:
extension: jpg, png, gif extension: jpg, png, gif
pictures:
headline: Other Images
type: files
template: image
meta: meta:
type: fields type: fields
fields: fields:

View file

@ -3,4 +3,4 @@ headline: News Articles
info: "{{ page.date.toDate('d-M-Y') }}" info: "{{ page.date.toDate('d-M-Y') }}"
template: news template: news
empty: No news yet empty: No news yet
sortBy: date desc #flip: true

View file

@ -0,0 +1,49 @@
<?php
require __DIR__ . '/user.php';
return [
'routes' => [
[
'pattern' => 'kp/kangaworld/v1',
'method' => 'POST',
'action' => function() {
$response = array();
$response['result'] = 'false';
$response['reason'] = 'Unknown error.';
// Although Kirby only allows admins this far, we may have a
//configurable sub-role for API access later.
if (kirby()->user()->role()->id() == 'admin') {
switch (get('command')) {
case 'USER_CREATE':
kpApiUserCreate(get('name'), get('email'), get('password'), $response);
break;
case 'USER_GET':
kpApiUserGet(get('email'), $response);
break;
default:
$response['reason'] = 'Invalid command.';
break;
}
} else {
$response['reason'] = 'Unauthorized.';
}
return $response;
}
]
]
];
?>

View file

@ -0,0 +1,35 @@
<?php
function kpKangaWorldConfig() {
return Data::read(__DIR__ . '/settings.json');
}
return [
'kwconfig' => [
'label' => 'Kanga World Configuration',
'icon' => 'globe',
'menu' => true,
// update and delete dialogs
'dialogs' => [
//require __DIR__ . '/dialogs/update.php',
//require __DIR__ . '/dialogs/delete.php'
],
// dropdown with edit and delete buttons
'dropdowns' => [
//require __DIR__ . '/dropdowns/kwconfig.php'
],
// search for settings
'searches' => [
//'products' => require __DIR__ . '/searches/kwconfig.php'
],
// view route
'views' => [
require __DIR__ . '/views/kwconfig.php'
]
]
];
?>

View file

@ -0,0 +1,15 @@
{
"name": "kangaroopunch/kangaworld-integration",
"type": "kirby-plugin",
"version": "1.0",
"license": "GPL3",
"authors": [
{
"name": "Scott Duensing",
"email": "scott@kangaroopunch.com"
}
],
"require": {
"getkirby/composer-installer": "^1.2"
}
}

View file

@ -0,0 +1,24 @@
.k-kwconfig {
width: 100%;
table-layout: fixed;
border-spacing: 1px;
}
.k-kwconfig td,
.k-kwconfig th {
text-align: left;
font-size: var(--text-sm);
padding: var(--spacing-2);
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
background: var(--color-white);
}
.k-kwconfig-type {
width: 8rem;
}
.k-kwconfig-data {
width: 5rem;
font-variant-numeric: tabular-nums;
text-align: right !important;
}

View file

@ -0,0 +1,86 @@
(function() {
"use strict";
var render = function() {
var _vm = this;
var _h = _vm.$createElement;
var _c = _vm._self._c || _h;
return _c("k-inside", [_c("k-view", [_c("k-header", [_vm._v("Kanga World Configuration")]), _c("table", { staticClass: "k-kwconfig" }, [_c("tr", [_c("th", [_vm._v("Title")]), _c("th", { staticClass: "k-kwconfig-type" }, [_vm._v("Type")]), _c("th", [_vm._v("Description")]), _c("th", { staticClass: "k-kwconfig-data" }, [_vm._v("Value")])]), _vm._l(_vm.kwconfig, function(kwconfig, name) {
return _c("tr", { key: name }, [_c("td", [_vm._v(_vm._s(kwconfig.name))]), _c("td", { staticClass: "k-kwconfig-type" }, [_vm._v(_vm._s(kwconfig.type))]), _c("td", [_vm._v(_vm._s(kwconfig.description))]), _c("td", { staticClass: "k-kwconfig-data" }, [_vm._v(_vm._s(kwconfig.data) + " "), _c("k-options-dropdown", { attrs: { "options": "kwconfig/" + name } })], 1)]);
})], 2)], 1)], 1);
};
var staticRenderFns = [];
render._withStripped = true;
var KwConfig_vue_vue_type_style_index_0_lang = "";
function normalizeComponent(scriptExports, render2, staticRenderFns2, functionalTemplate, injectStyles, scopeId, moduleIdentifier, shadowMode) {
var options = typeof scriptExports === "function" ? scriptExports.options : scriptExports;
if (render2) {
options.render = render2;
options.staticRenderFns = staticRenderFns2;
options._compiled = true;
}
if (functionalTemplate) {
options.functional = true;
}
if (scopeId) {
options._scopeId = "data-v-" + scopeId;
}
var hook;
if (moduleIdentifier) {
hook = function(context) {
context = context || this.$vnode && this.$vnode.ssrContext || this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext;
if (!context && typeof __VUE_SSR_CONTEXT__ !== "undefined") {
context = __VUE_SSR_CONTEXT__;
}
if (injectStyles) {
injectStyles.call(this, context);
}
if (context && context._registeredComponents) {
context._registeredComponents.add(moduleIdentifier);
}
};
options._ssrRegister = hook;
} else if (injectStyles) {
hook = shadowMode ? function() {
injectStyles.call(this, (options.functional ? this.parent : this).$root.$options.shadowRoot);
} : injectStyles;
}
if (hook) {
if (options.functional) {
options._injectStyles = hook;
var originalRender = options.render;
options.render = function renderWithStyleInjection(h, context) {
hook.call(context);
return originalRender(h, context);
};
} else {
var existing = options.beforeCreate;
options.beforeCreate = existing ? [].concat(existing, hook) : [hook];
}
}
return {
exports: scriptExports,
options
};
}
const __vue2_script = {
props: {
kwconfig: Object
}
};
const __cssModules = {};
var __component__ = /* @__PURE__ */ normalizeComponent(__vue2_script, render, staticRenderFns, false, __vue2_injectStyles, null, null, null);
function __vue2_injectStyles(context) {
for (let o in __cssModules) {
this[o] = __cssModules[o];
}
}
__component__.options.__file = "src/components/KwConfig.vue";
var KwConfig = /* @__PURE__ */ function() {
return __component__.exports;
}();
panel.plugin("kangaroopunch/kangaworld-integration", {
components: {
"k-kwconfig-view": KwConfig
}
});
})();

View file

@ -2,61 +2,9 @@
Kirby::plugin('kangaroopunch/kangaworld-integration', [ Kirby::plugin('kangaroopunch/kangaworld-integration', [
'api' => [ 'api' => require __DIR__ . '/api.php',
'routes' => [ 'areas' => require __DIR__ . '/areas.php'
[
'pattern' => 'kp/kangaworld/v1',
'method' => 'POST',
'action' => function() {
$response = array();
$response['result'] = 'false';
$response['reason'] = 'Unknown error.';
switch (get('command')) {
case 'USER_CREATE':
try {
kirby()->users()->create([
'name' => get('name'),
'email' => get('email'),
'password' => get('password'),
'language' => 'en',
'role' => 'user'
]);
$response['result'] = 'true';
$response['reason'] = 'User created.';
} catch(Exception $e) {
$response['reason'] = $e->getMessage();
}
break;
case 'USER_GET':
try {
$user = kirby()->users()->findByKey(get('email'));
//$response['userraw'] = dump($user);
$response['name'] = $user->username();
$response['email'] = $user->email();
$response['password'] = $user->password();
$response['language'] = $user->language();
$response['role'] = $user->role()->id();
$response['result'] = 'true';
$response['reason'] = 'User found.';
} catch(Exception $e) {
$response['reason'] = $e->getMessage();
}
break;
default:
$response['reason'] = 'Invalid command.';
break;
}
return $response;
}
]
]
]
]); ]);
?>

View file

@ -0,0 +1,6 @@
{
"scripts": {
"dev": "npx -y kirbyup src/index.js --watch",
"build": "npx -y kirbyup src/index.js"
}
}

View file

@ -0,0 +1,20 @@
{
"configItem": {
"name": "configItem",
"type": "config",
"data": "2048",
"description": "Sample CONFIG item."
},
"numberItem": {
"name": "numberItem",
"type": "number",
"data": "16550",
"description": "Sample NUMBER item."
},
"stringItem": {
"name": "stringItem",
"type": "string",
"data": "aValue",
"description": "Sample STRING item."
}
}

View file

@ -0,0 +1,57 @@
<template>
<k-inside>
<k-view>
<k-header>Kanga World Configuration</k-header>
<table class="k-kwconfig">
<tr>
<th>Title</th>
<th class="k-kwconfig-type">Type</th>
<th>Description</th>
<th class="k-kwconfig-data">Value</th>
</tr>
<tr v-for="(kwconfig, name) in kwconfig" :key="name">
<td>{{ kwconfig.name }}</td>
<td class="k-kwconfig-type">{{ kwconfig.type }}</td>
<td>{{ kwconfig.description }}</td>
<td class="k-kwconfig-data">{{ kwconfig.data }}
<k-options-dropdown :options="'kwconfig/' + name" />
</td>
</tr>
</table>
</k-view>
</k-inside>
</template>
<script>
export default {
props: {
kwconfig: Object
}
};
</script>
<style>
.k-kwconfig {
width: 100%;
table-layout: fixed;
border-spacing: 1px;
}
.k-kwconfig td,
.k-kwconfig th {
text-align: left;
font-size: var(--text-sm);
padding: var(--spacing-2);
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
background: var(--color-white);
}
.k-kwconfig-type {
width: 8rem;
}
.k-kwconfig-data {
width: 5rem;
font-variant-numeric: tabular-nums;
text-align: right !important;
}
</style>

View file

@ -0,0 +1,7 @@
import KwConfig from "./components/KwConfig.vue";
panel.plugin("kangaroopunch/kangaworld-integration", {
components: {
"k-kwconfig-view": KwConfig
}
});

View file

@ -0,0 +1,40 @@
<?php
function kpApiUserCreate($name, $email, $password, &$response) {
try {
kirby()->users()->create([
'name' => $name,
'email' => $email,
'password' => $password,
'language' => 'en',
'role' => 'user'
]);
$response['result'] = 'true';
$response['reason'] = 'User created.';
} catch(Exception $e) {
$response['reason'] = $e->getMessage();
}
}
function kpApiUserGet($email, &$response) {
try {
$user = kirby()->users()->findByKey($email);
//$response['userraw'] = dump($user);
if ($user) {
$response['name'] = $user->username();
$response['email'] = $user->email();
$response['password'] = $user->password();
$response['language'] = $user->language();
$response['role'] = $user->role()->id();
$response['result'] = 'true';
$response['reason'] = 'User found.';
} else {
$response['reason'] = 'User not found.';
}
} catch(Exception $e) {
$response['reason'] = $e->getMessage();
}
}
?>

View file

@ -0,0 +1,15 @@
<?php
return [
'pattern' => 'kwconfig',
'action' => function () {
return [
'component' => 'k-kwconfig-view',
'props' => [
'kwconfigs' => kpKangaWorldConfig()
]
];
}
];
?>

View file

@ -4,14 +4,11 @@
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" href="/assets/images/Kanga-FavIcon.png"> <link rel="icon" href="/assets/images/Kanga-FavIcon.png">
<link href="/assets/bootstrap/css/bootstrap.min.css" rel="stylesheet"> <link href="/assets/css/bootstrap-red.css" rel="stylesheet">
<link href="/assets/css/main.css" rel="stylesheet"> <link href="/assets/css/main.css" rel="stylesheet">
<link rel="stylesheet" type="text/css" href="/assets/slick/slick.css"/>
<link rel="stylesheet" type="text/css" href="/assets/slick/slick-theme.css"/>
<title><?= $site->title() ?> - <?= $page->title() ?></title> <title><?= $site->title() ?> - <?= $page->title() ?></title>
</head> </head>
<body> <body>
<script src="/assets/js/jquery-3.6.0.min.js"></script> <script src="/assets/js/jquery-3.6.0.min.js"></script>
<script type="text/javascript" src="/assets/slick/slick.min.js"></script>
<div class="container mainpage"> <div class="container mainpage">
<?php snippet('menu') ?> <?php snippet('menu') ?>

View file

@ -2,22 +2,62 @@
snippet('header'); snippet('header');
snippet('rightlogoheader'); snippet('rightlogoheader');
foreach($page->children()->listed()->flip() as $article): $articlesPerPage = 3;
foreach($articles = $page->children()->listed()->flip()->paginate(3) as $article):
$newsImage = $article->images()->template('newsimage');
if ($newsImage) $newsImage = $newsImage->first();
?> ?>
<article class="news"> <article class="news">
<h3><?= $article->title()->html() ?></h3> <h5><a href="<?= $article->url() ?>"><?= $article->title()->html() ?></a></h5>
<?php if ($article->image()) { ?> <?php if ($newsImage) { ?>
<img src="<?= $article->image()->resize(100, 100)->url() ?>" class="imageright"/> <img src="<?= $newsImage->resize(100, 100)->url() ?>" class="imageright"/>
<?php } ?> <?php } ?>
<p class="newspublished">Published: <span class="newsdate"><?= $article->date()->toDate('d-M-Y') ?></span></p> <p class="newspublished">Published: <span class="newsdate"><?= $article->date()->toDate('d-M-Y') ?></span></p>
<p><?= $article->text()->excerpt(300) ?></p> <p><?= $article->text()->excerpt(150) ?></p>
<a href="<?= $article->url() ?>">Read more...</a> <a href="<?= $article->url() ?>">Read more...</a>
</article> </article>
<?php <?php endforeach; ?>
endforeach;
<?php $pagination = $articles->pagination() ?>
<nav aria-label="News Navigation">
<ul class="pagination justify-content-center">
<li class="page-item">
<?php if ($pagination->hasPrevPage()): ?>
<a class="page-link" href="<?= $pagination->prevPageURL() ?>" aria-label="Previous">
<span aria-hidden="true">&laquo;</span>
</a>
<?php else: ?>
<span class="page-link" aria-hidden="true">&laquo;</span>
<?php endif ?>
</li>
<?php foreach ($pagination->range(10) as $r): ?>
<?php if ($pagination->page() === $r): ?>
<li class="page-item active" aria-current="page">
<span class="page-link"><?= $r ?></span>
</li>
<?php else: ?>
<li class="page-item"><a class="page-link" href="<?= $pagination->pageURL($r) ?>"><?= $r ?></a></li>
<?php endif ?>
<?php endforeach ?>
<li class="page-item">
<?php if ($pagination->hasNextPage()): ?>
<a class="page-link" href="<?= $pagination->nextPageURL() ?>" aria-label="Next">
<span aria-hidden="true">&raquo;</span>
</a>
<?php else: ?>
<span class="page-link" aria-hidden="true">&raquo;</span>
<?php endif ?>
</li>
</ul>
</nav>
<?php
snippet('rightlogofooter'); snippet('rightlogofooter');
snippet('footer'); snippet('footer');
?> ?>

View file

@ -1,11 +1,14 @@
<?php <?php
snippet('header'); snippet('header');
//snippet('rightlogoheader'); //snippet('rightlogoheader');
$newsImage = $page->images()->template('newsimage');
if ($newsImage) $newsImage = $newsImage->first();
?> ?>
<h3><?= $page->title() ?></h3> <h3><?= $page->title() ?></h3>
<?php if ($page->image()) { ?> <?php if ($newsImage) { ?>
<img src="<?= $page->image()->resize(250, 250)->url() ?>" class="imageright"/> <img src="<?= $newsImage->resize(250, 250)->url() ?>" class="imageright"/>
<?php } ?> <?php } ?>
<p class="newspublished">Published: <span class="newsdate"><?= $page->date()->toDate('d-M-Y') ?></span></p> <p class="newspublished">Published: <span class="newsdate"><?= $page->date()->toDate('d-M-Y') ?></span></p>
<?= $page->text()->kirbytext() ?> <?= $page->text()->kirbytext() ?>