@descope/web-components-ui 1.0.347 → 1.0.349

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. package/dist/cjs/index.cjs.js +208 -13
  2. package/dist/cjs/index.cjs.js.map +1 -1
  3. package/dist/index.esm.js +393 -159
  4. package/dist/index.esm.js.map +1 -1
  5. package/dist/umd/1000.js +1 -0
  6. package/dist/umd/1612.js +116 -4
  7. package/dist/umd/1765.js +1 -0
  8. package/dist/umd/3227.js +17 -0
  9. package/dist/umd/4024.js +116 -4
  10. package/dist/umd/4028.js +121 -9
  11. package/dist/umd/4052.js +116 -4
  12. package/dist/umd/4392.js +1 -1
  13. package/dist/umd/5135.js +2 -2
  14. package/dist/umd/602.js +114 -2
  15. package/dist/umd/9562.js +116 -4
  16. package/dist/umd/DescopeDev.js +1 -1
  17. package/dist/umd/boolean-fields-descope-boolean-field-internal-index-js.js +1 -1
  18. package/dist/umd/boolean-fields-descope-checkbox-index-js.js +1 -1
  19. package/dist/umd/boolean-fields-descope-switch-toggle-index-js.js +1 -1
  20. package/dist/umd/button-selection-group-fields-descope-button-multi-selection-group-index-js.js +1 -1
  21. package/dist/umd/button-selection-group-fields-descope-button-multi-selection-group-internal-index-js.js +1 -1
  22. package/dist/umd/button-selection-group-fields-descope-button-selection-group-index-js.js +1 -1
  23. package/dist/umd/button-selection-group-fields-descope-button-selection-group-internal-index-js.js +1 -1
  24. package/dist/umd/button-selection-group-fields-descope-button-selection-group-item-index-js.js +1 -1
  25. package/dist/umd/descope-avatar-index-js.js +1 -1
  26. package/dist/umd/descope-badge-index-js.js +1 -1
  27. package/dist/umd/descope-button-index-js.js +116 -4
  28. package/dist/umd/descope-code-snippet-index-js.js +1 -1
  29. package/dist/umd/descope-combo-box-index-js.js +1 -1
  30. package/dist/umd/descope-container-index-js.js +1 -1
  31. package/dist/umd/descope-date-picker-index-js.js +1 -1
  32. package/dist/umd/descope-divider-index-js.js +1 -1
  33. package/dist/umd/descope-email-field-index-js.js +1 -1
  34. package/dist/umd/descope-enriched-text-index-js.js +1 -1
  35. package/dist/umd/descope-grid-descope-grid-custom-column-index-js.js +3 -3
  36. package/dist/umd/descope-grid-descope-grid-item-details-column-index-js.js +90 -0
  37. package/dist/umd/descope-grid-descope-grid-item-details-column-index-js.js.LICENSE.txt +17 -0
  38. package/dist/umd/descope-grid-descope-grid-selection-column-index-js.js +1 -1
  39. package/dist/umd/descope-grid-descope-grid-text-column-index-js.js +1 -1
  40. package/dist/umd/descope-grid-index-js.js +1 -1
  41. package/dist/umd/descope-icon-index-js.js +1 -1
  42. package/dist/umd/descope-image-index-js.js +1 -1
  43. package/dist/umd/descope-link-index-js.js +1 -1
  44. package/dist/umd/descope-loader-linear-index-js.js +1 -1
  45. package/dist/umd/descope-loader-radial-index-js.js +1 -1
  46. package/dist/umd/descope-logo-index-js.js +1 -1
  47. package/dist/umd/descope-modal-index-js.js +1 -1
  48. package/dist/umd/descope-multi-select-combo-box-index-js.js +1 -1
  49. package/dist/umd/descope-new-password-descope-new-password-internal-index-js.js +1 -1
  50. package/dist/umd/descope-new-password-index-js.js +1 -1
  51. package/dist/umd/descope-notification-descope-notification-card-index-js.js +1 -1
  52. package/dist/umd/descope-notification-index-js.js +1 -1
  53. package/dist/umd/descope-notp-image-index-js.js +1 -1
  54. package/dist/umd/descope-number-field-index-js.js +1 -1
  55. package/dist/umd/descope-passcode-descope-passcode-internal-index-js.js +1 -1
  56. package/dist/umd/descope-passcode-index-js.js +1 -1
  57. package/dist/umd/descope-password-index-js.js +1 -1
  58. package/dist/umd/descope-policy-validation-index-js.js +1 -1
  59. package/dist/umd/descope-radio-group-index-js.js +1 -1
  60. package/dist/umd/descope-recaptcha-index-js.js +1 -1
  61. package/dist/umd/descope-text-area-index-js.js +1 -1
  62. package/dist/umd/descope-text-field-index-js.js +1 -1
  63. package/dist/umd/descope-text-index-js.js +1 -1
  64. package/dist/umd/descope-totp-image-index-js.js +1 -1
  65. package/dist/umd/descope-upload-file-index-js.js +1 -1
  66. package/dist/umd/descope-user-attribute-index-js.js +1 -1
  67. package/dist/umd/descope-user-auth-method-index-js.js +1 -1
  68. package/dist/umd/index.js +1 -1
  69. package/dist/umd/mapping-fields-descope-mappings-field-descope-mapping-item-index-js.js +1 -1
  70. package/dist/umd/mapping-fields-descope-mappings-field-descope-mappings-field-internal-index-js.js +1 -1
  71. package/dist/umd/mapping-fields-descope-mappings-field-index-js.js +1 -1
  72. package/dist/umd/mapping-fields-descope-saml-group-mappings-descope-saml-group-mappings-internal-index-js.js +1 -1
  73. package/dist/umd/mapping-fields-descope-saml-group-mappings-index-js.js +1 -1
  74. package/dist/umd/phone-fields-descope-phone-field-descope-phone-field-internal-index-js.js +1 -1
  75. package/dist/umd/phone-fields-descope-phone-field-index-js.js +1 -1
  76. package/dist/umd/phone-fields-descope-phone-input-box-field-index-js.js +1 -1
  77. package/package.json +1 -1
  78. package/src/components/descope-enriched-text/EnrichedTextClass.js +2 -4
  79. package/src/components/descope-grid/GridClass.js +116 -6
  80. package/src/components/descope-grid/descope-grid-item-details-column/GridItemDetailsColumnClass.js +37 -0
  81. package/src/components/descope-grid/descope-grid-item-details-column/index.js +8 -0
  82. package/src/components/descope-grid/helpers.js +54 -0
  83. package/src/components/descope-grid/index.js +1 -0
  84. package/src/components/descope-link/LinkClass.js +3 -5
  85. package/src/components/descope-radio-group/RadioButtonClass.js +3 -0
  86. package/src/helpers/index.js +8 -0
  87. package/src/mixins/createProxy.js +1 -1
  88. package/src/theme/components/enrichedText.js +2 -0
  89. package/src/theme/components/grid.js +11 -0
  90. package/src/theme/components/link.js +4 -0
  91. package/src/theme/components/radioGroup/radioButton.js +2 -0
  92. package/dist/umd/2362.js +0 -129
  93. package/dist/umd/4978.js +0 -1
  94. /package/dist/umd/{2362.js.LICENSE.txt → 3227.js.LICENSE.txt} +0 -0
@@ -1 +1 @@
1
- "use strict";(self.webpackChunk_descope_web_components_ui=self.webpackChunk_descope_web_components_ui||[]).push([[5119],{84049:(e,t,r)=>{r.d(t,{H:()=>f,f:()=>l});var o=r(2061),n=r(54567),i=r(54201),a=r(94978);const l=(0,n.iY)("combo-box"),{host:s,inputField:p,inputElement:d,placeholder:u,toggle:c,clearButton:h,label:b,requiredIndicator:m,helperText:y,errorMessage:g}={host:{selector:()=>":host"},inputField:{selector:"::part(input-field)"},inputElement:{selector:"input"},placeholder:{selector:"> input:placeholder-shown"},toggle:{selector:"::part(toggle-button)"},clearButton:{selector:"::part(clear-button)"},label:{selector:"::part(label)"},requiredIndicator:{selector:"[required]::part(required-indicator)::after"},helperText:{selector:"::part(helper-text)"},errorMessage:{selector:"::part(error-message)"}},f=(0,o.qC)((0,a.yk)({mappings:{hostWidth:{...s,property:"width"},hostDirection:{...s,property:"direction"},fontSize:[{},s],fontFamily:[b,u,p,y,g],labelFontSize:{...b,property:"font-size"},labelFontWeight:{...b,property:"font-weight"},labelTextColor:[{...b,property:"color"},{...m,property:"color"}],errorMessageTextColor:{...g,property:"color"},inputHeight:{...p,property:"height"},inputBackgroundColor:{...p,property:"background-color"},inputBorderColor:{...p,property:"border-color"},inputBorderWidth:{...p,property:"border-width"},inputBorderStyle:{...p,property:"border-style"},inputBorderRadius:{...p,property:"border-radius"},labelRequiredIndicator:{...m,property:"content"},inputValueTextColor:{...p,property:"color"},inputPlaceholderTextColor:{...u,property:"color"},inputDropdownButtonCursor:[{...c,property:"cursor"},{...h,property:"cursor"}],inputDropdownButtonColor:[{...c,property:"color"},{...h,property:"color"}],inputDropdownButtonSize:[{...c,property:"font-size"},{...h,property:"font-size"}],inputDropdownButtonOffset:[{...c,property:"margin-right"},{...c,property:"margin-left"}],inputOutlineColor:{...p,property:"outline-color"},inputOutlineWidth:{...p,property:"outline-width"},inputOutlineStyle:{...p,property:"outline-style"},inputOutlineOffset:{...p,property:"outline-offset"},inputHorizontalPadding:[{...d,property:"padding-left"},{...d,property:"padding-right"}],labelPosition:{...b,property:"position"},labelTopPosition:{...b,property:"top"},labelHorizontalPosition:[{...b,property:"left"},{...b,property:"right"}],inputTransformY:{...b,property:"transform"},inputTransition:{...b,property:"transition"},marginInlineStart:{...b,property:"margin-inline-start"},placeholderOpacity:{...u,property:"opacity"},inputVerticalAlignment:{...p,property:"align-items"},valueInputHeight:{...d,property:"height"},valueInputMarginBottom:{...d,property:"margin-bottom"},overlayBackground:{property:()=>f.cssVarList.overlay.backgroundColor},overlayTextColor:{property:()=>f.cssVarList.overlay.textColor},overlayBorder:{property:()=>f.cssVarList.overlay.border},overlayFontSize:{property:()=>f.cssVarList.overlay.fontSize},overlayFontFamily:{property:()=>f.cssVarList.overlay.fontFamily},overlayCursor:{property:()=>f.cssVarList.overlay.cursor},overlayItemBoxShadow:{property:()=>f.cssVarList.overlay.itemBoxShadow},overlayItemPaddingInlineStart:{property:()=>f.cssVarList.overlay.itemPaddingInlineStart},overlayItemPaddingInlineEnd:{property:()=>f.cssVarList.overlay.itemPaddingInlineEnd}}}),a.e4,(0,a.Iw)({name:"overlay",selector:"",mappings:{backgroundColor:{selector:"vaadin-combo-box-scroller"},minHeight:{selector:"vaadin-combo-box-overlay"},margin:{selector:"vaadin-combo-box-overlay"},cursor:{selector:"vaadin-combo-box-item"},fontFamily:{selector:"vaadin-combo-box-item"},textColor:{selector:"vaadin-combo-box-item",property:"color"},fontSize:{selector:"vaadin-combo-box-item"},itemBoxShadow:{selector:"vaadin-combo-box-item",property:"box-shadow"},itemPaddingInlineStart:{selector:"vaadin-combo-box-item",property:"padding-inline-start"},itemPaddingInlineEnd:{selector:"vaadin-combo-box-item",property:"padding-inline-end"}},forward:{include:!1,attributes:["size"]}}),(0,a.dj)({proxyProps:["selectionStart"],inputEvent:"selected-item-changed"}),a.Ae,(e=>class extends e{static get observedAttributes(){return["label-type"]}#e=({displayName:e,value:t,label:r})=>`<span data-name="${r}" data-id="${t}">${e||r}</span>`;#t;get defaultValue(){return this.getAttribute("default-value")}get renderItem(){return this.#e}set renderItem(e){this.#e=e,this.renderItems()}get data(){if(this.#t)return this.#t;const e=this.getAttribute("data");if(e)try{const t=JSON.parse(e);if(this.isValidDataType(t))return t}catch(e){console.error('could not parse data string from attribute "data" -',e.message)}return[]}set data(e){this.isValidDataType(e)&&(this.#t=e,this.renderItems())}isValidDataType(e){const t=Array.isArray(e);return t||console.error("data must be an array, received:",e),t}getItemsTemplate(){return this.data?.reduce?.(((e,t)=>e+(this.renderItem?.(t||{})||"")),"")}renderItems(){const e=this.getItemsTemplate();e&&(this.innerHTML=e)}handleSelectedItem(){const e=this.baseElement.selectedItem?.["data-id"];this.baseElement.selectedItem=void 0,e&&(this.value=e),this.value||this.setDefaultValue()}customValueTransformFn(e){return e}setComboBoxDescriptor(){const e=Object.getOwnPropertyDescriptor(this.inputElement.constructor.prototype,"value"),t=this;Object.defineProperties(this.inputElement,{value:{...e,set(r){if(!t.baseElement.items?.length)return;const o=t.customValueTransformFn(r)||"";o!==this.value&&e.set.call(this,o)}}})}#r(){const e=this.shadowRoot.querySelector(this.baseSelector),t=Array.from(this.children);t.length&&(t.forEach((e=>{Object.defineProperty(e,"data-name",{value:e.getAttribute("data-name"),configurable:!0,writable:!0}),Object.defineProperty(e,"data-id",{value:e.getAttribute("data-id"),configurable:!0,writable:!0})})),e.items=t,setTimeout((()=>{this.handleSelectedItem()}),0)),e.renderer=(e,t,r)=>{e.innerHTML=r.item.outerHTML}}#o(){const e=this.baseElement.shadowRoot.querySelector("vaadin-combo-box-overlay");e._attachOverlay=()=>{e.bringToFront()},e._detachOverlay=()=>{},e._enterModalState=()=>{}}init(){super.init?.(),this.getValidity=function(){return!this.value&&this.isRequired?{valueMissing:!0}:{}},this.setComboBoxDescriptor(),this.#o(),this.renderItems(),(0,n.FX)(this,this.renderItems.bind(this),{includeAttrs:["data"]}),(0,n.P$)(this,this.#r.bind(this)),this.setDefaultValue(),this.baseElement.addEventListener("selected-item-changed",(()=>{this.dispatchEvent(new Event("input",{bubbles:!0,composed:!0}))}))}onLabelClick(){this.isReadOnly||this.isDisabled||(this.focus(),this.setAttribute("opened","true"))}attributeChangedCallback(e,t,r){super.attributeChangedCallback?.(e,t,r),t!==r&&"label-type"===e&&("floating"===r?this.addEventListener("click",this.onLabelClick):this.removeEventListener("click",this.onLabelClick))}setDefaultValue(){this.value=this.defaultValue}set value(e){if(e){const t=this.baseElement.items?.find((t=>t["data-id"]===e));t&&(this.baseElement.selectedItem=t)}else this.baseElement.selectedItem=void 0}get value(){return this.baseElement.selectedItem?.["data-id"]||""}}))((0,a.DM)({slots:["","prefix"],wrappedEleName:"vaadin-combo-box",style:()=>`\n\t\t:host {\n\t\t\tdisplay: inline-flex;\n\t\t\tbox-sizing: border-box;\n\t\t\t-webkit-mask-image: none;\n\t\t}\n\t\t${(0,i.bi)(f.cssVarList)}\n\t\t${(0,i.PH)("vaadin-combo-box")}\n\t\t${(0,i.jI)("vaadin-combo-box")}\n\t\t${(0,i.Pd)("vaadin-combo-box")}\n\n\t\tvaadin-combo-box {\n\t\t\tpadding: 0;\n\t\t\twidth: 100%;\n\t\t}\n\t\tvaadin-combo-box::before {\n\t\t\theight: initial;\n\t\t}\n\t\tvaadin-combo-box [slot="input"] {\n\t\t\t-webkit-mask-image: none;\n\t\t\tmin-height: 0;\n\t\t\tbox-sizing: border-box;\n\t\t}\n\n\t\tvaadin-combo-box::part(input-field) {\n\t\t\tpadding: 0;\n\t\t\tbox-shadow: none;\n\t\t}\n\n vaadin-combo-box::part(toggle-button),\n vaadin-combo-box::part(clear-button) {\n align-self: center;\n }\n\n vaadin-combo-box[label-type="floating"]:not([focused])[readonly] > input:placeholder-shown {\n opacity: 0;\n }\n vaadin-combo-box[label-type="floating"]:not([focused])[disabled] > input:placeholder-shown {\n opacity: 0;\n }\n \n ${(0,i.Wf)("vaadin-combo-box")}\n ${(0,i.bz)()}\n\t\t`,excludeAttrsSync:["tabindex","size","data"],componentName:l,includeForwardProps:["items","renderer","selectedItem"]}))},21294:(e,t,r)=>{r.r(t),r.d(t,{ComboBoxClass:()=>o.H}),r(47583);var o=r(84049);customElements.define(o.f,o.H)},41377:(e,t,r)=>{r.d(t,{Z:()=>d,f:()=>a});var o=r(73878),n=r(54567),i=r(16418);const a=(0,n.iY)("phone-field-internal-input-box"),l=["disabled","size","bordered","invalid","readonly","phone-input-placeholder","name","autocomplete","label-type"],s={"phone-input-placeholder":"placeholder"},p=(0,o.P)({componentName:a,baseSelector:"div"}),d=class extends p{static get observedAttributes(){return[].concat(p.observedAttributes||[],l)}constructor(){super(),this.innerHTML='\n <div>\n <descope-text-field tabindex="1"></descope-text-field>\n </div>\n ',this.phoneNumberInput=this.querySelector("descope-text-field")}get defaultCountryCode(){return(0,i.g)(this.getAttribute("default-code"))}get hasDefaultCode(){return!!this.getAttribute("default-code")}get value(){if(!this.phoneNumberValue)return"";if(this.hasDefaultCode){const e=new RegExp(`\\+?${parseInt(this.defaultCountryCode,10)}--?`);return`${this.defaultCountryCode}-${this.phoneNumberInput.value.replace(e,"")}`}return this.phoneNumberInput.value}set value(e){this.phoneNumberInput.value=e}get phoneNumberValue(){return this.phoneNumberInput.value}get minLength(){return parseInt(this.getAttribute("minlength"),10)||0}get maxLength(){return parseInt(this.getAttribute("maxlength"),10)||50}getValidity(){const e=this.value.replace(/\D/g,"");return this.isRequired&&!this.value?{valueMissing:!0}:e.length<this.minLength?{tooShort:!0}:e.length>this.maxLength?{tooLong:!0}:/^\+?\d{1,4}-?(?:\d-?){1,15}$/.test(this.value)?{}:{patternMismatch:!0}}init(){this.addEventListener("focus",(e=>{e.isTrusted&&this.phoneNumberInput.focus()})),super.init?.(),this.initInputs()}getCountryByDialCode(e){return this.countryCodeInput.items?.find((t=>t.getAttribute("data-country-code")===e))}initInputs(){this.phoneNumberInput.addEventListener("input",(e=>{1===e.target.value.length&&"-"===e.target.value&&(e.target.value=""),e.target.value=e.target.value.replace(/(?!^)\+/g,"").replace("--","-").replace("+-","+");const t=/^[+\d-]+$/,r=e.target.value.split("").filter((e=>t.test(e))).join("");e.target.value=r})),this.handleFocusEventsDispatching([this.phoneNumberInput]),this.handleInputEventDispatching()}attributeChangedCallback(e,t,r){if(super.attributeChangedCallback(e,t,r),t!==r&&l.includes(e)){const t=s[e]||e;this.phoneNumberInput.setAttribute(t,r)}}}},83067:(e,t,r)=>{r.r(t),r(19357);var o=r(41377);customElements.define(o.f,o.Z)},69423:(e,t,r)=>{r.r(t),r.d(t,{PhoneFieldInputBoxClass:()=>x}),r(83067),r(21294),r(19357);var o=r(41377),n=r(54567),i=r(2061),a=r(94978),l=r(56417),s=r(87262),p=r(54201);const d=l.z.cssVarList,u=(0,n.iY)("phone-input-box-field"),{host:c,label:h,inputElement:b,requiredIndicator:m,inputField:y,phoneInput:g,errorMessage:f,helperText:v}={host:{selector:()=>":host"},label:{selector:"::part(label)"},placeholder:{selector:"> input:placeholder-shown"},inputElement:{selector:"input"},requiredIndicator:{selector:"[required]::part(required-indicator)::after"},inputField:{selector:"::part(input-field)"},phoneInput:{selector:()=>"descope-text-field"},helperText:{selector:"::part(helper-text)"},errorMessage:{selector:"::part(error-message)"}},x=(0,i.qC)((0,a.yk)({mappings:{fontSize:[c,y,{selector:l.z.componentName,property:l.z.cssVarList.fontSize}],fontFamily:[h,f,v],hostWidth:{...c,property:"width"},hostMinWidth:{...c,property:"min-width"},hostDirection:{...c,property:"direction"},inputBorderStyle:{...y,property:"border-style"},inputBorderWidth:{...y,property:"border-width"},inputBorderColor:{...y,property:"border-color"},inputBorderRadius:{...y,property:"border-radius"},inputHorizontalPadding:[{...g,property:"padding-left"},{...g,property:"padding-right"}],labelFontSize:{...h,property:"font-size"},labelFontWeight:{...h,property:"font-weight"},labelTextColor:[{...h,property:"color"},{...m,property:"color"}],labelRequiredIndicator:{...m,property:"content"},errorMessageTextColor:{...f,property:"color"},inputValueTextColor:{...g,property:d.inputValueTextColor},inputPlaceholderTextColor:{...g,property:d.inputPlaceholderColor},inputOutlineStyle:{...y,property:"outline-style"},inputOutlineColor:{...y,property:"outline-color"},inputOutlineWidth:{...y,property:"outline-width"},inputOutlineOffset:{...y,property:"outline-offset"},labelPosition:{...h,property:"position"},labelTopPosition:{...h,property:"top"},labelHorizontalPosition:[{...h,property:"left"},{...h,property:"right"}],inputTransformY:{...h,property:"transform"},inputTransition:{...h,property:"transition"},marginInlineStart:{...h,property:"margin-inline-start"},valueInputHeight:{...b,property:"height"},valueInputMarginBottom:{selector:l.z.componentName,property:d.valueInputMarginBottom}}}),a.e4,(0,a.dj)({proxyProps:["value","selectionStart"]}),(e=>class extends e{static get CountryCodes(){return s.Z}init(){super.init?.();const e=document.createElement("template");e.innerHTML=`\n\t\t\t\t<${o.f}\n\t\t\t\t\ttabindex="-1"\n\t\t\t\t\tslot="input"\n\t\t\t\t></${o.f}>\n `,this.baseElement.appendChild(e.content.cloneNode(!0)),this.inputElement=this.shadowRoot.querySelector(o.f),(0,n.oP)(this.shadowRoot.host,this.inputElement,{includeAttrs:["size","bordered","invalid","minlength","maxlength","default-code","disabled","phone-input-placeholder","label","label-type"]})}}))((0,a.DM)({slots:[],wrappedEleName:"vaadin-text-field",style:()=>`\n :host {\n display: inline-flex;\n max-width: 100%;\n box-sizing: border-box;\n }\n ${(0,p.bi)(x.cssVarList)}\n ${(0,p.Pd)("vaadin-text-field")}\n ${(0,p.B)("vaadin-text-field")}\n ${(0,p.DY)()}\n\n vaadin-text-field {\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n padding: 0;\n }\n vaadin-text-field[focus-ring]::part(input-field) {\n box-shadow: none;\n }\n vaadin-text-field::before {\n height: 0;\n }\n vaadin-text-field::part(input-field) {\n padding: 0;\n background: transparent;\n overflow: hidden;\n -webkit-mask-image: none;\n }\n descope-phone-field-internal-input-box {\n -webkit-mask-image: none;\n padding: 0;\n width: 100%;\n height: 100%;\n }\n descope-phone-field-internal-input-box > div {\n width: 100%;\n height: 100%;\n }\n descope-phone-field-internal-input-box .separator {\n flex: 0;\n border: none;\n }\n descope-text-field {\n flex-grow: 1;\n width: 100%;\n ${d.inputOutlineWidth}: 0;\n ${d.inputOutlineOffset}: 0;\n ${d.inputBorderWidth}: 0;\n ${d.inputBorderRadius}: 0;\n direction: ltr;\n }\n vaadin-text-field[readonly] > input:placeholder-shown {\n opacity: 1;\n }\n vaadin-text-field::part(input-field)::after {\n border: none;\n }\n\n vaadin-text-field[label-type="floating"]:not([focused])[readonly] input:placeholder-shown {\n opacity: 0;\n }\n vaadin-text-field[label-type="floating"]:not([focused])[disabled] input:placeholder-shown {\n opacity: 0;\n }\n\n ${(0,p.Wf)("vaadin-text-field")}\n ${(0,p.bz)()}\n\t\t`,excludeAttrsSync:["tabindex"],componentName:u}));customElements.define(u,x)},16418:(e,t,r)=>{r.d(t,{g:()=>n});var o=r(87262);const n=e=>o.Z.find((t=>t.code===e))?.dialCode}}]);
1
+ "use strict";(self.webpackChunk_descope_web_components_ui=self.webpackChunk_descope_web_components_ui||[]).push([[5119],{84049:(e,t,r)=>{r.d(t,{H:()=>f,f:()=>l});var o=r(2061),n=r(54567),i=r(54201),a=r(21e3);const l=(0,n.iY)("combo-box"),{host:s,inputField:p,inputElement:d,placeholder:u,toggle:c,clearButton:h,label:b,requiredIndicator:m,helperText:y,errorMessage:g}={host:{selector:()=>":host"},inputField:{selector:"::part(input-field)"},inputElement:{selector:"input"},placeholder:{selector:"> input:placeholder-shown"},toggle:{selector:"::part(toggle-button)"},clearButton:{selector:"::part(clear-button)"},label:{selector:"::part(label)"},requiredIndicator:{selector:"[required]::part(required-indicator)::after"},helperText:{selector:"::part(helper-text)"},errorMessage:{selector:"::part(error-message)"}},f=(0,o.qC)((0,a.yk)({mappings:{hostWidth:{...s,property:"width"},hostDirection:{...s,property:"direction"},fontSize:[{},s],fontFamily:[b,u,p,y,g],labelFontSize:{...b,property:"font-size"},labelFontWeight:{...b,property:"font-weight"},labelTextColor:[{...b,property:"color"},{...m,property:"color"}],errorMessageTextColor:{...g,property:"color"},inputHeight:{...p,property:"height"},inputBackgroundColor:{...p,property:"background-color"},inputBorderColor:{...p,property:"border-color"},inputBorderWidth:{...p,property:"border-width"},inputBorderStyle:{...p,property:"border-style"},inputBorderRadius:{...p,property:"border-radius"},labelRequiredIndicator:{...m,property:"content"},inputValueTextColor:{...p,property:"color"},inputPlaceholderTextColor:{...u,property:"color"},inputDropdownButtonCursor:[{...c,property:"cursor"},{...h,property:"cursor"}],inputDropdownButtonColor:[{...c,property:"color"},{...h,property:"color"}],inputDropdownButtonSize:[{...c,property:"font-size"},{...h,property:"font-size"}],inputDropdownButtonOffset:[{...c,property:"margin-right"},{...c,property:"margin-left"}],inputOutlineColor:{...p,property:"outline-color"},inputOutlineWidth:{...p,property:"outline-width"},inputOutlineStyle:{...p,property:"outline-style"},inputOutlineOffset:{...p,property:"outline-offset"},inputHorizontalPadding:[{...d,property:"padding-left"},{...d,property:"padding-right"}],labelPosition:{...b,property:"position"},labelTopPosition:{...b,property:"top"},labelHorizontalPosition:[{...b,property:"left"},{...b,property:"right"}],inputTransformY:{...b,property:"transform"},inputTransition:{...b,property:"transition"},marginInlineStart:{...b,property:"margin-inline-start"},placeholderOpacity:{...u,property:"opacity"},inputVerticalAlignment:{...p,property:"align-items"},valueInputHeight:{...d,property:"height"},valueInputMarginBottom:{...d,property:"margin-bottom"},overlayBackground:{property:()=>f.cssVarList.overlay.backgroundColor},overlayTextColor:{property:()=>f.cssVarList.overlay.textColor},overlayBorder:{property:()=>f.cssVarList.overlay.border},overlayFontSize:{property:()=>f.cssVarList.overlay.fontSize},overlayFontFamily:{property:()=>f.cssVarList.overlay.fontFamily},overlayCursor:{property:()=>f.cssVarList.overlay.cursor},overlayItemBoxShadow:{property:()=>f.cssVarList.overlay.itemBoxShadow},overlayItemPaddingInlineStart:{property:()=>f.cssVarList.overlay.itemPaddingInlineStart},overlayItemPaddingInlineEnd:{property:()=>f.cssVarList.overlay.itemPaddingInlineEnd}}}),a.e4,(0,a.Iw)({name:"overlay",selector:"",mappings:{backgroundColor:{selector:"vaadin-combo-box-scroller"},minHeight:{selector:"vaadin-combo-box-overlay"},margin:{selector:"vaadin-combo-box-overlay"},cursor:{selector:"vaadin-combo-box-item"},fontFamily:{selector:"vaadin-combo-box-item"},textColor:{selector:"vaadin-combo-box-item",property:"color"},fontSize:{selector:"vaadin-combo-box-item"},itemBoxShadow:{selector:"vaadin-combo-box-item",property:"box-shadow"},itemPaddingInlineStart:{selector:"vaadin-combo-box-item",property:"padding-inline-start"},itemPaddingInlineEnd:{selector:"vaadin-combo-box-item",property:"padding-inline-end"}},forward:{include:!1,attributes:["size"]}}),(0,a.dj)({proxyProps:["selectionStart"],inputEvent:"selected-item-changed"}),a.Ae,(e=>class extends e{static get observedAttributes(){return["label-type"]}#e=({displayName:e,value:t,label:r})=>`<span data-name="${r}" data-id="${t}">${e||r}</span>`;#t;get defaultValue(){return this.getAttribute("default-value")}get renderItem(){return this.#e}set renderItem(e){this.#e=e,this.renderItems()}get data(){if(this.#t)return this.#t;const e=this.getAttribute("data");if(e)try{const t=JSON.parse(e);if(this.isValidDataType(t))return t}catch(e){console.error('could not parse data string from attribute "data" -',e.message)}return[]}set data(e){this.isValidDataType(e)&&(this.#t=e,this.renderItems())}isValidDataType(e){const t=Array.isArray(e);return t||console.error("data must be an array, received:",e),t}getItemsTemplate(){return this.data?.reduce?.(((e,t)=>e+(this.renderItem?.(t||{})||"")),"")}renderItems(){const e=this.getItemsTemplate();e&&(this.innerHTML=e)}handleSelectedItem(){const e=this.baseElement.selectedItem?.["data-id"];this.baseElement.selectedItem=void 0,e&&(this.value=e),this.value||this.setDefaultValue()}customValueTransformFn(e){return e}setComboBoxDescriptor(){const e=Object.getOwnPropertyDescriptor(this.inputElement.constructor.prototype,"value"),t=this;Object.defineProperties(this.inputElement,{value:{...e,set(r){if(!t.baseElement.items?.length)return;const o=t.customValueTransformFn(r)||"";o!==this.value&&e.set.call(this,o)}}})}#r(){const e=this.shadowRoot.querySelector(this.baseSelector),t=Array.from(this.children);t.length&&(t.forEach((e=>{Object.defineProperty(e,"data-name",{value:e.getAttribute("data-name"),configurable:!0,writable:!0}),Object.defineProperty(e,"data-id",{value:e.getAttribute("data-id"),configurable:!0,writable:!0})})),e.items=t,setTimeout((()=>{this.handleSelectedItem()}),0)),e.renderer=(e,t,r)=>{e.innerHTML=r.item.outerHTML}}#o(){const e=this.baseElement.shadowRoot.querySelector("vaadin-combo-box-overlay");e._attachOverlay=()=>{e.bringToFront()},e._detachOverlay=()=>{},e._enterModalState=()=>{}}init(){super.init?.(),this.getValidity=function(){return!this.value&&this.isRequired?{valueMissing:!0}:{}},this.setComboBoxDescriptor(),this.#o(),this.renderItems(),(0,n.FX)(this,this.renderItems.bind(this),{includeAttrs:["data"]}),(0,n.P$)(this,this.#r.bind(this)),this.setDefaultValue(),this.baseElement.addEventListener("selected-item-changed",(()=>{this.dispatchEvent(new Event("input",{bubbles:!0,composed:!0}))}))}onLabelClick(){this.isReadOnly||this.isDisabled||(this.focus(),this.setAttribute("opened","true"))}attributeChangedCallback(e,t,r){super.attributeChangedCallback?.(e,t,r),t!==r&&"label-type"===e&&("floating"===r?this.addEventListener("click",this.onLabelClick):this.removeEventListener("click",this.onLabelClick))}setDefaultValue(){this.value=this.defaultValue}set value(e){if(e){const t=this.baseElement.items?.find((t=>t["data-id"]===e));t&&(this.baseElement.selectedItem=t)}else this.baseElement.selectedItem=void 0}get value(){return this.baseElement.selectedItem?.["data-id"]||""}}))((0,a.DM)({slots:["","prefix"],wrappedEleName:"vaadin-combo-box",style:()=>`\n\t\t:host {\n\t\t\tdisplay: inline-flex;\n\t\t\tbox-sizing: border-box;\n\t\t\t-webkit-mask-image: none;\n\t\t}\n\t\t${(0,i.bi)(f.cssVarList)}\n\t\t${(0,i.PH)("vaadin-combo-box")}\n\t\t${(0,i.jI)("vaadin-combo-box")}\n\t\t${(0,i.Pd)("vaadin-combo-box")}\n\n\t\tvaadin-combo-box {\n\t\t\tpadding: 0;\n\t\t\twidth: 100%;\n\t\t}\n\t\tvaadin-combo-box::before {\n\t\t\theight: initial;\n\t\t}\n\t\tvaadin-combo-box [slot="input"] {\n\t\t\t-webkit-mask-image: none;\n\t\t\tmin-height: 0;\n\t\t\tbox-sizing: border-box;\n\t\t}\n\n\t\tvaadin-combo-box::part(input-field) {\n\t\t\tpadding: 0;\n\t\t\tbox-shadow: none;\n\t\t}\n\n vaadin-combo-box::part(toggle-button),\n vaadin-combo-box::part(clear-button) {\n align-self: center;\n }\n\n vaadin-combo-box[label-type="floating"]:not([focused])[readonly] > input:placeholder-shown {\n opacity: 0;\n }\n vaadin-combo-box[label-type="floating"]:not([focused])[disabled] > input:placeholder-shown {\n opacity: 0;\n }\n \n ${(0,i.Wf)("vaadin-combo-box")}\n ${(0,i.bz)()}\n\t\t`,excludeAttrsSync:["tabindex","size","data"],componentName:l,includeForwardProps:["items","renderer","selectedItem"]}))},21294:(e,t,r)=>{r.r(t),r.d(t,{ComboBoxClass:()=>o.H}),r(47583);var o=r(84049);customElements.define(o.f,o.H)},41377:(e,t,r)=>{r.d(t,{Z:()=>d,f:()=>a});var o=r(73878),n=r(54567),i=r(16418);const a=(0,n.iY)("phone-field-internal-input-box"),l=["disabled","size","bordered","invalid","readonly","phone-input-placeholder","name","autocomplete","label-type"],s={"phone-input-placeholder":"placeholder"},p=(0,o.P)({componentName:a,baseSelector:"div"}),d=class extends p{static get observedAttributes(){return[].concat(p.observedAttributes||[],l)}constructor(){super(),this.innerHTML='\n <div>\n <descope-text-field tabindex="1"></descope-text-field>\n </div>\n ',this.phoneNumberInput=this.querySelector("descope-text-field")}get defaultCountryCode(){return(0,i.g)(this.getAttribute("default-code"))}get hasDefaultCode(){return!!this.getAttribute("default-code")}get value(){if(!this.phoneNumberValue)return"";if(this.hasDefaultCode){const e=new RegExp(`\\+?${parseInt(this.defaultCountryCode,10)}--?`);return`${this.defaultCountryCode}-${this.phoneNumberInput.value.replace(e,"")}`}return this.phoneNumberInput.value}set value(e){this.phoneNumberInput.value=e}get phoneNumberValue(){return this.phoneNumberInput.value}get minLength(){return parseInt(this.getAttribute("minlength"),10)||0}get maxLength(){return parseInt(this.getAttribute("maxlength"),10)||50}getValidity(){const e=this.value.replace(/\D/g,"");return this.isRequired&&!this.value?{valueMissing:!0}:e.length<this.minLength?{tooShort:!0}:e.length>this.maxLength?{tooLong:!0}:/^\+?\d{1,4}-?(?:\d-?){1,15}$/.test(this.value)?{}:{patternMismatch:!0}}init(){this.addEventListener("focus",(e=>{e.isTrusted&&this.phoneNumberInput.focus()})),super.init?.(),this.initInputs()}getCountryByDialCode(e){return this.countryCodeInput.items?.find((t=>t.getAttribute("data-country-code")===e))}initInputs(){this.phoneNumberInput.addEventListener("input",(e=>{1===e.target.value.length&&"-"===e.target.value&&(e.target.value=""),e.target.value=e.target.value.replace(/(?!^)\+/g,"").replace("--","-").replace("+-","+");const t=/^[+\d-]+$/,r=e.target.value.split("").filter((e=>t.test(e))).join("");e.target.value=r})),this.handleFocusEventsDispatching([this.phoneNumberInput]),this.handleInputEventDispatching()}attributeChangedCallback(e,t,r){if(super.attributeChangedCallback(e,t,r),t!==r&&l.includes(e)){const t=s[e]||e;this.phoneNumberInput.setAttribute(t,r)}}}},83067:(e,t,r)=>{r.r(t),r(19357);var o=r(41377);customElements.define(o.f,o.Z)},69423:(e,t,r)=>{r.r(t),r.d(t,{PhoneFieldInputBoxClass:()=>x}),r(83067),r(21294),r(19357);var o=r(41377),n=r(54567),i=r(2061),a=r(21e3),l=r(56417),s=r(87262),p=r(54201);const d=l.z.cssVarList,u=(0,n.iY)("phone-input-box-field"),{host:c,label:h,inputElement:b,requiredIndicator:m,inputField:y,phoneInput:g,errorMessage:f,helperText:v}={host:{selector:()=>":host"},label:{selector:"::part(label)"},placeholder:{selector:"> input:placeholder-shown"},inputElement:{selector:"input"},requiredIndicator:{selector:"[required]::part(required-indicator)::after"},inputField:{selector:"::part(input-field)"},phoneInput:{selector:()=>"descope-text-field"},helperText:{selector:"::part(helper-text)"},errorMessage:{selector:"::part(error-message)"}},x=(0,i.qC)((0,a.yk)({mappings:{fontSize:[c,y,{selector:l.z.componentName,property:l.z.cssVarList.fontSize}],fontFamily:[h,f,v],hostWidth:{...c,property:"width"},hostMinWidth:{...c,property:"min-width"},hostDirection:{...c,property:"direction"},inputBorderStyle:{...y,property:"border-style"},inputBorderWidth:{...y,property:"border-width"},inputBorderColor:{...y,property:"border-color"},inputBorderRadius:{...y,property:"border-radius"},inputHorizontalPadding:[{...g,property:"padding-left"},{...g,property:"padding-right"}],labelFontSize:{...h,property:"font-size"},labelFontWeight:{...h,property:"font-weight"},labelTextColor:[{...h,property:"color"},{...m,property:"color"}],labelRequiredIndicator:{...m,property:"content"},errorMessageTextColor:{...f,property:"color"},inputValueTextColor:{...g,property:d.inputValueTextColor},inputPlaceholderTextColor:{...g,property:d.inputPlaceholderColor},inputOutlineStyle:{...y,property:"outline-style"},inputOutlineColor:{...y,property:"outline-color"},inputOutlineWidth:{...y,property:"outline-width"},inputOutlineOffset:{...y,property:"outline-offset"},labelPosition:{...h,property:"position"},labelTopPosition:{...h,property:"top"},labelHorizontalPosition:[{...h,property:"left"},{...h,property:"right"}],inputTransformY:{...h,property:"transform"},inputTransition:{...h,property:"transition"},marginInlineStart:{...h,property:"margin-inline-start"},valueInputHeight:{...b,property:"height"},valueInputMarginBottom:{selector:l.z.componentName,property:d.valueInputMarginBottom}}}),a.e4,(0,a.dj)({proxyProps:["value","selectionStart"]}),(e=>class extends e{static get CountryCodes(){return s.Z}init(){super.init?.();const e=document.createElement("template");e.innerHTML=`\n\t\t\t\t<${o.f}\n\t\t\t\t\ttabindex="-1"\n\t\t\t\t\tslot="input"\n\t\t\t\t></${o.f}>\n `,this.baseElement.appendChild(e.content.cloneNode(!0)),this.inputElement=this.shadowRoot.querySelector(o.f),(0,n.oP)(this.shadowRoot.host,this.inputElement,{includeAttrs:["size","bordered","invalid","minlength","maxlength","default-code","disabled","phone-input-placeholder","label","label-type"]})}}))((0,a.DM)({slots:[],wrappedEleName:"vaadin-text-field",style:()=>`\n :host {\n display: inline-flex;\n max-width: 100%;\n box-sizing: border-box;\n }\n ${(0,p.bi)(x.cssVarList)}\n ${(0,p.Pd)("vaadin-text-field")}\n ${(0,p.B)("vaadin-text-field")}\n ${(0,p.DY)()}\n\n vaadin-text-field {\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n padding: 0;\n }\n vaadin-text-field[focus-ring]::part(input-field) {\n box-shadow: none;\n }\n vaadin-text-field::before {\n height: 0;\n }\n vaadin-text-field::part(input-field) {\n padding: 0;\n background: transparent;\n overflow: hidden;\n -webkit-mask-image: none;\n }\n descope-phone-field-internal-input-box {\n -webkit-mask-image: none;\n padding: 0;\n width: 100%;\n height: 100%;\n }\n descope-phone-field-internal-input-box > div {\n width: 100%;\n height: 100%;\n }\n descope-phone-field-internal-input-box .separator {\n flex: 0;\n border: none;\n }\n descope-text-field {\n flex-grow: 1;\n width: 100%;\n ${d.inputOutlineWidth}: 0;\n ${d.inputOutlineOffset}: 0;\n ${d.inputBorderWidth}: 0;\n ${d.inputBorderRadius}: 0;\n direction: ltr;\n }\n vaadin-text-field[readonly] > input:placeholder-shown {\n opacity: 1;\n }\n vaadin-text-field::part(input-field)::after {\n border: none;\n }\n\n vaadin-text-field[label-type="floating"]:not([focused])[readonly] input:placeholder-shown {\n opacity: 0;\n }\n vaadin-text-field[label-type="floating"]:not([focused])[disabled] input:placeholder-shown {\n opacity: 0;\n }\n\n ${(0,p.Wf)("vaadin-text-field")}\n ${(0,p.bz)()}\n\t\t`,excludeAttrsSync:["tabindex"],componentName:u}));customElements.define(u,x)},16418:(e,t,r)=>{r.d(t,{g:()=>n});var o=r(87262);const n=e=>o.Z.find((t=>t.code===e))?.dialCode}}]);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@descope/web-components-ui",
3
- "version": "1.0.347",
3
+ "version": "1.0.349",
4
4
  "description": "",
5
5
  "main": "dist/cjs/index.cjs.js",
6
6
  "module": "dist/index.esm.js",
@@ -42,12 +42,8 @@ class EnrichedText extends createBaseClass({ componentName, baseSelector: ':host
42
42
  margin-bottom: 1em;
43
43
  }
44
44
  a {
45
- text-decoration: none;
46
45
  cursor: pointer;
47
46
  }
48
- a:hover {
49
- text-decoration: underline;
50
- }
51
47
  blockquote {
52
48
  padding: 0 2em;
53
49
  }
@@ -192,6 +188,8 @@ export const EnrichedTextClass = compose(
192
188
  textLineHeight: { property: 'line-height' },
193
189
  textAlign: {},
194
190
  linkColor: { selector: 'a', property: 'color' },
191
+ linkTextDecoration: { selector: 'a', property: 'text-decoration' },
192
+ linkHoverTextDecoration: { selector: 'a:hover', property: 'text-decoration' },
195
193
  minHeight: {},
196
194
  minWidth: {},
197
195
  },
@@ -1,13 +1,13 @@
1
1
  import { compose } from '../../helpers';
2
2
  import { getComponentName } from '../../helpers/componentHelpers';
3
3
  import {
4
+ componentNameValidationMixin,
5
+ createProxy,
4
6
  createStyleMixin,
5
7
  draggableMixin,
6
- createProxy,
7
- componentNameValidationMixin,
8
8
  } from '../../mixins';
9
9
 
10
- import { isValidDataType } from './helpers';
10
+ import { defaultRowDetailsRenderer, isValidDataType } from './helpers';
11
11
 
12
12
  export const componentName = getComponentName('grid');
13
13
 
@@ -22,6 +22,41 @@ const GridMixin = (superclass) =>
22
22
 
23
23
  // disable the grid sort
24
24
  this.baseElement._mapSorters = () => {};
25
+
26
+ this.baseElement.rowDetailsRenderer = this.#rowDetailsRenderer.bind(this);
27
+ }
28
+
29
+ // this renders the details panel content
30
+ // in order to open it, the descope-grid-item-details-column should be used
31
+ #rowDetailsRenderer = async (cell, _col, model) => {
32
+ await import('../descope-code-snippet');
33
+ // prevent details panel from being scrolled into view when clicked
34
+ cell.addEventListener('mousedown', (e) => e.stopImmediatePropagation(), true);
35
+
36
+ const template = this.getRowDetailsTemplate(model.item);
37
+
38
+ // eslint-disable-next-line no-param-reassign
39
+ cell.innerHTML = '';
40
+ cell.append(template.content.cloneNode(true));
41
+ };
42
+
43
+ getRowDetailsTemplate(item) {
44
+ const itemLabelsMapping = this.#columns.reduce(
45
+ (acc, { path, header }) => (!path || !header ? acc : { ...acc, [path]: header }),
46
+ {}
47
+ );
48
+ const template =
49
+ this.rowDetailsRenderer?.(item, itemLabelsMapping) ??
50
+ defaultRowDetailsRenderer(item, itemLabelsMapping);
51
+
52
+ switch (true) {
53
+ case template instanceof HTMLTemplateElement:
54
+ return template;
55
+ case typeof template === 'string':
56
+ return Object.assign(document.createElement('template'), { innerHTML: template });
57
+ default:
58
+ throw new Error('rowDetailsRenderer should return a string or a template');
59
+ }
25
60
  }
26
61
 
27
62
  forwardSelectedItemsChange() {
@@ -115,9 +150,20 @@ const GridMixin = (superclass) =>
115
150
  );
116
151
  }
117
152
 
153
+ // there is an issue in vaadin-grid, when rowDetailsRenderer is set, it renders an empty details panel
154
+ reassignRowDetailsRenderer() {
155
+ this.baseElement.rowDetailsRenderer = null;
156
+ setTimeout(() => {
157
+ this.baseElement.rowDetailsRenderer = this.#rowDetailsRenderer.bind(this);
158
+ }, 0);
159
+ }
160
+
118
161
  renderColumns() {
119
162
  const template = this.getColumnsTemplate();
120
- if (template) this.innerHTML = template;
163
+ if (template) {
164
+ this.reassignRowDetailsRenderer();
165
+ this.innerHTML = template;
166
+ }
121
167
  }
122
168
 
123
169
  get grid() {
@@ -179,17 +225,35 @@ const {
179
225
  selectedRow,
180
226
  rowSeparator,
181
227
  resizeHandle,
228
+ toggleDetailsPanelButton,
229
+ toggleDetailsPanelButtonOpened,
230
+ toggleDetailsPanelButtonClosed,
231
+ detailsPanel,
232
+ detailsPanelLabels,
233
+ selectedRowCell,
234
+ detailsPanelContent,
182
235
  } = {
183
236
  host: { selector: () => 'vaadin-grid' },
184
237
  headerRow: { selector: () => '::part(header-cell)' },
185
238
  headerRowCell: { selector: () => 'vaadin-grid::part(header-cell)' },
186
239
  contentRow: { selector: () => '::part(cell)' },
187
240
  firstRow: { selector: () => '::part(first-header-row-cell)' },
188
- selectedRow: { selector: () => '::part(selected-row-cell)' },
241
+ selectedRow: { selector: () => '::part(selected-row)' },
242
+ selectedRowCell: { selector: () => '::part(selected-row-cell)' },
189
243
  sortIndicators: { selector: () => 'vaadin-grid-sorter::part(indicators)' },
190
244
  activeSortIndicator: { selector: () => 'vaadin-grid-sorter[direction]' },
191
245
  rowSeparator: { selector: () => 'vaadin-grid::part(body-cell)' },
192
246
  resizeHandle: { selector: () => '::part(resize-handle)' },
247
+ toggleDetailsPanelButton: { selector: () => 'vaadin-grid vaadin-icon.toggle-details-button' },
248
+ toggleDetailsPanelButtonOpened: {
249
+ selector: () => 'vaadin-grid vaadin-icon.toggle-details-button.opened',
250
+ },
251
+ toggleDetailsPanelButtonClosed: {
252
+ selector: () => 'vaadin-grid vaadin-icon.toggle-details-button.closed',
253
+ },
254
+ detailsPanel: { selector: () => 'vaadin-grid::part(details-cell)' },
255
+ detailsPanelLabels: { selector: () => 'vaadin-grid .row-details__label' },
256
+ detailsPanelContent: { selector: () => 'vaadin-grid .row-details' },
193
257
  };
194
258
 
195
259
  export const GridClass = compose(
@@ -213,7 +277,10 @@ export const GridClass = compose(
213
277
  borderWidth: { ...host, property: 'border-width' },
214
278
  borderStyle: { ...host, property: 'border-style' },
215
279
  borderRadius: { ...host, property: 'border-radius' },
216
- selectedBackgroundColor: { ...selectedRow, property: 'background-color' },
280
+ selectedBackgroundColor: [
281
+ { ...selectedRow, property: 'background-color' },
282
+ { ...selectedRowCell, property: 'background-color' },
283
+ ],
217
284
  headerRowTextColor: { ...headerRowCell, property: 'color' },
218
285
  separatorColor: [
219
286
  { ...firstRow, property: 'border-bottom-color' },
@@ -221,6 +288,19 @@ export const GridClass = compose(
221
288
  ],
222
289
  resizeHandleColor: { ...resizeHandle, property: 'background-color' },
223
290
  hostDirection: { ...host, property: 'direction', fallback: 'ltr' },
291
+ toggleDetailsPanelButtonSize: [
292
+ { ...toggleDetailsPanelButton, property: 'width' },
293
+ { ...toggleDetailsPanelButton, property: 'height' },
294
+ ],
295
+ toggleDetailsPanelButtonOpenedColor: { ...toggleDetailsPanelButtonOpened, property: 'color' },
296
+ toggleDetailsPanelButtonClosedColor: { ...toggleDetailsPanelButtonClosed, property: 'color' },
297
+ toggleDetailsPanelButtonCursor: { ...toggleDetailsPanelButton, property: 'cursor' },
298
+ detailsPanelBackgroundColor: { ...detailsPanel, property: 'background-color' },
299
+ detailsPanelBorderTopColor: { ...detailsPanel, property: 'border-top-color' },
300
+ detailsPanelLabelsColor: { ...detailsPanelLabels, property: 'color' },
301
+ detailsPanelLabelsFontSize: { ...detailsPanelLabels, property: 'font-size' },
302
+ detailsPanelItemsGap: { ...detailsPanelContent, property: 'grid-gap' },
303
+ detailsPanelPadding: { ...detailsPanelContent, property: 'padding' },
224
304
  },
225
305
  }),
226
306
  draggableMixin,
@@ -232,6 +312,7 @@ export const GridClass = compose(
232
312
  slots: [''],
233
313
  wrappedEleName: 'vaadin-grid',
234
314
  style: () => `
315
+ /*css*/
235
316
  vaadin-grid {
236
317
  overflow: hidden;
237
318
  height: 100%;
@@ -243,7 +324,36 @@ export const GridClass = compose(
243
324
  vaadin-grid::part(selected-row-cell) {
244
325
  background-image: none;
245
326
  box-shadow: none;
327
+ background-color: inherit;
328
+ }
329
+ vaadin-grid::part(details-cell) {
330
+ border-top-style: dashed;
331
+ border-top-width: 1px;
332
+ }
333
+ vaadin-grid .row-details {
334
+ display: grid;
335
+ grid-template-columns: repeat(auto-fit, minmax(max(200px, calc(100%/4 - var(${GridClass.cssVarList.detailsPanelItemsGap}))), 1fr));
336
+ width: 100%;
337
+ }
338
+ vaadin-grid .row-details__item:has(.row-details__value.json) {
339
+ grid-column: 1 / -1;
340
+ order: 2;
341
+ }
342
+ vaadin-grid .row-details__value.text {
343
+ overflow: hidden;
344
+ text-overflow: ellipsis;
345
+ white-space: pre;
346
+ }
347
+ vaadin-grid .row-details__value.json {
348
+ margin-top: 5px;
349
+ max-height: 120px;
350
+ overflow: scroll;
351
+ font-size: 0.85em;
352
+ }
353
+ vaadin-grid vaadin-icon.toggle-details-button {
354
+ margin: auto;
246
355
  }
356
+ /*!css*/
247
357
  `,
248
358
  excludeAttrsSync: ['columns', 'tabindex'],
249
359
  componentName,
@@ -0,0 +1,37 @@
1
+ /* eslint-disable no-param-reassign */
2
+ import { GridSortColumn } from '@vaadin/grid/vaadin-grid-sort-column';
3
+
4
+ export class GridItemDetailsColumnClass extends GridSortColumn {
5
+ get sortable() {
6
+ return this.getAttribute('sortable') === 'true';
7
+ }
8
+
9
+ // eslint-disable-next-line class-methods-use-this
10
+ _defaultRenderer(cell, _col, model) {
11
+ const grid = _col._gridValue;
12
+ const itemIdx = grid.detailsOpenedItems?.indexOf(model.item) ?? -1;
13
+ const isOpened = itemIdx !== -1;
14
+
15
+ const toggleIcon = document.createElement('vaadin-icon');
16
+ toggleIcon.icon = isOpened ? 'vaadin:angle-up' : 'vaadin:angle-down';
17
+ toggleIcon.classList.add('toggle-details-button', isOpened ? 'opened' : 'closed');
18
+ cell.innerHTML = '';
19
+ cell.append(toggleIcon);
20
+
21
+ toggleIcon.onclick = () => {
22
+ grid.detailsOpenedItems = isOpened
23
+ ? grid.detailsOpenedItems.toSpliced(itemIdx, 1)
24
+ : [...grid.detailsOpenedItems, model.item];
25
+ };
26
+ }
27
+
28
+ _defaultHeaderRenderer(root, _column) {
29
+ if (this.sortable) {
30
+ super._defaultHeaderRenderer(root, _column);
31
+
32
+ return;
33
+ }
34
+
35
+ this.__setTextContent(root, this.__getHeader(this.header, this.path));
36
+ }
37
+ }
@@ -0,0 +1,8 @@
1
+ import { getComponentName } from '../../../helpers/componentHelpers';
2
+ import { GridItemDetailsColumnClass } from './GridItemDetailsColumnClass';
3
+ import '@vaadin/icon';
4
+ import '@vaadin/icons';
5
+
6
+ export const componentName = getComponentName('grid-item-details-column');
7
+
8
+ customElements.define(componentName, GridItemDetailsColumnClass);
@@ -1,3 +1,5 @@
1
+ import { toTitle } from '../../helpers';
2
+
1
3
  export const isValidDataType = (data) => {
2
4
  const isValid = Array.isArray(data);
3
5
  if (!isValid) {
@@ -7,3 +9,55 @@ export const isValidDataType = (data) => {
7
9
 
8
10
  return isValid;
9
11
  };
12
+
13
+ export const isPlainObject = (value) => value?.constructor === Object;
14
+
15
+ export const getValueType = (value) => {
16
+ if (isPlainObject(value)) return 'object';
17
+ if (Array.isArray(value)) return 'array';
18
+
19
+ return 'text';
20
+ };
21
+
22
+ export const renderCodeSnippet = (value) =>
23
+ `<descope-code-snippet lang="json" class="row-details__value json">${JSON.stringify(
24
+ value,
25
+ null,
26
+ 2
27
+ )}</descope-code-snippet>`;
28
+
29
+ export const renderText = (text) =>
30
+ `<div class="row-details__value text" title="${text}">${text}</div>`;
31
+
32
+ const defaultRowDetailsValueRenderer = (value) => {
33
+ const valueType = getValueType(value);
34
+
35
+ if (valueType === 'object') {
36
+ return renderCodeSnippet(value);
37
+ }
38
+
39
+ if (valueType === 'array') {
40
+ if (value.some((v) => getValueType(v) === 'object')) {
41
+ return renderCodeSnippet(value);
42
+ }
43
+ return renderText(value.join(',\n'));
44
+ }
45
+
46
+ return renderText(value);
47
+ };
48
+
49
+ export const defaultRowDetailsRenderer = (item, itemLabelsMapping) => {
50
+ return `
51
+ <div class="row-details">
52
+ ${Object.entries(item)
53
+ .map(
54
+ ([key, value]) =>
55
+ `<div class="row-details__item" >
56
+ <div class="row-details__label">${itemLabelsMapping[key] || toTitle(key)}</div>
57
+ ${defaultRowDetailsValueRenderer(value)}
58
+ </div>`
59
+ )
60
+ .join('\n')}
61
+ </div>
62
+ `;
63
+ };
@@ -2,6 +2,7 @@ import '@vaadin/grid';
2
2
  import './descope-grid-text-column';
3
3
  import './descope-grid-custom-column';
4
4
  import './descope-grid-selection-column';
5
+ import './descope-grid-item-details-column';
5
6
 
6
7
  import { componentName, GridClass } from './GridClass';
7
8
 
@@ -18,10 +18,6 @@ class RawLink extends createBaseClass({ componentName, baseSelector: ':host a' }
18
18
  }
19
19
  :host a {
20
20
  display: inline;
21
- text-decoration: none;
22
- }
23
- :host a:hover {
24
- text-decoration: underline;
25
21
  }
26
22
  </style>
27
23
  <div>
@@ -48,12 +44,13 @@ class RawLink extends createBaseClass({ componentName, baseSelector: ':host a' }
48
44
 
49
45
  const selectors = {
50
46
  host: { selector: () => ':host' },
47
+ link: { selector: () => ':host a' },
51
48
  anchor: {},
52
49
  wrapper: { selector: () => ':host > div' },
53
50
  text: { selector: () => TextClass.componentName },
54
51
  };
55
52
 
56
- const { anchor, text, host, wrapper } = selectors;
53
+ const { anchor, text, host, wrapper, link } = selectors;
57
54
 
58
55
  export const LinkClass = compose(
59
56
  createStyleMixin({
@@ -61,6 +58,7 @@ export const LinkClass = compose(
61
58
  hostWidth: { ...host, property: 'width' },
62
59
  hostDirection: { ...text, property: 'direction' },
63
60
  textAlign: wrapper,
61
+ textDecoration: { ...link, property: 'text-decoration', fallback: 'none' },
64
62
  textColor: [
65
63
  { ...anchor, property: 'color' },
66
64
  { ...text, property: TextClass.cssVarList.textColor },
@@ -58,6 +58,9 @@ export const RadioButtonClass = compose(
58
58
  radioMargin: { selector: '::part(radio)', property: 'margin' },
59
59
  radioCheckedSize: { selector: '::part(radio)::after', property: 'border-width' },
60
60
  radioCheckedColor: { selector: '::part(radio)::after', property: 'border-color' },
61
+ radioBorderColor: { selector: '::part(radio)', property: 'border-color', fallback: 'none' },
62
+ radioBorderWidth: { selector: '::part(radio)', property: 'border-width', fallback: 0 },
63
+ radioBorderStyle: { selector: '::part(radio)', property: 'border-style', fallback: 'solid' },
61
64
  },
62
65
  }),
63
66
  proxyInputMixin({ proxyProps: ['setSelectionRange'] }),
@@ -52,3 +52,11 @@ export const compareArraysUnordered = (arr1, arr2) => {
52
52
 
53
53
  return true;
54
54
  };
55
+
56
+ export const toTitle = (str) =>
57
+ str
58
+ .replace(/([A-Z])/g, ' $1')
59
+ .trim()
60
+ .split(' ')
61
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
62
+ .join(' ');
@@ -20,7 +20,7 @@ export const createProxy = ({
20
20
 
21
21
  constructor() {
22
22
  super().attachShadow({ mode: 'open', delegatesFocus }).innerHTML = `
23
- <style id="create-proxy">${isFunction(style) ? style() : style}</style>
23
+ <style id="create-proxy">${(isFunction(style) ? style() : style) || ''}</style>
24
24
  <${wrappedEleName}>
25
25
  ${slots
26
26
  .map(
@@ -19,6 +19,8 @@ const EnrichedText = {
19
19
  [vars.textColor]: globalRefs.colors.surface.dark,
20
20
 
21
21
  [vars.linkColor]: `var(${LinkClass.cssVarList.textColor})`,
22
+ [vars.linkTextDecoration]: 'none',
23
+ [vars.linkHoverTextDecoration]: 'underline',
22
24
 
23
25
  [vars.minWidth]: '0.25em',
24
26
  [vars.minHeight]: '1.35em',
@@ -32,6 +32,17 @@ export const grid = {
32
32
  [vars.selectedBackgroundColor]: globalRefs.colors.surface.highlight,
33
33
  [vars.hostDirection]: globalRefs.direction,
34
34
 
35
+ [vars.toggleDetailsPanelButtonSize]: '1em',
36
+ [vars.toggleDetailsPanelButtonOpenedColor]: globalRefs.colors.surface.contrast,
37
+ [vars.toggleDetailsPanelButtonClosedColor]: globalRefs.colors.surface.light,
38
+ [vars.toggleDetailsPanelButtonCursor]: 'pointer',
39
+ [vars.detailsPanelBackgroundColor]: globalRefs.colors.surface.highlight,
40
+ [vars.detailsPanelBorderTopColor]: globalRefs.colors.surface.light,
41
+ [vars.detailsPanelLabelsColor]: globalRefs.colors.surface.dark,
42
+ [vars.detailsPanelLabelsFontSize]: '0.8em',
43
+ [vars.detailsPanelItemsGap]: '2em',
44
+ [vars.detailsPanelPadding]: '12px 0',
45
+
35
46
  _bordered: {
36
47
  [vars.borderColor]: refs.borderColor,
37
48
  },
@@ -21,6 +21,10 @@ const link = {
21
21
  [vars.hostWidth]: '100%',
22
22
  },
23
23
 
24
+ _hover: {
25
+ [vars.textDecoration]: 'underline',
26
+ },
27
+
24
28
  mode: {
25
29
  secondary: {
26
30
  [vars.textColor]: globalRefs.colors.secondary.main,
@@ -13,6 +13,8 @@ export const radioButton = {
13
13
  [vars.radioCheckedSize]: `calc(var(${vars.radioSize})/5)`,
14
14
  [vars.radioCheckedColor]: globalRefs.colors.surface.light,
15
15
  [vars.radioBackgroundColor]: globalRefs.colors.surface.light,
16
+ [vars.radioBorderColor]: 'none',
17
+ [vars.radioBorderWidth]: 0,
16
18
 
17
19
  _checked: {
18
20
  [vars.radioBackgroundColor]: globalRefs.colors.surface.contrast,