@descope/web-components-ui 1.0.290 → 1.0.292

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. package/dist/cjs/index.cjs.js +1336 -912
  2. package/dist/cjs/index.cjs.js.map +1 -1
  3. package/dist/index.d.ts +2 -0
  4. package/dist/index.esm.js +1565 -967
  5. package/dist/index.esm.js.map +1 -1
  6. package/dist/umd/1000.js +1 -1
  7. package/dist/umd/descope-grid-index-js.js +1 -1
  8. package/dist/umd/descope-new-password-descope-new-password-internal-index-js.js +1 -1
  9. package/dist/umd/descope-new-password-index-js.js +1 -1
  10. package/dist/umd/descope-policy-validation-index-js.js +1 -0
  11. package/dist/umd/index.js +1 -1
  12. package/dist/umd/mapping-fields-descope-mappings-field-descope-mapping-item-index-js.js +1 -1
  13. package/dist/umd/mapping-fields-descope-mappings-field-descope-mappings-field-internal-index-js.js +1 -1
  14. package/dist/umd/mapping-fields-descope-mappings-field-index-js.js +2 -2
  15. package/dist/umd/mapping-fields-descope-saml-group-mappings-descope-saml-group-mappings-internal-index-js.js +1 -0
  16. package/dist/umd/mapping-fields-descope-saml-group-mappings-index-js.js +1 -0
  17. package/package.json +1 -1
  18. package/src/components/descope-new-password/NewPasswordClass.js +30 -2
  19. package/src/components/descope-new-password/descope-new-password-internal/NewPasswordInternal.js +51 -3
  20. package/src/components/descope-new-password/index.js +1 -0
  21. package/src/components/descope-policy-validation/PolicyValidationClass.js +220 -0
  22. package/src/components/descope-policy-validation/helpers.js +2 -0
  23. package/src/components/descope-policy-validation/index.js +5 -0
  24. package/src/components/mapping-fields/descope-mappings-field/MappingsFieldClass.js +14 -1
  25. package/src/components/mapping-fields/descope-mappings-field/descope-mapping-item/MappingItem.js +1 -1
  26. package/src/components/mapping-fields/descope-mappings-field/descope-mappings-field-internal/MappingsFieldInternal.js +2 -2
  27. package/src/components/mapping-fields/descope-saml-group-mappings/SamlGroupMappingsClass.js +110 -0
  28. package/src/components/mapping-fields/descope-saml-group-mappings/descope-saml-group-mappings-internal/SamlGroupMappingsInternal.js +136 -0
  29. package/src/components/mapping-fields/descope-saml-group-mappings/descope-saml-group-mappings-internal/index.js +3 -0
  30. package/src/components/mapping-fields/descope-saml-group-mappings/index.js +10 -0
  31. package/src/index.cjs.js +2 -0
  32. package/src/index.d.ts +2 -0
  33. package/src/index.js +2 -0
  34. package/src/mixins/proxyInputMixin.js +7 -0
  35. package/src/theme/components/index.js +4 -0
  36. package/src/theme/components/inputWrapper.js +3 -1
  37. package/src/theme/components/mappingsField.js +3 -1
  38. package/src/theme/components/newPassword.js +5 -0
  39. package/src/theme/components/policyValidation.js +29 -0
  40. package/src/theme/components/samlGroupMappings.js +13 -0
@@ -0,0 +1,136 @@
1
+ import { createBaseInputClass } from '../../../../baseClasses/createBaseInputClass';
2
+ import {
3
+ getComponentName,
4
+ forwardAttrs,
5
+ observeAttributes,
6
+ } from '../../../../helpers/componentHelpers';
7
+
8
+ export const componentName = getComponentName('saml-group-mappings-internal');
9
+
10
+ const BaseInputClass = createBaseInputClass({ componentName, baseSelector: '' });
11
+
12
+ class SamlGroupMappingsInternal extends BaseInputClass {
13
+ static get observedAttributes() {
14
+ return ['invalid'].concat(BaseInputClass.observedAttributes || []);
15
+ }
16
+
17
+ constructor() {
18
+ super();
19
+
20
+ this.innerHTML = `
21
+ <descope-text-field variant="body2" bordered="true"></descope-text-field>
22
+ <descope-mappings-field></descope-mappings-field>
23
+ `;
24
+
25
+ this.groupInputElement = this.querySelector('descope-text-field');
26
+ this.mappingsElement = this.querySelector('descope-mappings-field');
27
+ }
28
+
29
+ resetInvalidIndication() {
30
+ this.removeAttribute('invalid');
31
+ }
32
+
33
+ handleMappingsInvalidChange(changedAttributes) {
34
+ if (changedAttributes.includes('invalid')) {
35
+ if (!this.mappingsElement.hasAttribute('invalid')) {
36
+ this.resetInvalidIndication();
37
+ }
38
+ }
39
+ }
40
+
41
+ initFocusHandler() {
42
+ // This event listener needs to be placed before the super.init() call
43
+ this.addEventListener('focus', (e) => {
44
+ // we want to ignore focus events we are dispatching
45
+ if (e.isTrusted) {
46
+ const focusedElement = this.mappingsElement.checkValidity()
47
+ ? this.groupInputElement
48
+ : this.mappingsElement;
49
+ focusedElement.focus();
50
+ }
51
+ });
52
+ }
53
+
54
+ init() {
55
+ // This needs to be placed before the super.init() call to work
56
+ this.initFocusHandler();
57
+
58
+ super.init?.();
59
+
60
+ forwardAttrs(this, this.groupInputElement, {
61
+ mapAttrs: { 'label-group': 'label' },
62
+ includeAttrs: ['size', 'label-group', 'readonly', 'disabled'],
63
+ });
64
+
65
+ forwardAttrs(this, this.mappingsElement, {
66
+ includeAttrs: [
67
+ 'size',
68
+ 'full-width',
69
+ 'label-value',
70
+ 'label-attr',
71
+ 'button-label',
72
+ 'separator',
73
+ 'options',
74
+ 'readonly',
75
+ 'disabled',
76
+ 'data-errormessage-pattern-mismatch',
77
+ ],
78
+ });
79
+
80
+ // Observing the invalid attribute of the mappings field to reset the invalid state for this component.
81
+ // When an invalid item turns valid, the mappings field will remove the invalid attribute, and at this component
82
+ // level, we need to remove the invalid attribute as well to be able to mark the component as invalid the next time
83
+ observeAttributes(this.mappingsElement, this.handleMappingsInvalidChange.bind(this), {
84
+ includeAttrs: ['invalid'],
85
+ });
86
+ }
87
+
88
+ get value() {
89
+ return {
90
+ group: this.groupInputElement.value,
91
+ mappings: this.mappingsElement.value,
92
+ };
93
+ }
94
+
95
+ set value(value) {
96
+ if (value?.group && typeof value.group === 'string') {
97
+ this.groupInputElement.value = value.group;
98
+ }
99
+ if (Array.isArray(value?.mappings)) {
100
+ this.mappingsElement.value = value.mappings;
101
+ }
102
+ }
103
+
104
+ getValidity() {
105
+ if (!this.groupInputElement.checkValidity()) {
106
+ return this.groupInputElement.validity;
107
+ }
108
+ if (!this.mappingsElement.checkValidity()) {
109
+ return this.mappingsElement.validity;
110
+ }
111
+
112
+ return {};
113
+ }
114
+
115
+ #handleInvalidState(isInvalid) {
116
+ if (isInvalid) {
117
+ if (!this.groupInputElement.checkValidity()) {
118
+ this.groupInputElement.setAttribute('invalid', 'true');
119
+ return;
120
+ }
121
+
122
+ if (!this.mappingsElement.checkValidity()) {
123
+ this.mappingsElement.setAttribute('invalid', 'true');
124
+ }
125
+ }
126
+ }
127
+
128
+ attributeChangedCallback(attrName, oldValue, newValue) {
129
+ super.attributeChangedCallback?.(attrName, oldValue, newValue);
130
+ if (attrName === 'invalid') {
131
+ this.#handleInvalidState(newValue === 'true');
132
+ }
133
+ }
134
+ }
135
+
136
+ export default SamlGroupMappingsInternal;
@@ -0,0 +1,3 @@
1
+ import SamlGroupMappingsInternal, { componentName } from './SamlGroupMappingsInternal';
2
+
3
+ customElements.define(componentName, SamlGroupMappingsInternal);
@@ -0,0 +1,10 @@
1
+ import '@vaadin/custom-field';
2
+
3
+ import { componentName, SamlGroupMappingsClass } from './SamlGroupMappingsClass';
4
+ import '../../descope-text-field';
5
+ import '../descope-mappings-field';
6
+ import './descope-saml-group-mappings-internal';
7
+
8
+ customElements.define(componentName, SamlGroupMappingsClass);
9
+
10
+ export { SamlGroupMappingsClass };
package/src/index.cjs.js CHANGED
@@ -40,3 +40,5 @@ export { MultiSelectComboBoxClass } from './components/descope-multi-select-comb
40
40
  export { AvatarClass } from './components/descope-avatar/AvatarClass';
41
41
  export { UserAttributeClass } from './components/descope-user-attribute/UserAttributeClass';
42
42
  export { MappingsFieldClass } from './components/mapping-fields/descope-mappings-field/MappingsFieldClass';
43
+ export { SamlGroupMappingsClass } from './components/mapping-fields/descope-saml-group-mappings/SamlGroupMappingsClass';
44
+ export { PolicyValidationClass } from './components/descope-policy-validation/PolicyValidationClass';
package/src/index.d.ts CHANGED
@@ -43,6 +43,8 @@ export { NotificationClass } from './components/descope-notification/';
43
43
  export { BadgeClass } from './components/descope-badge/';
44
44
  export { MultiSelectComboBoxClass } from './components/descope-multi-select-combo-box/';
45
45
  export { MappingsFieldClass } from './components/mapping-fields/descope-mappings-field/';
46
+ export { SamlGroupMappingsClass } from './components/mapping-fields/descope-saml-group-mappings/';
47
+ export { PolicyValidationClass } from './components/descope-policy-validation/';
46
48
 
47
49
  export type Theme = {
48
50
  globals: {
package/src/index.js CHANGED
@@ -34,6 +34,8 @@ export * from './components/descope-notification';
34
34
  export * from './components/descope-avatar';
35
35
  export * from './components/mapping-fields/descope-mappings-field';
36
36
  export * from './components/descope-user-attribute';
37
+ export * from './components/mapping-fields/descope-saml-group-mappings';
38
+ export * from './components/descope-policy-validation';
37
39
 
38
40
  export {
39
41
  globalsThemeToStyle,
@@ -40,6 +40,7 @@ const proxyInputMixin =
40
40
  // allows us to set the event that should trigger validation
41
41
  // it can be either a string or an array of strings (for multiple events)
42
42
  inputEvent = 'input',
43
+ triggerValidationEvents = [],
43
44
  // Proxies all validations from the parent component to the input element
44
45
  proxyParentValidation = false,
45
46
  }) =>
@@ -128,6 +129,12 @@ const proxyInputMixin =
128
129
  }
129
130
  };
130
131
 
132
+ triggerValidationEvents.forEach((e) => {
133
+ this.baseElement?.addEventListener(e, () => {
134
+ this.inputElement?.setCustomValidity('');
135
+ });
136
+ });
137
+
131
138
  // on some cases the base element is not ready so the inputElement is empty
132
139
  // we are deferring this section to make sure the base element is ready
133
140
  setTimeout(() => {
@@ -33,6 +33,8 @@ import * as badge from './badge';
33
33
  import * as avatar from './avatar';
34
34
  import * as mappingsField from './mappingsField';
35
35
  import * as userAttribute from './userAttribute';
36
+ import * as samlGroupMappings from './samlGroupMappings';
37
+ import * as policyValidation from './policyValidation';
36
38
 
37
39
  const components = {
38
40
  button,
@@ -71,6 +73,8 @@ const components = {
71
73
  avatar,
72
74
  mappingsField,
73
75
  userAttribute,
76
+ samlGroupMappings,
77
+ policyValidation,
74
78
  };
75
79
 
76
80
  const theme = Object.keys(components).reduce(
@@ -8,11 +8,13 @@ const globalRefs = getThemeRefs(globals);
8
8
  const [theme, refs, vars] = createHelperVars(
9
9
  {
10
10
  labelTextColor: globalRefs.colors.surface.dark,
11
+ labelFontSize: globalRefs.typography.body2.size,
11
12
  valueTextColor: globalRefs.colors.surface.contrast,
12
13
  placeholderTextColor: globalRefs.colors.surface.dark,
13
14
  requiredIndicator: "'*'",
14
- errorMessageTextColor: globalRefs.colors.error.main,
15
15
  helperTextColor: globalRefs.colors.surface.dark,
16
+ errorMessageTextColor: globalRefs.colors.error.main,
17
+ successMessageTextColor: globalRefs.colors.success.main,
16
18
 
17
19
  borderWidth: globalRefs.border.xs,
18
20
  borderRadius: globalRefs.radius.xs,
@@ -13,13 +13,15 @@ export const mappingsField = {
13
13
  [vars.fontSize]: refs.fontSize,
14
14
  [vars.fontFamily]: refs.fontFamily,
15
15
  [vars.separatorFontSize]: '14px',
16
+ [vars.labelsFontSize]: '14px',
17
+ [vars.labelsLineHeight]: '1',
18
+ [vars.labelsMarginBottom]: '6px',
16
19
  [vars.labelTextColor]: refs.labelTextColor,
17
20
  [vars.itemMarginBottom]: '1em',
18
21
  // To be positioned correctly, the min width has to match the text field min width
19
22
  [vars.valueLabelMinWidth]: refs.minWidth,
20
23
  // To be positioned correctly, the min width has to match the combo box field min width
21
24
  [vars.attrLabelMinWidth]: `calc(12em + 2 * ${globalRefs.border.xs})`,
22
- [vars.labelsMarginBottom]: `calc(${globalRefs.typography.body2.size} / 2)`,
23
25
  [vars.separatorWidth]: '70px',
24
26
  [vars.removeButtonWidth]: '60px',
25
27
  };
@@ -1,6 +1,9 @@
1
+ import globals from '../globals';
1
2
  import { NewPasswordClass } from '../../components/descope-new-password/NewPasswordClass';
2
3
  import { refs } from './inputWrapper';
4
+ import { getThemeRefs } from '../../helpers/themeHelpers';
3
5
 
6
+ const globalRefs = getThemeRefs(globals);
4
7
  const vars = NewPasswordClass.cssVarList;
5
8
 
6
9
  const newPassword = {
@@ -11,6 +14,8 @@ const newPassword = {
11
14
  [vars.fontFamily]: refs.fontFamily,
12
15
  [vars.spaceBetweenInputs]: '1em',
13
16
  [vars.errorMessageTextColor]: refs.errorMessageTextColor,
17
+ [vars.policyPreviewBackgroundColor]: 'none',
18
+ [vars.policyPreviewPadding]: globalRefs.spacing.lg,
14
19
 
15
20
  _required: {
16
21
  // NewPassword doesn't pass `required` attribute to its Password components.
@@ -0,0 +1,29 @@
1
+ import globals from '../globals';
2
+ import { getThemeRefs } from '../../helpers/themeHelpers';
3
+ import { PolicyValidationClass } from '../../components/descope-policy-validation/PolicyValidationClass';
4
+ import { refs } from './inputWrapper';
5
+
6
+ const globalRefs = getThemeRefs(globals);
7
+ const vars = PolicyValidationClass.cssVarList;
8
+
9
+ const policyValidation = {
10
+ [vars.fontFamily]: refs.fontFamily,
11
+ [vars.fontSize]: refs.labelFontSize,
12
+ [vars.textColor]: refs.labelTextColor,
13
+ [vars.borderWidth]: refs.borderWidth,
14
+ [vars.borderStyle]: refs.borderStyle,
15
+ [vars.borderColor]: refs.borderColor,
16
+ [vars.borderRadius]: globalRefs.radius.sm,
17
+ [vars.backgroundColor]: 'none',
18
+ [vars.padding]: '0px',
19
+ [vars.labelMargin]: globalRefs.spacing.sm,
20
+ [vars.itemsSpacing]: globalRefs.spacing.lg,
21
+ [vars.itemSymbolDefault]: "'\\2022'", // "•"
22
+ [vars.itemSymbolSuccess]: "'\\2713'", // "✓"
23
+ [vars.itemSymbolError]: "'\\2A09'", // "⨉"
24
+ [vars.itemSymbolSuccessColor]: globalRefs.colors.success.main,
25
+ [vars.itemSymbolErrorColor]: globalRefs.colors.error.main,
26
+ };
27
+
28
+ export default policyValidation;
29
+ export { vars };
@@ -0,0 +1,13 @@
1
+ import { SamlGroupMappingsClass } from '../../components/mapping-fields/descope-saml-group-mappings/SamlGroupMappingsClass';
2
+ import { refs } from './inputWrapper';
3
+
4
+ const vars = SamlGroupMappingsClass.cssVarList;
5
+
6
+ export const samlGroupMappings = {
7
+ [vars.hostWidth]: refs.width,
8
+ [vars.hostDirection]: refs.direction,
9
+ [vars.groupNameInputMarginBottom]: '1em',
10
+ };
11
+
12
+ export default samlGroupMappings;
13
+ export { vars };