{"version":3,"file":"sso.cjs","sources":["../src/sso/utils/htmlIdGenerator.ts","../src/sso/utils/getUniqueId.ts","../src/sso/utils/cssClassAssembler.ts","../src/sso/login/index.vue","../src/sso/connections/CreateConnection/index.vue","../src/sso/connections/utils.ts","../src/shared/Spacer/index.vue","../src/shared/Separator/index.vue","../src/shared/Well/index.vue","../src/shared/Anchor/index.vue","../src/shared/Checkbox/index.vue","../src/sso/connections/CreateConnection/saml/index.vue","../src/sso/connections/CreateConnection/oidc/index.vue","../src/shared/LoadingContainer/index.vue","../src/shared/EmptyState/index.vue","../src/sso/connections/ConnectionList/index.vue","../src/shared/SecretInputFormControl/index.vue","../src/shared/ToggleSwitch/index.vue","../src/sso/connections/ToggleConnectionStatus/index.vue","../src/shared/ConfirmationPrompt/index.vue","../src/sso/connections/EditConnection/oidc/index.vue","../src/shared/Card/index.vue","../src/sso/connections/EditConnection/saml/index.vue","../src/sso/connections/ConnectionsWrapper/index.vue","../src/sso/dsync/CreateDirectory/index.vue","../src/sso/dsync/DirectoryList/index.vue","../src/sso/dsync/ToggleConnectionStatus/index.vue","../src/sso/dsync/EditDirectory/index.vue","../src/sso/dsync/DirectoriesWrapper/index.vue"],"sourcesContent":["/**\n * Util function that helps to generate unique HTML ids that are namespaced by\n * the prefix and element type\n * @param prefix Pass anything that needs to be prefixed to the id\n * @param elementType Pass the HTML element type here (e.g., input)\n * @returns {string} Id that is gauranteed to be unique and suitable for html id attributes across various components\n */\n\nconst htmlIdGenerator = (prefix: string, elementType: string) => {\n  return `boxyhq-${prefix}-${elementType}`;\n};\nexport default htmlIdGenerator","import htmlIdGenerator from './htmlIdGenerator';\n\n/**\n *\n * @param component Pass the SDK component name here (e.g., sso)\n * @param elementType Pass the HTML element type for which the Id is to be generated (e.g., input)\n * @returns {string} Id that is gauranteed to be unique suitable for use as HTML id attributes\n */\n\nconst getUniqueId = (component: string, elementType: string) => {\n  let id = '';\n\n  // call the htmlIdGenerator function to set a unique id for the user and then return it\n  id = htmlIdGenerator(component, elementType);\n  return id;\n};\nexport default getUniqueId","const cssClassAssembler = (customClasses = '', defaultClasses: string = '') => customClasses ? customClasses : defaultClasses;\nexport default cssClassAssembler","<template>\n  <div\n    :style=\"styles?.container\"\n    :class=\"_classStringToObject(classes.container)\"\n    v-bind=\"innerProps?.container\"\n  >\n    <template v-if=\"shouldRenderInput\">\n      <label\n        :for=\"InputId\"\n        :style=\"styles?.label\"\n        :class=\"_classStringToObject(classes.label)\"\n        v-bind=\"innerProps?.label\"\n      >\n        {{ inputLabel || DEFAULT_VALUES.inputLabel }}\n      </label>\n\n      <input\n        :id=\"InputId\"\n        :value=\"_ssoIdentifier\"\n        :placeholder=\"placeholder || DEFAULT_VALUES.placeholder\"\n        @input=\"handleChange($event)\"\n        :style=\"styles?.input\"\n        :class=\"_classStringToObject(classes.input)\"\n        :aria-invalid=\"isError\"\n        :aria-describedby=\"ErrorSpanId\"\n        v-bind=\"innerProps?.input\"\n      />\n\n      <template v-if=\"isError\">\n        <span :id=\"ErrorSpanId\">{{ errMsg }}</span>\n      </template>\n    </template>\n\n    <button\n      type=\"button\"\n      :disabled=\"disableButton\"\n      @click=\"onSubmitButton($event)\"\n      :style=\"styles?.button\"\n      :class=\"_classStringToObject(classes.button)\"\n      v-bind=\"innerProps?.button\"\n    >\n      {{ buttonText || DEFAULT_VALUES.buttonText }}\n    </button>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref } from \"vue\";\n\nimport type { LoginProps } from \"./types\";\nimport getUniqueId from \"../utils/getUniqueId\";\nimport cssClassAssembler from \"../utils/cssClassAssembler\";\nimport defaultClasses from \"./index.module.css\";\nconst COMPONENT = \"sso\";\nconst DEFAULT_VALUES = {\n  ssoIdentifier: \"\",\n  inputLabel: \"Tenant\",\n  placeholder: \"\",\n  buttonText: \"Sign-in with SSO\",\n};\n\nconst props = defineProps<LoginProps>();\nconst _ssoIdentifier = ref(DEFAULT_VALUES.ssoIdentifier);\nconst errMsg = ref(\"\");\nconst isProcessing = ref(false);\n\nconst isError = computed(() => {\n  return !!errMsg.value;\n});\nconst disableButton = computed(() => {\n  return !(_ssoIdentifier.value || props.ssoIdentifier) || isProcessing.value;\n});\nconst shouldRenderInput = computed(() => {\n  return !props.ssoIdentifier;\n});\nconst InputId = computed(() => {\n  return getUniqueId(COMPONENT, \"input\");\n});\nconst ErrorSpanId = computed(() => {\n  return getUniqueId(COMPONENT, \"span\");\n});\nconst classes = computed(() => {\n  return {\n    container: cssClassAssembler(\n      props.classNames?.container,\n      defaultClasses.container\n    ),\n    label: cssClassAssembler(props.classNames?.label, defaultClasses.label),\n    input: cssClassAssembler(props.classNames?.input, defaultClasses.input),\n    button: cssClassAssembler(props.classNames?.button, defaultClasses.button),\n  };\n});\n\nfunction handleChange(event: Event) {\n  errMsg.value = \"\";\n  _ssoIdentifier.value = (event.currentTarget as HTMLInputElement)?.value;\n}\nfunction onSubmitButton(event: Event) {\n  event.preventDefault();\n  isProcessing.value = true;\n  const ssoIdentifierToSubmit =\n    (_ssoIdentifier.value || props.ssoIdentifier) ?? \"\";\n  props.onSubmit({\n    ssoIdentifier: ssoIdentifierToSubmit,\n    cb: (err) => {\n      isProcessing.value = false;\n      if (err?.error.message) {\n        errMsg.value = err.error.message;\n      }\n    },\n  });\n}\nfunction _classStringToObject(str: string) {\n  const obj: Record<string, boolean> = {};\n  if (typeof str !== \"string\") {\n    return obj;\n  }\n  const classNames = str.trim().split(/\\s+/);\n  for (const name of classNames) {\n    obj[name] = true;\n  }\n  return obj;\n}\n</script>","<template>\n  <div>\n    <template v-if=\"idpEntityID && setupLinkToken\">\n      <div :class=\"_classStringToObject(classes.idpId)\">\n        <div :class=\"_classStringToObject(classes.formControl)\">\n          <input-with-copy-button\n            label=\"IdP Entity ID\"\n            :text=\"idpEntityID || ''\"\n            :copyDoneCallback=\"copyDoneCallback\"\n          ></input-with-copy-button>\n        </div>\n      </div>\n    </template>\n\n    <div>\n      <h2 :class=\"_classStringToObject(defaultClasses.heading)\">\n        Create SSO Connection\n      </h2>\n      <fieldset :class=\"_classStringToObject(classes.container)\">\n        <legend :class=\"_classStringToObject(classes.selectSSO)\">\n          Select SSO type:\n        </legend>\n        <div :class=\"_classStringToObject(classes.formControl)\">\n          <label :class=\"_classStringToObject(classes.label)\">\n            <input\n              type=\"radio\"\n              name=\"connection\"\n              value=\"saml\"\n              :checked=\"newConnectionType === 'saml'\"\n              @input=\"handleNewConnectionTypeChange($event)\"\n              :class=\"_classStringToObject(classes.radio)\"\n            />\n            <span :class=\"_classStringToObject(classes.span)\">SAML</span>\n          </label>\n        </div>\n        <div :class=\"_classStringToObject(classes.formControl)\">\n          <label :class=\"_classStringToObject(classes.label)\">\n            <input\n              type=\"radio\"\n              name=\"connection\"\n              value=\"oidc\"\n              :checked=\"newConnectionType === 'oidc'\"\n              @input=\"handleNewConnectionTypeChange($event)\"\n              :class=\"_classStringToObject(classes.radio)\"\n            />\n            <span :class=\"_classStringToObject(classes.span)\">OIDC</span>\n          </label>\n        </div>\n      </fieldset>\n\n      <template v-if=\"connectionIsSAML\">\n        <create-samlconnection\n          :urls=\"componentProps.saml.urls\"\n          :excludeFields=\"componentProps.saml.excludeFields\"\n          :classNames=\"componentProps.saml.classNames\"\n          :variant=\"componentProps.saml.variant\"\n          :errorCallback=\"componentProps.saml.errorCallback\"\n          :successCallback=\"componentProps.saml.successCallback\"\n          :displayHeader=\"false\"\n        ></create-samlconnection>\n      </template>\n\n      <template v-if=\"connectionIsOIDC\">\n        <create-oidcconnection\n          :urls=\"componentProps.oidc.urls\"\n          :excludeFields=\"componentProps.oidc.excludeFields\"\n          :classNames=\"componentProps.oidc.classNames\"\n          :variant=\"componentProps.oidc.variant\"\n          :errorCallback=\"componentProps.oidc.errorCallback\"\n          :successCallback=\"componentProps.oidc.successCallback\"\n          :displayHeader=\"false\"\n        ></create-oidcconnection>\n      </template>\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref } from \"vue\";\n\nimport CreateOIDCConnection from \"./oidc/index.vue\";\nimport CreateSAMLConnection from \"./saml/index.vue\";\nimport type { CreateSSOConnectionProps } from \"../types\";\nimport defaultClasses from \"./index.module.css\";\nimport cssClassAssembler from \"../../utils/cssClassAssembler\";\nimport InputWithCopyButton from \"../../../shared/InputWithCopyButton/index.vue\";\n\nconst props = defineProps<CreateSSOConnectionProps>();\nconst newConnectionType = ref(\"saml\");\n\nconst connectionIsSAML = computed(() => {\n  return newConnectionType.value === \"saml\";\n});\nconst connectionIsOIDC = computed(() => {\n  return newConnectionType.value === \"oidc\";\n});\nconst classes = computed(() => {\n  return {\n    container: cssClassAssembler(\n      props.classNames?.container,\n      defaultClasses.container\n    ),\n    formControl: cssClassAssembler(\n      props.classNames?.formControl,\n      defaultClasses.formControl\n    ),\n    selectSSO: cssClassAssembler(\n      props.classNames?.selectSSO,\n      defaultClasses.selectSSO\n    ),\n    idpId: cssClassAssembler(props.classNames?.idpId, defaultClasses.idpId),\n    radio: cssClassAssembler(props.classNames?.radio, defaultClasses.radio),\n    span: cssClassAssembler(props.classNames?.span, defaultClasses.span),\n    label: cssClassAssembler(props.classNames?.label, defaultClasses.label),\n  };\n});\n\nfunction handleNewConnectionTypeChange(event: Event) {\n  newConnectionType.value = (event.target as HTMLInputElement).value;\n}\nfunction copyDoneCallback() {\n  console.log(`copied to clipboard`);\n}\nfunction _classStringToObject(str: string) {\n  const obj: Record<string, boolean> = {};\n  if (typeof str !== \"string\") {\n    return obj;\n  }\n  const classNames = str.trim().split(/\\s+/);\n  for (const name of classNames) {\n    obj[name] = true;\n  }\n  return obj;\n}\n</script>","import type { FormObj } from './types';\nexport const saveConnection = async ({\n  formObj,\n  isEditView,\n  connectionIsSAML,\n  connectionIsOIDC,\n  callback,\n  url\n}: {\n  formObj: FormObj;\n  isEditView?: boolean;\n  connectionIsSAML?: boolean;\n  connectionIsOIDC?: boolean;\n  callback: (res: Response) => Promise<void>;\n  url: string;\n}) => {\n  const {\n    rawMetadata,\n    redirectUrl,\n    oidcDiscoveryUrl,\n    oidcMetadata,\n    oidcClientId,\n    oidcClientSecret,\n    metadataUrl,\n    ...rest\n  } = formObj;\n  const encodedRawMetadata = window.btoa((rawMetadata as string) || '');\n  const redirectUrlList = (redirectUrl as string)?.split(/\\r\\n|\\r|\\n/);\n  const res = await fetch(url, {\n    method: isEditView ? 'PATCH' : 'POST',\n    headers: {\n      'Content-Type': 'application/json'\n    },\n    body: JSON.stringify({\n      ...rest,\n      encodedRawMetadata: connectionIsSAML ? encodedRawMetadata : undefined,\n      oidcDiscoveryUrl: connectionIsOIDC ? oidcDiscoveryUrl : undefined,\n      oidcMetadata: connectionIsOIDC ? oidcMetadata : undefined,\n      oidcClientId: connectionIsOIDC ? oidcClientId : undefined,\n      oidcClientSecret: connectionIsOIDC ? oidcClientSecret : undefined,\n      redirectUrl: redirectUrl && redirectUrlList ? JSON.stringify(redirectUrlList) : undefined,\n      metadataUrl: connectionIsSAML ? metadataUrl : undefined\n    })\n  });\n  callback(res);\n};\nexport const deleteConnection = async ({\n  url,\n  clientId,\n  clientSecret,\n  callback\n}: {\n  url: string;\n  clientId: string;\n  clientSecret: string;\n  callback: (res: Response) => Promise<void>;\n}) => {\n  const queryParams = new URLSearchParams({\n    clientID: clientId,\n    clientSecret\n  });\n  const res = await fetch(`${url}?${queryParams}`, {\n    method: 'DELETE'\n  });\n  callback(res);\n}","<template>\n  <div\n    :style=\"{\n      marginLeft: marginLeft,\n      marginTop: marginTop,\n      display: 'inline-block',\n    }\"\n    :aria-hidden=\"true\"\n  ></div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nconst SPACING = {\n  px: \"1px\",\n  0: \"0px\",\n  0.5: \"0.125rem\",\n  1: \"0.25rem\",\n  1.5: \"0.375rem\",\n  2: \"0.5rem\",\n  2.5: \"0.625rem\",\n  3: \"0.75rem\",\n  3.5: \"0.875rem\",\n  4: \"1rem\",\n  5: \"1.25rem\",\n  6: \"1.5rem\",\n  7: \"1.75rem\",\n  8: \"2rem\",\n  9: \"2.25rem\",\n  10: \"2.5rem\",\n  11: \"2.75rem\",\n  12: \"3rem\",\n  14: \"3.5rem\",\n  16: \"4rem\",\n  20: \"5rem\",\n  24: \"6rem\",\n  28: \"7rem\",\n  32: \"8rem\",\n  36: \"9rem\",\n  40: \"10rem\",\n  44: \"11rem\",\n  48: \"12rem\",\n  52: \"13rem\",\n  56: \"14rem\",\n  60: \"15rem\",\n  64: \"16rem\",\n  72: \"18rem\",\n  80: \"20rem\",\n  96: \"24rem\",\n};\n\ntype Space = keyof typeof SPACING;\ninterface SpacerProps {\n  x?: Space;\n  y?: Space;\n}\n\nconst props = defineProps<SpacerProps>();\n\nconst marginLeft = computed(() => {\n  return props.x !== undefined && SPACING[props.x]\n    ? SPACING[props.x]\n    : SPACING[0];\n});\nconst marginTop = computed(() => {\n  return props.y !== undefined && SPACING[props.y]\n    ? SPACING[props.y]\n    : SPACING[0];\n});\n</script>","<template>\n  <div :class=\"_classStringToObject(styles.separator)\">{{ text }}</div>\n</template>\n\n<script setup lang=\"ts\">\nimport styles from \"./index.module.css\";\n\ninterface SeparatorProps {\n  text?: string;\n}\n\nconst props = defineProps<SeparatorProps>();\n\nfunction _classStringToObject(str: string) {\n  const obj: Record<string, boolean> = {};\n  if (typeof str !== \"string\") {\n    return obj;\n  }\n  const classNames = str.trim().split(/\\s+/);\n  for (const name of classNames) {\n    obj[name] = true;\n  }\n  return obj;\n}\n</script>","<template>\n  <div :class=\"_classStringToObject(styles.well)\"><slot /></div>\n</template>\n\n<script setup lang=\"ts\">\nimport styles from \"./index.module.css\";\n\nexport interface WellProps {\n  children?: any;\n}\n\nconst props = defineProps<WellProps>();\n\nfunction _classStringToObject(str: string) {\n  const obj: Record<string, boolean> = {};\n  if (typeof str !== \"string\") {\n    return obj;\n  }\n  const classNames = str.trim().split(/\\s+/);\n  for (const name of classNames) {\n    obj[name] = true;\n  }\n  return obj;\n}\n</script>","<template>\n  <a target=\"_blank\" :href=\"href\" :class=\"_classStringToObject(className)\">\n    {{ linkText }}\n  </a>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport { LinkProps } from \"../types\";\nimport styles from \"./index.module.css\";\n\nconst props = defineProps<LinkProps>();\n\nconst className = computed(() => {\n  return (\n    styles.a +\n    (props.variant ? ` ${styles[props.variant]}` : \"\") +\n    (props.cssClass ? ` ${props.cssClass}` : \"\")\n  );\n});\n\nfunction _classStringToObject(str: string) {\n  const obj: Record<string, boolean> = {};\n  if (typeof str !== \"string\") {\n    return obj;\n  }\n  const classNames = str.trim().split(/\\s+/);\n  for (const name of classNames) {\n    obj[name] = true;\n  }\n  return obj;\n}\n</script>","<template>\n  <label :class=\"_classStringToObject(styles.label)\">\n    <input\n      type=\"checkbox\"\n      :name=\"name\"\n      :checked=\"checked\"\n      @input=\"handleChange($event)\"\n      :class=\"_classStringToObject(styles.checkbox)\"\n    />\n    {{ label }}\n  </label>\n</template>\n\n<script setup lang=\"ts\">\nimport styles from \"./index.module.css\";\n\nexport interface CheckboxProps {\n  label: string;\n  name: string;\n  checked: boolean;\n  handleChange: (e: any) => void;\n}\n\nconst props = defineProps<CheckboxProps>();\n\nfunction _classStringToObject(str: string) {\n  const obj: Record<string, boolean> = {};\n  if (typeof str !== \"string\") {\n    return obj;\n  }\n  const classNames = str.trim().split(/\\s+/);\n  for (const name of classNames) {\n    obj[name] = true;\n  }\n  return obj;\n}\n</script>","<template>\n  <div>\n    <well>\n      <template v-if=\"displayHeader !== undefined ? displayHeader : true\">\n        <h2 :class=\"_classStringToObject(defaultClasses.heading)\">\n          Create SAML Connection\n        </h2>\n      </template>\n\n      <form\n        method=\"post\"\n        @submit=\"save($event)\"\n        :class=\"_classStringToObject(classes.form)\"\n      >\n        <template v-if=\"formVariant === 'advanced'\">\n          <template v-if=\"!isExcluded('name')\">\n            <div :class=\"_classStringToObject(classes.fieldContainer)\">\n              <label for=\"name\" :class=\"_classStringToObject(classes.label)\">\n                Connection name (Optional)\n              </label>\n              <spacer :y=\"2\"></spacer>\n              <input\n                id=\"name\"\n                name=\"name\"\n                type=\"text\"\n                placeholder=\"MyApp\"\n                :class=\"_classStringToObject(classes.input)\"\n                @input=\"handleChange($event)\"\n                :value=\"samlConnection.name\"\n                :required=\"false\"\n              />\n            </div>\n          </template>\n\n          <spacer :y=\"6\"></spacer>\n\n          <template v-if=\"!isExcluded('description')\">\n            <div :class=\"_classStringToObject(classes.fieldContainer)\">\n              <label\n                for=\"description\"\n                :class=\"_classStringToObject(classes.label)\"\n              >\n                Description (Optional)\n              </label>\n              <spacer :y=\"2\"></spacer>\n              <input\n                id=\"description\"\n                name=\"description\"\n                type=\"text\"\n                placeholder=\"A short description not more than 100 characters\"\n                :class=\"_classStringToObject(classes.input)\"\n                @input=\"handleChange($event)\"\n                :value=\"samlConnection.description\"\n                :required=\"false\"\n                :maxLength=\"100\"\n              />\n            </div>\n          </template>\n\n          <spacer :y=\"6\"></spacer>\n\n          <template v-if=\"!isExcluded('tenant')\">\n            <div :class=\"_classStringToObject(classes.fieldContainer)\">\n              <label for=\"tenant\" :class=\"_classStringToObject(classes.label)\">\n                Tenant\n              </label>\n              <spacer :y=\"2\"></spacer>\n              <input\n                id=\"tenant\"\n                name=\"tenant\"\n                type=\"text\"\n                placeholder=\"acme.com\"\n                aria-describedby=\"tenant-hint\"\n                :class=\"_classStringToObject(classes.input)\"\n                @input=\"handleChange($event)\"\n                :value=\"samlConnection.tenant\"\n                :required=\"true\"\n              />\n              <span\n                id=\"tenant-hint\"\n                :class=\"_classStringToObject(defaultClasses.hint)\"\n              >\n                Unique identifier for the tenant to which this SSO connection is\n                linked.See\n                <spacer :x=\"1\"></spacer>\n                <anchor\n                  href=\"https://boxyhq.com/guides/jackson/configuring-saml-sso#sso-connection-identifier\"\n                  linkText=\"SSO connection identifier.\"\n                ></anchor>\n              </span>\n            </div>\n          </template>\n\n          <spacer :y=\"6\"></spacer>\n\n          <template v-if=\"!isExcluded('product')\">\n            <div :class=\"_classStringToObject(classes.fieldContainer)\">\n              <label for=\"product\" :class=\"_classStringToObject(classes.label)\">\n                Product\n              </label>\n              <spacer :y=\"2\"></spacer>\n              <input\n                id=\"product\"\n                name=\"product\"\n                type=\"text\"\n                placeholder=\"demo\"\n                aria-describedby=\"product-hint\"\n                :class=\"_classStringToObject(classes.input)\"\n                :required=\"true\"\n                @input=\"handleChange($event)\"\n                :value=\"samlConnection.product\"\n              />\n              <span\n                id=\"product-hint\"\n                :class=\"_classStringToObject(defaultClasses.hint)\"\n              >\n                Identifies the product/app to which this SSO connection is\n                linked.\n              </span>\n            </div>\n          </template>\n\n          <spacer :y=\"6\"></spacer>\n\n          <template v-if=\"!isExcluded('redirectUrl')\">\n            <div :class=\"_classStringToObject(classes.fieldContainer)\">\n              <label\n                for=\"redirectUrl\"\n                :class=\"_classStringToObject(classes.label)\"\n              >\n                Allowed redirect URLs (newline separated)\n              </label>\n              <spacer :y=\"2\"></spacer>\n              <textarea\n                id=\"redirectUrl\"\n                name=\"redirectUrl\"\n                placeholder=\"http://localhost:3366\"\n                aria-describedby=\"redirectUrl-hint\"\n                :required=\"true\"\n                :class=\"_classStringToObject(classes.textarea)\"\n                @input=\"handleChange($event)\"\n                :value=\"samlConnection.redirectUrl\"\n              ></textarea>\n              <span\n                id=\"redirectUrl-hint\"\n                :class=\"_classStringToObject(defaultClasses.hint)\"\n              >\n                URL to redirect the user to after login. You can specify\n                multiple URLs by separating them with a new line.\n              </span>\n            </div>\n          </template>\n\n          <spacer :y=\"6\"></spacer>\n\n          <template v-if=\"!isExcluded('defaultRedirectUrl')\">\n            <div :class=\"_classStringToObject(classes.fieldContainer)\">\n              <label\n                for=\"defaultRedirectUrl\"\n                :class=\"_classStringToObject(classes.label)\"\n              >\n                Default redirect URL\n              </label>\n              <spacer :y=\"2\"></spacer>\n              <input\n                id=\"defaultRedirectUrl\"\n                name=\"defaultRedirectUrl\"\n                type=\"url\"\n                placeholder=\"http://localhost:3366/login/saml\"\n                :class=\"_classStringToObject(classes.input)\"\n                @input=\"handleChange($event)\"\n                :value=\"samlConnection.defaultRedirectUrl\"\n              />\n            </div>\n          </template>\n\n          <spacer :y=\"6\"></spacer>\n\n          <separator text=\"SAML Provider Metadata\"></separator>\n\n          <spacer :y=\"6\"></spacer>\n        </template>\n\n        <div :class=\"_classStringToObject(classes.fieldContainer)\">\n          <label for=\"rawMetadata\" :class=\"_classStringToObject(classes.label)\">\n            Raw IdP XML\n          </label>\n          <spacer :y=\"2\"></spacer>\n          <textarea\n            id=\"rawMetadata\"\n            name=\"rawMetadata\"\n            placeholder=\"Paste the raw XML here\"\n            aria-describedby=\"xml-metadata-hint\"\n            :class=\"_classStringToObject(classes.textarea)\"\n            :value=\"samlConnection.rawMetadata\"\n            @input=\"handleChange($event)\"\n            :required=\"samlConnection.metadataUrl === ''\"\n          ></textarea>\n          <span\n            id=\"xml-metadata-hint\"\n            :class=\"_classStringToObject(defaultClasses.hint)\"\n          >\n            Paste the raw XML metadata obtained from SAML provider or enter the\n            metadata URL below.\n          </span>\n        </div>\n        <spacer :y=\"6\"></spacer>\n        <separator text=\"OR\"></separator>\n        <spacer :y=\"6\"></spacer>\n        <div :class=\"_classStringToObject(classes.fieldContainer)\">\n          <label for=\"metadataUrl\" :class=\"_classStringToObject(classes.label)\">\n            Metadata URL\n          </label>\n          <spacer :y=\"2\"></spacer>\n          <input\n            id=\"metadataUrl\"\n            name=\"metadataUrl\"\n            type=\"url\"\n            placeholder=\"Paste the Metadata URL here\"\n            :class=\"_classStringToObject(classes.input)\"\n            :value=\"samlConnection.metadataUrl\"\n            @input=\"handleChange($event)\"\n            :required=\"samlConnection.rawMetadata === ''\"\n          />\n        </div>\n        <spacer :y=\"6\"></spacer>\n\n        <template v-if=\"formVariant === 'advanced'\">\n          <template v-if=\"!isExcluded('forceAuthn')\">\n            <checkbox\n              label=\"Force Authentication\"\n              name=\"forceAuthn\"\n              :checked=\"samlConnection.forceAuthn\"\n              :handleChange=\"handleChange\"\n            ></checkbox>\n          </template>\n        </template>\n\n        <spacer :y=\"6\"></spacer>\n\n        <div :class=\"_classStringToObject(defaultClasses.formAction)\">\n          <template v-if=\"typeof cancelCallback === 'function'\">\n            <button\n              type=\"button\"\n              name=\"Cancel\"\n              variant=\"outline\"\n              :handleClick=\"cancelCallback\"\n            ></button>\n          </template>\n\n          <button type=\"submit\" name=\"Save\"></button>\n        </div>\n      </form>\n    </well>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref } from \"vue\";\n\nimport type {\n  CreateConnectionProps,\n  SAMLSSOConnection,\n  ApiResponse,\n} from \"../../types\";\nimport { saveConnection } from \"../../utils\";\nimport defaultClasses from \"./index.module.css\";\nimport cssClassAssembler from \"../../../utils/cssClassAssembler\";\nimport Button from \"../../../../shared/Button/index.vue\";\nimport Spacer from \"../../../../shared/Spacer/index.vue\";\nimport Separator from \"../../../../shared/Separator/index.vue\";\nimport Well from \"../../../../shared/Well/index.vue\";\nimport Anchor from \"../../../../shared/Anchor/index.vue\";\nimport Checkbox from \"../../../../shared/Checkbox/index.vue\";\nconst DEFAULT_VALUES = {\n  variant: \"basic\",\n} satisfies Partial<CreateConnectionProps>;\nconst INITIAL_VALUES = {\n  samlConnection: {\n    name: \"\",\n    description: \"\",\n    tenant: \"\",\n    product: \"\",\n    redirectUrl: \"\",\n    defaultRedirectUrl: \"\",\n    rawMetadata: \"\",\n    metadataUrl: \"\",\n    forceAuthn: false as boolean,\n  },\n};\n\ntype Keys = keyof typeof INITIAL_VALUES.samlConnection;\ntype Values = (typeof INITIAL_VALUES.samlConnection)[Keys];\n\nconst props = defineProps<CreateConnectionProps>();\nconst loading = ref(false);\nconst samlConnection = ref(INITIAL_VALUES.samlConnection);\n\nconst formVariant = computed(() => {\n  return props.variant || DEFAULT_VALUES.variant;\n});\nconst classes = computed(() => {\n  return {\n    form: cssClassAssembler(props.classNames?.form, defaultClasses.form),\n    fieldContainer: cssClassAssembler(\n      props.classNames?.fieldContainer,\n      defaultClasses.fieldContainer\n    ),\n    container: cssClassAssembler(\n      props.classNames?.container,\n      defaultClasses.container\n    ),\n    label: cssClassAssembler(props.classNames?.label, defaultClasses.label),\n    input: cssClassAssembler(props.classNames?.input, defaultClasses.input),\n    textarea: cssClassAssembler(\n      props.classNames?.input,\n      defaultClasses.input + \" \" + defaultClasses.textarea\n    ),\n    radioContainer: cssClassAssembler(\n      props.classNames?.radioContainer,\n      defaultClasses.radioContainer + \" \" + defaultClasses.fieldContainer\n    ),\n  };\n});\n\nfunction updateConnection(key: Keys, newValue: Values) {\n  return {\n    ...samlConnection.value,\n    [key]: newValue,\n  };\n}\nfunction handleChange(event: Event) {\n  const target = event.target as HTMLInputElement | HTMLTextAreaElement;\n  const name = target.name as Keys;\n  const targetValue =\n    name !== \"forceAuthn\" ? target.value : (target as HTMLInputElement).checked;\n  samlConnection.value = updateConnection(name, targetValue);\n}\nfunction save(event: Event) {\n  event.preventDefault();\n  loading.value = true;\n  saveConnection({\n    url: props.urls.save,\n    formObj:\n      props.variant === \"advanced\"\n        ? {\n            ...samlConnection.value,\n          }\n        : {\n            rawMetadata: samlConnection.value.rawMetadata,\n            metadataUrl: samlConnection.value.metadataUrl,\n          },\n    connectionIsSAML: true,\n    callback: async (rawResponse: any) => {\n      loading.value = false;\n      samlConnection.value = INITIAL_VALUES.samlConnection;\n      const response: ApiResponse = await rawResponse.json();\n      if (\"error\" in response) {\n        typeof props.errorCallback === \"function\" &&\n          props.errorCallback(response.error.message);\n        return;\n      }\n      if (rawResponse.ok) {\n        typeof props.successCallback === \"function\" && props.successCallback();\n      }\n    },\n  });\n}\nfunction isExcluded(fieldName: keyof SAMLSSOConnection) {\n  return !!(props.excludeFields as (keyof SAMLSSOConnection)[])?.includes(\n    fieldName\n  );\n}\nfunction _classStringToObject(str: string) {\n  const obj: Record<string, boolean> = {};\n  if (typeof str !== \"string\") {\n    return obj;\n  }\n  const classNames = str.trim().split(/\\s+/);\n  for (const name of classNames) {\n    obj[name] = true;\n  }\n  return obj;\n}\n</script>","<template>\n  <div>\n    <well>\n      <template v-if=\"displayHeader !== undefined ? displayHeader : true\">\n        <h2 :class=\"_classStringToObject(defaultClasses.heading)\">\n          Create OIDC Connection\n        </h2>\n      </template>\n\n      <form\n        method=\"post\"\n        @submit=\"save($event)\"\n        :class=\"_classStringToObject(classes.form)\"\n      >\n        <template v-if=\"formVariant === 'advanced'\">\n          <template v-if=\"!isExcluded('name')\">\n            <div :class=\"_classStringToObject(classes.fieldContainer)\">\n              <label for=\"name\" :class=\"_classStringToObject(classes.label)\">\n                Connection name (Optional)\n              </label>\n              <spacer :y=\"2\"></spacer>\n              <input\n                id=\"name\"\n                name=\"name\"\n                type=\"text\"\n                placeholder=\"MyApp\"\n                :class=\"_classStringToObject(classes.input)\"\n                @input=\"handleChange($event)\"\n                :value=\"oidcConnection.name\"\n                :required=\"false\"\n              />\n            </div>\n          </template>\n\n          <spacer :y=\"6\"></spacer>\n\n          <template v-if=\"!isExcluded('description')\">\n            <div :class=\"_classStringToObject(classes.fieldContainer)\">\n              <label\n                for=\"description\"\n                :class=\"_classStringToObject(classes.label)\"\n              >\n                Description (Optional)\n              </label>\n              <spacer :y=\"2\"></spacer>\n              <input\n                id=\"description\"\n                name=\"description\"\n                type=\"text\"\n                placeholder=\"A short description not more than 100 characters\"\n                :class=\"_classStringToObject(classes.input)\"\n                :value=\"oidcConnection.description\"\n                @input=\"handleChange($event)\"\n                :required=\"false\"\n                :maxLength=\"100\"\n              />\n            </div>\n          </template>\n\n          <spacer :y=\"6\"></spacer>\n\n          <template v-if=\"!isExcluded('tenant')\">\n            <div :class=\"_classStringToObject(classes.fieldContainer)\">\n              <label for=\"tenant\" :class=\"_classStringToObject(classes.label)\">\n                Tenant\n              </label>\n              <spacer :y=\"2\"></spacer>\n              <input\n                id=\"tenant\"\n                name=\"tenant\"\n                type=\"text\"\n                placeholder=\"acme.com\"\n                aria-describedby=\"tenant-hint\"\n                :required=\"true\"\n                :class=\"_classStringToObject(classes.input)\"\n                @input=\"handleChange($event)\"\n                :value=\"oidcConnection.tenant\"\n              />\n              <span\n                id=\"tenant-hint\"\n                :class=\"_classStringToObject(defaultClasses.hint)\"\n              >\n                Unique identifier for the tenant to which this SSO connection is\n                linked.See\n                <spacer :x=\"1\"></spacer>\n                <anchor\n                  href=\"https://boxyhq.com/guides/jackson/configuring-saml-sso#sso-connection-identifier\"\n                  linkText=\"SSO connection identifier.\"\n                ></anchor>\n              </span>\n            </div>\n          </template>\n\n          <spacer :y=\"6\"></spacer>\n\n          <template v-if=\"!isExcluded('product')\">\n            <div :class=\"_classStringToObject(classes.fieldContainer)\">\n              <label for=\"product\" :class=\"_classStringToObject(classes.label)\">\n                Product\n              </label>\n              <spacer :y=\"2\"></spacer>\n              <input\n                id=\"product\"\n                name=\"product\"\n                type=\"text\"\n                placeholder=\"demo\"\n                aria-describedby=\"product-hint\"\n                :required=\"true\"\n                :class=\"_classStringToObject(classes.input)\"\n                @input=\"handleChange($event)\"\n                :value=\"oidcConnection.product\"\n              />\n              <span\n                id=\"product-hint\"\n                :class=\"_classStringToObject(defaultClasses.hint)\"\n              >\n                Identifies the product/app to which this SSO connection is\n                linked.\n              </span>\n            </div>\n          </template>\n\n          <spacer :y=\"6\"></spacer>\n\n          <template v-if=\"!isExcluded('redirectUrl')\">\n            <div :class=\"_classStringToObject(classes.fieldContainer)\">\n              <label\n                for=\"redirectUrl\"\n                :class=\"_classStringToObject(classes.label)\"\n              >\n                Allowed redirect URLs (newline separated)\n              </label>\n              <spacer :y=\"2\"></spacer>\n              <textarea\n                id=\"redirectUrl\"\n                name=\"redirectUrl\"\n                placeholder=\"http://localhost:3366\"\n                aria-describedby=\"redirectUrl-hint\"\n                :required=\"true\"\n                :class=\"_classStringToObject(classes.textarea)\"\n                @input=\"handleChange($event)\"\n                :value=\"oidcConnection.redirectUrl\"\n              ></textarea>\n              <span\n                id=\"redirectUrl-hint\"\n                :class=\"_classStringToObject(defaultClasses.hint)\"\n              >\n                URL to redirect the user to after login. You can specify\n                multiple URLs by separating them with a new line.\n              </span>\n            </div>\n          </template>\n\n          <spacer :y=\"6\"></spacer>\n\n          <template v-if=\"!isExcluded('defaultRedirectUrl')\">\n            <div :class=\"_classStringToObject(classes.fieldContainer)\">\n              <label\n                for=\"defaultRedirectUrl\"\n                :class=\"_classStringToObject(classes.label)\"\n              >\n                Default redirect URL\n              </label>\n              <spacer :y=\"2\"></spacer>\n              <input\n                id=\"defaultRedirectUrl\"\n                name=\"defaultRedirectUrl\"\n                type=\"url\"\n                placeholder=\"http://localhost:3366/login/saml\"\n                :class=\"_classStringToObject(classes.input)\"\n                @input=\"handleChange($event)\"\n                :value=\"oidcConnection.defaultRedirectUrl\"\n              />\n            </div>\n          </template>\n\n          <spacer :y=\"6\"></spacer>\n\n          <separator text=\"OIDC Provider Metadata\"></separator>\n\n          <spacer :y=\"6\"></spacer>\n        </template>\n\n        <div :class=\"_classStringToObject(classes.fieldContainer)\">\n          <label\n            for=\"oidcClientId\"\n            :class=\"_classStringToObject(classes.label)\"\n          >\n            Client ID\n          </label>\n          <spacer :y=\"2\"></spacer>\n          <input\n            id=\"oidcClientId\"\n            name=\"oidcClientId\"\n            type=\"text\"\n            aria-describedby=\"oidc-clientid-hint\"\n            :class=\"_classStringToObject(classes.input)\"\n            @input=\"handleChange($event)\"\n            :value=\"oidcConnection.oidcClientId\"\n            :required=\"true\"\n          />\n          <span\n            id=\"oidc-clientid-hint\"\n            :class=\"_classStringToObject(defaultClasses.hint)\"\n          >\n            ClientId of the app created on the OIDC Provider.\n          </span>\n        </div>\n        <spacer :y=\"6\"></spacer>\n        <div :class=\"_classStringToObject(classes.fieldContainer)\">\n          <label\n            for=\"oidcClientSecret\"\n            :class=\"_classStringToObject(classes.label)\"\n          >\n            Client Secret\n          </label>\n          <spacer :y=\"2\"></spacer>\n          <input\n            id=\"oidcClientSecret\"\n            name=\"oidcClientSecret\"\n            type=\"text\"\n            aria-describedby=\"oidc-clientsecret-hint\"\n            :class=\"_classStringToObject(classes.input)\"\n            @input=\"handleChange($event)\"\n            :value=\"oidcConnection.oidcClientSecret\"\n            :required=\"true\"\n          />\n          <span\n            id=\"oidc-clientsecret-hint\"\n            :class=\"_classStringToObject(defaultClasses.hint)\"\n          >\n            ClientSecret of the app created on the OIDC Provider.\n          </span>\n        </div>\n        <spacer :y=\"6\"></spacer>\n        <div :class=\"_classStringToObject(classes.fieldContainer)\">\n          <label\n            for=\"oidcDiscoveryUrl\"\n            :class=\"_classStringToObject(classes.label)\"\n          >\n            Well-known URL of OpenID Provider\n          </label>\n          <spacer :y=\"2\"></spacer>\n          <input\n            id=\"oidcDiscoveryUrl\"\n            name=\"oidcDiscoveryUrl\"\n            type=\"url\"\n            placeholder=\"https://example.com/.well-known/openid-configuration\"\n            aria-describedby=\"oidc-metadata-hint\"\n            :class=\"_classStringToObject(classes.input)\"\n            @input=\"handleChange($event)\"\n            :value=\"oidcConnection.oidcDiscoveryUrl\"\n          />\n          <span\n            id=\"oidc-metadata-hint\"\n            :class=\"_classStringToObject(defaultClasses.hint)\"\n          >\n            Enter the well known discovery path of OpenID provider or manually\n            enter the OpenId provider metadata below.\n          </span>\n        </div>\n        <spacer :y=\"6\"></spacer>\n        <separator text=\"OR\"></separator>\n        <spacer :y=\"6\"></spacer>\n        <div :class=\"_classStringToObject(classes.fieldContainer)\">\n          <label for=\"issuer\" :class=\"_classStringToObject(classes.label)\">\n            Issuer\n          </label>\n          <spacer :y=\"2\"></spacer>\n          <input\n            id=\"issuer\"\n            name=\"oidcMetadata.issuer\"\n            placeholder=\"https://example.com\"\n            type=\"url\"\n            :class=\"_classStringToObject(classes.input)\"\n            @input=\"handleChange($event)\"\n            :value=\"oidcConnection['oidcMetadata.issuer']\"\n          />\n        </div>\n        <spacer :y=\"6\"></spacer>\n        <div :class=\"_classStringToObject(classes.fieldContainer)\">\n          <label\n            for=\"authorization_endpoint\"\n            :class=\"_classStringToObject(classes.label)\"\n          >\n            Authorization Endpoint\n          </label>\n          <spacer :y=\"2\"></spacer>\n          <input\n            id=\"authorization_endpoint\"\n            name=\"oidcMetadata.authorization_endpoint\"\n            placeholder=\"https://example.com/oauth/authorize\"\n            type=\"url\"\n            :class=\"_classStringToObject(classes.input)\"\n            @input=\"handleChange($event)\"\n            :value=\"oidcConnection['oidcMetadata.authorization_endpoint']\"\n          />\n        </div>\n        <spacer :y=\"6\"></spacer>\n        <div :class=\"_classStringToObject(classes.fieldContainer)\">\n          <label\n            for=\"token_endpoint\"\n            :class=\"_classStringToObject(classes.label)\"\n          >\n            Token endpoint\n          </label>\n          <spacer :y=\"2\"></spacer>\n          <input\n            id=\"token_endpoint\"\n            name=\"oidcMetadata.token_endpoint\"\n            placeholder=\"https://example.com/oauth/token\"\n            type=\"url\"\n            :class=\"_classStringToObject(classes.input)\"\n            @input=\"handleChange($event)\"\n            :value=\"oidcConnection['oidcMetadata.token_endpoint']\"\n          />\n        </div>\n        <spacer :y=\"6\"></spacer>\n        <div :class=\"_classStringToObject(classes.fieldContainer)\">\n          <label for=\"jwks_uri\" :class=\"_classStringToObject(classes.label)\">\n            JWKS URI\n          </label>\n          <spacer :y=\"2\"></spacer>\n          <input\n            id=\"jwks_uri\"\n            name=\"oidcMetadata.jwks_uri\"\n            placeholder=\"https://example.com/.well-known/jwks.json\"\n            type=\"url\"\n            :class=\"_classStringToObject(classes.input)\"\n            @input=\"handleChange($event)\"\n            :value=\"oidcConnection['oidcMetadata.jwks_uri']\"\n          />\n        </div>\n        <spacer :y=\"6\"></spacer>\n        <div :class=\"_classStringToObject(classes.fieldContainer)\">\n          <label\n            for=\"userinfo_endpoint\"\n            :class=\"_classStringToObject(classes.label)\"\n          >\n            UserInfo endpoint\n          </label>\n          <spacer :y=\"2\"></spacer>\n          <input\n            id=\"userinfo_endpoint\"\n            name=\"oidcMetadata.userinfo_endpoint\"\n            placeholder=\"https://example.com/userinfo\"\n            type=\"url\"\n            :class=\"_classStringToObject(classes.input)\"\n            @input=\"handleChange($event)\"\n            :value=\"oidcConnection['oidcMetadata.userinfo_endpoint']\"\n          />\n        </div>\n        <spacer :y=\"6\"></spacer>\n\n        <div :class=\"_classStringToObject(defaultClasses.formAction)\">\n          <template v-if=\"typeof cancelCallback === 'function'\">\n            <button\n              type=\"button\"\n              name=\"Cancel\"\n              variant=\"outline\"\n              :handleClick=\"cancelCallback\"\n            ></button>\n          </template>\n\n          <button type=\"submit\" name=\"Save\"></button>\n        </div>\n      </form>\n    </well>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref } from \"vue\";\n\nimport type {\n  CreateConnectionProps,\n  FormObj,\n  OIDCSSOConnection,\n  ApiResponse,\n} from \"../../types\";\nimport { saveConnection } from \"../../utils\";\nimport defaultClasses from \"./index.module.css\";\nimport cssClassAssembler from \"../../../utils/cssClassAssembler\";\nimport Button from \"../../../../shared/Button/index.vue\";\nimport Spacer from \"../../../../shared/Spacer/index.vue\";\nimport Separator from \"../../../../shared/Separator/index.vue\";\nimport Well from \"../../../../shared/Well/index.vue\";\nimport Anchor from \"../../../../shared/Anchor/index.vue\";\nconst DEFAULT_VALUES = {\n  variant: \"basic\",\n} satisfies Partial<CreateConnectionProps>;\nconst INITIAL_VALUES = {\n  oidcConnection: {\n    name: \"\",\n    description: \"\",\n    tenant: \"\",\n    product: \"\",\n    redirectUrl: \"\",\n    defaultRedirectUrl: \"\",\n    oidcClientSecret: \"\",\n    oidcClientId: \"\",\n    oidcDiscoveryUrl: \"\",\n    \"oidcMetadata.issuer\": \"\",\n    \"oidcMetadata.authorization_endpoint\": \"\",\n    \"oidcMetadata.token_endpoint\": \"\",\n    \"oidcMetadata.jwks_uri\": \"\",\n    \"oidcMetadata.userinfo_endpoint\": \"\",\n  },\n};\n\ntype Keys = keyof typeof INITIAL_VALUES.oidcConnection;\ntype Values = (typeof INITIAL_VALUES.oidcConnection)[Keys];\n\nconst props = defineProps<CreateConnectionProps>();\nconst loading = ref(false);\nconst oidcConnection = ref(INITIAL_VALUES.oidcConnection);\n\nconst classes = computed(() => {\n  return {\n    form: cssClassAssembler(props.classNames?.form, defaultClasses.form),\n    fieldContainer: cssClassAssembler(\n      props.classNames?.fieldContainer,\n      defaultClasses.fieldContainer\n    ),\n    container: cssClassAssembler(\n      props.classNames?.container,\n      defaultClasses.container\n    ),\n    label: cssClassAssembler(props.classNames?.label, defaultClasses.label),\n    input: cssClassAssembler(props.classNames?.input, defaultClasses.input),\n    textarea: cssClassAssembler(\n      props.classNames?.input,\n      defaultClasses.input + \" \" + defaultClasses.textarea\n    ),\n  };\n});\nconst formVariant = computed(() => {\n  return props.variant || DEFAULT_VALUES.variant;\n});\n\nfunction updateConnection(key: Keys, newValue: Values) {\n  return {\n    ...oidcConnection.value,\n    [key]: newValue,\n  };\n}\nfunction handleChange(event: Event) {\n  const target = event.target as HTMLInputElement | HTMLTextAreaElement;\n  const name = target.name as Keys;\n  const targetValue = (\n    event.currentTarget as HTMLInputElement | HTMLTextAreaElement\n  )?.value;\n  oidcConnection.value = updateConnection(name, targetValue);\n}\nfunction save(event: Event) {\n  event.preventDefault();\n  loading.value = true;\n  const formObj: Partial<OIDCSSOConnection> = {};\n  Object.entries(oidcConnection).map(([key, val]) => {\n    if (key.startsWith(\"oidcMetadata.\")) {\n      if (formObj.oidcMetadata === undefined) {\n        formObj.oidcMetadata = {} as OIDCSSOConnection[\"oidcMetadata\"];\n      }\n      formObj.oidcMetadata![key.replace(\"oidcMetadata.\", \"\")] = val;\n    } else {\n      formObj[key as keyof Omit<OIDCSSOConnection, \"oidcMetadata\">] = val;\n    }\n  });\n  saveConnection({\n    url: props.urls.save,\n    formObj: formObj as FormObj,\n    connectionIsOIDC: true,\n    callback: async (rawResponse: any) => {\n      loading.value = false;\n      oidcConnection.value = INITIAL_VALUES.oidcConnection;\n      const response: ApiResponse = await rawResponse.json();\n      if (\"error\" in response) {\n        typeof props.errorCallback === \"function\" &&\n          props.errorCallback(response.error.message);\n        return;\n      }\n      if (rawResponse.ok) {\n        typeof props.successCallback === \"function\" && props.successCallback();\n      }\n    },\n  });\n}\nfunction isExcluded(fieldName: keyof OIDCSSOConnection) {\n  return !!(props.excludeFields as (keyof OIDCSSOConnection)[])?.includes(\n    fieldName\n  );\n}\nfunction _classStringToObject(str: string) {\n  const obj: Record<string, boolean> = {};\n  if (typeof str !== \"string\") {\n    return obj;\n  }\n  const classNames = str.trim().split(/\\s+/);\n  for (const name of classNames) {\n    obj[name] = true;\n  }\n  return obj;\n}\n</script>","<template>\n  <div :class=\"_classStringToObject(styles.container)\">\n    <div\n      aria-label=\"Loading\"\n      :class=\"_classStringToObject(styles.spinner)\"\n      :aria-hidden=\"!isBusy\"\n    ></div>\n    <div :aria-busy=\"isBusy\"><slot /></div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { LoadingContainerProps } from \"../types\";\nimport styles from \"./index.module.css\";\n\nconst props = defineProps<LoadingContainerProps>();\n\nfunction _classStringToObject(str: string) {\n  const obj: Record<string, boolean> = {};\n  if (typeof str !== \"string\") {\n    return obj;\n  }\n  const classNames = str.trim().split(/\\s+/);\n  for (const name of classNames) {\n    obj[name] = true;\n  }\n  return obj;\n}\n</script>","<template>\n  <div :class=\"_classStringToObject(classes.container)\">\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      fill=\"none\"\n      viewBox=\"0 0 24 24\"\n      stroke-width=\"1.5\"\n      stroke=\"currentColor\"\n      :class=\"_classStringToObject(defaultStyles.svg)\"\n    >\n      <path\n        stroke-linecap=\"round\"\n        stroke-linejoin=\"round\"\n        d=\"M11.25 11.25l.041-.02a.75.75 0 011.063.852l-.708 2.836a.75.75 0 001.063.853l.041-.021M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9-3.75h.008v.008H12V8.25z\"\n      ></path>\n    </svg>\n    <h4>{{ title }}</h4>\n\n    <template v-if=\"description\">\n      <p :class=\"_classStringToObject(defaultStyles.description)\">\n        {{ description }}\n      </p>\n    </template>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport type { EmptyStateProps } from \"../types\";\nimport defaultStyles from \"./index.module.css\";\n\nconst props = defineProps<EmptyStateProps>();\n\nconst classes = computed(() => {\n  return {\n    container:\n      defaultStyles.container + (props.className ? ` ${props.className}` : \"\"),\n  };\n});\n\nfunction _classStringToObject(str: string) {\n  const obj: Record<string, boolean> = {};\n  if (typeof str !== \"string\") {\n    return obj;\n  }\n  const classNames = str.trim().split(/\\s+/);\n  for (const name of classNames) {\n    obj[name] = true;\n  }\n  return obj;\n}\n</script>","<template>\n  <loading-container :isBusy=\"isConnectionListLoading\">\n    <div>\n      <template v-if=\"connectionListData?.length > 0\">\n        <div :class=\"_classStringToObject(classes.tableContainer)\">\n          <table\n            :cols=\"colsToDisplay\"\n            :data=\"connectionListData\"\n            :actions=\"actions\"\n          ></table>\n        </div>\n      </template>\n\n      <template v-else>\n        <template v-if=\"$slots.default\">\n          <slot />\n        </template>\n\n        <template v-else>\n          <empty-state title=\"No connections found.\"></empty-state>\n        </template>\n      </template>\n    </div>\n  </loading-container>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, watch } from \"vue\";\n\nimport type {\n  ConnectionData,\n  ConnectionListProps,\n  OIDCSSORecord,\n  SAMLSSORecord,\n} from \"../types\";\nimport LoadingContainer from \"../../../shared/LoadingContainer/index.vue\";\nimport EmptyState from \"../../../shared/EmptyState/index.vue\";\nimport cssClassAssembler from \"../../utils/cssClassAssembler\";\nimport defaultClasses from \"./index.module.css\";\nimport Table from \"../../../shared/Table/index.vue\";\nimport { TableProps } from \"../../../shared/types\";\nconst DEFAULT_VALUES = {\n  isSettingsView: false,\n  connectionListData: [] as ConnectionData<any>[],\n};\n\nconst props = defineProps<ConnectionListProps>();\nconst connectionListData = ref(DEFAULT_VALUES.connectionListData);\nconst connectionListError = ref(\"\");\nconst isConnectionListLoading = ref(true);\n\nconst classes = computed(() => {\n  return {\n    container: cssClassAssembler(\n      props.classNames?.container,\n      defaultClasses.container\n    ),\n    formControl: cssClassAssembler(\n      props.classNames?.formControl,\n      defaultClasses.formControl\n    ),\n    tableContainer: cssClassAssembler(\n      props.classNames?.tableContainer,\n      defaultClasses.tableContainer\n    ),\n    table: cssClassAssembler(props.classNames?.table, defaultClasses.table),\n    tableCaption: cssClassAssembler(\n      props.classNames?.tableCaption,\n      defaultClasses.tableCaption\n    ),\n    thead: cssClassAssembler(props.classNames?.thead, defaultClasses.thead),\n    tr: cssClassAssembler(props.classNames?.tr, defaultClasses.tr),\n    th: cssClassAssembler(props.classNames?.th, defaultClasses.th),\n    connectionListContainer: cssClassAssembler(\n      props.classNames?.connectionListContainer,\n      defaultClasses.connectionListContainer\n    ),\n    td: cssClassAssembler(props.classNames?.td, defaultClasses.td),\n    spanIcon: cssClassAssembler(\n      props.classNames?.spanIcon,\n      defaultClasses.spanIcon\n    ),\n    icon: cssClassAssembler(props.classNames?.icon, defaultClasses.icon),\n  };\n});\nconst colsToDisplay = computed(() => {\n  return (\n    props.cols || [\"provider\", \"tenant\", \"product\", \"type\", \"status\", \"actions\"]\n  );\n});\nconst actions = computed(() => {\n  return [\n    {\n      icon: \"PencilIcon\",\n      label: \"Edit\",\n      handleClick: (connection: ConnectionData<any>) =>\n        props.handleActionClick(\"edit\", connection),\n    },\n  ];\n});\n\nwatch(\n  () => [props.getConnectionsUrl],\n  ([getConnectionsUrl]) => {\n    getFieldsData(props.getConnectionsUrl);\n  },\n  { immediate: true }\n);\nfunction connectionDisplayName(connection: SAMLSSORecord | OIDCSSORecord) {\n  if (connection.name) {\n    return connection.name;\n  }\n  if (\"idpMetadata\" in connection) {\n    return (\n      connection.idpMetadata.friendlyProviderName ||\n      connection.idpMetadata.provider\n    );\n  }\n  if (\"oidcProvider\" in connection) {\n    return connection.oidcProvider.provider;\n  }\n  return \"Unknown\";\n}\nasync function getFieldsData(url: string) {\n  const response = await fetch(url);\n  const { data, error } = await response.json();\n  const _connectionsListData = data.map((connection: ConnectionData<any>) => {\n    return {\n      ...connection,\n      provider: connectionDisplayName(connection),\n      type: \"oidcProvider\" in connection ? \"OIDC\" : \"SAML\",\n      status: connection.deactivated ? \"Inactive\" : \"Active\",\n      isSystemSSO: connection.isSystemSSO,\n    };\n  });\n  isConnectionListLoading.value = false;\n  if (error) {\n    connectionListError.value = error;\n  } else {\n    connectionListData.value = _connectionsListData;\n    typeof props.handleListFetchComplete === \"function\" &&\n      props.handleListFetchComplete(data);\n  }\n}\nfunction _classStringToObject(str: string) {\n  const obj: Record<string, boolean> = {};\n  if (typeof str !== \"string\") {\n    return obj;\n  }\n  const classNames = str.trim().split(/\\s+/);\n  for (const name of classNames) {\n    obj[name] = true;\n  }\n  return obj;\n}\n</script>","<template>\n  <div>\n    <div :class=\"_classStringToObject(defaultStyles.toolbar)\">\n      <label :for=\"id\" :class=\"_classStringToObject(defaultStyles.label)\">\n        {{ label }}\n      </label>\n      <div>\n        <icon-button\n          :handleClick=\"toggleIsSecretShown\"\n          :label=\"isSecretShown ? 'Hide secret' : 'Show secret'\"\n          :icon=\"isSecretShown ? 'EyeSlashIcon' : 'EyeIcon'\"\n        ></icon-button>\n        <spacer :x=\"2\"></spacer>\n        <copy-to-clipboard-button\n          :text=\"value\"\n          :copyDoneCallback=\"copyDoneCallback\"\n        ></copy-to-clipboard-button>\n      </div>\n    </div>\n    <input\n      :type=\"isSecretShown ? 'text' : 'password'\"\n      :placeholder=\"placeholder\"\n      :value=\"value || ''\"\n      :id=\"id\"\n      :name=\"id\"\n      :required=\"required\"\n      :maxLength=\"maxLength\"\n      :readOnly=\"readOnly\"\n      @input=\"onChange($event)\"\n      :class=\"_classStringToObject(defaultStyles.input)\"\n    />\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from \"vue\";\n\nimport { SecretInputFormControlProps } from \"../types\";\nimport CopyToClipboardButton from \"../ClipboardButton/index.vue\";\nimport IconButton from \"../IconButton/index.vue\";\nimport defaultStyles from \"./index.module.css\";\nimport Spacer from \"../Spacer/index.vue\";\n\nconst props = defineProps<SecretInputFormControlProps>();\nconst isSecretShown = ref(false);\n\nfunction toggleIsSecretShown() {\n  isSecretShown.value = !isSecretShown.value;\n}\nfunction onChange(event: Event) {\n  props.handleChange(event);\n}\nfunction _classStringToObject(str: string) {\n  const obj: Record<string, boolean> = {};\n  if (typeof str !== \"string\") {\n    return obj;\n  }\n  const classNames = str.trim().split(/\\s+/);\n  for (const name of classNames) {\n    obj[name] = true;\n  }\n  return obj;\n}\n</script>","<template>\n  <label :class=\"_classStringToObject(styles.toggle)\">\n    {{ label }}\n    <input\n      type=\"checkbox\"\n      :class=\"_classStringToObject(`${styles.input} ${styles['sr-only']}`)\"\n      @input=\"handleChange($event)\"\n      :checked=\"checked\"\n      :disabled=\"disabled\"\n    />\n    <span :class=\"_classStringToObject(styles.display)\"></span>\n  </label>\n</template>\n\n<script setup lang=\"ts\">\nimport { ToggleSwitchProps } from \"../types\";\nimport styles from \"./index.module.css\";\n\nconst props = defineProps<ToggleSwitchProps>();\n\nfunction _classStringToObject(str: string) {\n  const obj: Record<string, boolean> = {};\n  if (typeof str !== \"string\") {\n    return obj;\n  }\n  const classNames = str.trim().split(/\\s+/);\n  for (const name of classNames) {\n    obj[name] = true;\n  }\n  return obj;\n}\n</script>","<template>\n  <template v-if=\"connection !== undefined || connection !== null\">\n    <div :class=\"_classStringToObject(classes.container)\">\n      <template v-if=\"displayPrompt\">\n        <div :class=\"_classStringToObject(classes.displayMessage)\">\n          <span\n            >Do you want to {{ ` ${connectionAction} ` }} the connection?</span\n          >\n          <div>\n            <button\n              name=\"Confirm\"\n              :variant=\"connection.deactivated ? 'primary' : 'destructive'\"\n              :handleClick=\"onConfirm\"\n            ></button>\n            <spacer :x=\"1.5\"></spacer>\n            <button\n              name=\"Cancel\"\n              variant=\"outline\"\n              :handleClick=\"onCancel\"\n            ></button>\n          </div>\n        </div>\n      </template>\n\n      <template v-if=\"!displayPrompt\">\n        <toggle-switch\n          :label=\"connectionStatus\"\n          :handleChange=\"askForConfirmation\"\n          :checked=\"!connection.deactivated\"\n          :disabled=\"displayPrompt\"\n        ></toggle-switch>\n      </template>\n    </div>\n  </template>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref } from \"vue\";\n\nimport type { ToggleConnectionStatusProps } from \"../types\";\nimport { ApiResponse } from \"../types\";\nimport defaultClasses from \"./index.module.css\";\nimport cssClassAssembler from \"../../utils/cssClassAssembler\";\nimport ToggleSwitch from \"../../../shared/ToggleSwitch/index.vue\";\nimport Button from \"../../../shared/Button/index.vue\";\nimport Spacer from \"../../../shared/Spacer/index.vue\";\n\nconst props = defineProps<ToggleConnectionStatusProps>();\nconst displayPrompt = ref(false);\n\nconst connectionStatus = computed(() => {\n  return props.connection.deactivated ? \"Inactive\" : \"Active\";\n});\nconst connectionAction = computed(() => {\n  return props.connection.deactivated ? \"activate\" : \"deactivate\";\n});\nconst classes = computed(() => {\n  return {\n    container: cssClassAssembler(\n      props.classNames?.container,\n      defaultClasses.container\n    ),\n    heading: cssClassAssembler(\n      props.classNames?.heading,\n      defaultClasses.heading\n    ),\n    confirmBtn: cssClassAssembler(\n      props.classNames?.confirmBtn,\n      defaultClasses.confirmBtn\n    ),\n    cancelBtn: cssClassAssembler(\n      props.classNames?.cancelBtn,\n      defaultClasses.cancelBtn\n    ),\n    toggle: cssClassAssembler(props.classNames?.toggle, defaultClasses.toggle),\n    displayMessage: cssClassAssembler(\n      props.classNames?.displayMessage,\n      defaultClasses.displayMessage\n    ),\n    toggleTransition: cssClassAssembler(\n      props.classNames?.toggleTransition,\n      defaultClasses.toggleTransition\n    ),\n  };\n});\n\nfunction askForConfirmation() {\n  displayPrompt.value = true;\n}\nfunction onCancel() {\n  displayPrompt.value = false;\n}\nfunction onConfirm() {\n  updateConnectionStatus(!props.connection.deactivated);\n}\nfunction updateConnectionStatus(status: boolean) {\n  async function sendHTTPrequest() {\n    const body = {\n      clientID: props.connection?.clientID,\n      clientSecret: props.connection?.clientSecret,\n      tenant: props.connection?.tenant,\n      product: props.connection?.product,\n      deactivated: status,\n      isSAML: false,\n      isOIDC: false,\n    };\n    if (\"idpMetadata\" in props.connection) {\n      body[\"isSAML\"] = true;\n    } else {\n      body[\"isOIDC\"] = true;\n    }\n    const res = await fetch(props.urls.patch, {\n      method: \"PATCH\",\n      headers: {\n        \"Content-Type\": \"application/json\",\n      },\n      body: JSON.stringify(body),\n    });\n    const response: ApiResponse = await res.json();\n    displayPrompt.value = false;\n    if (\"error\" in response) {\n      props.errorCallback(response.error.message);\n      return;\n    }\n    if (body.deactivated) {\n      props.successCallback(\"Connection Deactivated\");\n    } else {\n      props.successCallback(\"Connection Activated\");\n    }\n  }\n  sendHTTPrequest();\n}\nfunction _classStringToObject(str: string) {\n  const obj: Record<string, boolean> = {};\n  if (typeof str !== \"string\") {\n    return obj;\n  }\n  const classNames = str.trim().split(/\\s+/);\n  for (const name of classNames) {\n    obj[name] = true;\n  }\n  return obj;\n}\n</script>","<template>\n  <div>\n    <template v-if=\"!isPromptVisible\">\n      <button\n        name=\"Delete\"\n        variant=\"destructive\"\n        type=\"button\"\n        :handleClick=\"askForConfirmation\"\n      ></button>\n    </template>\n\n    <template v-if=\"isPromptVisible\">\n      <div :class=\"_classStringToObject(defaultClasses.confirmationDiv)\">\n        <h6>{{ promptMessge }}</h6>\n        <div :class=\"_classStringToObject(defaultClasses.buttonsDiv)\">\n          <button\n            name=\"Confirm\"\n            type=\"button\"\n            variant=\"destructive\"\n            :handleClick=\"handleConfirm\"\n          ></button>\n          <button\n            name=\"Cancel\"\n            type=\"button\"\n            variant=\"outline\"\n            :handleClick=\"handleCancel\"\n          ></button>\n        </div>\n      </div>\n    </template>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from \"vue\";\n\nimport Button from \"../Button/index.vue\";\nimport { ConfirmationPromptProps } from \"../types\";\nimport defaultClasses from \"./index.module.css\";\n\nconst props = defineProps<ConfirmationPromptProps>();\nconst isPromptVisible = ref(false);\n\nfunction askForConfirmation() {\n  isPromptVisible.value = true;\n}\nfunction handleCancel() {\n  isPromptVisible.value = false;\n}\nfunction handleConfirm(event: Event) {\n  isPromptVisible.value = false;\n  props.confirmationCallback(event);\n}\nfunction _classStringToObject(str: string) {\n  const obj: Record<string, boolean> = {};\n  if (typeof str !== \"string\") {\n    return obj;\n  }\n  const classNames = str.trim().split(/\\s+/);\n  for (const name of classNames) {\n    obj[name] = true;\n  }\n  return obj;\n}\n</script>","<template>\n  <div>\n    <div :class=\"_classStringToObject(defaultClasses.formDiv)\">\n      <div :class=\"_classStringToObject(defaultClasses.labelDiv)\">\n        <h2 :class=\"_classStringToObject(defaultClasses.heading)\">\n          Edit SSO Connection\n        </h2>\n        <toggle-connection-status\n          :connection=\"connection\"\n          :urls=\"{\n            patch: urls.patch,\n          }\"\n          :errorCallback=\"errorCallback\"\n          :successCallback=\"successCallback\"\n        ></toggle-connection-status>\n      </div>\n      <div>\n        <form method=\"post\" @submit=\"saveSSOConnection($event)\">\n          <div :class=\"_classStringToObject(classes.fieldsContainer)\">\n            <div :class=\"_classStringToObject(classes.fieldsDiv)\">\n              <template v-if=\"formVariant === 'advanced'\">\n                <template v-if=\"!isExcluded('name')\">\n                  <div :class=\"_classStringToObject(defaultClasses.field)\">\n                    <div :class=\"_classStringToObject(defaultClasses.labelDiv)\">\n                      <label\n                        for=\"name\"\n                        :class=\"_classStringToObject(classes.label)\"\n                      >\n                        Name\n                      </label>\n                    </div>\n                    <input\n                      name=\"name\"\n                      id=\"name\"\n                      type=\"text\"\n                      placeholder=\"MyApp\"\n                      :class=\"_classStringToObject(classes.input)\"\n                      @input=\"handleChange($event)\"\n                      :value=\"oidcConnection.name\"\n                    />\n                  </div>\n                </template>\n\n                <template v-if=\"!isExcluded('description')\">\n                  <div :class=\"_classStringToObject(defaultClasses.field)\">\n                    <div :class=\"_classStringToObject(defaultClasses.labelDiv)\">\n                      <label\n                        for=\"description\"\n                        :class=\"_classStringToObject(classes.label)\"\n                      >\n                        Description\n                      </label>\n                    </div>\n                    <input\n                      name=\"description\"\n                      id=\"description\"\n                      type=\"text\"\n                      placeholder=\"A short description not more than 100 characters\"\n                      :class=\"_classStringToObject(classes.input)\"\n                      :maxLength=\"100\"\n                      :required=\"false\"\n                      @input=\"handleChange($event)\"\n                      :value=\"oidcConnection.description\"\n                    />\n                  </div>\n                </template>\n\n                <template v-if=\"!isExcluded('redirectUrl')\">\n                  <div :class=\"_classStringToObject(defaultClasses.field)\">\n                    <div :class=\"_classStringToObject(defaultClasses.labelDiv)\">\n                      <label\n                        for=\"redirectUrl\"\n                        :class=\"_classStringToObject(classes.label)\"\n                      >\n                        Allowed redirect URLs (newline separated)\n                      </label>\n                    </div>\n                    <textarea\n                      id=\"redirectUrl\"\n                      name=\"redirectUrl\"\n                      placeholder=\"http://localhost:3366\"\n                      :class=\"_classStringToObject(classes.textarea)\"\n                      :required=\"true\"\n                      :rows=\"3\"\n                      @input=\"handleChange($event)\"\n                      :value=\"oidcConnection.redirectUrl\"\n                    ></textarea>\n                  </div>\n                </template>\n\n                <template v-if=\"!isExcluded('defaultRedirectUrl')\">\n                  <div :class=\"_classStringToObject(defaultClasses.field)\">\n                    <div :class=\"_classStringToObject(defaultClasses.labelDiv)\">\n                      <label\n                        for=\"defaultRedirectUrl\"\n                        :class=\"_classStringToObject(classes.label)\"\n                      >\n                        Default redirect URL\n                      </label>\n                    </div>\n                    <input\n                      name=\"defaultRedirectUrl\"\n                      id=\"defaultRedirectUrl\"\n                      type=\"url\"\n                      placeholder=\"http://localhost:3366/login/saml\"\n                      :class=\"_classStringToObject(classes.input)\"\n                      :required=\"true\"\n                      @input=\"handleChange($event)\"\n                      :value=\"oidcConnection.defaultRedirectUrl\"\n                    />\n                  </div>\n                </template>\n              </template>\n\n              <div :class=\"_classStringToObject(defaultClasses.field)\">\n                <div :class=\"_classStringToObject(defaultClasses.labelDiv)\">\n                  <label\n                    for=\"oidcClientId\"\n                    :class=\"_classStringToObject(classes.label)\"\n                  >\n                    Client ID [OIDC Provider]\n                  </label>\n                </div>\n                <input\n                  name=\"oidcClientId\"\n                  id=\"oidcClientId\"\n                  type=\"text\"\n                  placeholder=\"\"\n                  :class=\"_classStringToObject(classes.input)\"\n                  :required=\"true\"\n                  @input=\"handleChange($event)\"\n                  :value=\"oidcConnection.oidcClientId\"\n                />\n              </div>\n              <secret-input-form-control\n                label=\"Client Secret [OIDC Provider]\"\n                id=\"oidcClientSecret\"\n                placeholder=\"\"\n                :value=\"oidcConnection.oidcClientSecret\"\n                :required=\"true\"\n                :readOnly=\"false\"\n                :copyDoneCallback=\"copyDoneCallback\"\n                :handleChange=\"handleChange\"\n              ></secret-input-form-control>\n\n              <template v-if=\"hasDiscoveryUrl\">\n                <div :class=\"_classStringToObject(defaultClasses.field)\">\n                  <div :class=\"_classStringToObject(defaultClasses.labelDiv)\">\n                    <label\n                      for=\"oidcDiscoveryUrl\"\n                      :class=\"_classStringToObject(classes.label)\"\n                    >\n                      Well-known URL of OpenID Provider\n                    </label>\n                    <button\n                      type=\"button\"\n                      :class=\"_classStringToObject(defaultClasses.hint)\"\n                      @click=\"toggleHasDiscoveryUrl()\"\n                    >\n                      Missing the discovery URL? Click here to set the\n                      individual attributes\n                    </button>\n                  </div>\n                  <input\n                    name=\"oidcDiscoveryUrl\"\n                    id=\"oidcDiscoveryUrl\"\n                    type=\"url\"\n                    placeholder=\"https://example.com/.well-known/openid-configuration\"\n                    :class=\"_classStringToObject(classes.input)\"\n                    :required=\"true\"\n                    @input=\"handleChange($event)\"\n                    :value=\"oidcConnection.oidcDiscoveryUrl\"\n                  />\n                </div>\n              </template>\n\n              <template v-if=\"!hasDiscoveryUrl\">\n                <div :class=\"_classStringToObject(defaultClasses.field)\">\n                  <div :class=\"_classStringToObject(defaultClasses.labelDiv)\">\n                    <label\n                      for=\"issuer\"\n                      :class=\"_classStringToObject(classes.label)\"\n                    >\n                      Issuer\n                    </label>\n                    <button\n                      type=\"button\"\n                      :class=\"_classStringToObject(defaultClasses.hint)\"\n                      @click=\"toggleHasDiscoveryUrl()\"\n                    >\n                      Have a discovery URL? Click here to set it\n                    </button>\n                  </div>\n                  <input\n                    name=\"oidcMetadata.issuer\"\n                    id=\"issuer\"\n                    type=\"url\"\n                    :class=\"_classStringToObject(classes.input)\"\n                    @input=\"handleChange($event)\"\n                    :value=\"oidcConnection['oidcMetadata.issuer']\"\n                  />\n                </div>\n\n                <div :class=\"_classStringToObject(defaultClasses.field)\">\n                  <div :class=\"_classStringToObject(defaultClasses.labelDiv)\">\n                    <label\n                      for=\"authorization_endpoint\"\n                      :class=\"_classStringToObject(classes.label)\"\n                    >\n                      Authorization Endpoint\n                    </label>\n                  </div>\n                  <input\n                    id=\"authorization_endpoint\"\n                    name=\"oidcMetadata.authorization_endpoint\"\n                    type=\"url\"\n                    :class=\"_classStringToObject(classes.input)\"\n                    @input=\"handleChange($event)\"\n                    :value=\"\n                      oidcConnection['oidcMetadata.authorization_endpoint']\n                    \"\n                  />\n                </div>\n\n                <div :class=\"_classStringToObject(defaultClasses.field)\">\n                  <div :class=\"_classStringToObject(defaultClasses.labelDiv)\">\n                    <label\n                      for=\"token_endpoint\"\n                      :class=\"_classStringToObject(classes.label)\"\n                    >\n                      Token endpoint\n                    </label>\n                  </div>\n                  <input\n                    id=\"token_endpoint\"\n                    name=\"oidcMetadata.token_endpoint\"\n                    type=\"url\"\n                    :class=\"_classStringToObject(classes.input)\"\n                    @input=\"handleChange($event)\"\n                    :value=\"oidcConnection['oidcMetadata.token_endpoint']\"\n                  />\n                </div>\n\n                <div :class=\"_classStringToObject(defaultClasses.field)\">\n                  <div :class=\"_classStringToObject(defaultClasses.labelDiv)\">\n                    <label\n                      for=\"jwks_uri\"\n                      :class=\"_classStringToObject(classes.label)\"\n                    >\n                      JWKS URI\n                    </label>\n                  </div>\n                  <input\n                    id=\"jwks_uri\"\n                    name=\"oidcMetadata.jwks_uri\"\n                    type=\"url\"\n                    :class=\"_classStringToObject(classes.input)\"\n                    @input=\"handleChange($event)\"\n                    :value=\"oidcConnection['oidcMetadata.jwks_uri']\"\n                  />\n                </div>\n\n                <div :class=\"_classStringToObject(defaultClasses.field)\">\n                  <div :class=\"_classStringToObject(defaultClasses.labelDiv)\">\n                    <label\n                      for=\"userinfo_endpoint\"\n                      :class=\"_classStringToObject(classes.label)\"\n                    >\n                      UserInfo endpoint\n                    </label>\n                  </div>\n                  <input\n                    id=\"userinfo_endpoint\"\n                    name=\"oidcMetadata.userinfo_endpoint\"\n                    type=\"url\"\n                    :class=\"_classStringToObject(classes.input)\"\n                    @input=\"handleChange($event)\"\n                    :value=\"oidcConnection['oidcMetadata.userinfo_endpoint']\"\n                  />\n                </div>\n              </template>\n            </div>\n            <div :class=\"_classStringToObject(classes.fieldsDiv)\">\n              <template v-if=\"formVariant === 'advanced'\">\n                <template v-if=\"!isExcluded('tenant')\">\n                  <div :class=\"_classStringToObject(defaultClasses.field)\">\n                    <div :class=\"_classStringToObject(defaultClasses.labelDiv)\">\n                      <label\n                        for=\"tenant\"\n                        :class=\"_classStringToObject(classes.label)\"\n                      >\n                        Tenant\n                      </label>\n                    </div>\n                    <input\n                      name=\"tenant\"\n                      id=\"tenant\"\n                      placeholder=\"acme.com\"\n                      type=\"text\"\n                      :class=\"_classStringToObject(classes.input)\"\n                      :required=\"true\"\n                      :disabled=\"true\"\n                      :value=\"connection.tenant\"\n                    />\n                  </div>\n                </template>\n\n                <template v-if=\"!isExcluded('product')\">\n                  <div :class=\"_classStringToObject(defaultClasses.field)\">\n                    <div :class=\"_classStringToObject(defaultClasses.labelDiv)\">\n                      <label\n                        for=\"product\"\n                        :class=\"_classStringToObject(classes.label)\"\n                      >\n                        Product\n                      </label>\n                    </div>\n                    <input\n                      name=\"product\"\n                      id=\"product\"\n                      type=\"text\"\n                      placeholder=\"demo\"\n                      :class=\"_classStringToObject(classes.input)\"\n                      :required=\"true\"\n                      :disabled=\"true\"\n                      :value=\"connection.product\"\n                    />\n                  </div>\n                </template>\n              </template>\n\n              <div :class=\"_classStringToObject(defaultClasses.field)\">\n                <div :class=\"_classStringToObject(defaultClasses.labelDiv)\">\n                  <label\n                    for=\"clientID\"\n                    :class=\"_classStringToObject(classes.label)\"\n                  >\n                    Client ID\n                  </label>\n                </div>\n                <input\n                  name=\"clientID\"\n                  id=\"clientID\"\n                  type=\"text\"\n                  :class=\"_classStringToObject(classes.input)\"\n                  :required=\"true\"\n                  :disabled=\"true\"\n                  :value=\"connection.clientID\"\n                />\n              </div>\n              <secret-input-form-control\n                label=\"Client Secret\"\n                id=\"clientSecret\"\n                :value=\"connection.clientSecret\"\n                :required=\"true\"\n                :readOnly=\"true\"\n                :copyDoneCallback=\"copyDoneCallback\"\n                :handleChange=\"handleChange\"\n              ></secret-input-form-control>\n            </div>\n          </div>\n          <spacer :y=\"4\"></spacer>\n          <div :class=\"_classStringToObject(defaultClasses.formAction)\">\n            <template v-if=\"typeof cancelCallback === 'function'\">\n              <button\n                type=\"button\"\n                name=\"Cancel\"\n                variant=\"outline\"\n                :handleClick=\"cancelCallback\"\n              ></button>\n            </template>\n\n            <button type=\"submit\" name=\"Save\"></button>\n          </div>\n\n          <template v-if=\"connection?.clientID && connection.clientSecret\">\n            <section :class=\"_classStringToObject(classes.section)\">\n              <div :class=\"_classStringToObject(defaultClasses.info)\">\n                <h6\n                  :class=\"_classStringToObject(defaultClasses.sectionHeading)\"\n                >\n                  Delete this connection\n                </h6>\n                <p :class=\"_classStringToObject(defaultClasses.sectionPara)\">\n                  All your apps using this connection will stop working.\n                </p>\n              </div>\n              <confirmation-prompt\n                promptMessge=\"Are you sure you want to delete the Connection? This action cannot be undone and will permanently delete the Connection.\"\n                :confirmationCallback=\"deleteSSOConnection\"\n              ></confirmation-prompt>\n            </section>\n          </template>\n        </form>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, watch } from \"vue\";\n\nimport SecretInputFormControl from \"../../../../shared/SecretInputFormControl/index.vue\";\nimport ToggleConnectionStatus from \"../../ToggleConnectionStatus/index.vue\";\nimport type {\n  EditOIDCConnectionProps,\n  FormObj,\n  OIDCSSOConnection,\n  ApiResponse,\n  CreateConnectionProps,\n} from \"../../types\";\nimport { saveConnection, deleteConnection } from \"../../utils\";\nimport defaultClasses from \"./index.module.css\";\nimport cssClassAssembler from \"../../../utils/cssClassAssembler\";\nimport Button from \"../../../../shared/Button/index.vue\";\nimport Spacer from \"../../../../shared/Spacer/index.vue\";\nimport ConfirmationPrompt from \"../../../../shared/ConfirmationPrompt/index.vue\";\nconst DEFAULT_VALUES = {\n  variant: \"basic\",\n} satisfies Partial<CreateConnectionProps>;\nconst INITIAL_VALUES = {\n  oidcConnection: {\n    name: \"\",\n    tenant: \"\",\n    product: \"\",\n    description: \"\",\n    redirectUrl: \"\",\n    defaultRedirectUrl: \"\",\n    oidcClientSecret: \"\",\n    oidcClientId: \"\",\n    oidcDiscoveryUrl: \"\",\n    \"oidcMetadata.issuer\": \"\",\n    \"oidcMetadata.authorization_endpoint\": \"\",\n    \"oidcMetadata.token_endpoint\": \"\",\n    \"oidcMetadata.jwks_uri\": \"\",\n    \"oidcMetadata.userinfo_endpoint\": \"\",\n  },\n};\n\ntype Keys = keyof typeof INITIAL_VALUES.oidcConnection;\ntype Values = (typeof INITIAL_VALUES.oidcConnection)[Keys];\n\nconst props = defineProps<EditOIDCConnectionProps>();\nconst oidcConnection = ref(INITIAL_VALUES.oidcConnection);\nconst hasDiscoveryUrl = ref(true);\n\nconst formVariant = computed(() => {\n  return props.variant || DEFAULT_VALUES.variant;\n});\nconst classes = computed(() => {\n  return {\n    formDiv: cssClassAssembler(\n      props.classNames?.formDiv,\n      defaultClasses.formDiv\n    ),\n    fieldsContainer: cssClassAssembler(\n      props.classNames?.fieldsContainer,\n      defaultClasses.fieldsContainer\n    ),\n    fieldsDiv: cssClassAssembler(\n      props.classNames?.fieldsDiv,\n      defaultClasses.fieldsDiv\n    ),\n    label: cssClassAssembler(props.classNames?.label, defaultClasses.label),\n    input: cssClassAssembler(props.classNames?.input, defaultClasses.input),\n    textarea: cssClassAssembler(\n      props.classNames?.input,\n      defaultClasses.input + \" \" + defaultClasses.textarea\n    ),\n    section: cssClassAssembler(\n      props.classNames?.section,\n      defaultClasses.section\n    ),\n  };\n});\n\nwatch(\n  () => [props.connection],\n  ([connection]) => {\n    oidcConnection.value = {\n      name: props.connection.name || \"\",\n      tenant: props.connection.tenant || \"\",\n      product: props.connection.product || \"\",\n      description: props.connection.description || \"\",\n      redirectUrl: props.connection.redirectUrl.join(`\\r\n`),\n      defaultRedirectUrl: props.connection.defaultRedirectUrl,\n      oidcClientId: props.connection.oidcProvider.clientId || \"\",\n      oidcClientSecret: props.connection.oidcProvider.clientSecret || \"\",\n      oidcDiscoveryUrl: props.connection.oidcProvider.discoveryUrl || \"\",\n      \"oidcMetadata.issuer\":\n        props.connection.oidcProvider.metadata?.issuer || \"\",\n      \"oidcMetadata.authorization_endpoint\":\n        props.connection.oidcProvider.metadata?.authorization_endpoint || \"\",\n      \"oidcMetadata.token_endpoint\":\n        props.connection.oidcProvider.metadata?.token_endpoint || \"\",\n      \"oidcMetadata.jwks_uri\":\n        props.connection.oidcProvider.metadata?.jwks_uri || \"\",\n      \"oidcMetadata.userinfo_endpoint\":\n        props.connection.oidcProvider.metadata?.userinfo_endpoint || \"\",\n    };\n    hasDiscoveryUrl.value = props.connection.oidcProvider.discoveryUrl\n      ? true\n      : false;\n  },\n  { immediate: true }\n);\nfunction isExcluded(fieldName: keyof OIDCSSOConnection) {\n  return !!(props.excludeFields as (keyof OIDCSSOConnection)[])?.includes(\n    fieldName\n  );\n}\nfunction toggleHasDiscoveryUrl() {\n  hasDiscoveryUrl.value = !hasDiscoveryUrl.value;\n}\nfunction updateConnection(key: Keys, newValue: Values) {\n  return {\n    ...oidcConnection.value,\n    [key]: newValue,\n  };\n}\nfunction handleChange(event: Event) {\n  const target = event.target as HTMLInputElement | HTMLTextAreaElement;\n  const name = target.name as Keys;\n  const targetValue = (\n    event.currentTarget as HTMLInputElement | HTMLTextAreaElement\n  )?.value;\n  oidcConnection.value = updateConnection(name, targetValue);\n}\nfunction saveSSOConnection(event: Event) {\n  event.preventDefault();\n  const formObj: Partial<OIDCSSOConnection> = {};\n  Object.entries(oidcConnection).map(([key, val]) => {\n    if (key.startsWith(\"oidcMetadata.\")) {\n      if (formObj.oidcMetadata === undefined) {\n        formObj.oidcMetadata = {} as OIDCSSOConnection[\"oidcMetadata\"];\n      }\n      formObj.oidcMetadata![key.replace(\"oidcMetadata.\", \"\")] = val;\n    } else {\n      formObj[key as keyof Omit<OIDCSSOConnection, \"oidcMetadata\">] = val;\n    }\n  });\n  saveConnection({\n    url: props.urls.patch,\n    isEditView: true,\n    formObj: formObj as FormObj,\n    connectionIsOIDC: true,\n    callback: async (rawResponse: any) => {\n      const response: ApiResponse = await rawResponse.json();\n      if (\"error\" in response) {\n        props.errorCallback(response.error.message);\n        return;\n      }\n      if (rawResponse.ok) {\n        props.successCallback();\n      }\n    },\n  });\n}\nfunction deleteSSOConnection(event: Event) {\n  event.preventDefault();\n  deleteConnection({\n    url: props.urls.delete,\n    clientId: props.connection.clientID,\n    clientSecret: props.connection.clientSecret,\n    callback: async (rawResponse: any) => {\n      const response: ApiResponse = await rawResponse.json();\n      if (\"error\" in response) {\n        props.errorCallback(response.error.message);\n        return;\n      }\n      if (rawResponse.ok) {\n        props.successCallback();\n      }\n    },\n  });\n}\nfunction _classStringToObject(str: string) {\n  const obj: Record<string, boolean> = {};\n  if (typeof str !== \"string\") {\n    return obj;\n  }\n  const classNames = str.trim().split(/\\s+/);\n  for (const name of classNames) {\n    obj[name] = true;\n  }\n  return obj;\n}\n</script>","<template>\n  <article\n    :class=\"_classStringToObject(`${styles.container}${variantCss}${flexCss}`)\"\n  >\n    <h3 :class=\"_classStringToObject(styles.title)\">\n      <template v-if=\"variant === 'success'\">\n        <check-mark-icon></check-mark-icon>\n      </template>\n\n      <template v-if=\"variant === 'info'\">\n        <info-icon></info-icon>\n      </template>\n\n      {{ title }}\n    </h3>\n    <div :class=\"_classStringToObject(styles.body)\"><slot /></div>\n  </article>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from \"vue\";\n\nimport { CardProps } from \"../types\";\nimport styles from \"./index.module.css\";\nimport CheckMarkIcon from \"../icons/CheckMarkIcon.vue\";\nimport InfoIcon from \"../icons/InfoIcon.vue\";\n\nconst props = defineProps<CardProps>();\n\nconst variantCss = computed(() => {\n  return props.variant ? \" \" + styles[props.variant] : \"\";\n});\nconst flexCss = computed(() => {\n  return props.arrangement === \"vertical\" ? \" \" + styles[\"vertical\"] : \"\";\n});\n\nfunction _classStringToObject(str: string) {\n  const obj: Record<string, boolean> = {};\n  if (typeof str !== \"string\") {\n    return obj;\n  }\n  const classNames = str.trim().split(/\\s+/);\n  for (const name of classNames) {\n    obj[name] = true;\n  }\n  return obj;\n}\n</script>","<template>\n  <div>\n    <div :class=\"_classStringToObject(defaultClasses.formDiv)\">\n      <div :class=\"_classStringToObject(defaultClasses.labelDiv)\">\n        <h2 :class=\"_classStringToObject(defaultClasses.heading)\">\n          Edit SSO Connection\n        </h2>\n        <toggle-connection-status\n          :connection=\"connection\"\n          :urls=\"{\n            patch: urls.patch,\n          }\"\n          :errorCallback=\"errorCallback\"\n          :successCallback=\"successCallback\"\n        ></toggle-connection-status>\n      </div>\n      <div>\n        <form method=\"post\" @submit=\"saveSSOConnection($event)\">\n          <template v-if=\"formVariant === 'advanced'\">\n            <template v-if=\"!isExcluded('name')\">\n              <div :class=\"_classStringToObject(defaultClasses.field)\">\n                <div :class=\"_classStringToObject(defaultClasses.labelDiv)\">\n                  <label\n                    for=\"name\"\n                    :class=\"_classStringToObject(classes.label)\"\n                  >\n                    Name\n                  </label>\n                </div>\n                <input\n                  type=\"text\"\n                  name=\"name\"\n                  id=\"name\"\n                  placeholder=\"MyApp\"\n                  :class=\"_classStringToObject(classes.input)\"\n                  :required=\"false\"\n                  @input=\"handleChange($event)\"\n                  :value=\"samlConnection.name\"\n                />\n              </div>\n            </template>\n\n            <template v-if=\"!isExcluded('description')\">\n              <div :class=\"_classStringToObject(defaultClasses.field)\">\n                <div :class=\"_classStringToObject(defaultClasses.labelDiv)\">\n                  <label\n                    for=\"description\"\n                    :class=\"_classStringToObject(classes.label)\"\n                  >\n                    Description\n                  </label>\n                </div>\n                <input\n                  type=\"text\"\n                  name=\"description\"\n                  id=\"description\"\n                  placeholder=\"A short description not more than 100 characters\"\n                  :class=\"_classStringToObject(classes.input)\"\n                  :maxLength=\"100\"\n                  :required=\"false\"\n                  @input=\"handleChange($event)\"\n                  :value=\"samlConnection.description\"\n                />\n              </div>\n            </template>\n\n            <template v-if=\"!isExcluded('redirectUrl')\">\n              <div :class=\"_classStringToObject(defaultClasses.field)\">\n                <div :class=\"_classStringToObject(defaultClasses.labelDiv)\">\n                  <label\n                    for=\"redirectUrl\"\n                    :class=\"_classStringToObject(classes.label)\"\n                  >\n                    Allowed redirect URLs (newline separated)\n                  </label>\n                </div>\n                <textarea\n                  id=\"redirectUrl\"\n                  name=\"redirectUrl\"\n                  placeholder=\"http://localhost:3366\"\n                  :class=\"_classStringToObject(classes.textarea)\"\n                  :required=\"true\"\n                  :rows=\"3\"\n                  @input=\"handleChange($event)\"\n                  :value=\"samlConnection.redirectUrl\"\n                ></textarea>\n              </div>\n            </template>\n\n            <template v-if=\"!isExcluded('defaultRedirectUrl')\">\n              <div :class=\"_classStringToObject(defaultClasses.field)\">\n                <div :class=\"_classStringToObject(defaultClasses.labelDiv)\">\n                  <label\n                    for=\"defaultRedirectUrl\"\n                    :class=\"_classStringToObject(classes.label)\"\n                  >\n                    Default redirect URL\n                  </label>\n                </div>\n                <input\n                  name=\"defaultRedirectUrl\"\n                  id=\"defaultRedirectUrl\"\n                  type=\"url\"\n                  placeholder=\"http://localhost:3366/login/saml\"\n                  :class=\"_classStringToObject(classes.input)\"\n                  :required=\"true\"\n                  @input=\"handleChange($event)\"\n                  :value=\"samlConnection.defaultRedirectUrl\"\n                />\n              </div>\n            </template>\n          </template>\n\n          <div :class=\"_classStringToObject(defaultClasses.field)\">\n            <div :class=\"_classStringToObject(defaultClasses.labelWithAction)\">\n              <label\n                for=\"rawMetadata\"\n                :class=\"_classStringToObject(classes.label)\"\n              >\n                Raw IdP XML\n              </label>\n            </div>\n            <textarea\n              name=\"rawMetadata\"\n              id=\"rawMetadata\"\n              placeholder=\"Paste the raw XML here\"\n              :class=\"_classStringToObject(classes.textarea)\"\n              :rows=\"5\"\n              :required=\"samlConnection.metadataUrl === ''\"\n              @change=\"handleChange($event)\"\n              :value=\"samlConnection.rawMetadata\"\n            ></textarea>\n          </div>\n          <separator text=\"OR\"></separator>\n          <spacer :y=\"6\"></spacer>\n          <div :class=\"_classStringToObject(defaultClasses.field)\">\n            <div :class=\"_classStringToObject(defaultClasses.labelWithAction)\">\n              <label\n                for=\"metadataUrl\"\n                :class=\"_classStringToObject(classes.label)\"\n              >\n                Metadata URL\n              </label>\n            </div>\n            <input\n              name=\"metadataUrl\"\n              id=\"metadataUrl\"\n              type=\"url\"\n              placeholder=\"Paste the Metadata URL here\"\n              :class=\"_classStringToObject(classes.input)\"\n              :required=\"samlConnection.rawMetadata === ''\"\n              @input=\"handleChange($event)\"\n              :value=\"samlConnection.metadataUrl\"\n            />\n          </div>\n\n          <template v-if=\"formVariant === 'advanced'\">\n            <template v-if=\"!isExcluded('forceAuthn')\">\n              <div :class=\"_classStringToObject(defaultClasses.field)\">\n                <div :class=\"_classStringToObject(defaultClasses.labelDiv)\">\n                  <label\n                    for=\"forceAuthn\"\n                    :class=\"_classStringToObject(classes.label)\"\n                  >\n                    Force Authentication\n                  </label>\n                </div>\n                <input\n                  name=\"forceAuthn\"\n                  id=\"forceAuthn\"\n                  type=\"checkbox\"\n                  :class=\"_classStringToObject(defaultClasses.checkbox)\"\n                  @input=\"handleChange($event)\"\n                  :checked=\"samlConnection.forceAuthn === true\"\n                  :required=\"false\"\n                />\n              </div>\n            </template>\n          </template>\n\n          <card title=\"Connection info\" variant=\"info\" arrangement=\"vertical\">\n            <div :class=\"_classStringToObject(defaultClasses.info)\">\n              <template v-if=\"formVariant === 'advanced'\">\n                <template v-if=\"!isExcluded('tenant')\">\n                  <div :class=\"_classStringToObject(defaultClasses.field)\">\n                    <div :class=\"_classStringToObject(defaultClasses.labelDiv)\">\n                      <label\n                        for=\"tenant\"\n                        :class=\"_classStringToObject(classes.label)\"\n                      >\n                        Tenant\n                      </label>\n                    </div>\n                    <input\n                      name=\"tenant\"\n                      id=\"tenant\"\n                      placeholder=\"acme.com\"\n                      :class=\"_classStringToObject(classes.input)\"\n                      :required=\"true\"\n                      :readOnly=\"true\"\n                      :value=\"connection.tenant\"\n                    />\n                  </div>\n                </template>\n\n                <template v-if=\"!isExcluded('product')\">\n                  <div :class=\"_classStringToObject(defaultClasses.field)\">\n                    <div :class=\"_classStringToObject(defaultClasses.labelDiv)\">\n                      <label\n                        for=\"product\"\n                        :class=\"_classStringToObject(classes.label)\"\n                      >\n                        Product\n                      </label>\n                    </div>\n                    <input\n                      name=\"product\"\n                      id=\"product\"\n                      type=\"text\"\n                      placeholder=\"demo\"\n                      :class=\"_classStringToObject(classes.input)\"\n                      :required=\"true\"\n                      :readOnly=\"true\"\n                      :value=\"connection.product\"\n                    />\n                  </div>\n                </template>\n              </template>\n\n              <div :class=\"_classStringToObject(defaultClasses.field)\">\n                <div :class=\"_classStringToObject(defaultClasses.labelDiv)\">\n                  <label\n                    for=\"idpMetadata\"\n                    :class=\"_classStringToObject(classes.label)\"\n                  >\n                    IdP Metadata\n                  </label>\n                </div>\n                <pre\n                  :aria-readonly=\"true\"\n                  :class=\"_classStringToObject(defaultClasses.pre)\"\n                >\n                   {{ JSON.stringify(connection.idpMetadata, null, 2) }}\n                 </pre\n                >\n              </div>\n              <div :class=\"_classStringToObject(defaultClasses.field)\">\n                <div :class=\"_classStringToObject(defaultClasses.labelDiv)\">\n                  <label\n                    for=\"idpCertExpiry\"\n                    :class=\"_classStringToObject(classes.label)\"\n                  >\n                    IdP Certificate Validity\n                  </label>\n                </div>\n                <pre\n                  :aria-readonly=\"true\"\n                  :class=\"_classStringToObject(defaultClasses.pre)\"\n                >\n                   {{ connection.idpMetadata.validTo }}\n                 </pre\n                >\n              </div>\n              <div :class=\"_classStringToObject(defaultClasses.field)\">\n                <div :class=\"_classStringToObject(defaultClasses.labelDiv)\">\n                  <label\n                    for=\"clientID\"\n                    :class=\"_classStringToObject(classes.label)\"\n                  >\n                    Client ID\n                  </label>\n                  <copy-to-clipboard-button\n                    :text=\"connection.clientID\"\n                    :copyDoneCallback=\"copyDoneCallback\"\n                  ></copy-to-clipboard-button>\n                </div>\n                <input\n                  name=\"clientID\"\n                  id=\"clientID\"\n                  type=\"text\"\n                  :class=\"_classStringToObject(classes.input)\"\n                  :readOnly=\"true\"\n                  :value=\"connection.clientID\"\n                />\n              </div>\n              <secret-input-form-control\n                label=\"Client Secret\"\n                id=\"clientSecret\"\n                :value=\"connection.clientSecret\"\n                :readOnly=\"true\"\n                :required=\"true\"\n                :copyDoneCallback=\"copyDoneCallback\"\n                :handleChange=\"handleChange\"\n              ></secret-input-form-control>\n            </div>\n          </card>\n          <spacer :y=\"4\"></spacer>\n          <div :class=\"_classStringToObject(defaultClasses.formAction)\">\n            <template v-if=\"typeof cancelCallback === 'function'\">\n              <button\n                type=\"button\"\n                name=\"Cancel\"\n                variant=\"outline\"\n                :handleClick=\"cancelCallback\"\n              ></button>\n            </template>\n\n            <button type=\"submit\" name=\"Save\"></button>\n          </div>\n\n          <template v-if=\"connection?.clientID && connection.clientSecret\">\n            <section :class=\"_classStringToObject(classes.section)\">\n              <div :class=\"_classStringToObject(defaultClasses.info)\">\n                <h6\n                  :class=\"_classStringToObject(defaultClasses.sectionHeading)\"\n                >\n                  Delete this connection\n                </h6>\n                <p :class=\"_classStringToObject(defaultClasses.sectionPara)\">\n                  All your apps using this connection will stop working.\n                </p>\n              </div>\n              <confirmation-prompt\n                promptMessge=\" Are you sure you want to delete the Connection? This action cannot be undone and will permanently delete the Connection.\"\n                :confirmationCallback=\"deleteSSOConnection\"\n              ></confirmation-prompt>\n            </section>\n          </template>\n        </form>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, watch } from \"vue\";\n\nimport ToggleConnectionStatus from \"../../ToggleConnectionStatus/index.vue\";\nimport type {\n  EditSAMLConnectionProps,\n  ApiResponse,\n  CreateConnectionProps,\n  SAMLSSOConnection,\n} from \"../../types\";\nimport { saveConnection, deleteConnection } from \"../../utils\";\nimport defaultClasses from \"./index.module.css\";\nimport cssClassAssembler from \"../../../utils/cssClassAssembler\";\nimport SecretInputFormControl from \"../../../../shared/SecretInputFormControl/index.vue\";\nimport Card from \"../../../../shared/Card/index.vue\";\nimport Button from \"../../../../shared/Button/index.vue\";\nimport Spacer from \"../../../../shared/Spacer/index.vue\";\nimport CopyToClipboardButton from \"../../../../shared/ClipboardButton/index.vue\";\nimport Separator from \"../../../../shared/Separator/index.vue\";\nimport ConfirmationPrompt from \"../../../../shared/ConfirmationPrompt/index.vue\";\nconst DEFAULT_VALUES = {\n  variant: \"basic\",\n} satisfies Partial<CreateConnectionProps>;\nconst INITIAL_VALUES = {\n  samlConnection: {\n    name: \"\",\n    tenant: \"\",\n    product: \"\",\n    clientID: \"\",\n    clientSecret: \"\",\n    description: \"\",\n    redirectUrl: \"\",\n    defaultRedirectUrl: \"\",\n    rawMetadata: \"\",\n    metadataUrl: \"\",\n    forceAuthn: false as boolean,\n  },\n};\n\ntype Keys = keyof typeof INITIAL_VALUES.samlConnection;\ntype Values = (typeof INITIAL_VALUES.samlConnection)[Keys];\n\nconst props = defineProps<EditSAMLConnectionProps>();\nconst samlConnection = ref(INITIAL_VALUES.samlConnection);\n\nconst formVariant = computed(() => {\n  return props.variant || DEFAULT_VALUES.variant;\n});\nconst classes = computed(() => {\n  return {\n    formDiv: cssClassAssembler(\n      props.classNames?.formDiv,\n      defaultClasses.formDiv\n    ),\n    label: cssClassAssembler(props.classNames?.label, defaultClasses.label),\n    input: cssClassAssembler(props.classNames?.input, defaultClasses.input),\n    textarea: cssClassAssembler(\n      props.classNames?.input,\n      defaultClasses.input + \" \" + defaultClasses.textarea\n    ),\n    section: cssClassAssembler(\n      props.classNames?.section,\n      defaultClasses.section\n    ),\n  };\n});\n\nwatch(\n  () => [props.connection],\n  ([connection]) => {\n    samlConnection.value = {\n      name: props.connection.name || \"\",\n      tenant: props.connection.tenant || \"\",\n      product: props.connection.product || \"\",\n      clientID: props.connection.clientID,\n      clientSecret: props.connection.clientSecret,\n      description: props.connection.description || \"\",\n      redirectUrl: props.connection.redirectUrl.join(`\\r\n`),\n      defaultRedirectUrl: props.connection.defaultRedirectUrl,\n      rawMetadata: props.connection.rawMetadata || \"\",\n      metadataUrl: props.connection.metadataUrl || \"\",\n      forceAuthn:\n        props.connection.forceAuthn === true ||\n        props.connection.forceAuthn === \"true\",\n    };\n  },\n  { immediate: true }\n);\nfunction isExcluded(fieldName: keyof SAMLSSOConnection) {\n  return !!(props.excludeFields as (keyof SAMLSSOConnection)[])?.includes(\n    fieldName\n  );\n}\nfunction updateConnection(key: Keys, newValue: Values) {\n  return {\n    ...samlConnection.value,\n    [key]: newValue,\n  };\n}\nfunction handleChange(event: Event) {\n  const target = event.target as HTMLInputElement | HTMLTextAreaElement;\n  const name = target.name as Keys;\n  const targetValue =\n    name !== \"forceAuthn\" ? target.value : (target as HTMLInputElement).checked;\n  samlConnection.value = updateConnection(name, targetValue);\n}\nfunction saveSSOConnection(event: Event) {\n  event.preventDefault();\n  saveConnection({\n    url: props.urls.patch,\n    isEditView: true,\n    formObj:\n      props.variant === \"advanced\"\n        ? {\n            ...samlConnection.value,\n          }\n        : {\n            tenant: samlConnection.value.tenant,\n            product: samlConnection.value.product,\n            clientID: samlConnection.value.clientID,\n            clientSecret: samlConnection.value.clientSecret,\n            rawMetadata: samlConnection.value.rawMetadata,\n            metadataUrl: samlConnection.value.metadataUrl,\n          },\n    connectionIsSAML: true,\n    callback: async (rawResponse: any) => {\n      const response: ApiResponse = await rawResponse.json();\n      if (\"error\" in response) {\n        props.errorCallback(response.error.message);\n        return;\n      }\n      if (rawResponse.ok) {\n        props.successCallback();\n      }\n    },\n  });\n}\nfunction deleteSSOConnection(event: Event) {\n  event.preventDefault();\n  deleteConnection({\n    url: props.urls.delete,\n    clientId: props.connection.clientID,\n    clientSecret: props.connection.clientSecret,\n    callback: async (rawResponse: any) => {\n      const response: ApiResponse = await rawResponse.json();\n      if (\"error\" in response) {\n        props.errorCallback(response.error.message);\n        return;\n      }\n      if (rawResponse.ok) {\n        props.successCallback();\n      }\n    },\n  });\n}\nfunction _classStringToObject(str: string) {\n  const obj: Record<string, boolean> = {};\n  if (typeof str !== \"string\") {\n    return obj;\n  }\n  const classNames = str.trim().split(/\\s+/);\n  for (const name of classNames) {\n    obj[name] = true;\n  }\n  return obj;\n}\n</script>","<template>\n  <div>\n    <div :class=\"_classStringToObject(defaultClasses.listView)\">\n      <template v-if=\"view === 'LIST'\">\n        <template v-if=\"connectionsAdded\">\n          <card\n            :title=\"ssoEnabled ? 'SSO Enabled' : 'SSO Disabled'\"\n            :variant=\"ssoEnabled ? 'success' : 'info'\"\n          >\n            <div :class=\"_classStringToObject(defaultClasses.ctoa)\">\n              <template v-if=\"urls?.spMetadata\">\n                <anchor\n                  linkText=\"Access SP Metadata\"\n                  variant=\"button\"\n                  :href=\"urls.spMetadata\"\n                ></anchor>\n              </template>\n\n              <button\n                name=\"Add Connection\"\n                :handleClick=\"switchToCreateView\"\n              ></button>\n            </div>\n          </card>\n\n          <spacer :y=\"4\"></spacer>\n        </template>\n\n        <spacer :y=\"4\"></spacer>\n\n        <connection-list\n          :handleActionClick=\"switchToEditView\"\n          :handleListFetchComplete=\"handleListFetchComplete\"\n          v-bind=\"componentProps.connectionList\"\n        >\n          <card variant=\"info\" title=\"SSO not enabled\">\n            <div :class=\"_classStringToObject(defaultClasses.ctoa)\">\n              <template v-if=\"urls?.spMetadata\">\n                <anchor\n                  linkText=\"Access SP Metadata\"\n                  variant=\"button\"\n                  :href=\"urls.spMetadata\"\n                ></anchor>\n              </template>\n\n              <button\n                name=\"Add Connection\"\n                :handleClick=\"switchToCreateView\"\n              ></button>\n            </div>\n          </card>\n        </connection-list>\n      </template>\n    </div>\n\n    <template v-if=\"view === 'EDIT'\">\n      <template v-if=\"connectionToEdit && 'oidcProvider' in connectionToEdit\">\n        <edit-oidcconnection\n          variant=\"basic\"\n          :connection=\"connectionToEdit\"\n          :cancelCallback=\"switchToListView\"\n          :errorCallback=\"logError\"\n          :successCallback=\"switchToListView\"\n          :copyDoneCallback=\"copyDoneCallback\"\n          :urls=\"{\n            delete: componentProps.editOIDCConnection.urls?.delete || '',\n            patch: componentProps.editOIDCConnection.urls?.patch || '',\n          }\"\n        ></edit-oidcconnection>\n      </template>\n\n      <template v-if=\"connectionToEdit && 'idpMetadata' in connectionToEdit\">\n        <edit-samlconnection\n          variant=\"basic\"\n          :connection=\"connectionToEdit\"\n          :cancelCallback=\"switchToListView\"\n          :errorCallback=\"logError\"\n          :successCallback=\"switchToListView\"\n          :copyDoneCallback=\"copyDoneCallback\"\n          :urls=\"{\n            delete: componentProps.editSAMLConnection.urls?.delete || '',\n            patch: componentProps.editSAMLConnection.urls?.patch || '',\n          }\"\n        ></edit-samlconnection>\n      </template>\n    </template>\n\n    <template v-if=\"view === 'CREATE'\">\n      <spacer :y=\"5\"></spacer>\n\n      <create-samlconnection\n        variant=\"basic\"\n        :cancelCallback=\"switchToListView\"\n        :successCallback=\"switchToListView\"\n        :errorCallback=\"logError\"\n        :urls=\"{\n          save: '',\n        }\"\n        v-bind=\"componentProps.createSSOConnection.componentProps?.saml\"\n      ></create-samlconnection>\n    </template>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref } from \"vue\";\n\nimport ConnectionList from \"../ConnectionList/index.vue\";\nimport type {\n  ConnectionData,\n  ConnectionsWrapperProp,\n  OIDCSSORecord,\n  SAMLSSORecord,\n} from \"../types\";\nimport defaultClasses from \"./index.module.css\";\nimport EditOIDCConnection from \"../EditConnection/oidc/index.vue\";\nimport EditSAMLConnection from \"../EditConnection/saml/index.vue\";\nimport CreateSAMLConnection from \"../CreateConnection/saml/index.vue\";\nimport Button from \"../../../shared/Button/index.vue\";\nimport Spacer from \"../../../shared/Spacer/index.vue\";\nimport Card from \"../../../shared/Card/index.vue\";\nimport Anchor from \"../../../shared/Anchor/index.vue\";\nconst DEFAULT_VALUES = {\n  connectionListData: [] as ConnectionData<any>[],\n  view: \"LIST\" as \"LIST\" | \"EDIT\" | \"CREATE\",\n};\n\nconst props = defineProps<ConnectionsWrapperProp>();\nconst connections = ref(DEFAULT_VALUES.connectionListData);\nconst view = ref(DEFAULT_VALUES.view);\nconst connectionToEdit = ref({});\n\nconst connectionsAdded = computed(() => {\n  return connections.value.length > 0;\n});\nconst ssoEnabled = computed(() => {\n  return (\n    connectionsAdded &&\n    connections.value.some((connection) => connection.deactivated === false)\n  );\n});\n\nfunction handleListFetchComplete(connectionsList: ConnectionData<any>[]) {\n  connections.value = connectionsList;\n}\nfunction switchToCreateView() {\n  view.value = \"CREATE\";\n}\nfunction switchToEditView(action: \"edit\", connection: ConnectionData<any>) {\n  view.value = \"EDIT\";\n  connectionToEdit.value = connection;\n}\nfunction switchToListView() {\n  view.value = \"LIST\";\n}\nfunction logError(err: string) {\n  console.error(err);\n}\nfunction _classStringToObject(str: string) {\n  const obj: Record<string, boolean> = {};\n  if (typeof str !== \"string\") {\n    return obj;\n  }\n  const classNames = str.trim().split(/\\s+/);\n  for (const name of classNames) {\n    obj[name] = true;\n  }\n  return obj;\n}\n</script>","<template>\n  <div>\n    <well>\n      <template v-if=\"displayHeader !== undefined ? displayHeader : true\">\n        <h2 :class=\"_classStringToObject(defaultClasses.heading)\">\n          Create Directory\n        </h2>\n      </template>\n\n      <form @submit=\"onSubmit($event)\">\n        <div :class=\"_classStringToObject(classes.fieldContainer)\">\n          <label for=\"name\" :class=\"_classStringToObject(classes.label)\">\n            <span :class=\"_classStringToObject(defaultClasses.labelText)\"\n              >Directory name</span\n            >\n          </label>\n          <spacer :y=\"2\"></spacer>\n          <input\n            type=\"text\"\n            id=\"name\"\n            name=\"name\"\n            :class=\"_classStringToObject(classes.input)\"\n            :required=\"true\"\n            @input=\"handleChange($event)\"\n            :value=\"directory.name\"\n          />\n        </div>\n        <spacer :y=\"6\"></spacer>\n        <div :class=\"_classStringToObject(classes.fieldContainer)\">\n          <select\n            label=\"Directory provider\"\n            name=\"type\"\n            :options=\"providers\"\n            :selectedValue=\"directory.type\"\n            :handleChange=\"setProvider\"\n          ></select>\n        </div>\n        <spacer :y=\"6\"></spacer>\n\n        <template v-if=\"showDomain\">\n          <div :class=\"_classStringToObject(classes.fieldContainer)\">\n            <label\n              for=\"google_domain\"\n              :class=\"_classStringToObject(classes.label)\"\n            >\n              Directory domain\n            </label>\n            <spacer :y=\"2\"></spacer>\n            <input\n              type=\"text\"\n              id=\"google_domain\"\n              name=\"google_domain\"\n              title=\"Please enter a valid domain (e.g: boxyhq.com)\"\n              :class=\"_classStringToObject(classes.input)\"\n              @input=\"handleChange($event)\"\n              :value=\"directory.google_domain\"\n              :pattern=\"`^[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*\\.[a-zA-Z]{2,}$`\"\n            />\n          </div>\n        </template>\n\n        <spacer :y=\"6\"></spacer>\n\n        <template v-if=\"!setupLinkToken\">\n          <div :class=\"_classStringToObject(classes.fieldContainer)\">\n            <label for=\"tenant\" :class=\"_classStringToObject(classes.label)\">\n              Tenant\n            </label>\n            <spacer :y=\"2\"></spacer>\n            <input\n              type=\"text\"\n              id=\"tenant\"\n              name=\"tenant\"\n              :class=\"_classStringToObject(classes.input)\"\n              :required=\"true\"\n              @input=\"handleChange($event)\"\n              :value=\"directory.tenant\"\n            />\n          </div>\n          <spacer :y=\"6\"></spacer>\n          <div :class=\"_classStringToObject(classes.fieldContainer)\">\n            <label for=\"product\" :class=\"_classStringToObject(classes.label)\">\n              Product\n            </label>\n            <spacer :y=\"2\"></spacer>\n            <input\n              type=\"text\"\n              id=\"product\"\n              name=\"product\"\n              :class=\"_classStringToObject(classes.input)\"\n              :required=\"true\"\n              @input=\"handleChange($event)\"\n              :value=\"directory.product\"\n            />\n          </div>\n        </template>\n\n        <spacer :y=\"6\"></spacer>\n        <div :class=\"_classStringToObject(classes.fieldContainer)\">\n          <label for=\"webhook_url\" :class=\"_classStringToObject(classes.label)\">\n            Webhook URL\n          </label>\n          <spacer :y=\"2\"></spacer>\n          <input\n            type=\"text\"\n            id=\"webhook_url\"\n            name=\"webhook_url\"\n            :class=\"_classStringToObject(classes.input)\"\n            @input=\"handleChange($event)\"\n            :value=\"directory.webhook_url\"\n          />\n        </div>\n        <spacer :y=\"6\"></spacer>\n        <div :class=\"_classStringToObject(classes.fieldContainer)\">\n          <label\n            for=\"webhook_secret\"\n            :class=\"_classStringToObject(classes.label)\"\n          >\n            Webhook secret\n          </label>\n          <spacer :y=\"2\"></spacer>\n          <input\n            type=\"text\"\n            id=\"webhook_secret\"\n            name=\"webhook_secret\"\n            :class=\"_classStringToObject(classes.input)\"\n            @input=\"handleChange($event)\"\n            :value=\"directory.webhook_secret\"\n          />\n        </div>\n        <spacer :y=\"6\"></spacer>\n        <div :class=\"_classStringToObject(defaultClasses.formAction)\">\n          <template v-if=\"typeof cancelCallback === 'function'\">\n            <button\n              type=\"button\"\n              name=\"Cancel\"\n              variant=\"outline\"\n              :handleClick=\"cancelCallback\"\n            ></button>\n          </template>\n\n          <button\n            variant=\"primary\"\n            type=\"submit\"\n            name=\"Create Directory\"\n          ></button>\n        </div>\n      </form>\n    </well>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, onMounted, ref } from \"vue\";\n\nimport { CreateDirectoryProps, ApiResponse, Directory } from \"../types\";\nimport defaultClasses from \"./index.module.css\";\nimport cssClassAssembler from \"../../utils/cssClassAssembler\";\nimport Button from \"../../../shared/Button/index.vue\";\nimport Spacer from \"../../../shared/Spacer/index.vue\";\nimport Select from \"../../../shared/Select/index.vue\";\nimport Well from \"../../../shared/Well/index.vue\";\nconst DEFAULT_DIRECTORY_VALUES = {\n  name: \"\",\n  tenant: \"\",\n  product: \"\",\n  webhook_url: \"\",\n  webhook_secret: \"\",\n  type: \"azure-scim-v2\",\n  google_domain: \"\",\n};\nconst DEFAULT_PROVIDERS = [] as {\n  value: string;\n  text: string;\n}[];\n\nconst props = defineProps<CreateDirectoryProps>();\nconst directory = ref(DEFAULT_DIRECTORY_VALUES);\nconst showDomain = ref(false);\nconst providers = ref(DEFAULT_PROVIDERS);\n\nonMounted(() => {\n  directory.value.webhook_url = props.defaultWebhookEndpoint || \"\";\n  async function getDirectoryProviders(url: string) {\n    const response = await fetch(url);\n    const { data } = await response.json();\n    providers.value = Object.entries<string>(data).map(([value, text]) => ({\n      value,\n      text,\n    }));\n  }\n  getDirectoryProviders(props.urls.providers);\n});\n\nconst classes = computed(() => {\n  return {\n    container: cssClassAssembler(\n      props.classNames?.container,\n      defaultClasses.container\n    ),\n    fieldContainer: cssClassAssembler(\n      props.classNames?.fieldContainer,\n      defaultClasses.fieldContainer\n    ),\n    label: cssClassAssembler(props.classNames?.label, defaultClasses.label),\n    input: cssClassAssembler(props.classNames?.input, defaultClasses.input),\n  };\n});\n\nfunction setProvider(event: any) {\n  directory.value = {\n    ...directory.value,\n    type: event?.target?.value,\n  };\n}\nfunction handleChange(event: Event) {\n  const target = event.target as HTMLInputElement | HTMLTextAreaElement;\n  directory.value = {\n    ...directory.value,\n    [target.id]: target.value,\n  };\n\n  // Ask for domain if google is selected\n  if (target.id === \"type\") {\n    target.value === \"google\"\n      ? (showDomain.value = true)\n      : (showDomain.value = false);\n  }\n}\nfunction onSubmit(event: Event) {\n  event.preventDefault();\n  async function sendHTTPrequest(body: any, url: string) {\n    const rawResponse = await fetch(url, {\n      method: \"POST\",\n      headers: {\n        \"Content-Type\": \"application/json\",\n      },\n      body: JSON.stringify(body),\n    });\n    const response: ApiResponse<Directory> = await rawResponse.json();\n    if (\"error\" in response) {\n      typeof props.errorCallback === \"function\" &&\n        props.errorCallback(response.error.message);\n      return;\n    }\n    if (rawResponse.ok) {\n      typeof props.successCallback === \"function\" && props.successCallback();\n    }\n  }\n  sendHTTPrequest(directory, props.urls.post);\n}\nfunction _classStringToObject(str: string) {\n  const obj: Record<string, boolean> = {};\n  if (typeof str !== \"string\") {\n    return obj;\n  }\n  const classNames = str.trim().split(/\\s+/);\n  for (const name of classNames) {\n    obj[name] = true;\n  }\n  return obj;\n}\n</script>","<template>\n  <template v-if=\"directoryListIsLoading\">\n    <loading-container :isBusy=\"isDirectoryListLoading\"></loading-container>\n  </template>\n\n  <template v-else>\n    <template v-if=\"directoryListData.length > 0\">\n      <div>\n        <table\n          :cols=\"cols\"\n          :data=\"directoryListData\"\n          :actions=\"actions\"\n        ></table>\n      </div>\n    </template>\n\n    <template v-else>\n      <template v-if=\"$slots.default\">\n        <slot />\n      </template>\n\n      <template v-else>\n        <empty-state title=\"No directories found.\"></empty-state>\n      </template>\n    </template>\n  </template>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, watch } from \"vue\";\n\nimport type { Directory } from \"../types\";\nimport LoadingContainer from \"../../../shared/LoadingContainer/index.vue\";\nimport type { DirectoryListProps } from \"../types\";\nimport defaultClasses from \"./index.module.css\";\nimport cssClassAssembler from \"../../utils/cssClassAssembler\";\nimport Table from \"../../../shared/Table/index.vue\";\nimport { TableProps } from \"../../../shared/types\";\nimport EmptyState from \"../../../shared/EmptyState/index.vue\";\nconst DEFAULT_VALUES = {\n  directoryListData: [] as Directory[],\n  providers: null,\n};\n\nconst props = defineProps<DirectoryListProps>();\nconst directoryListData = ref(DEFAULT_VALUES.directoryListData);\nconst providers = ref(DEFAULT_VALUES.providers);\nconst isDirectoryListLoading = ref(true);\nconst directoryListError = ref(\"\");\nconst directoryListIsLoading = ref(true);\n\nconst displayTenantProduct = computed(() => {\n  return props.setupLinkToken ? false : true;\n});\nconst classes = computed(() => {\n  return {\n    container: cssClassAssembler(\n      props.classNames?.container,\n      defaultClasses.container\n    ),\n    table: cssClassAssembler(props.classNames?.table, defaultClasses.table),\n    tableHead: cssClassAssembler(\n      props.classNames?.tableHead,\n      defaultClasses.tableHead\n    ),\n    tableData: cssClassAssembler(\n      props.classNames?.tableData,\n      defaultClasses.tableData\n    ),\n  };\n});\nconst actions = computed(() => {\n  return [\n    {\n      icon: \"EyeIcon\",\n      label: \"View\",\n      handleClick: (directory: Directory) =>\n        props.handleActionClick(\"view\", directory),\n    },\n    {\n      icon: \"PencilIcon\",\n      label: \"Edit\",\n      handleClick: (directory: Directory) =>\n        props.handleActionClick(\"edit\", directory),\n    },\n  ];\n});\n\nwatch(\n  () => [props.urls],\n  ([urls]) => {\n    async function getFieldsData(\n      directoryListUrl: string,\n      directoryProviderUrl: string\n    ) {\n      // fetch request for obtaining directory lists data\n      const directoryListResponse = await fetch(directoryListUrl);\n      const { data: listData, error } = await directoryListResponse.json();\n\n      // fetch request for obtaining directory providers data\n      const directoryProvidersResponse = await fetch(directoryProviderUrl);\n      const { data: providersData } = await directoryProvidersResponse.json();\n      const directoriesListData = listData.map((directory: Directory) => {\n        return {\n          name: directory.name,\n          tenant: directory.tenant,\n          product: directory.product,\n          type: directory.type,\n          status: directory.deactivated ? \"Inactive\" : \"Active\",\n        };\n      });\n      directoryListIsLoading.value = false;\n      if (error) {\n        directoryListError.value = error;\n      } else {\n        directoryListData.value = directoriesListData;\n        providers.value = providersData;\n        typeof props.handleListFetchComplete === \"function\" &&\n          props.handleListFetchComplete(listData);\n      }\n    }\n    getFieldsData(props.urls.directories, props.urls.providers);\n  },\n  { immediate: true }\n);\n</script>","<template>\n  <template v-if=\"connection !== undefined || connection !== null\">\n    <div :class=\"_classStringToObject(classes.container)\">\n      <template v-if=\"displayPrompt\">\n        <div :class=\"_classStringToObject(classes.displayMessage)\">\n          <span>Do you want to {{ ` ${connectionAction} ` }} connection?</span>\n          <spacer :x=\"3\"></spacer>\n          <button\n            variant=\"destructive\"\n            name=\"Confirm\"\n            type=\"button\"\n            :handleClick=\"onConfirm\"\n          ></button>\n          <spacer :x=\"3\"></spacer>\n          <button\n            variant=\"outline\"\n            name=\"Cancel\"\n            type=\"button\"\n            :handleClick=\"onCancel\"\n          ></button>\n        </div>\n      </template>\n\n      <template v-if=\"!displayPrompt\">\n        <toggle-switch\n          :label=\"connectionStatus\"\n          :disabled=\"displayPrompt\"\n          :checked=\"!connection?.deactivated\"\n          :handleChange=\"askForConfirmation\"\n        ></toggle-switch>\n      </template>\n    </div>\n  </template>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref } from \"vue\";\n\nimport type { ToggleDirectoryStatusProps, ApiResponse } from \"../types\";\nimport ToggleSwitch from \"../../../shared/ToggleSwitch/index.vue\";\nimport defaultClasses from \"./index.module.css\";\nimport cssClassAssembler from \"../../utils/cssClassAssembler\";\nimport Button from \"../../../shared/Button/index.vue\";\nimport Spacer from \"../../../shared/Spacer/index.vue\";\n\nconst props = defineProps<ToggleDirectoryStatusProps>();\nconst displayPrompt = ref(false);\n\nconst connectionStatus = computed(() => {\n  return props.connection?.deactivated ? \"Inactive\" : \"Active\";\n});\nconst connectionAction = computed(() => {\n  return props.connection?.deactivated ? \"activate\" : \"deactivate\";\n});\nconst classes = computed(() => {\n  return {\n    container: cssClassAssembler(\n      props.classNames?.container,\n      defaultClasses.container\n    ),\n    heading: cssClassAssembler(\n      props.classNames?.heading,\n      defaultClasses.heading\n    ),\n    toggle: cssClassAssembler(props.classNames?.toggle, defaultClasses.toggle),\n    displayMessage: cssClassAssembler(\n      props.classNames?.displayMessage,\n      defaultClasses.displayMessage\n    ),\n  };\n});\n\nfunction askForConfirmation() {\n  displayPrompt.value = true;\n}\nfunction onCancel() {\n  displayPrompt.value = false;\n}\nfunction onConfirm() {\n  updateConnectionStatus(!props.connection?.deactivated);\n}\nfunction updateConnectionStatus(status: boolean) {\n  async function sendHTTPrequest() {\n    const body = {\n      directoryId: props.connection?.id,\n      deactivated: status,\n    };\n    const res = await fetch(props.urls.patch, {\n      method: \"PATCH\",\n      headers: {\n        \"Content-Type\": \"application/json\",\n      },\n      body: JSON.stringify(body),\n    });\n    const response: ApiResponse = await res.json();\n    displayPrompt.value = false;\n    if (\"error\" in response) {\n      props.errorCallback(response.error.message);\n      return;\n    }\n    if (body.deactivated) {\n      props.successCallback(\"Connection deactivated successfully\");\n    } else {\n      props.successCallback(\"Connection activated successfully\");\n    }\n  }\n  sendHTTPrequest();\n}\nfunction _classStringToObject(str: string) {\n  const obj: Record<string, boolean> = {};\n  if (typeof str !== \"string\") {\n    return obj;\n  }\n  const classNames = str.trim().split(/\\s+/);\n  for (const name of classNames) {\n    obj[name] = true;\n  }\n  return obj;\n}\n</script>","<template>\n  <div>\n    <div :class=\"_classStringToObject(defaultClasses.headingContainer)\">\n      <h2 :class=\"_classStringToObject(defaultClasses.heading)\">\n        Update Directory\n      </h2>\n      <toggle-connection-status\n        :connection=\"directory\"\n        :urls=\"{\n          patch: urls.patch,\n        }\"\n        :errorCallback=\"errorCallback\"\n        :successCallback=\"successCallback\"\n      ></toggle-connection-status>\n    </div>\n    <div :class=\"_classStringToObject(classes.container)\">\n      <form @submit=\"onSubmit($event)\">\n        <div :class=\"_classStringToObject(classes.formDiv)\">\n          <div :class=\"_classStringToObject(classes.fieldsDiv)\">\n            <label for=\"name\" :class=\"_classStringToObject(classes.label)\">\n              <span :class=\"_classStringToObject(defaultClasses.labelText)\"\n                >Directory name</span\n              >\n            </label>\n            <input\n              type=\"text\"\n              id=\"name\"\n              name=\"name\"\n              :class=\"_classStringToObject(classes.input)\"\n              :required=\"true\"\n              @input=\"handleChange($event)\"\n              :value=\"formState?.name\"\n            />\n          </div>\n\n          <template v-if=\"directory?.type === 'google'\">\n            <div :class=\"_classStringToObject(classes.fieldsDiv)\">\n              <label\n                for=\"google_domain\"\n                :class=\"_classStringToObject(classes.label)\"\n              >\n                <span :class=\"_classStringToObject(defaultClasses.labelText)\"\n                  >Directory domain</span\n                >\n              </label>\n              <input\n                type=\"text\"\n                id=\"google_domain\"\n                name=\"google_domain\"\n                :class=\"_classStringToObject(classes.input)\"\n                @input=\"handleChange($event)\"\n                :value=\"formState?.google_domain\"\n              />\n            </div>\n          </template>\n\n          <div :class=\"_classStringToObject(classes.fieldsDiv)\">\n            <label\n              for=\"webhook.endpoint\"\n              :class=\"_classStringToObject(classes.label)\"\n            >\n              <span :class=\"_classStringToObject(defaultClasses.labelText)\"\n                >Webhook URL</span\n              >\n            </label>\n            <input\n              type=\"text\"\n              id=\"webhook.endpoint\"\n              name=\"webhook.endpoint\"\n              :class=\"_classStringToObject(classes.input)\"\n              @input=\"handleChange($event)\"\n              :value=\"formState?.webhook.endpoint\"\n            />\n          </div>\n          <div :class=\"_classStringToObject(classes.fieldsDiv)\">\n            <label\n              for=\"webhook.secret\"\n              :class=\"_classStringToObject(classes.label)\"\n            >\n              <span :class=\"_classStringToObject(defaultClasses.labelText)\"\n                >Webhook secret</span\n              >\n            </label>\n            <input\n              type=\"text\"\n              id=\"webhook.secret\"\n              name=\"webhook.secret\"\n              :class=\"_classStringToObject(classes.input)\"\n              @input=\"handleChange($event)\"\n              :value=\"formState?.webhook.secret\"\n            />\n          </div>\n          <div :class=\"_classStringToObject(defaultClasses.checkboxFieldsDiv)\">\n            <div class=\"flex items-center\">\n              <input\n                id=\"log_webhook_events\"\n                name=\"log_webhook_events\"\n                type=\"checkbox\"\n                :checked=\"formState?.log_webhook_events\"\n                @input=\"handleChange($event)\"\n                :class=\"_classStringToObject(defaultClasses.checkboxInput)\"\n              />\n              <label\n                for=\"log_webhook_events\"\n                :class=\"_classStringToObject(defaultClasses.checkboxLabel)\"\n              >\n                Enable Webhook events logging\n              </label>\n            </div>\n          </div>\n          <spacer :y=\"4\"></spacer>\n          <div :class=\"_classStringToObject(defaultClasses.formAction)\">\n            <template v-if=\"typeof cancelCallback === 'function'\">\n              <button\n                type=\"button\"\n                name=\"Cancel\"\n                variant=\"outline\"\n                :handleClick=\"cancelCallback\"\n              ></button>\n            </template>\n\n            <button type=\"submit\" name=\"Save\" variant=\"primary\"></button>\n          </div>\n        </div>\n      </form>\n    </div>\n    <section :class=\"_classStringToObject(classes.section)\">\n      <div :class=\"_classStringToObject(defaultClasses.info)\">\n        <h6 :class=\"_classStringToObject(defaultClasses.sectionHeading)\">\n          Delete this directory connection\n        </h6>\n        <p :class=\"_classStringToObject(defaultClasses.sectionPara)\">\n          All your apps using this connection will stop working.\n        </p>\n      </div>\n      <confirmation-prompt\n        promptMessge=\" Are you sure you want to delete the directory connection? This will permanently delete the\n             directory connection, users, and groups.\"\n        :confirmationCallback=\"deleteDirectory\"\n      ></confirmation-prompt>\n    </section>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, watch } from \"vue\";\n\nimport type { Directory, EditDirectoryProps, ApiResponse } from \"../types\";\nimport ToggleConnectionStatus from \"../ToggleConnectionStatus/index.vue\";\nimport defaultClasses from \"./index.module.css\";\nimport cssClassAssembler from \"../../utils/cssClassAssembler\";\nimport Button from \"../../../shared/Button/index.vue\";\nimport Spacer from \"../../../shared/Spacer/index.vue\";\nimport ConfirmationPrompt from \"../../../shared/ConfirmationPrompt/index.vue\";\nconst DEFAULT_VALUES: {\n  formState: FormState;\n  directory: Directory | null;\n} = {\n  formState: {\n    name: \"\",\n    log_webhook_events: false,\n    webhook: {\n      endpoint: \"\",\n      secret: \"\",\n    },\n    google_domain: \"\",\n  },\n  directory: null,\n};\n\ntype FormState = Pick<\n  Directory,\n  \"name\" | \"log_webhook_events\" | \"webhook\" | \"google_domain\"\n>;\n\nconst props = defineProps<EditDirectoryProps>();\nconst loading = ref(true);\nconst formState = ref(DEFAULT_VALUES.formState);\nconst directory = ref(DEFAULT_VALUES.directory);\n\nconst classes = computed(() => {\n  return {\n    label: cssClassAssembler(props.classNames?.label, defaultClasses.label),\n    input: cssClassAssembler(props.classNames?.input, defaultClasses.input),\n    container: cssClassAssembler(\n      props.classNames?.container,\n      defaultClasses.container\n    ),\n    formDiv: cssClassAssembler(\n      props.classNames?.formDiv,\n      defaultClasses.formDiv\n    ),\n    fieldsDiv: cssClassAssembler(\n      props.classNames?.fieldsDiv,\n      defaultClasses.fieldsDiv\n    ),\n    section: cssClassAssembler(\n      props.classNames?.section,\n      defaultClasses.section\n    ),\n  };\n});\n\nwatch(\n  () => [props.urls],\n  ([urls]) => {\n    async function getDirectory(url: string) {\n      const response = await fetch(url);\n      const { data: directoryData, error } = await response.json();\n      if (directoryData) {\n        directory.value = directoryData;\n        formState.value = {\n          name: directoryData.name,\n          log_webhook_events: directoryData.log_webhook_events,\n          webhook: {\n            endpoint: directoryData.webhook?.endpoint,\n            secret: directoryData.webhook?.secret,\n          },\n          google_domain: directoryData.google_domain,\n        };\n      }\n      if (error) {\n        console.error(error);\n      }\n    }\n    getDirectory(props.urls.get);\n  },\n  { immediate: true }\n);\nfunction updateFormState(key: string, newValue: string | boolean, id: string) {\n  if (id === \"webhook.endpoint\" || id === \"webhook.secret\") {\n    return {\n      ...formState.value,\n      webhook: {\n        ...formState.value?.webhook,\n        [id.split(\".\")[1]]: newValue,\n      },\n    };\n  }\n  return {\n    ...formState.value,\n    [key]: newValue,\n  };\n}\nfunction handleChange(event: Event) {\n  const target = event.target as HTMLInputElement;\n  const name = target.name;\n  const value = target.type === \"checkbox\" ? target.checked : target.value;\n  formState.value = updateFormState(name, value, target.id);\n}\nfunction onSubmit(event: Event) {\n  event.preventDefault();\n  loading.value = true;\n  async function sendHttpRequest(url: string) {\n    const rawResponse = await fetch(url, {\n      method: \"PATCH\",\n      headers: {\n        \"Content-Type\": \"application/json\",\n      },\n      body: JSON.stringify(formState),\n    });\n    loading.value = false;\n    const response: ApiResponse<Directory> = await rawResponse.json();\n    if (\"error\" in response) {\n      typeof props.errorCallback === \"function\" &&\n        props.errorCallback(response.error.message);\n      return;\n    }\n    if (rawResponse.ok) {\n      typeof props.successCallback === \"function\" && props.successCallback();\n    }\n  }\n  sendHttpRequest(props.urls.patch);\n}\nfunction deleteDirectory() {\n  async function sendHTTPrequest(url: string) {\n    const rawResponse = await fetch(url, {\n      method: \"DELETE\",\n    });\n    const response: ApiResponse<unknown> = await rawResponse.json();\n    if (\"error\" in response) {\n      typeof props.errorCallback === \"function\" &&\n        props.errorCallback(response.error.message);\n      return;\n    }\n    if (\"data\" in response) {\n      typeof props.successCallback === \"function\" && props.successCallback();\n    }\n  }\n  sendHTTPrequest(props.urls.delete);\n}\nfunction _classStringToObject(str: string) {\n  const obj: Record<string, boolean> = {};\n  if (typeof str !== \"string\") {\n    return obj;\n  }\n  const classNames = str.trim().split(/\\s+/);\n  for (const name of classNames) {\n    obj[name] = true;\n  }\n  return obj;\n}\n</script>","<template>\n  <div>\n    <div :class=\"_classStringToObject(styles.listview)\">\n      <template v-if=\"view === 'LIST'\">\n        <template v-if=\"directoriesAdded\">\n          <card\n            :title=\"\n              dsyncEnabled\n                ? 'Directory Sync enabled'\n                : 'Directory Sync disabled'\n            \"\n            :variant=\"dsyncEnabled ? 'success' : 'info'\"\n          >\n            <div :class=\"_classStringToObject(styles.ctoa)\">\n              <button\n                name=\"Add Connection\"\n                :handleClick=\"switchToCreateView\"\n              ></button>\n            </div>\n          </card>\n\n          <spacer :y=\"4\"></spacer>\n        </template>\n\n        <spacer :y=\"4\"></spacer>\n\n        <directory-list\n          :handleActionClick=\"switchToEditView\"\n          :handleListFetchComplete=\"handleListFetchComplete\"\n          v-bind=\"componentProps.directoryList\"\n        >\n          <card variant=\"info\" title=\"Directories not enabled\">\n            <button\n              name=\"Add Connection\"\n              :handleClick=\"switchToCreateView\"\n            ></button>\n          </card>\n        </directory-list>\n      </template>\n    </div>\n\n    <template v-if=\"view === 'EDIT'\">\n      <edit-directory\n        :successCallback=\"switchToListView\"\n        :deleteCallback=\"switchToListView\"\n        :errorCallback=\"logError\"\n        :urls=\"{\n          patch:\n            `${componentProps.editDirectory.urls?.patch}/${directoryToEdit.id}` ||\n            '',\n          delete:\n            `${componentProps.editDirectory.urls?.delete}/${directoryToEdit.id}` ||\n            '',\n          get:\n            `${componentProps.editDirectory.urls?.get}/${directoryToEdit.id}` ||\n            '',\n        }\"\n        v-bind=\"componentProps.editDirectory\"\n      ></edit-directory>\n    </template>\n\n    <template v-if=\"view === 'CREATE'\">\n      <spacer :y=\"5\"></spacer>\n\n      <create-directory\n        :successCallback=\"switchToListView\"\n        :errorCallback=\"logError\"\n        :urls=\"{\n          post: componentProps.createDirectory.urls?.post || '',\n          providers: componentProps.createDirectory.urls?.providers || '',\n        }\"\n        v-bind=\"componentProps.createDirectory\"\n      ></create-directory>\n    </template>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref } from \"vue\";\n\nimport type { Directory, DirectoriesWrapperProps } from \"../types\";\nimport CreateDirectory from \"../CreateDirectory/index.vue\";\nimport Spacer from \"../../../shared/Spacer/index.vue\";\nimport EditDirectory from \"../EditDirectory/index.vue\";\nimport DirectoryList from \"../DirectoryList/index.vue\";\nimport Card from \"../../../shared/Card/index.vue\";\nimport Button from \"../../../shared/Button/index.vue\";\nimport styles from \"./index.module.css\";\nconst DEFAULT_VALUES = {\n  directoryListData: [] as Directory[],\n  view: \"LIST\" as \"LIST\" | \"EDIT\" | \"CREATE\",\n  directoryToEdit: {} as Directory,\n};\n\nconst props = defineProps<DirectoriesWrapperProps>();\nconst directories = ref(DEFAULT_VALUES.directoryListData);\nconst view = ref(DEFAULT_VALUES.view);\nconst directoryToEdit = ref(DEFAULT_VALUES.directoryToEdit);\n\nconst directoriesAdded = computed(() => {\n  return directories.value.length > 0;\n});\nconst dsyncEnabled = computed(() => {\n  return (\n    directoriesAdded &&\n    directories.value.some((directory) => directory.deactivated === false)\n  );\n});\n\nfunction handleListFetchComplete(directoryList: Directory[]) {\n  directories.value = directoryList;\n}\nfunction switchToCreateView() {\n  view.value = \"CREATE\";\n}\nfunction switchToEditView(action: \"edit\" | \"view\", directory: any) {\n  view.value = \"EDIT\";\n  directoryToEdit.value = directory;\n}\nfunction switchToListView() {\n  view.value = \"LIST\";\n}\nfunction logError(err: string) {\n  console.error(err);\n}\nfunction _classStringToObject(str: string) {\n  const obj: Record<string, boolean> = {};\n  if (typeof str !== \"string\") {\n    return obj;\n  }\n  const classNames = str.trim().split(/\\s+/);\n  for (const name of classNames) {\n    obj[name] = true;\n  }\n  return obj;\n}\n</script>"],"names":["htmlIdGenerator","prefix","elementType","getUniqueId","component","id","cssClassAssembler","customClasses","defaultClasses","COMPONENT","DEFAULT_VALUES","_ssoIdentifier","ref","errMsg","isProcessing","isError","computed","disableButton","props","shouldRenderInput","InputId","ErrorSpanId","classes","_a","_b","_c","_d","handleChange","event","onSubmitButton","ssoIdentifierToSubmit","err","_classStringToObject","str","obj","classNames","name","newConnectionType","connectionIsSAML","connectionIsOIDC","_e","_f","_g","handleNewConnectionTypeChange","copyDoneCallback","saveConnection","formObj","isEditView","callback","url","rawMetadata","redirectUrl","oidcDiscoveryUrl","oidcMetadata","oidcClientId","oidcClientSecret","metadataUrl","rest","encodedRawMetadata","redirectUrlList","res","deleteConnection","clientId","clientSecret","queryParams","SPACING","marginLeft","marginTop","className","styles","INITIAL_VALUES","loading","samlConnection","formVariant","updateConnection","key","newValue","target","targetValue","save","rawResponse","response","isExcluded","fieldName","oidcConnection","val","defaultStyles","connectionListData","connectionListError","isConnectionListLoading","_h","_i","_j","_k","_l","colsToDisplay","actions","connection","watch","getConnectionsUrl","getFieldsData","connectionDisplayName","data","error","_connectionsListData","isSecretShown","toggleIsSecretShown","onChange","displayPrompt","connectionStatus","connectionAction","askForConfirmation","onCancel","onConfirm","updateConnectionStatus","status","sendHTTPrequest","body","isPromptVisible","handleCancel","handleConfirm","hasDiscoveryUrl","toggleHasDiscoveryUrl","saveSSOConnection","deleteSSOConnection","variantCss","flexCss","connections","view","connectionToEdit","connectionsAdded","ssoEnabled","handleListFetchComplete","connectionsList","switchToCreateView","switchToEditView","action","switchToListView","logError","DEFAULT_DIRECTORY_VALUES","DEFAULT_PROVIDERS","directory","showDomain","providers","onMounted","getDirectoryProviders","value","text","setProvider","onSubmit","directoryListData","isDirectoryListLoading","directoryListError","directoryListIsLoading","urls","directoryListUrl","directoryProviderUrl","directoryListResponse","listData","directoryProvidersResponse","providersData","directoriesListData","formState","getDirectory","directoryData","updateFormState","sendHttpRequest","deleteDirectory","directories","directoryToEdit","directoriesAdded","dsyncEnabled","directoryList"],"mappings":"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"}