@idp.global/catalog 3.1.0 → 3.3.0
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/changelog.md +14 -0
- package/dist_bundle/bundle.js +799 -632
- package/dist_ts_web/00_commitinfo_data.js +1 -1
- package/dist_ts_web/elements/idp-admin-shell.d.ts +2 -0
- package/dist_ts_web/elements/idp-admin-shell.js +17 -7
- package/dist_ts_web/elements/idp-secure-account-card.d.ts +37 -0
- package/dist_ts_web/elements/idp-secure-account-card.js +348 -0
- package/dist_ts_web/elements/index.d.ts +1 -0
- package/dist_ts_web/elements/index.js +2 -1
- package/package.json +1 -1
- package/ts_web/00_commitinfo_data.ts +1 -1
- package/ts_web/elements/idp-admin-shell.ts +10 -5
- package/ts_web/elements/idp-secure-account-card.ts +267 -0
- package/ts_web/elements/index.ts +1 -0
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
2
|
+
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
3
|
+
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
4
|
+
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
5
|
+
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
6
|
+
var _, done = false;
|
|
7
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
8
|
+
var context = {};
|
|
9
|
+
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
10
|
+
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
11
|
+
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
12
|
+
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
13
|
+
if (kind === "accessor") {
|
|
14
|
+
if (result === void 0) continue;
|
|
15
|
+
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
16
|
+
if (_ = accept(result.get)) descriptor.get = _;
|
|
17
|
+
if (_ = accept(result.set)) descriptor.set = _;
|
|
18
|
+
if (_ = accept(result.init)) initializers.unshift(_);
|
|
19
|
+
}
|
|
20
|
+
else if (_ = accept(result)) {
|
|
21
|
+
if (kind === "field") initializers.unshift(_);
|
|
22
|
+
else descriptor[key] = _;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
26
|
+
done = true;
|
|
27
|
+
};
|
|
28
|
+
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
29
|
+
var useValue = arguments.length > 2;
|
|
30
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
31
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
32
|
+
}
|
|
33
|
+
return useValue ? value : void 0;
|
|
34
|
+
};
|
|
35
|
+
import { DeesElement, html, property, customElement, css } from '@design.estate/dees-element';
|
|
36
|
+
import { idpElementStyles } from './tokens.js';
|
|
37
|
+
import './idp-auth-card.js';
|
|
38
|
+
import './idp-option-row.js';
|
|
39
|
+
import './idp-otp-input.js';
|
|
40
|
+
import './idp-status-icon.js';
|
|
41
|
+
import './idp-button.js';
|
|
42
|
+
/**
|
|
43
|
+
* Post-registration security enrollment card. Purely presentational: the host
|
|
44
|
+
* runs the WebAuthn/TOTP requests and drives `stage`, reacting to
|
|
45
|
+
* idp-secure-passkey, idp-secure-totp, idp-secure-totp-verify, idp-secure-skip
|
|
46
|
+
* and idp-secure-continue.
|
|
47
|
+
*/
|
|
48
|
+
let IdpSecureAccountCard = (() => {
|
|
49
|
+
let _classDecorators = [customElement('idp-secure-account-card')];
|
|
50
|
+
let _classDescriptor;
|
|
51
|
+
let _classExtraInitializers = [];
|
|
52
|
+
let _classThis;
|
|
53
|
+
let _classSuper = DeesElement;
|
|
54
|
+
let _stage_decorators;
|
|
55
|
+
let _stage_initializers = [];
|
|
56
|
+
let _stage_extraInitializers = [];
|
|
57
|
+
let _busy_decorators;
|
|
58
|
+
let _busy_initializers = [];
|
|
59
|
+
let _busy_extraInitializers = [];
|
|
60
|
+
let _errorText_decorators;
|
|
61
|
+
let _errorText_initializers = [];
|
|
62
|
+
let _errorText_extraInitializers = [];
|
|
63
|
+
let _totpSecret_decorators;
|
|
64
|
+
let _totpSecret_initializers = [];
|
|
65
|
+
let _totpSecret_extraInitializers = [];
|
|
66
|
+
let _totpOtpauthUrl_decorators;
|
|
67
|
+
let _totpOtpauthUrl_initializers = [];
|
|
68
|
+
let _totpOtpauthUrl_extraInitializers = [];
|
|
69
|
+
let _backupCodes_decorators;
|
|
70
|
+
let _backupCodes_initializers = [];
|
|
71
|
+
let _backupCodes_extraInitializers = [];
|
|
72
|
+
let _doneMethod_decorators;
|
|
73
|
+
let _doneMethod_initializers = [];
|
|
74
|
+
let _doneMethod_extraInitializers = [];
|
|
75
|
+
var IdpSecureAccountCard = class extends _classSuper {
|
|
76
|
+
static { _classThis = this; }
|
|
77
|
+
static {
|
|
78
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
79
|
+
_stage_decorators = [property({ type: String, reflect: true })];
|
|
80
|
+
_busy_decorators = [property({ type: Boolean })];
|
|
81
|
+
_errorText_decorators = [property({ type: String })];
|
|
82
|
+
_totpSecret_decorators = [property({ type: String })];
|
|
83
|
+
_totpOtpauthUrl_decorators = [property({ type: String })];
|
|
84
|
+
_backupCodes_decorators = [property({ type: Array })];
|
|
85
|
+
_doneMethod_decorators = [property({ type: String })];
|
|
86
|
+
__esDecorate(this, null, _stage_decorators, { kind: "accessor", name: "stage", static: false, private: false, access: { has: obj => "stage" in obj, get: obj => obj.stage, set: (obj, value) => { obj.stage = value; } }, metadata: _metadata }, _stage_initializers, _stage_extraInitializers);
|
|
87
|
+
__esDecorate(this, null, _busy_decorators, { kind: "accessor", name: "busy", static: false, private: false, access: { has: obj => "busy" in obj, get: obj => obj.busy, set: (obj, value) => { obj.busy = value; } }, metadata: _metadata }, _busy_initializers, _busy_extraInitializers);
|
|
88
|
+
__esDecorate(this, null, _errorText_decorators, { kind: "accessor", name: "errorText", static: false, private: false, access: { has: obj => "errorText" in obj, get: obj => obj.errorText, set: (obj, value) => { obj.errorText = value; } }, metadata: _metadata }, _errorText_initializers, _errorText_extraInitializers);
|
|
89
|
+
__esDecorate(this, null, _totpSecret_decorators, { kind: "accessor", name: "totpSecret", static: false, private: false, access: { has: obj => "totpSecret" in obj, get: obj => obj.totpSecret, set: (obj, value) => { obj.totpSecret = value; } }, metadata: _metadata }, _totpSecret_initializers, _totpSecret_extraInitializers);
|
|
90
|
+
__esDecorate(this, null, _totpOtpauthUrl_decorators, { kind: "accessor", name: "totpOtpauthUrl", static: false, private: false, access: { has: obj => "totpOtpauthUrl" in obj, get: obj => obj.totpOtpauthUrl, set: (obj, value) => { obj.totpOtpauthUrl = value; } }, metadata: _metadata }, _totpOtpauthUrl_initializers, _totpOtpauthUrl_extraInitializers);
|
|
91
|
+
__esDecorate(this, null, _backupCodes_decorators, { kind: "accessor", name: "backupCodes", static: false, private: false, access: { has: obj => "backupCodes" in obj, get: obj => obj.backupCodes, set: (obj, value) => { obj.backupCodes = value; } }, metadata: _metadata }, _backupCodes_initializers, _backupCodes_extraInitializers);
|
|
92
|
+
__esDecorate(this, null, _doneMethod_decorators, { kind: "accessor", name: "doneMethod", static: false, private: false, access: { has: obj => "doneMethod" in obj, get: obj => obj.doneMethod, set: (obj, value) => { obj.doneMethod = value; } }, metadata: _metadata }, _doneMethod_initializers, _doneMethod_extraInitializers);
|
|
93
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
94
|
+
IdpSecureAccountCard = _classThis = _classDescriptor.value;
|
|
95
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
96
|
+
}
|
|
97
|
+
static demo = () => html `
|
|
98
|
+
<div style="background: var(--sh-bg, #f5f5f7); padding: 40px; display: flex; flex-wrap: wrap; gap: 24px; justify-content: center;">
|
|
99
|
+
<idp-secure-account-card stage="choice"></idp-secure-account-card>
|
|
100
|
+
<idp-secure-account-card stage="totp" totpSecret="JBSWY3DPEHPK3PXP" totpOtpauthUrl="otpauth://totp/idp.global:alex%40lossless.com?secret=JBSWY3DPEHPK3PXP&issuer=idp.global"></idp-secure-account-card>
|
|
101
|
+
<idp-secure-account-card stage="backup-codes" .backupCodes=${['1111-2222', '3333-4444', '5555-6666', '7777-8888', '9999-0000', '1234-5678']}></idp-secure-account-card>
|
|
102
|
+
<idp-secure-account-card stage="done" doneMethod="passkey"></idp-secure-account-card>
|
|
103
|
+
</div>
|
|
104
|
+
`;
|
|
105
|
+
static demoGroups = ['idp.global v5 auth'];
|
|
106
|
+
#stage_accessor_storage = __runInitializers(this, _stage_initializers, 'choice');
|
|
107
|
+
get stage() { return this.#stage_accessor_storage; }
|
|
108
|
+
set stage(value) { this.#stage_accessor_storage = value; }
|
|
109
|
+
#busy_accessor_storage = (__runInitializers(this, _stage_extraInitializers), __runInitializers(this, _busy_initializers, false));
|
|
110
|
+
/** disables actions while the host performs a request */
|
|
111
|
+
get busy() { return this.#busy_accessor_storage; }
|
|
112
|
+
set busy(value) { this.#busy_accessor_storage = value; }
|
|
113
|
+
#errorText_accessor_storage = (__runInitializers(this, _busy_extraInitializers), __runInitializers(this, _errorText_initializers, ''));
|
|
114
|
+
get errorText() { return this.#errorText_accessor_storage; }
|
|
115
|
+
set errorText(value) { this.#errorText_accessor_storage = value; }
|
|
116
|
+
#totpSecret_accessor_storage = (__runInitializers(this, _errorText_extraInitializers), __runInitializers(this, _totpSecret_initializers, ''));
|
|
117
|
+
/** manual-entry TOTP secret shown during the totp stage */
|
|
118
|
+
get totpSecret() { return this.#totpSecret_accessor_storage; }
|
|
119
|
+
set totpSecret(value) { this.#totpSecret_accessor_storage = value; }
|
|
120
|
+
#totpOtpauthUrl_accessor_storage = (__runInitializers(this, _totpSecret_extraInitializers), __runInitializers(this, _totpOtpauthUrl_initializers, ''));
|
|
121
|
+
/** otpauth:// URL; rendered as a tappable link for phone authenticators */
|
|
122
|
+
get totpOtpauthUrl() { return this.#totpOtpauthUrl_accessor_storage; }
|
|
123
|
+
set totpOtpauthUrl(value) { this.#totpOtpauthUrl_accessor_storage = value; }
|
|
124
|
+
#backupCodes_accessor_storage = (__runInitializers(this, _totpOtpauthUrl_extraInitializers), __runInitializers(this, _backupCodes_initializers, []));
|
|
125
|
+
/** one-time backup codes shown after successful TOTP verification */
|
|
126
|
+
get backupCodes() { return this.#backupCodes_accessor_storage; }
|
|
127
|
+
set backupCodes(value) { this.#backupCodes_accessor_storage = value; }
|
|
128
|
+
#doneMethod_accessor_storage = (__runInitializers(this, _backupCodes_extraInitializers), __runInitializers(this, _doneMethod_initializers, ''));
|
|
129
|
+
/** which method completed, for the done stage copy */
|
|
130
|
+
get doneMethod() { return this.#doneMethod_accessor_storage; }
|
|
131
|
+
set doneMethod(value) { this.#doneMethod_accessor_storage = value; }
|
|
132
|
+
static styles = [
|
|
133
|
+
...idpElementStyles,
|
|
134
|
+
css `
|
|
135
|
+
:host {
|
|
136
|
+
display: block;
|
|
137
|
+
font-family: var(--idp-font);
|
|
138
|
+
}
|
|
139
|
+
.option-list {
|
|
140
|
+
display: flex;
|
|
141
|
+
flex-direction: column;
|
|
142
|
+
gap: 10px;
|
|
143
|
+
margin-top: 16px;
|
|
144
|
+
}
|
|
145
|
+
.skip-row {
|
|
146
|
+
margin-top: 16px;
|
|
147
|
+
text-align: center;
|
|
148
|
+
font-size: 13px;
|
|
149
|
+
}
|
|
150
|
+
.skip-row a {
|
|
151
|
+
color: var(--idp-fg-3);
|
|
152
|
+
cursor: pointer;
|
|
153
|
+
text-decoration: none;
|
|
154
|
+
}
|
|
155
|
+
.skip-row a:hover {
|
|
156
|
+
color: var(--idp-fg-2);
|
|
157
|
+
text-decoration: underline;
|
|
158
|
+
}
|
|
159
|
+
.error-note {
|
|
160
|
+
margin-top: 14px;
|
|
161
|
+
padding: 9px 12px;
|
|
162
|
+
background: color-mix(in srgb, #ff3b30 8%, transparent);
|
|
163
|
+
border: 1px solid color-mix(in srgb, #ff3b30 30%, transparent);
|
|
164
|
+
border-radius: 11px;
|
|
165
|
+
font-size: 12.5px;
|
|
166
|
+
color: #d70015;
|
|
167
|
+
}
|
|
168
|
+
.totp-block {
|
|
169
|
+
display: flex;
|
|
170
|
+
flex-direction: column;
|
|
171
|
+
gap: 12px;
|
|
172
|
+
margin-top: 16px;
|
|
173
|
+
}
|
|
174
|
+
.code-block {
|
|
175
|
+
padding: 10px 12px;
|
|
176
|
+
background: var(--idp-bg);
|
|
177
|
+
border: 1px solid var(--idp-border);
|
|
178
|
+
border-radius: 11px;
|
|
179
|
+
font-family: ui-monospace, 'SF Mono', monospace;
|
|
180
|
+
font-size: 12px;
|
|
181
|
+
word-break: break-all;
|
|
182
|
+
user-select: all;
|
|
183
|
+
}
|
|
184
|
+
.code-label {
|
|
185
|
+
font-size: 11.5px;
|
|
186
|
+
color: var(--idp-fg-3);
|
|
187
|
+
margin-bottom: 4px;
|
|
188
|
+
}
|
|
189
|
+
.otp-row {
|
|
190
|
+
display: flex;
|
|
191
|
+
justify-content: center;
|
|
192
|
+
margin-top: 4px;
|
|
193
|
+
}
|
|
194
|
+
.backup-grid {
|
|
195
|
+
display: grid;
|
|
196
|
+
grid-template-columns: 1fr 1fr;
|
|
197
|
+
gap: 8px;
|
|
198
|
+
margin-top: 16px;
|
|
199
|
+
}
|
|
200
|
+
.backup-code {
|
|
201
|
+
padding: 8px 10px;
|
|
202
|
+
background: var(--idp-bg);
|
|
203
|
+
border: 1px solid var(--idp-border);
|
|
204
|
+
border-radius: 9px;
|
|
205
|
+
font-family: ui-monospace, 'SF Mono', monospace;
|
|
206
|
+
font-size: 12.5px;
|
|
207
|
+
text-align: center;
|
|
208
|
+
user-select: all;
|
|
209
|
+
}
|
|
210
|
+
.status-block {
|
|
211
|
+
display: flex;
|
|
212
|
+
flex-direction: column;
|
|
213
|
+
align-items: center;
|
|
214
|
+
gap: 14px;
|
|
215
|
+
padding: 18px 0 6px;
|
|
216
|
+
text-align: center;
|
|
217
|
+
}
|
|
218
|
+
.status-text {
|
|
219
|
+
font-size: 13px;
|
|
220
|
+
color: var(--idp-fg-2);
|
|
221
|
+
line-height: 1.5;
|
|
222
|
+
max-width: 280px;
|
|
223
|
+
}
|
|
224
|
+
.actions {
|
|
225
|
+
display: flex;
|
|
226
|
+
flex-direction: column;
|
|
227
|
+
gap: 10px;
|
|
228
|
+
margin-top: 18px;
|
|
229
|
+
}
|
|
230
|
+
`,
|
|
231
|
+
];
|
|
232
|
+
render() {
|
|
233
|
+
const renderers = {
|
|
234
|
+
choice: () => ({
|
|
235
|
+
heading: 'Secure your account',
|
|
236
|
+
description: 'Add a second factor now. You can also set this up later under Security in your console.',
|
|
237
|
+
body: html `
|
|
238
|
+
<div class="option-list">
|
|
239
|
+
<idp-option-row
|
|
240
|
+
tileTone="accent"
|
|
241
|
+
tileSize="34"
|
|
242
|
+
icon="fingerprint"
|
|
243
|
+
label="Add a passkey"
|
|
244
|
+
description="Sign in with Face ID, Touch ID, or a security key"
|
|
245
|
+
trailing="chevron"
|
|
246
|
+
@click=${() => { if (!this.busy)
|
|
247
|
+
this.emit('idp-secure-passkey'); }}
|
|
248
|
+
></idp-option-row>
|
|
249
|
+
<idp-option-row
|
|
250
|
+
tileTone="accent"
|
|
251
|
+
tileSize="34"
|
|
252
|
+
icon="lucide:Smartphone"
|
|
253
|
+
label="Use an authenticator app"
|
|
254
|
+
description="Time-based codes from an app like 1Password or Google Authenticator"
|
|
255
|
+
trailing="chevron"
|
|
256
|
+
@click=${() => { if (!this.busy)
|
|
257
|
+
this.emit('idp-secure-totp'); }}
|
|
258
|
+
></idp-option-row>
|
|
259
|
+
</div>
|
|
260
|
+
${this.errorText ? html `<div class="error-note" role="alert">${this.errorText}</div>` : html ``}
|
|
261
|
+
<div class="skip-row"><a @click=${() => this.emit('idp-secure-skip')}>Skip for now</a></div>
|
|
262
|
+
`,
|
|
263
|
+
}),
|
|
264
|
+
totp: () => ({
|
|
265
|
+
heading: 'Set up your authenticator',
|
|
266
|
+
description: 'Add the secret to your authenticator app, then enter the current 6-digit code.',
|
|
267
|
+
body: html `
|
|
268
|
+
<div class="totp-block">
|
|
269
|
+
<div>
|
|
270
|
+
<div class="code-label">Manual secret</div>
|
|
271
|
+
<div class="code-block">${this.totpSecret}</div>
|
|
272
|
+
</div>
|
|
273
|
+
${this.totpOtpauthUrl
|
|
274
|
+
? html `
|
|
275
|
+
<div>
|
|
276
|
+
<div class="code-label">Or open directly on this device</div>
|
|
277
|
+
<div class="code-block"><a href=${this.totpOtpauthUrl}>${this.totpOtpauthUrl}</a></div>
|
|
278
|
+
</div>
|
|
279
|
+
`
|
|
280
|
+
: html ``}
|
|
281
|
+
<div class="otp-row">
|
|
282
|
+
<idp-otp-input
|
|
283
|
+
@idp-otp-complete=${(eventArg) => {
|
|
284
|
+
this.dispatchEvent(new CustomEvent('idp-secure-totp-verify', {
|
|
285
|
+
detail: { code: eventArg.detail.value },
|
|
286
|
+
bubbles: true,
|
|
287
|
+
composed: true,
|
|
288
|
+
}));
|
|
289
|
+
}}
|
|
290
|
+
></idp-otp-input>
|
|
291
|
+
</div>
|
|
292
|
+
</div>
|
|
293
|
+
${this.errorText ? html `<div class="error-note" role="alert">${this.errorText}</div>` : html ``}
|
|
294
|
+
<div class="skip-row"><a @click=${() => this.emit('idp-secure-back')}>Choose a different method</a></div>
|
|
295
|
+
`,
|
|
296
|
+
}),
|
|
297
|
+
'backup-codes': () => ({
|
|
298
|
+
heading: 'Save your backup codes',
|
|
299
|
+
description: 'Each code works once if you lose access to your authenticator. Store them somewhere safe.',
|
|
300
|
+
body: html `
|
|
301
|
+
<div class="backup-grid">
|
|
302
|
+
${this.backupCodes.map((codeArg) => html `<div class="backup-code">${codeArg}</div>`)}
|
|
303
|
+
</div>
|
|
304
|
+
<div class="actions">
|
|
305
|
+
<idp-button variant="accent" shape="rect" block @click=${() => this.emit('idp-secure-continue')}>I saved these codes</idp-button>
|
|
306
|
+
</div>
|
|
307
|
+
`,
|
|
308
|
+
}),
|
|
309
|
+
done: () => ({
|
|
310
|
+
heading: this.doneMethod === 'totp' ? 'Authenticator added' : 'Passkey added',
|
|
311
|
+
description: '',
|
|
312
|
+
body: html `
|
|
313
|
+
<div class="status-block">
|
|
314
|
+
<idp-status-icon tone="ok" icon="check"></idp-status-icon>
|
|
315
|
+
<div class="status-text">
|
|
316
|
+
${this.doneMethod === 'totp'
|
|
317
|
+
? 'Sign-ins now require a code from your authenticator app.'
|
|
318
|
+
: 'You can now sign in with your passkey instead of a password.'}
|
|
319
|
+
</div>
|
|
320
|
+
</div>
|
|
321
|
+
<div class="actions">
|
|
322
|
+
<idp-button variant="accent" shape="rect" block @click=${() => this.emit('idp-secure-continue')}>Continue</idp-button>
|
|
323
|
+
</div>
|
|
324
|
+
`,
|
|
325
|
+
}),
|
|
326
|
+
};
|
|
327
|
+
const view = renderers[this.stage]();
|
|
328
|
+
return html `
|
|
329
|
+
<idp-auth-card heading=${view.heading} description=${view.description}>
|
|
330
|
+
${view.body}
|
|
331
|
+
</idp-auth-card>
|
|
332
|
+
`;
|
|
333
|
+
}
|
|
334
|
+
emit(eventName) {
|
|
335
|
+
this.dispatchEvent(new CustomEvent(eventName, { bubbles: true, composed: true }));
|
|
336
|
+
}
|
|
337
|
+
constructor() {
|
|
338
|
+
super(...arguments);
|
|
339
|
+
__runInitializers(this, _doneMethod_extraInitializers);
|
|
340
|
+
}
|
|
341
|
+
static {
|
|
342
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
343
|
+
}
|
|
344
|
+
};
|
|
345
|
+
return IdpSecureAccountCard = _classThis;
|
|
346
|
+
})();
|
|
347
|
+
export { IdpSecureAccountCard };
|
|
348
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRwLXNlY3VyZS1hY2NvdW50LWNhcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c193ZWIvZWxlbWVudHMvaWRwLXNlY3VyZS1hY2NvdW50LWNhcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsR0FBRyxFQUF1QixNQUFNLDZCQUE2QixDQUFDO0FBQ25ILE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMvQyxPQUFPLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8saUJBQWlCLENBQUM7QUFXekI7Ozs7O0dBS0c7SUFFVSxvQkFBb0I7NEJBRGhDLGFBQWEsQ0FBQyx5QkFBeUIsQ0FBQzs7OztzQkFDQyxXQUFXOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O29DQUFuQixTQUFRLFdBQVc7Ozs7aUNBV2xELFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO2dDQUl6QyxRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7cUNBRzNCLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztzQ0FJMUIsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDOzBDQUkxQixRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7dUNBSTFCLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztzQ0FJekIsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBdEIzQixvS0FBZ0Is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
|
|
@@ -23,6 +23,7 @@ export * from './idp-app-pair.js';
|
|
|
23
23
|
export * from './idp-auth-card.js';
|
|
24
24
|
export * from './idp-consent-card.js';
|
|
25
25
|
export * from './idp-invite-card.js';
|
|
26
|
+
export * from './idp-secure-account-card.js';
|
|
26
27
|
export * from './idp-approval-card.js';
|
|
27
28
|
export * from './idp-mobile-frame.js';
|
|
28
29
|
export * from './idp-inbox-preview.js';
|
|
@@ -23,6 +23,7 @@ export * from './idp-app-pair.js';
|
|
|
23
23
|
export * from './idp-auth-card.js';
|
|
24
24
|
export * from './idp-consent-card.js';
|
|
25
25
|
export * from './idp-invite-card.js';
|
|
26
|
+
export * from './idp-secure-account-card.js';
|
|
26
27
|
export * from './idp-approval-card.js';
|
|
27
28
|
export * from './idp-mobile-frame.js';
|
|
28
29
|
export * from './idp-inbox-preview.js';
|
|
@@ -37,4 +38,4 @@ export * from './idp-landing-page.js';
|
|
|
37
38
|
export * from './idp-mobile-showcase.js';
|
|
38
39
|
export * from './idp-sso-connection-form.js';
|
|
39
40
|
export * from './idp-scim-token-panel.js';
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c193ZWIvZWxlbWVudHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyw4QkFBOEIsQ0FBQztBQUM3QyxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsMkJBQTJCLENBQUMifQ==
|
package/package.json
CHANGED
|
@@ -1003,6 +1003,10 @@ export class IdpAdminShell extends DeesElement {
|
|
|
1003
1003
|
@property({ type: Array })
|
|
1004
1004
|
public accessor gaUsers: IIdpAdminGaUser[] = [];
|
|
1005
1005
|
|
|
1006
|
+
/** platform-wide org directory for the ga-orgs page; falls back to orgs when empty */
|
|
1007
|
+
@property({ type: Array })
|
|
1008
|
+
public accessor gaOrgs: IIdpAdminOrg[] = [];
|
|
1009
|
+
|
|
1006
1010
|
@property({ type: Array })
|
|
1007
1011
|
public accessor ssoConnections: IIdpSsoConnectionItem[] = [];
|
|
1008
1012
|
|
|
@@ -2475,9 +2479,10 @@ export class IdpAdminShell extends DeesElement {
|
|
|
2475
2479
|
private renderGAOrgs(): TemplateResult {
|
|
2476
2480
|
const planVariant = (planArg: string): 'accent' | 'ok' | 'warn' | 'default' =>
|
|
2477
2481
|
planArg === 'Pro' ? 'accent' : planArg === 'Enterprise' ? 'ok' : planArg === 'Internal' ? 'warn' : 'default';
|
|
2478
|
-
const
|
|
2479
|
-
const
|
|
2480
|
-
const
|
|
2482
|
+
const directoryOrgs = this.gaOrgs.length ? this.gaOrgs : this.orgs;
|
|
2483
|
+
const hasAdminFields = directoryOrgs.some((orgArg) => orgArg.status || orgArg.plan);
|
|
2484
|
+
const hasMemberCounts = directoryOrgs.some((orgArg) => orgArg.memberCount !== undefined);
|
|
2485
|
+
const orgRows = directoryOrgs.map((orgArg) => ({
|
|
2481
2486
|
cells: [
|
|
2482
2487
|
html`
|
|
2483
2488
|
<div class="identity-cell">
|
|
@@ -2504,11 +2509,11 @@ export class IdpAdminShell extends DeesElement {
|
|
|
2504
2509
|
}));
|
|
2505
2510
|
|
|
2506
2511
|
return html`
|
|
2507
|
-
${this.renderPageHeader('All Organisations', `${
|
|
2512
|
+
${this.renderPageHeader('All Organisations', `${directoryOrgs.length} organisations on the platform`)}
|
|
2508
2513
|
<div class="body wide-body">
|
|
2509
2514
|
<idp-data-table
|
|
2510
2515
|
title="Organisations"
|
|
2511
|
-
badge=${`${
|
|
2516
|
+
badge=${`${directoryOrgs.length} total`}
|
|
2512
2517
|
empty-title="No organisations"
|
|
2513
2518
|
empty-description="No organisations are visible to this admin session."
|
|
2514
2519
|
.columns=${[
|