dash-button-web 0.0.21 → 0.0.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/dash-button.cjs.entry.js +50 -17
- package/dist/cjs/dash-button.cjs.entry.js.map +1 -1
- package/dist/collection/components/my-component/dash-button.js +30 -13
- package/dist/collection/components/my-component/dash-button.js.map +1 -1
- package/dist/collection/services/config.js +2 -0
- package/dist/collection/services/config.js.map +1 -1
- package/dist/collection/services/menu.js +18 -4
- package/dist/collection/services/menu.js.map +1 -1
- package/dist/components/dash-button.js +50 -17
- package/dist/components/dash-button.js.map +1 -1
- package/dist/esm/dash-button.entry.js +50 -17
- package/dist/esm/dash-button.entry.js.map +1 -1
- package/dist/types/services/config.d.ts +2 -0
- package/dist/web-compnont/p-2e8505f3.entry.js +10 -0
- package/dist/web-compnont/p-2e8505f3.entry.js.map +1 -0
- package/dist/web-compnont/web-compnont.esm.js +1 -1
- package/package.json +1 -1
- package/readme.md +25 -19
- package/dist/web-compnont/p-fc02a292.entry.js +0 -10
- package/dist/web-compnont/p-fc02a292.entry.js.map +0 -1
|
@@ -3899,6 +3899,8 @@ const DEFAULT_CONFIG = {
|
|
|
3899
3899
|
isLoading: true,
|
|
3900
3900
|
duration: 800
|
|
3901
3901
|
},
|
|
3902
|
+
allowedGlobalDomain: '',
|
|
3903
|
+
whitelistedUrls: ''
|
|
3902
3904
|
};
|
|
3903
3905
|
// Fetch config from API
|
|
3904
3906
|
class ConfigService {
|
|
@@ -3934,9 +3936,23 @@ class ConfigService {
|
|
|
3934
3936
|
}
|
|
3935
3937
|
const configService = ConfigService.getInstance();
|
|
3936
3938
|
|
|
3939
|
+
// const getRootDomain = (hostOrUrl: string): string => {
|
|
3940
|
+
// // Ensure we can parse it with URL
|
|
3941
|
+
// const url = hostOrUrl.startsWith("http") ? new URL(hostOrUrl) : new URL(`https://${hostOrUrl}`);
|
|
3942
|
+
// const hostname = url.hostname;
|
|
3943
|
+
// const port = url.port ? `:${url.port}` : "";
|
|
3944
|
+
// const parts = hostname.split(".");
|
|
3945
|
+
// // localhost → return with port
|
|
3946
|
+
// if (hostname === "localhost") return hostname + port;
|
|
3947
|
+
// // sslip.io → keep last 3 parts
|
|
3948
|
+
// if (hostname.endsWith(".sslip.io")) return parts.slice(-5).join(".") + port;
|
|
3949
|
+
// // Normal domains → remove first label
|
|
3950
|
+
// return parts.slice(1).join(".") + port;
|
|
3951
|
+
// };
|
|
3937
3952
|
const getRootDomain = (hostOrUrl) => {
|
|
3938
|
-
|
|
3939
|
-
|
|
3953
|
+
const url = hostOrUrl.startsWith("http")
|
|
3954
|
+
? new URL(hostOrUrl)
|
|
3955
|
+
: new URL(`https://${hostOrUrl}`);
|
|
3940
3956
|
const hostname = url.hostname;
|
|
3941
3957
|
const port = url.port ? `:${url.port}` : "";
|
|
3942
3958
|
const parts = hostname.split(".");
|
|
@@ -3946,8 +3962,8 @@ const getRootDomain = (hostOrUrl) => {
|
|
|
3946
3962
|
// sslip.io → keep last 3 parts
|
|
3947
3963
|
if (hostname.endsWith(".sslip.io"))
|
|
3948
3964
|
return parts.slice(-5).join(".") + port;
|
|
3949
|
-
//
|
|
3950
|
-
return
|
|
3965
|
+
// Keep full hostname
|
|
3966
|
+
return hostname + port;
|
|
3951
3967
|
};
|
|
3952
3968
|
const getUrlProtocol = (url, defaultProtocol = "https://") => {
|
|
3953
3969
|
if (!url)
|
|
@@ -4108,27 +4124,44 @@ const DashButtonComponent = class {
|
|
|
4108
4124
|
}
|
|
4109
4125
|
}
|
|
4110
4126
|
}
|
|
4127
|
+
// First, check global links
|
|
4128
|
+
// Then, check the token's organization URL
|
|
4129
|
+
// Finally, check against dashbutton configuration: allowedGlobalDomain and whitelistedUrls
|
|
4111
4130
|
validateAppAccessByUrl() {
|
|
4112
|
-
var _a, _b, _c, _d;
|
|
4113
|
-
const
|
|
4114
|
-
const
|
|
4131
|
+
var _a, _b, _c, _d, _e, _f;
|
|
4132
|
+
const normalizeUrl = (url) => url.replace(/\/+$/, '');
|
|
4133
|
+
const currentUrl = normalizeUrl(window.location.href);
|
|
4134
|
+
const currentOrigin = normalizeUrl(window.location.origin);
|
|
4115
4135
|
const globalLinks = ((_c = (_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.menu) === null || _b === void 0 ? void 0 : _b.global) === null || _c === void 0 ? void 0 : _c.links) || [];
|
|
4116
|
-
|
|
4136
|
+
const allowedGlobalDomain = ((_d = this.config) === null || _d === void 0 ? void 0 : _d.allowedGlobalDomain) || '';
|
|
4137
|
+
const whitelistedUrls = ((_e = this.config) === null || _e === void 0 ? void 0 : _e.whitelistedUrls) || '';
|
|
4138
|
+
// First, check global links
|
|
4117
4139
|
const matchGlobal = globalLinks.some(link => {
|
|
4118
4140
|
try {
|
|
4119
|
-
const linkOrigin = new URL(link.url).origin;
|
|
4141
|
+
const linkOrigin = normalizeUrl(new URL(link.url).origin);
|
|
4120
4142
|
return currentOrigin === linkOrigin;
|
|
4121
4143
|
}
|
|
4122
4144
|
catch (_a) {
|
|
4123
4145
|
return false;
|
|
4124
4146
|
}
|
|
4125
4147
|
});
|
|
4126
|
-
//
|
|
4127
|
-
const tokenParsed = (
|
|
4148
|
+
// Then check the token organization URL
|
|
4149
|
+
const tokenParsed = (_f = this.keycloak) === null || _f === void 0 ? void 0 : _f.tokenParsed;
|
|
4128
4150
|
const allowedOrg = tokenParsed === null || tokenParsed === void 0 ? void 0 : tokenParsed.organizationUrl;
|
|
4129
|
-
const matchOrganization = allowedOrg && currentUrl.includes(allowedOrg);
|
|
4130
|
-
//
|
|
4131
|
-
const
|
|
4151
|
+
const matchOrganization = allowedOrg && currentUrl.includes(normalizeUrl(allowedOrg));
|
|
4152
|
+
// Check allowedGlobalDomain (single domain)
|
|
4153
|
+
const matchAllowedDomain = allowedGlobalDomain &&
|
|
4154
|
+
currentOrigin.includes(normalizeUrl(allowedGlobalDomain));
|
|
4155
|
+
// Check whitelistedUrls (comma-separated string)
|
|
4156
|
+
const whitelistedArray = whitelistedUrls
|
|
4157
|
+
? whitelistedUrls.split(',').map(url => normalizeUrl(url.trim()))
|
|
4158
|
+
: [];
|
|
4159
|
+
const matchWhitelisted = whitelistedArray.some(url => currentUrl.includes(url));
|
|
4160
|
+
// Final validation
|
|
4161
|
+
const isAllowed = matchGlobal ||
|
|
4162
|
+
matchOrganization ||
|
|
4163
|
+
matchAllowedDomain ||
|
|
4164
|
+
matchWhitelisted;
|
|
4132
4165
|
this.isRestricted = !isAllowed;
|
|
4133
4166
|
}
|
|
4134
4167
|
login() {
|
|
@@ -4150,7 +4183,7 @@ const DashButtonComponent = class {
|
|
|
4150
4183
|
}
|
|
4151
4184
|
render() {
|
|
4152
4185
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w;
|
|
4153
|
-
return index.h("div", { key: '
|
|
4186
|
+
return index.h("div", { key: '370786aa472fafd2bf9509a18bd62c87ac2893c7' }, index.h("div", { key: 'c0b091b19e7981ecc48e95c03c8d91e77e7a88df' }, (() => {
|
|
4154
4187
|
var _a, _b, _c, _d, _e, _f;
|
|
4155
4188
|
// GLOBAL LOADING SPINNER
|
|
4156
4189
|
if (this.isLoading) {
|
|
@@ -4177,7 +4210,7 @@ const DashButtonComponent = class {
|
|
|
4177
4210
|
else {
|
|
4178
4211
|
return (index.h("button", { style: { background: this.primaryColor != undefined ? this.primaryColor : "" }, onClick: this.login.bind(this), id: "login-btn", type: "button", class: "button" }, index.h("span", { style: { color: this.accentColor != undefined ? this.accentColor : "" }, class: "button-text" }, "Login")));
|
|
4179
4212
|
}
|
|
4180
|
-
})()), index.h("div", { key: '
|
|
4213
|
+
})()), index.h("div", { key: 'f98304920ef08f842700c5d26fe62a51cbbade96', id: "appListModal", class: "modal" }, index.h("div", { key: '2c4024b83e3cd0d638f4482d0e8907687ac12dd0', class: "modal-content" }, index.h("span", { key: '42a44145a7d7c33cae95344f02229d8163cc9607', onClick: this.closeModal.bind(this), class: "close" }, "\u00D7"), index.h("div", { key: 'ec3dbe646c76818ee90ec28e19671880670a2754', class: "box" }, index.h("input", { type: "radio", class: "tab-toggle", name: "tab-toggle", id: "tab1", checked: true }), index.h("ul", { key: 'c7dbcfd1b183bc6845cab0f17ef6f81dee30867f', class: "tab-list" }, index.h("li", { class: "tab-item" }, index.h("label", { class: "tab-trigger", htmlFor: "tab1" }, index.h("i", { class: "fa-solid fa-table-list menu-bar-icons" }), " ", this.config.menu.local.name))), index.h("div", { key: 'dc58df8e838c8babe3c679c6f1c498e286448cf3', class: "tab-container" }, index.h("div", { key: '486acbf570543ef0a92bd919e1c9c7973c87b3a7', class: "tab-content" }, index.h("div", { key: 'c9e093ce8d745097147405749e88ba35b1fc8679', class: "modal-body" }, !((_c = (_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.menu) === null || _b === void 0 ? void 0 : _b.local) === null || _c === void 0 ? void 0 : _c.enableCustomLocalMenu) ? (
|
|
4181
4214
|
// <div>{this.localMenuLinks}</div>
|
|
4182
4215
|
(_d = this.localMenuLinks) === null || _d === void 0 ? void 0 : _d.map((app, index$1) => {
|
|
4183
4216
|
const isDisabled = !app.url;
|
|
@@ -4185,7 +4218,7 @@ const DashButtonComponent = class {
|
|
|
4185
4218
|
})) : ((_e = this.config.menu.local.links) === null || _e === void 0 ? void 0 : _e.map((app, index$1) => (index.h("a", { key: index$1, class: "external-app-link", target: "_blank", rel: "noopener noreferrer", href: app.url }, index.h("div", { class: "modal-app" }, index.h("div", null, app.name)))))), !this.organizationUrl ? (index.h("div", null, index.h("h3", { class: "gray-text" }, "Organization Domain URL not set"), index.h("p", { class: "gray-text" }, "Please set your Organization Domain URL on the Portal profile page."))) : (((!((_h = (_g = (_f = this.config) === null || _f === void 0 ? void 0 : _f.menu) === null || _g === void 0 ? void 0 : _g.local) === null || _h === void 0 ? void 0 : _h.enableCustomLocalMenu) &&
|
|
4186
4219
|
((_k = (_j = this.localMenuLinks) === null || _j === void 0 ? void 0 : _j.length) !== null && _k !== void 0 ? _k : 0) === 0) ||
|
|
4187
4220
|
(((_o = (_m = (_l = this.config) === null || _l === void 0 ? void 0 : _l.menu) === null || _m === void 0 ? void 0 : _m.local) === null || _o === void 0 ? void 0 : _o.enableCustomLocalMenu) &&
|
|
4188
|
-
((_t = (_s = (_r = (_q = (_p = this.config) === null || _p === void 0 ? void 0 : _p.menu) === null || _q === void 0 ? void 0 : _q.local) === null || _r === void 0 ? void 0 : _r.links) === null || _s === void 0 ? void 0 : _s.length) !== null && _t !== void 0 ? _t : 0) === 0)) && (index.h("div", null, index.h("h3", { class: "gray-text" }, "No installed ", ((_w = (_v = (_u = this.config) === null || _u === void 0 ? void 0 : _u.menu) === null || _v === void 0 ? void 0 : _v.local) === null || _w === void 0 ? void 0 : _w.name) || "menu", " found."), index.h("p", { class: "gray-text" }, "Please contact administration.")))))))))), index.h("div", { key: '
|
|
4221
|
+
((_t = (_s = (_r = (_q = (_p = this.config) === null || _p === void 0 ? void 0 : _p.menu) === null || _q === void 0 ? void 0 : _q.local) === null || _r === void 0 ? void 0 : _r.links) === null || _s === void 0 ? void 0 : _s.length) !== null && _t !== void 0 ? _t : 0) === 0)) && (index.h("div", null, index.h("h3", { class: "gray-text" }, "No installed ", ((_w = (_v = (_u = this.config) === null || _u === void 0 ? void 0 : _u.menu) === null || _v === void 0 ? void 0 : _v.local) === null || _w === void 0 ? void 0 : _w.name) || "menu", " found."), index.h("p", { class: "gray-text" }, "Please contact administration.")))))))))), index.h("div", { key: '349c7ff69d94c988a278677f497c0a9fef85c59c', id: "appPermissionErrorModal", class: "modal" }, index.h("div", { key: '788004858cf2f55f4e79cce0c023895274bab9ab', class: "modal-content" }, index.h("img", { key: '57ea43b0a21086eeaebe0585b9501967099ec999', src: "data:image/png;base64,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" }), index.h("h2", { key: 'c7663fb1503a0f0713350ac2ff2e52708c5425f9', class: "green-text margin-b" }, "You don't have permission to access this application."), index.h("h3", { key: '925b21fffdee5437664f690254821ffa63d736cb', class: "green-text" }, "Please contact the administration."), (this.config.defaultLink.url && this.showUnauthorizedModal) ?
|
|
4189
4222
|
index.h("div", null, index.h("h4", { class: "gray-text" }, "You will be automatically redirected to the portal."), index.h("div", { id: "countdown" }, index.h("div", { id: "countdown-number" }), index.h("svg", null, index.h("circle", { r: "18", cx: "20", cy: "20" }))))
|
|
4190
4223
|
: index.h("div", null))));
|
|
4191
4224
|
}
|