silentium-components 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
- import{give as e,SourceAll as t,value as r,Patron as s,SourceWithPool as n,GuestCast as i,PatronOnce as c,PrivateClass as l,Source as o,sourceOf as a}from"silentium";import{HistoryNewPage as u,HistoryPoppedPage as h}from"silentium-web-api";class p{constructor(e,t){this.basePath=e,this.template=t}content(t){fetch(this.basePath+"/"+this.template).then((e=>e.text())).then((r=>{e(r,t)}))}}class d{constructor(e,t,r,s,n){this.loading=e,this.basePath=t,this.currentPage=r,this.display=s,this.pageTransport=n}routes(n){const i=n.find((e=>e.default)),c=new t;r(this.basePath,new s(c.guestKey("basePath"))),r(this.currentPage,new s(c.guestKey("currentPage"))),c.value(new s((({basePath:t,currentPage:r})=>{const s=r.replace(t,""),c=n.find((e=>e.aliases&&(e.aliases.includes(r)||e.aliases.includes(s))));if(c){const s=t+c.url;if(s!==r)return void e(s,this.currentPage)}let l=n.find((e=>{if(e.url.indexOf("*")>=0){return new RegExp(e.url.replaceAll("*",".*").replaceAll("/","/")).test(s)}return e.url.replaceAll("*","")===s}));if(!l&&i&&(l=i),!l)throw new Error("No matching route in Navigation");{const r=t.replace("/#","").replace("#","").replace(/[^/]+\.html$/,"");e(!0,this.loading),this.pageTransport.get(r,l.template).content((t=>{this.display.display(t),l.page.mounted(),e(!1,this.loading)}))}})))}}class g{constructor(e){this.selector=e}display(e){const t=document.querySelector(this.selector);t&&(t.innerHTML=e)}}var m=Object.defineProperty,v=(e,t,r)=>((e,t,r)=>t in e?m(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r)(e,t+"",r);class w{constructor(){v(this,"source");const e=location.href.replace(location.origin,"");this.source=new n(e)}give(e){return this.source.give(e),this}value(e){return this.source.value(e),e}pool(){return this.source.pool()}}class f{constructor(e,t){this.source=e;const r=document.querySelector(t);this.source.value(new s((e=>{r.value=String(e)}))),r.addEventListener("keyup",(()=>{this.give(r.value)})),r.addEventListener("change",(()=>{this.give(r.value)}))}value(e){return this.source.value(e),this}give(e){return this.source.give(e),this}pool(){return this.source.pool()}}class y{constructor(e){this.selector=e}give(e){const t=document.querySelector(this.selector);return t&&(t.style.display=e?"block":"none"),this}}class S{constructor(e){this.selector=e}give(e){const t=document.querySelector(this.selector);return t&&(t.innerText=String(e)),this}}class b{constructor(e,t){this.linkSource=e,this.basePath=t}watchClick(e,t){const r=document.querySelectorAll(e);if(!r.length)throw new Error(`Link wrapper not found for selector ${e}`);r.forEach((e=>{e.addEventListener("click",(r=>{t?e.querySelectorAll(t).forEach((e=>{r?.target!==e&&r?.currentTarget!==e||this.handleClick({preventDefault:r.preventDefault.bind(r),target:e})})):this.handleClick(r)}))}))}handleClick(e){let t=e?.target?.getAttribute("href");t||(t=e?.currentTarget?.getAttribute("href")),t&&0!==t.indexOf("http")&&(e.preventDefault(),r(this.basePath,(e=>{this.linkSource.give(e+t)})))}}class P{constructor(e,t){this.sources=e,this.selectorTemplate=t}element(r){const s=new t;this.sources.forEach((e=>{e.source.value(new i(r,s.guestKey(e.placeholder)))})),s.value(new i(r,(t=>{let s=this.selectorTemplate;Object.entries(t).map((e=>{s=s.replaceAll(e[0],e[1])}));const n=document.querySelector(s);n&&e(n,r)})))}}class E{constructor(e,t,r){this.activeClass=e,this.groupSelector=t,this.document=r}give(e){return r(this.document,new c((t=>{t.querySelectorAll(this.groupSelector).forEach((e=>{e.classList.remove(this.activeClass)})),e.classList.add(this.activeClass)}))),this}}class k{constructor(e,t,r){this.loaderSelector=e,this.navigationResultSelector=t,this.menuSelector=r}routes(r,c,m,v){c||(c=new w),c.value(new s(new u));const[f]=location.href.replace(location.origin,"").split("#");m||(m=new n(`${f}#`.replace("index.html","").replace("//","/")));const S=new n(!1);S.value(new s(new y(this.loaderSelector)));new h(c).watchPop();new d(S,m,c,new g(this.navigationResultSelector),new l(p)).routes(r);new b(c,m).watchClick(this.menuSelector);const k=new t;m.value(new s(k.guestKey("basePath"))),c.value(new s(k.guestKey("page")));const A=new o((t=>{k.value(new i(t,(({basePath:r,page:s})=>{e(s.replace(r,""),t)})))}));new P([{source:A,placeholder:"{url}"}],`${this.menuSelector} a[href="{url}"]`).element(new s(new E("active",`${this.menuSelector} a`,a(document)))),S.value(new s((e=>{if(e)return;v&&v();const t=document.querySelector(this.navigationResultSelector);t&&t.querySelectorAll("script").forEach((e=>{const r=document.createElement("script");r.setAttribute("type","module"),r.appendChild(document.createTextNode(e.innerText)),t.appendChild(r)}))})))}}class A{constructor(e){this.title=e}mounted(){document.title=this.title}}class q{constructor(e,t){this.title=e,this.entryPointUrl=t}mounted(){document.title=this.title,import(this.entryPointUrl).then((e=>{e.main&&e.main()}))}}export{P as ComputedElement,w as CurrentPage,q as EntryPointPage,E as GroupActiveClass,f as Input,b as Link,d as Navigation,A as Page,p as PageFetchTransport,g as RouteDisplay,k as Router,S as Text,y as Visible};
1
+ import{give as e,SourceAll as t,value as r,Patron as s,SourceWithPool as i,GuestCast as n,PatronOnce as l,PrivateClass as c,Source as o,sourceOf as a}from"silentium";import{HistoryNewPage as u,HistoryPoppedPage as h}from"silentium-web-api";class d{constructor(e,t){this.basePath=e,this.template=t}content(t){fetch(this.basePath+"/"+this.template).then((e=>e.text())).then((r=>{e(r,t)}))}}class p{constructor(e,t,r,s,i){this.loading=e,this.basePath=t,this.currentPage=r,this.display=s,this.pageTransport=i}routes(i){const n=i.find((e=>e.default)),l=new t;r(this.basePath,new s(l.guestKey("basePath"))),r(this.currentPage,new s(l.guestKey("currentPage"))),l.value(new s((({basePath:t,currentPage:r})=>{const s=r.replace(t,""),l=i.find((e=>e.aliases&&(e.aliases.includes(r)||e.aliases.includes(s))));if(l){const s=t+l.url;if(s!==r)return void e(s,this.currentPage)}let c=i.find((e=>{if(e.url.indexOf("*")>=0){return new RegExp(e.url.replaceAll("*",".*").replaceAll("/","/")).test(s)}return e.url.replaceAll("*","")===s}));if(!c&&n&&(c=n),!c)throw new Error("No matching route in Navigation");{const r=t.replace("/#","").replace("#","").replace(/[^/]+\.html$/,"");e(!0,this.loading),this.pageTransport.get(r,c.template).content((t=>{this.display.display(t),c.page.mounted(),e(!1,this.loading)}))}})))}}class g{constructor(e){this.selector=e}display(e){const t=document.querySelector(this.selector);t&&(t.innerHTML=e)}}var v=Object.defineProperty,w=(e,t,r)=>((e,t,r)=>t in e?v(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r)(e,t+"",r);class m{constructor(){w(this,"source");const e=location.href.replace(location.origin,"");this.source=new i(e)}give(e){return this.source.give(e),this}value(e){return this.source.value(e),e}pool(){return this.source.pool()}}class f{constructor(e,t){this.source=e;const r=document.querySelector(t);this.source.value(new s((e=>{r.value=String(e)}))),r.addEventListener("keyup",(()=>{this.give(r.value)})),r.addEventListener("change",(()=>{this.give(r.value)}))}value(e){return this.source.value(e),this}give(e){return this.source.give(e),this}pool(){return this.source.pool()}}class S{constructor(e){this.selector=e}give(e){const t=document.querySelector(this.selector);return t&&(t.style.display=e?"block":"none"),this}}class b{constructor(e){this.selector=e}give(e){const t=document.querySelector(this.selector);return t&&(t.innerText=String(e)),this}}class y{constructor(e,t){this.linkSource=e,this.basePath=t}watchClick(e,t){const r=document.querySelectorAll(e);if(!r.length)throw new Error(`Link wrapper not found for selector ${e}`);r.forEach((e=>{e.addEventListener("click",(r=>{t?e.querySelectorAll(t).forEach((e=>{r?.target!==e&&r?.currentTarget!==e||this.handleClick({preventDefault:r.preventDefault.bind(r),target:e})})):this.handleClick(r)}))}))}handleClick(e){let t=e?.target?.getAttribute("href");t||(t=e?.currentTarget?.getAttribute("href")),t&&0!==t.indexOf("http")&&(e.preventDefault(),r(this.basePath,(e=>{this.linkSource.give(e+t)})))}}class P{constructor(e,t){this.sources=e,this.selectorTemplate=t}element(r){const s=new t;this.sources.forEach((e=>{e.source.value(new n(r,s.guestKey(e.placeholder)))})),s.value(new n(r,(t=>{let s=this.selectorTemplate;Object.entries(t).map((e=>{s=s.replaceAll(e[0],e[1])}));const i=document.querySelector(s);i&&e(i,r)})))}}class E{constructor(e,t,r){this.activeClass=e,this.groupSelector=t,this.document=r}give(e){return r(this.document,new l((t=>{t.querySelectorAll(this.groupSelector).forEach((e=>{e.classList.remove(this.activeClass)})),e.classList.add(this.activeClass)}))),this}}class k{constructor(e,t,r){this.loaderSelector=e,this.navigationResultSelector=t,this.menuSelector=r}routes(r,l,v,w){l||(l=new m),l.value(new s(new u));const[f]=location.href.replace(location.origin,"").split("#");v||(v=new i(`${f}#`.replace("index.html","").replace("//","/")));const b=new i(!1);b.value(new s(new S(this.loaderSelector)));new h(l).watchPop();new p(b,v,l,new g(this.navigationResultSelector),new c(d)).routes(r);new y(l,v).watchClick(this.menuSelector);const k=new t;v.value(new s(k.guestKey("basePath"))),l.value(new s(k.guestKey("page")));const x=new o((t=>{k.value(new n(t,(({basePath:r,page:s})=>{e(s.replace(r,""),t)})))}));new P([{source:x,placeholder:"{url}"}],`${this.menuSelector} a[href="{url}"]`).element(new s(new E("active",`${this.menuSelector} a`,a(document)))),b.value(new s((e=>{if(e)return;w&&w();const t=document.querySelector(this.navigationResultSelector);t&&t.querySelectorAll("script").forEach((e=>{const r=document.createElement("script");r.setAttribute("type","module"),r.appendChild(document.createTextNode(e.innerText)),t.appendChild(r)}))})))}}class x{constructor(e){this.title=e}mounted(){document.title=this.title}}class A{constructor(e,t){this.title=e,this.entryPointUrl=t}mounted(){document.title=this.title,import(this.entryPointUrl).then((e=>{e.main&&e.main()}))}}var K=Object.defineProperty,O=(e,t,r)=>((e,t,r)=>t in e?K(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r)(e,"symbol"!=typeof t?t+"":t,r);class q{constructor(e,n=[],c=[],o=!1){this.alwaysKeep=n,this.excludeKeys=c,O(this,"comparingSource",new i),O(this,"all",new t),this.comparingSource.value(new s(this.all.guestKey("comparing"))),r(e,new s(this.all.guestKey("base"))),o&&r(e,new l(this))}give(t){return e(JSON.parse(JSON.stringify(t)),this.comparingSource),this}value(t){return this.all.value(new n(t,(({comparing:r,base:s})=>{r&&e(Object.fromEntries(Object.entries(r).filter((([e,t])=>!!this.alwaysKeep.includes(e)||!this.excludeKeys.includes(e)&&t!==s[e]))),t)}))),this}}var C=Object.defineProperty,T=(e,t,r)=>((e,t,r)=>t in e?C(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r)(e,t+"",r);class j{constructor(e,t){this.loadingStartSource=e,this.loadingFinishSource=t,T(this,"loadingSource",new i)}value(e){return r(this.loadingStartSource,new n(e,(()=>{this.loadingSource.give(!0)}))),r(this.loadingFinishSource,new n(e,(()=>{this.loadingSource.give(!1)}))),this.loadingSource.value(e),this}}class L{}var N=Object.defineProperty,$=(e,t,r)=>((e,t,r)=>t in e?N(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r)(e,t+"",r);class R{constructor(e){$(this,"source",new i({})),r(e,new s((([e,t])=>{this.source.value((r=>{r[e]=t}))})))}value(e){return r(this.source,e),this}}export{P as ComputedElement,m as CurrentPage,q as Dirty,A as EntryPointPage,E as GroupActiveClass,R as HashTable,f as Input,y as Link,j as Loading,p as Navigation,x as Page,d as PageFetchTransport,g as RouteDisplay,k as Router,b as Text,L as Touched,S as Visible};
2
2
  //# sourceMappingURL=silentium-components.min.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"silentium-components.min.mjs","sources":["../src/navigation/PageFetchTransport.ts","../src/navigation/Navigation.ts","../src/navigation/RouteDisplay.ts","../src/navigation/CurrentPage.ts","../src/controls/Input.ts","../src/controls/Visible.ts","../src/controls/Text.ts","../src/controls/Link.ts","../src/controls/ComputedElement.ts","../src/controls/GroupActiveClass.ts","../src/navigation/Router.ts","../src/page/Page.ts","../src/page/EntryPointPage.ts"],"sourcesContent":["import { give, GuestType } from \"silentium\";\n\nexport interface RoutePageTransportType {\n content(guest: GuestType<string>): void;\n}\n\n/**\n * Not needed anymore same thing in web api existed\n * @deprecated\n */\nexport class PageFetchTransport implements RoutePageTransportType {\n public constructor(\n private basePath: string,\n private template: string,\n ) {}\n\n public content(guest: GuestType<string>): void {\n fetch(this.basePath + \"/\" + this.template)\n .then((result) => {\n return result.text();\n })\n .then((result) => {\n give(result, guest);\n });\n }\n}\n","import {\n SourceAll,\n Patron,\n PrivateType,\n SourceType,\n value,\n give,\n SourceWithPoolType,\n} from \"silentium\";\nimport { RoutePageTransportType } from \"src/navigation/PageFetchTransport\";\nimport { RouteDisplayType } from \"src/navigation/RouteDisplay\";\nimport { RoutePageType } from \"src/navigation/RoutePageType\";\n\nexport interface RouteDocument {\n url: string;\n template: string;\n aliases?: string[];\n page: RoutePageType;\n default?: boolean;\n}\n\nexport class Navigation {\n public constructor(\n private loading: SourceWithPoolType<boolean>,\n private basePath: SourceType<string>,\n private currentPage: SourceWithPoolType<string>,\n private display: RouteDisplayType,\n private pageTransport: PrivateType<RoutePageTransportType>,\n ) {}\n\n public routes(routes: RouteDocument[]) {\n const defaultRoute = routes.find((route) => route.default);\n const all = new SourceAll<{\n basePath: string;\n currentPage: string;\n }>();\n value(this.basePath, new Patron(all.guestKey(\"basePath\")));\n value(this.currentPage, new Patron(all.guestKey(\"currentPage\")));\n\n all.value(\n new Patron(({ basePath, currentPage }) => {\n const urlWithoutBasePath = currentPage.replace(basePath, \"\");\n const routeMatchedToAlias = routes.find(\n (route) =>\n route.aliases &&\n (route.aliases.includes(currentPage) ||\n route.aliases.includes(urlWithoutBasePath)),\n );\n\n if (routeMatchedToAlias) {\n const correctUrl = basePath + routeMatchedToAlias.url;\n\n if (correctUrl !== currentPage) {\n give(correctUrl, this.currentPage);\n return;\n }\n }\n\n let route = routes.find((route) => {\n if (route.url.indexOf(\"*\") >= 0) {\n const regexp = new RegExp(\n route.url.replaceAll(\"*\", \".*\").replaceAll(\"/\", \"/\"),\n );\n return regexp.test(urlWithoutBasePath);\n }\n return route.url.replaceAll(\"*\", \"\") === urlWithoutBasePath;\n });\n\n if (!route && defaultRoute) {\n route = defaultRoute;\n }\n\n if (route) {\n const basePathWithoutHash = basePath\n .replace(\"/#\", \"\")\n .replace(\"#\", \"\")\n .replace(/[^/]+\\.html$/, \"\");\n give(true, this.loading);\n this.pageTransport\n .get(basePathWithoutHash, route.template)\n .content((templateContent) => {\n this.display.display(templateContent);\n route.page.mounted();\n give(false, this.loading);\n });\n } else {\n throw new Error(\"No matching route in Navigation\");\n }\n }),\n );\n }\n}\n","export interface RouteDisplayType {\n display(content: string): void;\n}\n\n/**\n * Renders content on selector\n * @deprecated move to web api\n */\nexport class RouteDisplay implements RouteDisplayType {\n public constructor(private selector: string) {}\n\n public display(content: string): void {\n const contentEl = document.querySelector(this.selector);\n if (contentEl) {\n contentEl.innerHTML = content;\n }\n }\n}\n","import { GuestType, SourceWithPool, SourceWithPoolType } from \"silentium\";\n\n/**\n * @deprecated move to web api\n */\nexport class CurrentPage implements SourceWithPoolType<string> {\n private source: SourceWithPoolType<string>;\n\n public constructor() {\n const correctUrl = location.href.replace(location.origin, \"\");\n this.source = new SourceWithPool(correctUrl);\n }\n\n public give(value: string): this {\n this.source.give(value);\n return this;\n }\n\n public value(guest: GuestType<string>) {\n this.source.value(guest);\n return guest;\n }\n\n public pool() {\n return this.source.pool();\n }\n}\n","import { GuestType, Patron, SourceWithPoolType } from \"silentium\";\n\ntype InputValue = number | string;\n\n/**\n * @deprecated move to web api\n */\nexport class Input implements SourceWithPoolType<InputValue> {\n public constructor(\n private source: SourceWithPoolType<InputValue>,\n selector: string,\n ) {\n const el = document.querySelector(selector) as HTMLInputElement;\n this.source.value(\n new Patron((value) => {\n el.value = String(value);\n }),\n );\n el.addEventListener(\"keyup\", () => {\n this.give(el.value);\n });\n el.addEventListener(\"change\", () => {\n this.give(el.value);\n });\n }\n\n public value(guest: GuestType<InputValue>) {\n this.source.value(guest);\n return this;\n }\n\n public give(value: InputValue) {\n this.source.give(value);\n return this;\n }\n\n public pool() {\n return this.source.pool();\n }\n}\n","import { GuestObjectType } from \"silentium\";\n\n/**\n * @deprecated move to web api\n */\nexport class Visible implements GuestObjectType<boolean> {\n public constructor(private selector: string) {}\n\n public give(isVisible: boolean): this {\n const el = document.querySelector(this.selector) as HTMLElement;\n if (el) {\n el.style.display = isVisible ? \"block\" : \"none\";\n }\n return this;\n }\n}\n","import { GuestObjectType } from \"silentium\";\n\n/**\n * @deprecated Move to web api\n */\nexport class Text implements GuestObjectType {\n public constructor(private selector: string) {}\n\n public give(value: unknown) {\n const element = document.querySelector(this.selector) as HTMLElement;\n if (element) {\n element.innerText = String(value);\n }\n return this;\n }\n}\n","import { GuestObjectType, SourceType, value } from \"silentium\";\n\n/**\n * @deprecated move to web api\n */\nexport class Link {\n public constructor(\n private linkSource: GuestObjectType<string>,\n private basePath: SourceType<string>,\n ) {}\n\n public watchClick(selector: string, subselector?: string) {\n const wrapperEl = document.querySelectorAll(selector);\n if (wrapperEl.length) {\n wrapperEl.forEach((theElement) => {\n theElement.addEventListener(\"click\", (e) => {\n if (subselector) {\n theElement\n .querySelectorAll(subselector)\n .forEach((theSubElement) => {\n if (\n e?.target === theSubElement ||\n e?.currentTarget === theSubElement\n ) {\n this.handleClick({\n preventDefault: e.preventDefault.bind(e),\n target: theSubElement,\n } as unknown as Event);\n }\n });\n } else {\n this.handleClick(e);\n }\n });\n });\n } else {\n throw new Error(`Link wrapper not found for selector ${selector}`);\n }\n }\n\n private handleClick(e: Event) {\n let href = (e?.target as HTMLElement)?.getAttribute(\"href\");\n if (!href) {\n href = (e?.currentTarget as HTMLElement)?.getAttribute(\"href\");\n }\n if (href && href.indexOf(\"http\") !== 0) {\n e.preventDefault();\n value(this.basePath, (basePath) => {\n this.linkSource.give(basePath + href);\n });\n }\n }\n}\n","import {\n give,\n SourceAll,\n SourceObjectType,\n GuestCast,\n GuestType,\n} from \"silentium\";\n\ntype SourceDetailType = {\n source: SourceObjectType<any>;\n placeholder: string;\n};\n\n/**\n * @deprecated use https://kosukhin.github.io/patron-web-api/#/dom/element\n */\nexport class ComputedElement {\n public constructor(\n private sources: SourceDetailType[],\n private selectorTemplate: string,\n ) {}\n\n public element(guest: GuestType<HTMLElement>) {\n const chain = new SourceAll();\n this.sources.forEach((source) => {\n source.source.value(\n new GuestCast(guest as GuestType, chain.guestKey(source.placeholder)),\n );\n });\n\n chain.value(\n new GuestCast(\n guest as GuestType,\n (placeholders: Record<string, string>) => {\n let selectorTemplate = this.selectorTemplate;\n\n Object.entries(placeholders).map((entry) => {\n selectorTemplate = selectorTemplate.replaceAll(entry[0], entry[1]);\n });\n\n const element = document.querySelector(\n selectorTemplate,\n ) as HTMLElement;\n if (element) {\n give(element, guest);\n }\n },\n ),\n );\n }\n}\n","import { GuestObjectType, PatronOnce, SourceType, value } from \"silentium\";\n\n/**\n * Sets activeClass to one element of group\n * and resets activeClass on other group elements\n * suitable for menu active class\n *\n * @deprecated heavily related to web api needs refactoring\n */\nexport class GroupActiveClass implements GuestObjectType<HTMLElement> {\n public constructor(\n private activeClass: string,\n private groupSelector: string,\n private document: SourceType<Document>,\n ) {}\n\n public give(element: HTMLElement): this {\n value(\n this.document,\n new PatronOnce((document) => {\n document.querySelectorAll(this.groupSelector).forEach((el) => {\n el.classList.remove(this.activeClass);\n });\n element.classList.add(this.activeClass);\n }),\n );\n return this;\n }\n}\n","import {\n Source,\n SourceAll,\n GuestCast,\n Patron,\n PrivateClass,\n SourceWithPool,\n give,\n sourceOf,\n} from \"silentium\";\nimport { HistoryNewPage, HistoryPoppedPage } from \"silentium-web-api\";\nimport { ComputedElement, GroupActiveClass, Link, Visible } from \"../controls\";\nimport { CurrentPage } from \"../navigation/CurrentPage\";\nimport { Navigation } from \"../navigation/Navigation\";\nimport { PageFetchTransport } from \"../navigation/PageFetchTransport\";\nimport { RouteDisplay } from \"../navigation/RouteDisplay\";\n\ntype Route = {\n url: string;\n template: string;\n aliases: string[];\n page: any;\n};\n\nexport class Router {\n public constructor(\n private loaderSelector: string,\n private navigationResultSelector: string,\n private menuSelector: string,\n ) {}\n\n routes(\n routes: Route[],\n currentPage: any,\n basePathSource: any,\n afterPageLoaded?: () => void,\n ) {\n if (!currentPage) {\n currentPage = new CurrentPage();\n }\n currentPage.value(new Patron(new HistoryNewPage()));\n\n const [basePath] = location.href.replace(location.origin, \"\").split(\"#\");\n if (!basePathSource) {\n basePathSource = new SourceWithPool(\n `${basePath}#`.replace(\"index.html\", \"\").replace(\"//\", \"/\"),\n );\n }\n\n const pageLoading = new SourceWithPool(false);\n pageLoading.value(new Patron(new Visible(this.loaderSelector)));\n\n const historyPoppedPage = new HistoryPoppedPage(currentPage);\n historyPoppedPage.watchPop();\n\n const navigation = new Navigation(\n pageLoading,\n basePathSource,\n currentPage,\n new RouteDisplay(this.navigationResultSelector),\n new PrivateClass(PageFetchTransport),\n );\n navigation.routes(routes);\n\n const link = new Link(currentPage, basePathSource);\n link.watchClick(this.menuSelector);\n\n const urlChain = new SourceAll<any>();\n basePathSource.value(new Patron(urlChain.guestKey(\"basePath\")));\n currentPage.value(new Patron(urlChain.guestKey(\"page\")));\n const url = new Source((guest) => {\n urlChain.value(\n new GuestCast(guest, ({ basePath, page }) => {\n give(page.replace(basePath, \"\"), guest);\n }),\n );\n });\n\n const activeLink = new ComputedElement(\n [{ source: url, placeholder: \"{url}\" }],\n `${this.menuSelector} a[href=\"{url}\"]`,\n );\n activeLink.element(\n new Patron(\n new GroupActiveClass(\n \"active\",\n `${this.menuSelector} a`,\n sourceOf(document),\n ),\n ),\n );\n\n pageLoading.value(\n new Patron((isInLoading) => {\n if (isInLoading) {\n return;\n }\n\n if (afterPageLoaded) {\n afterPageLoaded();\n }\n\n const divDestination = document.querySelector(\n this.navigationResultSelector,\n );\n if (divDestination) {\n // Оживляем script тэги\n divDestination.querySelectorAll(\"script\").forEach((x) => {\n const sc = document.createElement(\"script\");\n sc.setAttribute(\"type\", \"module\");\n sc.appendChild(document.createTextNode(x.innerText));\n divDestination.appendChild(sc);\n });\n }\n }),\n );\n }\n}\n","import { RoutePageType } from \"../navigation\";\n\n/**\n * @deprecated Move to web api\n */\nexport class Page implements RoutePageType {\n public constructor(private title: string) {}\n\n public mounted() {\n document.title = this.title;\n }\n}\n","import { RoutePageType } from \"../navigation\";\n\n/**\n * @deprecated not needed\n */\nexport class EntryPointPage implements RoutePageType {\n public constructor(\n private title: string,\n private entryPointUrl: string,\n ) {}\n\n public mounted() {\n document.title = this.title;\n import(this.entryPointUrl).then((module) => {\n if (module.main) {\n module.main();\n }\n });\n }\n}\n"],"names":["PageFetchTransport","constructor","basePath","template","this","content","guest","fetch","then","result","text","give","Navigation","loading","currentPage","display","pageTransport","routes","defaultRoute","find","route","default","all","SourceAll","value","Patron","guestKey","urlWithoutBasePath","replace","routeMatchedToAlias","aliases","includes","correctUrl","url","indexOf","RegExp","replaceAll","test","Error","basePathWithoutHash","get","templateContent","page","mounted","RouteDisplay","selector","contentEl","document","querySelector","innerHTML","CurrentPage","__publicField","location","href","origin","source","SourceWithPool","pool","Input","el","String","addEventListener","Visible","isVisible","style","Text","element","innerText","Link","linkSource","watchClick","subselector","wrapperEl","querySelectorAll","length","forEach","theElement","e","theSubElement","target","currentTarget","handleClick","preventDefault","bind","getAttribute","ComputedElement","sources","selectorTemplate","chain","GuestCast","placeholder","placeholders","Object","entries","map","entry","GroupActiveClass","activeClass","groupSelector","PatronOnce","classList","remove","add","Router","loaderSelector","navigationResultSelector","menuSelector","basePathSource","afterPageLoaded","HistoryNewPage","split","pageLoading","HistoryPoppedPage","watchPop","PrivateClass","urlChain","Source","sourceOf","isInLoading","divDestination","x","sc","createElement","setAttribute","appendChild","createTextNode","Page","title","EntryPointPage","entryPointUrl","import","module","main"],"mappings":"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"}
1
+ {"version":3,"file":"silentium-components.min.mjs","sources":["../src/navigation/PageFetchTransport.ts","../src/navigation/Navigation.ts","../src/navigation/RouteDisplay.ts","../src/navigation/CurrentPage.ts","../src/controls/Input.ts","../src/controls/Visible.ts","../src/controls/Text.ts","../src/controls/Link.ts","../src/controls/ComputedElement.ts","../src/controls/GroupActiveClass.ts","../src/navigation/Router.ts","../src/page/Page.ts","../src/page/EntryPointPage.ts","../src/behaviors/Dirty.ts","../src/behaviors/Loading.ts","../src/behaviors/Touched.ts","../src/structures/HashTable.ts"],"sourcesContent":["import { give, GuestType } from \"silentium\";\n\nexport interface RoutePageTransportType {\n content(guest: GuestType<string>): void;\n}\n\n/**\n * Not needed anymore same thing in web api existed\n * @deprecated\n */\nexport class PageFetchTransport implements RoutePageTransportType {\n public constructor(\n private basePath: string,\n private template: string,\n ) {}\n\n public content(guest: GuestType<string>): void {\n fetch(this.basePath + \"/\" + this.template)\n .then((result) => {\n return result.text();\n })\n .then((result) => {\n give(result, guest);\n });\n }\n}\n","import {\n SourceAll,\n Patron,\n PrivateType,\n SourceType,\n value,\n give,\n SourceWithPoolType,\n} from \"silentium\";\nimport { RoutePageTransportType } from \"src/navigation/PageFetchTransport\";\nimport { RouteDisplayType } from \"src/navigation/RouteDisplay\";\nimport { RoutePageType } from \"src/navigation/RoutePageType\";\n\nexport interface RouteDocument {\n url: string;\n template: string;\n aliases?: string[];\n page: RoutePageType;\n default?: boolean;\n}\n\nexport class Navigation {\n public constructor(\n private loading: SourceWithPoolType<boolean>,\n private basePath: SourceType<string>,\n private currentPage: SourceWithPoolType<string>,\n private display: RouteDisplayType,\n private pageTransport: PrivateType<RoutePageTransportType>,\n ) {}\n\n public routes(routes: RouteDocument[]) {\n const defaultRoute = routes.find((route) => route.default);\n const all = new SourceAll<{\n basePath: string;\n currentPage: string;\n }>();\n value(this.basePath, new Patron(all.guestKey(\"basePath\")));\n value(this.currentPage, new Patron(all.guestKey(\"currentPage\")));\n\n all.value(\n new Patron(({ basePath, currentPage }) => {\n const urlWithoutBasePath = currentPage.replace(basePath, \"\");\n const routeMatchedToAlias = routes.find(\n (route) =>\n route.aliases &&\n (route.aliases.includes(currentPage) ||\n route.aliases.includes(urlWithoutBasePath)),\n );\n\n if (routeMatchedToAlias) {\n const correctUrl = basePath + routeMatchedToAlias.url;\n\n if (correctUrl !== currentPage) {\n give(correctUrl, this.currentPage);\n return;\n }\n }\n\n let route = routes.find((route) => {\n if (route.url.indexOf(\"*\") >= 0) {\n const regexp = new RegExp(\n route.url.replaceAll(\"*\", \".*\").replaceAll(\"/\", \"/\"),\n );\n return regexp.test(urlWithoutBasePath);\n }\n return route.url.replaceAll(\"*\", \"\") === urlWithoutBasePath;\n });\n\n if (!route && defaultRoute) {\n route = defaultRoute;\n }\n\n if (route) {\n const basePathWithoutHash = basePath\n .replace(\"/#\", \"\")\n .replace(\"#\", \"\")\n .replace(/[^/]+\\.html$/, \"\");\n give(true, this.loading);\n this.pageTransport\n .get(basePathWithoutHash, route.template)\n .content((templateContent) => {\n this.display.display(templateContent);\n route.page.mounted();\n give(false, this.loading);\n });\n } else {\n throw new Error(\"No matching route in Navigation\");\n }\n }),\n );\n }\n}\n","export interface RouteDisplayType {\n display(content: string): void;\n}\n\n/**\n * Renders content on selector\n * @deprecated move to web api\n */\nexport class RouteDisplay implements RouteDisplayType {\n public constructor(private selector: string) {}\n\n public display(content: string): void {\n const contentEl = document.querySelector(this.selector);\n if (contentEl) {\n contentEl.innerHTML = content;\n }\n }\n}\n","import { GuestType, SourceWithPool, SourceWithPoolType } from \"silentium\";\n\n/**\n * @deprecated move to web api\n */\nexport class CurrentPage implements SourceWithPoolType<string> {\n private source: SourceWithPoolType<string>;\n\n public constructor() {\n const correctUrl = location.href.replace(location.origin, \"\");\n this.source = new SourceWithPool(correctUrl);\n }\n\n public give(value: string): this {\n this.source.give(value);\n return this;\n }\n\n public value(guest: GuestType<string>) {\n this.source.value(guest);\n return guest;\n }\n\n public pool() {\n return this.source.pool();\n }\n}\n","import { GuestType, Patron, SourceWithPoolType } from \"silentium\";\n\ntype InputValue = number | string;\n\n/**\n * @deprecated move to web api\n */\nexport class Input implements SourceWithPoolType<InputValue> {\n public constructor(\n private source: SourceWithPoolType<InputValue>,\n selector: string,\n ) {\n const el = document.querySelector(selector) as HTMLInputElement;\n this.source.value(\n new Patron((value) => {\n el.value = String(value);\n }),\n );\n el.addEventListener(\"keyup\", () => {\n this.give(el.value);\n });\n el.addEventListener(\"change\", () => {\n this.give(el.value);\n });\n }\n\n public value(guest: GuestType<InputValue>) {\n this.source.value(guest);\n return this;\n }\n\n public give(value: InputValue) {\n this.source.give(value);\n return this;\n }\n\n public pool() {\n return this.source.pool();\n }\n}\n","import { GuestObjectType } from \"silentium\";\n\n/**\n * @deprecated move to web api\n */\nexport class Visible implements GuestObjectType<boolean> {\n public constructor(private selector: string) {}\n\n public give(isVisible: boolean): this {\n const el = document.querySelector(this.selector) as HTMLElement;\n if (el) {\n el.style.display = isVisible ? \"block\" : \"none\";\n }\n return this;\n }\n}\n","import { GuestObjectType } from \"silentium\";\n\n/**\n * @deprecated Move to web api\n */\nexport class Text implements GuestObjectType {\n public constructor(private selector: string) {}\n\n public give(value: unknown) {\n const element = document.querySelector(this.selector) as HTMLElement;\n if (element) {\n element.innerText = String(value);\n }\n return this;\n }\n}\n","import { GuestObjectType, SourceType, value } from \"silentium\";\n\n/**\n * @deprecated move to web api\n */\nexport class Link {\n public constructor(\n private linkSource: GuestObjectType<string>,\n private basePath: SourceType<string>,\n ) {}\n\n public watchClick(selector: string, subselector?: string) {\n const wrapperEl = document.querySelectorAll(selector);\n if (wrapperEl.length) {\n wrapperEl.forEach((theElement) => {\n theElement.addEventListener(\"click\", (e) => {\n if (subselector) {\n theElement\n .querySelectorAll(subselector)\n .forEach((theSubElement) => {\n if (\n e?.target === theSubElement ||\n e?.currentTarget === theSubElement\n ) {\n this.handleClick({\n preventDefault: e.preventDefault.bind(e),\n target: theSubElement,\n } as unknown as Event);\n }\n });\n } else {\n this.handleClick(e);\n }\n });\n });\n } else {\n throw new Error(`Link wrapper not found for selector ${selector}`);\n }\n }\n\n private handleClick(e: Event) {\n let href = (e?.target as HTMLElement)?.getAttribute(\"href\");\n if (!href) {\n href = (e?.currentTarget as HTMLElement)?.getAttribute(\"href\");\n }\n if (href && href.indexOf(\"http\") !== 0) {\n e.preventDefault();\n value(this.basePath, (basePath) => {\n this.linkSource.give(basePath + href);\n });\n }\n }\n}\n","import {\n give,\n SourceAll,\n SourceObjectType,\n GuestCast,\n GuestType,\n} from \"silentium\";\n\ntype SourceDetailType = {\n source: SourceObjectType<any>;\n placeholder: string;\n};\n\n/**\n * @deprecated use https://kosukhin.github.io/patron-web-api/#/dom/element\n */\nexport class ComputedElement {\n public constructor(\n private sources: SourceDetailType[],\n private selectorTemplate: string,\n ) {}\n\n public element(guest: GuestType<HTMLElement>) {\n const chain = new SourceAll();\n this.sources.forEach((source) => {\n source.source.value(\n new GuestCast(guest as GuestType, chain.guestKey(source.placeholder)),\n );\n });\n\n chain.value(\n new GuestCast(\n guest as GuestType,\n (placeholders: Record<string, string>) => {\n let selectorTemplate = this.selectorTemplate;\n\n Object.entries(placeholders).map((entry) => {\n selectorTemplate = selectorTemplate.replaceAll(entry[0], entry[1]);\n });\n\n const element = document.querySelector(\n selectorTemplate,\n ) as HTMLElement;\n if (element) {\n give(element, guest);\n }\n },\n ),\n );\n }\n}\n","import { GuestObjectType, PatronOnce, SourceType, value } from \"silentium\";\n\n/**\n * Sets activeClass to one element of group\n * and resets activeClass on other group elements\n * suitable for menu active class\n *\n * @deprecated heavily related to web api needs refactoring\n */\nexport class GroupActiveClass implements GuestObjectType<HTMLElement> {\n public constructor(\n private activeClass: string,\n private groupSelector: string,\n private document: SourceType<Document>,\n ) {}\n\n public give(element: HTMLElement): this {\n value(\n this.document,\n new PatronOnce((document) => {\n document.querySelectorAll(this.groupSelector).forEach((el) => {\n el.classList.remove(this.activeClass);\n });\n element.classList.add(this.activeClass);\n }),\n );\n return this;\n }\n}\n","import {\n Source,\n SourceAll,\n GuestCast,\n Patron,\n PrivateClass,\n SourceWithPool,\n give,\n sourceOf,\n} from \"silentium\";\nimport { HistoryNewPage, HistoryPoppedPage } from \"silentium-web-api\";\nimport { ComputedElement, GroupActiveClass, Link, Visible } from \"../controls\";\nimport { CurrentPage } from \"../navigation/CurrentPage\";\nimport { Navigation } from \"../navigation/Navigation\";\nimport { PageFetchTransport } from \"../navigation/PageFetchTransport\";\nimport { RouteDisplay } from \"../navigation/RouteDisplay\";\n\ntype Route = {\n url: string;\n template: string;\n aliases: string[];\n page: any;\n};\n\nexport class Router {\n public constructor(\n private loaderSelector: string,\n private navigationResultSelector: string,\n private menuSelector: string,\n ) {}\n\n routes(\n routes: Route[],\n currentPage: any,\n basePathSource: any,\n afterPageLoaded?: () => void,\n ) {\n if (!currentPage) {\n currentPage = new CurrentPage();\n }\n currentPage.value(new Patron(new HistoryNewPage()));\n\n const [basePath] = location.href.replace(location.origin, \"\").split(\"#\");\n if (!basePathSource) {\n basePathSource = new SourceWithPool(\n `${basePath}#`.replace(\"index.html\", \"\").replace(\"//\", \"/\"),\n );\n }\n\n const pageLoading = new SourceWithPool(false);\n pageLoading.value(new Patron(new Visible(this.loaderSelector)));\n\n const historyPoppedPage = new HistoryPoppedPage(currentPage);\n historyPoppedPage.watchPop();\n\n const navigation = new Navigation(\n pageLoading,\n basePathSource,\n currentPage,\n new RouteDisplay(this.navigationResultSelector),\n new PrivateClass(PageFetchTransport),\n );\n navigation.routes(routes);\n\n const link = new Link(currentPage, basePathSource);\n link.watchClick(this.menuSelector);\n\n const urlChain = new SourceAll<any>();\n basePathSource.value(new Patron(urlChain.guestKey(\"basePath\")));\n currentPage.value(new Patron(urlChain.guestKey(\"page\")));\n const url = new Source((guest) => {\n urlChain.value(\n new GuestCast(guest, ({ basePath, page }) => {\n give(page.replace(basePath, \"\"), guest);\n }),\n );\n });\n\n const activeLink = new ComputedElement(\n [{ source: url, placeholder: \"{url}\" }],\n `${this.menuSelector} a[href=\"{url}\"]`,\n );\n activeLink.element(\n new Patron(\n new GroupActiveClass(\n \"active\",\n `${this.menuSelector} a`,\n sourceOf(document),\n ),\n ),\n );\n\n pageLoading.value(\n new Patron((isInLoading) => {\n if (isInLoading) {\n return;\n }\n\n if (afterPageLoaded) {\n afterPageLoaded();\n }\n\n const divDestination = document.querySelector(\n this.navigationResultSelector,\n );\n if (divDestination) {\n // Оживляем script тэги\n divDestination.querySelectorAll(\"script\").forEach((x) => {\n const sc = document.createElement(\"script\");\n sc.setAttribute(\"type\", \"module\");\n sc.appendChild(document.createTextNode(x.innerText));\n divDestination.appendChild(sc);\n });\n }\n }),\n );\n }\n}\n","import { RoutePageType } from \"../navigation\";\n\n/**\n * @deprecated Move to web api\n */\nexport class Page implements RoutePageType {\n public constructor(private title: string) {}\n\n public mounted() {\n document.title = this.title;\n }\n}\n","import { RoutePageType } from \"../navigation\";\n\n/**\n * @deprecated not needed\n */\nexport class EntryPointPage implements RoutePageType {\n public constructor(\n private title: string,\n private entryPointUrl: string,\n ) {}\n\n public mounted() {\n document.title = this.title;\n import(this.entryPointUrl).then((module) => {\n if (module.main) {\n module.main();\n }\n });\n }\n}\n","import {\n give,\n GuestCast,\n GuestObjectType,\n GuestType,\n Patron,\n PatronOnce,\n SourceAll,\n SourceObjectType,\n SourceType,\n SourceWithPool,\n value,\n} from \"silentium\";\n\n/**\n * Takes source and remember it first value\n * returns new record, what will contain only fields what was changed\n */\nexport class Dirty<T extends object>\n implements SourceObjectType<Partial<T>>, GuestObjectType<T>\n{\n private comparingSource = new SourceWithPool<T>();\n private all = new SourceAll<{ comparing: T | null; base: T }>();\n\n public constructor(\n baseEntitySource: SourceType<T>,\n private alwaysKeep: string[] = [],\n private excludeKeys: string[] = [],\n becomePatronAuto = false,\n ) {\n this.comparingSource.value(new Patron(this.all.guestKey(\"comparing\")));\n value(baseEntitySource, new Patron(this.all.guestKey(\"base\")));\n\n if (becomePatronAuto) {\n value(baseEntitySource, new PatronOnce(this));\n }\n }\n\n public give(value: T): this {\n give(JSON.parse(JSON.stringify(value)), this.comparingSource);\n return this;\n }\n\n public value(guest: GuestType<Partial<T>>): unknown {\n this.all.value(\n new GuestCast(guest, ({ comparing, base }) => {\n if (!comparing) {\n return;\n }\n\n give(\n Object.fromEntries(\n Object.entries(comparing).filter(([key, value]) => {\n if (this.alwaysKeep.includes(key)) {\n return true;\n }\n if (this.excludeKeys.includes(key)) {\n return false;\n }\n return value !== (base as any)[key];\n }),\n ) as T,\n guest,\n );\n }),\n );\n\n return this;\n }\n}\n","import {\n GuestCast,\n GuestType,\n SourceObjectType,\n SourceType,\n SourceWithPool,\n value,\n} from \"silentium\";\n\n/**\n * https://silentium-lab.github.io/silentium-components/#/behaviors/loading\n */\nexport class Loading implements SourceObjectType<boolean> {\n private loadingSource = new SourceWithPool<boolean>();\n\n public constructor(\n private loadingStartSource: SourceType<unknown>,\n private loadingFinishSource: SourceType<unknown>,\n ) {}\n\n public value(guest: GuestType<boolean>) {\n value(\n this.loadingStartSource,\n new GuestCast(guest, () => {\n this.loadingSource.give(true);\n }),\n );\n value(\n this.loadingFinishSource,\n new GuestCast(guest, () => {\n this.loadingSource.give(false);\n }),\n );\n this.loadingSource.value(guest);\n return this;\n }\n}\n","export class Touched {}\n","import {\n GuestType,\n Patron,\n SourceObjectType,\n SourceType,\n SourceWithPool,\n value,\n} from \"silentium\";\n\n/**\n * https://silentium-lab.github.io/silentium-components/#/structures/hash-table\n */\nexport class HashTable implements SourceObjectType<Record<string, unknown>> {\n private source = new SourceWithPool<Record<string, unknown>>({});\n\n public constructor(baseSource: SourceType<[string, unknown]>) {\n value(\n baseSource,\n new Patron(([key, value]) => {\n this.source.value((lastRecord) => {\n lastRecord[key] = value;\n });\n }),\n );\n }\n\n public value(guest: GuestType<Record<string, unknown>>) {\n value(this.source, guest);\n return this;\n }\n}\n"],"names":["PageFetchTransport","constructor","basePath","template","this","content","guest","fetch","then","result","text","give","Navigation","loading","currentPage","display","pageTransport","routes","defaultRoute","find","route","default","all","SourceAll","value","Patron","guestKey","urlWithoutBasePath","replace","routeMatchedToAlias","aliases","includes","correctUrl","url","indexOf","RegExp","replaceAll","test","Error","basePathWithoutHash","get","templateContent","page","mounted","RouteDisplay","selector","contentEl","document","querySelector","innerHTML","CurrentPage","__publicField","location","href","origin","source","SourceWithPool","pool","Input","el","String","addEventListener","Visible","isVisible","style","Text","element","innerText","Link","linkSource","watchClick","subselector","wrapperEl","querySelectorAll","length","forEach","theElement","e","theSubElement","target","currentTarget","handleClick","preventDefault","bind","getAttribute","ComputedElement","sources","selectorTemplate","chain","GuestCast","placeholder","placeholders","Object","entries","map","entry","GroupActiveClass","activeClass","groupSelector","PatronOnce","classList","remove","add","Router","loaderSelector","navigationResultSelector","menuSelector","basePathSource","afterPageLoaded","HistoryNewPage","split","pageLoading","HistoryPoppedPage","watchPop","PrivateClass","urlChain","Source","sourceOf","isInLoading","divDestination","x","sc","createElement","setAttribute","appendChild","createTextNode","Page","title","EntryPointPage","entryPointUrl","import","module","main","Dirty","baseEntitySource","alwaysKeep","excludeKeys","becomePatronAuto","comparingSource","JSON","parse","stringify","comparing","base","fromEntries","filter","key","Loading","loadingStartSource","loadingFinishSource","loadingSource","Touched","HashTable","baseSource","lastRecord"],"mappings":"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"}
@@ -81,12 +81,12 @@ class RouteDisplay {
81
81
  }
82
82
  }
83
83
 
84
- var __defProp = Object.defineProperty;
85
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
86
- var __publicField = (obj, key, value) => __defNormalProp(obj, key + "" , value);
84
+ var __defProp$3 = Object.defineProperty;
85
+ var __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
86
+ var __publicField$3 = (obj, key, value) => __defNormalProp$3(obj, key + "" , value);
87
87
  class CurrentPage {
88
88
  constructor() {
89
- __publicField(this, "source");
89
+ __publicField$3(this, "source");
90
90
  const correctUrl = location.href.replace(location.origin, "");
91
91
  this.source = new SourceWithPool(correctUrl);
92
92
  }
@@ -354,5 +354,101 @@ class EntryPointPage {
354
354
  }
355
355
  }
356
356
 
357
- export { ComputedElement, CurrentPage, EntryPointPage, GroupActiveClass, Input, Link, Navigation, Page, PageFetchTransport, RouteDisplay, Router, Text, Visible };
357
+ var __defProp$2 = Object.defineProperty;
358
+ var __defNormalProp$2 = (obj, key, value2) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value: value2 }) : obj[key] = value2;
359
+ var __publicField$2 = (obj, key, value2) => __defNormalProp$2(obj, typeof key !== "symbol" ? key + "" : key, value2);
360
+ class Dirty {
361
+ constructor(baseEntitySource, alwaysKeep = [], excludeKeys = [], becomePatronAuto = false) {
362
+ this.alwaysKeep = alwaysKeep;
363
+ this.excludeKeys = excludeKeys;
364
+ __publicField$2(this, "comparingSource", new SourceWithPool());
365
+ __publicField$2(this, "all", new SourceAll());
366
+ this.comparingSource.value(new Patron(this.all.guestKey("comparing")));
367
+ value(baseEntitySource, new Patron(this.all.guestKey("base")));
368
+ if (becomePatronAuto) {
369
+ value(baseEntitySource, new PatronOnce(this));
370
+ }
371
+ }
372
+ give(value2) {
373
+ give(JSON.parse(JSON.stringify(value2)), this.comparingSource);
374
+ return this;
375
+ }
376
+ value(guest) {
377
+ this.all.value(
378
+ new GuestCast(guest, ({ comparing, base }) => {
379
+ if (!comparing) {
380
+ return;
381
+ }
382
+ give(
383
+ Object.fromEntries(
384
+ Object.entries(comparing).filter(([key, value2]) => {
385
+ if (this.alwaysKeep.includes(key)) {
386
+ return true;
387
+ }
388
+ if (this.excludeKeys.includes(key)) {
389
+ return false;
390
+ }
391
+ return value2 !== base[key];
392
+ })
393
+ ),
394
+ guest
395
+ );
396
+ })
397
+ );
398
+ return this;
399
+ }
400
+ }
401
+
402
+ var __defProp$1 = Object.defineProperty;
403
+ var __defNormalProp$1 = (obj, key, value2) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value: value2 }) : obj[key] = value2;
404
+ var __publicField$1 = (obj, key, value2) => __defNormalProp$1(obj, key + "" , value2);
405
+ class Loading {
406
+ constructor(loadingStartSource, loadingFinishSource) {
407
+ this.loadingStartSource = loadingStartSource;
408
+ this.loadingFinishSource = loadingFinishSource;
409
+ __publicField$1(this, "loadingSource", new SourceWithPool());
410
+ }
411
+ value(guest) {
412
+ value(
413
+ this.loadingStartSource,
414
+ new GuestCast(guest, () => {
415
+ this.loadingSource.give(true);
416
+ })
417
+ );
418
+ value(
419
+ this.loadingFinishSource,
420
+ new GuestCast(guest, () => {
421
+ this.loadingSource.give(false);
422
+ })
423
+ );
424
+ this.loadingSource.value(guest);
425
+ return this;
426
+ }
427
+ }
428
+
429
+ class Touched {
430
+ }
431
+
432
+ var __defProp = Object.defineProperty;
433
+ var __defNormalProp = (obj, key, value2) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value: value2 }) : obj[key] = value2;
434
+ var __publicField = (obj, key, value2) => __defNormalProp(obj, key + "" , value2);
435
+ class HashTable {
436
+ constructor(baseSource) {
437
+ __publicField(this, "source", new SourceWithPool({}));
438
+ value(
439
+ baseSource,
440
+ new Patron(([key, value2]) => {
441
+ this.source.value((lastRecord) => {
442
+ lastRecord[key] = value2;
443
+ });
444
+ })
445
+ );
446
+ }
447
+ value(guest) {
448
+ value(this.source, guest);
449
+ return this;
450
+ }
451
+ }
452
+
453
+ export { ComputedElement, CurrentPage, Dirty, EntryPointPage, GroupActiveClass, HashTable, Input, Link, Loading, Navigation, Page, PageFetchTransport, RouteDisplay, Router, Text, Touched, Visible };
358
454
  //# sourceMappingURL=silentium-components.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"silentium-components.mjs","sources":["../src/navigation/PageFetchTransport.ts","../src/navigation/Navigation.ts","../src/navigation/RouteDisplay.ts","../src/navigation/CurrentPage.ts","../src/controls/Input.ts","../src/controls/Visible.ts","../src/controls/Text.ts","../src/controls/Link.ts","../src/controls/ComputedElement.ts","../src/controls/GroupActiveClass.ts","../src/navigation/Router.ts","../src/page/Page.ts","../src/page/EntryPointPage.ts"],"sourcesContent":["import { give, GuestType } from \"silentium\";\n\nexport interface RoutePageTransportType {\n content(guest: GuestType<string>): void;\n}\n\n/**\n * Not needed anymore same thing in web api existed\n * @deprecated\n */\nexport class PageFetchTransport implements RoutePageTransportType {\n public constructor(\n private basePath: string,\n private template: string,\n ) {}\n\n public content(guest: GuestType<string>): void {\n fetch(this.basePath + \"/\" + this.template)\n .then((result) => {\n return result.text();\n })\n .then((result) => {\n give(result, guest);\n });\n }\n}\n","import {\n SourceAll,\n Patron,\n PrivateType,\n SourceType,\n value,\n give,\n SourceWithPoolType,\n} from \"silentium\";\nimport { RoutePageTransportType } from \"src/navigation/PageFetchTransport\";\nimport { RouteDisplayType } from \"src/navigation/RouteDisplay\";\nimport { RoutePageType } from \"src/navigation/RoutePageType\";\n\nexport interface RouteDocument {\n url: string;\n template: string;\n aliases?: string[];\n page: RoutePageType;\n default?: boolean;\n}\n\nexport class Navigation {\n public constructor(\n private loading: SourceWithPoolType<boolean>,\n private basePath: SourceType<string>,\n private currentPage: SourceWithPoolType<string>,\n private display: RouteDisplayType,\n private pageTransport: PrivateType<RoutePageTransportType>,\n ) {}\n\n public routes(routes: RouteDocument[]) {\n const defaultRoute = routes.find((route) => route.default);\n const all = new SourceAll<{\n basePath: string;\n currentPage: string;\n }>();\n value(this.basePath, new Patron(all.guestKey(\"basePath\")));\n value(this.currentPage, new Patron(all.guestKey(\"currentPage\")));\n\n all.value(\n new Patron(({ basePath, currentPage }) => {\n const urlWithoutBasePath = currentPage.replace(basePath, \"\");\n const routeMatchedToAlias = routes.find(\n (route) =>\n route.aliases &&\n (route.aliases.includes(currentPage) ||\n route.aliases.includes(urlWithoutBasePath)),\n );\n\n if (routeMatchedToAlias) {\n const correctUrl = basePath + routeMatchedToAlias.url;\n\n if (correctUrl !== currentPage) {\n give(correctUrl, this.currentPage);\n return;\n }\n }\n\n let route = routes.find((route) => {\n if (route.url.indexOf(\"*\") >= 0) {\n const regexp = new RegExp(\n route.url.replaceAll(\"*\", \".*\").replaceAll(\"/\", \"/\"),\n );\n return regexp.test(urlWithoutBasePath);\n }\n return route.url.replaceAll(\"*\", \"\") === urlWithoutBasePath;\n });\n\n if (!route && defaultRoute) {\n route = defaultRoute;\n }\n\n if (route) {\n const basePathWithoutHash = basePath\n .replace(\"/#\", \"\")\n .replace(\"#\", \"\")\n .replace(/[^/]+\\.html$/, \"\");\n give(true, this.loading);\n this.pageTransport\n .get(basePathWithoutHash, route.template)\n .content((templateContent) => {\n this.display.display(templateContent);\n route.page.mounted();\n give(false, this.loading);\n });\n } else {\n throw new Error(\"No matching route in Navigation\");\n }\n }),\n );\n }\n}\n","export interface RouteDisplayType {\n display(content: string): void;\n}\n\n/**\n * Renders content on selector\n * @deprecated move to web api\n */\nexport class RouteDisplay implements RouteDisplayType {\n public constructor(private selector: string) {}\n\n public display(content: string): void {\n const contentEl = document.querySelector(this.selector);\n if (contentEl) {\n contentEl.innerHTML = content;\n }\n }\n}\n","import { GuestType, SourceWithPool, SourceWithPoolType } from \"silentium\";\n\n/**\n * @deprecated move to web api\n */\nexport class CurrentPage implements SourceWithPoolType<string> {\n private source: SourceWithPoolType<string>;\n\n public constructor() {\n const correctUrl = location.href.replace(location.origin, \"\");\n this.source = new SourceWithPool(correctUrl);\n }\n\n public give(value: string): this {\n this.source.give(value);\n return this;\n }\n\n public value(guest: GuestType<string>) {\n this.source.value(guest);\n return guest;\n }\n\n public pool() {\n return this.source.pool();\n }\n}\n","import { GuestType, Patron, SourceWithPoolType } from \"silentium\";\n\ntype InputValue = number | string;\n\n/**\n * @deprecated move to web api\n */\nexport class Input implements SourceWithPoolType<InputValue> {\n public constructor(\n private source: SourceWithPoolType<InputValue>,\n selector: string,\n ) {\n const el = document.querySelector(selector) as HTMLInputElement;\n this.source.value(\n new Patron((value) => {\n el.value = String(value);\n }),\n );\n el.addEventListener(\"keyup\", () => {\n this.give(el.value);\n });\n el.addEventListener(\"change\", () => {\n this.give(el.value);\n });\n }\n\n public value(guest: GuestType<InputValue>) {\n this.source.value(guest);\n return this;\n }\n\n public give(value: InputValue) {\n this.source.give(value);\n return this;\n }\n\n public pool() {\n return this.source.pool();\n }\n}\n","import { GuestObjectType } from \"silentium\";\n\n/**\n * @deprecated move to web api\n */\nexport class Visible implements GuestObjectType<boolean> {\n public constructor(private selector: string) {}\n\n public give(isVisible: boolean): this {\n const el = document.querySelector(this.selector) as HTMLElement;\n if (el) {\n el.style.display = isVisible ? \"block\" : \"none\";\n }\n return this;\n }\n}\n","import { GuestObjectType } from \"silentium\";\n\n/**\n * @deprecated Move to web api\n */\nexport class Text implements GuestObjectType {\n public constructor(private selector: string) {}\n\n public give(value: unknown) {\n const element = document.querySelector(this.selector) as HTMLElement;\n if (element) {\n element.innerText = String(value);\n }\n return this;\n }\n}\n","import { GuestObjectType, SourceType, value } from \"silentium\";\n\n/**\n * @deprecated move to web api\n */\nexport class Link {\n public constructor(\n private linkSource: GuestObjectType<string>,\n private basePath: SourceType<string>,\n ) {}\n\n public watchClick(selector: string, subselector?: string) {\n const wrapperEl = document.querySelectorAll(selector);\n if (wrapperEl.length) {\n wrapperEl.forEach((theElement) => {\n theElement.addEventListener(\"click\", (e) => {\n if (subselector) {\n theElement\n .querySelectorAll(subselector)\n .forEach((theSubElement) => {\n if (\n e?.target === theSubElement ||\n e?.currentTarget === theSubElement\n ) {\n this.handleClick({\n preventDefault: e.preventDefault.bind(e),\n target: theSubElement,\n } as unknown as Event);\n }\n });\n } else {\n this.handleClick(e);\n }\n });\n });\n } else {\n throw new Error(`Link wrapper not found for selector ${selector}`);\n }\n }\n\n private handleClick(e: Event) {\n let href = (e?.target as HTMLElement)?.getAttribute(\"href\");\n if (!href) {\n href = (e?.currentTarget as HTMLElement)?.getAttribute(\"href\");\n }\n if (href && href.indexOf(\"http\") !== 0) {\n e.preventDefault();\n value(this.basePath, (basePath) => {\n this.linkSource.give(basePath + href);\n });\n }\n }\n}\n","import {\n give,\n SourceAll,\n SourceObjectType,\n GuestCast,\n GuestType,\n} from \"silentium\";\n\ntype SourceDetailType = {\n source: SourceObjectType<any>;\n placeholder: string;\n};\n\n/**\n * @deprecated use https://kosukhin.github.io/patron-web-api/#/dom/element\n */\nexport class ComputedElement {\n public constructor(\n private sources: SourceDetailType[],\n private selectorTemplate: string,\n ) {}\n\n public element(guest: GuestType<HTMLElement>) {\n const chain = new SourceAll();\n this.sources.forEach((source) => {\n source.source.value(\n new GuestCast(guest as GuestType, chain.guestKey(source.placeholder)),\n );\n });\n\n chain.value(\n new GuestCast(\n guest as GuestType,\n (placeholders: Record<string, string>) => {\n let selectorTemplate = this.selectorTemplate;\n\n Object.entries(placeholders).map((entry) => {\n selectorTemplate = selectorTemplate.replaceAll(entry[0], entry[1]);\n });\n\n const element = document.querySelector(\n selectorTemplate,\n ) as HTMLElement;\n if (element) {\n give(element, guest);\n }\n },\n ),\n );\n }\n}\n","import { GuestObjectType, PatronOnce, SourceType, value } from \"silentium\";\n\n/**\n * Sets activeClass to one element of group\n * and resets activeClass on other group elements\n * suitable for menu active class\n *\n * @deprecated heavily related to web api needs refactoring\n */\nexport class GroupActiveClass implements GuestObjectType<HTMLElement> {\n public constructor(\n private activeClass: string,\n private groupSelector: string,\n private document: SourceType<Document>,\n ) {}\n\n public give(element: HTMLElement): this {\n value(\n this.document,\n new PatronOnce((document) => {\n document.querySelectorAll(this.groupSelector).forEach((el) => {\n el.classList.remove(this.activeClass);\n });\n element.classList.add(this.activeClass);\n }),\n );\n return this;\n }\n}\n","import {\n Source,\n SourceAll,\n GuestCast,\n Patron,\n PrivateClass,\n SourceWithPool,\n give,\n sourceOf,\n} from \"silentium\";\nimport { HistoryNewPage, HistoryPoppedPage } from \"silentium-web-api\";\nimport { ComputedElement, GroupActiveClass, Link, Visible } from \"../controls\";\nimport { CurrentPage } from \"../navigation/CurrentPage\";\nimport { Navigation } from \"../navigation/Navigation\";\nimport { PageFetchTransport } from \"../navigation/PageFetchTransport\";\nimport { RouteDisplay } from \"../navigation/RouteDisplay\";\n\ntype Route = {\n url: string;\n template: string;\n aliases: string[];\n page: any;\n};\n\nexport class Router {\n public constructor(\n private loaderSelector: string,\n private navigationResultSelector: string,\n private menuSelector: string,\n ) {}\n\n routes(\n routes: Route[],\n currentPage: any,\n basePathSource: any,\n afterPageLoaded?: () => void,\n ) {\n if (!currentPage) {\n currentPage = new CurrentPage();\n }\n currentPage.value(new Patron(new HistoryNewPage()));\n\n const [basePath] = location.href.replace(location.origin, \"\").split(\"#\");\n if (!basePathSource) {\n basePathSource = new SourceWithPool(\n `${basePath}#`.replace(\"index.html\", \"\").replace(\"//\", \"/\"),\n );\n }\n\n const pageLoading = new SourceWithPool(false);\n pageLoading.value(new Patron(new Visible(this.loaderSelector)));\n\n const historyPoppedPage = new HistoryPoppedPage(currentPage);\n historyPoppedPage.watchPop();\n\n const navigation = new Navigation(\n pageLoading,\n basePathSource,\n currentPage,\n new RouteDisplay(this.navigationResultSelector),\n new PrivateClass(PageFetchTransport),\n );\n navigation.routes(routes);\n\n const link = new Link(currentPage, basePathSource);\n link.watchClick(this.menuSelector);\n\n const urlChain = new SourceAll<any>();\n basePathSource.value(new Patron(urlChain.guestKey(\"basePath\")));\n currentPage.value(new Patron(urlChain.guestKey(\"page\")));\n const url = new Source((guest) => {\n urlChain.value(\n new GuestCast(guest, ({ basePath, page }) => {\n give(page.replace(basePath, \"\"), guest);\n }),\n );\n });\n\n const activeLink = new ComputedElement(\n [{ source: url, placeholder: \"{url}\" }],\n `${this.menuSelector} a[href=\"{url}\"]`,\n );\n activeLink.element(\n new Patron(\n new GroupActiveClass(\n \"active\",\n `${this.menuSelector} a`,\n sourceOf(document),\n ),\n ),\n );\n\n pageLoading.value(\n new Patron((isInLoading) => {\n if (isInLoading) {\n return;\n }\n\n if (afterPageLoaded) {\n afterPageLoaded();\n }\n\n const divDestination = document.querySelector(\n this.navigationResultSelector,\n );\n if (divDestination) {\n // Оживляем script тэги\n divDestination.querySelectorAll(\"script\").forEach((x) => {\n const sc = document.createElement(\"script\");\n sc.setAttribute(\"type\", \"module\");\n sc.appendChild(document.createTextNode(x.innerText));\n divDestination.appendChild(sc);\n });\n }\n }),\n );\n }\n}\n","import { RoutePageType } from \"../navigation\";\n\n/**\n * @deprecated Move to web api\n */\nexport class Page implements RoutePageType {\n public constructor(private title: string) {}\n\n public mounted() {\n document.title = this.title;\n }\n}\n","import { RoutePageType } from \"../navigation\";\n\n/**\n * @deprecated not needed\n */\nexport class EntryPointPage implements RoutePageType {\n public constructor(\n private title: string,\n private entryPointUrl: string,\n ) {}\n\n public mounted() {\n document.title = this.title;\n import(this.entryPointUrl).then((module) => {\n if (module.main) {\n module.main();\n }\n });\n }\n}\n"],"names":["route","basePath"],"mappings":"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"}
1
+ {"version":3,"file":"silentium-components.mjs","sources":["../src/navigation/PageFetchTransport.ts","../src/navigation/Navigation.ts","../src/navigation/RouteDisplay.ts","../src/navigation/CurrentPage.ts","../src/controls/Input.ts","../src/controls/Visible.ts","../src/controls/Text.ts","../src/controls/Link.ts","../src/controls/ComputedElement.ts","../src/controls/GroupActiveClass.ts","../src/navigation/Router.ts","../src/page/Page.ts","../src/page/EntryPointPage.ts","../src/behaviors/Dirty.ts","../src/behaviors/Loading.ts","../src/behaviors/Touched.ts","../src/structures/HashTable.ts"],"sourcesContent":["import { give, GuestType } from \"silentium\";\n\nexport interface RoutePageTransportType {\n content(guest: GuestType<string>): void;\n}\n\n/**\n * Not needed anymore same thing in web api existed\n * @deprecated\n */\nexport class PageFetchTransport implements RoutePageTransportType {\n public constructor(\n private basePath: string,\n private template: string,\n ) {}\n\n public content(guest: GuestType<string>): void {\n fetch(this.basePath + \"/\" + this.template)\n .then((result) => {\n return result.text();\n })\n .then((result) => {\n give(result, guest);\n });\n }\n}\n","import {\n SourceAll,\n Patron,\n PrivateType,\n SourceType,\n value,\n give,\n SourceWithPoolType,\n} from \"silentium\";\nimport { RoutePageTransportType } from \"src/navigation/PageFetchTransport\";\nimport { RouteDisplayType } from \"src/navigation/RouteDisplay\";\nimport { RoutePageType } from \"src/navigation/RoutePageType\";\n\nexport interface RouteDocument {\n url: string;\n template: string;\n aliases?: string[];\n page: RoutePageType;\n default?: boolean;\n}\n\nexport class Navigation {\n public constructor(\n private loading: SourceWithPoolType<boolean>,\n private basePath: SourceType<string>,\n private currentPage: SourceWithPoolType<string>,\n private display: RouteDisplayType,\n private pageTransport: PrivateType<RoutePageTransportType>,\n ) {}\n\n public routes(routes: RouteDocument[]) {\n const defaultRoute = routes.find((route) => route.default);\n const all = new SourceAll<{\n basePath: string;\n currentPage: string;\n }>();\n value(this.basePath, new Patron(all.guestKey(\"basePath\")));\n value(this.currentPage, new Patron(all.guestKey(\"currentPage\")));\n\n all.value(\n new Patron(({ basePath, currentPage }) => {\n const urlWithoutBasePath = currentPage.replace(basePath, \"\");\n const routeMatchedToAlias = routes.find(\n (route) =>\n route.aliases &&\n (route.aliases.includes(currentPage) ||\n route.aliases.includes(urlWithoutBasePath)),\n );\n\n if (routeMatchedToAlias) {\n const correctUrl = basePath + routeMatchedToAlias.url;\n\n if (correctUrl !== currentPage) {\n give(correctUrl, this.currentPage);\n return;\n }\n }\n\n let route = routes.find((route) => {\n if (route.url.indexOf(\"*\") >= 0) {\n const regexp = new RegExp(\n route.url.replaceAll(\"*\", \".*\").replaceAll(\"/\", \"/\"),\n );\n return regexp.test(urlWithoutBasePath);\n }\n return route.url.replaceAll(\"*\", \"\") === urlWithoutBasePath;\n });\n\n if (!route && defaultRoute) {\n route = defaultRoute;\n }\n\n if (route) {\n const basePathWithoutHash = basePath\n .replace(\"/#\", \"\")\n .replace(\"#\", \"\")\n .replace(/[^/]+\\.html$/, \"\");\n give(true, this.loading);\n this.pageTransport\n .get(basePathWithoutHash, route.template)\n .content((templateContent) => {\n this.display.display(templateContent);\n route.page.mounted();\n give(false, this.loading);\n });\n } else {\n throw new Error(\"No matching route in Navigation\");\n }\n }),\n );\n }\n}\n","export interface RouteDisplayType {\n display(content: string): void;\n}\n\n/**\n * Renders content on selector\n * @deprecated move to web api\n */\nexport class RouteDisplay implements RouteDisplayType {\n public constructor(private selector: string) {}\n\n public display(content: string): void {\n const contentEl = document.querySelector(this.selector);\n if (contentEl) {\n contentEl.innerHTML = content;\n }\n }\n}\n","import { GuestType, SourceWithPool, SourceWithPoolType } from \"silentium\";\n\n/**\n * @deprecated move to web api\n */\nexport class CurrentPage implements SourceWithPoolType<string> {\n private source: SourceWithPoolType<string>;\n\n public constructor() {\n const correctUrl = location.href.replace(location.origin, \"\");\n this.source = new SourceWithPool(correctUrl);\n }\n\n public give(value: string): this {\n this.source.give(value);\n return this;\n }\n\n public value(guest: GuestType<string>) {\n this.source.value(guest);\n return guest;\n }\n\n public pool() {\n return this.source.pool();\n }\n}\n","import { GuestType, Patron, SourceWithPoolType } from \"silentium\";\n\ntype InputValue = number | string;\n\n/**\n * @deprecated move to web api\n */\nexport class Input implements SourceWithPoolType<InputValue> {\n public constructor(\n private source: SourceWithPoolType<InputValue>,\n selector: string,\n ) {\n const el = document.querySelector(selector) as HTMLInputElement;\n this.source.value(\n new Patron((value) => {\n el.value = String(value);\n }),\n );\n el.addEventListener(\"keyup\", () => {\n this.give(el.value);\n });\n el.addEventListener(\"change\", () => {\n this.give(el.value);\n });\n }\n\n public value(guest: GuestType<InputValue>) {\n this.source.value(guest);\n return this;\n }\n\n public give(value: InputValue) {\n this.source.give(value);\n return this;\n }\n\n public pool() {\n return this.source.pool();\n }\n}\n","import { GuestObjectType } from \"silentium\";\n\n/**\n * @deprecated move to web api\n */\nexport class Visible implements GuestObjectType<boolean> {\n public constructor(private selector: string) {}\n\n public give(isVisible: boolean): this {\n const el = document.querySelector(this.selector) as HTMLElement;\n if (el) {\n el.style.display = isVisible ? \"block\" : \"none\";\n }\n return this;\n }\n}\n","import { GuestObjectType } from \"silentium\";\n\n/**\n * @deprecated Move to web api\n */\nexport class Text implements GuestObjectType {\n public constructor(private selector: string) {}\n\n public give(value: unknown) {\n const element = document.querySelector(this.selector) as HTMLElement;\n if (element) {\n element.innerText = String(value);\n }\n return this;\n }\n}\n","import { GuestObjectType, SourceType, value } from \"silentium\";\n\n/**\n * @deprecated move to web api\n */\nexport class Link {\n public constructor(\n private linkSource: GuestObjectType<string>,\n private basePath: SourceType<string>,\n ) {}\n\n public watchClick(selector: string, subselector?: string) {\n const wrapperEl = document.querySelectorAll(selector);\n if (wrapperEl.length) {\n wrapperEl.forEach((theElement) => {\n theElement.addEventListener(\"click\", (e) => {\n if (subselector) {\n theElement\n .querySelectorAll(subselector)\n .forEach((theSubElement) => {\n if (\n e?.target === theSubElement ||\n e?.currentTarget === theSubElement\n ) {\n this.handleClick({\n preventDefault: e.preventDefault.bind(e),\n target: theSubElement,\n } as unknown as Event);\n }\n });\n } else {\n this.handleClick(e);\n }\n });\n });\n } else {\n throw new Error(`Link wrapper not found for selector ${selector}`);\n }\n }\n\n private handleClick(e: Event) {\n let href = (e?.target as HTMLElement)?.getAttribute(\"href\");\n if (!href) {\n href = (e?.currentTarget as HTMLElement)?.getAttribute(\"href\");\n }\n if (href && href.indexOf(\"http\") !== 0) {\n e.preventDefault();\n value(this.basePath, (basePath) => {\n this.linkSource.give(basePath + href);\n });\n }\n }\n}\n","import {\n give,\n SourceAll,\n SourceObjectType,\n GuestCast,\n GuestType,\n} from \"silentium\";\n\ntype SourceDetailType = {\n source: SourceObjectType<any>;\n placeholder: string;\n};\n\n/**\n * @deprecated use https://kosukhin.github.io/patron-web-api/#/dom/element\n */\nexport class ComputedElement {\n public constructor(\n private sources: SourceDetailType[],\n private selectorTemplate: string,\n ) {}\n\n public element(guest: GuestType<HTMLElement>) {\n const chain = new SourceAll();\n this.sources.forEach((source) => {\n source.source.value(\n new GuestCast(guest as GuestType, chain.guestKey(source.placeholder)),\n );\n });\n\n chain.value(\n new GuestCast(\n guest as GuestType,\n (placeholders: Record<string, string>) => {\n let selectorTemplate = this.selectorTemplate;\n\n Object.entries(placeholders).map((entry) => {\n selectorTemplate = selectorTemplate.replaceAll(entry[0], entry[1]);\n });\n\n const element = document.querySelector(\n selectorTemplate,\n ) as HTMLElement;\n if (element) {\n give(element, guest);\n }\n },\n ),\n );\n }\n}\n","import { GuestObjectType, PatronOnce, SourceType, value } from \"silentium\";\n\n/**\n * Sets activeClass to one element of group\n * and resets activeClass on other group elements\n * suitable for menu active class\n *\n * @deprecated heavily related to web api needs refactoring\n */\nexport class GroupActiveClass implements GuestObjectType<HTMLElement> {\n public constructor(\n private activeClass: string,\n private groupSelector: string,\n private document: SourceType<Document>,\n ) {}\n\n public give(element: HTMLElement): this {\n value(\n this.document,\n new PatronOnce((document) => {\n document.querySelectorAll(this.groupSelector).forEach((el) => {\n el.classList.remove(this.activeClass);\n });\n element.classList.add(this.activeClass);\n }),\n );\n return this;\n }\n}\n","import {\n Source,\n SourceAll,\n GuestCast,\n Patron,\n PrivateClass,\n SourceWithPool,\n give,\n sourceOf,\n} from \"silentium\";\nimport { HistoryNewPage, HistoryPoppedPage } from \"silentium-web-api\";\nimport { ComputedElement, GroupActiveClass, Link, Visible } from \"../controls\";\nimport { CurrentPage } from \"../navigation/CurrentPage\";\nimport { Navigation } from \"../navigation/Navigation\";\nimport { PageFetchTransport } from \"../navigation/PageFetchTransport\";\nimport { RouteDisplay } from \"../navigation/RouteDisplay\";\n\ntype Route = {\n url: string;\n template: string;\n aliases: string[];\n page: any;\n};\n\nexport class Router {\n public constructor(\n private loaderSelector: string,\n private navigationResultSelector: string,\n private menuSelector: string,\n ) {}\n\n routes(\n routes: Route[],\n currentPage: any,\n basePathSource: any,\n afterPageLoaded?: () => void,\n ) {\n if (!currentPage) {\n currentPage = new CurrentPage();\n }\n currentPage.value(new Patron(new HistoryNewPage()));\n\n const [basePath] = location.href.replace(location.origin, \"\").split(\"#\");\n if (!basePathSource) {\n basePathSource = new SourceWithPool(\n `${basePath}#`.replace(\"index.html\", \"\").replace(\"//\", \"/\"),\n );\n }\n\n const pageLoading = new SourceWithPool(false);\n pageLoading.value(new Patron(new Visible(this.loaderSelector)));\n\n const historyPoppedPage = new HistoryPoppedPage(currentPage);\n historyPoppedPage.watchPop();\n\n const navigation = new Navigation(\n pageLoading,\n basePathSource,\n currentPage,\n new RouteDisplay(this.navigationResultSelector),\n new PrivateClass(PageFetchTransport),\n );\n navigation.routes(routes);\n\n const link = new Link(currentPage, basePathSource);\n link.watchClick(this.menuSelector);\n\n const urlChain = new SourceAll<any>();\n basePathSource.value(new Patron(urlChain.guestKey(\"basePath\")));\n currentPage.value(new Patron(urlChain.guestKey(\"page\")));\n const url = new Source((guest) => {\n urlChain.value(\n new GuestCast(guest, ({ basePath, page }) => {\n give(page.replace(basePath, \"\"), guest);\n }),\n );\n });\n\n const activeLink = new ComputedElement(\n [{ source: url, placeholder: \"{url}\" }],\n `${this.menuSelector} a[href=\"{url}\"]`,\n );\n activeLink.element(\n new Patron(\n new GroupActiveClass(\n \"active\",\n `${this.menuSelector} a`,\n sourceOf(document),\n ),\n ),\n );\n\n pageLoading.value(\n new Patron((isInLoading) => {\n if (isInLoading) {\n return;\n }\n\n if (afterPageLoaded) {\n afterPageLoaded();\n }\n\n const divDestination = document.querySelector(\n this.navigationResultSelector,\n );\n if (divDestination) {\n // Оживляем script тэги\n divDestination.querySelectorAll(\"script\").forEach((x) => {\n const sc = document.createElement(\"script\");\n sc.setAttribute(\"type\", \"module\");\n sc.appendChild(document.createTextNode(x.innerText));\n divDestination.appendChild(sc);\n });\n }\n }),\n );\n }\n}\n","import { RoutePageType } from \"../navigation\";\n\n/**\n * @deprecated Move to web api\n */\nexport class Page implements RoutePageType {\n public constructor(private title: string) {}\n\n public mounted() {\n document.title = this.title;\n }\n}\n","import { RoutePageType } from \"../navigation\";\n\n/**\n * @deprecated not needed\n */\nexport class EntryPointPage implements RoutePageType {\n public constructor(\n private title: string,\n private entryPointUrl: string,\n ) {}\n\n public mounted() {\n document.title = this.title;\n import(this.entryPointUrl).then((module) => {\n if (module.main) {\n module.main();\n }\n });\n }\n}\n","import {\n give,\n GuestCast,\n GuestObjectType,\n GuestType,\n Patron,\n PatronOnce,\n SourceAll,\n SourceObjectType,\n SourceType,\n SourceWithPool,\n value,\n} from \"silentium\";\n\n/**\n * Takes source and remember it first value\n * returns new record, what will contain only fields what was changed\n */\nexport class Dirty<T extends object>\n implements SourceObjectType<Partial<T>>, GuestObjectType<T>\n{\n private comparingSource = new SourceWithPool<T>();\n private all = new SourceAll<{ comparing: T | null; base: T }>();\n\n public constructor(\n baseEntitySource: SourceType<T>,\n private alwaysKeep: string[] = [],\n private excludeKeys: string[] = [],\n becomePatronAuto = false,\n ) {\n this.comparingSource.value(new Patron(this.all.guestKey(\"comparing\")));\n value(baseEntitySource, new Patron(this.all.guestKey(\"base\")));\n\n if (becomePatronAuto) {\n value(baseEntitySource, new PatronOnce(this));\n }\n }\n\n public give(value: T): this {\n give(JSON.parse(JSON.stringify(value)), this.comparingSource);\n return this;\n }\n\n public value(guest: GuestType<Partial<T>>): unknown {\n this.all.value(\n new GuestCast(guest, ({ comparing, base }) => {\n if (!comparing) {\n return;\n }\n\n give(\n Object.fromEntries(\n Object.entries(comparing).filter(([key, value]) => {\n if (this.alwaysKeep.includes(key)) {\n return true;\n }\n if (this.excludeKeys.includes(key)) {\n return false;\n }\n return value !== (base as any)[key];\n }),\n ) as T,\n guest,\n );\n }),\n );\n\n return this;\n }\n}\n","import {\n GuestCast,\n GuestType,\n SourceObjectType,\n SourceType,\n SourceWithPool,\n value,\n} from \"silentium\";\n\n/**\n * https://silentium-lab.github.io/silentium-components/#/behaviors/loading\n */\nexport class Loading implements SourceObjectType<boolean> {\n private loadingSource = new SourceWithPool<boolean>();\n\n public constructor(\n private loadingStartSource: SourceType<unknown>,\n private loadingFinishSource: SourceType<unknown>,\n ) {}\n\n public value(guest: GuestType<boolean>) {\n value(\n this.loadingStartSource,\n new GuestCast(guest, () => {\n this.loadingSource.give(true);\n }),\n );\n value(\n this.loadingFinishSource,\n new GuestCast(guest, () => {\n this.loadingSource.give(false);\n }),\n );\n this.loadingSource.value(guest);\n return this;\n }\n}\n","export class Touched {}\n","import {\n GuestType,\n Patron,\n SourceObjectType,\n SourceType,\n SourceWithPool,\n value,\n} from \"silentium\";\n\n/**\n * https://silentium-lab.github.io/silentium-components/#/structures/hash-table\n */\nexport class HashTable implements SourceObjectType<Record<string, unknown>> {\n private source = new SourceWithPool<Record<string, unknown>>({});\n\n public constructor(baseSource: SourceType<[string, unknown]>) {\n value(\n baseSource,\n new Patron(([key, value]) => {\n this.source.value((lastRecord) => {\n lastRecord[key] = value;\n });\n }),\n );\n }\n\n public value(guest: GuestType<Record<string, unknown>>) {\n value(this.source, guest);\n return this;\n }\n}\n"],"names":["route","__publicField","basePath","value"],"mappings":"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"}
@@ -6,3 +6,18 @@ html, body {
6
6
  font-size: 16px;
7
7
  font-weight: normal;
8
8
  }
9
+
10
+ pre {
11
+ padding: 16px;
12
+ background: #282c34;
13
+ color: #abb2bf;
14
+ overflow: auto;
15
+ }
16
+
17
+ .guest-result {
18
+ display: block;
19
+ background: #282c34;
20
+ color: #abb2bf;
21
+ padding: 16px;
22
+ font-size: 16px;
23
+ }
@@ -7,9 +7,56 @@
7
7
  <span> Dirty </span>
8
8
  </h2>
9
9
 
10
-
11
10
  <p class="text-gray-600 text-lg mb-4">
12
11
  Позволяет на основе имеющегося источника передающего структуру данных
13
12
  создать новый источник, который вернет структуру данных
14
13
  где окажутся только измененные поля.
15
14
  </p>
15
+
16
+ <p class="text-gray-600 text-lg mb-4">
17
+ Может быть полезно в формах, где нужно отправлять только то что было изменено.
18
+ </p>
19
+
20
+ <p class="text-gray-600 text-lg mb-0 font-bold">Пример 1.</p>
21
+ <pre
22
+ class="mb-4"
23
+ ><code class="language-js">import { SourceWithPool, SourceSync } from "silentium";
24
+ import { Dirty } from 'silentium-components';
25
+
26
+ const form = new SourceWithPool({
27
+ name: "one",
28
+ surname: "two",
29
+ });
30
+ const dirtyForm = new Dirty(form);
31
+ dirtyForm.give({
32
+ name: "new",
33
+ surname: "two",
34
+ });
35
+
36
+ const syncDirty = new SourceSync(dirtyForm);
37
+
38
+ document.querySelector(".guest-result").textContent = JSON.stringify(syncDirty.syncValue());
39
+ </code></pre>
40
+
41
+ <p class="text-gray-600 text-lg mb-0 font-bold">Результат 1.</p>
42
+ <div class="example mb-4">
43
+ <span class="guest-result">JS не отработал</span>
44
+ </div>
45
+ <script type="module">
46
+ import { SourceWithPool, SourceSync } from "silentium";
47
+ import { Dirty } from 'silentium-components';
48
+
49
+ const form = new SourceWithPool({
50
+ name: "one",
51
+ surname: "two",
52
+ });
53
+ const dirtyForm = new Dirty(form);
54
+ dirtyForm.give({
55
+ name: "new",
56
+ surname: "two",
57
+ });
58
+
59
+ const syncDirty = new SourceSync(dirtyForm);
60
+
61
+ document.querySelector(".guest-result").textContent = JSON.stringify(syncDirty.syncValue());
62
+ </script>
@@ -3,6 +3,7 @@
3
3
  <img src="./assets/img/github_16.jpg" width="16" height="16" />
4
4
  Loading на GitHub
5
5
  </a>
6
+
6
7
  <h2 class="font-medium title-font text-gray-900 text-lg mb-2">
7
8
  <span> Loading </span>
8
9
  </h2>
@@ -22,3 +23,45 @@
22
23
  что загрузка начата Loading переключается в true, когда Fetch Клиент
23
24
  получит результат - загрузка завершена, loading переключается в false.
24
25
  </p>
26
+
27
+ <p class="text-gray-600 text-lg mb-0 font-bold">Пример 1.</p>
28
+ <pre
29
+ class="mb-4"
30
+ ><code class="language-js">import { SourceWithPool, SourceSync } from "silentium";
31
+ import { Loading } from 'silentium-components';
32
+
33
+ const loadingStartSource = new SourceWithPool();
34
+ const loadingFinishSource = new SourceWithPool();
35
+ const loading = new SourceSync(
36
+ new Loading(loadingStartSource, loadingFinishSource),
37
+ );
38
+ const values = [];
39
+ loadingStartSource.give({});
40
+ values.push(loading.syncValue());
41
+ loadingFinishSource.give({});
42
+ values.push(loading.syncValue());
43
+
44
+ document.querySelector(".guest-result").textContent = JSON.stringify(values);
45
+ </code></pre>
46
+
47
+ <p class="text-gray-600 text-lg mb-0 font-bold">Результат 1.</p>
48
+ <div class="example mb-4">
49
+ <span class="guest-result">JS не отработал</span>
50
+ </div>
51
+ <script type="module">
52
+ import { SourceWithPool, SourceSync } from "silentium";
53
+ import { Loading } from 'silentium-components';
54
+
55
+ const loadingStartSource = new SourceWithPool();
56
+ const loadingFinishSource = new SourceWithPool();
57
+ const loading = new SourceSync(
58
+ new Loading(loadingStartSource, loadingFinishSource),
59
+ );
60
+ const values = [];
61
+ loadingStartSource.give({});
62
+ values.push(loading.syncValue());
63
+ loadingFinishSource.give({});
64
+ values.push(loading.syncValue());
65
+
66
+ document.querySelector(".guest-result").textContent = JSON.stringify(values);
67
+ </script>
@@ -9,4 +9,9 @@
9
9
  <div class="card-content bottom-1">Коллекция готовых поведений общего назначения</div>
10
10
  <a class="dynamic-navigation top-auto link" href="/behaviors">Посмотреть</a>
11
11
  </div>
12
+ <div class="card">
13
+ <div class="card-title bottom-2">Structures</div>
14
+ <div class="card-content bottom-1">Коллекция структур полезных для переиспользования</div>
15
+ <a class="dynamic-navigation top-auto link" href="/structures">Посмотреть</a>
16
+ </div>
12
17
  </div>
@@ -0,0 +1,49 @@
1
+ <a href="https://github.com/silentium-lab/silentium-components/blob/main/src/structures/HashTable.ts" target="_blank"
2
+ class="text-regular inline-flex gap-1 items-center bg-gray-100 border-0 py-1 px-3 focus:outline-none hover:bg-gray-200 rounded text-base mt-4 md:mt-0 mb-4">
3
+ <img src="./assets/img/github_16.jpg" width="16" height="16" />
4
+ HashTable на GitHub
5
+ </a>
6
+
7
+ <h2 class="font-medium title-font text-gray-900 text-lg mb-2">
8
+ <span> HashTable </span>
9
+ </h2>
10
+
11
+ <a href="https://en.wikipedia.org/wiki/Hash_table" class="link mb-2 block">Hash Table на Wiki</a>
12
+
13
+ <p class="text-gray-600 text-lg mb-4">
14
+ Бывают ситуации когда нужно собрать множество значений по ключу в одной структуре
15
+ в виде хэш-таблицы с быстрым доступом к значениям. Для этого можно использовать класс
16
+ HashTable
17
+ </p>
18
+
19
+ <p class="text-gray-600 text-lg mb-0 font-bold">Пример 1.</p>
20
+ <pre
21
+ class="mb-4"
22
+ ><code class="language-js">import { SourceWithPool, SourceSync } from "silentium";
23
+ import { HashTable } from 'silentium-components';
24
+
25
+ const entrySource = new SourceWithPool();
26
+ const hashTable = new SourceSync(new HashTable(entrySource));
27
+ entrySource.give(["key-one", "value-one"]);
28
+ entrySource.give(["key-two", "value-two"]);
29
+
30
+ hashTable.value(console.log);
31
+ document.querySelector(".guest-result").textContent = JSON.stringify(hashTable.syncValue());
32
+ </code></pre>
33
+
34
+ <p class="text-gray-600 text-lg mb-0 font-bold">Результат 1.</p>
35
+ <div class="example mb-4">
36
+ <span class="guest-result">Значение установится синхронно!</span>
37
+ </div>
38
+ <script type="module">
39
+ import { SourceWithPool, SourceSync } from "silentium";
40
+ import { HashTable } from 'silentium-components';
41
+
42
+ const entrySource = new SourceWithPool();
43
+ const hashTable = new SourceSync(new HashTable(entrySource));
44
+ entrySource.give(["key-one", "value-one"]);
45
+ entrySource.give(["key-two", "value-two"]);
46
+
47
+ hashTable.value(console.log);
48
+ document.querySelector(".guest-result").textContent = JSON.stringify(hashTable.syncValue());
49
+ </script>
@@ -0,0 +1,7 @@
1
+ <div class="grid grid-3 gap-3">
2
+ <div class="card">
3
+ <div class="card-title bottom-2">HashTable</div>
4
+ <div class="card-content bottom-1">Хэш таблица, заполняющаяся из отдельного источника</div>
5
+ <a class="dynamic-navigation top-auto link" href="/structures/hash-table">Посмотреть</a>
6
+ </div>
7
+ </div>