- First push to add as a composer module

This commit is contained in:
Dave M. 2025-11-06 12:15:10 -05:00
commit b7cd369c12
5 changed files with 183 additions and 0 deletions

2
asset/lean-live/app.js Normal file
View File

@ -0,0 +1,2 @@
import { UiLive } from "./ui-live.mjs";
window.customElements.define("ui-live", UiLive);

View File

@ -0,0 +1,69 @@
import { Webcomponent } from "../../webcomponent/module/webcomponent.js";
import { Hourglass } from "../../webcomponent/hourglass.js";
const config = {
url: window.location.href,
template: {
fetch : false
}
};
class UiLive extends Webcomponent {
constructor() {
super(config);
this.init();
}
init() {
if (this.pool) {
new Hourglass(this.fetchAndRender.bind(this), {
timer: this.pool * 1000,
start: true,
});
}
}
fetchAndRender() {
this.classList.add("live-loading");
fetch(this.config.url, {
method: "GET",
headers: {
'X-Ui-Live': JSON.stringify([ { name: this.name } ])
}
}).then( response => response.text() )
.then(html => {
this.swapHtml(html);
})
.catch((error) => {
console.error(error);
});
}
swapHtml(html) {
this.innerHTML = ( new DOMParser() )
.parseFromString(html, "text/html")
.querySelector('ui-live[data-name="' + this.name + '"]')
.innerHTML;
this.dispatchEvent(new CustomEvent("live:swap"));
}
/** @return string */
get name() {
return this.dataset["name"];
}
/** @return int | undefined */
get pool() {
if (isNaN(this.dataset['pool'])) {
return undefined;
}
return this.dataset["pool"];
}
}
export { UiLive };

41
composer.json Normal file
View File

@ -0,0 +1,41 @@
{
"name": "mcnd/lean-live",
"description": "Seamless operations between PHP and your users browsers actions.",
"type": "library",
"license": "MIT",
"authors": [
{
"name": "Dave Mc Nicoll",
"email": "info@mcnd.ca"
}
],
"require": {
"php": "^8.4",
"php-di/php-di": "dev-master",
"ext-json": "*",
"mcnd/lean": "dev-master"
},
"repositories": [
{
"type": "vcs",
"url": "https://git.mcnd.ca/mcndave/lean.git"
}
],
"autoload": {
"psr-4": {
"Lean\\Live\\": "src/"
}
},
"extra" : {
"lean" : {
"autoload": {
"definitions" : [
"meta/definitions/software.php"
],
"config": [
"meta/config.php"
]
}
}
}
}

11
meta/config.php Normal file
View File

@ -0,0 +1,11 @@
<?php
$path = dirname(__DIR__, 1);
return [
'lean' => [
'autoload' => [
'lean.live',
]
],
];

View File

@ -0,0 +1,60 @@
<?php
use Ulmus\ConnectionAdapter;
putenv('LEAN_API_PROJECT_PATH=' . $path = dirname(__DIR__, 2));
return [
'lean.api' => [
'picea' => [
'context' => Lean\Api\View::class,
'view' => [
[
'path' => implode(DIRECTORY_SEPARATOR, [ $path , "view", '' ]),
'order' => 99,
],
],
'asset' => [
[
'path' => implode(DIRECTORY_SEPARATOR, [ $path, "asset", '' ]),
'order' => 10
],
],
],
'ulmus' => [
'entities' => [ 'Lean\\Api\\Entity' => implode(DIRECTORY_SEPARATOR, [ $path, 'src', 'Entity', '' ]) ],
'adapters' => [
DI\get('lean.api:storage'),
]
],
'tell' => [
'json' => [
[
'path' => implode(DIRECTORY_SEPARATOR, [ $path, "meta", "i18n", "" ]),
'order' => 99,
],
]
],
'routes' => [
'Lean\\Api\\Controller' => implode(DIRECTORY_SEPARATOR, [ $path, "src", "Controller", "" ]),
],
],
'lean.api:storage' => function($c) {
$adapter = new ConnectionAdapter('lean.api', $c->get('config')['ulmus'], false);
$adapter->resolveConfiguration();
return $adapter;
},
Lean\ApplicationStrategy\NotFoundDecoratorInterface::class => DI\autowire(Lean\Api\ApplicationStrategy\NotFoundDecorator::class),
Lean\ApplicationStrategy\MethodNotAllowedInterface::class => DI\autowire(Lean\Api\ApplicationStrategy\MethodNotAllowedDecorator::class),
Lean\Api\Factory\MessageFactoryInterface::class => DI\autowire(Lean\Api\Lib\Message::class),
Lean\Api\Factory\DebugFormFactoryInterface::class => DI\autowire(Lean\Api\Factory\DebugFormFactory::class),
# League\Route\Strategy\ApplicationStrategy::class => DI\autowire(Lean\Api\ApplicationStrategy::class),
];