diff --git a/client/README.md b/client/README.md new file mode 100644 index 0000000..9d06e29 --- /dev/null +++ b/client/README.md @@ -0,0 +1,49 @@ +# TFE.Umbraco.AccessRestriction - Client + +De frontend van het TFE.Umbraco.AccessRestriction pakket. Gebouwd met Vite, TypeScript en Lit. + +## Installatie + +```bash +npm install +``` + +## Scripts + +| Script | Beschrijving | +|--------|-------------| +| `npm run dev` | Start de Vite dev server | +| `npm run build` | Compileert TypeScript en bouwt de productie-bundle | +| `npm run watch` | Bouwt automatisch opnieuw bij wijzigingen | +| `npm run test` | Draait de tests | +| `npm run generate:api` | Genereert de TypeScript API client vanuit de Swagger spec | + +## API Client genereren + +De bestanden in `src/api/` worden automatisch gegenereerd op basis van de Swagger specificatie van de backend. Na wijzigingen aan de backend API (endpoints, models) moet de client opnieuw gegenereerd worden. + +### Vereisten + +- De Umbraco backend moet lokaal draaien met Swagger ingeschakeld + +### Uitvoeren + +```bash +npm run generate:api +``` + +De standaard Swagger URL is `https://localhost:44394/umbraco/swagger/IPAccessRestrictionAPI/swagger.json`. Als je backend op een andere poort draait, pas de URL aan in het `generate:api` script in `package.json`. + +### Na het genereren + +Na het genereren moet je controleren of de frontend nog compileert: + +```bash +npm run build +``` + +Wijzigingen in de API (nieuwe velden, verwijderde endpoints) kunnen typefouten veroorzaken in de frontend code die handmatig opgelost moeten worden. + +## Build output + +De gebouwde bestanden worden geschreven naar `../src/wwwroot/App_Plugins/TFE.Umbraco.AccessRestriction/`. Dit is de map die Umbraco gebruikt om de backoffice extensie te laden. diff --git a/client/package-lock.json b/client/package-lock.json index daf0e42..8fc6e99 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -20,6 +20,7 @@ "@web/test-runner": "^0.18.2", "@web/test-runner-playwright": "^0.11.0", "eslint": "^9.7.0", + "openapi-typescript-codegen": "^0.29.0", "playwright": "^1.45.3", "sinon": "^18.0.0", "typescript": "^5.2.2", @@ -27,6 +28,24 @@ "vite-tsconfig-paths": "^4.3.2" } }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "11.9.3", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.9.3.tgz", + "integrity": "sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.15", + "js-yaml": "^4.1.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/philsturgeon" + } + }, "node_modules/@babel/code-frame": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", @@ -7205,6 +7224,33 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/openapi-typescript-codegen": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/openapi-typescript-codegen/-/openapi-typescript-codegen-0.29.0.tgz", + "integrity": "sha512-/wC42PkD0LGjDTEULa/XiWQbv4E9NwLjwLjsaJ/62yOsoYhwvmBR31kPttn1DzQ2OlGe5stACcF/EIkZk43M6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@apidevtools/json-schema-ref-parser": "^11.5.4", + "camelcase": "^6.3.0", + "commander": "^12.0.0", + "fs-extra": "^11.2.0", + "handlebars": "^4.7.8" + }, + "bin": { + "openapi": "bin/index.js" + } + }, + "node_modules/openapi-typescript-codegen/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", diff --git a/client/package.json b/client/package.json index e763ce8..1f36d27 100644 --- a/client/package.json +++ b/client/package.json @@ -9,7 +9,8 @@ "preview": "vite preview", "watch": "vite build --watch", "test": "web-test-runner", - "test:watch": "web-test-runner --watch" + "test:watch": "web-test-runner --watch", + "generate:api": "NODE_TLS_REJECT_UNAUTHORIZED=0 openapi --input https://localhost:44394/umbraco/swagger/IPAccessRestrictionAPI/swagger.json --output src/api --client fetch" }, "dependencies": { "@umbraco-ui/uui-button-group": "^1.8.0", @@ -24,6 +25,7 @@ "@web/test-runner": "^0.18.2", "@web/test-runner-playwright": "^0.11.0", "eslint": "^9.7.0", + "openapi-typescript-codegen": "^0.29.0", "playwright": "^1.45.3", "sinon": "^18.0.0", "typescript": "^5.2.2", diff --git a/client/src/api/index.ts b/client/src/api/index.ts index 1958fe0..1e01319 100644 --- a/client/src/api/index.ts +++ b/client/src/api/index.ts @@ -7,8 +7,6 @@ export { CancelablePromise, CancelError } from './core/CancelablePromise'; export { OpenAPI } from './core/OpenAPI'; export type { OpenAPIConfig } from './core/OpenAPI'; -export { EventMessageTypeModel } from './models/EventMessageTypeModel'; export type { IPAccessEntry } from './models/IPAccessEntry'; -export type { NotificationHeaderModel } from './models/NotificationHeaderModel'; export { V1Service } from './services/V1Service'; diff --git a/client/src/api/models/EventMessageTypeModel.ts b/client/src/api/models/EventMessageTypeModel.ts deleted file mode 100644 index 02910b3..0000000 --- a/client/src/api/models/EventMessageTypeModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do not edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -export enum EventMessageTypeModel { - DEFAULT = 'Default', - INFO = 'Info', - ERROR = 'Error', - SUCCESS = 'Success', - WARNING = 'Warning', -} diff --git a/client/src/api/models/IPAccessEntry.ts b/client/src/api/models/IPAccessEntry.ts index 9cb71e2..23e7ecf 100644 --- a/client/src/api/models/IPAccessEntry.ts +++ b/client/src/api/models/IPAccessEntry.ts @@ -3,15 +3,14 @@ /* tslint:disable */ /* eslint-disable */ export type IPAccessEntry = { - id?: string; + id: string; ip?: string | null; description?: string | null; created?: string | null; createdBy?: string | null; modified?: string | null; modifiedBy?: string | null; - isDeleted?: boolean; - isEditable?: boolean; + isDeleted: boolean; + isEditable: boolean; }; -export default IPAccessEntry; diff --git a/client/src/api/models/NotificationHeaderModel.ts b/client/src/api/models/NotificationHeaderModel.ts deleted file mode 100644 index a7c8767..0000000 --- a/client/src/api/models/NotificationHeaderModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do not edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { EventMessageTypeModel } from './EventMessageTypeModel'; -export type NotificationHeaderModel = { - message: string; - category: string; - type: EventMessageTypeModel; -}; - diff --git a/client/src/api/services/V1Service.ts b/client/src/api/services/V1Service.ts index 40b8ef7..f9a576f 100644 --- a/client/src/api/services/V1Service.ts +++ b/client/src/api/services/V1Service.ts @@ -7,112 +7,125 @@ import type { CancelablePromise } from '../core/CancelablePromise'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; export class V1Service { - /** - * @param id - * @returns void - * @throws ApiError - */ - public static deleteUmbracoApiV1IpAccessRestrictionApiDelete(id: string): CancelablePromise { - return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/api/v1/IPAccessRestrictionApi/Delete/{id}', - path: { - id: id, - }, - errors: { - 404: `Not Found`, - }, - }); - } - /** - * @returns any OK - * @throws ApiError - */ - public static getUmbracoApiV1IpAccessRestrictionApiGetAll(): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/api/v1/IPAccessRestrictionApi/GetAll', - }); - } - /** - * @returns string OK - * @throws ApiError - */ - public static getUmbracoApiV1IpAccessRestrictionApiGetAllIpAddresses(): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/api/v1/IPAccessRestrictionApi/GetAllIpAddresses', - }); - } - /** - * @param id - * @returns any OK - * @throws ApiError - */ - public static getUmbracoApiV1IpAccessRestrictionApiGetbyId(id: string): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/api/v1/IPAccessRestrictionApi/GetbyId/{id}', - path: { - id: id, - }, - errors: { - 404: `Not Found`, - }, - }); - } - /** - * @returns string OK - * @throws ApiError - */ - public static getUmbracoApiV1IpAccessRestrictionApiGetClientIp(): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/api/v1/IPAccessRestrictionApi/GetClientIP', - }); - } - /** - * @returns string OK - * @throws ApiError - */ - public static getUmbracoApiV1IpAccessRestrictionApiGetHeaderInfo(): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/api/v1/IPAccessRestrictionApi/GetHeaderInfo', - errors: { - 404: `Not Found`, - }, - }); - } - /** - * @param requestBody - * @returns any Created - * @throws ApiError - */ - public static postUmbracoApiV1IpAccessRestrictionApiSave( - requestBody?: IPAccessEntry, - ): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/api/v1/IPAccessRestrictionApi/Save', - body: requestBody, - mediaType: 'application/json', - errors: { - 400: `Bad Request`, - }, - }); - } - /** - * @returns string OK - * @throws ApiError - */ - public static getUmbracoApiV1IpAccessRestrictionApiGetInstallationInfo(): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/api/v1/IPAccessRestrictionApi/GetInstallationInfo', - errors: { - 404: `Not Found`, - }, - }); - } + /** + * @param id + * @returns boolean OK + * @throws ApiError + */ + public static deleteUmbracoApiV1IpAccessRestrictionApiDelete( + id: string, + ): CancelablePromise { + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/api/v1/IPAccessRestrictionApi/Delete/{id}', + path: { + 'id': id, + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + /** + * @returns any OK + * @throws ApiError + */ + public static getUmbracoApiV1IpAccessRestrictionApiGetAll(): CancelablePromise> { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/api/v1/IPAccessRestrictionApi/GetAll', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + /** + * @returns string OK + * @throws ApiError + */ + public static getUmbracoApiV1IpAccessRestrictionApiGetAllIpAddresses(): CancelablePromise> { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/api/v1/IPAccessRestrictionApi/GetAllIpAddresses', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + /** + * @param id + * @returns any OK + * @throws ApiError + */ + public static getUmbracoApiV1IpAccessRestrictionApiGetbyId( + id: string, + ): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/api/v1/IPAccessRestrictionApi/GetbyId/{id}', + path: { + 'id': id, + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + /** + * @returns string OK + * @throws ApiError + */ + public static getUmbracoApiV1IpAccessRestrictionApiGetClientIp(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/api/v1/IPAccessRestrictionApi/GetClientIP', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + /** + * @returns string OK + * @throws ApiError + */ + public static getUmbracoApiV1IpAccessRestrictionApiGetHeaderInfo(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/api/v1/IPAccessRestrictionApi/GetHeaderInfo', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + /** + * @returns string OK + * @throws ApiError + */ + public static getUmbracoApiV1IpAccessRestrictionApiGetInstallationInfo(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/api/v1/IPAccessRestrictionApi/GetInstallationInfo', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + /** + * @param requestBody + * @returns any OK + * @throws ApiError + */ + public static postUmbracoApiV1IpAccessRestrictionApiSave( + requestBody?: IPAccessEntry, + ): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/api/v1/IPAccessRestrictionApi/Save', + body: requestBody, + mediaType: 'application/json', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } } diff --git a/client/src/dashboards/dashboard.test.ts b/client/src/dashboards/dashboard.test.ts index 72ce647..629f529 100644 --- a/client/src/dashboards/dashboard.test.ts +++ b/client/src/dashboards/dashboard.test.ts @@ -45,6 +45,8 @@ describe('DashboardElement', () => { description: 'Home', modified: '2024-07-30 13:51:57.8630594', modifiedBy: 'Rutger', + isDeleted: false, + isEditable: true, }, { id: '58B69078-7F0E-4059-95FC-AAE24E93E764', @@ -52,6 +54,8 @@ describe('DashboardElement', () => { description: 'Office', modified: '2024-08-02', modifiedBy: 'Admin', + isDeleted: false, + isEditable: true, }, ]; diff --git a/client/src/dashboards/dashboard.ts b/client/src/dashboards/dashboard.ts index 2658306..53c86ec 100644 --- a/client/src/dashboards/dashboard.ts +++ b/client/src/dashboards/dashboard.ts @@ -3,14 +3,14 @@ import { UmbElementMixin } from '@umbraco-cms/backoffice/element-api'; import { IP_ACCESS_RESTRICTION_CONTEXT_TOKEN, IPAccessRestrictionContext } from '@context/IpAccessRestrictionContext'; import { IP_ENTRY_MODAL_TOKEN } from '@dialogs/modals/IpEntryModalToken.ts'; import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; -import IpEntry, { IPAccessEntry } from '@models/IPAccessEntry.ts'; +import { IPAccessEntry } from '@models/IPAccessEntry.ts'; @customElement('dashboard-element') export class DashboardElement extends UmbElementMixin(LitElement) { modalManagerContext?: typeof UMB_MODAL_MANAGER_CONTEXT.TYPE; context?: IPAccessRestrictionContext; - @property({ type: Array }) ipEntries?: IpEntry[]; + @property({ type: Array }) ipEntries?: IPAccessEntry[]; @property({ type: Array }) ips?: string[]; @property({ type: String }) clientIP?: string; @property({ type: String }) customHeaderInfo?: string; @@ -78,7 +78,7 @@ export class DashboardElement extends UmbElementMixin(LitElement) { return new Date(dateString).toLocaleDateString('en-US', options); } - _openModal(ipEntry?: IpEntry) { + _openModal(ipEntry?: IPAccessEntry) { this.modalManagerContext?.open(this, IP_ENTRY_MODAL_TOKEN, { data: { ipEntry, @@ -127,7 +127,7 @@ export class DashboardElement extends UmbElementMixin(LitElement) { + Add diff --git a/client/src/dialogs/modals/IpEntryModal.ts b/client/src/dialogs/modals/IpEntryModal.ts index dde2402..992b18b 100644 --- a/client/src/dialogs/modals/IpEntryModal.ts +++ b/client/src/dialogs/modals/IpEntryModal.ts @@ -65,14 +65,13 @@ export default class IpEntryModal } const ipEntry: IPAccessEntry = { + id: this.id || crypto.randomUUID(), ip: this.ip, description: this.description, + isDeleted: false, + isEditable: true, }; - if (this.id) { - ipEntry.id = this.id; - } - try { if (this.#accessRestrictionContext) { await this.#accessRestrictionContext.saveIpAccessEntry(ipEntry); diff --git a/src/Models/IPAccessEntry.cs b/src/Models/IPAccessEntry.cs index 5cb0793..54584f8 100644 --- a/src/Models/IPAccessEntry.cs +++ b/src/Models/IPAccessEntry.cs @@ -42,6 +42,7 @@ public class IPAccessEntry [JsonPropertyName("isDeleted")] public bool IsDeleted { get; set; } + [Column("IsEditable")] [JsonPropertyName("isEditable")] public bool IsEditable { get; set; } } \ No newline at end of file diff --git a/src/Repositories/IPAccessRestrictionRepository.cs b/src/Repositories/IPAccessRestrictionRepository.cs index 1824a0d..aba8489 100644 --- a/src/Repositories/IPAccessRestrictionRepository.cs +++ b/src/Repositories/IPAccessRestrictionRepository.cs @@ -196,6 +196,7 @@ public bool Save(IPAccessEntry entry) entry.CreatedBy = entry.ModifiedBy; entry.Created = entry.Modified; entry.IsDeleted = false; + entry.IsEditable = true; scope.Database.Insert(entry); } diff --git a/src/wwwroot/App_Plugins/TFE.Umbraco.AccessRestriction/index.js b/src/wwwroot/App_Plugins/TFE.Umbraco.AccessRestriction/index.js index 968bd02..2197eca 100644 --- a/src/wwwroot/App_Plugins/TFE.Umbraco.AccessRestriction/index.js +++ b/src/wwwroot/App_Plugins/TFE.Umbraco.AccessRestriction/index.js @@ -1,24 +1,24 @@ -var K = (e) => { - throw TypeError(e); +var K = (t) => { + throw TypeError(t); }; -var X = (e, t, s) => t.has(e) || K("Cannot " + s); -var i = (e, t, s) => (X(e, t, "read from private field"), s ? s.call(e) : t.get(e)), d = (e, t, s) => t.has(e) ? K("Cannot add the same private member more than once") : t instanceof WeakSet ? t.add(e) : t.set(e, s), l = (e, t, s, r) => (X(e, t, "write to private field"), r ? r.call(e, s) : t.set(e, s), s); -import { UMB_AUTH_CONTEXT as lt } from "@umbraco-cms/backoffice/auth"; -import { LitElement as Z, html as N, unsafeHTML as dt, css as tt, property as h, customElement as et, state as ut } from "@umbraco-cms/backoffice/external/lit"; -import { UmbElementMixin as st } from "@umbraco-cms/backoffice/element-api"; -import { UmbModalToken as pt, UMB_MODAL_MANAGER_CONTEXT as ht } from "@umbraco-cms/backoffice/modal"; -import { UmbControllerBase as rt } from "@umbraco-cms/backoffice/class-api"; -import { UmbContextToken as yt } from "@umbraco-cms/backoffice/context-api"; +var X = (t, e, s) => e.has(t) || K("Cannot " + s); +var i = (t, e, s) => (X(t, e, "read from private field"), s ? s.call(t) : e.get(t)), d = (t, e, s) => e.has(t) ? K("Cannot add the same private member more than once") : e instanceof WeakSet ? e.add(t) : e.set(t, s), l = (t, e, s, r) => (X(t, e, "write to private field"), r ? r.call(t, s) : e.set(t, s), s); +import { UMB_AUTH_CONTEXT as le } from "@umbraco-cms/backoffice/auth"; +import { LitElement as Z, html as k, unsafeHTML as de, css as ee, property as h, customElement as te, state as ue } from "@umbraco-cms/backoffice/external/lit"; +import { UmbElementMixin as se } from "@umbraco-cms/backoffice/element-api"; +import { UmbModalToken as pe, UMB_MODAL_MANAGER_CONTEXT as he } from "@umbraco-cms/backoffice/modal"; +import { UmbControllerBase as re } from "@umbraco-cms/backoffice/class-api"; +import { UmbContextToken as ye } from "@umbraco-cms/backoffice/context-api"; import { tryExecuteAndNotify as g } from "@umbraco-cms/backoffice/resources"; -import { UmbArrayState as Y, UmbStringState as M, UmbBooleanState as ft } from "@umbraco-cms/backoffice/observable-api"; -import { of as bt, firstValueFrom as It } from "@umbraco-cms/backoffice/external/rxjs"; -const mt = [ +import { UmbArrayState as Y, UmbStringState as H, UmbBooleanState as fe } from "@umbraco-cms/backoffice/observable-api"; +import { of as be, firstValueFrom as Ie } from "@umbraco-cms/backoffice/external/rxjs"; +const me = [ { type: "dashboard", name: "Access Restriction", alias: "TFE.Umbraco.AccessRestriction", elementName: "access-restriction", - js: () => Promise.resolve().then(() => kt), + js: () => Promise.resolve().then(() => Me), weight: -10, meta: { label: "Access Restriction", @@ -31,49 +31,49 @@ const mt = [ } ] } -], At = [...mt], gt = [ +], Ae = [...me], ge = [ { type: "modal", alias: "ip-entry-modal", name: "IP Entry Modal", - js: () => Promise.resolve().then(() => Jt) + js: () => Promise.resolve().then(() => Je) } -], Et = [...gt], vt = [ +], Ee = [...ge], ve = [ { type: "globalContext", alias: "ip-access-restriction-context", name: "IP Access Restriction Context", - js: () => Promise.resolve().then(() => Nt) + js: () => Promise.resolve().then(() => ke) } -], wt = [...vt]; +], we = [...ve]; class Q extends Error { - constructor(t, s, r) { - super(r), this.name = "ApiError", this.url = s.url, this.status = s.status, this.statusText = s.statusText, this.body = s.body, this.request = t; + constructor(e, s, r) { + super(r), this.name = "ApiError", this.url = s.url, this.status = s.status, this.statusText = s.statusText, this.body = s.body, this.request = e; } } -class Ct extends Error { - constructor(t) { - super(t), this.name = "CancelError"; +class Ce extends Error { + constructor(e) { + super(e), this.name = "CancelError"; } get isCancelled() { return !0; } } -var m, A, f, w, P, F, C; -class _t { - constructor(t) { +var m, A, f, w, T, U, C; +class _e { + constructor(e) { d(this, m); d(this, A); d(this, f); d(this, w); - d(this, P); - d(this, F); + d(this, T); + d(this, U); d(this, C); - l(this, m, !1), l(this, A, !1), l(this, f, !1), l(this, w, []), l(this, P, new Promise((s, r) => { - l(this, F, s), l(this, C, r); - const o = (c) => { - i(this, m) || i(this, A) || i(this, f) || (l(this, m, !0), i(this, F) && i(this, F).call(this, c)); - }, n = (c) => { + l(this, m, !1), l(this, A, !1), l(this, f, !1), l(this, w, []), l(this, T, new Promise((s, r) => { + l(this, U, s), l(this, C, r); + const n = (c) => { + i(this, m) || i(this, A) || i(this, f) || (l(this, m, !0), i(this, U) && i(this, U).call(this, c)); + }, o = (c) => { i(this, m) || i(this, A) || i(this, f) || (l(this, A, !0), i(this, C) && i(this, C).call(this, c)); }, a = (c) => { i(this, m) || i(this, A) || i(this, f) || i(this, w).push(c); @@ -84,39 +84,39 @@ class _t { get: () => i(this, A) }), Object.defineProperty(a, "isCancelled", { get: () => i(this, f) - }), t(o, n, a); + }), e(n, o, a); })); } get [Symbol.toStringTag]() { return "Cancellable Promise"; } - then(t, s) { - return i(this, P).then(t, s); + then(e, s) { + return i(this, T).then(e, s); } - catch(t) { - return i(this, P).catch(t); + catch(e) { + return i(this, T).catch(e); } - finally(t) { - return i(this, P).finally(t); + finally(e) { + return i(this, T).finally(e); } cancel() { if (!(i(this, m) || i(this, A) || i(this, f))) { if (l(this, f, !0), i(this, w).length) try { - for (const t of i(this, w)) - t(); - } catch (t) { - console.warn("Cancellation threw an error", t); + for (const e of i(this, w)) + e(); + } catch (e) { + console.warn("Cancellation threw an error", e); return; } - i(this, w).length = 0, i(this, C) && i(this, C).call(this, new Ct("Request aborted")); + i(this, w).length = 0, i(this, C) && i(this, C).call(this, new Ce("Request aborted")); } } get isCancelled() { return i(this, f); } } -m = new WeakMap(), A = new WeakMap(), f = new WeakMap(), w = new WeakMap(), P = new WeakMap(), F = new WeakMap(), C = new WeakMap(); +m = new WeakMap(), A = new WeakMap(), f = new WeakMap(), w = new WeakMap(), T = new WeakMap(), U = new WeakMap(), C = new WeakMap(); const y = { BASE: "", VERSION: "Latest", @@ -127,87 +127,87 @@ const y = { PASSWORD: void 0, HEADERS: void 0, ENCODE_PATH: void 0 -}, W = (e) => e != null, G = (e) => typeof e == "string", k = (e) => G(e) && e !== "", z = (e) => typeof e == "object" && typeof e.type == "string" && typeof e.stream == "function" && typeof e.arrayBuffer == "function" && typeof e.constructor == "function" && typeof e.constructor.name == "string" && /^(Blob|File)$/.test(e.constructor.name) && /^(Blob|File)$/.test(e[Symbol.toStringTag]), it = (e) => e instanceof FormData, Rt = (e) => { +}, W = (t) => t != null, G = (t) => typeof t == "string", M = (t) => G(t) && t !== "", z = (t) => typeof t == "object" && typeof t.type == "string" && typeof t.stream == "function" && typeof t.arrayBuffer == "function" && typeof t.constructor == "function" && typeof t.constructor.name == "string" && /^(Blob|File)$/.test(t.constructor.name) && /^(Blob|File)$/.test(t[Symbol.toStringTag]), ie = (t) => t instanceof FormData, Re = (t) => { try { - return btoa(e); + return btoa(t); } catch { - return Buffer.from(e).toString("base64"); - } -}, St = (e) => { - const t = [], s = (o, n) => { - t.push(`${encodeURIComponent(o)}=${encodeURIComponent(String(n))}`); - }, r = (o, n) => { - W(n) && (Array.isArray(n) ? n.forEach((a) => { - r(o, a); - }) : typeof n == "object" ? Object.entries(n).forEach(([a, c]) => { - r(`${o}[${a}]`, c); - }) : s(o, n)); + return Buffer.from(t).toString("base64"); + } +}, Se = (t) => { + const e = [], s = (n, o) => { + e.push(`${encodeURIComponent(n)}=${encodeURIComponent(String(o))}`); + }, r = (n, o) => { + W(o) && (Array.isArray(o) ? o.forEach((a) => { + r(n, a); + }) : typeof o == "object" ? Object.entries(o).forEach(([a, c]) => { + r(`${n}[${a}]`, c); + }) : s(n, o)); }; - return Object.entries(e).forEach(([o, n]) => { - r(o, n); - }), t.length > 0 ? `?${t.join("&")}` : ""; -}, Pt = (e, t) => { - const s = encodeURI, r = t.url.replace("{api-version}", e.VERSION).replace(/{(.*?)}/g, (n, a) => { + return Object.entries(t).forEach(([n, o]) => { + r(n, o); + }), e.length > 0 ? `?${e.join("&")}` : ""; +}, Te = (t, e) => { + const s = encodeURI, r = e.url.replace("{api-version}", t.VERSION).replace(/{(.*?)}/g, (o, a) => { var c; - return (c = t.path) != null && c.hasOwnProperty(a) ? s(String(t.path[a])) : n; - }), o = `${e.BASE}${r}`; - return t.query ? `${o}${St(t.query)}` : o; -}, xt = (e) => { - if (e.formData) { - const t = new FormData(), s = (r, o) => { - G(o) || z(o) ? t.append(r, o) : t.append(r, JSON.stringify(o)); + return (c = e.path) != null && c.hasOwnProperty(a) ? s(String(e.path[a])) : o; + }), n = `${t.BASE}${r}`; + return e.query ? `${n}${Se(e.query)}` : n; +}, Pe = (t) => { + if (t.formData) { + const e = new FormData(), s = (r, n) => { + G(n) || z(n) ? e.append(r, n) : e.append(r, JSON.stringify(n)); }; - return Object.entries(e.formData).filter(([r, o]) => W(o)).forEach(([r, o]) => { - Array.isArray(o) ? o.forEach((n) => s(r, n)) : s(r, o); - }), t; - } -}, B = async (e, t) => typeof t == "function" ? t(e) : t, Ot = async (e, t) => { - const [s, r, o, n] = await Promise.all([ - B(t, e.TOKEN), - B(t, e.USERNAME), - B(t, e.PASSWORD), - B(t, e.HEADERS) + return Object.entries(t.formData).filter(([r, n]) => W(n)).forEach(([r, n]) => { + Array.isArray(n) ? n.forEach((o) => s(r, o)) : s(r, n); + }), e; + } +}, N = async (t, e) => typeof e == "function" ? e(t) : e, xe = async (t, e) => { + const [s, r, n, o] = await Promise.all([ + N(e, t.TOKEN), + N(e, t.USERNAME), + N(e, t.PASSWORD), + N(e, t.HEADERS) ]), a = Object.entries({ Accept: "application/json", - ...n, - ...t.headers + ...o, + ...e.headers }).filter(([c, R]) => W(R)).reduce((c, [R, S]) => ({ ...c, [R]: String(S) }), {}); - if (k(s) && (a.Authorization = `Bearer ${s}`), k(r) && k(o)) { - const c = Rt(`${r}:${o}`); + if (M(s) && (a.Authorization = `Bearer ${s}`), M(r) && M(n)) { + const c = Re(`${r}:${n}`); a.Authorization = `Basic ${c}`; } - return t.body !== void 0 && (t.mediaType ? a["Content-Type"] = t.mediaType : z(t.body) ? a["Content-Type"] = t.body.type || "application/octet-stream" : G(t.body) ? a["Content-Type"] = "text/plain" : it(t.body) || (a["Content-Type"] = "application/json")), new Headers(a); -}, Tt = (e) => { - var t; - if (e.body !== void 0) - return (t = e.mediaType) != null && t.includes("/json") ? JSON.stringify(e.body) : G(e.body) || z(e.body) || it(e.body) ? e.body : JSON.stringify(e.body); -}, $t = async (e, t, s, r, o, n, a) => { + return e.body !== void 0 && (e.mediaType ? a["Content-Type"] = e.mediaType : z(e.body) ? a["Content-Type"] = e.body.type || "application/octet-stream" : G(e.body) ? a["Content-Type"] = "text/plain" : ie(e.body) || (a["Content-Type"] = "application/json")), new Headers(a); +}, Oe = (t) => { + var e; + if (t.body !== void 0) + return (e = t.mediaType) != null && e.includes("/json") ? JSON.stringify(t.body) : G(t.body) || z(t.body) || ie(t.body) ? t.body : JSON.stringify(t.body); +}, De = async (t, e, s, r, n, o, a) => { const c = new AbortController(), R = { - headers: n, - body: r ?? o, - method: t.method, + headers: o, + body: r ?? n, + method: e.method, signal: c.signal }; return a(() => c.abort()), await fetch(s, R); -}, Dt = (e, t) => { - if (t) { - const s = e.headers.get(t); +}, $e = (t, e) => { + if (e) { + const s = t.headers.get(e); if (G(s)) return s; } -}, Ft = async (e) => { - if (e.status !== 204) +}, Ue = async (t) => { + if (t.status !== 204) try { - const t = e.headers.get("Content-Type"); - if (t) - return ["application/json", "application/problem+json"].some((o) => t.toLowerCase().startsWith(o)) ? await e.json() : await e.text(); - } catch (t) { - console.error(t); + const e = t.headers.get("Content-Type"); + if (e) + return ["application/json", "application/problem+json"].some((n) => e.toLowerCase().startsWith(n)) ? await t.json() : await t.text(); + } catch (e) { + console.error(e); } -}, Ut = (e, t) => { +}, Fe = (t, e) => { const r = { 400: "Bad Request", 401: "Unauthorized", @@ -216,56 +216,56 @@ const y = { 500: "Internal Server Error", 502: "Bad Gateway", 503: "Service Unavailable", - ...e.errors - }[t.status]; + ...t.errors + }[e.status]; if (r) - throw new Q(e, t, r); - if (!t.ok) { - const o = t.status ?? "unknown", n = t.statusText ?? "unknown", a = (() => { + throw new Q(t, e, r); + if (!e.ok) { + const n = e.status ?? "unknown", o = e.statusText ?? "unknown", a = (() => { try { - return JSON.stringify(t.body, null, 2); + return JSON.stringify(e.body, null, 2); } catch { return; } })(); throw new Q( - e, t, - `Generic Error: status: ${o}; status text: ${n}; body: ${a}` + e, + `Generic Error: status: ${n}; status text: ${o}; body: ${a}` ); } -}, E = (e, t) => new _t(async (s, r, o) => { +}, E = (t, e) => new _e(async (s, r, n) => { try { - const n = Pt(e, t), a = xt(t), c = Tt(t), R = await Ot(e, t); - if (!o.isCancelled) { - const S = await $t(e, t, n, c, a, R, o), at = await Ft(S), ct = Dt(S, t.responseHeader), J = { - url: n, + const o = Te(t, e), a = Pe(e), c = Oe(e), R = await xe(t, e); + if (!n.isCancelled) { + const S = await De(t, e, o, c, a, R, n), ae = await Ue(S), ce = $e(S, e.responseHeader), J = { + url: o, ok: S.ok, status: S.status, statusText: S.statusText, - body: ct ?? at + body: ce ?? ae }; - Ut(t, J), s(J.body); + Fe(e, J), s(J.body); } - } catch (n) { - r(n); + } catch (o) { + r(o); } }); class v { /** * @param id - * @returns void + * @returns boolean OK * @throws ApiError */ - static deleteUmbracoApiV1IpAccessRestrictionApiDelete(t) { + static deleteUmbracoApiV1IpAccessRestrictionApiDelete(e) { return E(y, { method: "DELETE", url: "/umbraco/api/v1/IPAccessRestrictionApi/Delete/{id}", path: { - id: t + id: e }, errors: { - 404: "Not Found" + 401: "The resource is protected and requires an authentication token" } }); } @@ -276,7 +276,10 @@ class v { static getUmbracoApiV1IpAccessRestrictionApiGetAll() { return E(y, { method: "GET", - url: "/umbraco/api/v1/IPAccessRestrictionApi/GetAll" + url: "/umbraco/api/v1/IPAccessRestrictionApi/GetAll", + errors: { + 401: "The resource is protected and requires an authentication token" + } }); } /** @@ -286,7 +289,10 @@ class v { static getUmbracoApiV1IpAccessRestrictionApiGetAllIpAddresses() { return E(y, { method: "GET", - url: "/umbraco/api/v1/IPAccessRestrictionApi/GetAllIpAddresses" + url: "/umbraco/api/v1/IPAccessRestrictionApi/GetAllIpAddresses", + errors: { + 401: "The resource is protected and requires an authentication token" + } }); } /** @@ -294,15 +300,15 @@ class v { * @returns any OK * @throws ApiError */ - static getUmbracoApiV1IpAccessRestrictionApiGetbyId(t) { + static getUmbracoApiV1IpAccessRestrictionApiGetbyId(e) { return E(y, { method: "GET", url: "/umbraco/api/v1/IPAccessRestrictionApi/GetbyId/{id}", path: { - id: t + id: e }, errors: { - 404: "Not Found" + 401: "The resource is protected and requires an authentication token" } }); } @@ -313,7 +319,10 @@ class v { static getUmbracoApiV1IpAccessRestrictionApiGetClientIp() { return E(y, { method: "GET", - url: "/umbraco/api/v1/IPAccessRestrictionApi/GetClientIP" + url: "/umbraco/api/v1/IPAccessRestrictionApi/GetClientIP", + errors: { + 401: "The resource is protected and requires an authentication token" + } }); } /** @@ -325,42 +334,42 @@ class v { method: "GET", url: "/umbraco/api/v1/IPAccessRestrictionApi/GetHeaderInfo", errors: { - 404: "Not Found" + 401: "The resource is protected and requires an authentication token" } }); } /** - * @param requestBody - * @returns any Created + * @returns string OK * @throws ApiError */ - static postUmbracoApiV1IpAccessRestrictionApiSave(t) { + static getUmbracoApiV1IpAccessRestrictionApiGetInstallationInfo() { return E(y, { - method: "POST", - url: "/umbraco/api/v1/IPAccessRestrictionApi/Save", - body: t, - mediaType: "application/json", + method: "GET", + url: "/umbraco/api/v1/IPAccessRestrictionApi/GetInstallationInfo", errors: { - 400: "Bad Request" + 401: "The resource is protected and requires an authentication token" } }); } /** - * @returns string OK + * @param requestBody + * @returns any OK * @throws ApiError */ - static getUmbracoApiV1IpAccessRestrictionApiGetInstallationInfo() { + static postUmbracoApiV1IpAccessRestrictionApiSave(e) { return E(y, { - method: "GET", - url: "/umbraco/api/v1/IPAccessRestrictionApi/GetInstallationInfo", + method: "POST", + url: "/umbraco/api/v1/IPAccessRestrictionApi/Save", + body: e, + mediaType: "application/json", errors: { - 404: "Not Found" + 401: "The resource is protected and requires an authentication token" } }); } } -const oe = (e, t) => { - t.registerMany([...At, ...Et, ...wt]), e.consumeContext(lt, (s) => { +const nt = (t, e) => { + e.registerMany([...Ae, ...Ee, ...we]), t.consumeContext(le, (s) => { if (!s) return; const r = s.getOpenApiConfiguration(); @@ -368,13 +377,13 @@ const oe = (e, t) => { }); }; var u; -class jt { - constructor(t) { +class je { + constructor(e) { d(this, u); - l(this, u, t); + l(this, u, e); } - async delete(t) { - const s = v.deleteUmbracoApiV1IpAccessRestrictionApiDelete(t).then(() => !0).catch(() => !1); + async delete(e) { + const s = v.deleteUmbracoApiV1IpAccessRestrictionApiDelete(e).then(() => !0).catch(() => !1); return await g(i(this, u), s); } async getAll() { @@ -383,8 +392,8 @@ class jt { async getAllIpAddresses() { return await g(i(this, u), v.getUmbracoApiV1IpAccessRestrictionApiGetAllIpAddresses()); } - async getbyId(t) { - return await g(i(this, u), v.getUmbracoApiV1IpAccessRestrictionApiGetbyId(t)); + async getbyId(e) { + return await g(i(this, u), v.getUmbracoApiV1IpAccessRestrictionApiGetbyId(e)); } async getClientIp() { return await g(i(this, u), v.getUmbracoApiV1IpAccessRestrictionApiGetClientIp()); @@ -392,8 +401,8 @@ class jt { async getHeaderInfo() { return await g(i(this, u), v.getUmbracoApiV1IpAccessRestrictionApiGetHeaderInfo()); } - async saveIpAccessEntry(t) { - return console.log("DataSource: Saving IP Access Entry:", t), await g(i(this, u), v.postUmbracoApiV1IpAccessRestrictionApiSave(t)); + async saveIpAccessEntry(e) { + return console.log("DataSource: Saving IP Access Entry:", e), await g(i(this, u), v.postUmbracoApiV1IpAccessRestrictionApiSave(e)); } async GetInstallationInfo() { return await g(i(this, u), v.getUmbracoApiV1IpAccessRestrictionApiGetInstallationInfo()); @@ -401,11 +410,11 @@ class jt { } u = new WeakMap(); var p; -class Vt extends rt { +class Ve extends re { constructor(s) { super(s); d(this, p); - l(this, p, new jt(this)); + l(this, p, new je(this)); } async deleteIpAccessEntry(s) { return i(this, p).delete(s); @@ -433,17 +442,17 @@ class Vt extends rt { } } p = new WeakMap(); -var U, x, O, j, T, V; -class q extends rt { +var F, P, x, j, O, V; +class q extends re { constructor(s) { super(s); - d(this, U); + d(this, F); + d(this, P); d(this, x); - d(this, O); d(this, j); - d(this, T); + d(this, O); d(this, V); - l(this, U, new Y([], (r) => r.id)), this.ipEntries = i(this, U).asObservable(), l(this, x, new Y([], (r) => r)), this.ips = i(this, x).asObservable(), l(this, O, new M("")), this.clientIp = i(this, O).asObservable(), l(this, j, new M("")), this.headerInfo = i(this, j).asObservable(), l(this, T, new ft(!1)), this.isIpInList = i(this, T).asObservable(), l(this, V, new M("")), this.installationInfo = i(this, V).asObservable(), this.provideContext(H, this), this.repository = new Vt(this), this.checkIpInList(); + l(this, F, new Y([], (r) => r.id)), this.ipEntries = i(this, F).asObservable(), l(this, P, new Y([], (r) => r)), this.ips = i(this, P).asObservable(), l(this, x, new H("")), this.clientIp = i(this, x).asObservable(), l(this, j, new H("")), this.headerInfo = i(this, j).asObservable(), l(this, O, new fe(!1)), this.isIpInList = i(this, O).asObservable(), l(this, V, new H("")), this.installationInfo = i(this, V).asObservable(), this.provideContext(B, this), this.repository = new Ve(this), this.checkIpInList(); } _handleResultError(s) { if (!s && s !== "") @@ -454,8 +463,8 @@ class q extends rt { } async checkIpInList() { await this.getAllIpAddresses(), await this.getClientIp(); - let s = i(this, x).getValue(), r = i(this, O).getValue(); - s && r ? i(this, T).setValue(s.includes(r)) : (console.error("Your IP address is not on the list"), i(this, T).setValue(!1)); + let s = i(this, P).getValue(), r = i(this, x).getValue(); + s && r ? i(this, O).setValue(s.includes(r)) : (console.error("Your IP address is not on the list"), i(this, O).setValue(!1)); } async deleteIpAccessEntry(s) { try { @@ -468,7 +477,7 @@ class q extends rt { async getAllIpAccessEntries() { try { const s = await this.repository.getAllIpAccessEntries(), r = this._handleResultError(s); - i(this, U).setValue(r); + i(this, F).setValue(r); } catch (s) { console.error("Error in getAllIpAccessEntries:", s); } @@ -476,7 +485,7 @@ class q extends rt { async getAllIpAddresses() { try { const s = await this.repository.getAllIpAddresses(), r = this._handleResultError(s); - i(this, x).setValue(r); + i(this, P).setValue(r); } catch (s) { console.error("Error in getAllIpAddresses:", s); } @@ -493,7 +502,7 @@ class q extends rt { async getClientIp() { try { const s = await this.repository.getClientIp(), r = this._handleResultError(s); - i(this, O).setValue(r); + i(this, x).setValue(r); } catch (s) { console.error("Error in getClientIp", s); } @@ -523,80 +532,80 @@ class q extends rt { } } } -U = new WeakMap(), x = new WeakMap(), O = new WeakMap(), j = new WeakMap(), T = new WeakMap(), V = new WeakMap(); -const H = new yt( +F = new WeakMap(), P = new WeakMap(), x = new WeakMap(), j = new WeakMap(), O = new WeakMap(), V = new WeakMap(); +const B = new ye( q.name -), Nt = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ +), ke = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, IPAccessRestrictionContext: q, - IP_ACCESS_RESTRICTION_CONTEXT_TOKEN: H, + IP_ACCESS_RESTRICTION_CONTEXT_TOKEN: B, default: q -}, Symbol.toStringTag, { value: "Module" })), Gt = new pt("ip-entry-modal", { +}, Symbol.toStringTag, { value: "Module" })), Ge = new pe("ip-entry-modal", { modal: { type: "sidebar", size: "small" } }); -var Bt = Object.defineProperty, Ht = Object.getOwnPropertyDescriptor, $ = (e, t, s, r) => { - for (var o = r > 1 ? void 0 : r ? Ht(t, s) : t, n = e.length - 1, a; n >= 0; n--) - (a = e[n]) && (o = (r ? a(t, s, o) : a(o)) || o); - return r && o && Bt(t, s, o), o; +var Ne = Object.defineProperty, Be = Object.getOwnPropertyDescriptor, D = (t, e, s, r) => { + for (var n = r > 1 ? void 0 : r ? Be(e, s) : e, o = t.length - 1, a; o >= 0; o--) + (a = t[o]) && (n = (r ? a(e, s, n) : a(n)) || n); + return r && n && Ne(e, s, n), n; }; -let b = class extends st(Z) { +let b = class extends se(Z) { constructor() { - super(), this.isIpInList = !1, this.consumeContext(H, (e) => { - this.context = e, e && (this.observe(e.ipEntries, (t) => { - this.ipEntries = t; - }), this.observe(e.ips, (t) => { - this.ips = t; - }), this.observe(e.clientIp, (t) => { - this.clientIP = t; - }), this.observe(e.headerInfo, (t) => { - this.customHeaderInfo = t; - }), this.observe(e.isIpInList, (t) => { - this.isIpInList = t; - }), this.observe(e.installationInfo, (t) => { - this.installationInfo = t; + super(), this.isIpInList = !1, this.consumeContext(B, (t) => { + this.context = t, t && (this.observe(t.ipEntries, (e) => { + this.ipEntries = e; + }), this.observe(t.ips, (e) => { + this.ips = e; + }), this.observe(t.clientIp, (e) => { + this.clientIP = e; + }), this.observe(t.headerInfo, (e) => { + this.customHeaderInfo = e; + }), this.observe(t.isIpInList, (e) => { + this.isIpInList = e; + }), this.observe(t.installationInfo, (e) => { + this.installationInfo = e; })); - }), this.consumeContext(ht, (e) => { - this.modalManagerContext = e; + }), this.consumeContext(he, (t) => { + this.modalManagerContext = t; }); } connectedCallback() { super.connectedCallback(), this.context != null && (this.context.getAllIpAccessEntries(), this.context.getHeaderInfo(), this.context.checkIpInList(), this.context.getInstallationInfo()); } - _formatDate(e) { - if (!e) + _formatDate(t) { + if (!t) return ""; - const t = { + const e = { year: "numeric", month: "short", day: "numeric" }; - return new Date(e).toLocaleDateString("en-US", t); + return new Date(t).toLocaleDateString("en-US", e); } - _openModal(e) { - var t; - (t = this.modalManagerContext) == null || t.open(this, Gt, { + _openModal(t) { + var e; + (e = this.modalManagerContext) == null || e.open(this, Ge, { data: { - ipEntry: e + ipEntry: t } }); } - async _handleEditClick(e) { - var t; - if (e.id) { - const s = await ((t = this.context) == null ? void 0 : t.getIpAccessEntryById(e.id)); + async _handleEditClick(t) { + var e; + if (t.id) { + const s = await ((e = this.context) == null ? void 0 : e.getIpAccessEntryById(t.id)); this._openModal(s); } else console.error("@handleEditClick IP Address is undefined or null"); } - async _handleDeleteClick(e) { - e.id ? await this.context.deleteIpAccessEntry(e.id) : console.error("IP entry ID is undefined or null"); + async _handleDeleteClick(t) { + t.id ? await this.context.deleteIpAccessEntry(t.id) : console.error("IP entry ID is undefined or null"); } render() { - var e; - return N` + var t; + return k`
- ${dt(this.installationInfo)} + ${de(this.installationInfo)}
@@ -619,7 +628,7 @@ let b = class extends st(Z) { + Add
@@ -640,28 +649,28 @@ let b = class extends st(Z) { Actions - ${(e = this.ipEntries) == null ? void 0 : e.map( - (t) => N` + ${(t = this.ipEntries) == null ? void 0 : t.map( + (e) => k` - ${t.ip} - ${t.description} - ${this._formatDate(t.modified)} - ${t.modifiedBy} + ${e.ip} + ${e.description} + ${this._formatDate(e.modified)} + ${e.modifiedBy} Edit Delete @@ -673,7 +682,7 @@ let b = class extends st(Z) { `; } }; -b.styles = tt` +b.styles = ee` .container { padding: 30px; } @@ -683,94 +692,96 @@ b.styles = tt` align-items: center; } `; -$([ +D([ h({ type: Array }) ], b.prototype, "ipEntries", 2); -$([ +D([ h({ type: Array }) ], b.prototype, "ips", 2); -$([ +D([ h({ type: String }) ], b.prototype, "clientIP", 2); -$([ +D([ h({ type: String }) ], b.prototype, "customHeaderInfo", 2); -$([ +D([ h({ type: Boolean }) ], b.prototype, "isIpInList", 2); -$([ +D([ h({ type: String }) ], b.prototype, "installationInfo", 2); -b = $([ - et("dashboard-element") +b = D([ + te("dashboard-element") ], b); -const Mt = b, kt = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ +const He = b, Me = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, get DashboardElement() { return b; }, - default: Mt + default: He }, Symbol.toStringTag, { value: "Module" })); -var Lt = Object.defineProperty, qt = Object.getOwnPropertyDescriptor, ot = (e) => { - throw TypeError(e); -}, _ = (e, t, s, r) => { - for (var o = r > 1 ? void 0 : r ? qt(t, s) : t, n = e.length - 1, a; n >= 0; n--) - (a = e[n]) && (o = (r ? a(t, s, o) : a(o)) || o); - return r && o && Lt(t, s, o), o; -}, nt = (e, t, s) => t.has(e) || ot("Cannot " + s), L = (e, t, s) => (nt(e, t, "read from private field"), t.get(e)), Wt = (e, t, s) => t.has(e) ? ot("Cannot add the same private member more than once") : t instanceof WeakSet ? t.add(e) : t.set(e, s), zt = (e, t, s, r) => (nt(e, t, "write to private field"), t.set(e, s), s), D; -let I = class extends st(Z) { +var Le = Object.defineProperty, qe = Object.getOwnPropertyDescriptor, ne = (t) => { + throw TypeError(t); +}, _ = (t, e, s, r) => { + for (var n = r > 1 ? void 0 : r ? qe(e, s) : e, o = t.length - 1, a; o >= 0; o--) + (a = t[o]) && (n = (r ? a(e, s, n) : a(n)) || n); + return r && n && Le(e, s, n), n; +}, oe = (t, e, s) => e.has(t) || ne("Cannot " + s), L = (t, e, s) => (oe(t, e, "read from private field"), e.get(t)), We = (t, e, s) => e.has(t) ? ne("Cannot add the same private member more than once") : e instanceof WeakSet ? e.add(t) : e.set(t, s), ze = (t, e, s, r) => (oe(t, e, "write to private field"), e.set(t, s), s), $; +let I = class extends se(Z) { constructor() { - super(), Wt(this, D), this.isValid = !1, this.errors = {}, this.id = "", this.ip = "", this.description = "", this.initialIp = "", this.consumeContext(H, (e) => { - zt(this, D, e); + super(), We(this, $), this.isValid = !1, this.errors = {}, this.id = "", this.ip = "", this.description = "", this.initialIp = "", this.consumeContext(B, (t) => { + ze(this, $, t); }); } firstUpdated() { - var e, t; - if ((t = (e = this.modalContext) == null ? void 0 : e.data) != null && t.ipEntry) { - const { id: s, ip: r, description: o } = this.modalContext.data.ipEntry; - this.id = s ?? "", this.ip = r ?? "", this.description = o ?? "", this.initialIp = r ?? ""; + var t, e; + if ((e = (t = this.modalContext) == null ? void 0 : t.data) != null && e.ipEntry) { + const { id: s, ip: r, description: n } = this.modalContext.data.ipEntry; + this.id = s ?? "", this.ip = r ?? "", this.description = n ?? "", this.initialIp = r ?? ""; } else console.error("No IP Entry data found in modal context"); } _handleClose() { - var e; - (e = this.modalContext) == null || e.submit(); + var t; + (t = this.modalContext) == null || t.submit(); } - async _handleSubmit(e) { - if (e.preventDefault(), await this._validateForm(), !this.isValid) { + async _handleSubmit(t) { + if (t.preventDefault(), await this._validateForm(), !this.isValid) { console.error("Form validation failed:"); return; } - const t = { + const e = { + id: this.id || crypto.randomUUID(), ip: this.ip, - description: this.description + description: this.description, + isDeleted: !1, + isEditable: !0 }; - this.id && (t.id = this.id); try { - L(this, D) ? await L(this, D).saveIpAccessEntry(t) : console.error("Access restriction context is not available"), this._handleClose(); + L(this, $) ? await L(this, $).saveIpAccessEntry(e) : console.error("Access restriction context is not available"), this._handleClose(); } catch (s) { console.error("Failed to save IP access entry:", s); } } - _handleInputChange(e) { - let t; - ((o) => { - o.Id = "id", o.Ip = "ip", o.Description = "description"; - })(t || (t = {})); - const s = (o) => Object.values(t).includes(o), r = e.target; + _handleInputChange(t) { + let e; + ((n) => { + n.Id = "id", n.Ip = "ip", n.Description = "description"; + })(e || (e = {})); + const s = (n) => Object.values(e).includes(n), r = t.target; s(r.name) && (this[r.name] = r.value), this._validateForm(); } - _validateIp(e) { - if (!e) + _validateIp(t) { + if (!t) return !1; - const t = (e.match(/\*/g) || []).length; - return t > 0 ? !!(t === 1 && e.endsWith("*")) : /((^\s*((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\s*$)|(^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$))/.test(e); + const e = (t.match(/\*/g) || []).length; + return e > 0 ? !!(e === 1 && t.endsWith("*")) : /((^\s*((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\s*$)|(^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$))/.test(t); } - async _checkDuplicateIps(e) { - var t; + async _checkDuplicateIps(t) { + var e; try { - const s = ((t = L(this, D)) == null ? void 0 : t.ips) ?? bt(); - return (await It(s)).includes(e) && this.initialIp !== e; + const s = ((e = L(this, $)) == null ? void 0 : e.ips) ?? be(); + return (await Ie(s)).includes(t) && this.initialIp !== t; } catch (s) { return console.error("No duplicates found in ips observable, error:", s), !1; } @@ -779,7 +790,7 @@ let I = class extends st(Z) { this.errors = {}, this._validateIp(this.ip) ? await this._checkDuplicateIps(this.ip) && (this.errors.ip = "The IP Address is already whitelisted", this.requestUpdate()) : this.errors.ip = "Invalid IP", this.description || (this.errors.description = "A description is required"), this.isValid = Object.keys(this.errors).length === 0; } render() { - return N` + return k`

@@ -808,7 +819,7 @@ let I = class extends st(Z) { @input="${this._handleInputChange}" > - ${this.errors.ip ? N`

${this.errors.ip}
` : ""} + ${this.errors.ip ? k`
${this.errors.ip}
` : ""}
@@ -828,7 +839,7 @@ let I = class extends st(Z) { @input="${this._handleInputChange}" > - ${this.errors.description ? N`
${this.errors.description}
` : ""} + ${this.errors.description ? k`
${this.errors.description}
` : ""} @@ -854,8 +865,8 @@ let I = class extends st(Z) { `; } }; -D = /* @__PURE__ */ new WeakMap(); -I.styles = tt` +$ = /* @__PURE__ */ new WeakMap(); +I.styles = ee` #id { display: none; } @@ -864,7 +875,7 @@ I.styles = tt` } `; _([ - ut() + ue() ], I.prototype, "isValid", 2); _([ h({ type: Object }) @@ -885,15 +896,15 @@ _([ h({ attribute: !1 }) ], I.prototype, "modalContext", 2); I = _([ - et("ip-access-restriction-modal") + te("ip-access-restriction-modal") ], I); -const Jt = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ +const Je = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, get default() { return I; } }, Symbol.toStringTag, { value: "Module" })); export { - oe as onInit + nt as onInit }; //# sourceMappingURL=index.js.map diff --git a/src/wwwroot/App_Plugins/TFE.Umbraco.AccessRestriction/index.js.map b/src/wwwroot/App_Plugins/TFE.Umbraco.AccessRestriction/index.js.map index 7373c36..2a23af8 100644 --- a/src/wwwroot/App_Plugins/TFE.Umbraco.AccessRestriction/index.js.map +++ b/src/wwwroot/App_Plugins/TFE.Umbraco.AccessRestriction/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sources":["../../../../client/src/dashboards/manifest.ts","../../../../client/src/dialogs/modals/manifest.ts","../../../../client/src/context/manifest.ts","../../../../client/src/api/core/ApiError.ts","../../../../client/src/api/core/CancelablePromise.ts","../../../../client/src/api/core/OpenAPI.ts","../../../../client/src/api/core/request.ts","../../../../client/src/api/services/V1Service.ts","../../../../client/src/index.ts","../../../../client/src/repositories/sources/IPAccessRestrictionDataSource.ts","../../../../client/src/repositories/IPAccessRestrictionRepository.ts","../../../../client/src/context/IpAccessRestrictionContext.ts","../../../../client/src/dialogs/modals/IpEntryModalToken.ts","../../../../client/src/dashboards/dashboard.ts","../../../../client/src/dialogs/modals/IpEntryModal.ts"],"sourcesContent":["import type { ManifestDashboard } from '@umbraco-cms/backoffice/dashboard';\r\n\r\nconst dashboards: Array = [\r\n {\r\n type: 'dashboard',\r\n name: 'Access Restriction',\r\n alias: 'TFE.Umbraco.AccessRestriction',\r\n elementName: 'access-restriction',\r\n js: () => import('@dashboards/dashboard'),\r\n weight: -10,\r\n meta: {\r\n label: 'Access Restriction',\r\n pathname: 'access-restriction',\r\n },\r\n conditions: [\r\n {\r\n alias: 'Umb.Condition.SectionAlias',\r\n match: 'Umb.Section.Content',\r\n },\r\n ],\r\n },\r\n];\r\n\r\nexport const manifests = [...dashboards];\r\n","import { ManifestModal } from '@umbraco-cms/backoffice/modal';\r\n\r\nconst modals: Array = [\r\n {\r\n type: 'modal',\r\n alias: 'ip-entry-modal',\r\n name: 'IP Entry Modal',\r\n js: () => import('@dialogs/modals/IpEntryModal'),\r\n },\r\n];\r\n\r\nexport const manifests = [...modals];\r\n","import { ManifestGlobalContext } from '@umbraco-cms/backoffice/extension-registry';\r\n\r\nconst contexts: Array = [\r\n {\r\n type: 'globalContext',\r\n alias: 'ip-access-restriction-context',\r\n name: 'IP Access Restriction Context',\r\n js: () => import('@context/IpAccessRestrictionContext'),\r\n },\r\n];\r\n\r\nexport const manifests = [...contexts];\r\n","/* generated using openapi-typescript-codegen -- do not edit */\r\n/* istanbul ignore file */\r\n/* tslint:disable */\r\n/* eslint-disable */\r\nimport type { ApiRequestOptions } from './ApiRequestOptions';\r\nimport type { ApiResult } from './ApiResult';\r\n\r\nexport class ApiError extends Error {\r\n public readonly url: string;\r\n public readonly status: number;\r\n public readonly statusText: string;\r\n public readonly body: any;\r\n public readonly request: ApiRequestOptions;\r\n\r\n constructor(request: ApiRequestOptions, response: ApiResult, message: string) {\r\n super(message);\r\n\r\n this.name = 'ApiError';\r\n this.url = response.url;\r\n this.status = response.status;\r\n this.statusText = response.statusText;\r\n this.body = response.body;\r\n this.request = request;\r\n }\r\n}\r\n","/* generated using openapi-typescript-codegen -- do not edit */\r\n/* istanbul ignore file */\r\n/* tslint:disable */\r\n/* eslint-disable */\r\nexport class CancelError extends Error {\r\n\r\n constructor(message: string) {\r\n super(message);\r\n this.name = 'CancelError';\r\n }\r\n\r\n public get isCancelled(): boolean {\r\n return true;\r\n }\r\n}\r\n\r\nexport interface OnCancel {\r\n readonly isResolved: boolean;\r\n readonly isRejected: boolean;\r\n readonly isCancelled: boolean;\r\n\r\n (cancelHandler: () => void): void;\r\n}\r\n\r\nexport class CancelablePromise implements Promise {\r\n #isResolved: boolean;\r\n #isRejected: boolean;\r\n #isCancelled: boolean;\r\n readonly #cancelHandlers: (() => void)[];\r\n readonly #promise: Promise;\r\n #resolve?: (value: T | PromiseLike) => void;\r\n #reject?: (reason?: any) => void;\r\n\r\n constructor(\r\n executor: (\r\n resolve: (value: T | PromiseLike) => void,\r\n reject: (reason?: any) => void,\r\n onCancel: OnCancel\r\n ) => void\r\n ) {\r\n this.#isResolved = false;\r\n this.#isRejected = false;\r\n this.#isCancelled = false;\r\n this.#cancelHandlers = [];\r\n this.#promise = new Promise((resolve, reject) => {\r\n this.#resolve = resolve;\r\n this.#reject = reject;\r\n\r\n const onResolve = (value: T | PromiseLike): void => {\r\n if (this.#isResolved || this.#isRejected || this.#isCancelled) {\r\n return;\r\n }\r\n this.#isResolved = true;\r\n if (this.#resolve) this.#resolve(value);\r\n };\r\n\r\n const onReject = (reason?: any): void => {\r\n if (this.#isResolved || this.#isRejected || this.#isCancelled) {\r\n return;\r\n }\r\n this.#isRejected = true;\r\n if (this.#reject) this.#reject(reason);\r\n };\r\n\r\n const onCancel = (cancelHandler: () => void): void => {\r\n if (this.#isResolved || this.#isRejected || this.#isCancelled) {\r\n return;\r\n }\r\n this.#cancelHandlers.push(cancelHandler);\r\n };\r\n\r\n Object.defineProperty(onCancel, 'isResolved', {\r\n get: (): boolean => this.#isResolved,\r\n });\r\n\r\n Object.defineProperty(onCancel, 'isRejected', {\r\n get: (): boolean => this.#isRejected,\r\n });\r\n\r\n Object.defineProperty(onCancel, 'isCancelled', {\r\n get: (): boolean => this.#isCancelled,\r\n });\r\n\r\n return executor(onResolve, onReject, onCancel as OnCancel);\r\n });\r\n }\r\n\r\n get [Symbol.toStringTag]() {\r\n return \"Cancellable Promise\";\r\n }\r\n\r\n public then(\r\n onFulfilled?: ((value: T) => TResult1 | PromiseLike) | null,\r\n onRejected?: ((reason: any) => TResult2 | PromiseLike) | null\r\n ): Promise {\r\n return this.#promise.then(onFulfilled, onRejected);\r\n }\r\n\r\n public catch(\r\n onRejected?: ((reason: any) => TResult | PromiseLike) | null\r\n ): Promise {\r\n return this.#promise.catch(onRejected);\r\n }\r\n\r\n public finally(onFinally?: (() => void) | null): Promise {\r\n return this.#promise.finally(onFinally);\r\n }\r\n\r\n public cancel(): void {\r\n if (this.#isResolved || this.#isRejected || this.#isCancelled) {\r\n return;\r\n }\r\n this.#isCancelled = true;\r\n if (this.#cancelHandlers.length) {\r\n try {\r\n for (const cancelHandler of this.#cancelHandlers) {\r\n cancelHandler();\r\n }\r\n } catch (error) {\r\n console.warn('Cancellation threw an error', error);\r\n return;\r\n }\r\n }\r\n this.#cancelHandlers.length = 0;\r\n if (this.#reject) this.#reject(new CancelError('Request aborted'));\r\n }\r\n\r\n public get isCancelled(): boolean {\r\n return this.#isCancelled;\r\n }\r\n}\r\n","/* generated using openapi-typescript-codegen -- do not edit */\r\n/* istanbul ignore file */\r\n/* tslint:disable */\r\n/* eslint-disable */\r\nimport type { ApiRequestOptions } from './ApiRequestOptions';\r\n\r\ntype Resolver = (options: ApiRequestOptions) => Promise;\r\ntype Headers = Record;\r\n\r\nexport type OpenAPIConfig = {\r\n BASE: string;\r\n VERSION: string;\r\n WITH_CREDENTIALS: boolean;\r\n CREDENTIALS: 'include' | 'omit' | 'same-origin';\r\n TOKEN?: string | Resolver | undefined;\r\n USERNAME?: string | Resolver | undefined;\r\n PASSWORD?: string | Resolver | undefined;\r\n HEADERS?: Headers | Resolver | undefined;\r\n ENCODE_PATH?: ((path: string) => string) | undefined;\r\n};\r\n\r\nexport const OpenAPI: OpenAPIConfig = {\r\n BASE: '',\r\n VERSION: 'Latest',\r\n WITH_CREDENTIALS: false,\r\n CREDENTIALS: 'include',\r\n TOKEN: undefined,\r\n USERNAME: undefined,\r\n PASSWORD: undefined,\r\n HEADERS: undefined,\r\n ENCODE_PATH: undefined,\r\n};\r\n","/* generated using openapi-typescript-codegen -- do not edit */\r\n/* istanbul ignore file */\r\n/* tslint:disable */\r\n/* eslint-disable */\r\nimport { ApiError } from './ApiError';\r\nimport type { ApiRequestOptions } from './ApiRequestOptions';\r\nimport type { ApiResult } from './ApiResult';\r\nimport { CancelablePromise } from './CancelablePromise';\r\nimport type { OnCancel } from './CancelablePromise';\r\nimport type { OpenAPIConfig } from './OpenAPI';\r\n\r\nexport const isDefined = (value: T | null | undefined): value is Exclude => {\r\n return value !== undefined && value !== null;\r\n};\r\n\r\nexport const isString = (value: any): value is string => {\r\n return typeof value === 'string';\r\n};\r\n\r\nexport const isStringWithValue = (value: any): value is string => {\r\n return isString(value) && value !== '';\r\n};\r\n\r\nexport const isBlob = (value: any): value is Blob => {\r\n return (\r\n typeof value === 'object' &&\r\n typeof value.type === 'string' &&\r\n typeof value.stream === 'function' &&\r\n typeof value.arrayBuffer === 'function' &&\r\n typeof value.constructor === 'function' &&\r\n typeof value.constructor.name === 'string' &&\r\n /^(Blob|File)$/.test(value.constructor.name) &&\r\n /^(Blob|File)$/.test(value[Symbol.toStringTag])\r\n );\r\n};\r\n\r\nexport const isFormData = (value: any): value is FormData => {\r\n return value instanceof FormData;\r\n};\r\n\r\nexport const base64 = (str: string): string => {\r\n try {\r\n return btoa(str);\r\n } catch (err) {\r\n // @ts-ignore\r\n return Buffer.from(str).toString('base64');\r\n }\r\n};\r\n\r\nexport const getQueryString = (params: Record): string => {\r\n const qs: string[] = [];\r\n\r\n const append = (key: string, value: any) => {\r\n qs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`);\r\n };\r\n\r\n const process = (key: string, value: any) => {\r\n if (isDefined(value)) {\r\n if (Array.isArray(value)) {\r\n value.forEach(v => {\r\n process(key, v);\r\n });\r\n } else if (typeof value === 'object') {\r\n Object.entries(value).forEach(([k, v]) => {\r\n process(`${key}[${k}]`, v);\r\n });\r\n } else {\r\n append(key, value);\r\n }\r\n }\r\n };\r\n\r\n Object.entries(params).forEach(([key, value]) => {\r\n process(key, value);\r\n });\r\n\r\n if (qs.length > 0) {\r\n return `?${qs.join('&')}`;\r\n }\r\n\r\n return '';\r\n};\r\n\r\nconst getUrl = (config: OpenAPIConfig, options: ApiRequestOptions): string => {\r\n const encoder = config.ENCODE_PATH || encodeURI;\r\n\r\n const path = options.url\r\n .replace('{api-version}', config.VERSION)\r\n .replace(/{(.*?)}/g, (substring: string, group: string) => {\r\n if (options.path?.hasOwnProperty(group)) {\r\n return encoder(String(options.path[group]));\r\n }\r\n return substring;\r\n });\r\n\r\n const url = `${config.BASE}${path}`;\r\n if (options.query) {\r\n return `${url}${getQueryString(options.query)}`;\r\n }\r\n return url;\r\n};\r\n\r\nexport const getFormData = (options: ApiRequestOptions): FormData | undefined => {\r\n if (options.formData) {\r\n const formData = new FormData();\r\n\r\n const process = (key: string, value: any) => {\r\n if (isString(value) || isBlob(value)) {\r\n formData.append(key, value);\r\n } else {\r\n formData.append(key, JSON.stringify(value));\r\n }\r\n };\r\n\r\n Object.entries(options.formData)\r\n .filter(([_, value]) => isDefined(value))\r\n .forEach(([key, value]) => {\r\n if (Array.isArray(value)) {\r\n value.forEach(v => process(key, v));\r\n } else {\r\n process(key, value);\r\n }\r\n });\r\n\r\n return formData;\r\n }\r\n return undefined;\r\n};\r\n\r\ntype Resolver = (options: ApiRequestOptions) => Promise;\r\n\r\nexport const resolve = async (options: ApiRequestOptions, resolver?: T | Resolver): Promise => {\r\n if (typeof resolver === 'function') {\r\n return (resolver as Resolver)(options);\r\n }\r\n return resolver;\r\n};\r\n\r\nexport const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptions): Promise => {\r\n const [token, username, password, additionalHeaders] = await Promise.all([\r\n resolve(options, config.TOKEN),\r\n resolve(options, config.USERNAME),\r\n resolve(options, config.PASSWORD),\r\n resolve(options, config.HEADERS),\r\n ]);\r\n\r\n const headers = Object.entries({\r\n Accept: 'application/json',\r\n ...additionalHeaders,\r\n ...options.headers,\r\n })\r\n .filter(([_, value]) => isDefined(value))\r\n .reduce((headers, [key, value]) => ({\r\n ...headers,\r\n [key]: String(value),\r\n }), {} as Record);\r\n\r\n if (isStringWithValue(token)) {\r\n headers['Authorization'] = `Bearer ${token}`;\r\n }\r\n\r\n if (isStringWithValue(username) && isStringWithValue(password)) {\r\n const credentials = base64(`${username}:${password}`);\r\n headers['Authorization'] = `Basic ${credentials}`;\r\n }\r\n\r\n if (options.body !== undefined) {\r\n if (options.mediaType) {\r\n headers['Content-Type'] = options.mediaType;\r\n } else if (isBlob(options.body)) {\r\n headers['Content-Type'] = options.body.type || 'application/octet-stream';\r\n } else if (isString(options.body)) {\r\n headers['Content-Type'] = 'text/plain';\r\n } else if (!isFormData(options.body)) {\r\n headers['Content-Type'] = 'application/json';\r\n }\r\n }\r\n\r\n return new Headers(headers);\r\n};\r\n\r\nexport const getRequestBody = (options: ApiRequestOptions): any => {\r\n if (options.body !== undefined) {\r\n if (options.mediaType?.includes('/json')) {\r\n return JSON.stringify(options.body)\r\n } else if (isString(options.body) || isBlob(options.body) || isFormData(options.body)) {\r\n return options.body;\r\n } else {\r\n return JSON.stringify(options.body);\r\n }\r\n }\r\n return undefined;\r\n};\r\n\r\nexport const sendRequest = async (\r\n config: OpenAPIConfig,\r\n options: ApiRequestOptions,\r\n url: string,\r\n body: any,\r\n formData: FormData | undefined,\r\n headers: Headers,\r\n onCancel: OnCancel\r\n): Promise => {\r\n const controller = new AbortController();\r\n\r\n const request: RequestInit = {\r\n headers,\r\n body: body ?? formData,\r\n method: options.method,\r\n signal: controller.signal,\r\n };\r\n\r\n if (config.WITH_CREDENTIALS) {\r\n request.credentials = config.CREDENTIALS;\r\n }\r\n\r\n onCancel(() => controller.abort());\r\n\r\n return await fetch(url, request);\r\n};\r\n\r\nexport const getResponseHeader = (response: Response, responseHeader?: string): string | undefined => {\r\n if (responseHeader) {\r\n const content = response.headers.get(responseHeader);\r\n if (isString(content)) {\r\n return content;\r\n }\r\n }\r\n return undefined;\r\n};\r\n\r\nexport const getResponseBody = async (response: Response): Promise => {\r\n if (response.status !== 204) {\r\n try {\r\n const contentType = response.headers.get('Content-Type');\r\n if (contentType) {\r\n const jsonTypes = ['application/json', 'application/problem+json']\r\n const isJSON = jsonTypes.some(type => contentType.toLowerCase().startsWith(type));\r\n if (isJSON) {\r\n return await response.json();\r\n } else {\r\n return await response.text();\r\n }\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n }\r\n }\r\n return undefined;\r\n};\r\n\r\nexport const catchErrorCodes = (options: ApiRequestOptions, result: ApiResult): void => {\r\n const errors: Record = {\r\n 400: 'Bad Request',\r\n 401: 'Unauthorized',\r\n 403: 'Forbidden',\r\n 404: 'Not Found',\r\n 500: 'Internal Server Error',\r\n 502: 'Bad Gateway',\r\n 503: 'Service Unavailable',\r\n ...options.errors,\r\n }\r\n\r\n const error = errors[result.status];\r\n if (error) {\r\n throw new ApiError(options, result, error);\r\n }\r\n\r\n if (!result.ok) {\r\n const errorStatus = result.status ?? 'unknown';\r\n const errorStatusText = result.statusText ?? 'unknown';\r\n const errorBody = (() => {\r\n try {\r\n return JSON.stringify(result.body, null, 2);\r\n } catch (e) {\r\n return undefined;\r\n }\r\n })();\r\n\r\n throw new ApiError(options, result,\r\n `Generic Error: status: ${errorStatus}; status text: ${errorStatusText}; body: ${errorBody}`\r\n );\r\n }\r\n};\r\n\r\n/**\r\n * Request method\r\n * @param config The OpenAPI configuration object\r\n * @param options The request options from the service\r\n * @returns CancelablePromise\r\n * @throws ApiError\r\n */\r\nexport const request = (config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise => {\r\n return new CancelablePromise(async (resolve, reject, onCancel) => {\r\n try {\r\n const url = getUrl(config, options);\r\n const formData = getFormData(options);\r\n const body = getRequestBody(options);\r\n const headers = await getHeaders(config, options);\r\n\r\n if (!onCancel.isCancelled) {\r\n const response = await sendRequest(config, options, url, body, formData, headers, onCancel);\r\n const responseBody = await getResponseBody(response);\r\n const responseHeader = getResponseHeader(response, options.responseHeader);\r\n\r\n const result: ApiResult = {\r\n url,\r\n ok: response.ok,\r\n status: response.status,\r\n statusText: response.statusText,\r\n body: responseHeader ?? responseBody,\r\n };\r\n\r\n catchErrorCodes(options, result);\r\n\r\n resolve(result.body);\r\n }\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n};\r\n","/* generated using openapi-typescript-codegen -- do not edit */\r\n/* istanbul ignore file */\r\n/* tslint:disable */\r\n/* eslint-disable */\r\nimport type { IPAccessEntry } from '../models/IPAccessEntry';\r\nimport type { CancelablePromise } from '../core/CancelablePromise';\r\nimport { OpenAPI } from '../core/OpenAPI';\r\nimport { request as __request } from '../core/request';\r\nexport class V1Service {\r\n /**\r\n * @param id\r\n * @returns void\r\n * @throws ApiError\r\n */\r\n public static deleteUmbracoApiV1IpAccessRestrictionApiDelete(id: string): CancelablePromise {\r\n return __request(OpenAPI, {\r\n method: 'DELETE',\r\n url: '/umbraco/api/v1/IPAccessRestrictionApi/Delete/{id}',\r\n path: {\r\n id: id,\r\n },\r\n errors: {\r\n 404: `Not Found`,\r\n },\r\n });\r\n }\r\n /**\r\n * @returns any OK\r\n * @throws ApiError\r\n */\r\n public static getUmbracoApiV1IpAccessRestrictionApiGetAll(): CancelablePromise> {\r\n return __request(OpenAPI, {\r\n method: 'GET',\r\n url: '/umbraco/api/v1/IPAccessRestrictionApi/GetAll',\r\n });\r\n }\r\n /**\r\n * @returns string OK\r\n * @throws ApiError\r\n */\r\n public static getUmbracoApiV1IpAccessRestrictionApiGetAllIpAddresses(): CancelablePromise> {\r\n return __request(OpenAPI, {\r\n method: 'GET',\r\n url: '/umbraco/api/v1/IPAccessRestrictionApi/GetAllIpAddresses',\r\n });\r\n }\r\n /**\r\n * @param id\r\n * @returns any OK\r\n * @throws ApiError\r\n */\r\n public static getUmbracoApiV1IpAccessRestrictionApiGetbyId(id: string): CancelablePromise {\r\n return __request(OpenAPI, {\r\n method: 'GET',\r\n url: '/umbraco/api/v1/IPAccessRestrictionApi/GetbyId/{id}',\r\n path: {\r\n id: id,\r\n },\r\n errors: {\r\n 404: `Not Found`,\r\n },\r\n });\r\n }\r\n /**\r\n * @returns string OK\r\n * @throws ApiError\r\n */\r\n public static getUmbracoApiV1IpAccessRestrictionApiGetClientIp(): CancelablePromise {\r\n return __request(OpenAPI, {\r\n method: 'GET',\r\n url: '/umbraco/api/v1/IPAccessRestrictionApi/GetClientIP',\r\n });\r\n }\r\n /**\r\n * @returns string OK\r\n * @throws ApiError\r\n */\r\n public static getUmbracoApiV1IpAccessRestrictionApiGetHeaderInfo(): CancelablePromise {\r\n return __request(OpenAPI, {\r\n method: 'GET',\r\n url: '/umbraco/api/v1/IPAccessRestrictionApi/GetHeaderInfo',\r\n errors: {\r\n 404: `Not Found`,\r\n },\r\n });\r\n }\r\n /**\r\n * @param requestBody\r\n * @returns any Created\r\n * @throws ApiError\r\n */\r\n public static postUmbracoApiV1IpAccessRestrictionApiSave(\r\n requestBody?: IPAccessEntry,\r\n ): CancelablePromise {\r\n return __request(OpenAPI, {\r\n method: 'POST',\r\n url: '/umbraco/api/v1/IPAccessRestrictionApi/Save',\r\n body: requestBody,\r\n mediaType: 'application/json',\r\n errors: {\r\n 400: `Bad Request`,\r\n },\r\n });\r\n }\r\n /**\r\n * @returns string OK\r\n * @throws ApiError\r\n */\r\n public static getUmbracoApiV1IpAccessRestrictionApiGetInstallationInfo(): CancelablePromise {\r\n return __request(OpenAPI, {\r\n method: 'GET',\r\n url: '/umbraco/api/v1/IPAccessRestrictionApi/GetInstallationInfo',\r\n errors: {\r\n 404: `Not Found`,\r\n },\r\n });\r\n }\r\n}\r\n","import { UmbEntryPointOnInit } from '@umbraco-cms/backoffice/extension-api';\r\n\r\n// load up the manifests here.\r\nimport { manifests as dashboardManifests } from '@dashboards/manifest.ts';\r\nimport { manifests as modalManifests } from '@dialogs/modals/manifest.ts';\r\nimport { manifests as contextManifests } from '@context/manifest.ts';\r\n\r\nimport { UMB_AUTH_CONTEXT } from '@umbraco-cms/backoffice/auth';\r\nimport { OpenAPI } from '@api/index.ts';\r\n\r\nexport const onInit: UmbEntryPointOnInit = (_host, extensionRegistry) => {\r\n // register them here.\r\n extensionRegistry.registerMany([...dashboardManifests, ...modalManifests, ...contextManifests]);\r\n\r\n _host.consumeContext(UMB_AUTH_CONTEXT, (_auth) => {\r\n if (!_auth) {\r\n return;\r\n }\r\n const umbOpenApi = _auth.getOpenApiConfiguration();\r\n OpenAPI.BASE = umbOpenApi.base ?? '';\r\n OpenAPI.TOKEN = umbOpenApi.token as unknown as string ?? undefined;\r\n OpenAPI.CREDENTIALS = umbOpenApi.credentials ?? 'include';\r\n });\r\n};\r\n","import { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';\r\nimport { UmbDataSourceResponse } from '@umbraco-cms/backoffice/repository';\r\nimport { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources';\r\nimport { IPAccessEntry, V1Service } from '@api/index.ts';\r\nimport { IIPAccessRestrictionDataSource } from '@repositories/sources/IIPAccessRestrictionDataSource';\r\n\r\nexport class IPAccessRestrictionDataSource implements IIPAccessRestrictionDataSource {\r\n #host: UmbControllerHost;\r\n\r\n constructor(host: UmbControllerHost) {\r\n this.#host = host;\r\n }\r\n\r\n async delete(id: string): Promise> {\r\n const deleteOperation = V1Service.deleteUmbracoApiV1IpAccessRestrictionApiDelete(id)\r\n .then(() => true)\r\n .catch(() => false);\r\n return await tryExecuteAndNotify(this.#host, deleteOperation);\r\n }\r\n\r\n async getAll(): Promise>> {\r\n return await tryExecuteAndNotify(this.#host, V1Service.getUmbracoApiV1IpAccessRestrictionApiGetAll());\r\n }\r\n\r\n async getAllIpAddresses(): Promise>> {\r\n return await tryExecuteAndNotify(this.#host, V1Service.getUmbracoApiV1IpAccessRestrictionApiGetAllIpAddresses());\r\n }\r\n\r\n async getbyId(id: string): Promise> {\r\n return await tryExecuteAndNotify(this.#host, V1Service.getUmbracoApiV1IpAccessRestrictionApiGetbyId(id));\r\n }\r\n\r\n async getClientIp(): Promise> {\r\n return await tryExecuteAndNotify(this.#host, V1Service.getUmbracoApiV1IpAccessRestrictionApiGetClientIp());\r\n }\r\n\r\n async getHeaderInfo(): Promise> {\r\n return await tryExecuteAndNotify(this.#host, V1Service.getUmbracoApiV1IpAccessRestrictionApiGetHeaderInfo());\r\n }\r\n\r\n async saveIpAccessEntry(requestBody?: IPAccessEntry): Promise> {\r\n console.log('DataSource: Saving IP Access Entry:', requestBody);\r\n return await tryExecuteAndNotify(this.#host, V1Service.postUmbracoApiV1IpAccessRestrictionApiSave(requestBody));\r\n }\r\n\r\n async GetInstallationInfo(): Promise> {\r\n return await tryExecuteAndNotify(this.#host, V1Service.getUmbracoApiV1IpAccessRestrictionApiGetInstallationInfo());\r\n }\r\n}\r\n","import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api';\r\nimport { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';\r\nimport { IPAccessRestrictionDataSource } from '@repositories/sources/IPAccessRestrictionDataSource.ts';\r\nimport { IPAccessEntry } from '@api/index.ts';\r\n\r\nexport class IPAccessRestrictionRepository extends UmbControllerBase {\r\n #dataSource: IPAccessRestrictionDataSource;\r\n\r\n constructor(host: UmbControllerHost) {\r\n super(host);\r\n this.#dataSource = new IPAccessRestrictionDataSource(this);\r\n }\r\n\r\n async deleteIpAccessEntry(id: string) {\r\n return this.#dataSource.delete(id);\r\n }\r\n\r\n async getAllIpAccessEntries() {\r\n return this.#dataSource.getAll();\r\n }\r\n\r\n async getAllIpAddresses() {\r\n return this.#dataSource.getAllIpAddresses();\r\n }\r\n\r\n async getIpAccessEntryById(id: string) {\r\n return this.#dataSource.getbyId(id);\r\n }\r\n\r\n async getClientIp() {\r\n return this.#dataSource.getClientIp();\r\n }\r\n\r\n async getHeaderInfo() {\r\n return this.#dataSource.getHeaderInfo();\r\n }\r\n\r\n async saveIpAccessEntry(requestBody?: IPAccessEntry) {\r\n return this.#dataSource.saveIpAccessEntry(requestBody);\r\n }\r\n\r\n async GetInstallationInfo() {\r\n return this.#dataSource.GetInstallationInfo();\r\n }\r\n}\r\n","import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api';\r\nimport { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';\r\nimport { UmbContextToken } from '@umbraco-cms/backoffice/context-api';\r\nimport { IPAccessRestrictionRepository } from '@repositories/IPAccessRestrictionRepository';\r\nimport { IPAccessEntry } from '@api/models/IPAccessEntry';\r\n\r\nimport { UmbStringState, UmbArrayState, UmbBooleanState } from '@umbraco-cms/backoffice/observable-api';\r\n\r\nexport class IPAccessRestrictionContext extends UmbControllerBase {\r\n repository: IPAccessRestrictionRepository;\r\n\r\n #ipEntries = new UmbArrayState(>[], (x) => x.id);\r\n public readonly ipEntries = this.#ipEntries.asObservable();\r\n\r\n #ips = new UmbArrayState(>[], (x) => x);\r\n public readonly ips = this.#ips.asObservable();\r\n\r\n #clientIp = new UmbStringState('');\r\n public readonly clientIp = this.#clientIp.asObservable();\r\n\r\n #headerInfo = new UmbStringState('');\r\n public readonly headerInfo = this.#headerInfo.asObservable();\r\n\r\n #isIpInList = new UmbBooleanState(false);\r\n public readonly isIpInList = this.#isIpInList.asObservable();\r\n\r\n #installationInfo = new UmbStringState('');\r\n public readonly installationInfo = this.#installationInfo.asObservable();\r\n\r\n constructor(host: UmbControllerHost) {\r\n super(host);\r\n\r\n this.provideContext(IP_ACCESS_RESTRICTION_CONTEXT_TOKEN, this);\r\n this.repository = new IPAccessRestrictionRepository(this);\r\n this.checkIpInList();\r\n }\r\n\r\n _handleResultError(result: any) {\r\n if (!result && result !== \"\") {\r\n throw new Error('Received undefined data');\r\n }\r\n if (result.error) {\r\n throw new Error(result.error.message);\r\n }\r\n return result;\r\n }\r\n\r\n async checkIpInList(): Promise {\r\n await this.getAllIpAddresses();\r\n await this.getClientIp();\r\n\r\n let ips = this.#ips.getValue();\r\n let clientIp = this.#clientIp.getValue();\r\n\r\n if (ips && clientIp) {\r\n this.#isIpInList.setValue(ips.includes(clientIp));\r\n } else {\r\n console.error('Your IP address is not on the list');\r\n this.#isIpInList.setValue(false);\r\n }\r\n }\r\n\r\n async deleteIpAccessEntry(id: string) {\r\n try {\r\n const result = await this.repository.deleteIpAccessEntry(id);\r\n this._handleResultError(result);\r\n\r\n await this.getAllIpAccessEntries();\r\n await this.checkIpInList();\r\n } catch (error) {\r\n console.error('Error in deleteIpAccessEntry:', error);\r\n }\r\n }\r\n\r\n async getAllIpAccessEntries() {\r\n try {\r\n const result = await this.repository.getAllIpAccessEntries();\r\n const data = this._handleResultError(result);\r\n\r\n this.#ipEntries.setValue(data);\r\n } catch (error) {\r\n console.error('Error in getAllIpAccessEntries:', error);\r\n }\r\n }\r\n\r\n async getAllIpAddresses() {\r\n try {\r\n const result = await this.repository.getAllIpAddresses();\r\n const data = this._handleResultError(result);\r\n\r\n this.#ips.setValue(data);\r\n } catch (error) {\r\n console.error('Error in getAllIpAddresses:', error);\r\n }\r\n }\r\n\r\n async getIpAccessEntryById(id: string): Promise {\r\n try {\r\n const result = await this.repository.getIpAccessEntryById(id);\r\n\r\n return this._handleResultError(result);\r\n } catch (error) {\r\n console.error('Error in getIpAccessEntryById', error);\r\n return undefined;\r\n }\r\n }\r\n\r\n async getClientIp() {\r\n try {\r\n const result = await this.repository.getClientIp();\r\n const data = this._handleResultError(result);\r\n\r\n this.#clientIp.setValue(data);\r\n } catch (error) {\r\n console.error('Error in getClientIp', error);\r\n }\r\n }\r\n\r\n async getHeaderInfo() {\r\n try {\r\n const result = await this.repository.getHeaderInfo();\r\n const data = this._handleResultError(result);\r\n\r\n this.#headerInfo.setValue(data);\r\n } catch (error) {\r\n console.error('Error in getHeaderInfo:', error);\r\n }\r\n }\r\n\r\n async saveIpAccessEntry(entry: IPAccessEntry): Promise {\r\n try {\r\n const result = await this.repository.saveIpAccessEntry(entry);\r\n this._handleResultError(result);\r\n\r\n await this.getAllIpAccessEntries();\r\n await this.checkIpInList();\r\n } catch (error) {\r\n console.error('Error in saveIpAccessEntry:', error);\r\n console.error('Entry:', entry);\r\n }\r\n }\r\n\r\n async getInstallationInfo() {\r\n try {\r\n const result = await this.repository.GetInstallationInfo();\r\n const data = this._handleResultError(result);\r\n\r\n this.#installationInfo.setValue(data);\r\n } catch (error) {\r\n console.error('Error in getInstallationInfo:', error);\r\n }\r\n }\r\n}\r\n\r\nexport default IPAccessRestrictionContext;\r\n\r\nexport const IP_ACCESS_RESTRICTION_CONTEXT_TOKEN = new UmbContextToken(\r\n IPAccessRestrictionContext.name,\r\n);\r\n","import { UmbModalToken } from '@umbraco-cms/backoffice/modal';\r\nimport { IPAccessEntry } from '@models/IPAccessEntry';\r\n\r\nexport interface IpEntryModalData {\r\n ipEntry?: IPAccessEntry;\r\n}\r\n\r\nexport interface IpEntryModalValue {\r\n ipEntry: IPAccessEntry;\r\n}\r\n\r\nexport const IP_ENTRY_MODAL_TOKEN = new UmbModalToken('ip-entry-modal', {\r\n modal: {\r\n type: 'sidebar',\r\n size: 'small',\r\n },\r\n});\r\n","import { LitElement, css, html, customElement, property, unsafeHTML } from '@umbraco-cms/backoffice/external/lit';\r\nimport { UmbElementMixin } from '@umbraco-cms/backoffice/element-api';\r\nimport { IP_ACCESS_RESTRICTION_CONTEXT_TOKEN, IPAccessRestrictionContext } from '@context/IpAccessRestrictionContext';\r\nimport { IP_ENTRY_MODAL_TOKEN } from '@dialogs/modals/IpEntryModalToken.ts';\r\nimport { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal';\r\nimport IpEntry, { IPAccessEntry } from '@models/IPAccessEntry.ts';\r\n\r\n@customElement('dashboard-element')\r\nexport class DashboardElement extends UmbElementMixin(LitElement) {\r\n modalManagerContext?: typeof UMB_MODAL_MANAGER_CONTEXT.TYPE;\r\n context?: IPAccessRestrictionContext;\r\n\r\n @property({ type: Array }) ipEntries?: IpEntry[];\r\n @property({ type: Array }) ips?: string[];\r\n @property({ type: String }) clientIP?: string;\r\n @property({ type: String }) customHeaderInfo?: string;\r\n @property({ type: Boolean }) isIpInList = false;\r\n @property({ type: String }) installationInfo?: string;\r\n\r\n constructor() {\r\n super();\r\n this.consumeContext(IP_ACCESS_RESTRICTION_CONTEXT_TOKEN, (_instance) => {\r\n this.context = _instance;\r\n if (!_instance) {\r\n return;\r\n }\r\n\r\n this.observe(_instance.ipEntries, (_ipEntries) => {\r\n this.ipEntries = _ipEntries;\r\n });\r\n\r\n this.observe(_instance.ips, (_ips) => {\r\n this.ips = _ips;\r\n });\r\n\r\n this.observe(_instance.clientIp, (_clientIp) => {\r\n this.clientIP = _clientIp;\r\n });\r\n\r\n this.observe(_instance.headerInfo, (_headerInfo) => {\r\n this.customHeaderInfo = _headerInfo;\r\n });\r\n\r\n this.observe(_instance.isIpInList, (_isIpInList) => {\r\n this.isIpInList = _isIpInList;\r\n });\r\n\r\n this.observe(_instance.installationInfo, (_installationInfo) => {\r\n this.installationInfo = _installationInfo;\r\n });\r\n });\r\n\r\n this.consumeContext(UMB_MODAL_MANAGER_CONTEXT, (instance) => {\r\n this.modalManagerContext = instance;\r\n });\r\n }\r\n\r\n connectedCallback(): void {\r\n super.connectedCallback();\r\n\r\n if (this.context != null) {\r\n this.context.getAllIpAccessEntries();\r\n this.context.getHeaderInfo();\r\n this.context.checkIpInList();\r\n this.context.getInstallationInfo();\r\n }\r\n }\r\n\r\n private _formatDate(dateString?: string): string {\r\n if (!dateString) {\r\n return '';\r\n }\r\n const options: Intl.DateTimeFormatOptions = {\r\n year: 'numeric',\r\n month: 'short',\r\n day: 'numeric',\r\n };\r\n return new Date(dateString).toLocaleDateString('en-US', options);\r\n }\r\n\r\n _openModal(ipEntry?: IpEntry) {\r\n this.modalManagerContext?.open(this, IP_ENTRY_MODAL_TOKEN, {\r\n data: {\r\n ipEntry,\r\n },\r\n });\r\n }\r\n\r\n async _handleEditClick(ipEntry: IPAccessEntry) {\r\n if (ipEntry.id) {\r\n const ipDetails = await this.context?.getIpAccessEntryById(ipEntry.id);\r\n this._openModal(ipDetails);\r\n } else {\r\n console.error('@handleEditClick IP Address is undefined or null');\r\n }\r\n }\r\n\r\n async _handleDeleteClick(ipEntry: IPAccessEntry) {\r\n if (ipEntry.id) {\r\n await this.context!.deleteIpAccessEntry(ipEntry.id);\r\n } else {\r\n console.error('IP entry ID is undefined or null');\r\n }\r\n }\r\n\r\n render() {\r\n return html`\r\n
\r\n
\r\n + Add new IP address\r\n\r\n
\r\n \r\n ${unsafeHTML(this.installationInfo)}\r\n
\r\n\r\n
\r\n \r\n ${this.customHeaderInfo}\r\n
\r\n\r\n
\r\n \r\n Your IP address is not on the list\r\n this._openModal({ id: '', ip: this.clientIP, description: '', })}\"\r\n >+ Add\r\n
\r\n
\r\n

Whitelisted IP Addresses

\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n IP\r\n Description\r\n Modified\r\n Modified By\r\n Actions\r\n \r\n\r\n ${this.ipEntries?.map(\r\n (ipEntry) => html`\r\n \r\n ${ipEntry.ip}\r\n ${ipEntry.description}\r\n ${this._formatDate(ipEntry.modified!)}\r\n ${ipEntry.modifiedBy}\r\n \r\n this._handleEditClick(ipEntry)}\"\r\n ?disabled=\"${!ipEntry.isEditable}\"\r\n >Edit\r\n this._handleDeleteClick(ipEntry)}\"\r\n ?disabled=\"${!ipEntry.isEditable}\"\r\n >Delete\r\n \r\n \r\n `,\r\n )}\r\n \r\n
\r\n `;\r\n }\r\n public static readonly styles = css`\r\n .container {\r\n padding: 30px;\r\n }\r\n #top-bar {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n }\r\n `;\r\n}\r\n\r\nexport default DashboardElement;\r\n\r\ndeclare global {\r\n interface HTMLElementsTagNameMap {\r\n 'access-restriction': DashboardElement;\r\n }\r\n}\r\n","import { UmbElementMixin } from '@umbraco-cms/backoffice/element-api';\r\nimport { UmbModalExtensionElement } from '@umbraco-cms/backoffice/modal';\r\nimport { css, customElement, html, LitElement, property, state } from '@umbraco-cms/backoffice/external/lit';\r\nimport { IpEntryModalData, IpEntryModalValue } from '@dialogs/modals/IpEntryModalToken';\r\nimport { IP_ACCESS_RESTRICTION_CONTEXT_TOKEN, IPAccessRestrictionContext } from '@context/IpAccessRestrictionContext';\r\nimport { UmbModalContext } from '@umbraco-cms/backoffice/modal';\r\nimport { IPAccessEntry } from '@models/IPAccessEntry';\r\nimport { firstValueFrom, of } from '@umbraco-cms/backoffice/external/rxjs';\r\n\r\ninterface Errors {\r\n ip?: string;\r\n description?: string;\r\n duplicateIp?: string;\r\n}\r\n\r\n@customElement('ip-access-restriction-modal')\r\nexport default class IpEntryModal\r\n extends UmbElementMixin(LitElement)\r\n implements UmbModalExtensionElement\r\n{\r\n #accessRestrictionContext?: IPAccessRestrictionContext;\r\n\r\n @state() isValid: boolean = false;\r\n\r\n @property({ type: Object }) errors: Errors = {};\r\n @property({ type: String }) id = '';\r\n @property({ type: String }) ip = '';\r\n @property({ type: String }) description = '';\r\n @property({ attribute: false }) data?: IpEntryModalData;\r\n @property({ attribute: false })\r\n modalContext?: UmbModalContext;\r\n\r\n initialIp: string = '';\r\n\r\n constructor() {\r\n super();\r\n this.consumeContext(IP_ACCESS_RESTRICTION_CONTEXT_TOKEN, (instance) => {\r\n this.#accessRestrictionContext = instance;\r\n });\r\n }\r\n\r\n protected firstUpdated() {\r\n if (this.modalContext?.data?.ipEntry) {\r\n const { id, ip, description } = this.modalContext.data.ipEntry;\r\n this.id = id ?? '';\r\n this.ip = ip ?? '';\r\n this.description = description ?? '';\r\n this.initialIp = ip ?? '';\r\n } else {\r\n console.error('No IP Entry data found in modal context');\r\n }\r\n }\r\n\r\n private _handleClose() {\r\n this.modalContext?.submit();\r\n }\r\n\r\n private async _handleSubmit(e: Event) {\r\n e.preventDefault();\r\n await this._validateForm();\r\n\r\n if (!this.isValid) {\r\n console.error('Form validation failed:');\r\n return;\r\n }\r\n\r\n const ipEntry: IPAccessEntry = {\r\n ip: this.ip,\r\n description: this.description,\r\n };\r\n\r\n if (this.id) {\r\n ipEntry.id = this.id;\r\n }\r\n\r\n try {\r\n if (this.#accessRestrictionContext) {\r\n await this.#accessRestrictionContext.saveIpAccessEntry(ipEntry);\r\n } else {\r\n console.error('Access restriction context is not available');\r\n }\r\n this._handleClose();\r\n } catch (error) {\r\n console.error('Failed to save IP access entry:', error);\r\n }\r\n }\r\n\r\n private _handleInputChange(event: Event) {\r\n enum InputFieldNames {\r\n Id = 'id',\r\n Ip = 'ip',\r\n Description = 'description',\r\n }\r\n\r\n const isValidInputFieldName = (fieldName: any): fieldName is InputFieldNames =>\r\n Object.values(InputFieldNames).includes(fieldName as InputFieldNames);\r\n const inputElement = event.target as HTMLInputElement;\r\n\r\n if (isValidInputFieldName(inputElement.name)) {\r\n this[inputElement.name] = inputElement.value;\r\n }\r\n this._validateForm();\r\n }\r\n\r\n private _validateIp(ip: string): boolean {\r\n if (!ip) {\r\n return false;\r\n }\r\n\r\n const wildcards = (ip.match(/\\*/g) || []).length;\r\n\r\n if (wildcards > 0) {\r\n if (wildcards === 1 && ip.endsWith('*')) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n } else {\r\n const expression =\r\n /((^\\s*((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\\s*$)|(^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$))/;\r\n return expression.test(ip);\r\n }\r\n }\r\n\r\n private async _checkDuplicateIps(ip: string): Promise {\r\n try {\r\n const ipObservable = this.#accessRestrictionContext?.ips ?? of();\r\n const allIpEntries = await firstValueFrom(ipObservable);\r\n return allIpEntries.includes(ip) && this.initialIp !== ip;\r\n } catch (error) {\r\n console.error('No duplicates found in ips observable, error:', error);\r\n return false;\r\n }\r\n }\r\n\r\n private async _validateForm() {\r\n this.errors = {};\r\n if (!this._validateIp(this.ip)) {\r\n this.errors.ip = 'Invalid IP';\r\n } else if (await this._checkDuplicateIps(this.ip)) {\r\n this.errors.ip = 'The IP Address is already whitelisted';\r\n this.requestUpdate();\r\n }\r\n\r\n if (!this.description) {\r\n this.errors.description = 'A description is required';\r\n }\r\n\r\n this.isValid = Object.keys(this.errors).length === 0;\r\n }\r\n\r\n render() {\r\n return html`\r\n \r\n \r\n

\r\n A wildcard is only allowed at the end. When using a wildcard, the entry is no longer checked for a valid IP\r\n address. Example: 127.0.* or 127.0.0*\r\n

\r\n\r\n \r\n
\r\n \r\n \r\n\r\n \r\n \r\n IP\r\n \r\n
\r\n \r\n \r\n ${this.errors.ip ? html`
${this.errors.ip}
` : ''}\r\n
\r\n
\r\n\r\n \r\n \r\n Description\r\n \r\n
\r\n \r\n \r\n ${this.errors.description ? html`
${this.errors.description}
` : ''}\r\n
\r\n
\r\n\r\n \r\n Save\r\n
\r\n
\r\n
\r\n\r\n \r\n\r\n close\r\n
\r\n `;\r\n }\r\n\r\n public static readonly styles = css`\r\n #id {\r\n display: none;\r\n }\r\n .error-message {\r\n color: rgb(191, 33, 78);\r\n }\r\n `;\r\n}\r\n"],"names":["dashboards","dashboard","manifests","modals","IpEntryModal$1","contexts","IpAccessRestrictionContext","ApiError","request","response","message","CancelError","CancelablePromise","executor","__privateAdd","_isResolved","_isRejected","_isCancelled","_cancelHandlers","_promise","_resolve","_reject","__privateSet","resolve","reject","onResolve","value","__privateGet","onReject","reason","onCancel","cancelHandler","onFulfilled","onRejected","onFinally","error","OpenAPI","isDefined","isString","isStringWithValue","isBlob","isFormData","base64","str","getQueryString","params","qs","append","key","process","v","k","getUrl","config","options","encoder","path","substring","group","_a","url","getFormData","formData","_","resolver","getHeaders","token","username","password","additionalHeaders","headers","credentials","getRequestBody","sendRequest","body","controller","getResponseHeader","responseHeader","content","getResponseBody","contentType","type","catchErrorCodes","result","errorStatus","errorStatusText","errorBody","responseBody","V1Service","id","__request","requestBody","onInit","_host","extensionRegistry","dashboardManifests","modalManifests","contextManifests","UMB_AUTH_CONTEXT","_auth","umbOpenApi","IPAccessRestrictionDataSource","host","deleteOperation","tryExecuteAndNotify","IPAccessRestrictionRepository","UmbControllerBase","_dataSource","IPAccessRestrictionContext","_ipEntries","_ips","_clientIp","_headerInfo","_isIpInList","_installationInfo","UmbArrayState","x","UmbStringState","UmbBooleanState","IP_ACCESS_RESTRICTION_CONTEXT_TOKEN","ips","clientIp","data","entry","UmbContextToken","IP_ENTRY_MODAL_TOKEN","UmbModalToken","DashboardElement","UmbElementMixin","LitElement","_instance","UMB_MODAL_MANAGER_CONTEXT","instance","dateString","ipEntry","ipDetails","html","unsafeHTML","css","__decorateClass","property","customElement","DashboardElement$1","_accessRestrictionContext","IpEntryModal","_b","ip","description","event","InputFieldNames","isValidInputFieldName","fieldName","inputElement","wildcards","ipObservable","of","firstValueFrom","state"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.js","sources":["../../../../client/src/dashboards/manifest.ts","../../../../client/src/dialogs/modals/manifest.ts","../../../../client/src/context/manifest.ts","../../../../client/src/api/core/ApiError.ts","../../../../client/src/api/core/CancelablePromise.ts","../../../../client/src/api/core/OpenAPI.ts","../../../../client/src/api/core/request.ts","../../../../client/src/api/services/V1Service.ts","../../../../client/src/index.ts","../../../../client/src/repositories/sources/IPAccessRestrictionDataSource.ts","../../../../client/src/repositories/IPAccessRestrictionRepository.ts","../../../../client/src/context/IpAccessRestrictionContext.ts","../../../../client/src/dialogs/modals/IpEntryModalToken.ts","../../../../client/src/dashboards/dashboard.ts","../../../../client/src/dialogs/modals/IpEntryModal.ts"],"sourcesContent":["import type { ManifestDashboard } from '@umbraco-cms/backoffice/dashboard';\n\nconst dashboards: Array = [\n {\n type: 'dashboard',\n name: 'Access Restriction',\n alias: 'TFE.Umbraco.AccessRestriction',\n elementName: 'access-restriction',\n js: () => import('@dashboards/dashboard'),\n weight: -10,\n meta: {\n label: 'Access Restriction',\n pathname: 'access-restriction',\n },\n conditions: [\n {\n alias: 'Umb.Condition.SectionAlias',\n match: 'Umb.Section.Content',\n },\n ],\n },\n];\n\nexport const manifests = [...dashboards];\n","import { ManifestModal } from '@umbraco-cms/backoffice/modal';\n\nconst modals: Array = [\n {\n type: 'modal',\n alias: 'ip-entry-modal',\n name: 'IP Entry Modal',\n js: () => import('@dialogs/modals/IpEntryModal'),\n },\n];\n\nexport const manifests = [...modals];\n","import { ManifestGlobalContext } from '@umbraco-cms/backoffice/extension-registry';\n\nconst contexts: Array = [\n {\n type: 'globalContext',\n alias: 'ip-access-restriction-context',\n name: 'IP Access Restriction Context',\n js: () => import('@context/IpAccessRestrictionContext'),\n },\n];\n\nexport const manifests = [...contexts];\n","/* generated using openapi-typescript-codegen -- do not edit */\n/* istanbul ignore file */\n/* tslint:disable */\n/* eslint-disable */\nimport type { ApiRequestOptions } from './ApiRequestOptions';\nimport type { ApiResult } from './ApiResult';\n\nexport class ApiError extends Error {\n public readonly url: string;\n public readonly status: number;\n public readonly statusText: string;\n public readonly body: any;\n public readonly request: ApiRequestOptions;\n\n constructor(request: ApiRequestOptions, response: ApiResult, message: string) {\n super(message);\n\n this.name = 'ApiError';\n this.url = response.url;\n this.status = response.status;\n this.statusText = response.statusText;\n this.body = response.body;\n this.request = request;\n }\n}\n","/* generated using openapi-typescript-codegen -- do not edit */\n/* istanbul ignore file */\n/* tslint:disable */\n/* eslint-disable */\nexport class CancelError extends Error {\n\n constructor(message: string) {\n super(message);\n this.name = 'CancelError';\n }\n\n public get isCancelled(): boolean {\n return true;\n }\n}\n\nexport interface OnCancel {\n readonly isResolved: boolean;\n readonly isRejected: boolean;\n readonly isCancelled: boolean;\n\n (cancelHandler: () => void): void;\n}\n\nexport class CancelablePromise implements Promise {\n #isResolved: boolean;\n #isRejected: boolean;\n #isCancelled: boolean;\n readonly #cancelHandlers: (() => void)[];\n readonly #promise: Promise;\n #resolve?: (value: T | PromiseLike) => void;\n #reject?: (reason?: any) => void;\n\n constructor(\n executor: (\n resolve: (value: T | PromiseLike) => void,\n reject: (reason?: any) => void,\n onCancel: OnCancel\n ) => void\n ) {\n this.#isResolved = false;\n this.#isRejected = false;\n this.#isCancelled = false;\n this.#cancelHandlers = [];\n this.#promise = new Promise((resolve, reject) => {\n this.#resolve = resolve;\n this.#reject = reject;\n\n const onResolve = (value: T | PromiseLike): void => {\n if (this.#isResolved || this.#isRejected || this.#isCancelled) {\n return;\n }\n this.#isResolved = true;\n if (this.#resolve) this.#resolve(value);\n };\n\n const onReject = (reason?: any): void => {\n if (this.#isResolved || this.#isRejected || this.#isCancelled) {\n return;\n }\n this.#isRejected = true;\n if (this.#reject) this.#reject(reason);\n };\n\n const onCancel = (cancelHandler: () => void): void => {\n if (this.#isResolved || this.#isRejected || this.#isCancelled) {\n return;\n }\n this.#cancelHandlers.push(cancelHandler);\n };\n\n Object.defineProperty(onCancel, 'isResolved', {\n get: (): boolean => this.#isResolved,\n });\n\n Object.defineProperty(onCancel, 'isRejected', {\n get: (): boolean => this.#isRejected,\n });\n\n Object.defineProperty(onCancel, 'isCancelled', {\n get: (): boolean => this.#isCancelled,\n });\n\n return executor(onResolve, onReject, onCancel as OnCancel);\n });\n }\n\n get [Symbol.toStringTag]() {\n return \"Cancellable Promise\";\n }\n\n public then(\n onFulfilled?: ((value: T) => TResult1 | PromiseLike) | null,\n onRejected?: ((reason: any) => TResult2 | PromiseLike) | null\n ): Promise {\n return this.#promise.then(onFulfilled, onRejected);\n }\n\n public catch(\n onRejected?: ((reason: any) => TResult | PromiseLike) | null\n ): Promise {\n return this.#promise.catch(onRejected);\n }\n\n public finally(onFinally?: (() => void) | null): Promise {\n return this.#promise.finally(onFinally);\n }\n\n public cancel(): void {\n if (this.#isResolved || this.#isRejected || this.#isCancelled) {\n return;\n }\n this.#isCancelled = true;\n if (this.#cancelHandlers.length) {\n try {\n for (const cancelHandler of this.#cancelHandlers) {\n cancelHandler();\n }\n } catch (error) {\n console.warn('Cancellation threw an error', error);\n return;\n }\n }\n this.#cancelHandlers.length = 0;\n if (this.#reject) this.#reject(new CancelError('Request aborted'));\n }\n\n public get isCancelled(): boolean {\n return this.#isCancelled;\n }\n}\n","/* generated using openapi-typescript-codegen -- do not edit */\n/* istanbul ignore file */\n/* tslint:disable */\n/* eslint-disable */\nimport type { ApiRequestOptions } from './ApiRequestOptions';\n\ntype Resolver = (options: ApiRequestOptions) => Promise;\ntype Headers = Record;\n\nexport type OpenAPIConfig = {\n BASE: string;\n VERSION: string;\n WITH_CREDENTIALS: boolean;\n CREDENTIALS: 'include' | 'omit' | 'same-origin';\n TOKEN?: string | Resolver | undefined;\n USERNAME?: string | Resolver | undefined;\n PASSWORD?: string | Resolver | undefined;\n HEADERS?: Headers | Resolver | undefined;\n ENCODE_PATH?: ((path: string) => string) | undefined;\n};\n\nexport const OpenAPI: OpenAPIConfig = {\n BASE: '',\n VERSION: 'Latest',\n WITH_CREDENTIALS: false,\n CREDENTIALS: 'include',\n TOKEN: undefined,\n USERNAME: undefined,\n PASSWORD: undefined,\n HEADERS: undefined,\n ENCODE_PATH: undefined,\n};\n","/* generated using openapi-typescript-codegen -- do not edit */\n/* istanbul ignore file */\n/* tslint:disable */\n/* eslint-disable */\nimport { ApiError } from './ApiError';\nimport type { ApiRequestOptions } from './ApiRequestOptions';\nimport type { ApiResult } from './ApiResult';\nimport { CancelablePromise } from './CancelablePromise';\nimport type { OnCancel } from './CancelablePromise';\nimport type { OpenAPIConfig } from './OpenAPI';\n\nexport const isDefined = (value: T | null | undefined): value is Exclude => {\n return value !== undefined && value !== null;\n};\n\nexport const isString = (value: any): value is string => {\n return typeof value === 'string';\n};\n\nexport const isStringWithValue = (value: any): value is string => {\n return isString(value) && value !== '';\n};\n\nexport const isBlob = (value: any): value is Blob => {\n return (\n typeof value === 'object' &&\n typeof value.type === 'string' &&\n typeof value.stream === 'function' &&\n typeof value.arrayBuffer === 'function' &&\n typeof value.constructor === 'function' &&\n typeof value.constructor.name === 'string' &&\n /^(Blob|File)$/.test(value.constructor.name) &&\n /^(Blob|File)$/.test(value[Symbol.toStringTag])\n );\n};\n\nexport const isFormData = (value: any): value is FormData => {\n return value instanceof FormData;\n};\n\nexport const base64 = (str: string): string => {\n try {\n return btoa(str);\n } catch (err) {\n // @ts-ignore\n return Buffer.from(str).toString('base64');\n }\n};\n\nexport const getQueryString = (params: Record): string => {\n const qs: string[] = [];\n\n const append = (key: string, value: any) => {\n qs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`);\n };\n\n const process = (key: string, value: any) => {\n if (isDefined(value)) {\n if (Array.isArray(value)) {\n value.forEach(v => {\n process(key, v);\n });\n } else if (typeof value === 'object') {\n Object.entries(value).forEach(([k, v]) => {\n process(`${key}[${k}]`, v);\n });\n } else {\n append(key, value);\n }\n }\n };\n\n Object.entries(params).forEach(([key, value]) => {\n process(key, value);\n });\n\n if (qs.length > 0) {\n return `?${qs.join('&')}`;\n }\n\n return '';\n};\n\nconst getUrl = (config: OpenAPIConfig, options: ApiRequestOptions): string => {\n const encoder = config.ENCODE_PATH || encodeURI;\n\n const path = options.url\n .replace('{api-version}', config.VERSION)\n .replace(/{(.*?)}/g, (substring: string, group: string) => {\n if (options.path?.hasOwnProperty(group)) {\n return encoder(String(options.path[group]));\n }\n return substring;\n });\n\n const url = `${config.BASE}${path}`;\n if (options.query) {\n return `${url}${getQueryString(options.query)}`;\n }\n return url;\n};\n\nexport const getFormData = (options: ApiRequestOptions): FormData | undefined => {\n if (options.formData) {\n const formData = new FormData();\n\n const process = (key: string, value: any) => {\n if (isString(value) || isBlob(value)) {\n formData.append(key, value);\n } else {\n formData.append(key, JSON.stringify(value));\n }\n };\n\n Object.entries(options.formData)\n .filter(([_, value]) => isDefined(value))\n .forEach(([key, value]) => {\n if (Array.isArray(value)) {\n value.forEach(v => process(key, v));\n } else {\n process(key, value);\n }\n });\n\n return formData;\n }\n return undefined;\n};\n\ntype Resolver = (options: ApiRequestOptions) => Promise;\n\nexport const resolve = async (options: ApiRequestOptions, resolver?: T | Resolver): Promise => {\n if (typeof resolver === 'function') {\n return (resolver as Resolver)(options);\n }\n return resolver;\n};\n\nexport const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptions): Promise => {\n const [token, username, password, additionalHeaders] = await Promise.all([\n resolve(options, config.TOKEN),\n resolve(options, config.USERNAME),\n resolve(options, config.PASSWORD),\n resolve(options, config.HEADERS),\n ]);\n\n const headers = Object.entries({\n Accept: 'application/json',\n ...additionalHeaders,\n ...options.headers,\n })\n .filter(([_, value]) => isDefined(value))\n .reduce((headers, [key, value]) => ({\n ...headers,\n [key]: String(value),\n }), {} as Record);\n\n if (isStringWithValue(token)) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n\n if (isStringWithValue(username) && isStringWithValue(password)) {\n const credentials = base64(`${username}:${password}`);\n headers['Authorization'] = `Basic ${credentials}`;\n }\n\n if (options.body !== undefined) {\n if (options.mediaType) {\n headers['Content-Type'] = options.mediaType;\n } else if (isBlob(options.body)) {\n headers['Content-Type'] = options.body.type || 'application/octet-stream';\n } else if (isString(options.body)) {\n headers['Content-Type'] = 'text/plain';\n } else if (!isFormData(options.body)) {\n headers['Content-Type'] = 'application/json';\n }\n }\n\n return new Headers(headers);\n};\n\nexport const getRequestBody = (options: ApiRequestOptions): any => {\n if (options.body !== undefined) {\n if (options.mediaType?.includes('/json')) {\n return JSON.stringify(options.body)\n } else if (isString(options.body) || isBlob(options.body) || isFormData(options.body)) {\n return options.body;\n } else {\n return JSON.stringify(options.body);\n }\n }\n return undefined;\n};\n\nexport const sendRequest = async (\n config: OpenAPIConfig,\n options: ApiRequestOptions,\n url: string,\n body: any,\n formData: FormData | undefined,\n headers: Headers,\n onCancel: OnCancel\n): Promise => {\n const controller = new AbortController();\n\n const request: RequestInit = {\n headers,\n body: body ?? formData,\n method: options.method,\n signal: controller.signal,\n };\n\n if (config.WITH_CREDENTIALS) {\n request.credentials = config.CREDENTIALS;\n }\n\n onCancel(() => controller.abort());\n\n return await fetch(url, request);\n};\n\nexport const getResponseHeader = (response: Response, responseHeader?: string): string | undefined => {\n if (responseHeader) {\n const content = response.headers.get(responseHeader);\n if (isString(content)) {\n return content;\n }\n }\n return undefined;\n};\n\nexport const getResponseBody = async (response: Response): Promise => {\n if (response.status !== 204) {\n try {\n const contentType = response.headers.get('Content-Type');\n if (contentType) {\n const jsonTypes = ['application/json', 'application/problem+json']\n const isJSON = jsonTypes.some(type => contentType.toLowerCase().startsWith(type));\n if (isJSON) {\n return await response.json();\n } else {\n return await response.text();\n }\n }\n } catch (error) {\n console.error(error);\n }\n }\n return undefined;\n};\n\nexport const catchErrorCodes = (options: ApiRequestOptions, result: ApiResult): void => {\n const errors: Record = {\n 400: 'Bad Request',\n 401: 'Unauthorized',\n 403: 'Forbidden',\n 404: 'Not Found',\n 500: 'Internal Server Error',\n 502: 'Bad Gateway',\n 503: 'Service Unavailable',\n ...options.errors,\n }\n\n const error = errors[result.status];\n if (error) {\n throw new ApiError(options, result, error);\n }\n\n if (!result.ok) {\n const errorStatus = result.status ?? 'unknown';\n const errorStatusText = result.statusText ?? 'unknown';\n const errorBody = (() => {\n try {\n return JSON.stringify(result.body, null, 2);\n } catch (e) {\n return undefined;\n }\n })();\n\n throw new ApiError(options, result,\n `Generic Error: status: ${errorStatus}; status text: ${errorStatusText}; body: ${errorBody}`\n );\n }\n};\n\n/**\n * Request method\n * @param config The OpenAPI configuration object\n * @param options The request options from the service\n * @returns CancelablePromise\n * @throws ApiError\n */\nexport const request = (config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise => {\n return new CancelablePromise(async (resolve, reject, onCancel) => {\n try {\n const url = getUrl(config, options);\n const formData = getFormData(options);\n const body = getRequestBody(options);\n const headers = await getHeaders(config, options);\n\n if (!onCancel.isCancelled) {\n const response = await sendRequest(config, options, url, body, formData, headers, onCancel);\n const responseBody = await getResponseBody(response);\n const responseHeader = getResponseHeader(response, options.responseHeader);\n\n const result: ApiResult = {\n url,\n ok: response.ok,\n status: response.status,\n statusText: response.statusText,\n body: responseHeader ?? responseBody,\n };\n\n catchErrorCodes(options, result);\n\n resolve(result.body);\n }\n } catch (error) {\n reject(error);\n }\n });\n};\n","/* generated using openapi-typescript-codegen -- do not edit */\n/* istanbul ignore file */\n/* tslint:disable */\n/* eslint-disable */\nimport type { IPAccessEntry } from '../models/IPAccessEntry';\nimport type { CancelablePromise } from '../core/CancelablePromise';\nimport { OpenAPI } from '../core/OpenAPI';\nimport { request as __request } from '../core/request';\nexport class V1Service {\n /**\n * @param id\n * @returns boolean OK\n * @throws ApiError\n */\n public static deleteUmbracoApiV1IpAccessRestrictionApiDelete(\n id: string,\n ): CancelablePromise {\n return __request(OpenAPI, {\n method: 'DELETE',\n url: '/umbraco/api/v1/IPAccessRestrictionApi/Delete/{id}',\n path: {\n 'id': id,\n },\n errors: {\n 401: `The resource is protected and requires an authentication token`,\n },\n });\n }\n /**\n * @returns any OK\n * @throws ApiError\n */\n public static getUmbracoApiV1IpAccessRestrictionApiGetAll(): CancelablePromise> {\n return __request(OpenAPI, {\n method: 'GET',\n url: '/umbraco/api/v1/IPAccessRestrictionApi/GetAll',\n errors: {\n 401: `The resource is protected and requires an authentication token`,\n },\n });\n }\n /**\n * @returns string OK\n * @throws ApiError\n */\n public static getUmbracoApiV1IpAccessRestrictionApiGetAllIpAddresses(): CancelablePromise> {\n return __request(OpenAPI, {\n method: 'GET',\n url: '/umbraco/api/v1/IPAccessRestrictionApi/GetAllIpAddresses',\n errors: {\n 401: `The resource is protected and requires an authentication token`,\n },\n });\n }\n /**\n * @param id\n * @returns any OK\n * @throws ApiError\n */\n public static getUmbracoApiV1IpAccessRestrictionApiGetbyId(\n id: string,\n ): CancelablePromise {\n return __request(OpenAPI, {\n method: 'GET',\n url: '/umbraco/api/v1/IPAccessRestrictionApi/GetbyId/{id}',\n path: {\n 'id': id,\n },\n errors: {\n 401: `The resource is protected and requires an authentication token`,\n },\n });\n }\n /**\n * @returns string OK\n * @throws ApiError\n */\n public static getUmbracoApiV1IpAccessRestrictionApiGetClientIp(): CancelablePromise {\n return __request(OpenAPI, {\n method: 'GET',\n url: '/umbraco/api/v1/IPAccessRestrictionApi/GetClientIP',\n errors: {\n 401: `The resource is protected and requires an authentication token`,\n },\n });\n }\n /**\n * @returns string OK\n * @throws ApiError\n */\n public static getUmbracoApiV1IpAccessRestrictionApiGetHeaderInfo(): CancelablePromise {\n return __request(OpenAPI, {\n method: 'GET',\n url: '/umbraco/api/v1/IPAccessRestrictionApi/GetHeaderInfo',\n errors: {\n 401: `The resource is protected and requires an authentication token`,\n },\n });\n }\n /**\n * @returns string OK\n * @throws ApiError\n */\n public static getUmbracoApiV1IpAccessRestrictionApiGetInstallationInfo(): CancelablePromise {\n return __request(OpenAPI, {\n method: 'GET',\n url: '/umbraco/api/v1/IPAccessRestrictionApi/GetInstallationInfo',\n errors: {\n 401: `The resource is protected and requires an authentication token`,\n },\n });\n }\n /**\n * @param requestBody\n * @returns any OK\n * @throws ApiError\n */\n public static postUmbracoApiV1IpAccessRestrictionApiSave(\n requestBody?: IPAccessEntry,\n ): CancelablePromise {\n return __request(OpenAPI, {\n method: 'POST',\n url: '/umbraco/api/v1/IPAccessRestrictionApi/Save',\n body: requestBody,\n mediaType: 'application/json',\n errors: {\n 401: `The resource is protected and requires an authentication token`,\n },\n });\n }\n}\n","import { UmbEntryPointOnInit } from '@umbraco-cms/backoffice/extension-api';\n\n// load up the manifests here.\nimport { manifests as dashboardManifests } from '@dashboards/manifest.ts';\nimport { manifests as modalManifests } from '@dialogs/modals/manifest.ts';\nimport { manifests as contextManifests } from '@context/manifest.ts';\n\nimport { UMB_AUTH_CONTEXT } from '@umbraco-cms/backoffice/auth';\nimport { OpenAPI } from '@api/index.ts';\n\nexport const onInit: UmbEntryPointOnInit = (_host, extensionRegistry) => {\n // register them here.\n extensionRegistry.registerMany([...dashboardManifests, ...modalManifests, ...contextManifests]);\n\n _host.consumeContext(UMB_AUTH_CONTEXT, (_auth) => {\n if (!_auth) {\n return;\n }\n const umbOpenApi = _auth.getOpenApiConfiguration();\n OpenAPI.BASE = umbOpenApi.base ?? '';\n OpenAPI.TOKEN = umbOpenApi.token as unknown as string ?? undefined;\n OpenAPI.CREDENTIALS = umbOpenApi.credentials ?? 'include';\n });\n};\n","import { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';\nimport { UmbDataSourceResponse } from '@umbraco-cms/backoffice/repository';\nimport { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources';\nimport { IPAccessEntry, V1Service } from '@api/index.ts';\nimport { IIPAccessRestrictionDataSource } from '@repositories/sources/IIPAccessRestrictionDataSource';\n\nexport class IPAccessRestrictionDataSource implements IIPAccessRestrictionDataSource {\n #host: UmbControllerHost;\n\n constructor(host: UmbControllerHost) {\n this.#host = host;\n }\n\n async delete(id: string): Promise> {\n const deleteOperation = V1Service.deleteUmbracoApiV1IpAccessRestrictionApiDelete(id)\n .then(() => true)\n .catch(() => false);\n return await tryExecuteAndNotify(this.#host, deleteOperation);\n }\n\n async getAll(): Promise>> {\n return await tryExecuteAndNotify(this.#host, V1Service.getUmbracoApiV1IpAccessRestrictionApiGetAll());\n }\n\n async getAllIpAddresses(): Promise>> {\n return await tryExecuteAndNotify(this.#host, V1Service.getUmbracoApiV1IpAccessRestrictionApiGetAllIpAddresses());\n }\n\n async getbyId(id: string): Promise> {\n return await tryExecuteAndNotify(this.#host, V1Service.getUmbracoApiV1IpAccessRestrictionApiGetbyId(id));\n }\n\n async getClientIp(): Promise> {\n return await tryExecuteAndNotify(this.#host, V1Service.getUmbracoApiV1IpAccessRestrictionApiGetClientIp());\n }\n\n async getHeaderInfo(): Promise> {\n return await tryExecuteAndNotify(this.#host, V1Service.getUmbracoApiV1IpAccessRestrictionApiGetHeaderInfo());\n }\n\n async saveIpAccessEntry(requestBody?: IPAccessEntry): Promise> {\n console.log('DataSource: Saving IP Access Entry:', requestBody);\n return await tryExecuteAndNotify(this.#host, V1Service.postUmbracoApiV1IpAccessRestrictionApiSave(requestBody));\n }\n\n async GetInstallationInfo(): Promise> {\n return await tryExecuteAndNotify(this.#host, V1Service.getUmbracoApiV1IpAccessRestrictionApiGetInstallationInfo());\n }\n}\n","import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api';\nimport { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';\nimport { IPAccessRestrictionDataSource } from '@repositories/sources/IPAccessRestrictionDataSource.ts';\nimport { IPAccessEntry } from '@api/index.ts';\n\nexport class IPAccessRestrictionRepository extends UmbControllerBase {\n #dataSource: IPAccessRestrictionDataSource;\n\n constructor(host: UmbControllerHost) {\n super(host);\n this.#dataSource = new IPAccessRestrictionDataSource(this);\n }\n\n async deleteIpAccessEntry(id: string) {\n return this.#dataSource.delete(id);\n }\n\n async getAllIpAccessEntries() {\n return this.#dataSource.getAll();\n }\n\n async getAllIpAddresses() {\n return this.#dataSource.getAllIpAddresses();\n }\n\n async getIpAccessEntryById(id: string) {\n return this.#dataSource.getbyId(id);\n }\n\n async getClientIp() {\n return this.#dataSource.getClientIp();\n }\n\n async getHeaderInfo() {\n return this.#dataSource.getHeaderInfo();\n }\n\n async saveIpAccessEntry(requestBody?: IPAccessEntry) {\n return this.#dataSource.saveIpAccessEntry(requestBody);\n }\n\n async GetInstallationInfo() {\n return this.#dataSource.GetInstallationInfo();\n }\n}\n","import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api';\nimport { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';\nimport { UmbContextToken } from '@umbraco-cms/backoffice/context-api';\nimport { IPAccessRestrictionRepository } from '@repositories/IPAccessRestrictionRepository';\nimport { IPAccessEntry } from '@api/models/IPAccessEntry';\n\nimport { UmbStringState, UmbArrayState, UmbBooleanState } from '@umbraco-cms/backoffice/observable-api';\n\nexport class IPAccessRestrictionContext extends UmbControllerBase {\n repository: IPAccessRestrictionRepository;\n\n #ipEntries = new UmbArrayState(>[], (x) => x.id);\n public readonly ipEntries = this.#ipEntries.asObservable();\n\n #ips = new UmbArrayState(>[], (x) => x);\n public readonly ips = this.#ips.asObservable();\n\n #clientIp = new UmbStringState('');\n public readonly clientIp = this.#clientIp.asObservable();\n\n #headerInfo = new UmbStringState('');\n public readonly headerInfo = this.#headerInfo.asObservable();\n\n #isIpInList = new UmbBooleanState(false);\n public readonly isIpInList = this.#isIpInList.asObservable();\n\n #installationInfo = new UmbStringState('');\n public readonly installationInfo = this.#installationInfo.asObservable();\n\n constructor(host: UmbControllerHost) {\n super(host);\n\n this.provideContext(IP_ACCESS_RESTRICTION_CONTEXT_TOKEN, this);\n this.repository = new IPAccessRestrictionRepository(this);\n this.checkIpInList();\n }\n\n _handleResultError(result: any) {\n if (!result && result !== \"\") {\n throw new Error('Received undefined data');\n }\n if (result.error) {\n throw new Error(result.error.message);\n }\n return result;\n }\n\n async checkIpInList(): Promise {\n await this.getAllIpAddresses();\n await this.getClientIp();\n\n let ips = this.#ips.getValue();\n let clientIp = this.#clientIp.getValue();\n\n if (ips && clientIp) {\n this.#isIpInList.setValue(ips.includes(clientIp));\n } else {\n console.error('Your IP address is not on the list');\n this.#isIpInList.setValue(false);\n }\n }\n\n async deleteIpAccessEntry(id: string) {\n try {\n const result = await this.repository.deleteIpAccessEntry(id);\n this._handleResultError(result);\n\n await this.getAllIpAccessEntries();\n await this.checkIpInList();\n } catch (error) {\n console.error('Error in deleteIpAccessEntry:', error);\n }\n }\n\n async getAllIpAccessEntries() {\n try {\n const result = await this.repository.getAllIpAccessEntries();\n const data = this._handleResultError(result);\n\n this.#ipEntries.setValue(data);\n } catch (error) {\n console.error('Error in getAllIpAccessEntries:', error);\n }\n }\n\n async getAllIpAddresses() {\n try {\n const result = await this.repository.getAllIpAddresses();\n const data = this._handleResultError(result);\n\n this.#ips.setValue(data);\n } catch (error) {\n console.error('Error in getAllIpAddresses:', error);\n }\n }\n\n async getIpAccessEntryById(id: string): Promise {\n try {\n const result = await this.repository.getIpAccessEntryById(id);\n\n return this._handleResultError(result);\n } catch (error) {\n console.error('Error in getIpAccessEntryById', error);\n return undefined;\n }\n }\n\n async getClientIp() {\n try {\n const result = await this.repository.getClientIp();\n const data = this._handleResultError(result);\n\n this.#clientIp.setValue(data);\n } catch (error) {\n console.error('Error in getClientIp', error);\n }\n }\n\n async getHeaderInfo() {\n try {\n const result = await this.repository.getHeaderInfo();\n const data = this._handleResultError(result);\n\n this.#headerInfo.setValue(data);\n } catch (error) {\n console.error('Error in getHeaderInfo:', error);\n }\n }\n\n async saveIpAccessEntry(entry: IPAccessEntry): Promise {\n try {\n const result = await this.repository.saveIpAccessEntry(entry);\n this._handleResultError(result);\n\n await this.getAllIpAccessEntries();\n await this.checkIpInList();\n } catch (error) {\n console.error('Error in saveIpAccessEntry:', error);\n console.error('Entry:', entry);\n }\n }\n\n async getInstallationInfo() {\n try {\n const result = await this.repository.GetInstallationInfo();\n const data = this._handleResultError(result);\n\n this.#installationInfo.setValue(data);\n } catch (error) {\n console.error('Error in getInstallationInfo:', error);\n }\n }\n}\n\nexport default IPAccessRestrictionContext;\n\nexport const IP_ACCESS_RESTRICTION_CONTEXT_TOKEN = new UmbContextToken(\n IPAccessRestrictionContext.name,\n);\n","import { UmbModalToken } from '@umbraco-cms/backoffice/modal';\nimport { IPAccessEntry } from '@models/IPAccessEntry';\n\nexport interface IpEntryModalData {\n ipEntry?: IPAccessEntry;\n}\n\nexport interface IpEntryModalValue {\n ipEntry: IPAccessEntry;\n}\n\nexport const IP_ENTRY_MODAL_TOKEN = new UmbModalToken('ip-entry-modal', {\n modal: {\n type: 'sidebar',\n size: 'small',\n },\n});\n","import { LitElement, css, html, customElement, property, unsafeHTML } from '@umbraco-cms/backoffice/external/lit';\nimport { UmbElementMixin } from '@umbraco-cms/backoffice/element-api';\nimport { IP_ACCESS_RESTRICTION_CONTEXT_TOKEN, IPAccessRestrictionContext } from '@context/IpAccessRestrictionContext';\nimport { IP_ENTRY_MODAL_TOKEN } from '@dialogs/modals/IpEntryModalToken.ts';\nimport { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal';\nimport { IPAccessEntry } from '@models/IPAccessEntry.ts';\n\n@customElement('dashboard-element')\nexport class DashboardElement extends UmbElementMixin(LitElement) {\n modalManagerContext?: typeof UMB_MODAL_MANAGER_CONTEXT.TYPE;\n context?: IPAccessRestrictionContext;\n\n @property({ type: Array }) ipEntries?: IPAccessEntry[];\n @property({ type: Array }) ips?: string[];\n @property({ type: String }) clientIP?: string;\n @property({ type: String }) customHeaderInfo?: string;\n @property({ type: Boolean }) isIpInList = false;\n @property({ type: String }) installationInfo?: string;\n\n constructor() {\n super();\n this.consumeContext(IP_ACCESS_RESTRICTION_CONTEXT_TOKEN, (_instance) => {\n this.context = _instance;\n if (!_instance) {\n return;\n }\n\n this.observe(_instance.ipEntries, (_ipEntries) => {\n this.ipEntries = _ipEntries;\n });\n\n this.observe(_instance.ips, (_ips) => {\n this.ips = _ips;\n });\n\n this.observe(_instance.clientIp, (_clientIp) => {\n this.clientIP = _clientIp;\n });\n\n this.observe(_instance.headerInfo, (_headerInfo) => {\n this.customHeaderInfo = _headerInfo;\n });\n\n this.observe(_instance.isIpInList, (_isIpInList) => {\n this.isIpInList = _isIpInList;\n });\n\n this.observe(_instance.installationInfo, (_installationInfo) => {\n this.installationInfo = _installationInfo;\n });\n });\n\n this.consumeContext(UMB_MODAL_MANAGER_CONTEXT, (instance) => {\n this.modalManagerContext = instance;\n });\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n\n if (this.context != null) {\n this.context.getAllIpAccessEntries();\n this.context.getHeaderInfo();\n this.context.checkIpInList();\n this.context.getInstallationInfo();\n }\n }\n\n private _formatDate(dateString?: string): string {\n if (!dateString) {\n return '';\n }\n const options: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n };\n return new Date(dateString).toLocaleDateString('en-US', options);\n }\n\n _openModal(ipEntry?: IPAccessEntry) {\n this.modalManagerContext?.open(this, IP_ENTRY_MODAL_TOKEN, {\n data: {\n ipEntry,\n },\n });\n }\n\n async _handleEditClick(ipEntry: IPAccessEntry) {\n if (ipEntry.id) {\n const ipDetails = await this.context?.getIpAccessEntryById(ipEntry.id);\n this._openModal(ipDetails);\n } else {\n console.error('@handleEditClick IP Address is undefined or null');\n }\n }\n\n async _handleDeleteClick(ipEntry: IPAccessEntry) {\n if (ipEntry.id) {\n await this.context!.deleteIpAccessEntry(ipEntry.id);\n } else {\n console.error('IP entry ID is undefined or null');\n }\n }\n\n render() {\n return html`\n
\n
\n + Add new IP address\n\n
\n \n ${unsafeHTML(this.installationInfo)}\n
\n\n
\n \n ${this.customHeaderInfo}\n
\n\n
\n \n Your IP address is not on the list\n this._openModal({ id: '', ip: this.clientIP, description: '', isDeleted: false, isEditable: true })}\"\n >+ Add\n
\n
\n

Whitelisted IP Addresses

\n \n \n \n \n \n \n\n \n IP\n Description\n Modified\n Modified By\n Actions\n \n\n ${this.ipEntries?.map(\n (ipEntry) => html`\n \n ${ipEntry.ip}\n ${ipEntry.description}\n ${this._formatDate(ipEntry.modified!)}\n ${ipEntry.modifiedBy}\n \n this._handleEditClick(ipEntry)}\"\n ?disabled=\"${!ipEntry.isEditable}\"\n >Edit\n this._handleDeleteClick(ipEntry)}\"\n ?disabled=\"${!ipEntry.isEditable}\"\n >Delete\n \n \n `,\n )}\n \n
\n `;\n }\n public static readonly styles = css`\n .container {\n padding: 30px;\n }\n #top-bar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n `;\n}\n\nexport default DashboardElement;\n\ndeclare global {\n interface HTMLElementsTagNameMap {\n 'access-restriction': DashboardElement;\n }\n}\n","import { UmbElementMixin } from '@umbraco-cms/backoffice/element-api';\nimport { UmbModalExtensionElement } from '@umbraco-cms/backoffice/modal';\nimport { css, customElement, html, LitElement, property, state } from '@umbraco-cms/backoffice/external/lit';\nimport { IpEntryModalData, IpEntryModalValue } from '@dialogs/modals/IpEntryModalToken';\nimport { IP_ACCESS_RESTRICTION_CONTEXT_TOKEN, IPAccessRestrictionContext } from '@context/IpAccessRestrictionContext';\nimport { UmbModalContext } from '@umbraco-cms/backoffice/modal';\nimport { IPAccessEntry } from '@models/IPAccessEntry';\nimport { firstValueFrom, of } from '@umbraco-cms/backoffice/external/rxjs';\n\ninterface Errors {\n ip?: string;\n description?: string;\n duplicateIp?: string;\n}\n\n@customElement('ip-access-restriction-modal')\nexport default class IpEntryModal\n extends UmbElementMixin(LitElement)\n implements UmbModalExtensionElement\n{\n #accessRestrictionContext?: IPAccessRestrictionContext;\n\n @state() isValid: boolean = false;\n\n @property({ type: Object }) errors: Errors = {};\n @property({ type: String }) id = '';\n @property({ type: String }) ip = '';\n @property({ type: String }) description = '';\n @property({ attribute: false }) data?: IpEntryModalData;\n @property({ attribute: false })\n modalContext?: UmbModalContext;\n\n initialIp: string = '';\n\n constructor() {\n super();\n this.consumeContext(IP_ACCESS_RESTRICTION_CONTEXT_TOKEN, (instance) => {\n this.#accessRestrictionContext = instance;\n });\n }\n\n protected firstUpdated() {\n if (this.modalContext?.data?.ipEntry) {\n const { id, ip, description } = this.modalContext.data.ipEntry;\n this.id = id ?? '';\n this.ip = ip ?? '';\n this.description = description ?? '';\n this.initialIp = ip ?? '';\n } else {\n console.error('No IP Entry data found in modal context');\n }\n }\n\n private _handleClose() {\n this.modalContext?.submit();\n }\n\n private async _handleSubmit(e: Event) {\n e.preventDefault();\n await this._validateForm();\n\n if (!this.isValid) {\n console.error('Form validation failed:');\n return;\n }\n\n const ipEntry: IPAccessEntry = {\n id: this.id || crypto.randomUUID(),\n ip: this.ip,\n description: this.description,\n isDeleted: false,\n isEditable: true,\n };\n\n try {\n if (this.#accessRestrictionContext) {\n await this.#accessRestrictionContext.saveIpAccessEntry(ipEntry);\n } else {\n console.error('Access restriction context is not available');\n }\n this._handleClose();\n } catch (error) {\n console.error('Failed to save IP access entry:', error);\n }\n }\n\n private _handleInputChange(event: Event) {\n enum InputFieldNames {\n Id = 'id',\n Ip = 'ip',\n Description = 'description',\n }\n\n const isValidInputFieldName = (fieldName: any): fieldName is InputFieldNames =>\n Object.values(InputFieldNames).includes(fieldName as InputFieldNames);\n const inputElement = event.target as HTMLInputElement;\n\n if (isValidInputFieldName(inputElement.name)) {\n this[inputElement.name] = inputElement.value;\n }\n this._validateForm();\n }\n\n private _validateIp(ip: string): boolean {\n if (!ip) {\n return false;\n }\n\n const wildcards = (ip.match(/\\*/g) || []).length;\n\n if (wildcards > 0) {\n if (wildcards === 1 && ip.endsWith('*')) {\n return true;\n } else {\n return false;\n }\n } else {\n const expression =\n /((^\\s*((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\\s*$)|(^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$))/;\n return expression.test(ip);\n }\n }\n\n private async _checkDuplicateIps(ip: string): Promise {\n try {\n const ipObservable = this.#accessRestrictionContext?.ips ?? of();\n const allIpEntries = await firstValueFrom(ipObservable);\n return allIpEntries.includes(ip) && this.initialIp !== ip;\n } catch (error) {\n console.error('No duplicates found in ips observable, error:', error);\n return false;\n }\n }\n\n private async _validateForm() {\n this.errors = {};\n if (!this._validateIp(this.ip)) {\n this.errors.ip = 'Invalid IP';\n } else if (await this._checkDuplicateIps(this.ip)) {\n this.errors.ip = 'The IP Address is already whitelisted';\n this.requestUpdate();\n }\n\n if (!this.description) {\n this.errors.description = 'A description is required';\n }\n\n this.isValid = Object.keys(this.errors).length === 0;\n }\n\n render() {\n return html`\n \n \n

\n A wildcard is only allowed at the end. When using a wildcard, the entry is no longer checked for a valid IP\n address. Example: 127.0.* or 127.0.0*\n

\n\n \n
\n \n \n\n \n \n IP\n \n
\n \n \n ${this.errors.ip ? html`
${this.errors.ip}
` : ''}\n
\n
\n\n \n \n Description\n \n
\n \n \n ${this.errors.description ? html`
${this.errors.description}
` : ''}\n
\n
\n\n \n Save\n
\n
\n
\n\n \n\n close\n
\n `;\n }\n\n public static readonly styles = css`\n #id {\n display: none;\n }\n .error-message {\n color: rgb(191, 33, 78);\n }\n `;\n}\n"],"names":["dashboards","dashboard","manifests","modals","IpEntryModal$1","contexts","IpAccessRestrictionContext","ApiError","request","response","message","CancelError","CancelablePromise","executor","__privateAdd","_isResolved","_isRejected","_isCancelled","_cancelHandlers","_promise","_resolve","_reject","__privateSet","resolve","reject","onResolve","value","__privateGet","onReject","reason","onCancel","cancelHandler","onFulfilled","onRejected","onFinally","error","OpenAPI","isDefined","isString","isStringWithValue","isBlob","isFormData","base64","str","getQueryString","params","qs","append","key","process","v","k","getUrl","config","options","encoder","path","substring","group","_a","url","getFormData","formData","_","resolver","getHeaders","token","username","password","additionalHeaders","headers","credentials","getRequestBody","sendRequest","body","controller","getResponseHeader","responseHeader","content","getResponseBody","contentType","type","catchErrorCodes","result","errorStatus","errorStatusText","errorBody","responseBody","V1Service","id","__request","requestBody","onInit","_host","extensionRegistry","dashboardManifests","modalManifests","contextManifests","UMB_AUTH_CONTEXT","_auth","umbOpenApi","IPAccessRestrictionDataSource","host","deleteOperation","tryExecuteAndNotify","IPAccessRestrictionRepository","UmbControllerBase","_dataSource","IPAccessRestrictionContext","_ipEntries","_ips","_clientIp","_headerInfo","_isIpInList","_installationInfo","UmbArrayState","x","UmbStringState","UmbBooleanState","IP_ACCESS_RESTRICTION_CONTEXT_TOKEN","ips","clientIp","data","entry","UmbContextToken","IP_ENTRY_MODAL_TOKEN","UmbModalToken","DashboardElement","UmbElementMixin","LitElement","_instance","UMB_MODAL_MANAGER_CONTEXT","instance","dateString","ipEntry","ipDetails","html","unsafeHTML","css","__decorateClass","property","customElement","DashboardElement$1","_accessRestrictionContext","IpEntryModal","_b","ip","description","e","event","InputFieldNames","isValidInputFieldName","fieldName","inputElement","wildcards","ipObservable","of","firstValueFrom","state"],"mappings":"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"} \ No newline at end of file