diff --git a/changelog.md b/changelog.md new file mode 100644 index 0000000..3e8ff10 --- /dev/null +++ b/changelog.md @@ -0,0 +1,16 @@ +# Changelog + +## 2024-09-29 - 1.1.0 - feat(web) +Implement view container and update elements + +- Add IdpViewcontainer element for managing views +- Update idp-welcome element to load IdpLogincontainer element +- Rename wg-loginprompt and wg-logincontainer to idp-login and idp-logincontainer +- Fix CSS styling and references in elements +- Re-add idp-registration-stepper element + +## 2024-09-29 - 1.0.0 - Initial Release +Project initialization and initial documentation setup. + +- Added README +- Initial project setup diff --git a/package.json b/package.json index ac10771..6999de2 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,8 @@ "@push.rocks/websetup": "^3.0.15", "@push.rocks/webstore": "^2.0.20", "@serve.zone/platformclient": "^1.0.6", - "@tsclass/tsclass": "^4.1.2" + "@tsclass/tsclass": "^4.1.2", + "@uptime.link/webwidget": "^1.1.2" }, "devDependencies": { "@git.zone/tsbuild": "^2.1.17", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ea12c39..91b5c9e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -98,6 +98,9 @@ importers: '@tsclass/tsclass': specifier: ^4.1.2 version: 4.1.2 + '@uptime.link/webwidget': + specifier: ^1.1.2 + version: 1.1.2 devDependencies: '@git.zone/tsbuild': specifier: ^2.1.17 @@ -1343,6 +1346,9 @@ packages: '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@uptime.link/webwidget@1.1.2': + resolution: {integrity: sha512-6ssyDdl7Zk6jXglfKGMK/sKRWxz52jy1fnKRZxom6eyo0PiTWVLXxqlVqmjbfi+QnQq3dBVVsIU/q/OXm1FGIQ==} + '@webcontainer/api@1.3.0': resolution: {integrity: sha512-gnb5P7Qr7xIvOEiUUODhKG6o8i4ZpVFdoKdnggOnWYaGOTECM94PK3alTYifa9YIL304VJkH/liT+fbnKCXa+A==} @@ -5795,6 +5801,16 @@ snapshots: '@ungap/structured-clone@1.2.0': {} + '@uptime.link/webwidget@1.1.2': + dependencies: + '@design.estate/dees-catalog': 1.1.8 + '@design.estate/dees-domtools': 2.0.57 + '@design.estate/dees-element': 2.0.36 + '@design.estate/dees-wcctools': 1.0.90 + transitivePeerDependencies: + - encoding + - supports-color + '@webcontainer/api@1.3.0': {} '@yr/monotone-cubic-spline@1.0.3': {} diff --git a/ts/00_commitinfo_data.ts b/ts/00_commitinfo_data.ts index 109ff42..ffdb479 100644 --- a/ts/00_commitinfo_data.ts +++ b/ts/00_commitinfo_data.ts @@ -1,8 +1,8 @@ /** - * autocreated commitinfo by @pushrocks/commitinfo + * autocreated commitinfo by @push.rocks/commitinfo */ export const commitinfo = { name: '@idp.global/idp.global', - version: 'x.x.x', - description: 'website for lossless.com' + version: '1.1.0', + description: 'An identity provider software managing user authentications, registrations, and sessions.' } diff --git a/ts_web/00_commitinfo_data.ts b/ts_web/00_commitinfo_data.ts new file mode 100644 index 0000000..ffdb479 --- /dev/null +++ b/ts_web/00_commitinfo_data.ts @@ -0,0 +1,8 @@ +/** + * autocreated commitinfo by @push.rocks/commitinfo + */ +export const commitinfo = { + name: '@idp.global/idp.global', + version: '1.1.0', + description: 'An identity provider software managing user authentications, registrations, and sessions.' +} diff --git a/ts_web/elements/idp-logincontainer.ts b/ts_web/elements/idp-logincontainer.ts index 6518856..885129c 100644 --- a/ts_web/elements/idp-logincontainer.ts +++ b/ts_web/elements/idp-logincontainer.ts @@ -15,13 +15,13 @@ import { commitinfo } from '../../dist_ts/00_commitinfo_data.js'; declare global { interface HTMLElementTagNameMap { - 'wg-logincontainer': IdpLogincontainer; + 'idp-logincontainer': IdpLogincontainer; } } @customElement('idp-logincontainer') export class IdpLogincontainer extends DeesElement { - public static demo = () => html``; + public static demo = () => html``; @query('.loginPromptContainer') loginPromptContainer: HTMLDivElement; @@ -48,6 +48,7 @@ export class IdpLogincontainer extends DeesElement { cssManager.defaultStyles, css` :host { + font-family: 'Geist Sans'; position: absolute; width: 100%; height: 100%; @@ -118,7 +119,6 @@ export class IdpLogincontainer extends DeesElement { padding: 8px; background: ${cssManager.bdTheme('#f5f5f5', '#111')}; border-top: 1px solid ${cssManager.bdTheme('#ccc', '#222222')}; - font-family: 'Hubot Sans'; color: ${cssManager.bdTheme('#666', '#888')}; } @@ -136,7 +136,7 @@ export class IdpLogincontainer extends DeesElement { - +
Legal Info | Company Website @@ -165,7 +165,7 @@ export class IdpLogincontainer extends DeesElement { - +
Legal Info | Company Website @@ -222,7 +222,7 @@ export class IdpLogincontainer extends DeesElement { this.showComponent('loginPrompt'); } else if ((await this.receptionClient.determineLoginStatus()) && action === 'login') { await this.showComponent('transferManager'); - const wgTransferManager = this.shadowRoot.querySelector('wg-transfermanager'); + const wgTransferManager = this.shadowRoot.querySelector('idp-transfermanager'); await wgTransferManager.handleTransfer(); } else if ((await this.receptionClient.determineLoginStatus()) && action === 'manage') { this.showComponent('loginManager'); @@ -246,19 +246,19 @@ export class IdpLogincontainer extends DeesElement { ); } - const wgLogin = this.shadowRoot.querySelector('wg-loginprompt'); - const wgTransferManager = this.shadowRoot.querySelector('wg-transfermanager'); - wgLogin.appData = appData; - wgTransferManager.appData = appData; + const idpLogin = this.shadowRoot.querySelector('idp-login'); + const idpTransferManager = this.shadowRoot.querySelector('idp-transfermanager'); + idpLogin.appData = appData; + idpTransferManager.appData = appData; await this.determineNextAction(); - wgLogin.jwtObserable.subscribe({ + idpLogin.jwtObserable.subscribe({ next: async (jwtArg) => { console.log('loggedIn'); await this.receptionClient.storeJwt(jwtArg); await this.determineNextAction(); }, }); - wgLogin.dispatchJwt(); + idpLogin.dispatchJwt(); } } diff --git a/ts_web/elements/idp-loginprompt.ts b/ts_web/elements/idp-loginprompt.ts index fa48639..edd90e0 100644 --- a/ts_web/elements/idp-loginprompt.ts +++ b/ts_web/elements/idp-loginprompt.ts @@ -13,20 +13,20 @@ import { } from '@design.estate/dees-element'; // third party catalogs -import '@uptimelink/webwidget'; +import '@uptime.link/webwidget'; import '@design.estate/dees-catalog'; import { DeesForm, DeesFormSubmit, DeesInputText } from '@design.estate/dees-catalog'; declare global { interface HTMLElementTagNameMap { - 'wg-loginprompt': WgLogin; + 'idp-login': IdpLogin; } } -@customElement('wg-loginprompt') -export class WgLogin extends DeesElement { - public static demo = () => html``; +@customElement('idp-login') +export class IdpLogin extends DeesElement { + public static demo = () => html``; public static receptionUrl = 'https://reception.lossless.one/typedrequest'; @property() @@ -40,6 +40,7 @@ export class WgLogin extends DeesElement { @property({ reflect: true, + type: Object, }) appData: plugins.idpInterfaces.data.IApp; @@ -54,6 +55,7 @@ export class WgLogin extends DeesElement { cssManager.defaultStyles, css` :host { + font-family: 'Geist Sans'; display: block; color: ${cssManager.bdTheme('#333333', '#ffffff')}; } @@ -190,12 +192,12 @@ export class WgLogin extends DeesElement { const loginForm: DeesForm = this.shadowRoot.querySelector('#loginForm'); const loginRequestWithUsernameAndPassword = new domtools.TypedRequest( - WgLogin.receptionUrl, + IdpLogin.receptionUrl, 'loginWithEmailOrUsernameAndPassword' ); const loginRequestWithEmail = new domtools.TypedRequest( - WgLogin.receptionUrl, + IdpLogin.receptionUrl, 'loginWithEmail' ); @@ -241,7 +243,7 @@ export class WgLogin extends DeesElement { registrationForm.setStatus('pending', 'registering...'); const firstSignupRequest = new domtools.TypedRequest( - WgLogin.receptionUrl, + IdpLogin.receptionUrl, 'firstRegistrationRequest' ); const response = await firstSignupRequest @@ -279,7 +281,7 @@ export class WgLogin extends DeesElement { // a refreshToken binds dierctly to a session. // the refresh token is used on a continuous basis to get fresh and short-lived jwts const refreshJwt = new domtools.TypedRequest( - WgLogin.receptionUrl, + IdpLogin.receptionUrl, 'refreshJwt' ); const responseJwt = await refreshJwt.fire({ diff --git a/ts_web/elements/classes.idp-registration-stepper.ts b/ts_web/elements/idp-registration-stepper.ts similarity index 100% rename from ts_web/elements/classes.idp-registration-stepper.ts rename to ts_web/elements/idp-registration-stepper.ts diff --git a/ts_web/elements/idp-transfermanager.ts b/ts_web/elements/idp-transfermanager.ts index 011c16b..4e899b4 100644 --- a/ts_web/elements/idp-transfermanager.ts +++ b/ts_web/elements/idp-transfermanager.ts @@ -14,12 +14,12 @@ import { declare global { interface HTMLElementTagNameMap { - 'wg-transfermanager': WgTransfermanager; + 'idp-transfermanager': IdpTransfermanager; } } -@customElement('wg-transfermanager') -export class WgTransfermanager extends DeesElement { +@customElement('idp-transfermanager') +export class IdpTransfermanager extends DeesElement { public appData: plugins.idpInterfaces.data.IApp; diff --git a/ts_web/elements/idp-welcome.ts b/ts_web/elements/idp-welcome.ts index c39fa7e..f1209f9 100644 --- a/ts_web/elements/idp-welcome.ts +++ b/ts_web/elements/idp-welcome.ts @@ -1,4 +1,5 @@ import * as plugins from '../plugins.js'; +import * as elements from '../elements/index.js'; import { customElement, @@ -10,11 +11,11 @@ import { css, type TemplateResult, } from '@design.estate/dees-element'; +import type { IdpViewcontainer } from '../views/viewcontainer.js'; @customElement('idp-welcome') export class IdpWelcome extends DeesElement { - @property() - public someProperty = 'someProperty'; + viewContainer: IdpViewcontainer; constructor() { super(); @@ -25,16 +26,15 @@ export class IdpWelcome extends DeesElement { css` :host { display: block; - height: 100px; color: #fff; font-family: 'Geist Sans'; } :host([hidden]) { - font-family: 'Cal Sans'; display: none; } h1 { + font-family: 'Cal Sans'; text-align: center; letter-spacing:0.0125em; } @@ -57,17 +57,26 @@ export class IdpWelcome extends DeesElement { return html`

idp.global

+ +
+ Do you want to sign in or register? + { + this.viewContainer.loadElement(elements.IdpLogincontainer); + }}>Sign In + {}}>Register +
+ +
+ Do you want to use idp.global for your app? + {}}>Open Developer Dashboard +
+
idp.global is a Open Source identity provider for the world wide web. You can get the code if you want to improve it. { - window.location.href = 'https://code.foss.global/idp.global/idp.global'; + window.open('https://code.foss.global/idp.global/idp.global', '_blank'); }}>Get the code
-
- Do you want to sign in or register? - {}}>Sign In - {}}>Register -
`; } } diff --git a/ts_web/elements/index.ts b/ts_web/elements/index.ts new file mode 100644 index 0000000..76465b1 --- /dev/null +++ b/ts_web/elements/index.ts @@ -0,0 +1,5 @@ +export * from './idp-registration-stepper.js'; +export * from './idp-logincontainer.js'; +export * from './idp-loginprompt.js'; +export * from './idp-transfermanager.js'; +export * from './idp-welcome.js'; diff --git a/ts_web/index.ts b/ts_web/index.ts index 1b37e36..b880d99 100644 --- a/ts_web/index.ts +++ b/ts_web/index.ts @@ -2,6 +2,7 @@ import * as serviceworker from '@api.global/typedserver/web_serviceworker_client import * as domtools from '@design.estate/dees-domtools'; import { html, render } from '@design.estate/dees-element'; +import { IdpViewcontainer } from './views/index.js'; import { IdpWelcome } from './elements/idp-welcome.js'; const run = async () => { @@ -52,10 +53,15 @@ const run = async () => { --background-accent: #303f9f; } - + `; + render(mainTemplate, document.body); + const viewContainer: IdpViewcontainer = document.querySelector('idp-viewcontainer'); + viewContainer.loadElement(IdpWelcome); + + }; run(); diff --git a/ts_web/plugins.ts b/ts_web/plugins.ts index e4def94..f7d5e04 100644 --- a/ts_web/plugins.ts +++ b/ts_web/plugins.ts @@ -13,5 +13,6 @@ export { typedrequest }; // @design.estate scope import * as deesCatalog from '@design.estate/dees-catalog'; +import * as deesElement from '@design.estate/dees-element'; -export { deesCatalog }; +export { deesCatalog, deesElement }; diff --git a/ts_web/views/index.ts b/ts_web/views/index.ts new file mode 100644 index 0000000..e26e71e --- /dev/null +++ b/ts_web/views/index.ts @@ -0,0 +1 @@ +export * from './viewcontainer.js'; diff --git a/ts_web/views/viewcontainer.ts b/ts_web/views/viewcontainer.ts new file mode 100644 index 0000000..a08280e --- /dev/null +++ b/ts_web/views/viewcontainer.ts @@ -0,0 +1,77 @@ +import * as plugins from '../plugins.js'; + +import { + customElement, + DeesElement, + property, + html, + cssManager, + unsafeCSS, + css, + type TemplateResult, +} from '@design.estate/dees-element'; + +@customElement('idp-viewcontainer') +export class IdpViewcontainer extends DeesElement { + constructor() { + super(); + } + + public static styles = [ + cssManager.defaultStyles, + css` + :host { + display: block; + color: #fff; + font-family: 'Geist Sans'; + } + :host([hidden]) { + display: none; + } + .viewContainer { + min-width: 100vh; + min-height: 100vh; + } + + `, + ]; + + public render(): TemplateResult { + return html` + +
+ +
+ `; + } + + public currentElement: plugins.deesElement.DeesElement; + public async loadElement(viewElement: typeof plugins.deesElement.DeesElement) { + // Wait until the viewContainer itself is rendered + await this.updateComplete; + + // Select the viewContainer + const viewContainer = this.shadowRoot.querySelector('.viewContainer'); + + // Check if viewContainer is present + if (!viewContainer) { + throw new Error('View container not found in the rendered DOM.'); + } + + // Remove the current element if it exists + if (this.currentElement) { + viewContainer.removeChild(this.currentElement); + } + + // Create a new instance of the viewElement + const newElement = new viewElement(); + (newElement as any).viewContainer = this; + viewContainer.appendChild(newElement); + + // Wait until the new element is fully rendered + await newElement.updateComplete; + + // Set the new element as the current element + this.currentElement = newElement; + } +}