From 8cf9abd3a4a443af39ff76ff4271b9ce954873a2 Mon Sep 17 00:00:00 2001 From: CRoberto1926 Date: Thu, 7 Nov 2024 07:50:14 +0000 Subject: [PATCH] deploy: c3b1bd568b00d1d01f176f6fcbddfe18984da2e4 --- 404.html | 8 ++++---- assets/css/{styles.fb608023.css => styles.6d73179a.css} | 2 +- assets/js/0251b216.41152ce4.js | 1 - assets/js/0251b216.c94084bc.js | 1 + assets/js/12fe0deb.31b04e97.js | 1 + assets/js/12fe0deb.f8400dcb.js | 1 - assets/js/1c269d1d.4baa1361.js | 1 - assets/js/1c269d1d.69faca4e.js | 1 + assets/js/24ec522f.9c5b1e5e.js | 1 + assets/js/24ec522f.b2e570f5.js | 1 - assets/js/2a7b3772.bacbc9ee.js | 1 - assets/js/2a7b3772.fe519350.js | 1 + assets/js/373999ad.2866021c.js | 1 + assets/js/373999ad.9bee414e.js | 1 - assets/js/393be207.2759f6f0.js | 1 + assets/js/393be207.d1e95cb1.js | 1 - assets/js/42887586.7d83daa5.js | 1 + assets/js/42887586.8ab2ca57.js | 1 - assets/js/48eab233.ccacc2ff.js | 1 + assets/js/48eab233.ef7df176.js | 1 - assets/js/5447c93a.653d4fde.js | 1 - assets/js/5447c93a.dc2831d3.js | 1 + assets/js/56bd79c1.0c186d7f.js | 1 + assets/js/56bd79c1.772c9cc2.js | 1 - assets/js/57239c41.718ae3e7.js | 1 + assets/js/57239c41.da4bb330.js | 1 - assets/js/6d9693cd.7cb3636a.js | 1 + assets/js/6d9693cd.d3ea87f9.js | 1 - assets/js/7218d785.3a9f35db.js | 1 - assets/js/7218d785.3f34ec24.js | 1 + assets/js/76ee90bb.3d0f6f39.js | 1 + assets/js/76ee90bb.42a459cc.js | 1 - assets/js/81ecd14e.248fa2ae.js | 1 - assets/js/81ecd14e.361244e6.js | 1 + assets/js/93b79e6e.1aa76eae.js | 1 + assets/js/93b79e6e.4ba105a9.js | 1 - assets/js/955ca316.64a1d0be.js | 1 + assets/js/955ca316.dbe0cc67.js | 1 - assets/js/9ec8d0b6.39303c92.js | 1 - assets/js/9ec8d0b6.edc58e3d.js | 1 + assets/js/a3bd232a.3fc6f887.js | 1 - assets/js/a3bd232a.7c1046b9.js | 1 + assets/js/a4bffc61.67dba5c4.js | 1 + assets/js/a4bffc61.9492e0aa.js | 1 - assets/js/a51fc69b.312e0bda.js | 1 - assets/js/a51fc69b.afc695df.js | 1 + assets/js/a54ea03c.74fc193a.js | 1 + assets/js/a54ea03c.f327eea3.js | 1 - assets/js/b715cf33.7aa747ec.js | 1 + assets/js/b715cf33.b2f45a53.js | 1 - assets/js/c391ba29.b0788de9.js | 1 + assets/js/c391ba29.fb66fb28.js | 1 - assets/js/c9ced819.b01beb7a.js | 1 + assets/js/c9ced819.fe9cb59d.js | 1 - assets/js/ce69b5c4.2d97da67.js | 1 + assets/js/ce69b5c4.4ffb2ec3.js | 1 - assets/js/{dcf8ed49.d8dd7215.js => dcf8ed49.75279970.js} | 2 +- assets/js/e5931ac3.140d1122.js | 1 - assets/js/e5931ac3.336abed3.js | 1 + assets/js/ef1c3cd1.ea7c3c31.js | 1 - assets/js/ef1c3cd1.ed172744.js | 1 + assets/js/main.46123788.js | 2 ++ ...c71af0.js.LICENSE.txt => main.46123788.js.LICENSE.txt} | 0 assets/js/main.f9c71af0.js | 2 -- assets/js/runtime~main.7c79564c.js | 1 + assets/js/runtime~main.abfbfa94.js | 1 - docs/category/adapter.html | 8 ++++---- docs/category/configuration.html | 8 ++++---- docs/category/core-concepts.html | 8 ++++---- docs/category/features.html | 8 ++++---- docs/category/getting-started.html | 8 ++++---- docs/category/reference.html | 8 ++++---- docs/contact-us/contactUs.html | 8 ++++---- docs/demo-app/demoApp.html | 8 ++++---- docs/user-guide/adapter/gettingStarted.html | 8 ++++---- .../configuration/classificationAndServiceLevel.html | 8 ++++---- docs/user-guide/configuration/database.html | 8 ++++---- .../configuration/historyAndCustomProperties.html | 8 ++++---- docs/user-guide/configuration/holidaysAndWorkingDays.html | 8 ++++---- docs/user-guide/configuration/kadaiJobs.html | 8 ++++---- docs/user-guide/configuration/ldap.html | 8 ++++---- docs/user-guide/configuration/priorityReport.html | 8 ++++---- docs/user-guide/configuration/security.html | 8 ++++---- docs/user-guide/configuration/ui.html | 8 ++++---- docs/user-guide/core-concepts/javaApiUsage.html | 8 ++++---- docs/user-guide/core-concepts/overview.html | 8 ++++---- docs/user-guide/core-concepts/restApi.html | 8 ++++---- docs/user-guide/core-concepts/securityAndPermissions.html | 8 ++++---- docs/user-guide/core-concepts/taskLifecycle.html | 8 ++++---- .../features/howToUseServiceProviderInterfaces.html | 8 ++++---- docs/user-guide/features/jobs.html | 8 ++++---- docs/user-guide/features/kadaiHistorySPI.html | 8 ++++---- docs/user-guide/features/listOfProvidedSPIs.html | 8 ++++---- docs/user-guide/features/monitoring.html | 8 ++++---- docs/user-guide/features/queriesFilteringAndSorting.html | 8 ++++---- docs/user-guide/features/users.html | 8 ++++---- docs/user-guide/getting-started/exampleSpringBoot.html | 8 ++++---- .../user-guide/getting-started/supportedEnvironments.html | 8 ++++---- docs/user-guide/reference/dataModel.html | 8 ++++---- docs/user-guide/reference/modules.html | 8 ++++---- docs/user-guide/userGuideIntro.html | 8 ++++---- index.html | 8 ++++---- markdown-page.html | 8 ++++---- 103 files changed, 186 insertions(+), 186 deletions(-) rename assets/css/{styles.fb608023.css => styles.6d73179a.css} (98%) delete mode 100644 assets/js/0251b216.41152ce4.js create mode 100644 assets/js/0251b216.c94084bc.js create mode 100644 assets/js/12fe0deb.31b04e97.js delete mode 100644 assets/js/12fe0deb.f8400dcb.js delete mode 100644 assets/js/1c269d1d.4baa1361.js create mode 100644 assets/js/1c269d1d.69faca4e.js create mode 100644 assets/js/24ec522f.9c5b1e5e.js delete mode 100644 assets/js/24ec522f.b2e570f5.js delete mode 100644 assets/js/2a7b3772.bacbc9ee.js create mode 100644 assets/js/2a7b3772.fe519350.js create mode 100644 assets/js/373999ad.2866021c.js delete mode 100644 assets/js/373999ad.9bee414e.js create mode 100644 assets/js/393be207.2759f6f0.js delete mode 100644 assets/js/393be207.d1e95cb1.js create mode 100644 assets/js/42887586.7d83daa5.js delete mode 100644 assets/js/42887586.8ab2ca57.js create mode 100644 assets/js/48eab233.ccacc2ff.js delete mode 100644 assets/js/48eab233.ef7df176.js delete mode 100644 assets/js/5447c93a.653d4fde.js create mode 100644 assets/js/5447c93a.dc2831d3.js create mode 100644 assets/js/56bd79c1.0c186d7f.js delete mode 100644 assets/js/56bd79c1.772c9cc2.js create mode 100644 assets/js/57239c41.718ae3e7.js delete mode 100644 assets/js/57239c41.da4bb330.js create mode 100644 assets/js/6d9693cd.7cb3636a.js delete mode 100644 assets/js/6d9693cd.d3ea87f9.js delete mode 100644 assets/js/7218d785.3a9f35db.js create mode 100644 assets/js/7218d785.3f34ec24.js create mode 100644 assets/js/76ee90bb.3d0f6f39.js delete mode 100644 assets/js/76ee90bb.42a459cc.js delete mode 100644 assets/js/81ecd14e.248fa2ae.js create mode 100644 assets/js/81ecd14e.361244e6.js create mode 100644 assets/js/93b79e6e.1aa76eae.js delete mode 100644 assets/js/93b79e6e.4ba105a9.js create mode 100644 assets/js/955ca316.64a1d0be.js delete mode 100644 assets/js/955ca316.dbe0cc67.js delete mode 100644 assets/js/9ec8d0b6.39303c92.js create mode 100644 assets/js/9ec8d0b6.edc58e3d.js delete mode 100644 assets/js/a3bd232a.3fc6f887.js create mode 100644 assets/js/a3bd232a.7c1046b9.js create mode 100644 assets/js/a4bffc61.67dba5c4.js delete mode 100644 assets/js/a4bffc61.9492e0aa.js delete mode 100644 assets/js/a51fc69b.312e0bda.js create mode 100644 assets/js/a51fc69b.afc695df.js create mode 100644 assets/js/a54ea03c.74fc193a.js delete mode 100644 assets/js/a54ea03c.f327eea3.js create mode 100644 assets/js/b715cf33.7aa747ec.js delete mode 100644 assets/js/b715cf33.b2f45a53.js create mode 100644 assets/js/c391ba29.b0788de9.js delete mode 100644 assets/js/c391ba29.fb66fb28.js create mode 100644 assets/js/c9ced819.b01beb7a.js delete mode 100644 assets/js/c9ced819.fe9cb59d.js create mode 100644 assets/js/ce69b5c4.2d97da67.js delete mode 100644 assets/js/ce69b5c4.4ffb2ec3.js rename assets/js/{dcf8ed49.d8dd7215.js => dcf8ed49.75279970.js} (69%) delete mode 100644 assets/js/e5931ac3.140d1122.js create mode 100644 assets/js/e5931ac3.336abed3.js delete mode 100644 assets/js/ef1c3cd1.ea7c3c31.js create mode 100644 assets/js/ef1c3cd1.ed172744.js create mode 100644 assets/js/main.46123788.js rename assets/js/{main.f9c71af0.js.LICENSE.txt => main.46123788.js.LICENSE.txt} (100%) delete mode 100644 assets/js/main.f9c71af0.js create mode 100644 assets/js/runtime~main.7c79564c.js delete mode 100644 assets/js/runtime~main.abfbfa94.js diff --git a/404.html b/404.html index 642659b..0abdb69 100644 --- a/404.html +++ b/404.html @@ -2,10 +2,10 @@ - -Page Not Found | Documentation - - + +Page Not Found | Documentation + +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

diff --git a/assets/css/styles.fb608023.css b/assets/css/styles.6d73179a.css similarity index 98% rename from assets/css/styles.fb608023.css rename to assets/css/styles.6d73179a.css index 4f7b52d..1cc76ad 100644 --- a/assets/css/styles.fb608023.css +++ b/assets/css/styles.6d73179a.css @@ -1 +1 @@ -@import url(https://fonts.googleapis.com/css2?family=Karla:wght@400;500;600;700&display=swap);.col,.container{padding:0 var(--ifm-spacing-horizontal);width:100%}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown li,body{word-wrap:break-word}body,ol ol,ol ul,ul ol,ul ul{margin:0}pre,table{overflow:auto}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button,code{vertical-align:middle}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.menu__link:hover,a{transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}.menu,.navbar-sidebar{overflow-x:hidden}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}.toggleButton_gllP,html{-webkit-tap-highlight-color:transparent}.clean-list,.containsTaskList_mC6p,.details_lb9f>summary,.dropdown__menu,.menu__list{list-style:none}:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:#0000;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:0.4rem;--ifm-hover-overlay:#0000000d;--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 #0000001a;--ifm-global-shadow-md:0 5px 40px #0003;--ifm-global-shadow-tl:0 12px 28px 0 #0003,0 2px 4px 0 #0000001a;--ifm-z-index-dropdown:100;--ifm-z-index-fixed:200;--ifm-z-index-overlay:400;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.1rem;--ifm-code-padding-vertical:0.1rem;--ifm-pre-background:var(--ifm-code-background);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:0.75rem;--ifm-table-background:#0000;--ifm-table-stripe-background:#00000008;--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-shadow:none;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-background-color:var(--ifm-color-emphasis-500);--ifm-hr-height:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-color:var(--ifm-font-color-base);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size:3rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.5rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:0.8rem;--ifm-breadcrumb-padding-vertical:0.4rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-spacing:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-footer-logo-max-width:min(30rem,90vw);--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:0.75rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:0.75rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,');--ifm-navbar-sidebar-width:83vw;--ifm-pagination-border-radius:var(--ifm-global-radius);--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.2em;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:0.125rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem;--docusaurus-progress-bar-color:var(--ifm-color-primary);--ifm-color-primary:#6ccbb2;--ifm-color-primary-dark:#29784c;--ifm-color-primary-darker:#277148;--ifm-color-primary-darkest:#205d3b;--ifm-color-primary-light:#33925d;--ifm-color-primary-lighter:#359962;--ifm-color-primary-lightest:#3cad6e;--ifm-code-font-size:95%;--kadai-color-primary:#6ccbb2;--kadai-color-primary-darker:#58a591;--kadai-color-secondary:#d5f2e8;--kadai-color-contrast:#90c5e2;--kadai-color-background:#f3f3f2;--kadai-color-text:#1b1b1b;--docusaurus-highlighted-code-line-bg:#0000001a;--kadai-content-width:1280px;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300);--docusaurus-announcement-bar-height:auto;--docusaurus-collapse-button-bg:#0000;--docusaurus-collapse-button-bg-hover:#0000001a;--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:#0000}*{box-sizing:border-box}html{background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;-webkit-text-size-adjust:100%;text-size-adjust:100%}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.container--fluid{max-width:inherit}.row{display:flex;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.list_eTzJ article:last-child,.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none{margin-top:0!important}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.menuExternalLink_NmtK,.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;flex:1 0;margin-left:0;max-width:var(--ifm-col-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:8.33333%}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:16.66667%}.col--offset-2{margin-left:16.66667%}.col--3{--ifm-col-width:25%}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:33.33333%}.col--offset-4{margin-left:33.33333%}.col--5{--ifm-col-width:41.66667%}.col--offset-5{margin-left:41.66667%}.col--6{--ifm-col-width:50%}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:58.33333%}.col--offset-7{margin-left:58.33333%}.col--8{--ifm-col-width:66.66667%}.col--offset-8{margin-left:66.66667%}.col--9{--ifm-col-width:75%}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:83.33333%}.col--offset-10{margin-left:83.33333%}.col--11{--ifm-col-width:91.66667%}.col--offset-11{margin-left:91.66667%}.col--12{--ifm-col-width:100%}.col--offset-12{margin-left:100%}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-vert--md{padding-top:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid #0000001a;border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}a code{color:inherit}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);padding:var(--ifm-pre-padding)}pre code{background-color:initial;border:none;font-size:100%;line-height:inherit;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}h1{font-size:var(--ifm-h1-font-size)}h2{font-size:var(--ifm-h2-font-size)}h3{font-size:var(--ifm-h3-font-size)}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}img{max-width:100%}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before{content:"";display:table}.markdown:after{clear:both}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>p,.markdown>pre,.markdown>ul{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table{border-collapse:collapse;display:block;margin-bottom:var(--ifm-spacing-vertical)}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead,table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button:hover,.text--no-decoration,.text--no-decoration:hover,a:not([href]){text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-left:var(--ifm-blockquote-border-left-width) solid var(--ifm-blockquote-border-color);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{background-color:var(--ifm-hr-background-color);border:0;height:var(--ifm-hr-height);margin:var(--ifm-hr-margin-vertical) 0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary,.wordWrapButtonEnabled_EoeP .wordWrapButtonIcon_Bwma{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.text--center{text-align:center}.text--left{text-align:left}.featureText_ZxAV,.text--justify{text-align:justify}.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.admonitionHeading_Gvgb,.alert__heading,.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.clean-list{padding-left:0}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:#3578e526;--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:#ebedf026;--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:#00a40026;--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:#54c7ec26;--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:#ffba0026;--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:#fa383e26;--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border:var(--ifm-alert-border-width) solid var(--ifm-alert-border-color);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert__heading{align-items:center;display:flex;font:700 var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.5rem}.alert__icon{display:inline-flex;margin-right:.4em}.alert__icon svg{fill:var(--ifm-alert-foreground-color);stroke:var(--ifm-alert-foreground-color);stroke-width:0}.alert .close{margin:calc(var(--ifm-alert-padding-vertical)*-1) calc(var(--ifm-alert-padding-horizontal)*-1) 0 0;opacity:.75}.alert .close:focus,.alert .close:hover{opacity:1}.alert a{text-decoration-color:var(--ifm-alert-border-color)}.alert a:hover{text-decoration-thickness:2px}.avatar{column-gap:var(--ifm-avatar-intro-margin);display:flex}.avatar__photo{border-radius:50%;display:block;height:var(--ifm-avatar-photo-size);overflow:hidden;width:var(--ifm-avatar-photo-size)}.card--full-height,.navbar__logo img,body,html{height:100%}.avatar__photo--sm{--ifm-avatar-photo-size:2rem}.avatar__photo--lg{--ifm-avatar-photo-size:4rem}.avatar__photo--xl{--ifm-avatar-photo-size:6rem}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button,.dropdown>.navbar__link:after{display:inline-block}.avatar__name{font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);line-height:1;padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal)}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) center;content:" ";display:inline-block;filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 var(--ifm-breadcrumb-spacing);opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active);color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-duration:var(--ifm-transition-fast);transition-property:background,color}.breadcrumbs__link:any-link:hover,.breadcrumbs__link:link:hover,.breadcrumbs__link:visited:hover,area[href].breadcrumbs__link:hover{background:var(--ifm-breadcrumb-item-background-active);text-decoration:none}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border:var(--ifm-button-border-width) solid var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);cursor:pointer;font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);line-height:1.5;padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;transition-duration:var(--ifm-button-transition-duration);transition-property:color,background,border-color;-webkit-user-select:none;user-select:none;white-space:nowrap}.button,.button:hover{color:var(--ifm-button-color)}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:#0000;color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}:where(.button--primary){--ifm-button-background-color:var(--ifm-color-primary);--ifm-button-border-color:var(--ifm-color-primary)}:where(.button--primary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-background-color:var(--ifm-color-primary-darker);--ifm-button-border-color:var(--ifm-color-primary-darker)}:where(.button--secondary){--ifm-button-background-color:var(--ifm-color-secondary);--ifm-button-border-color:var(--ifm-color-secondary)}:where(.button--secondary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-background-color:var(--ifm-color-secondary-darker);--ifm-button-border-color:var(--ifm-color-secondary-darker)}:where(.button--success){--ifm-button-background-color:var(--ifm-color-success);--ifm-button-border-color:var(--ifm-color-success)}:where(.button--success):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-background-color:var(--ifm-color-success-darker);--ifm-button-border-color:var(--ifm-color-success-darker)}:where(.button--info){--ifm-button-background-color:var(--ifm-color-info);--ifm-button-border-color:var(--ifm-color-info)}:where(.button--info):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-background-color:var(--ifm-color-info-darker);--ifm-button-border-color:var(--ifm-color-info-darker)}:where(.button--warning){--ifm-button-background-color:var(--ifm-color-warning);--ifm-button-border-color:var(--ifm-color-warning)}:where(.button--warning):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-background-color:var(--ifm-color-warning-darker);--ifm-button-border-color:var(--ifm-color-warning-darker)}:where(.button--danger){--ifm-button-background-color:var(--ifm-color-danger);--ifm-button-border-color:var(--ifm-color-danger)}:where(.button--danger):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-background-color:var(--ifm-color-danger-darker);--ifm-button-border-color:var(--ifm-color-danger-darker)}.button-group{display:inline-flex;gap:var(--ifm-button-group-spacing)}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group--block{display:flex;justify-content:stretch}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);display:flex;flex-direction:column;overflow:hidden}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);text-decoration:none}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.close:hover{opacity:.7}.close:focus,.theme-code-block-highlighted-line .codeLineNumber_Tfdd:before{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;pointer-events:all;transform:translateY(-1px);visibility:visible}#nprogress,.dropdown__menu,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);left:0;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem;white-space:nowrap}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color);text-decoration:none}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor #0000;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white)}.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{margin-top:1rem;max-width:var(--ifm-footer-logo-max-width)}.footer__title{color:var(--ifm-footer-title-color);font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.menu,.navbar__link{font-weight:var(--ifm-font-weight-semibold)}.button_IrwC,.hero_CaSG,.hero_CaSG h1,.hero_CaSG h2,.navbar__title{font-family:Karla,sans-serif}.docItemContainer_Djhp article>:first-child,.docItemContainer_Djhp header+*,.footer__item{margin-top:0}.admonitionContent_BuS1>:last-child,.cardContainer_fWXF :last-child,.collapsibleContent_i85q p:last-child,.details_lb9f>summary>p:last-child,.footer__items{margin-bottom:0}.codeBlockStandalone_MEMb,[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{margin:0;padding-left:0}.menu__caret,.menu__link{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__list .menu__list{flex:0 0 100%;margin-top:.25rem;padding-left:var(--ifm-menu-link-padding-horizontal)}.menu__list-item:not(:first-child){margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.details_lb9f[data-collapsed=false].isBrowser_bmU9>summary:before,.details_lb9f[open]:not(.isBrowser_bmU9)>summary:before,.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(90deg)}.menu__list-item-collapsible{display:flex;flex-wrap:wrap;position:relative}.menu__caret:hover,.menu__link:hover,.menu__list-item-collapsible--active,.menu__list-item-collapsible:hover{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link--active,.menu__list-item-collapsible .menu__link:hover{background:none!important}.menu__caret,.menu__link{align-items:center;display:flex}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;transition-duration:var(--ifm-transition-fast);transition-timing-function:ease-in-out;top:0;left:0;visibility:hidden}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color);text-decoration:none}.menu__caret:before,.menu__link--sublist-caret:after{height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;content:"";filter:var(--ifm-menu-link-sublist-icon-filter)}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;margin-left:auto;min-width:1.25rem}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.announcementBarContent_xLdY,.navbar__title{flex:1 1 auto}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;height:2rem;margin-right:.5rem}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.navbar__items--center .navbar__brand{margin:0}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:0 0 auto;justify-content:flex-end}.navbar__items--right>:last-child{padding-right:0}.navbar__item{display:inline-block;padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:#ffffff1a;--ifm-navbar-search-input-placeholder-color:#ffffff80;color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-menu-color-background-active:#ffffff0d;--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:1rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);position:fixed;transform:translate3d(-100%,0,0);transition-property:opacity,visibility,transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar__items{transform:translateZ(0)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar__backdrop{background-color:#0009;position:fixed;right:0;transition-property:opacity,visibility}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar-sidebar__items{display:flex;height:calc(100% - var(--ifm-navbar-height));transition:transform var(--ifm-transition-fast) ease-in-out}.navbar-sidebar__items--show-secondary{transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{flex-shrink:0;padding:.5rem;width:calc(var(--ifm-navbar-sidebar-width))}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;text-align:left;top:-.5rem;width:calc(100% + 1rem)}.navbar-sidebar__close{display:flex;margin-left:auto}.pagination{column-gap:var(--ifm-pagination-page-spacing);display:flex;font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.pagination__item{display:inline-flex}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);display:inline-block;padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination__link:hover{text-decoration:none}.pagination-nav{display:grid;grid-gap:var(--ifm-spacing-horizontal);gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);display:block;height:100%;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover);text-decoration:none}.pagination-nav__link--next{grid-column:2/3;text-align:right}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"« "}.pagination-nav__link--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills__item,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs,:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.pills__item--active{color:var(--ifm-pills-color-active)}.pills__item--active,.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto}.hero_CaSG h1,.navbar__title{font-weight:700}.tabs__item{border-bottom:3px solid #0000;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:#ffffff0d;--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:#ffffff1a;--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:#ffffff12;--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec}#nprogress .bar{background:var(--docusaurus-progress-bar-color);height:2px;left:0;position:fixed;top:0;width:100%;z-index:1031}#nprogress .peg{box-shadow:0 0 10px var(--docusaurus-progress-bar-color),0 0 5px var(--docusaurus-progress-bar-color);height:100%;opacity:1;position:absolute;right:0;transform:rotate(3deg) translateY(-4px);width:100px}[data-theme=dark]{--ifm-color-primary:#6ccbb2;--ifm-color-primary-dark:#21af90;--ifm-color-primary-darker:#1fa588;--ifm-color-primary-darkest:#1a8870;--ifm-color-primary-light:#29d5b0;--ifm-color-primary-lighter:#32d8b4;--ifm-color-primary-lightest:#4fddbf;--docusaurus-highlighted-code-line-bg:#0000004d}.menu,.padding-top--md{padding-top:2em!important}.navbar{align-items:center;box-shadow:none;height:100px;justify-content:center;padding-bottom:0;padding-top:0}.navbar,.navbar .navbar__inner{background-color:var(--kadai-color-background)}.navbar .navbar__inner{height:100%;padding:0 70px;width:var(--kadai-content-width)}.navbar__title{font-size:1.2em;letter-spacing:-1px}.navbar .navbar__inner .navbar__item{color:var(--kadai-color-text);font-family:Karla,sans-serif;font-weight:400;margin-left:10px;padding:4px 20px;transition:.2s}.navbar .navbar__inner .navbar__item:hover{background-color:var(--kadai-color-text);color:#fff}.tag_zVej{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_zVej:hover{--docusaurus-tag-list-border:var(--ifm-link-color);text-decoration:none}.tagRegular_sFm0{border-radius:var(--ifm-global-radius);font-size:90%;padding:.2rem .5rem .3rem}.tagWithCount_h2kH{align-items:center;border-left:0;display:flex;padding:0 .5rem 0 1rem;position:relative}.tagWithCount_h2kH:after,.tagWithCount_h2kH:before{border:1px solid var(--docusaurus-tag-list-border);content:"";position:absolute;top:50%;transition:inherit}.tagWithCount_h2kH:before{border-bottom:0;border-right:0;height:1.18rem;right:100%;transform:translate(50%,-50%) rotate(-45deg);width:1.18rem}.tagWithCount_h2kH:after{border-radius:50%;height:.5rem;left:0;transform:translateY(-50%);width:.5rem}.tagWithCount_h2kH span{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.7rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.tags_jXut{display:inline}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.backToTopButton_sjWU{background-color:var(--ifm-color-emphasis-200);border-radius:50%;bottom:1.3rem;box-shadow:var(--ifm-global-shadow-lw);height:3rem;opacity:0;position:fixed;right:1.3rem;transform:scale(0);transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default);visibility:hidden;width:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1)}.backToTopButton_sjWU:after{background-color:var(--ifm-color-emphasis-1000);content:" ";display:inline-block;height:100%;-webkit-mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;width:100%}.backToTopButtonShow_xfvO{opacity:1;transform:scale(1);visibility:visible}.skipToContent_fXgn{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem;z-index:calc(var(--ifm-z-index-fixed) + 1)}.skipToContent_fXgn:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.closeButton_CVFx{line-height:0;padding:0}.content_knG7{font-size:85%;padding:5px 0;text-align:center}.content_knG7 a{color:inherit;text-decoration:underline}.announcementBar_mb4j{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}#__docusaurus-base-url-issue-banner-container,.docSidebarContainer_YfHR,.navbarSearchContainer_Bca1:empty,.sidebarLogo_isFc,.themedComponent_mlkZ,[data-theme=dark] .lightToggleIcon_pyhR,[data-theme=light] .darkToggleIcon_wfgR,html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j{display:none}.announcementBarPlaceholder_vyr4{flex:0 0 10px}.announcementBarClose_gvF7{align-self:stretch;flex:0 0 30px}.toggle_vylO{height:2rem;width:2rem}.toggleButton_gllP{align-items:center;border-radius:50%;display:flex;height:100%;justify-content:center;transition:background var(--ifm-transition-fast);width:100%}.toggleButton_gllP:hover{background:var(--ifm-color-emphasis-200)}.toggleButtonDisabled_aARS{cursor:not-allowed}.darkNavbarColorModeToggle_X3D1:hover{background:var(--ifm-color-gray-800)}[data-theme=dark] .themedComponent--dark_xIcU,[data-theme=light] .themedComponent--light_NVdE,html:not([data-theme]) .themedComponent--light_NVdE{display:initial}[data-theme=dark]:root{--docusaurus-collapse-button-bg:#ffffff0d;--docusaurus-collapse-button-bg-hover:#ffffff1a}.collapseSidebarButton_PEFL{display:none;margin:0}.iconExternalLink_nPIU{margin-left:.3rem}.docMainContainer_TBSr,.docRoot_UBD9{display:flex;width:100%}.docsWrapper_hBAB{display:flex;flex:1 0 auto}.dropdownNavbarItemMobile_S0Fm{cursor:pointer}.iconLanguage_nlXk{margin-right:5px;vertical-align:text-bottom}.navbarHideable_m1mJ{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_jGov{transform:translate3d(0,calc(-100% - 2px),0)}.errorBoundaryError_a6uf{color:red;white-space:pre-wrap}.errorBoundaryFallback_VBag{color:red;padding:.55rem}.footerLogoLink_BH7S{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.footerLogoLink_BH7S:hover,.hash-link:focus,:hover>.hash-link{opacity:1}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}.features_t9lD{align-items:center;display:flex;padding:2rem 0;width:100%}.featureSvg_GfXr{height:140px;width:150px}.anchorWithStickyNavbar_LWe7{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorWithHideOnScrollNavbar_WYt5{scroll-margin-top:.5rem}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast);-webkit-user-select:none;user-select:none}.hash-link:before{content:"#"}.mainWrapper_z2l0{display:flex;flex:1 0 auto;flex-direction:column}.docusaurus-mt-lg{margin-top:3rem}#__docusaurus{display:flex;flex-direction:column;min-height:100%}.cardContainer_fWXF{--ifm-link-color:var(--ifm-color-emphasis-800);--ifm-link-hover-color:var(--ifm-color-emphasis-700);--ifm-link-hover-decoration:none;border:1px solid var(--ifm-color-emphasis-200);box-shadow:0 1.5px 3px 0 #00000026;transition:all var(--ifm-transition-fast) ease;transition-property:border,box-shadow}.cardContainer_fWXF:hover{border-color:var(--ifm-color-primary);box-shadow:0 3px 6px 0 #0003}.cardTitle_rnsV{font-size:1.2rem}.cardDescription_PWke{font-size:.8rem}.wrapper_dohI{margin:0 auto;padding:0 1em}.hero_CaSG{background-color:var(--kadai-color-background);border-bottom-left-radius:5px;border-bottom-right-radius:5px;display:flex;justify-content:space-between;margin:0 auto;max-width:100%;min-height:200px;padding:30px 80px;width:var(--kadai-content-width)}.hero_CaSG .heroContent_VLnE{width:40%}.hero_CaSG .heroContent_VLnE p{margin-bottom:2em;margin-top:3em;text-align:justify}.hero_CaSG .heroAsset_jeqV{align-items:center;display:flex;padding-left:100px;width:60%}.hero_CaSG h1,.hero_CaSG h2{font-size:3em}.hero_CaSG h2{font-weight:350;text-decoration:underline;text-decoration-color:var(--kadai-color-primary)}.button_IrwC{background-color:var(--kadai-color-primary);border:none;color:#fff;font-size:1em;padding:15px 20px;transition:.2s}.buttonGroup__atx button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}.button_IrwC:hover{background-color:var(--kadai-color-primary-darker);cursor:pointer}.codeBlockContainer_Ckt0{border-radius:var(--ifm-code-border-radius);box-shadow:var(--ifm-global-shadow-lw);margin-bottom:var(--ifm-leading)}.codeBlockContent_biex{border-radius:inherit;direction:ltr;position:relative}.codeBlockTitle_Ktv7{border-bottom:1px solid var(--ifm-color-emphasis-300);border-top-left-radius:inherit;border-top-right-radius:inherit;font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.codeBlock_bY9V{--ifm-pre-background:var(--prism-background-color);margin:0;padding:0}.codeBlockTitle_Ktv7+.codeBlockContent_biex .codeBlock_bY9V{border-top-left-radius:0;border-top-right-radius:0}.codeBlockLines_e6Vv{float:left;font:inherit;min-width:100%;padding:var(--ifm-pre-padding)}.codeBlockLinesWithNumbering_o6Pm{display:table;padding:var(--ifm-pre-padding) 0}.buttonGroup__atx{column-gap:.2rem;display:flex;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2)}.buttonGroup__atx button{align-items:center;border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);display:flex;line-height:0;opacity:0;padding:.4rem;transition:opacity var(--ifm-transition-fast) ease-in-out}.buttonGroup__atx button:focus-visible,.buttonGroup__atx button:hover{opacity:1!important}.theme-code-block:hover .buttonGroup__atx button{opacity:.4}:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.codeLine_lJS_{counter-increment:a;display:table-row}.codeLineNumber_Tfdd{background:var(--ifm-pre-background);display:table-cell;left:0;overflow-wrap:normal;padding:0 var(--ifm-pre-padding);position:sticky;text-align:right;width:1%}.codeLineNumber_Tfdd:before{content:counter(a);opacity:.4}.codeLineContent_feaV{padding-right:var(--ifm-pre-padding)}.theme-code-block:hover .copyButtonCopied_obH4{opacity:1!important}.copyButtonIcons_eSgA{height:1.125rem;position:relative;width:1.125rem}.copyButtonIcon_y97N,.copyButtonSuccessIcon_LjdS{left:0;position:absolute;top:0;fill:currentColor;height:inherit;opacity:inherit;transition:all var(--ifm-transition-fast) ease;width:inherit}.copyButtonSuccessIcon_LjdS{color:#00d600;left:50%;opacity:0;top:50%;transform:translate(-50%,-50%) scale(.33)}.copyButtonCopied_obH4 .copyButtonIcon_y97N{opacity:0;transform:scale(.33)}.copyButtonCopied_obH4 .copyButtonSuccessIcon_LjdS{opacity:1;transform:translate(-50%,-50%) scale(1);transition-delay:75ms}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}.details_lb9f{--docusaurus-details-summary-arrow-size:0.38rem;--docusaurus-details-transition:transform 200ms ease;--docusaurus-details-decoration-color:grey}.details_lb9f>summary{cursor:pointer;padding-left:1rem;position:relative}.details_lb9f>summary::-webkit-details-marker{display:none}.details_lb9f>summary:before{border-color:#0000 #0000 #0000 var(--docusaurus-details-decoration-color);border-style:solid;border-width:var(--docusaurus-details-summary-arrow-size);content:"";left:0;position:absolute;top:.45rem;transform:rotate(0);transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transition:var(--docusaurus-details-transition)}.collapsibleContent_i85q{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}.lastUpdated_JAkA{font-size:smaller;font-style:italic;margin-top:.2rem}.tocCollapsibleButton_TO0P{align-items:center;display:flex;font-size:inherit;justify-content:space-between;padding:.4rem .8rem;width:100%}.tocCollapsibleButton_TO0P:after{background:var(--ifm-menu-link-sublist-icon) 50% 50%/2rem 2rem no-repeat;content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast);width:1.25rem}.tocCollapsibleButtonExpanded_MG3E:after,.tocCollapsibleExpanded_sAul{transform:none}.tocCollapsible_ETCw{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.tocCollapsibleContent_vkbj>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);font-size:15px;padding:.2rem 0}.tocCollapsibleContent_vkbj ul li{margin:.4rem .8rem}.tocCollapsibleContent_vkbj a{display:block}.details_b_Ee{--docusaurus-details-decoration-color:var(--ifm-alert-border-color);--docusaurus-details-transition:transform var(--ifm-transition-fast) ease;border:1px solid var(--ifm-alert-border-color);margin:0 0 var(--ifm-spacing-vertical)}.img_ev3q{height:auto}.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem);overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.admonition_xJq3{margin-bottom:1em}.admonitionHeading_Gvgb{font:var(--ifm-heading-font-weight) var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family)}.admonitionHeading_Gvgb:not(:last-child){margin-bottom:.3rem}.admonitionHeading_Gvgb code{text-transform:none}.admonitionIcon_Rf37{display:inline-block;margin-right:.4em;vertical-align:middle}.admonitionIcon_Rf37 svg{display:inline-block;height:1.6em;width:1.6em;fill:var(--ifm-alert-foreground-color)}.breadcrumbHomeIcon_YNFT{height:1.1rem;position:relative;top:1px;vertical-align:top;width:1.1rem}.breadcrumbsContainer_Z_bl{--ifm-breadcrumb-size-multiplier:0.8;margin-bottom:.8rem}.title_kItE{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-leading)*1.25)}.mdxPageWrapper_j9I6{justify-content:center}@media (min-width:997px){.collapseSidebarButton_PEFL,.expandButton_TmdG{background-color:var(--docusaurus-collapse-button-bg)}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_gvF7,.announcementBarPlaceholder_vyr4{flex-basis:50px}.collapseSidebarButton_PEFL{border:1px solid var(--ifm-toc-border-color);border-radius:0;bottom:0;display:block!important;height:40px;position:sticky}.collapseSidebarButtonIcon_kv0_{margin-top:4px;transform:rotate(180deg)}.expandButtonIcon_i1dp,[dir=rtl] .collapseSidebarButtonIcon_kv0_{transform:rotate(0)}.collapseSidebarButton_PEFL:focus,.collapseSidebarButton_PEFL:hover,.expandButton_TmdG:focus,.expandButton_TmdG:hover{background-color:var(--docusaurus-collapse-button-bg-hover)}.menuHtmlItem_M9Kj{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_SIkG{flex-grow:1;padding:.5rem}@supports (scrollbar-gutter:stable){.menu_SIkG{padding:.5rem 0 .5rem .5rem;scrollbar-gutter:stable}}.menuWithAnnouncementBar_GW3s{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_njMd{display:flex;flex-direction:column;height:100%;padding-top:var(--ifm-navbar-height);width:var(--doc-sidebar-width)}.sidebarWithHideableNavbar_wUlq{padding-top:0}.sidebarHidden_VK0M{opacity:0;visibility:hidden}.sidebarLogo_isFc{align-items:center;color:inherit!important;display:flex!important;margin:0 var(--ifm-navbar-padding-horizontal);max-height:var(--ifm-navbar-height);min-height:var(--ifm-navbar-height);text-decoration:none!important}.sidebarLogo_isFc img{height:2rem;margin-right:.5rem}.expandButton_TmdG{align-items:center;display:flex;height:100%;justify-content:center;position:absolute;right:0;top:0;transition:background-color var(--ifm-transition-fast) ease;width:100%}[dir=rtl] .expandButtonIcon_i1dp{transform:rotate(180deg)}.docSidebarContainer_YfHR{border-right:1px solid var(--ifm-toc-border-color);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_DPk8{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.sidebarViewport_aRkj{height:100%;max-height:100vh;position:sticky;top:0}.docMainContainer_TBSr{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_lQrH{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_JWYK{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}.navbarSearchContainer_Bca1{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.lastUpdated_JAkA{text-align:right}.tocMobile_ITEo{display:none}.docItemCol_VOVn,.generatedIndexPage_vN6x{max-width:75%!important}.list_eTzJ article:nth-last-child(-n+2){margin-bottom:0!important}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media screen and (max-width:1024px){.hero_CaSG,.hero_CaSG .heroContent_VLnE{width:100%}.hero_CaSG{flex-direction:column}.hero_CaSG .heroAsset_jeqV{padding-left:0;width:100%}}@media (max-width:996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.colorModeToggle_DEke,.footer__link-separator,.navbar__item,.tableOfContents_bqdL{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.navbarSearchContainer_Bca1{position:absolute;right:var(--ifm-navbar-padding-horizontal)}.docItemContainer_F8PC{padding:0 .3rem}}@media (max-width:576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}}@media (hover:hover){.backToTopButton_sjWU:hover{background-color:var(--ifm-color-emphasis-300)}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media (prefers-reduced-motion:reduce){:root{--ifm-transition-fast:0ms;--ifm-transition-slow:0ms}}@media print{.announcementBar_mb4j,.footer,.menu,.navbar,.pagination-nav,.table-of-contents,.tocMobile_ITEo{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_e6Vv{white-space:pre-wrap}} \ No newline at end of file +@import url(https://fonts.googleapis.com/css2?family=Karla:wght@400;500;600;700&display=swap);.col,.container{padding:0 var(--ifm-spacing-horizontal);width:100%}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown li,body{word-wrap:break-word}body,ol ol,ol ul,ul ol,ul ul{margin:0}pre,table{overflow:auto}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button,code{vertical-align:middle}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.menu__link:hover,a{transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}.menu,.navbar-sidebar{overflow-x:hidden}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}.toggleButton_gllP,html{-webkit-tap-highlight-color:transparent}.clean-list,.containsTaskList_mC6p,.details_lb9f>summary,.dropdown__menu,.menu__list{list-style:none}:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:#0000;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:0.4rem;--ifm-hover-overlay:#0000000d;--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 #0000001a;--ifm-global-shadow-md:0 5px 40px #0003;--ifm-global-shadow-tl:0 12px 28px 0 #0003,0 2px 4px 0 #0000001a;--ifm-z-index-dropdown:100;--ifm-z-index-fixed:200;--ifm-z-index-overlay:400;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.1rem;--ifm-code-padding-vertical:0.1rem;--ifm-pre-background:var(--ifm-code-background);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:0.75rem;--ifm-table-background:#0000;--ifm-table-stripe-background:#00000008;--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-shadow:none;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-background-color:var(--ifm-color-emphasis-500);--ifm-hr-height:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-color:var(--ifm-font-color-base);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size:3rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.5rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:0.8rem;--ifm-breadcrumb-padding-vertical:0.4rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-spacing:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-footer-logo-max-width:min(30rem,90vw);--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:0.75rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:0.75rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,');--ifm-navbar-sidebar-width:83vw;--ifm-pagination-border-radius:var(--ifm-global-radius);--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.2em;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:0.125rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem;--docusaurus-progress-bar-color:var(--ifm-color-primary);--ifm-color-primary:#6ccbb2;--ifm-color-primary-dark:#29784c;--ifm-color-primary-darker:#277148;--ifm-color-primary-darkest:#205d3b;--ifm-color-primary-light:#33925d;--ifm-color-primary-lighter:#359962;--ifm-color-primary-lightest:#3cad6e;--ifm-code-font-size:95%;--kadai-color-primary:#6ccbb2;--kadai-color-primary-darker:#58a591;--kadai-color-secondary:#d5f2e8;--kadai-color-contrast:#90c5e2;--kadai-color-background:#f3f3f2;--kadai-color-text:#1b1b1b;--docusaurus-highlighted-code-line-bg:#0000001a;--kadai-content-width:1280px;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300);--docusaurus-announcement-bar-height:auto;--docusaurus-collapse-button-bg:#0000;--docusaurus-collapse-button-bg-hover:#0000001a;--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:#0000}*{box-sizing:border-box}html{background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;-webkit-text-size-adjust:100%;text-size-adjust:100%}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.container--fluid{max-width:inherit}.row{display:flex;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.list_eTzJ article:last-child,.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none{margin-top:0!important}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.menuExternalLink_NmtK,.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;flex:1 0;margin-left:0;max-width:var(--ifm-col-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:8.33333%}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:16.66667%}.col--offset-2{margin-left:16.66667%}.col--3{--ifm-col-width:25%}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:33.33333%}.col--offset-4{margin-left:33.33333%}.col--5{--ifm-col-width:41.66667%}.col--offset-5{margin-left:41.66667%}.col--6{--ifm-col-width:50%}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:58.33333%}.col--offset-7{margin-left:58.33333%}.col--8{--ifm-col-width:66.66667%}.col--offset-8{margin-left:66.66667%}.col--9{--ifm-col-width:75%}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:83.33333%}.col--offset-10{margin-left:83.33333%}.col--11{--ifm-col-width:91.66667%}.col--offset-11{margin-left:91.66667%}.col--12{--ifm-col-width:100%}.col--offset-12{margin-left:100%}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-vert--md{padding-top:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid #0000001a;border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}a code{color:inherit}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);padding:var(--ifm-pre-padding)}pre code{background-color:initial;border:none;font-size:100%;line-height:inherit;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}h1{font-size:var(--ifm-h1-font-size)}h2{font-size:var(--ifm-h2-font-size)}h3{font-size:var(--ifm-h3-font-size)}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}img{max-width:100%}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before{content:"";display:table}.markdown:after{clear:both}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>p,.markdown>pre,.markdown>ul{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table{border-collapse:collapse;display:block;margin-bottom:var(--ifm-spacing-vertical)}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead,table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button:hover,.text--no-decoration,.text--no-decoration:hover,a:not([href]){text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-left:var(--ifm-blockquote-border-left-width) solid var(--ifm-blockquote-border-color);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{background-color:var(--ifm-hr-background-color);border:0;height:var(--ifm-hr-height);margin:var(--ifm-hr-margin-vertical) 0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary,.wordWrapButtonEnabled_EoeP .wordWrapButtonIcon_Bwma{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.text--center{text-align:center}.text--left{text-align:left}.featureText_ZxAV,.text--justify{text-align:justify}.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.admonitionHeading_Gvgb,.alert__heading,.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.clean-list{padding-left:0}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:#3578e526;--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:#ebedf026;--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:#00a40026;--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:#54c7ec26;--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:#ffba0026;--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:#fa383e26;--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border:var(--ifm-alert-border-width) solid var(--ifm-alert-border-color);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert__heading{align-items:center;display:flex;font:700 var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.5rem}.alert__icon{display:inline-flex;margin-right:.4em}.alert__icon svg{fill:var(--ifm-alert-foreground-color);stroke:var(--ifm-alert-foreground-color);stroke-width:0}.alert .close{margin:calc(var(--ifm-alert-padding-vertical)*-1) calc(var(--ifm-alert-padding-horizontal)*-1) 0 0;opacity:.75}.alert .close:focus,.alert .close:hover{opacity:1}.alert a{text-decoration-color:var(--ifm-alert-border-color)}.alert a:hover{text-decoration-thickness:2px}.avatar{column-gap:var(--ifm-avatar-intro-margin);display:flex}.avatar__photo{border-radius:50%;display:block;height:var(--ifm-avatar-photo-size);overflow:hidden;width:var(--ifm-avatar-photo-size)}.card--full-height,.navbar__logo img,body,html{height:100%}.avatar__photo--sm{--ifm-avatar-photo-size:2rem}.avatar__photo--lg{--ifm-avatar-photo-size:4rem}.avatar__photo--xl{--ifm-avatar-photo-size:6rem}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button,.dropdown>.navbar__link:after{display:inline-block}.avatar__name{font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);line-height:1;padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal)}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) center;content:" ";display:inline-block;filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 var(--ifm-breadcrumb-spacing);opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active);color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-duration:var(--ifm-transition-fast);transition-property:background,color}.breadcrumbs__link:any-link:hover,.breadcrumbs__link:link:hover,.breadcrumbs__link:visited:hover,area[href].breadcrumbs__link:hover{background:var(--ifm-breadcrumb-item-background-active);text-decoration:none}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border:var(--ifm-button-border-width) solid var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);cursor:pointer;font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);line-height:1.5;padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;transition-duration:var(--ifm-button-transition-duration);transition-property:color,background,border-color;-webkit-user-select:none;user-select:none;white-space:nowrap}.button,.button:hover{color:var(--ifm-button-color)}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:#0000;color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}:where(.button--primary){--ifm-button-background-color:var(--ifm-color-primary);--ifm-button-border-color:var(--ifm-color-primary)}:where(.button--primary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-background-color:var(--ifm-color-primary-darker);--ifm-button-border-color:var(--ifm-color-primary-darker)}:where(.button--secondary){--ifm-button-background-color:var(--ifm-color-secondary);--ifm-button-border-color:var(--ifm-color-secondary)}:where(.button--secondary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-background-color:var(--ifm-color-secondary-darker);--ifm-button-border-color:var(--ifm-color-secondary-darker)}:where(.button--success){--ifm-button-background-color:var(--ifm-color-success);--ifm-button-border-color:var(--ifm-color-success)}:where(.button--success):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-background-color:var(--ifm-color-success-darker);--ifm-button-border-color:var(--ifm-color-success-darker)}:where(.button--info){--ifm-button-background-color:var(--ifm-color-info);--ifm-button-border-color:var(--ifm-color-info)}:where(.button--info):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-background-color:var(--ifm-color-info-darker);--ifm-button-border-color:var(--ifm-color-info-darker)}:where(.button--warning){--ifm-button-background-color:var(--ifm-color-warning);--ifm-button-border-color:var(--ifm-color-warning)}:where(.button--warning):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-background-color:var(--ifm-color-warning-darker);--ifm-button-border-color:var(--ifm-color-warning-darker)}:where(.button--danger){--ifm-button-background-color:var(--ifm-color-danger);--ifm-button-border-color:var(--ifm-color-danger)}:where(.button--danger):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-background-color:var(--ifm-color-danger-darker);--ifm-button-border-color:var(--ifm-color-danger-darker)}.button-group{display:inline-flex;gap:var(--ifm-button-group-spacing)}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group--block{display:flex;justify-content:stretch}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);display:flex;flex-direction:column;overflow:hidden}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);text-decoration:none}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.close:hover{opacity:.7}.close:focus,.theme-code-block-highlighted-line .codeLineNumber_Tfdd:before{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;pointer-events:all;transform:translateY(-1px);visibility:visible}#nprogress,.dropdown__menu,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);left:0;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem;white-space:nowrap}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color);text-decoration:none}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor #0000;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white)}.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{margin-top:1rem;max-width:var(--ifm-footer-logo-max-width)}.footer__title{color:var(--ifm-footer-title-color);font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.menu,.navbar__link{font-weight:var(--ifm-font-weight-semibold)}.button_IrwC,.hero_CaSG,.hero_CaSG h1,.hero_CaSG h2,.navbar__title{font-family:Karla,sans-serif}.docItemContainer_Djhp article>:first-child,.docItemContainer_Djhp header+*,.footer__item{margin-top:0}.admonitionContent_BuS1>:last-child,.cardContainer_fWXF :last-child,.collapsibleContent_i85q p:last-child,.details_lb9f>summary>p:last-child,.footer__items{margin-bottom:0}.codeBlockStandalone_MEMb,[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{margin:0;padding-left:0}.menu__caret,.menu__link{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__list .menu__list{flex:0 0 100%;margin-top:.25rem;padding-left:var(--ifm-menu-link-padding-horizontal)}.menu__list-item:not(:first-child){margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.details_lb9f[data-collapsed=false].isBrowser_bmU9>summary:before,.details_lb9f[open]:not(.isBrowser_bmU9)>summary:before,.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(90deg)}.menu__list-item-collapsible{display:flex;flex-wrap:wrap;position:relative}.menu__caret:hover,.menu__link:hover,.menu__list-item-collapsible--active,.menu__list-item-collapsible:hover{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link--active,.menu__list-item-collapsible .menu__link:hover{background:none!important}.menu__caret,.menu__link{align-items:center;display:flex}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;transition-duration:var(--ifm-transition-fast);transition-timing-function:ease-in-out;top:0;left:0;visibility:hidden}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color);text-decoration:none}.menu__caret:before,.menu__link--sublist-caret:after{height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;content:"";filter:var(--ifm-menu-link-sublist-icon-filter)}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;margin-left:auto;min-width:1.25rem}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.announcementBarContent_xLdY,.navbar__title{flex:1 1 auto}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;height:2rem;margin-right:.5rem}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.navbar__items--center .navbar__brand{margin:0}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:0 0 auto;justify-content:flex-end}.navbar__items--right>:last-child{padding-right:0}.navbar__item{display:inline-block;padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color);text-decoration:none}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:#ffffff1a;--ifm-navbar-search-input-placeholder-color:#ffffff80;color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-menu-color-background-active:#ffffff0d;--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:1rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);position:fixed;transform:translate3d(-100%,0,0);transition-property:opacity,visibility,transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar__items{transform:translateZ(0)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar__backdrop{background-color:#0009;position:fixed;right:0;transition-property:opacity,visibility}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar-sidebar__items{display:flex;height:calc(100% - var(--ifm-navbar-height));transition:transform var(--ifm-transition-fast) ease-in-out}.navbar-sidebar__items--show-secondary{transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{flex-shrink:0;padding:.5rem;width:calc(var(--ifm-navbar-sidebar-width))}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;text-align:left;top:-.5rem;width:calc(100% + 1rem)}.navbar-sidebar__close{display:flex;margin-left:auto}.pagination{column-gap:var(--ifm-pagination-page-spacing);display:flex;font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.pagination__item{display:inline-flex}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);display:inline-block;padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination__link:hover{text-decoration:none}.pagination-nav{display:grid;grid-gap:var(--ifm-spacing-horizontal);gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);display:block;height:100%;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover);text-decoration:none}.pagination-nav__link--next{grid-column:2/3;text-align:right}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"« "}.pagination-nav__link--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills__item,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs,:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.pills__item--active{color:var(--ifm-pills-color-active)}.pills__item--active,.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto}.hero_CaSG h1,.navbar__title{font-weight:700}.tabs__item{border-bottom:3px solid #0000;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:#ffffff0d;--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:#ffffff1a;--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:#ffffff12;--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec}#nprogress .bar{background:var(--docusaurus-progress-bar-color);height:2px;left:0;position:fixed;top:0;width:100%;z-index:1031}#nprogress .peg{box-shadow:0 0 10px var(--docusaurus-progress-bar-color),0 0 5px var(--docusaurus-progress-bar-color);height:100%;opacity:1;position:absolute;right:0;transform:rotate(3deg) translateY(-4px);width:100px}[data-theme=dark]{--ifm-color-primary:#6ccbb2;--ifm-color-primary-dark:#21af90;--ifm-color-primary-darker:#1fa588;--ifm-color-primary-darkest:#1a8870;--ifm-color-primary-light:#29d5b0;--ifm-color-primary-lighter:#32d8b4;--ifm-color-primary-lightest:#4fddbf;--docusaurus-highlighted-code-line-bg:#0000004d}.menu,.padding-top--md{padding-top:2em!important}.navbar{align-items:center;box-shadow:none;height:100px;justify-content:center;padding-bottom:0;padding-top:0}.navbar,.navbar .navbar__inner{background-color:var(--kadai-color-background)}.navbar .navbar__inner{height:100%;padding:0 70px;width:var(--kadai-content-width)}.navbar__title{font-size:1.2em;letter-spacing:-1px}.navbar .navbar__inner .navbar__item{color:var(--kadai-color-text);font-family:Karla,sans-serif;font-weight:400;margin-left:10px;padding:4px 20px;transition:.2s}.navbar .navbar__inner .navbar__item:hover{background-color:var(--kadai-color-text);color:#fff}.tag_zVej{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_zVej:hover{--docusaurus-tag-list-border:var(--ifm-link-color);text-decoration:none}.tagRegular_sFm0{border-radius:var(--ifm-global-radius);font-size:90%;padding:.2rem .5rem .3rem}.tagWithCount_h2kH{align-items:center;border-left:0;display:flex;padding:0 .5rem 0 1rem;position:relative}.tagWithCount_h2kH:after,.tagWithCount_h2kH:before{border:1px solid var(--docusaurus-tag-list-border);content:"";position:absolute;top:50%;transition:inherit}.tagWithCount_h2kH:before{border-bottom:0;border-right:0;height:1.18rem;right:100%;transform:translate(50%,-50%) rotate(-45deg);width:1.18rem}.tagWithCount_h2kH:after{border-radius:50%;height:.5rem;left:0;transform:translateY(-50%);width:.5rem}.tagWithCount_h2kH span{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.7rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.tags_jXut{display:inline}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.backToTopButton_sjWU{background-color:var(--ifm-color-emphasis-200);border-radius:50%;bottom:1.3rem;box-shadow:var(--ifm-global-shadow-lw);height:3rem;opacity:0;position:fixed;right:1.3rem;transform:scale(0);transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default);visibility:hidden;width:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1)}.backToTopButton_sjWU:after{background-color:var(--ifm-color-emphasis-1000);content:" ";display:inline-block;height:100%;-webkit-mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;width:100%}.backToTopButtonShow_xfvO{opacity:1;transform:scale(1);visibility:visible}.skipToContent_fXgn{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem;z-index:calc(var(--ifm-z-index-fixed) + 1)}.skipToContent_fXgn:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.closeButton_CVFx{line-height:0;padding:0}.content_knG7{font-size:85%;padding:5px 0;text-align:center}.content_knG7 a{color:inherit;text-decoration:underline}.announcementBar_mb4j{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}#__docusaurus-base-url-issue-banner-container,.docSidebarContainer_YfHR,.navbarSearchContainer_Bca1:empty,.sidebarLogo_isFc,.themedComponent_mlkZ,[data-theme=dark] .lightToggleIcon_pyhR,[data-theme=light] .darkToggleIcon_wfgR,html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j{display:none}.announcementBarPlaceholder_vyr4{flex:0 0 10px}.announcementBarClose_gvF7{align-self:stretch;flex:0 0 30px}.toggle_vylO{height:2rem;width:2rem}.toggleButton_gllP{align-items:center;border-radius:50%;display:flex;height:100%;justify-content:center;transition:background var(--ifm-transition-fast);width:100%}.toggleButton_gllP:hover{background:var(--ifm-color-emphasis-200)}.toggleButtonDisabled_aARS{cursor:not-allowed}.darkNavbarColorModeToggle_X3D1:hover{background:var(--ifm-color-gray-800)}[data-theme=dark] .themedComponent--dark_xIcU,[data-theme=light] .themedComponent--light_NVdE,html:not([data-theme]) .themedComponent--light_NVdE{display:initial}[data-theme=dark]:root{--docusaurus-collapse-button-bg:#ffffff0d;--docusaurus-collapse-button-bg-hover:#ffffff1a}.collapseSidebarButton_PEFL{display:none;margin:0}.iconExternalLink_nPIU{margin-left:.3rem}.docMainContainer_TBSr,.docRoot_UBD9{display:flex;width:100%}.docsWrapper_hBAB{display:flex;flex:1 0 auto}.dropdownNavbarItemMobile_S0Fm{cursor:pointer}.iconLanguage_nlXk{margin-right:5px;vertical-align:text-bottom}.navbarHideable_m1mJ{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_jGov{transform:translate3d(0,calc(-100% - 2px),0)}.errorBoundaryError_a6uf{color:red;white-space:pre-wrap}.errorBoundaryFallback_VBag{color:red;padding:.55rem}.footerLogoLink_BH7S{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.footerLogoLink_BH7S:hover,.hash-link:focus,:hover>.hash-link{opacity:1}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}.features_t9lD{align-items:center;display:flex;padding:2rem 0;width:100%}.featureSvg_GfXr{height:140px;width:150px}.anchorWithStickyNavbar_LWe7{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorWithHideOnScrollNavbar_WYt5{scroll-margin-top:.5rem}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast);-webkit-user-select:none;user-select:none}.hash-link:before{content:"#"}.mainWrapper_z2l0{display:flex;flex:1 0 auto;flex-direction:column}.docusaurus-mt-lg{margin-top:3rem}#__docusaurus{display:flex;flex-direction:column;min-height:100%}.cardContainer_fWXF{--ifm-link-color:var(--ifm-color-emphasis-800);--ifm-link-hover-color:var(--ifm-color-emphasis-700);--ifm-link-hover-decoration:none;border:1px solid var(--ifm-color-emphasis-200);box-shadow:0 1.5px 3px 0 #00000026;transition:all var(--ifm-transition-fast) ease;transition-property:border,box-shadow}.cardContainer_fWXF:hover{border-color:var(--ifm-color-primary);box-shadow:0 3px 6px 0 #0003}.cardTitle_rnsV{font-size:1.2rem}.cardDescription_PWke{font-size:.8rem}.wrapper_dohI{margin:0 auto;padding:0 1em}.hero_CaSG{background-color:var(--kadai-color-background);border-bottom-left-radius:5px;border-bottom-right-radius:5px;display:flex;justify-content:space-between;margin:0 auto;max-width:100%;min-height:200px;padding:30px 80px;width:var(--kadai-content-width)}.hero_CaSG .heroContent_VLnE{width:40%}.hero_CaSG .heroContent_VLnE p{margin-bottom:2em;margin-top:3em;text-align:justify}.hero_CaSG .heroAsset_jeqV{align-items:center;display:flex;padding-left:100px;width:60%}.hero_CaSG h1,.hero_CaSG h2{font-size:3em}.hero_CaSG h2{font-weight:350;text-decoration:underline;text-decoration-color:var(--kadai-color-primary)}.button_IrwC{background-color:var(--kadai-color-primary);border:none;color:#fff;font-size:1em;padding:15px 20px;transition:.2s}.buttonGroup__atx button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}.button_IrwC:hover{background-color:var(--kadai-color-primary-darker);cursor:pointer}.codeBlockContainer_Ckt0{border-radius:var(--ifm-code-border-radius);box-shadow:var(--ifm-global-shadow-lw);margin-bottom:var(--ifm-leading)}.codeBlockContent_biex{border-radius:inherit;direction:ltr;position:relative}.codeBlockTitle_Ktv7{border-bottom:1px solid var(--ifm-color-emphasis-300);border-top-left-radius:inherit;border-top-right-radius:inherit;font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.codeBlock_bY9V{--ifm-pre-background:var(--prism-background-color);margin:0;padding:0}.codeBlockTitle_Ktv7+.codeBlockContent_biex .codeBlock_bY9V{border-top-left-radius:0;border-top-right-radius:0}.codeBlockLines_e6Vv{float:left;font:inherit;min-width:100%;padding:var(--ifm-pre-padding)}.codeBlockLinesWithNumbering_o6Pm{display:table;padding:var(--ifm-pre-padding) 0}.buttonGroup__atx{column-gap:.2rem;display:flex;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2)}.buttonGroup__atx button{align-items:center;border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);display:flex;line-height:0;opacity:0;padding:.4rem;transition:opacity var(--ifm-transition-fast) ease-in-out}.buttonGroup__atx button:focus-visible,.buttonGroup__atx button:hover{opacity:1!important}.theme-code-block:hover .buttonGroup__atx button{opacity:.4}:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.codeLine_lJS_{counter-increment:a;display:table-row}.codeLineNumber_Tfdd{background:var(--ifm-pre-background);display:table-cell;left:0;overflow-wrap:normal;padding:0 var(--ifm-pre-padding);position:sticky;text-align:right;width:1%}.codeLineNumber_Tfdd:before{content:counter(a);opacity:.4}.codeLineContent_feaV{padding-right:var(--ifm-pre-padding)}.theme-code-block:hover .copyButtonCopied_obH4{opacity:1!important}.copyButtonIcons_eSgA{height:1.125rem;position:relative;width:1.125rem}.copyButtonIcon_y97N,.copyButtonSuccessIcon_LjdS{left:0;position:absolute;top:0;fill:currentColor;height:inherit;opacity:inherit;transition:all var(--ifm-transition-fast) ease;width:inherit}.copyButtonSuccessIcon_LjdS{color:#00d600;left:50%;opacity:0;top:50%;transform:translate(-50%,-50%) scale(.33)}.copyButtonCopied_obH4 .copyButtonIcon_y97N{opacity:0;transform:scale(.33)}.copyButtonCopied_obH4 .copyButtonSuccessIcon_LjdS{opacity:1;transform:translate(-50%,-50%) scale(1);transition-delay:75ms}.wordWrapButtonIcon_Bwma{height:1.2rem;width:1.2rem}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}.details_lb9f{--docusaurus-details-summary-arrow-size:0.38rem;--docusaurus-details-transition:transform 200ms ease;--docusaurus-details-decoration-color:grey}.details_lb9f>summary{cursor:pointer;padding-left:1rem;position:relative}.details_lb9f>summary::-webkit-details-marker{display:none}.details_lb9f>summary:before{border-color:#0000 #0000 #0000 var(--docusaurus-details-decoration-color);border-style:solid;border-width:var(--docusaurus-details-summary-arrow-size);content:"";left:0;position:absolute;top:.45rem;transform:rotate(0);transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transition:var(--docusaurus-details-transition)}.collapsibleContent_i85q{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}.lastUpdated_JAkA{font-size:smaller;font-style:italic;margin-top:.2rem}.tocCollapsibleButton_TO0P{align-items:center;display:flex;font-size:inherit;justify-content:space-between;padding:.4rem .8rem;width:100%}.tocCollapsibleButton_TO0P:after{background:var(--ifm-menu-link-sublist-icon) 50% 50%/2rem 2rem no-repeat;content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast);width:1.25rem}.tocCollapsibleButtonExpanded_MG3E:after,.tocCollapsibleExpanded_sAul{transform:none}.tocCollapsible_ETCw{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.tocCollapsibleContent_vkbj>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);font-size:15px;padding:.2rem 0}.tocCollapsibleContent_vkbj ul li{margin:.4rem .8rem}.tocCollapsibleContent_vkbj a{display:block}.details_b_Ee{--docusaurus-details-decoration-color:var(--ifm-alert-border-color);--docusaurus-details-transition:transform var(--ifm-transition-fast) ease;border:1px solid var(--ifm-alert-border-color);margin:0 0 var(--ifm-spacing-vertical)}.img_ev3q{height:auto}.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem);overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.admonition_xJq3{margin-bottom:1em}.admonitionHeading_Gvgb{font:var(--ifm-heading-font-weight) var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family)}.admonitionHeading_Gvgb:not(:last-child){margin-bottom:.3rem}.admonitionHeading_Gvgb code{text-transform:none}.admonitionIcon_Rf37{display:inline-block;margin-right:.4em;vertical-align:middle}.admonitionIcon_Rf37 svg{display:inline-block;height:1.6em;width:1.6em;fill:var(--ifm-alert-foreground-color)}.breadcrumbHomeIcon_YNFT{height:1.1rem;position:relative;top:1px;vertical-align:top;width:1.1rem}.breadcrumbsContainer_Z_bl{--ifm-breadcrumb-size-multiplier:0.8;margin-bottom:.8rem}.title_kItE{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-leading)*1.25)}.mdxPageWrapper_j9I6{justify-content:center}@media (min-width:997px){.collapseSidebarButton_PEFL,.expandButton_TmdG{background-color:var(--docusaurus-collapse-button-bg)}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_gvF7,.announcementBarPlaceholder_vyr4{flex-basis:50px}.collapseSidebarButton_PEFL{border:1px solid var(--ifm-toc-border-color);border-radius:0;bottom:0;display:block!important;height:40px;position:sticky}.collapseSidebarButtonIcon_kv0_{margin-top:4px;transform:rotate(180deg)}.expandButtonIcon_i1dp,[dir=rtl] .collapseSidebarButtonIcon_kv0_{transform:rotate(0)}.collapseSidebarButton_PEFL:focus,.collapseSidebarButton_PEFL:hover,.expandButton_TmdG:focus,.expandButton_TmdG:hover{background-color:var(--docusaurus-collapse-button-bg-hover)}.menuHtmlItem_M9Kj{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_SIkG{flex-grow:1;padding:.5rem}@supports (scrollbar-gutter:stable){.menu_SIkG{padding:.5rem 0 .5rem .5rem;scrollbar-gutter:stable}}.menuWithAnnouncementBar_GW3s{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_njMd{display:flex;flex-direction:column;height:100%;padding-top:var(--ifm-navbar-height);width:var(--doc-sidebar-width)}.sidebarWithHideableNavbar_wUlq{padding-top:0}.sidebarHidden_VK0M{opacity:0;visibility:hidden}.sidebarLogo_isFc{align-items:center;color:inherit!important;display:flex!important;margin:0 var(--ifm-navbar-padding-horizontal);max-height:var(--ifm-navbar-height);min-height:var(--ifm-navbar-height);text-decoration:none!important}.sidebarLogo_isFc img{height:2rem;margin-right:.5rem}.expandButton_TmdG{align-items:center;display:flex;height:100%;justify-content:center;position:absolute;right:0;top:0;transition:background-color var(--ifm-transition-fast) ease;width:100%}[dir=rtl] .expandButtonIcon_i1dp{transform:rotate(180deg)}.docSidebarContainer_YfHR{border-right:1px solid var(--ifm-toc-border-color);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_DPk8{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.sidebarViewport_aRkj{height:100%;max-height:100vh;position:sticky;top:0}.docMainContainer_TBSr{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_lQrH{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_JWYK{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}.navbarSearchContainer_Bca1{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.lastUpdated_JAkA{text-align:right}.tocMobile_ITEo{display:none}.docItemCol_VOVn,.generatedIndexPage_vN6x{max-width:75%!important}.list_eTzJ article:nth-last-child(-n+2){margin-bottom:0!important}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media screen and (max-width:1024px){.hero_CaSG,.hero_CaSG .heroContent_VLnE{width:100%}.hero_CaSG{flex-direction:column}.hero_CaSG .heroAsset_jeqV{padding-left:0;width:100%}}@media (max-width:996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.colorModeToggle_DEke,.footer__link-separator,.navbar__item,.tableOfContents_bqdL{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block;width:max-content}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.navbarSearchContainer_Bca1{position:absolute;right:var(--ifm-navbar-padding-horizontal)}.docItemContainer_F8PC{padding:0 .3rem}}@media (max-width:576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}}@media (hover:hover){.backToTopButton_sjWU:hover{background-color:var(--ifm-color-emphasis-300)}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media (prefers-reduced-motion:reduce){:root{--ifm-transition-fast:0ms;--ifm-transition-slow:0ms}}@media print{.announcementBar_mb4j,.footer,.menu,.navbar,.pagination-nav,.table-of-contents,.tocMobile_ITEo{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_e6Vv{white-space:pre-wrap}} \ No newline at end of file diff --git a/assets/js/0251b216.41152ce4.js b/assets/js/0251b216.41152ce4.js deleted file mode 100644 index 2d1eeea..0000000 --- a/assets/js/0251b216.41152ce4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[3706],{9699:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>s,default:()=>u,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var i=t(4848),o=t(8453);const r={sidebar_position:9},s="UI",a={id:"user-guide/configuration/ui",title:"UI",description:"Environment Configuration",source:"@site/docs/user-guide/configuration/ui.md",sourceDirName:"user-guide/configuration",slug:"/user-guide/configuration/ui",permalink:"/kadai-doc/docs/user-guide/configuration/ui",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:9,frontMatter:{sidebar_position:9},sidebar:"userSidebar",previous:{title:"Priority Report",permalink:"/kadai-doc/docs/user-guide/configuration/priorityReport"},next:{title:"Features",permalink:"/kadai-doc/docs/category/features"}},d={},c=[{value:"Environment Configuration",id:"environment-configuration",level:2},{value:"UI Customization",id:"ui-customization",level:2}];function l(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"ui",children:"UI"})}),"\n",(0,i.jsx)(n.h2,{id:"environment-configuration",children:"Environment Configuration"}),"\n",(0,i.jsxs)(n.p,{children:["The environment information defined below can be configured\nusing the JSON file ",(0,i.jsx)(n.code,{children:"/environments/data-sources/environment-information.json"}),".\nThe file can, for example,\nbe placed in the sources of the frontend of your KADAI application or placed into the resources/static folder of your REST application.\nIt will be loaded on initial request."]}),"\n",(0,i.jsx)(n.p,{children:"The environment-information.json contains two parameters:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Property"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"kadaiRestUrl"}),(0,i.jsx)(n.td,{children:'The root path of the REST Service. It has to end with "/api"'})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"kadaiLogoutUrl"}),(0,i.jsx)(n.td,{children:"The location a user is redirected to when a logout is triggered."})]})]})]}),"\n",(0,i.jsx)(n.p,{children:"Here is an example:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:'{\n\t"kadaiRestUrl": "http://localhost:8080/kadai/api",\n\t"kadaiLogoutUrl": "http://localhost:8080/kadai"\n}\n'})}),"\n",(0,i.jsxs)(n.p,{children:["In this case, KADAI is deployed on localhost, port 8080 using the context root ",(0,i.jsx)(n.code,{children:"/kadai"}),".\nThe default environment-information.json file can be found in our GitHub repository ",(0,i.jsx)(n.a,{href:"https://github.com/kadai-io/kadai/blob/master/web/src/environments/data-sources/environment-information.json",children:"here"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"ui-customization",children:"UI Customization"}),"\n",(0,i.jsxs)(n.p,{children:["Some KADAI UI elements, such as custom properties,\ncan be configured in the JSON file ",(0,i.jsx)(n.code,{children:"/environments/data-sources/kadai-customization.json"}),".\nThe file can, for example,\nbe placed in the sources of the frontend of your KADAI application or placed into the resources/static folder of your REST application.\nThey will be loaded on initial request."]}),"\n",(0,i.jsx)(n.p,{children:"The default kadai-customization.json will be found in our GitHub repository."}),"\n",(0,i.jsxs)(n.p,{children:["If you have any questions regarding the UI Customization, please don\u2019t hesitate to ",(0,i.jsx)(n.a,{href:"/kadai-doc/docs/contact-us/contactUs",children:"contact us"}),"."]})]})}function u(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>a});var i=t(6540);const o={},r=i.createContext(o);function s(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0251b216.c94084bc.js b/assets/js/0251b216.c94084bc.js new file mode 100644 index 0000000..3e0b935 --- /dev/null +++ b/assets/js/0251b216.c94084bc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[3706],{3354:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"user-guide/configuration/ui","title":"UI","description":"Environment Configuration","source":"@site/docs/user-guide/configuration/ui.md","sourceDirName":"user-guide/configuration","slug":"/user-guide/configuration/ui","permalink":"/kadai-doc/docs/user-guide/configuration/ui","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":9,"frontMatter":{"sidebar_position":9},"sidebar":"userSidebar","previous":{"title":"Priority Report","permalink":"/kadai-doc/docs/user-guide/configuration/priorityReport"},"next":{"title":"Features","permalink":"/kadai-doc/docs/category/features"}}');var o=t(4848),r=t(8453);const s={sidebar_position:9},a="UI",d={},c=[{value:"Environment Configuration",id:"environment-configuration",level:2},{value:"UI Customization",id:"ui-customization",level:2}];function l(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"ui",children:"UI"})}),"\n",(0,o.jsx)(n.h2,{id:"environment-configuration",children:"Environment Configuration"}),"\n",(0,o.jsxs)(n.p,{children:["The environment information defined below can be configured\nusing the JSON file ",(0,o.jsx)(n.code,{children:"/environments/data-sources/environment-information.json"}),".\nThe file can, for example,\nbe placed in the sources of the frontend of your KADAI application or placed into the resources/static folder of your REST application.\nIt will be loaded on initial request."]}),"\n",(0,o.jsx)(n.p,{children:"The environment-information.json contains two parameters:"}),"\n",(0,o.jsxs)(n.table,{children:[(0,o.jsx)(n.thead,{children:(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.th,{children:"Property"}),(0,o.jsx)(n.th,{children:"Description"})]})}),(0,o.jsxs)(n.tbody,{children:[(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"kadaiRestUrl"}),(0,o.jsx)(n.td,{children:'The root path of the REST Service. It has to end with "/api"'})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"kadaiLogoutUrl"}),(0,o.jsx)(n.td,{children:"The location a user is redirected to when a logout is triggered."})]})]})]}),"\n",(0,o.jsx)(n.p,{children:"Here is an example:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:'{\n\t"kadaiRestUrl": "http://localhost:8080/kadai/api",\n\t"kadaiLogoutUrl": "http://localhost:8080/kadai"\n}\n'})}),"\n",(0,o.jsxs)(n.p,{children:["In this case, KADAI is deployed on localhost, port 8080 using the context root ",(0,o.jsx)(n.code,{children:"/kadai"}),".\nThe default environment-information.json file can be found in our GitHub repository ",(0,o.jsx)(n.a,{href:"https://github.com/kadai-io/kadai/blob/master/web/src/environments/data-sources/environment-information.json",children:"here"}),"."]}),"\n",(0,o.jsx)(n.h2,{id:"ui-customization",children:"UI Customization"}),"\n",(0,o.jsxs)(n.p,{children:["Some KADAI UI elements, such as custom properties,\ncan be configured in the JSON file ",(0,o.jsx)(n.code,{children:"/environments/data-sources/kadai-customization.json"}),".\nThe file can, for example,\nbe placed in the sources of the frontend of your KADAI application or placed into the resources/static folder of your REST application.\nThey will be loaded on initial request."]}),"\n",(0,o.jsx)(n.p,{children:"The default kadai-customization.json will be found in our GitHub repository."}),"\n",(0,o.jsxs)(n.p,{children:["If you have any questions regarding the UI Customization, please don\u2019t hesitate to ",(0,o.jsx)(n.a,{href:"/kadai-doc/docs/contact-us/contactUs",children:"contact us"}),"."]})]})}function u(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>a});var i=t(6540);const o={},r=i.createContext(o);function s(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/12fe0deb.31b04e97.js b/assets/js/12fe0deb.31b04e97.js new file mode 100644 index 0000000..907f7f1 --- /dev/null +++ b/assets/js/12fe0deb.31b04e97.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[4228],{2872:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>d,default:()=>c,frontMatter:()=>s,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"user-guide/getting-started/supportedEnvironments","title":"Supported Environments","description":"Supported JVM","source":"@site/docs/user-guide/getting-started/supportedEnvironments.md","sourceDirName":"user-guide/getting-started","slug":"/user-guide/getting-started/supportedEnvironments","permalink":"/kadai-doc/docs/user-guide/getting-started/supportedEnvironments","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"sidebar_position":2},"sidebar":"userSidebar","previous":{"title":"Example Spring Boot","permalink":"/kadai-doc/docs/user-guide/getting-started/exampleSpringBoot"},"next":{"title":"Core Concepts","permalink":"/kadai-doc/docs/category/core-concepts"}}');var o=t(4848),i=t(8453);const s={sidebar_position:2},d="Supported Environments",a={},l=[{value:"Supported JVM",id:"supported-jvm",level:3},{value:"Supported Databases",id:"supported-databases",level:3},{value:"Container/Application Server (optional)",id:"containerapplication-server-optional",level:3},{value:"Web Browser (optional)",id:"web-browser-optional",level:3}];function p(e){const n={h1:"h1",h3:"h3",header:"header",li:"li",ul:"ul",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"supported-environments",children:"Supported Environments"})}),"\n",(0,o.jsx)(n.h3,{id:"supported-jvm",children:"Supported JVM"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Java 17"}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"supported-databases",children:"Supported Databases"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"or DB2 11.5"}),"\n",(0,o.jsx)(n.li,{children:"or PostgresSQL 14.7"}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"containerapplication-server-optional",children:"Container/Application Server (optional)"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Embedded Tomcat of Spring Boot"}),"\n",(0,o.jsx)(n.li,{children:"or Wildfly Application Server"}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"web-browser-optional",children:"Web Browser (optional)"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Google Chrome (latest 2 versions)"}),"\n",(0,o.jsx)(n.li,{children:"or Mozilla Firefox (latest 2 versions)"}),"\n",(0,o.jsx)(n.li,{children:"or Microsoft Edge (latest 2 versions)"}),"\n"]})]})}function c(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(p,{...e})}):p(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>d});var r=t(6540);const o={},i=r.createContext(o);function s(e){const n=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/12fe0deb.f8400dcb.js b/assets/js/12fe0deb.f8400dcb.js deleted file mode 100644 index ff6b809..0000000 --- a/assets/js/12fe0deb.f8400dcb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[4228],{3599:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>s,default:()=>c,frontMatter:()=>i,metadata:()=>d,toc:()=>l});var r=t(4848),o=t(8453);const i={sidebar_position:2},s="Supported Environments",d={id:"user-guide/getting-started/supportedEnvironments",title:"Supported Environments",description:"Supported JVM",source:"@site/docs/user-guide/getting-started/supportedEnvironments.md",sourceDirName:"user-guide/getting-started",slug:"/user-guide/getting-started/supportedEnvironments",permalink:"/kadai-doc/docs/user-guide/getting-started/supportedEnvironments",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"userSidebar",previous:{title:"Example Spring Boot",permalink:"/kadai-doc/docs/user-guide/getting-started/exampleSpringBoot"},next:{title:"Core Concepts",permalink:"/kadai-doc/docs/category/core-concepts"}},a={},l=[{value:"Supported JVM",id:"supported-jvm",level:3},{value:"Supported Databases",id:"supported-databases",level:3},{value:"Container/Application Server (optional)",id:"containerapplication-server-optional",level:3},{value:"Web Browser (optional)",id:"web-browser-optional",level:3}];function p(e){const n={h1:"h1",h3:"h3",header:"header",li:"li",ul:"ul",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"supported-environments",children:"Supported Environments"})}),"\n",(0,r.jsx)(n.h3,{id:"supported-jvm",children:"Supported JVM"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Java 17"}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"supported-databases",children:"Supported Databases"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"or DB2 11.5"}),"\n",(0,r.jsx)(n.li,{children:"or PostgresSQL 14.7"}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"containerapplication-server-optional",children:"Container/Application Server (optional)"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Embedded Tomcat of Spring Boot"}),"\n",(0,r.jsx)(n.li,{children:"or Wildfly Application Server"}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"web-browser-optional",children:"Web Browser (optional)"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Google Chrome (latest 2 versions)"}),"\n",(0,r.jsx)(n.li,{children:"or Mozilla Firefox (latest 2 versions)"}),"\n",(0,r.jsx)(n.li,{children:"or Microsoft Edge (latest 2 versions)"}),"\n"]})]})}function c(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>d});var r=t(6540);const o={},i=r.createContext(o);function s(e){const n=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1c269d1d.4baa1361.js b/assets/js/1c269d1d.4baa1361.js deleted file mode 100644 index 1074163..0000000 --- a/assets/js/1c269d1d.4baa1361.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[9475],{4480:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>p,contentTitle:()=>d,default:()=>h,frontMatter:()=>s,metadata:()=>l,toc:()=>c});var t=r(4848),a=r(8453),i=r(5530),o=r(8774);const s={sidebar_position:1},d="Example Spring Boot",l={id:"user-guide/getting-started/exampleSpringBoot",title:"Example Spring Boot",description:"In the first 4 steps, we will set up KADAI REST API without security. Then, we will show how to use",source:"@site/docs/user-guide/getting-started/exampleSpringBoot.md",sourceDirName:"user-guide/getting-started",slug:"/user-guide/getting-started/exampleSpringBoot",permalink:"/kadai-doc/docs/user-guide/getting-started/exampleSpringBoot",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"userSidebar",previous:{title:"Getting Started",permalink:"/kadai-doc/docs/category/getting-started"},next:{title:"Supported Environments",permalink:"/kadai-doc/docs/user-guide/getting-started/supportedEnvironments"}},p={},c=[{value:"What you'll need",id:"what-youll-need",level:2},{value:"Set up KADAI REST-API without security",id:"set-up-kadai-rest-api-without-security",level:2},{value:"Step 1: Initialize an empty project",id:"step-1-initialize-an-empty-project",level:3},{value:"Step 2: Add dependencies",id:"step-2-add-dependencies",level:3},{value:"Step 3: Add properties configuration",id:"step-3-add-properties-configuration",level:3},{value:"Step 3a: Fill out application.properties",id:"step-3a-fill-out-applicationproperties",level:4},{value:"Step 3b: Add kadai.properties",id:"step-3b-add-kadaiproperties",level:4},{value:"Step 4: Add rest configuration",id:"step-4-add-rest-configuration",level:3},{value:"Step 5: Try out the REST-API",id:"step-5-try-out-the-rest-api",level:3},{value:"Set up KADAI Security",id:"set-up-kadai-security",level:2},{value:"Step 6: Add security dependencies and stop disabling security",id:"step-6-add-security-dependencies-and-stop-disabling-security",level:3},{value:"Step 7: Add BootWebSecurityConfigurer.java",id:"step-7-add-bootwebsecurityconfigurerjava",level:3},{value:"Step 8: Add ExampleWebSecurityConfig.java",id:"step-8-add-examplewebsecurityconfigjava",level:3},{value:"Step 9: Add users",id:"step-9-add-users",level:3},{value:"Step 10: Try out the REST-API",id:"step-10-try-out-the-rest-api",level:3},{value:"Set up KADAI UI",id:"set-up-kadai-ui",level:2},{value:"Step 11: Add web dependencies",id:"step-11-add-web-dependencies",level:3},{value:"Step 12: Add controllers",id:"step-12-add-controllers",level:3},{value:"Step 12a: Add LoginController.java",id:"step-12a-add-logincontrollerjava",level:4},{value:"Step 12b: Add ResourcesController.java",id:"step-12b-add-resourcescontrollerjava",level:4},{value:"Step 12c: Add ViewController.java",id:"step-12c-add-viewcontrollerjava",level:4},{value:"Step 13: Add WebMvcConfig.java",id:"step-13-add-webmvcconfigjava",level:3},{value:"Step 14: Start and open the application",id:"step-14-start-and-open-the-application",level:3}];function u(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"example-spring-boot",children:"Example Spring Boot"})}),"\n",(0,t.jsxs)(n.p,{children:["In the first 4 steps, we will set up KADAI REST API without security. Then, we will show how to use\nthe resulting REST API with ",(0,t.jsx)(n.a,{href:"https://www.postman.com/",children:"Postman"}),". This guide then sets up security.\nAt the end of the guide, we will add the UI."]}),"\n","\n",(0,t.jsx)(n.h2,{id:"what-youll-need",children:"What you'll need"}),"\n",(0,t.jsx)(n.p,{children:"To set up the example, please install:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"an IDE of your choice (preferably IntelliJ)"}),"\n",(0,t.jsx)(n.li,{children:"Java 17"}),"\n",(0,t.jsx)(n.li,{children:"maven"}),"\n",(0,t.jsxs)(n.li,{children:["optional: ",(0,t.jsx)(n.a,{href:"https://www.postman.com/",children:"Postman"})," (makes REST API requests easier)"]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Note: Please name your packages, folders, and files exactly like in the example!"}),"\n",(0,t.jsx)(n.h2,{id:"set-up-kadai-rest-api-without-security",children:"Set up KADAI REST-API without security"}),"\n",(0,t.jsx)(n.h3,{id:"step-1-initialize-an-empty-project",children:"Step 1: Initialize an empty project"}),"\n",(0,t.jsxs)(n.p,{children:["Go to ",(0,t.jsx)(n.a,{href:"https://start.spring.io/",children:"Spring Initializer"}),' and create an example Maven Project. Choose the\nsame options as in the Screenshot, except the spring version. Please check Java 17, then click on "Generate".']}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"empty spring boot project",src:r(4713).A+"",width:"1908",height:"1061"})}),"\n",(0,t.jsx)(n.p,{children:"Unpack the project in the folder of your choice and open it in IntelliJ"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"unpacked project",src:r(1785).A+"",width:"1725",height:"775"})}),"\n",(0,t.jsx)(n.h3,{id:"step-2-add-dependencies",children:"Step 2: Add dependencies"}),"\n",(0,t.jsx)(n.p,{children:"Please add the following dependencies to the pom.\nAll dependencies can be copied as one block at the end\nof step 2.\nAfter adding the dependencies, please reload maven and recompile the project."}),"\n",(0,t.jsx)(n.p,{children:"** 1. spring core dependency: **"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"\n org.springframework.plugin\n spring-plugin-core\n 3.0.0\n\n"})}),"\n",(0,t.jsx)(n.p,{children:"** 2. database dependencies: **"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"\n com.h2database\n h2\n\n\n org.springframework.boot\n spring-boot-starter-jdbc\n\n"})}),"\n",(0,t.jsx)(n.p,{children:"** 3. kadai dependencies: **"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"\n io.kadai\n kadai-common-data\n 9.1.0\n\n\n io.kadai\n kadai-common-logging\n 9.1.0\n\n\n io.kadai\n kadai-rest-spring\n 9.1.0\n\n"})}),"\n",(0,t.jsx)(n.p,{children:"** 4. tomcat application server dependency: **"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"\n org.springframework.boot\n spring-boot-starter-web\n\n"})}),"\n",(0,t.jsx)(n.p,{children:"** All dependencies **"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"\n org.springframework.boot\n spring-boot-starter-web\n\n\n org.springframework.plugin\n spring-plugin-core\n 3.0.0\n\n\n io.kadai\n kadai-common-logging\n 9.1.0\n\n\n io.kadai\n kadai-rest-spring\n 9.1.0\n\n\n io.kadai\n kadai-common-data\n 9.1.0\n\n\n com.h2database\n h2\n\n\n org.springframework.boot\n spring-boot-starter-jdbc\n\n"})}),"\n",(0,t.jsx)(n.h3,{id:"step-3-add-properties-configuration",children:"Step 3: Add properties configuration"}),"\n",(0,t.jsx)(n.h4,{id:"step-3a-fill-out-applicationproperties",children:"Step 3a: Fill out application.properties"}),"\n",(0,t.jsxs)(n.p,{children:["The example already has the configuration file ",(0,t.jsx)(n.code,{children:"application.properties"})," in\nthe ",(0,t.jsx)(n.code,{children:"src/main/resources"})," folder.\nIt's a standard configuration file used by spring.\nYou can read\nmore about spring configuration in\nthe ",(0,t.jsx)(n.a,{href:"https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html",children:"spring documentation"}),".\nYou need to add the following content into that file:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"logging.level.io.kadai=INFO\nlogging.level.org.springframework=INFO\nserver.servlet.context-path=/kadai\nkadai.routing.dmn.upload.path=/tmp/routing.dmn\n######## Kadai DB #######\n######## h2 configuration ########\nspring.datasource.url=jdbc:h2:mem:kadai;NON_KEYWORDS=KEY,VALUE;IGNORECASE=TRUE;DB_CLOSE_ON_EXIT=FALSE;LOCK_MODE=0\nspring.datasource.driverClassName=org.h2.Driver\nspring.datasource.username=sa\nspring.datasource.password=sa\nkadai.schemaName=KADAI\n######## h2 console configuration ########\n########spring.h2.console.enabled=true\n########spring.h2.console.path=/h2-console\n######## db2 configuration ########\n########spring.datasource.driverClassName=com.ibm.db2.jcc.DB2Driver\n########spring.datasource.url=jdbc:db2://localhost:5101/tskdb\n########spring.datasource.username=db2inst1\n########spring.datasource.password=db2inst1-pwd\n######## Postgres configuration ########\n########spring.datasource.url=jdbc:postgresql://localhost:5102/postgres\n########spring.datasource.driverClassName=org.postgresql.Driver\n########spring.datasource.username=postgres\n########spring.datasource.password=postgres\n########spring.jpa.generate-ddl=true\n########spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true\n####### property that control rest api security deploy use true for no security.\ndevMode=true\n# This property enables the support of XSRF tokens. This will not work together with devMode.\nenableCsrf=false\n####### property that control if the database is cleaned and sample data is generated\ngenerateSampleData=true\n####### cache static resources properties\nspring.web.resources.cache.cachecontrol.cache-private=true\n####### for upload of big workbasket- or classification-files\nspring.servlet.multipart.max-file-size=10MB\nspring.servlet.multipart.max-request-size=10MB\n####### serve compressed files for faster UI loading times\nserver.compression.enabled=true\nserver.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain,application/javascript,text/css,image/svg+xml\nserver.compression.min-response-size=10240\nspring.main.allow-bean-definition-overriding=true\nserver.tomcat.max-http-form-post-size=-1\nserver.tomcat.max-save-post-size=-1\nserver.tomcat.max-swallow-size=-1\n####### tomcat is not detecting the x-forward headers from bluemix as a trustworthy proxy\nserver.tomcat.remoteip.internal-proxies=.*\nserver.forward-headers-strategy=native\n####### Properties for AccessIdController to connect to LDAP\nkadai.ldap.serverUrl=ldap://localhost:10389\nkadai.ldap.bindDn=uid=admin\nkadai.ldap.bindPassword=secret\nkadai.ldap.baseDn=ou=Test,O=KADAI\nkadai.ldap.userSearchBase=cn=users\nkadai.ldap.userSearchFilterName=objectclass\nkadai.ldap.userSearchFilterValue=person\nkadai.ldap.userFirstnameAttribute=givenName\nkadai.ldap.userLastnameAttribute=sn\nkadai.ldap.userFullnameAttribute=cn\nkadai.ldap.userPhoneAttribute=phoneNumber\nkadai.ldap.userMobilePhoneAttribute=mobileNumber\nkadai.ldap.userEmailAttribute=email\nkadai.ldap.userOrglevel1Attribute=orgLevel1\nkadai.ldap.userOrglevel2Attribute=orgLevel2\nkadai.ldap.userOrglevel3Attribute=someDepartement\nkadai.ldap.userOrglevel4Attribute=orgLevel4\nkadai.ldap.userIdAttribute=uid\nkadai.ldap.userMemberOfGroupAttribute=memberOf\nkadai.ldap.userPermissionsAttribute=permission\nkadai.ldap.groupSearchBase=\nkadai.ldap.groupSearchFilterName=objectclass\nkadai.ldap.groupSearchFilterValue=groupofuniquenames\nkadai.ldap.groupNameAttribute=cn\nkadai.ldap.minSearchForLength=3\nkadai.ldap.maxNumberOfReturnedAccessIds=50\nkadai.ldap.groupsOfUser=uniquemember\n# Embedded Spring LDAP server\nspring.ldap.embedded.base-dn=OU=Test,O=KADAI\nspring.ldap.embedded.credential.username=uid=admin\nspring.ldap.embedded.credential.password=secret\nspring.ldap.embedded.ldif=classpath:example-users.ldif\nspring.ldap.embedded.port=10389\nspring.ldap.embedded.validation.enabled=false\n"})}),"\n",(0,t.jsx)(n.h4,{id:"step-3b-add-kadaiproperties",children:"Step 3b: Add kadai.properties"}),"\n",(0,t.jsxs)(n.p,{children:["Create ",(0,t.jsx)(n.code,{children:"kadai.properties"}),' in the "resources" folder.\nThis file contains KADAI specific\nconfiguration, like custom holidays, etc.\nPlease\ncopy the following content into ',(0,t.jsx)(n.code,{children:"kadai.properties"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"kadai.roles.user=cn=ksc-users,cn=groups,OU=Test,O=KADAI | teamlead-1 | teamlead-2 | user-1-1 | user-1-2 | user-2-1 | user-2-2 | user-b-1 | user-b-2\nkadai.roles.admin=admin | uid=admin,cn=users,OU=Test,O=KADAI\nkadai.roles.business_admin=businessadmin | cn=business-admins,cn=groups,OU=Test,O=KADAI\nkadai.roles.monitor=monitor | cn=monitor-users,cn=groups,OU=Test,O=KADAI\nkadai.roles.task_admin=taskadmin\nkadai.domains=DOMAIN_A|DOMAIN_B|DOMAIN_C|DOMAIN_TEST\nkadai.user.minimalPermissionsToAssignDomains=READ | OPEN\nkadai.classification.types=TASK|DOCUMENT\nkadai.classification.categories.task=EXTERNAL| manual| autoMAtic| Process\nkadai.classification.categories.document=EXTERNAL\nkadai.jobs.maxRetries=3\nkadai.jobs.batchSize=50\nkadai.jobs.runEvery=P1D\nkadai.jobs.firstRunAt=2018-07-25T08:00:00Z\nkadai.jobs.cleanup.task.minimumAge=P14D\nkadai.jobs.cleanup.history.simple.batchSize=50\nkadai.jobs.history.cleanup.firstRunAt=2018-07-25T08:00:00Z\nkadai.jobs.cleanup.history.simple.minimumAge=P14D\nkadai.jobs.history.cleanup.runEvery=P1D\nkadai.jobs.refresh.user.runEvery=P1D\nkadai.jobs.refresh.user.firstRunAt=2018-07-25T23:00:00Z\nkadai.workingTime.holidays.german.enabled=true\nkadai.workingTime.holidays.german.corpus-christi.enabled=true\nkadai.history.logger.name=AUDIT\nkadai.routing.dmn=/dmn-table.dmn\n# enable or disable the jobscheduler at all\n# set it to false and no jobs are running\nkadai.jobs.scheduler.enabled=false\n# wait time before the first job run in millis\nkadai.jobs.scheduler.initialStartDelay=100\n# sleeping time befor the next job runs\nkadai.jobs.scheduler.period=12\n# timeunit for the sleeping period\n# Possible values: MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS\nkadai.jobs.scheduler.periodTimeUnit=HOURS\nkadai.jobs.cleanup.task.enable=true\nkadai.jobs.priority.task.enable=true\nkadai.jobs.cleanup.workbasket.enable=true\nkadai.jobs.refresh.user.enable=true\nkadai.jobs.cleanup.history.simple.enable=false\n"})}),"\n",(0,t.jsx)(n.h3,{id:"step-4-add-rest-configuration",children:"Step 4: Add rest configuration"}),"\n",(0,t.jsxs)(n.p,{children:["First, Add ",(0,t.jsx)(n.code,{children:'@ComponentScan({"io.kadai","com.example"})'})," as annotation above the class\ndefinition of the ExampleApplication and a corresponding import to this class. This will allow the\napplication to find the necessary components."]}),"\n",(0,t.jsxs)(n.p,{children:["Then, create a java class with the name ",(0,t.jsx)(n.code,{children:"ExampleRestConfiguration"})," in the com.example.demo\npackage. This class defines the Beans and their dependencies. Your project structure should look\nlike this:"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"basic project",src:r(7436).A+"",width:"344",height:"601"})}),"\n",(0,t.jsxs)(n.p,{children:["Copy following content into ",(0,t.jsx)(n.code,{children:"ExampleRestConfiguration.java"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:'package com.example.demo;\n\nimport java.sql.SQLException;\nimport javax.sql.DataSource;\nimport org.h2.tools.Server;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.context.annotation.DependsOn;\nimport org.springframework.jdbc.datasource.DataSourceTransactionManager;\nimport org.springframework.transaction.PlatformTransactionManager;\nimport io.kadai.KadaiConfiguration;\nimport io.kadai.common.api.KadaiEngine;\nimport io.kadai.common.internal.configuration.DbSchemaCreator;\nimport io.kadai.sampledata.SampleDataGenerator;\n\n@Configuration\npublic class ExampleRestConfiguration {\n\n @Bean\n public PlatformTransactionManager txManager(DataSource dataSource) {\n return new DataSourceTransactionManager(dataSource);\n }\n\n @Bean\n @DependsOn("kadaiConfiguration") // generate sample data after schema was inserted\n public SampleDataGenerator generateSampleData(\n KadaiConfiguration kadaiConfiguration,\n DataSource dataSource,\n @Value("${generateSampleData:true}") boolean generateSampleData)\n throws SQLException {\n DbSchemaCreator dbSchemaCreator =\n new DbSchemaCreator(dataSource, kadaiConfiguration.getSchemaName());\n dbSchemaCreator.run();\n SampleDataGenerator sampleDataGenerator =\n new SampleDataGenerator(dataSource, kadaiConfiguration.getSchemaName());\n if (generateSampleData) {\n sampleDataGenerator.generateSampleData();\n }\n return sampleDataGenerator;\n }\n\n @Bean\n @DependsOn("generateSampleData")\n public KadaiEngine getKadaiEngine(KadaiConfiguration kadaiConfiguration)\n throws SQLException {\n return KadaiEngine.buildKadaiEngine(kadaiConfiguration);\n }\n\n // only required to let the adapter example connect to the same database\n @Bean(initMethod = "start", destroyMethod = "stop")\n public Server inMemoryH2DatabaseaServer() throws SQLException {\n return Server.createTcpServer("-tcp", "-tcpAllowOthers", "-tcpPort", "9095");\n }\n \n @Bean\n @ConditionalOnMissingBean(KadaiConfiguration.class)\n public KadaiConfiguration kadaiConfiguration(\n DataSource dataSource,\n @Qualifier("kadaiPropertiesFileName") String propertiesFileName,\n @Qualifier("kadaiPropertiesDelimiter") String delimiter) {\n return new KadaiConfiguration.Builder(dataSource, true, "KADAI")\n .initKadaiProperties(propertiesFileName, delimiter)\n .build();\n }\n}\n\n\n'})}),"\n",(0,t.jsx)(n.h3,{id:"step-5-try-out-the-rest-api",children:"Step 5: Try out the REST-API"}),"\n",(0,t.jsx)(n.p,{children:"Recompile the project and then start the DemoApplication in your IDE. You can now make the following\nrequest:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"GET http://localhost:8080/kadai/api/v1/classifications\n"})}),"\n",(0,t.jsxs)(n.p,{children:["You should get a list of different Classifications in the body of the response. Here is a screenshot\nof the request and the response in ",(0,t.jsx)(n.a,{href:"https://www.postman.com/",children:"Postman"}),":"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"example request",src:r(1691).A+"",width:"1410",height:"925"})}),"\n",(0,t.jsx)(n.p,{children:"You can also request Tasks using the following command:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"GET http://localhost:8080/kadai/api/v1/tasks\n"})}),"\n",(0,t.jsx)(n.p,{children:"At this point, full KADAI REST-API functionality is available without security or authorization.\nThey will be added in the next steps."}),"\n",(0,t.jsx)(n.h2,{id:"set-up-kadai-security",children:"Set up KADAI Security"}),"\n",(0,t.jsxs)(n.p,{children:["Our example application uses ",(0,t.jsx)(n.a,{href:"https://ldap.com/learn-about-ldap/",children:"ldap"})," for its authorization.\nFirst, add a ",(0,t.jsx)(n.code,{children:"security"})," package into the ",(0,t.jsx)(n.code,{children:"com.example.demo"})," package (in\nsrc/main/java/com/example/demo). The package will consist of one configurer class:\nBootWebSecurityConfigurer (will be replaced), and one example configuration\nExampleWebSecurityConfig. The classes will be created in the next steps."]}),"\n",(0,t.jsx)(n.h3,{id:"step-6-add-security-dependencies-and-stop-disabling-security",children:"Step 6: Add security dependencies and stop disabling security"}),"\n",(0,t.jsx)(n.p,{children:"Add the following dependencies to your pom and reload maven:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"\n org.springframework.ldap\n spring-ldap-core\n\n\n org.springframework.security\n spring-security-ldap\n\n\n com.unboundid\n unboundid-ldapsdk\n\n\n org.springframework.boot\n spring-boot-starter-security\n\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Then, set the ",(0,t.jsx)(n.code,{children:"devMode"})," property in ",(0,t.jsx)(n.code,{children:"application.properties"})," to false. This enables\nauthorization checks.\nYou also need to remove the following lines from the ",(0,t.jsx)(n.code,{children:"ExampleRestConfiguration.java"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:' @Bean\n@ConditionalOnMissingBean(KadaiConfiguration.class)\npublic KadaiConfiguration kadaiConfiguration(\n DataSource dataSource,\n @Qualifier("kadaiPropertiesFileName") String propertiesFileName,\n @Qualifier("kadaiPropertiesDelimiter") String delimiter) {\n return new KadaiConfiguration.Builder(dataSource, true, "KADAI")\n .initKadaiProperties(propertiesFileName, delimiter)\n .build();\n}\n'})}),"\n",(0,t.jsx)(n.p,{children:"This way, you don't disable security manually.\nDeleted because KadaiEngineConfiguration doesn't exist anymore"}),"\n",(0,t.jsx)(n.h3,{id:"step-7-add-bootwebsecurityconfigurerjava",children:"Step 7: Add BootWebSecurityConfigurer.java"}),"\n",(0,t.jsxs)(n.p,{children:["Create ",(0,t.jsx)(n.code,{children:"BootWebSecurityConfigurer.java"})," in the security folder\nand copy the following content into\nit:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:'package com.example.demo.security;\n\nimport java.util.List;\nimport java.util.Map;\nimport java.util.function.Function;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.context.annotation.Primary;\nimport org.springframework.http.HttpMethod;\nimport org.springframework.ldap.core.support.BaseLdapPathContextSource;\nimport org.springframework.security.authentication.AuthenticationManager;\nimport org.springframework.security.config.Customizer;\nimport org.springframework.security.config.annotation.web.builders.HttpSecurity;\nimport org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;\nimport org.springframework.security.config.annotation.web.configurers.HeadersConfigurer;\nimport org.springframework.security.config.annotation.web.configurers.RequestCacheConfigurer;\nimport org.springframework.security.config.ldap.LdapPasswordComparisonAuthenticationManagerFactory;\nimport org.springframework.security.core.GrantedAuthority;\nimport org.springframework.security.core.authority.SimpleGrantedAuthority;\nimport org.springframework.security.core.authority.mapping.GrantedAuthoritiesMapper;\nimport org.springframework.security.core.authority.mapping.SimpleAuthorityMapper;\nimport org.springframework.security.crypto.password.NoOpPasswordEncoder;\nimport org.springframework.security.ldap.DefaultSpringSecurityContextSource;\nimport org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopulator;\nimport org.springframework.security.ldap.userdetails.LdapAuthoritiesPopulator;\nimport org.springframework.security.web.SecurityFilterChain;\nimport org.springframework.security.web.csrf.CookieCsrfTokenRepository;\nimport org.springframework.security.web.jaasapi.JaasApiIntegrationFilter;\nimport org.springframework.security.web.util.matcher.AntPathRequestMatcher;\nimport io.kadai.common.rest.SpringSecurityToJaasFilter;\n\n/** Default basic configuration for kadai web example. */\n@Configuration\npublic class BootWebSecurityConfigurer {\n\n private final String ldapServerUrl;\n private final String ldapBaseDn;\n private final String ldapUserDnPatterns;\n private final String ldapGroupSearchBase;\n private final String ldapGroupSearchFilter;\n\n private final boolean devMode;\n private final boolean enableCsrf;\n\n public BootWebSecurityConfigurer(\n @Value("${kadai.ldap.serverUrl:ldap://localhost:10389}") String ldapServerUrl,\n @Value("${kadai.ldap.baseDn:OU=Test,O=KADAI}") String ldapBaseDn,\n @Value("${kadai.ldap.userDnPatterns:uid={0},cn=users}") String ldapUserDnPatterns,\n @Value("${kadai.ldap.groupSearchBase:cn=groups}") String ldapGroupSearchBase,\n @Value("${kadai.ldap.groupSearchFilter:uniqueMember={0}}") String ldapGroupSearchFilter,\n @Value("${enableCsrf:false}") boolean enableCsrf,\n @Value("${devMode:false}") boolean devMode) {\n this.enableCsrf = enableCsrf;\n this.ldapServerUrl = ldapServerUrl;\n this.ldapBaseDn = ldapBaseDn;\n this.ldapGroupSearchBase = ldapGroupSearchBase;\n this.ldapGroupSearchFilter = ldapGroupSearchFilter;\n this.ldapUserDnPatterns = ldapUserDnPatterns;\n this.devMode = devMode;\n }\n\n @Bean\n public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {\n http.authorizeHttpRequests(\n authorizeHttpRequests ->\n authorizeHttpRequests\n .requestMatchers("/css/**", "/img/**")\n .permitAll()\n .requestMatchers(HttpMethod.GET, "/docs/**")\n .permitAll())\n .cors(Customizer.withDefaults())\n .addFilter(jaasApiIntegrationFilter())\n .addFilterAfter(new SpringSecurityToJaasFilter(), JaasApiIntegrationFilter.class);\n\n if (enableCsrf) {\n CookieCsrfTokenRepository csrfTokenRepository = CookieCsrfTokenRepository.withHttpOnlyFalse();\n csrfTokenRepository.setCookiePath("/");\n http.csrf(\n csrf ->\n csrf.csrfTokenRepository(csrfTokenRepository)\n .csrfTokenRequestHandler(new SpaCsrfTokenRequestHandler()))\n .addFilterAfter(new CsrfCookieFilter(), SpringSecurityToJaasFilter.class);\n } else {\n http.csrf(AbstractHttpConfigurer::disable).httpBasic(Customizer.withDefaults());\n }\n\n if (devMode) {\n http.headers(\n headers -> headers.frameOptions(HeadersConfigurer.FrameOptionsConfig::sameOrigin))\n .authorizeHttpRequests(\n authorizeHttpRequests ->\n authorizeHttpRequests\n .requestMatchers("/h2-console/**")\n .permitAll()\n .anyRequest()\n .fullyAuthenticated())\n .logout(logout -> logout.logoutSuccessUrl("http://localhost:4200/#").permitAll());\n } else {\n addLoginPageConfiguration(http);\n }\n http.requestCache(RequestCacheConfigurer::disable);\n return http.build();\n }\n\n protected void addLoginPageConfiguration(HttpSecurity http) throws Exception {\n http.authorizeHttpRequests(\n authorizeHttpRequests -> authorizeHttpRequests.anyRequest().fullyAuthenticated())\n .formLogin(\n formLogin ->\n formLogin\n .loginPage("/login")\n .failureUrl("/login?error")\n .defaultSuccessUrl("/index.html")\n .permitAll())\n .logout(\n logout ->\n logout\n .invalidateHttpSession(true)\n .clearAuthentication(true)\n .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))\n .logoutSuccessUrl("/login?logout")\n .deleteCookies("JSESSIONID")\n .permitAll());\n }\n\n @Bean\n public LdapAuthoritiesPopulator authoritiesPopulator(\n DefaultSpringSecurityContextSource contextSource) {\n Function>, GrantedAuthority> authorityMapper =\n recordVar -> new SimpleGrantedAuthority(recordVar.get("spring.security.ldap.dn").get(0));\n\n DefaultLdapAuthoritiesPopulator populator =\n new DefaultLdapAuthoritiesPopulator(contextSource, ldapGroupSearchBase);\n populator.setGroupSearchFilter(ldapGroupSearchFilter);\n populator.setSearchSubtree(true);\n populator.setRolePrefix("");\n populator.setAuthorityMapper(authorityMapper);\n return populator;\n }\n\n @Bean\n @Primary\n public DefaultSpringSecurityContextSource defaultSpringSecurityContextSource() {\n return new DefaultSpringSecurityContextSource(ldapServerUrl + "/" + ldapBaseDn);\n }\n\n @Bean\n public GrantedAuthoritiesMapper grantedAuthoritiesMapper() {\n SimpleAuthorityMapper grantedAuthoritiesMapper = new SimpleAuthorityMapper();\n grantedAuthoritiesMapper.setPrefix("");\n return grantedAuthoritiesMapper;\n }\n\n protected JaasApiIntegrationFilter jaasApiIntegrationFilter() {\n JaasApiIntegrationFilter filter = new JaasApiIntegrationFilter();\n filter.setCreateEmptySubject(true);\n return filter;\n }\n\n @Bean\n AuthenticationManager ldapAuthenticationManager(\n BaseLdapPathContextSource contextSource, LdapAuthoritiesPopulator authorities) {\n @SuppressWarnings("deprecation")\n LdapPasswordComparisonAuthenticationManagerFactory factory =\n new LdapPasswordComparisonAuthenticationManagerFactory(\n contextSource, NoOpPasswordEncoder.getInstance());\n factory.setUserDnPatterns(ldapUserDnPatterns);\n factory.setLdapAuthoritiesPopulator(authorities);\n factory.setAuthoritiesMapper(grantedAuthoritiesMapper());\n factory.setPasswordAttribute("userPassword");\n return factory.createAuthenticationManager();\n }\n}\n\n'})}),"\n",(0,t.jsxs)(n.p,{children:["Create ",(0,t.jsx)(n.code,{children:"CsrfCookieFilter.java"})," in the security folder and copy the following content into it:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:'package com.example.demo.security;\n\nimport jakarta.servlet.FilterChain;\nimport jakarta.servlet.ServletException;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.io.IOException;\nimport org.springframework.security.web.csrf.CsrfToken;\nimport org.springframework.web.filter.OncePerRequestFilter;\n\nfinal class CsrfCookieFilter extends OncePerRequestFilter {\n\n @Override\n protected void doFilterInternal(\n HttpServletRequest request,\n @SuppressWarnings("NullableProblems") HttpServletResponse response,\n FilterChain filterChain)\n throws ServletException, IOException {\n CsrfToken csrfToken = (CsrfToken) request.getAttribute("_csrf");\n // Render the token value to a cookie by causing the deferred token to be loaded\n csrfToken.getToken();\n\n filterChain.doFilter(request, response);\n }\n}\n\n'})}),"\n",(0,t.jsxs)(n.p,{children:["Lastly, create ",(0,t.jsx)(n.code,{children:"SpaCsrfTokenRequestHandler.java"})," in the security folder and copy the following content into it:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"package com.example.demo.security;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.util.function.Supplier;\nimport org.springframework.security.web.csrf.CsrfToken;\nimport org.springframework.security.web.csrf.CsrfTokenRequestAttributeHandler;\nimport org.springframework.security.web.csrf.CsrfTokenRequestHandler;\nimport org.springframework.security.web.csrf.XorCsrfTokenRequestAttributeHandler;\nimport org.springframework.util.StringUtils;\n\nfinal class SpaCsrfTokenRequestHandler extends CsrfTokenRequestAttributeHandler {\n private final CsrfTokenRequestHandler delegate = new XorCsrfTokenRequestAttributeHandler();\n\n @Override\n public void handle(\n HttpServletRequest request, HttpServletResponse response, Supplier csrfToken) {\n /*\n * Always use XorCsrfTokenRequestAttributeHandler to provide BREACH protection of\n * the CsrfToken when it is rendered in the response body.\n */\n this.delegate.handle(request, response, csrfToken);\n }\n\n @Override\n public String resolveCsrfTokenValue(HttpServletRequest request, CsrfToken csrfToken) {\n /*\n * If the request contains a request header, use CsrfTokenRequestAttributeHandler\n * to resolve the CsrfToken. This applies when a single-page application includes\n * the header value automatically, which was obtained via a cookie containing the\n * raw CsrfToken.\n */\n if (StringUtils.hasText(request.getHeader(csrfToken.getHeaderName()))) {\n return super.resolveCsrfTokenValue(request, csrfToken);\n }\n /*\n * In all other cases (e.g. if the request contains a request parameter), use\n * XorCsrfTokenRequestAttributeHandler to resolve the CsrfToken. This applies\n * when a server-side rendered form includes the _csrf request parameter as a\n * hidden input.\n */\n return this.delegate.resolveCsrfTokenValue(request, csrfToken);\n }\n}\n\n"})}),"\n",(0,t.jsx)(n.h3,{id:"step-8-add-examplewebsecurityconfigjava",children:"Step 8: Add ExampleWebSecurityConfig.java"}),"\n",(0,t.jsxs)(n.p,{children:["ExampleWebSecurityConfig specifies beans that are used for authorization by spring.\nCreate ",(0,t.jsx)(n.code,{children:"ExampleWebSecurityConfig.java"})," in the ",(0,t.jsx)(n.code,{children:"security"})," package and copy following content\nthere:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:'package com.example.demo.security;\n\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.web.cors.CorsConfiguration;\nimport org.springframework.web.cors.CorsConfigurationSource;\nimport org.springframework.web.cors.UrlBasedCorsConfigurationSource;\n\n@Configuration\npublic class ExampleWebSecurityConfig {\n\n @Bean\n public CorsConfigurationSource corsConfigurationSource() {\n final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();\n CorsConfiguration config = new CorsConfiguration();\n config.setAllowCredentials(true);\n config.addAllowedOriginPattern("*");\n config.addAllowedHeader("*");\n config.addAllowedMethod("*");\n source.registerCorsConfiguration("/**", config);\n return source;\n }\n}\n'})}),"\n",(0,t.jsx)(n.h3,{id:"step-9-add-users",children:"Step 9: Add users"}),"\n",(0,t.jsxs)(n.p,{children:["In order for security to work, we need to define ldap users. Please download\nthe ",(0,t.jsx)(n.code,{children:"example-users.ldif"})," file here:"]}),"\n",(0,t.jsx)("div",{className:i.A.buttons,children:(0,t.jsx)(o.A,{className:"button button--secondary button--lg",children:(0,t.jsx)("a",{className:"button button--secondary button--lg",href:r(8588).A,download:!0,target:"_blank",children:"Download example users "})})}),"\n",(0,t.jsx)("br",{}),"\n",(0,t.jsxs)(n.p,{children:["Please unzip the ",(0,t.jsx)(n.code,{children:"example-users"})," file and put it into the ",(0,t.jsx)(n.code,{children:"resources"})," folder."]}),"\n",(0,t.jsxs)(n.p,{children:["Your project structure should now look like this:\n",(0,t.jsx)(n.img,{alt:"project structure",src:r(2495).A+"",width:"355",height:"633"})]}),"\n",(0,t.jsx)(n.h3,{id:"step-10-try-out-the-rest-api",children:"Step 10: Try out the REST-API"}),"\n",(0,t.jsx)(n.p,{children:"First, restart the ExampleApplication. Try to make a request like in the previous step, for example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"GET http://localhost:8080/kadai/api/v1/tasks\n"})}),"\n",(0,t.jsxs)(n.p,{children:['You should get the "401 Unauthorized" response.\nNow, you can authorize yourself using basicAuth.\nIn ',(0,t.jsx)(n.a,{href:"https://www.postman.com/",children:"Postman"}),', go to the "Authorization" tab.\nThere, select basicAuth and\ntype "admin" as user and "admin" as password.\nThen, you can make the following request:']}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"GET http://localhost:8080/kadai/api/v1/tasks\n"})}),"\n",(0,t.jsxs)(n.p,{children:["It should return a list of Tasks in the response body. Here is a screenshot of the request and the\nresponse in ",(0,t.jsx)(n.a,{href:"https://www.postman.com/",children:"Postman"}),":"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"example request",src:r(2763).A+"",width:"1395",height:"927"})}),"\n",(0,t.jsx)(n.h2,{id:"set-up-kadai-ui",children:"Set up KADAI UI"}),"\n",(0,t.jsx)(n.h3,{id:"step-11-add-web-dependencies",children:"Step 11: Add web dependencies"}),"\n",(0,t.jsx)(n.p,{children:"Add the following dependencies to your pom and reload maven:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"\n io.kadai\n kadai-web\n 9.1.0\n\n\n org.springframework.boot\n spring-boot-starter-thymeleaf\n\n"})}),"\n",(0,t.jsx)(n.h3,{id:"step-12-add-controllers",children:"Step 12: Add controllers"}),"\n",(0,t.jsxs)(n.p,{children:["Add ",(0,t.jsx)(n.code,{children:"controllers"})," package into the ",(0,t.jsx)(n.code,{children:"com.example.demo"})," package (in\nsrc/main/java/com/example/demo). This package will contain the controllers for different paths. Our\napplication needs the following three controllers:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"LoginController"}),"\n",(0,t.jsx)(n.li,{children:"ResourcesController"}),"\n",(0,t.jsx)(n.li,{children:"ViewController"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"These will be added in the steps 12a, 12b and 12c."}),"\n",(0,t.jsxs)(n.h4,{id:"step-12a-add-logincontrollerjava",children:["Step 12a: Add ",(0,t.jsx)(n.code,{children:"LoginController.java"})]}),"\n",(0,t.jsxs)(n.p,{children:["The LoginController will handle the login into kadai. It will need the ",(0,t.jsx)(n.code,{children:"templates/login.html"}),"\nin the ",(0,t.jsx)(n.code,{children:"resources"})," folder. You can download the templates folder here:"]}),"\n",(0,t.jsx)("div",{className:i.A.buttons,children:(0,t.jsx)(o.A,{className:"button button--secondary button--lg",children:(0,t.jsx)("a",{className:"button button--secondary button--lg",href:r(3896).A,download:!0,target:"_blank",children:"Download templates "})})}),"\n",(0,t.jsxs)(n.p,{children:["Please unzip the ",(0,t.jsx)(n.code,{children:"templates"})," folder and put it into the ",(0,t.jsx)(n.code,{children:"resources"})," folder. Then, copy\nfollowing code into ",(0,t.jsx)(n.code,{children:"LoginController.java"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:'package com.example.demo.controllers;\n\nimport org.springframework.core.Ordered;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.servlet.config.annotation.ViewControllerRegistry;\nimport org.springframework.web.servlet.config.annotation.WebMvcConfigurer;\n\n@Controller\npublic class LoginController implements WebMvcConfigurer {\n\n @Override\n public void addViewControllers(ViewControllerRegistry registry) {\n registry.addViewController("/login").setViewName("login");\n registry.setOrder(Ordered.HIGHEST_PRECEDENCE);\n }\n}\n'})}),"\n",(0,t.jsx)(n.h4,{id:"step-12b-add-resourcescontrollerjava",children:"Step 12b: Add ResourcesController.java"}),"\n",(0,t.jsxs)(n.p,{children:["The ResourcesController handles resources like images and additional customizations. You'll need\nthe ",(0,t.jsx)(n.code,{children:"static"})," folder for it. You can download the ",(0,t.jsx)(n.code,{children:"static"})," folder here:"]}),"\n",(0,t.jsx)("div",{className:i.A.buttons,children:(0,t.jsx)(o.A,{className:"button button--secondary button--lg",children:(0,t.jsx)("a",{className:"button button--secondary button--lg",href:r(2547).A,download:!0,target:"_blank",children:"Download static "})})}),"\n",(0,t.jsx)("br",{}),"\n",(0,t.jsxs)(n.p,{children:["Please unzip the ",(0,t.jsx)(n.code,{children:"static"})," folder and copy it into ",(0,t.jsx)(n.code,{children:"resources"}),".\nAdditionally, there is\nthe ",(0,t.jsx)(n.code,{children:"com.example.demo.controllers"})," folder for further customizations.\nPlease download it here:"]}),"\n",(0,t.jsx)("div",{className:i.A.buttons,children:(0,t.jsx)(o.A,{className:"button button--secondary button--lg",children:(0,t.jsx)("a",{className:"button button--secondary button--lg",href:r(1858).A,download:!0,target:"_blank",children:"Download controllers "})})}),"\n",(0,t.jsx)("br",{}),"\n",(0,t.jsxs)(n.p,{children:["Unzip the ",(0,t.jsx)(n.code,{children:"com"})," folder and put it into ",(0,t.jsx)(n.code,{children:"resources"}),".\nThen, please copy the following code\ninto ",(0,t.jsx)(n.code,{children:"ResourcesController.java"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:'package com.example.demo.controllers;\n\nimport org.springframework.http.MediaType;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport io.kadai.common.internal.util.ResourceUtil;\n\nimport java.io.IOException;\n\n@Controller\npublic class ResourcesController {\n\n public static final String KADAI_CUSTOMIZATION_FILE_NAME = "kadai-customization.json";\n\n @GetMapping(\n value = "/environments/data-sources/kadai-customization.json",\n produces = MediaType.APPLICATION_JSON_VALUE)\n public ResponseEntity kadaiCustomization() throws IOException {\n return ResponseEntity.ok(readResourceAsString(KADAI_CUSTOMIZATION_FILE_NAME));\n }\n\n // the environment-information.json file will be served via "static" folder\n // @GetMapping(\n // value = "/environments/data-sources/environment-information.json",\n // produces = MediaType.APPLICATION_JSON_VALUE)\n // public ResponseEntity environmentInformation() throws Exception {\n // return ResponseEntity.ok(readResourceAsString("environment-information.json"));\n // }\n\n private String readResourceAsString(String resource) throws IOException {\n String resourceAsString = ResourceUtil.readResourceAsString(getClass(), resource);\n if (resourceAsString == null) {\n return "{}";\n }\n return resourceAsString;\n }\n}\n'})}),"\n",(0,t.jsx)(n.h4,{id:"step-12c-add-viewcontrollerjava",children:"Step 12c: Add ViewController.java"}),"\n",(0,t.jsxs)(n.p,{children:["The ViewController manages the root view of KADAI.\nCopy following code\ninto ",(0,t.jsx)(n.code,{children:"ViewController.java"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:'package com.example.demo.controllers;\n\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.GetMapping;\n\n/** The view controller. */\n@Controller\npublic class ViewController {\n\n @GetMapping(path = {"", "kadai/**"})\n public String index() {\n return "forward:/index.html";\n }\n}\n'})}),"\n",(0,t.jsx)(n.h3,{id:"step-13-add-webmvcconfigjava",children:"Step 13: Add WebMvcConfig.java"}),"\n",(0,t.jsxs)(n.p,{children:["Create ",(0,t.jsx)(n.code,{children:"WebMvcConfig.java"})," in the ",(0,t.jsx)(n.code,{children:"com.example.demo"})," package. It handles resources and\nmessages of the application. Copy following content into ",(0,t.jsx)(n.code,{children:"WebMvcConfig.java"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:'package com.example.demo;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackson.databind.SerializationFeature;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.http.converter.HttpMessageConverter;\nimport org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;\nimport org.springframework.web.servlet.config.annotation.EnableWebMvc;\nimport org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;\nimport org.springframework.web.servlet.config.annotation.WebMvcConfigurer;\n\nimport jakarta.annotation.PostConstruct;\nimport java.util.List;\n\n/**\n * The Web MVC Configuration.\n */\n@Configuration\n@EnableWebMvc\npublic class WebMvcConfig implements WebMvcConfigurer {\n\n private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {\n "classpath:/META-INF/resources/", "classpath:/resources/",\n "classpath:/static/", "classpath:/public/", "classpath:/templates/"\n };\n\n private final ObjectMapper objectMapper;\n\n @Autowired\n public WebMvcConfig(ObjectMapper objectMapper) {\n this.objectMapper = objectMapper;\n }\n\n @Override\n public void addResourceHandlers(ResourceHandlerRegistry registry) {\n if (!registry.hasMappingForPattern("/webjars/**")) {\n registry\n .addResourceHandler("/webjars/**")\n .addResourceLocations("classpath:/META-INF/resources/webjars/");\n }\n if (!registry.hasMappingForPattern("/**")) {\n registry.addResourceHandler("/**").addResourceLocations(CLASSPATH_RESOURCE_LOCATIONS);\n }\n }\n\n @Override\n public void extendMessageConverters(List> converters) {\n for (HttpMessageConverter converter : converters) {\n if (converter instanceof MappingJackson2HttpMessageConverter) {\n MappingJackson2HttpMessageConverter jacksonConverter =\n (MappingJackson2HttpMessageConverter) converter;\n jacksonConverter.setPrettyPrint(true);\n }\n }\n }\n\n @PostConstruct\n public void enableObjectIndent() {\n objectMapper.enable(SerializationFeature.INDENT_OUTPUT);\n }\n}\n\n'})}),"\n",(0,t.jsx)(n.p,{children:"Your project structure should look like this:"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"project structure",src:r(7406).A+"",width:"351",height:"842"})}),"\n",(0,t.jsx)(n.h3,{id:"step-14-start-and-open-the-application",children:"Step 14: Start and open the application"}),"\n",(0,t.jsxs)(n.p,{children:["Recompile the application, then go to the DemoApplication class in the IDE and start it. Then\ntype ",(0,t.jsx)(n.code,{children:"localhost:8080/kadai"})," into your browser. You should see the login screen:"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Log in",src:r(214).A+"",width:"4112",height:"2418"})}),"\n",(0,t.jsx)(n.p,{children:'Log in using "admin" as username and "admin" as password. Now, you should see the following:'}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Workbaskets",src:r(217).A+"",width:"4112",height:"2416"})}),"\n",(0,t.jsx)(n.p,{children:"Press the menu button in the upper left to navigate."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Navigate",src:r(7184).A+"",width:"4112",height:"2414"})})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}},1858:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/files/com-0f07a8bf0277901135aeeda167b5a7ce.zip"},8588:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/files/example-users-59b3afc8ac24bc03947b63568201a681.zip"},2547:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/files/static-b5a210389c4f7556535cbd797a333654.zip"},3896:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/files/templates-63e01163241f7b3e4c22ff63263214df.zip"},5530:(e,n,r)=>{r.d(n,{A:()=>t});const t={features:"features_t9lD",featureSvg:"featureSvg_GfXr",featureText:"featureText_ZxAV"}},1691:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/images/example-request-classifications-0eca365b18b2aa2f059fa8cd18718b86.png"},214:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/images/login-a309f62aa082a31bb0992528c1f5ff6b.png"},7184:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/images/navigate-04b25efdaf87f5bb1d0b5b318b90fb64.png"},4713:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/images/project-initializer-36766e23926e9de9544f809c236ec969.png"},7406:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/images/project-structure-end-a0f0c7c318c8d3e2810f1bb7b165f5f3.png"},2495:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/images/project-structure-security-9607aaae9482804b3fd2e9f797362df1.png"},2763:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/images/request-security-ea37ce040aec51b3b2eaf6698888e0d0.png"},7436:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/images/rest-api-project-a58e3752764d48e32eedd577c97f099a.png"},1785:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/images/schritt-2-471abd42fb0e963330579ad3675bd6a5.png"},217:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/images/workbaskets-14c24952a7ee8d30d54b9a543020927c.png"},8453:(e,n,r)=>{r.d(n,{R:()=>o,x:()=>s});var t=r(6540);const a={},i=t.createContext(a);function o(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1c269d1d.69faca4e.js b/assets/js/1c269d1d.69faca4e.js new file mode 100644 index 0000000..f5a1e26 --- /dev/null +++ b/assets/js/1c269d1d.69faca4e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[9475],{3801:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>p,contentTitle:()=>l,default:()=>h,frontMatter:()=>d,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"user-guide/getting-started/exampleSpringBoot","title":"Example Spring Boot","description":"In the first 4 steps, we will set up KADAI REST API without security. Then, we will show how to use","source":"@site/docs/user-guide/getting-started/exampleSpringBoot.md","sourceDirName":"user-guide/getting-started","slug":"/user-guide/getting-started/exampleSpringBoot","permalink":"/kadai-doc/docs/user-guide/getting-started/exampleSpringBoot","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1},"sidebar":"userSidebar","previous":{"title":"Getting Started","permalink":"/kadai-doc/docs/category/getting-started"},"next":{"title":"Supported Environments","permalink":"/kadai-doc/docs/user-guide/getting-started/supportedEnvironments"}}');var a=r(4848),i=r(8453),o=r(5530),s=r(8774);const d={sidebar_position:1},l="Example Spring Boot",p={},c=[{value:"What you'll need",id:"what-youll-need",level:2},{value:"Set up KADAI REST-API without security",id:"set-up-kadai-rest-api-without-security",level:2},{value:"Step 1: Initialize an empty project",id:"step-1-initialize-an-empty-project",level:3},{value:"Step 2: Add dependencies",id:"step-2-add-dependencies",level:3},{value:"Step 3: Add properties configuration",id:"step-3-add-properties-configuration",level:3},{value:"Step 3a: Fill out application.properties",id:"step-3a-fill-out-applicationproperties",level:4},{value:"Step 3b: Add kadai.properties",id:"step-3b-add-kadaiproperties",level:4},{value:"Step 4: Add rest configuration",id:"step-4-add-rest-configuration",level:3},{value:"Step 5: Try out the REST-API",id:"step-5-try-out-the-rest-api",level:3},{value:"Set up KADAI Security",id:"set-up-kadai-security",level:2},{value:"Step 6: Add security dependencies and stop disabling security",id:"step-6-add-security-dependencies-and-stop-disabling-security",level:3},{value:"Step 7: Add BootWebSecurityConfigurer.java",id:"step-7-add-bootwebsecurityconfigurerjava",level:3},{value:"Step 8: Add ExampleWebSecurityConfig.java",id:"step-8-add-examplewebsecurityconfigjava",level:3},{value:"Step 9: Add users",id:"step-9-add-users",level:3},{value:"Step 10: Try out the REST-API",id:"step-10-try-out-the-rest-api",level:3},{value:"Set up KADAI UI",id:"set-up-kadai-ui",level:2},{value:"Step 11: Add web dependencies",id:"step-11-add-web-dependencies",level:3},{value:"Step 12: Add controllers",id:"step-12-add-controllers",level:3},{value:"Step 12a: Add LoginController.java",id:"step-12a-add-logincontrollerjava",level:4},{value:"Step 12b: Add ResourcesController.java",id:"step-12b-add-resourcescontrollerjava",level:4},{value:"Step 12c: Add ViewController.java",id:"step-12c-add-viewcontrollerjava",level:4},{value:"Step 13: Add WebMvcConfig.java",id:"step-13-add-webmvcconfigjava",level:3},{value:"Step 14: Start and open the application",id:"step-14-start-and-open-the-application",level:3}];function u(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"example-spring-boot",children:"Example Spring Boot"})}),"\n",(0,a.jsxs)(n.p,{children:["In the first 4 steps, we will set up KADAI REST API without security. Then, we will show how to use\nthe resulting REST API with ",(0,a.jsx)(n.a,{href:"https://www.postman.com/",children:"Postman"}),". This guide then sets up security.\nAt the end of the guide, we will add the UI."]}),"\n","\n",(0,a.jsx)(n.h2,{id:"what-youll-need",children:"What you'll need"}),"\n",(0,a.jsx)(n.p,{children:"To set up the example, please install:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"an IDE of your choice (preferably IntelliJ)"}),"\n",(0,a.jsx)(n.li,{children:"Java 17"}),"\n",(0,a.jsx)(n.li,{children:"maven"}),"\n",(0,a.jsxs)(n.li,{children:["optional: ",(0,a.jsx)(n.a,{href:"https://www.postman.com/",children:"Postman"})," (makes REST API requests easier)"]}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:"Note: Please name your packages, folders, and files exactly like in the example!"}),"\n",(0,a.jsx)(n.h2,{id:"set-up-kadai-rest-api-without-security",children:"Set up KADAI REST-API without security"}),"\n",(0,a.jsx)(n.h3,{id:"step-1-initialize-an-empty-project",children:"Step 1: Initialize an empty project"}),"\n",(0,a.jsxs)(n.p,{children:["Go to ",(0,a.jsx)(n.a,{href:"https://start.spring.io/",children:"Spring Initializer"}),' and create an example Maven Project. Choose the\nsame options as in the Screenshot, except the spring version. Please check Java 17, then click on "Generate".']}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.img,{alt:"empty spring boot project",src:r(4713).A+"",width:"1908",height:"1061"})}),"\n",(0,a.jsx)(n.p,{children:"Unpack the project in the folder of your choice and open it in IntelliJ"}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.img,{alt:"unpacked project",src:r(1785).A+"",width:"1725",height:"775"})}),"\n",(0,a.jsx)(n.h3,{id:"step-2-add-dependencies",children:"Step 2: Add dependencies"}),"\n",(0,a.jsx)(n.p,{children:"Please add the following dependencies to the pom.\nAll dependencies can be copied as one block at the end\nof step 2.\nAfter adding the dependencies, please reload maven and recompile the project."}),"\n",(0,a.jsx)(n.p,{children:"** 1. spring core dependency: **"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"\n org.springframework.plugin\n spring-plugin-core\n 3.0.0\n\n"})}),"\n",(0,a.jsx)(n.p,{children:"** 2. database dependencies: **"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"\n com.h2database\n h2\n\n\n org.springframework.boot\n spring-boot-starter-jdbc\n\n"})}),"\n",(0,a.jsx)(n.p,{children:"** 3. kadai dependencies: **"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"\n io.kadai\n kadai-common-data\n 9.1.0\n\n\n io.kadai\n kadai-common-logging\n 9.1.0\n\n\n io.kadai\n kadai-rest-spring\n 9.1.0\n\n"})}),"\n",(0,a.jsx)(n.p,{children:"** 4. tomcat application server dependency: **"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"\n org.springframework.boot\n spring-boot-starter-web\n\n"})}),"\n",(0,a.jsx)(n.p,{children:"** All dependencies **"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"\n org.springframework.boot\n spring-boot-starter-web\n\n\n org.springframework.plugin\n spring-plugin-core\n 3.0.0\n\n\n io.kadai\n kadai-common-logging\n 9.1.0\n\n\n io.kadai\n kadai-rest-spring\n 9.1.0\n\n\n io.kadai\n kadai-common-data\n 9.1.0\n\n\n com.h2database\n h2\n\n\n org.springframework.boot\n spring-boot-starter-jdbc\n\n"})}),"\n",(0,a.jsx)(n.h3,{id:"step-3-add-properties-configuration",children:"Step 3: Add properties configuration"}),"\n",(0,a.jsx)(n.h4,{id:"step-3a-fill-out-applicationproperties",children:"Step 3a: Fill out application.properties"}),"\n",(0,a.jsxs)(n.p,{children:["The example already has the configuration file ",(0,a.jsx)(n.code,{children:"application.properties"})," in\nthe ",(0,a.jsx)(n.code,{children:"src/main/resources"})," folder.\nIt's a standard configuration file used by spring.\nYou can read\nmore about spring configuration in\nthe ",(0,a.jsx)(n.a,{href:"https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html",children:"spring documentation"}),".\nYou need to add the following content into that file:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"logging.level.io.kadai=INFO\nlogging.level.org.springframework=INFO\nserver.servlet.context-path=/kadai\nkadai.routing.dmn.upload.path=/tmp/routing.dmn\n######## Kadai DB #######\n######## h2 configuration ########\nspring.datasource.url=jdbc:h2:mem:kadai;NON_KEYWORDS=KEY,VALUE;IGNORECASE=TRUE;DB_CLOSE_ON_EXIT=FALSE;LOCK_MODE=0\nspring.datasource.driverClassName=org.h2.Driver\nspring.datasource.username=sa\nspring.datasource.password=sa\nkadai.schemaName=KADAI\n######## h2 console configuration ########\n########spring.h2.console.enabled=true\n########spring.h2.console.path=/h2-console\n######## db2 configuration ########\n########spring.datasource.driverClassName=com.ibm.db2.jcc.DB2Driver\n########spring.datasource.url=jdbc:db2://localhost:5101/tskdb\n########spring.datasource.username=db2inst1\n########spring.datasource.password=db2inst1-pwd\n######## Postgres configuration ########\n########spring.datasource.url=jdbc:postgresql://localhost:5102/postgres\n########spring.datasource.driverClassName=org.postgresql.Driver\n########spring.datasource.username=postgres\n########spring.datasource.password=postgres\n########spring.jpa.generate-ddl=true\n########spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true\n####### property that control rest api security deploy use true for no security.\ndevMode=true\n# This property enables the support of XSRF tokens. This will not work together with devMode.\nenableCsrf=false\n####### property that control if the database is cleaned and sample data is generated\ngenerateSampleData=true\n####### cache static resources properties\nspring.web.resources.cache.cachecontrol.cache-private=true\n####### for upload of big workbasket- or classification-files\nspring.servlet.multipart.max-file-size=10MB\nspring.servlet.multipart.max-request-size=10MB\n####### serve compressed files for faster UI loading times\nserver.compression.enabled=true\nserver.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain,application/javascript,text/css,image/svg+xml\nserver.compression.min-response-size=10240\nspring.main.allow-bean-definition-overriding=true\nserver.tomcat.max-http-form-post-size=-1\nserver.tomcat.max-save-post-size=-1\nserver.tomcat.max-swallow-size=-1\n####### tomcat is not detecting the x-forward headers from bluemix as a trustworthy proxy\nserver.tomcat.remoteip.internal-proxies=.*\nserver.forward-headers-strategy=native\n####### Properties for AccessIdController to connect to LDAP\nkadai.ldap.serverUrl=ldap://localhost:10389\nkadai.ldap.bindDn=uid=admin\nkadai.ldap.bindPassword=secret\nkadai.ldap.baseDn=ou=Test,O=KADAI\nkadai.ldap.userSearchBase=cn=users\nkadai.ldap.userSearchFilterName=objectclass\nkadai.ldap.userSearchFilterValue=person\nkadai.ldap.userFirstnameAttribute=givenName\nkadai.ldap.userLastnameAttribute=sn\nkadai.ldap.userFullnameAttribute=cn\nkadai.ldap.userPhoneAttribute=phoneNumber\nkadai.ldap.userMobilePhoneAttribute=mobileNumber\nkadai.ldap.userEmailAttribute=email\nkadai.ldap.userOrglevel1Attribute=orgLevel1\nkadai.ldap.userOrglevel2Attribute=orgLevel2\nkadai.ldap.userOrglevel3Attribute=someDepartement\nkadai.ldap.userOrglevel4Attribute=orgLevel4\nkadai.ldap.userIdAttribute=uid\nkadai.ldap.userMemberOfGroupAttribute=memberOf\nkadai.ldap.userPermissionsAttribute=permission\nkadai.ldap.groupSearchBase=\nkadai.ldap.groupSearchFilterName=objectclass\nkadai.ldap.groupSearchFilterValue=groupofuniquenames\nkadai.ldap.groupNameAttribute=cn\nkadai.ldap.minSearchForLength=3\nkadai.ldap.maxNumberOfReturnedAccessIds=50\nkadai.ldap.groupsOfUser=uniquemember\n# Embedded Spring LDAP server\nspring.ldap.embedded.base-dn=OU=Test,O=KADAI\nspring.ldap.embedded.credential.username=uid=admin\nspring.ldap.embedded.credential.password=secret\nspring.ldap.embedded.ldif=classpath:example-users.ldif\nspring.ldap.embedded.port=10389\nspring.ldap.embedded.validation.enabled=false\n"})}),"\n",(0,a.jsx)(n.h4,{id:"step-3b-add-kadaiproperties",children:"Step 3b: Add kadai.properties"}),"\n",(0,a.jsxs)(n.p,{children:["Create ",(0,a.jsx)(n.code,{children:"kadai.properties"}),' in the "resources" folder.\nThis file contains KADAI specific\nconfiguration, like custom holidays, etc.\nPlease\ncopy the following content into ',(0,a.jsx)(n.code,{children:"kadai.properties"}),":"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"kadai.roles.user=cn=ksc-users,cn=groups,OU=Test,O=KADAI | teamlead-1 | teamlead-2 | user-1-1 | user-1-2 | user-2-1 | user-2-2 | user-b-1 | user-b-2\nkadai.roles.admin=admin | uid=admin,cn=users,OU=Test,O=KADAI\nkadai.roles.business_admin=businessadmin | cn=business-admins,cn=groups,OU=Test,O=KADAI\nkadai.roles.monitor=monitor | cn=monitor-users,cn=groups,OU=Test,O=KADAI\nkadai.roles.task_admin=taskadmin\nkadai.domains=DOMAIN_A|DOMAIN_B|DOMAIN_C|DOMAIN_TEST\nkadai.user.minimalPermissionsToAssignDomains=READ | OPEN\nkadai.classification.types=TASK|DOCUMENT\nkadai.classification.categories.task=EXTERNAL| manual| autoMAtic| Process\nkadai.classification.categories.document=EXTERNAL\nkadai.jobs.maxRetries=3\nkadai.jobs.batchSize=50\nkadai.jobs.runEvery=P1D\nkadai.jobs.firstRunAt=2018-07-25T08:00:00Z\nkadai.jobs.cleanup.task.minimumAge=P14D\nkadai.jobs.cleanup.history.simple.batchSize=50\nkadai.jobs.history.cleanup.firstRunAt=2018-07-25T08:00:00Z\nkadai.jobs.cleanup.history.simple.minimumAge=P14D\nkadai.jobs.history.cleanup.runEvery=P1D\nkadai.jobs.refresh.user.runEvery=P1D\nkadai.jobs.refresh.user.firstRunAt=2018-07-25T23:00:00Z\nkadai.workingTime.holidays.german.enabled=true\nkadai.workingTime.holidays.german.corpus-christi.enabled=true\nkadai.history.logger.name=AUDIT\nkadai.routing.dmn=/dmn-table.dmn\n# enable or disable the jobscheduler at all\n# set it to false and no jobs are running\nkadai.jobs.scheduler.enabled=false\n# wait time before the first job run in millis\nkadai.jobs.scheduler.initialStartDelay=100\n# sleeping time befor the next job runs\nkadai.jobs.scheduler.period=12\n# timeunit for the sleeping period\n# Possible values: MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS\nkadai.jobs.scheduler.periodTimeUnit=HOURS\nkadai.jobs.cleanup.task.enable=true\nkadai.jobs.priority.task.enable=true\nkadai.jobs.cleanup.workbasket.enable=true\nkadai.jobs.refresh.user.enable=true\nkadai.jobs.cleanup.history.simple.enable=false\n"})}),"\n",(0,a.jsx)(n.h3,{id:"step-4-add-rest-configuration",children:"Step 4: Add rest configuration"}),"\n",(0,a.jsxs)(n.p,{children:["First, Add ",(0,a.jsx)(n.code,{children:'@ComponentScan({"io.kadai","com.example"})'})," as annotation above the class\ndefinition of the ExampleApplication and a corresponding import to this class. This will allow the\napplication to find the necessary components."]}),"\n",(0,a.jsxs)(n.p,{children:["Then, create a java class with the name ",(0,a.jsx)(n.code,{children:"ExampleRestConfiguration"})," in the com.example.demo\npackage. This class defines the Beans and their dependencies. Your project structure should look\nlike this:"]}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.img,{alt:"basic project",src:r(7436).A+"",width:"344",height:"601"})}),"\n",(0,a.jsxs)(n.p,{children:["Copy following content into ",(0,a.jsx)(n.code,{children:"ExampleRestConfiguration.java"}),":"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:'package com.example.demo;\n\nimport java.sql.SQLException;\nimport javax.sql.DataSource;\nimport org.h2.tools.Server;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.context.annotation.DependsOn;\nimport org.springframework.jdbc.datasource.DataSourceTransactionManager;\nimport org.springframework.transaction.PlatformTransactionManager;\nimport io.kadai.KadaiConfiguration;\nimport io.kadai.common.api.KadaiEngine;\nimport io.kadai.common.internal.configuration.DbSchemaCreator;\nimport io.kadai.sampledata.SampleDataGenerator;\n\n@Configuration\npublic class ExampleRestConfiguration {\n\n @Bean\n public PlatformTransactionManager txManager(DataSource dataSource) {\n return new DataSourceTransactionManager(dataSource);\n }\n\n @Bean\n @DependsOn("kadaiConfiguration") // generate sample data after schema was inserted\n public SampleDataGenerator generateSampleData(\n KadaiConfiguration kadaiConfiguration,\n DataSource dataSource,\n @Value("${generateSampleData:true}") boolean generateSampleData)\n throws SQLException {\n DbSchemaCreator dbSchemaCreator =\n new DbSchemaCreator(dataSource, kadaiConfiguration.getSchemaName());\n dbSchemaCreator.run();\n SampleDataGenerator sampleDataGenerator =\n new SampleDataGenerator(dataSource, kadaiConfiguration.getSchemaName());\n if (generateSampleData) {\n sampleDataGenerator.generateSampleData();\n }\n return sampleDataGenerator;\n }\n\n @Bean\n @DependsOn("generateSampleData")\n public KadaiEngine getKadaiEngine(KadaiConfiguration kadaiConfiguration)\n throws SQLException {\n return KadaiEngine.buildKadaiEngine(kadaiConfiguration);\n }\n\n // only required to let the adapter example connect to the same database\n @Bean(initMethod = "start", destroyMethod = "stop")\n public Server inMemoryH2DatabaseaServer() throws SQLException {\n return Server.createTcpServer("-tcp", "-tcpAllowOthers", "-tcpPort", "9095");\n }\n \n @Bean\n @ConditionalOnMissingBean(KadaiConfiguration.class)\n public KadaiConfiguration kadaiConfiguration(\n DataSource dataSource,\n @Qualifier("kadaiPropertiesFileName") String propertiesFileName,\n @Qualifier("kadaiPropertiesDelimiter") String delimiter) {\n return new KadaiConfiguration.Builder(dataSource, true, "KADAI")\n .initKadaiProperties(propertiesFileName, delimiter)\n .build();\n }\n}\n\n\n'})}),"\n",(0,a.jsx)(n.h3,{id:"step-5-try-out-the-rest-api",children:"Step 5: Try out the REST-API"}),"\n",(0,a.jsx)(n.p,{children:"Recompile the project and then start the DemoApplication in your IDE. You can now make the following\nrequest:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"GET http://localhost:8080/kadai/api/v1/classifications\n"})}),"\n",(0,a.jsxs)(n.p,{children:["You should get a list of different Classifications in the body of the response. Here is a screenshot\nof the request and the response in ",(0,a.jsx)(n.a,{href:"https://www.postman.com/",children:"Postman"}),":"]}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.img,{alt:"example request",src:r(1691).A+"",width:"1410",height:"925"})}),"\n",(0,a.jsx)(n.p,{children:"You can also request Tasks using the following command:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"GET http://localhost:8080/kadai/api/v1/tasks\n"})}),"\n",(0,a.jsx)(n.p,{children:"At this point, full KADAI REST-API functionality is available without security or authorization.\nThey will be added in the next steps."}),"\n",(0,a.jsx)(n.h2,{id:"set-up-kadai-security",children:"Set up KADAI Security"}),"\n",(0,a.jsxs)(n.p,{children:["Our example application uses ",(0,a.jsx)(n.a,{href:"https://ldap.com/learn-about-ldap/",children:"ldap"})," for its authorization.\nFirst, add a ",(0,a.jsx)(n.code,{children:"security"})," package into the ",(0,a.jsx)(n.code,{children:"com.example.demo"})," package (in\nsrc/main/java/com/example/demo). The package will consist of one configurer class:\nBootWebSecurityConfigurer (will be replaced), and one example configuration\nExampleWebSecurityConfig. The classes will be created in the next steps."]}),"\n",(0,a.jsx)(n.h3,{id:"step-6-add-security-dependencies-and-stop-disabling-security",children:"Step 6: Add security dependencies and stop disabling security"}),"\n",(0,a.jsx)(n.p,{children:"Add the following dependencies to your pom and reload maven:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"\n org.springframework.ldap\n spring-ldap-core\n\n\n org.springframework.security\n spring-security-ldap\n\n\n com.unboundid\n unboundid-ldapsdk\n\n\n org.springframework.boot\n spring-boot-starter-security\n\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Then, set the ",(0,a.jsx)(n.code,{children:"devMode"})," property in ",(0,a.jsx)(n.code,{children:"application.properties"})," to false. This enables\nauthorization checks.\nYou also need to remove the following lines from the ",(0,a.jsx)(n.code,{children:"ExampleRestConfiguration.java"}),":"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:' @Bean\n@ConditionalOnMissingBean(KadaiConfiguration.class)\npublic KadaiConfiguration kadaiConfiguration(\n DataSource dataSource,\n @Qualifier("kadaiPropertiesFileName") String propertiesFileName,\n @Qualifier("kadaiPropertiesDelimiter") String delimiter) {\n return new KadaiConfiguration.Builder(dataSource, true, "KADAI")\n .initKadaiProperties(propertiesFileName, delimiter)\n .build();\n}\n'})}),"\n",(0,a.jsx)(n.p,{children:"This way, you don't disable security manually.\nDeleted because KadaiEngineConfiguration doesn't exist anymore"}),"\n",(0,a.jsx)(n.h3,{id:"step-7-add-bootwebsecurityconfigurerjava",children:"Step 7: Add BootWebSecurityConfigurer.java"}),"\n",(0,a.jsxs)(n.p,{children:["Create ",(0,a.jsx)(n.code,{children:"BootWebSecurityConfigurer.java"})," in the security folder\nand copy the following content into\nit:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:'package com.example.demo.security;\n\nimport java.util.List;\nimport java.util.Map;\nimport java.util.function.Function;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.context.annotation.Primary;\nimport org.springframework.http.HttpMethod;\nimport org.springframework.ldap.core.support.BaseLdapPathContextSource;\nimport org.springframework.security.authentication.AuthenticationManager;\nimport org.springframework.security.config.Customizer;\nimport org.springframework.security.config.annotation.web.builders.HttpSecurity;\nimport org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;\nimport org.springframework.security.config.annotation.web.configurers.HeadersConfigurer;\nimport org.springframework.security.config.annotation.web.configurers.RequestCacheConfigurer;\nimport org.springframework.security.config.ldap.LdapPasswordComparisonAuthenticationManagerFactory;\nimport org.springframework.security.core.GrantedAuthority;\nimport org.springframework.security.core.authority.SimpleGrantedAuthority;\nimport org.springframework.security.core.authority.mapping.GrantedAuthoritiesMapper;\nimport org.springframework.security.core.authority.mapping.SimpleAuthorityMapper;\nimport org.springframework.security.crypto.password.NoOpPasswordEncoder;\nimport org.springframework.security.ldap.DefaultSpringSecurityContextSource;\nimport org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopulator;\nimport org.springframework.security.ldap.userdetails.LdapAuthoritiesPopulator;\nimport org.springframework.security.web.SecurityFilterChain;\nimport org.springframework.security.web.csrf.CookieCsrfTokenRepository;\nimport org.springframework.security.web.jaasapi.JaasApiIntegrationFilter;\nimport org.springframework.security.web.util.matcher.AntPathRequestMatcher;\nimport io.kadai.common.rest.SpringSecurityToJaasFilter;\n\n/** Default basic configuration for kadai web example. */\n@Configuration\npublic class BootWebSecurityConfigurer {\n\n private final String ldapServerUrl;\n private final String ldapBaseDn;\n private final String ldapUserDnPatterns;\n private final String ldapGroupSearchBase;\n private final String ldapGroupSearchFilter;\n\n private final boolean devMode;\n private final boolean enableCsrf;\n\n public BootWebSecurityConfigurer(\n @Value("${kadai.ldap.serverUrl:ldap://localhost:10389}") String ldapServerUrl,\n @Value("${kadai.ldap.baseDn:OU=Test,O=KADAI}") String ldapBaseDn,\n @Value("${kadai.ldap.userDnPatterns:uid={0},cn=users}") String ldapUserDnPatterns,\n @Value("${kadai.ldap.groupSearchBase:cn=groups}") String ldapGroupSearchBase,\n @Value("${kadai.ldap.groupSearchFilter:uniqueMember={0}}") String ldapGroupSearchFilter,\n @Value("${enableCsrf:false}") boolean enableCsrf,\n @Value("${devMode:false}") boolean devMode) {\n this.enableCsrf = enableCsrf;\n this.ldapServerUrl = ldapServerUrl;\n this.ldapBaseDn = ldapBaseDn;\n this.ldapGroupSearchBase = ldapGroupSearchBase;\n this.ldapGroupSearchFilter = ldapGroupSearchFilter;\n this.ldapUserDnPatterns = ldapUserDnPatterns;\n this.devMode = devMode;\n }\n\n @Bean\n public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {\n http.authorizeHttpRequests(\n authorizeHttpRequests ->\n authorizeHttpRequests\n .requestMatchers("/css/**", "/img/**")\n .permitAll()\n .requestMatchers(HttpMethod.GET, "/docs/**")\n .permitAll())\n .cors(Customizer.withDefaults())\n .addFilter(jaasApiIntegrationFilter())\n .addFilterAfter(new SpringSecurityToJaasFilter(), JaasApiIntegrationFilter.class);\n\n if (enableCsrf) {\n CookieCsrfTokenRepository csrfTokenRepository = CookieCsrfTokenRepository.withHttpOnlyFalse();\n csrfTokenRepository.setCookiePath("/");\n http.csrf(\n csrf ->\n csrf.csrfTokenRepository(csrfTokenRepository)\n .csrfTokenRequestHandler(new SpaCsrfTokenRequestHandler()))\n .addFilterAfter(new CsrfCookieFilter(), SpringSecurityToJaasFilter.class);\n } else {\n http.csrf(AbstractHttpConfigurer::disable).httpBasic(Customizer.withDefaults());\n }\n\n if (devMode) {\n http.headers(\n headers -> headers.frameOptions(HeadersConfigurer.FrameOptionsConfig::sameOrigin))\n .authorizeHttpRequests(\n authorizeHttpRequests ->\n authorizeHttpRequests\n .requestMatchers("/h2-console/**")\n .permitAll()\n .anyRequest()\n .fullyAuthenticated())\n .logout(logout -> logout.logoutSuccessUrl("http://localhost:4200/#").permitAll());\n } else {\n addLoginPageConfiguration(http);\n }\n http.requestCache(RequestCacheConfigurer::disable);\n return http.build();\n }\n\n protected void addLoginPageConfiguration(HttpSecurity http) throws Exception {\n http.authorizeHttpRequests(\n authorizeHttpRequests -> authorizeHttpRequests.anyRequest().fullyAuthenticated())\n .formLogin(\n formLogin ->\n formLogin\n .loginPage("/login")\n .failureUrl("/login?error")\n .defaultSuccessUrl("/index.html")\n .permitAll())\n .logout(\n logout ->\n logout\n .invalidateHttpSession(true)\n .clearAuthentication(true)\n .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))\n .logoutSuccessUrl("/login?logout")\n .deleteCookies("JSESSIONID")\n .permitAll());\n }\n\n @Bean\n public LdapAuthoritiesPopulator authoritiesPopulator(\n DefaultSpringSecurityContextSource contextSource) {\n Function>, GrantedAuthority> authorityMapper =\n recordVar -> new SimpleGrantedAuthority(recordVar.get("spring.security.ldap.dn").get(0));\n\n DefaultLdapAuthoritiesPopulator populator =\n new DefaultLdapAuthoritiesPopulator(contextSource, ldapGroupSearchBase);\n populator.setGroupSearchFilter(ldapGroupSearchFilter);\n populator.setSearchSubtree(true);\n populator.setRolePrefix("");\n populator.setAuthorityMapper(authorityMapper);\n return populator;\n }\n\n @Bean\n @Primary\n public DefaultSpringSecurityContextSource defaultSpringSecurityContextSource() {\n return new DefaultSpringSecurityContextSource(ldapServerUrl + "/" + ldapBaseDn);\n }\n\n @Bean\n public GrantedAuthoritiesMapper grantedAuthoritiesMapper() {\n SimpleAuthorityMapper grantedAuthoritiesMapper = new SimpleAuthorityMapper();\n grantedAuthoritiesMapper.setPrefix("");\n return grantedAuthoritiesMapper;\n }\n\n protected JaasApiIntegrationFilter jaasApiIntegrationFilter() {\n JaasApiIntegrationFilter filter = new JaasApiIntegrationFilter();\n filter.setCreateEmptySubject(true);\n return filter;\n }\n\n @Bean\n AuthenticationManager ldapAuthenticationManager(\n BaseLdapPathContextSource contextSource, LdapAuthoritiesPopulator authorities) {\n @SuppressWarnings("deprecation")\n LdapPasswordComparisonAuthenticationManagerFactory factory =\n new LdapPasswordComparisonAuthenticationManagerFactory(\n contextSource, NoOpPasswordEncoder.getInstance());\n factory.setUserDnPatterns(ldapUserDnPatterns);\n factory.setLdapAuthoritiesPopulator(authorities);\n factory.setAuthoritiesMapper(grantedAuthoritiesMapper());\n factory.setPasswordAttribute("userPassword");\n return factory.createAuthenticationManager();\n }\n}\n\n'})}),"\n",(0,a.jsxs)(n.p,{children:["Create ",(0,a.jsx)(n.code,{children:"CsrfCookieFilter.java"})," in the security folder and copy the following content into it:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:'package com.example.demo.security;\n\nimport jakarta.servlet.FilterChain;\nimport jakarta.servlet.ServletException;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.io.IOException;\nimport org.springframework.security.web.csrf.CsrfToken;\nimport org.springframework.web.filter.OncePerRequestFilter;\n\nfinal class CsrfCookieFilter extends OncePerRequestFilter {\n\n @Override\n protected void doFilterInternal(\n HttpServletRequest request,\n @SuppressWarnings("NullableProblems") HttpServletResponse response,\n FilterChain filterChain)\n throws ServletException, IOException {\n CsrfToken csrfToken = (CsrfToken) request.getAttribute("_csrf");\n // Render the token value to a cookie by causing the deferred token to be loaded\n csrfToken.getToken();\n\n filterChain.doFilter(request, response);\n }\n}\n\n'})}),"\n",(0,a.jsxs)(n.p,{children:["Lastly, create ",(0,a.jsx)(n.code,{children:"SpaCsrfTokenRequestHandler.java"})," in the security folder and copy the following content into it:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"package com.example.demo.security;\n\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport java.util.function.Supplier;\nimport org.springframework.security.web.csrf.CsrfToken;\nimport org.springframework.security.web.csrf.CsrfTokenRequestAttributeHandler;\nimport org.springframework.security.web.csrf.CsrfTokenRequestHandler;\nimport org.springframework.security.web.csrf.XorCsrfTokenRequestAttributeHandler;\nimport org.springframework.util.StringUtils;\n\nfinal class SpaCsrfTokenRequestHandler extends CsrfTokenRequestAttributeHandler {\n private final CsrfTokenRequestHandler delegate = new XorCsrfTokenRequestAttributeHandler();\n\n @Override\n public void handle(\n HttpServletRequest request, HttpServletResponse response, Supplier csrfToken) {\n /*\n * Always use XorCsrfTokenRequestAttributeHandler to provide BREACH protection of\n * the CsrfToken when it is rendered in the response body.\n */\n this.delegate.handle(request, response, csrfToken);\n }\n\n @Override\n public String resolveCsrfTokenValue(HttpServletRequest request, CsrfToken csrfToken) {\n /*\n * If the request contains a request header, use CsrfTokenRequestAttributeHandler\n * to resolve the CsrfToken. This applies when a single-page application includes\n * the header value automatically, which was obtained via a cookie containing the\n * raw CsrfToken.\n */\n if (StringUtils.hasText(request.getHeader(csrfToken.getHeaderName()))) {\n return super.resolveCsrfTokenValue(request, csrfToken);\n }\n /*\n * In all other cases (e.g. if the request contains a request parameter), use\n * XorCsrfTokenRequestAttributeHandler to resolve the CsrfToken. This applies\n * when a server-side rendered form includes the _csrf request parameter as a\n * hidden input.\n */\n return this.delegate.resolveCsrfTokenValue(request, csrfToken);\n }\n}\n\n"})}),"\n",(0,a.jsx)(n.h3,{id:"step-8-add-examplewebsecurityconfigjava",children:"Step 8: Add ExampleWebSecurityConfig.java"}),"\n",(0,a.jsxs)(n.p,{children:["ExampleWebSecurityConfig specifies beans that are used for authorization by spring.\nCreate ",(0,a.jsx)(n.code,{children:"ExampleWebSecurityConfig.java"})," in the ",(0,a.jsx)(n.code,{children:"security"})," package and copy following content\nthere:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:'package com.example.demo.security;\n\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.web.cors.CorsConfiguration;\nimport org.springframework.web.cors.CorsConfigurationSource;\nimport org.springframework.web.cors.UrlBasedCorsConfigurationSource;\n\n@Configuration\npublic class ExampleWebSecurityConfig {\n\n @Bean\n public CorsConfigurationSource corsConfigurationSource() {\n final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();\n CorsConfiguration config = new CorsConfiguration();\n config.setAllowCredentials(true);\n config.addAllowedOriginPattern("*");\n config.addAllowedHeader("*");\n config.addAllowedMethod("*");\n source.registerCorsConfiguration("/**", config);\n return source;\n }\n}\n'})}),"\n",(0,a.jsx)(n.h3,{id:"step-9-add-users",children:"Step 9: Add users"}),"\n",(0,a.jsxs)(n.p,{children:["In order for security to work, we need to define ldap users. Please download\nthe ",(0,a.jsx)(n.code,{children:"example-users.ldif"})," file here:"]}),"\n",(0,a.jsx)("div",{className:o.A.buttons,children:(0,a.jsx)(s.A,{className:"button button--secondary button--lg",children:(0,a.jsx)("a",{className:"button button--secondary button--lg",href:r(8588).A,download:!0,target:"_blank",children:"Download example users "})})}),"\n",(0,a.jsx)("br",{}),"\n",(0,a.jsxs)(n.p,{children:["Please unzip the ",(0,a.jsx)(n.code,{children:"example-users"})," file and put it into the ",(0,a.jsx)(n.code,{children:"resources"})," folder."]}),"\n",(0,a.jsxs)(n.p,{children:["Your project structure should now look like this:\n",(0,a.jsx)(n.img,{alt:"project structure",src:r(2495).A+"",width:"355",height:"633"})]}),"\n",(0,a.jsx)(n.h3,{id:"step-10-try-out-the-rest-api",children:"Step 10: Try out the REST-API"}),"\n",(0,a.jsx)(n.p,{children:"First, restart the ExampleApplication. Try to make a request like in the previous step, for example:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"GET http://localhost:8080/kadai/api/v1/tasks\n"})}),"\n",(0,a.jsxs)(n.p,{children:['You should get the "401 Unauthorized" response.\nNow, you can authorize yourself using basicAuth.\nIn ',(0,a.jsx)(n.a,{href:"https://www.postman.com/",children:"Postman"}),', go to the "Authorization" tab.\nThere, select basicAuth and\ntype "admin" as user and "admin" as password.\nThen, you can make the following request:']}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"GET http://localhost:8080/kadai/api/v1/tasks\n"})}),"\n",(0,a.jsxs)(n.p,{children:["It should return a list of Tasks in the response body. Here is a screenshot of the request and the\nresponse in ",(0,a.jsx)(n.a,{href:"https://www.postman.com/",children:"Postman"}),":"]}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.img,{alt:"example request",src:r(2763).A+"",width:"1395",height:"927"})}),"\n",(0,a.jsx)(n.h2,{id:"set-up-kadai-ui",children:"Set up KADAI UI"}),"\n",(0,a.jsx)(n.h3,{id:"step-11-add-web-dependencies",children:"Step 11: Add web dependencies"}),"\n",(0,a.jsx)(n.p,{children:"Add the following dependencies to your pom and reload maven:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"\n io.kadai\n kadai-web\n 9.1.0\n\n\n org.springframework.boot\n spring-boot-starter-thymeleaf\n\n"})}),"\n",(0,a.jsx)(n.h3,{id:"step-12-add-controllers",children:"Step 12: Add controllers"}),"\n",(0,a.jsxs)(n.p,{children:["Add ",(0,a.jsx)(n.code,{children:"controllers"})," package into the ",(0,a.jsx)(n.code,{children:"com.example.demo"})," package (in\nsrc/main/java/com/example/demo). This package will contain the controllers for different paths. Our\napplication needs the following three controllers:"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"LoginController"}),"\n",(0,a.jsx)(n.li,{children:"ResourcesController"}),"\n",(0,a.jsx)(n.li,{children:"ViewController"}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:"These will be added in the steps 12a, 12b and 12c."}),"\n",(0,a.jsxs)(n.h4,{id:"step-12a-add-logincontrollerjava",children:["Step 12a: Add ",(0,a.jsx)(n.code,{children:"LoginController.java"})]}),"\n",(0,a.jsxs)(n.p,{children:["The LoginController will handle the login into kadai. It will need the ",(0,a.jsx)(n.code,{children:"templates/login.html"}),"\nin the ",(0,a.jsx)(n.code,{children:"resources"})," folder. You can download the templates folder here:"]}),"\n",(0,a.jsx)("div",{className:o.A.buttons,children:(0,a.jsx)(s.A,{className:"button button--secondary button--lg",children:(0,a.jsx)("a",{className:"button button--secondary button--lg",href:r(3896).A,download:!0,target:"_blank",children:"Download templates "})})}),"\n",(0,a.jsxs)(n.p,{children:["Please unzip the ",(0,a.jsx)(n.code,{children:"templates"})," folder and put it into the ",(0,a.jsx)(n.code,{children:"resources"})," folder. Then, copy\nfollowing code into ",(0,a.jsx)(n.code,{children:"LoginController.java"}),":"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:'package com.example.demo.controllers;\n\nimport org.springframework.core.Ordered;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.servlet.config.annotation.ViewControllerRegistry;\nimport org.springframework.web.servlet.config.annotation.WebMvcConfigurer;\n\n@Controller\npublic class LoginController implements WebMvcConfigurer {\n\n @Override\n public void addViewControllers(ViewControllerRegistry registry) {\n registry.addViewController("/login").setViewName("login");\n registry.setOrder(Ordered.HIGHEST_PRECEDENCE);\n }\n}\n'})}),"\n",(0,a.jsx)(n.h4,{id:"step-12b-add-resourcescontrollerjava",children:"Step 12b: Add ResourcesController.java"}),"\n",(0,a.jsxs)(n.p,{children:["The ResourcesController handles resources like images and additional customizations. You'll need\nthe ",(0,a.jsx)(n.code,{children:"static"})," folder for it. You can download the ",(0,a.jsx)(n.code,{children:"static"})," folder here:"]}),"\n",(0,a.jsx)("div",{className:o.A.buttons,children:(0,a.jsx)(s.A,{className:"button button--secondary button--lg",children:(0,a.jsx)("a",{className:"button button--secondary button--lg",href:r(2547).A,download:!0,target:"_blank",children:"Download static "})})}),"\n",(0,a.jsx)("br",{}),"\n",(0,a.jsxs)(n.p,{children:["Please unzip the ",(0,a.jsx)(n.code,{children:"static"})," folder and copy it into ",(0,a.jsx)(n.code,{children:"resources"}),".\nAdditionally, there is\nthe ",(0,a.jsx)(n.code,{children:"com.example.demo.controllers"})," folder for further customizations.\nPlease download it here:"]}),"\n",(0,a.jsx)("div",{className:o.A.buttons,children:(0,a.jsx)(s.A,{className:"button button--secondary button--lg",children:(0,a.jsx)("a",{className:"button button--secondary button--lg",href:r(1858).A,download:!0,target:"_blank",children:"Download controllers "})})}),"\n",(0,a.jsx)("br",{}),"\n",(0,a.jsxs)(n.p,{children:["Unzip the ",(0,a.jsx)(n.code,{children:"com"})," folder and put it into ",(0,a.jsx)(n.code,{children:"resources"}),".\nThen, please copy the following code\ninto ",(0,a.jsx)(n.code,{children:"ResourcesController.java"}),":"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:'package com.example.demo.controllers;\n\nimport org.springframework.http.MediaType;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport io.kadai.common.internal.util.ResourceUtil;\n\nimport java.io.IOException;\n\n@Controller\npublic class ResourcesController {\n\n public static final String KADAI_CUSTOMIZATION_FILE_NAME = "kadai-customization.json";\n\n @GetMapping(\n value = "/environments/data-sources/kadai-customization.json",\n produces = MediaType.APPLICATION_JSON_VALUE)\n public ResponseEntity kadaiCustomization() throws IOException {\n return ResponseEntity.ok(readResourceAsString(KADAI_CUSTOMIZATION_FILE_NAME));\n }\n\n // the environment-information.json file will be served via "static" folder\n // @GetMapping(\n // value = "/environments/data-sources/environment-information.json",\n // produces = MediaType.APPLICATION_JSON_VALUE)\n // public ResponseEntity environmentInformation() throws Exception {\n // return ResponseEntity.ok(readResourceAsString("environment-information.json"));\n // }\n\n private String readResourceAsString(String resource) throws IOException {\n String resourceAsString = ResourceUtil.readResourceAsString(getClass(), resource);\n if (resourceAsString == null) {\n return "{}";\n }\n return resourceAsString;\n }\n}\n'})}),"\n",(0,a.jsx)(n.h4,{id:"step-12c-add-viewcontrollerjava",children:"Step 12c: Add ViewController.java"}),"\n",(0,a.jsxs)(n.p,{children:["The ViewController manages the root view of KADAI.\nCopy following code\ninto ",(0,a.jsx)(n.code,{children:"ViewController.java"}),":"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:'package com.example.demo.controllers;\n\nimport org.springframework.stereotype.Controller;\nimport org.springframework.web.bind.annotation.GetMapping;\n\n/** The view controller. */\n@Controller\npublic class ViewController {\n\n @GetMapping(path = {"", "kadai/**"})\n public String index() {\n return "forward:/index.html";\n }\n}\n'})}),"\n",(0,a.jsx)(n.h3,{id:"step-13-add-webmvcconfigjava",children:"Step 13: Add WebMvcConfig.java"}),"\n",(0,a.jsxs)(n.p,{children:["Create ",(0,a.jsx)(n.code,{children:"WebMvcConfig.java"})," in the ",(0,a.jsx)(n.code,{children:"com.example.demo"})," package. It handles resources and\nmessages of the application. Copy following content into ",(0,a.jsx)(n.code,{children:"WebMvcConfig.java"}),":"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:'package com.example.demo;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackson.databind.SerializationFeature;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.http.converter.HttpMessageConverter;\nimport org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;\nimport org.springframework.web.servlet.config.annotation.EnableWebMvc;\nimport org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;\nimport org.springframework.web.servlet.config.annotation.WebMvcConfigurer;\n\nimport jakarta.annotation.PostConstruct;\nimport java.util.List;\n\n/**\n * The Web MVC Configuration.\n */\n@Configuration\n@EnableWebMvc\npublic class WebMvcConfig implements WebMvcConfigurer {\n\n private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {\n "classpath:/META-INF/resources/", "classpath:/resources/",\n "classpath:/static/", "classpath:/public/", "classpath:/templates/"\n };\n\n private final ObjectMapper objectMapper;\n\n @Autowired\n public WebMvcConfig(ObjectMapper objectMapper) {\n this.objectMapper = objectMapper;\n }\n\n @Override\n public void addResourceHandlers(ResourceHandlerRegistry registry) {\n if (!registry.hasMappingForPattern("/webjars/**")) {\n registry\n .addResourceHandler("/webjars/**")\n .addResourceLocations("classpath:/META-INF/resources/webjars/");\n }\n if (!registry.hasMappingForPattern("/**")) {\n registry.addResourceHandler("/**").addResourceLocations(CLASSPATH_RESOURCE_LOCATIONS);\n }\n }\n\n @Override\n public void extendMessageConverters(List> converters) {\n for (HttpMessageConverter converter : converters) {\n if (converter instanceof MappingJackson2HttpMessageConverter) {\n MappingJackson2HttpMessageConverter jacksonConverter =\n (MappingJackson2HttpMessageConverter) converter;\n jacksonConverter.setPrettyPrint(true);\n }\n }\n }\n\n @PostConstruct\n public void enableObjectIndent() {\n objectMapper.enable(SerializationFeature.INDENT_OUTPUT);\n }\n}\n\n'})}),"\n",(0,a.jsx)(n.p,{children:"Your project structure should look like this:"}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.img,{alt:"project structure",src:r(7406).A+"",width:"351",height:"842"})}),"\n",(0,a.jsx)(n.h3,{id:"step-14-start-and-open-the-application",children:"Step 14: Start and open the application"}),"\n",(0,a.jsxs)(n.p,{children:["Recompile the application, then go to the DemoApplication class in the IDE and start it. Then\ntype ",(0,a.jsx)(n.code,{children:"localhost:8080/kadai"})," into your browser. You should see the login screen:"]}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.img,{alt:"Log in",src:r(214).A+"",width:"4112",height:"2418"})}),"\n",(0,a.jsx)(n.p,{children:'Log in using "admin" as username and "admin" as password. Now, you should see the following:'}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.img,{alt:"Workbaskets",src:r(217).A+"",width:"4112",height:"2416"})}),"\n",(0,a.jsx)(n.p,{children:"Press the menu button in the upper left to navigate."}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.img,{alt:"Navigate",src:r(7184).A+"",width:"4112",height:"2414"})})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(u,{...e})}):u(e)}},1858:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/files/com-0f07a8bf0277901135aeeda167b5a7ce.zip"},8588:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/files/example-users-59b3afc8ac24bc03947b63568201a681.zip"},2547:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/files/static-b5a210389c4f7556535cbd797a333654.zip"},3896:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/files/templates-63e01163241f7b3e4c22ff63263214df.zip"},5530:(e,n,r)=>{r.d(n,{A:()=>t});const t={features:"features_t9lD",featureSvg:"featureSvg_GfXr",featureText:"featureText_ZxAV"}},1691:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/images/example-request-classifications-0eca365b18b2aa2f059fa8cd18718b86.png"},214:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/images/login-a309f62aa082a31bb0992528c1f5ff6b.png"},7184:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/images/navigate-04b25efdaf87f5bb1d0b5b318b90fb64.png"},4713:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/images/project-initializer-36766e23926e9de9544f809c236ec969.png"},7406:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/images/project-structure-end-a0f0c7c318c8d3e2810f1bb7b165f5f3.png"},2495:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/images/project-structure-security-9607aaae9482804b3fd2e9f797362df1.png"},2763:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/images/request-security-ea37ce040aec51b3b2eaf6698888e0d0.png"},7436:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/images/rest-api-project-a58e3752764d48e32eedd577c97f099a.png"},1785:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/images/schritt-2-471abd42fb0e963330579ad3675bd6a5.png"},217:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/images/workbaskets-14c24952a7ee8d30d54b9a543020927c.png"},8453:(e,n,r)=>{r.d(n,{R:()=>o,x:()=>s});var t=r(6540);const a={},i=t.createContext(a);function o(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/24ec522f.9c5b1e5e.js b/assets/js/24ec522f.9c5b1e5e.js new file mode 100644 index 0000000..2a8c6e0 --- /dev/null +++ b/assets/js/24ec522f.9c5b1e5e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[1904],{924:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>t,contentTitle:()=>d,default:()=>h,frontMatter:()=>r,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"user-guide/configuration/holidaysAndWorkingDays","title":"Holidays and Working Days","description":"The configuration of these parameters is in the file `kadai.properties`.","source":"@site/docs/user-guide/configuration/holidaysAndWorkingDays.md","sourceDirName":"user-guide/configuration","slug":"/user-guide/configuration/holidaysAndWorkingDays","permalink":"/kadai-doc/docs/user-guide/configuration/holidaysAndWorkingDays","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":6,"frontMatter":{"sidebar_position":6},"sidebar":"userSidebar","previous":{"title":"KADAI-jobs","permalink":"/kadai-doc/docs/user-guide/configuration/kadaiJobs"},"next":{"title":"History and Custom Properties","permalink":"/kadai-doc/docs/user-guide/configuration/historyAndCustomProperties"}}');var o=n(4848),a=n(8453);const r={sidebar_position:6},d="Holidays and Working Days",t={},l=[{value:"Holidays",id:"holidays",level:2},{value:"Working time",id:"working-time",level:2}];function c(e){const i={code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,a.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i.header,{children:(0,o.jsx)(i.h1,{id:"holidays-and-working-days",children:"Holidays and Working Days"})}),"\n",(0,o.jsxs)(i.p,{children:["The configuration of these parameters is in the file ",(0,o.jsx)(i.code,{children:"kadai.properties"}),"."]}),"\n",(0,o.jsxs)(i.p,{children:["Some parameters allow multiple values specified as a list. In this case, individual values are separated by a configurable separator. Use the ",(0,o.jsx)(i.em,{children:"propertiesSeparator"}),' parameter to specify it. If none is provided, the default is "|". If you specify a propertiesSeparator, no list item in the properties file can contain any character from the propertiesSeparator.']}),"\n",(0,o.jsx)(i.h2,{id:"holidays",children:"Holidays"}),"\n",(0,o.jsx)(i.p,{children:"Holidays can be customized. This is relevant because time on a holiday doesn't count towards working time."}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.code,{children:"kadai.german.holidays.enabled"}),": Standard German holidays will be enabled."]}),"\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.code,{children:"kadai.german.holidays.corpus-christi.enabled"}),": The holiday corpus christi will be activated."]}),"\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.code,{children:"kadai.custom.holidays"}),": Holiday dates specified as a list will be added. Each holiday should be in the dd.MM format.\nExample custom holidays: ",(0,o.jsx)(i.code,{children:"kadai.custom.holidays=31.07|16.12"})]}),"\n"]}),"\n",(0,o.jsx)(i.h2,{id:"working-time",children:"Working time"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.code,{children:"kadai.workingTime.schedule.MONDAY"})," : Working time on Monday, e.g., 09:00\u201318:00"]}),"\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.code,{children:"kadai.workingTime.schedule.TUESDAY"})," : Working time on Tuesday, e.g., 09:00\u201318:00"]}),"\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.code,{children:"kadai.workingTime.schedule.WEDNESDAY"})," : Working time on Wednesday, e.g., 09:00\u201318:00"]}),"\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.code,{children:"kadai.workingTime.schedule.THURSDAY"})," : Working time on Thursday, e.g., 09:00\u201318:00"]}),"\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.code,{children:"kadai.workingTime.schedule.FRIDAY"})," : Working time on Friday, e.g., 09:00\u201318:00"]}),"\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.code,{children:"kadai.workingTime.timezone"})," : Time zone, e. g. UTC"]}),"\n"]})]})}function h(e={}){const{wrapper:i}={...(0,a.R)(),...e.components};return i?(0,o.jsx)(i,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>r,x:()=>d});var s=n(6540);const o={},a=s.createContext(o);function r(e){const i=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function d(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(a.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/24ec522f.b2e570f5.js b/assets/js/24ec522f.b2e570f5.js deleted file mode 100644 index 0c033be..0000000 --- a/assets/js/24ec522f.b2e570f5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[1904],{2699:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>t,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>d,toc:()=>l});var s=n(4848),o=n(8453);const r={sidebar_position:6},a="Holidays and Working Days",d={id:"user-guide/configuration/holidaysAndWorkingDays",title:"Holidays and Working Days",description:"The configuration of these parameters is in the file `kadai.properties`.",source:"@site/docs/user-guide/configuration/holidaysAndWorkingDays.md",sourceDirName:"user-guide/configuration",slug:"/user-guide/configuration/holidaysAndWorkingDays",permalink:"/kadai-doc/docs/user-guide/configuration/holidaysAndWorkingDays",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:6,frontMatter:{sidebar_position:6},sidebar:"userSidebar",previous:{title:"KADAI-jobs",permalink:"/kadai-doc/docs/user-guide/configuration/kadaiJobs"},next:{title:"History and Custom Properties",permalink:"/kadai-doc/docs/user-guide/configuration/historyAndCustomProperties"}},t={},l=[{value:"Holidays",id:"holidays",level:2},{value:"Working time",id:"working-time",level:2}];function c(e){const i={code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"holidays-and-working-days",children:"Holidays and Working Days"})}),"\n",(0,s.jsxs)(i.p,{children:["The configuration of these parameters is in the file ",(0,s.jsx)(i.code,{children:"kadai.properties"}),"."]}),"\n",(0,s.jsxs)(i.p,{children:["Some parameters allow multiple values specified as a list. In this case, individual values are separated by a configurable separator. Use the ",(0,s.jsx)(i.em,{children:"propertiesSeparator"}),' parameter to specify it. If none is provided, the default is "|". If you specify a propertiesSeparator, no list item in the properties file can contain any character from the propertiesSeparator.']}),"\n",(0,s.jsx)(i.h2,{id:"holidays",children:"Holidays"}),"\n",(0,s.jsx)(i.p,{children:"Holidays can be customized. This is relevant because time on a holiday doesn't count towards working time."}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"kadai.german.holidays.enabled"}),": Standard German holidays will be enabled."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"kadai.german.holidays.corpus-christi.enabled"}),": The holiday corpus christi will be activated."]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"kadai.custom.holidays"}),": Holiday dates specified as a list will be added. Each holiday should be in the dd.MM format.\nExample custom holidays: ",(0,s.jsx)(i.code,{children:"kadai.custom.holidays=31.07|16.12"})]}),"\n"]}),"\n",(0,s.jsx)(i.h2,{id:"working-time",children:"Working time"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"kadai.workingTime.schedule.MONDAY"})," : Working time on Monday, e.g., 09:00\u201318:00"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"kadai.workingTime.schedule.TUESDAY"})," : Working time on Tuesday, e.g., 09:00\u201318:00"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"kadai.workingTime.schedule.WEDNESDAY"})," : Working time on Wednesday, e.g., 09:00\u201318:00"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"kadai.workingTime.schedule.THURSDAY"})," : Working time on Thursday, e.g., 09:00\u201318:00"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"kadai.workingTime.schedule.FRIDAY"})," : Working time on Friday, e.g., 09:00\u201318:00"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.code,{children:"kadai.workingTime.timezone"})," : Time zone, e. g. UTC"]}),"\n"]})]})}function h(e={}){const{wrapper:i}={...(0,o.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>a,x:()=>d});var s=n(6540);const o={},r=s.createContext(o);function a(e){const i=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function d(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),s.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2a7b3772.bacbc9ee.js b/assets/js/2a7b3772.bacbc9ee.js deleted file mode 100644 index 5b1031d..0000000 --- a/assets/js/2a7b3772.bacbc9ee.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[4358],{9888:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>n,default:()=>c,frontMatter:()=>s,metadata:()=>a,toc:()=>h});var r=i(4848),d=i(8453);const s={sidebar_position:3},n="LDAP",a={id:"user-guide/configuration/ldap",title:"LDAP",description:"KADAI provides LDAP support by showing LDAP-usage in its example module `kadai-rest-spring-example-boot`.",source:"@site/docs/user-guide/configuration/ldap.md",sourceDirName:"user-guide/configuration",slug:"/user-guide/configuration/ldap",permalink:"/kadai-doc/docs/user-guide/configuration/ldap",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:3,frontMatter:{sidebar_position:3},sidebar:"userSidebar",previous:{title:"Security",permalink:"/kadai-doc/docs/user-guide/configuration/security"},next:{title:"Classification and ServiceLevel",permalink:"/kadai-doc/docs/user-guide/configuration/classificationAndServiceLevel"}},l={},h=[];function o(e){const t={a:"a",code:"code",h1:"h1",header:"header",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,d.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"ldap",children:"LDAP"})}),"\n",(0,r.jsxs)(t.p,{children:["KADAI provides ",(0,r.jsx)(t.a,{href:"https://ldap.com/learn-about-ldap/",children:"LDAP"})," support by showing LDAP-usage in its example module ",(0,r.jsx)(t.code,{children:"kadai-rest-spring-example-boot"}),".\nIf you do not create an LdapContextSource bean, KADAI will create one for you using the parameters specified on this documentation page.\nIf you want to create your LdapContextSource bean to be used in KADAI, please use as qualifier the constant ",(0,r.jsx)(t.code,{children:"io.kadai.common.rest.ldap.KADAI_LDAP_CONTEXT_SOURCE"}),".\nTo configure LDAP for usage with KADAI, you need an .ldif file. Additionally, you need to configure LDAP in the ",(0,r.jsx)(t.code,{children:"application.properties"})," file using the following parameters:"]}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Parameter"}),(0,r.jsx)(t.th,{children:"Description"}),(0,r.jsx)(t.th,{children:"Sample Value"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"kadai.ldap.serverUrl"}),(0,r.jsx)(t.td,{children:"The url of the ldap server used by KADAI."}),(0,r.jsx)(t.td,{children:"ldap://localhost:10389"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"kadai.ldap.bindDn"}),(0,r.jsx)(t.td,{children:"The bind dn when connecting."}),(0,r.jsx)(t.td,{children:"uid=admin"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"kadai.ldap.bindPassword"}),(0,r.jsx)(t.td,{children:"The password for connecting with the bind dn."}),(0,r.jsx)(t.td,{children:"secret"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"kadai.ldap.baseDn"}),(0,r.jsx)(t.td,{children:"The base dn of the ldap server."}),(0,r.jsx)(t.td,{children:"ou=Test,O=KADAI"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"kadai.ldap.userSearchBase"}),(0,r.jsx)(t.td,{children:"The base dn of each use."}),(0,r.jsx)(t.td,{children:"cn=users"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"kadai.ldap.userSearchFilterName"}),(0,r.jsx)(t.td,{children:"Name of the attribute for filtering users."}),(0,r.jsx)(t.td,{children:"objectclass"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"kadai.ldap.userSearchFilterValue"}),(0,r.jsx)(t.td,{children:"Value of the attribute for filtering users."}),(0,r.jsx)(t.td,{children:"person"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"kadai.ldap.userFirstnameAttribute"}),(0,r.jsx)(t.td,{children:"Name of the attribute that is used to specify the first name of the user in the ldif file."}),(0,r.jsx)(t.td,{children:"givenName"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"kadai.ldap.userLastnameAttribute"}),(0,r.jsx)(t.td,{children:"Name of the attribute that is used to specify the last name of the user in the ldif file."}),(0,r.jsx)(t.td,{children:"sn"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"kadai.ldap.userFullnameAttribute"}),(0,r.jsx)(t.td,{children:"Name of the attribute that is used to specify the full name of the user in the ldif file."}),(0,r.jsx)(t.td,{children:"cn"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"kadai.ldap.userPhoneAttribute"}),(0,r.jsx)(t.td,{children:"Name of the attribute that is used to specify the phone of the user in the ldif file."}),(0,r.jsx)(t.td,{children:"phoneNumber"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"kadai.ldap.userMobilePhoneAttribute"}),(0,r.jsx)(t.td,{children:"Name of the attribute that is used to specify the mobile phone of the user in the ldif file."}),(0,r.jsx)(t.td,{children:"mobileNumber"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"kadai.ldap.userEmailAttribute"}),(0,r.jsx)(t.td,{children:"Name of the attribute that is used to specify the email of the user in the ldif file."}),(0,r.jsx)(t.td,{children:"email"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"kadai.ldap.userOrglevel1Attribute"}),(0,r.jsx)(t.td,{children:"Name of the attribute that is used to specify the first organization level of the user in the ldif file."}),(0,r.jsx)(t.td,{children:"orgLevel1"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"kadai.ldap.userOrglevel2Attribute"}),(0,r.jsx)(t.td,{children:"Name of the attribute that is used to specify the second organization level of the user in the ldif file."}),(0,r.jsx)(t.td,{children:"orgLevel2"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"kadai.ldap.userOrglevel3Attribute"}),(0,r.jsx)(t.td,{children:"Name of the attribute that is used to specify the third organization level of the user in the ldif file."}),(0,r.jsx)(t.td,{children:"orgLevel3"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"kadai.ldap.userOrglevel4Attribute"}),(0,r.jsx)(t.td,{children:"Name of the attribute that is used to specify the fourth organization level of the user in the ldif file."}),(0,r.jsx)(t.td,{children:"orgLevel4"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"kadai.ldap.userIdAttribute"}),(0,r.jsx)(t.td,{children:"Name of the attribute that is used to specify the id of the user in the ldif file."}),(0,r.jsx)(t.td,{children:"uid"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"kadai.ldap.userMemberOfGroupAttribute"}),(0,r.jsx)(t.td,{children:"Name of the attribute that is used to specify groups of the user in the ldif file."}),(0,r.jsx)(t.td,{children:"memberOf"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"kadai.ldap.groupSearchBase"}),(0,r.jsx)(t.td,{children:"The base dn of each group"}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"kadai.ldap.groupSearchFilterName"}),(0,r.jsx)(t.td,{children:"Name of the attribute for filtering groups."}),(0,r.jsx)(t.td,{children:"objectclass"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"kadai.ldap.groupSearchFilterValue"}),(0,r.jsx)(t.td,{children:"Value of the attribute for filtering goups."}),(0,r.jsx)(t.td,{children:"groupOfUniqueNames"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"kadai.ldap.groupNameAttribute"}),(0,r.jsx)(t.td,{children:"Name of the attribute that is used to specify the name of the group in the ldif file."}),(0,r.jsx)(t.td,{children:"cn"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsxs)(t.td,{children:["kadai.ldap.minSearchForLength",(0,r.jsx)("br",{})," (optional)"]}),(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"3"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsxs)(t.td,{children:["kadai.ldap.maxNumberOfReturnedAccessIds",(0,r.jsx)("br",{}),"(optional)"]}),(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{children:"50"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsxs)(t.td,{children:["kadai.ldap.groupsOfUser",(0,r.jsx)("br",{})," (optional)"]}),(0,r.jsx)(t.td,{children:"deprecated. Please use kadai.ldap.groupsOfUser.name instead."}),(0,r.jsx)(t.td,{children:"uniquemember"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsxs)(t.td,{children:["kadai.ldap.groupsOfUser.name",(0,r.jsx)("br",{})," (optional)"]}),(0,r.jsx)(t.td,{children:"Name of the attribute in a group object, which specifies the member of the group."}),(0,r.jsx)(t.td,{children:"uniquemember"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsxs)(t.td,{children:["kadai.ldap.groupsOfUser.type",(0,r.jsx)("br",{}),"(optional)"]}),(0,r.jsx)(t.td,{children:"Type of the attribute in a group object, which specifies the member of the group.If you specify \u2018dn\u2019 as the type, KADAI assumes that this field contains exactly the full dn of the member."}),(0,r.jsx)(t.td,{children:"dn"})]})]})]})]})}function c(e={}){const{wrapper:t}={...(0,d.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(o,{...e})}):o(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>n,x:()=>a});var r=i(6540);const d={},s=r.createContext(d);function n(e){const t=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:n(e.components),r.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2a7b3772.fe519350.js b/assets/js/2a7b3772.fe519350.js new file mode 100644 index 0000000..efce391 --- /dev/null +++ b/assets/js/2a7b3772.fe519350.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[4358],{1928:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>c,frontMatter:()=>n,metadata:()=>r,toc:()=>h});const r=JSON.parse('{"id":"user-guide/configuration/ldap","title":"LDAP","description":"KADAI provides LDAP support by showing LDAP-usage in its example module `kadai-rest-spring-example-boot`.","source":"@site/docs/user-guide/configuration/ldap.md","sourceDirName":"user-guide/configuration","slug":"/user-guide/configuration/ldap","permalink":"/kadai-doc/docs/user-guide/configuration/ldap","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"sidebar_position":3},"sidebar":"userSidebar","previous":{"title":"Security","permalink":"/kadai-doc/docs/user-guide/configuration/security"},"next":{"title":"Classification and ServiceLevel","permalink":"/kadai-doc/docs/user-guide/configuration/classificationAndServiceLevel"}}');var d=i(4848),s=i(8453);const n={sidebar_position:3},a="LDAP",l={},h=[];function o(e){const t={a:"a",code:"code",h1:"h1",header:"header",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(t.header,{children:(0,d.jsx)(t.h1,{id:"ldap",children:"LDAP"})}),"\n",(0,d.jsxs)(t.p,{children:["KADAI provides ",(0,d.jsx)(t.a,{href:"https://ldap.com/learn-about-ldap/",children:"LDAP"})," support by showing LDAP-usage in its example module ",(0,d.jsx)(t.code,{children:"kadai-rest-spring-example-boot"}),".\nIf you do not create an LdapContextSource bean, KADAI will create one for you using the parameters specified on this documentation page.\nIf you want to create your LdapContextSource bean to be used in KADAI, please use as qualifier the constant ",(0,d.jsx)(t.code,{children:"io.kadai.common.rest.ldap.KADAI_LDAP_CONTEXT_SOURCE"}),".\nTo configure LDAP for usage with KADAI, you need an .ldif file. Additionally, you need to configure LDAP in the ",(0,d.jsx)(t.code,{children:"application.properties"})," file using the following parameters:"]}),"\n",(0,d.jsxs)(t.table,{children:[(0,d.jsx)(t.thead,{children:(0,d.jsxs)(t.tr,{children:[(0,d.jsx)(t.th,{children:"Parameter"}),(0,d.jsx)(t.th,{children:"Description"}),(0,d.jsx)(t.th,{children:"Sample Value"})]})}),(0,d.jsxs)(t.tbody,{children:[(0,d.jsxs)(t.tr,{children:[(0,d.jsx)(t.td,{children:"kadai.ldap.serverUrl"}),(0,d.jsx)(t.td,{children:"The url of the ldap server used by KADAI."}),(0,d.jsx)(t.td,{children:"ldap://localhost:10389"})]}),(0,d.jsxs)(t.tr,{children:[(0,d.jsx)(t.td,{children:"kadai.ldap.bindDn"}),(0,d.jsx)(t.td,{children:"The bind dn when connecting."}),(0,d.jsx)(t.td,{children:"uid=admin"})]}),(0,d.jsxs)(t.tr,{children:[(0,d.jsx)(t.td,{children:"kadai.ldap.bindPassword"}),(0,d.jsx)(t.td,{children:"The password for connecting with the bind dn."}),(0,d.jsx)(t.td,{children:"secret"})]}),(0,d.jsxs)(t.tr,{children:[(0,d.jsx)(t.td,{children:"kadai.ldap.baseDn"}),(0,d.jsx)(t.td,{children:"The base dn of the ldap server."}),(0,d.jsx)(t.td,{children:"ou=Test,O=KADAI"})]}),(0,d.jsxs)(t.tr,{children:[(0,d.jsx)(t.td,{children:"kadai.ldap.userSearchBase"}),(0,d.jsx)(t.td,{children:"The base dn of each use."}),(0,d.jsx)(t.td,{children:"cn=users"})]}),(0,d.jsxs)(t.tr,{children:[(0,d.jsx)(t.td,{children:"kadai.ldap.userSearchFilterName"}),(0,d.jsx)(t.td,{children:"Name of the attribute for filtering users."}),(0,d.jsx)(t.td,{children:"objectclass"})]}),(0,d.jsxs)(t.tr,{children:[(0,d.jsx)(t.td,{children:"kadai.ldap.userSearchFilterValue"}),(0,d.jsx)(t.td,{children:"Value of the attribute for filtering users."}),(0,d.jsx)(t.td,{children:"person"})]}),(0,d.jsxs)(t.tr,{children:[(0,d.jsx)(t.td,{children:"kadai.ldap.userFirstnameAttribute"}),(0,d.jsx)(t.td,{children:"Name of the attribute that is used to specify the first name of the user in the ldif file."}),(0,d.jsx)(t.td,{children:"givenName"})]}),(0,d.jsxs)(t.tr,{children:[(0,d.jsx)(t.td,{children:"kadai.ldap.userLastnameAttribute"}),(0,d.jsx)(t.td,{children:"Name of the attribute that is used to specify the last name of the user in the ldif file."}),(0,d.jsx)(t.td,{children:"sn"})]}),(0,d.jsxs)(t.tr,{children:[(0,d.jsx)(t.td,{children:"kadai.ldap.userFullnameAttribute"}),(0,d.jsx)(t.td,{children:"Name of the attribute that is used to specify the full name of the user in the ldif file."}),(0,d.jsx)(t.td,{children:"cn"})]}),(0,d.jsxs)(t.tr,{children:[(0,d.jsx)(t.td,{children:"kadai.ldap.userPhoneAttribute"}),(0,d.jsx)(t.td,{children:"Name of the attribute that is used to specify the phone of the user in the ldif file."}),(0,d.jsx)(t.td,{children:"phoneNumber"})]}),(0,d.jsxs)(t.tr,{children:[(0,d.jsx)(t.td,{children:"kadai.ldap.userMobilePhoneAttribute"}),(0,d.jsx)(t.td,{children:"Name of the attribute that is used to specify the mobile phone of the user in the ldif file."}),(0,d.jsx)(t.td,{children:"mobileNumber"})]}),(0,d.jsxs)(t.tr,{children:[(0,d.jsx)(t.td,{children:"kadai.ldap.userEmailAttribute"}),(0,d.jsx)(t.td,{children:"Name of the attribute that is used to specify the email of the user in the ldif file."}),(0,d.jsx)(t.td,{children:"email"})]}),(0,d.jsxs)(t.tr,{children:[(0,d.jsx)(t.td,{children:"kadai.ldap.userOrglevel1Attribute"}),(0,d.jsx)(t.td,{children:"Name of the attribute that is used to specify the first organization level of the user in the ldif file."}),(0,d.jsx)(t.td,{children:"orgLevel1"})]}),(0,d.jsxs)(t.tr,{children:[(0,d.jsx)(t.td,{children:"kadai.ldap.userOrglevel2Attribute"}),(0,d.jsx)(t.td,{children:"Name of the attribute that is used to specify the second organization level of the user in the ldif file."}),(0,d.jsx)(t.td,{children:"orgLevel2"})]}),(0,d.jsxs)(t.tr,{children:[(0,d.jsx)(t.td,{children:"kadai.ldap.userOrglevel3Attribute"}),(0,d.jsx)(t.td,{children:"Name of the attribute that is used to specify the third organization level of the user in the ldif file."}),(0,d.jsx)(t.td,{children:"orgLevel3"})]}),(0,d.jsxs)(t.tr,{children:[(0,d.jsx)(t.td,{children:"kadai.ldap.userOrglevel4Attribute"}),(0,d.jsx)(t.td,{children:"Name of the attribute that is used to specify the fourth organization level of the user in the ldif file."}),(0,d.jsx)(t.td,{children:"orgLevel4"})]}),(0,d.jsxs)(t.tr,{children:[(0,d.jsx)(t.td,{children:"kadai.ldap.userIdAttribute"}),(0,d.jsx)(t.td,{children:"Name of the attribute that is used to specify the id of the user in the ldif file."}),(0,d.jsx)(t.td,{children:"uid"})]}),(0,d.jsxs)(t.tr,{children:[(0,d.jsx)(t.td,{children:"kadai.ldap.userMemberOfGroupAttribute"}),(0,d.jsx)(t.td,{children:"Name of the attribute that is used to specify groups of the user in the ldif file."}),(0,d.jsx)(t.td,{children:"memberOf"})]}),(0,d.jsxs)(t.tr,{children:[(0,d.jsx)(t.td,{children:"kadai.ldap.groupSearchBase"}),(0,d.jsx)(t.td,{children:"The base dn of each group"}),(0,d.jsx)(t.td,{})]}),(0,d.jsxs)(t.tr,{children:[(0,d.jsx)(t.td,{children:"kadai.ldap.groupSearchFilterName"}),(0,d.jsx)(t.td,{children:"Name of the attribute for filtering groups."}),(0,d.jsx)(t.td,{children:"objectclass"})]}),(0,d.jsxs)(t.tr,{children:[(0,d.jsx)(t.td,{children:"kadai.ldap.groupSearchFilterValue"}),(0,d.jsx)(t.td,{children:"Value of the attribute for filtering goups."}),(0,d.jsx)(t.td,{children:"groupOfUniqueNames"})]}),(0,d.jsxs)(t.tr,{children:[(0,d.jsx)(t.td,{children:"kadai.ldap.groupNameAttribute"}),(0,d.jsx)(t.td,{children:"Name of the attribute that is used to specify the name of the group in the ldif file."}),(0,d.jsx)(t.td,{children:"cn"})]}),(0,d.jsxs)(t.tr,{children:[(0,d.jsxs)(t.td,{children:["kadai.ldap.minSearchForLength",(0,d.jsx)("br",{})," (optional)"]}),(0,d.jsx)(t.td,{}),(0,d.jsx)(t.td,{children:"3"})]}),(0,d.jsxs)(t.tr,{children:[(0,d.jsxs)(t.td,{children:["kadai.ldap.maxNumberOfReturnedAccessIds",(0,d.jsx)("br",{}),"(optional)"]}),(0,d.jsx)(t.td,{}),(0,d.jsx)(t.td,{children:"50"})]}),(0,d.jsxs)(t.tr,{children:[(0,d.jsxs)(t.td,{children:["kadai.ldap.groupsOfUser",(0,d.jsx)("br",{})," (optional)"]}),(0,d.jsx)(t.td,{children:"deprecated. Please use kadai.ldap.groupsOfUser.name instead."}),(0,d.jsx)(t.td,{children:"uniquemember"})]}),(0,d.jsxs)(t.tr,{children:[(0,d.jsxs)(t.td,{children:["kadai.ldap.groupsOfUser.name",(0,d.jsx)("br",{})," (optional)"]}),(0,d.jsx)(t.td,{children:"Name of the attribute in a group object, which specifies the member of the group."}),(0,d.jsx)(t.td,{children:"uniquemember"})]}),(0,d.jsxs)(t.tr,{children:[(0,d.jsxs)(t.td,{children:["kadai.ldap.groupsOfUser.type",(0,d.jsx)("br",{}),"(optional)"]}),(0,d.jsx)(t.td,{children:"Type of the attribute in a group object, which specifies the member of the group.If you specify \u2018dn\u2019 as the type, KADAI assumes that this field contains exactly the full dn of the member."}),(0,d.jsx)(t.td,{children:"dn"})]})]})]})]})}function c(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,d.jsx)(t,{...e,children:(0,d.jsx)(o,{...e})}):o(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>n,x:()=>a});var r=i(6540);const d={},s=r.createContext(d);function n(e){const t=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:n(e.components),r.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/373999ad.2866021c.js b/assets/js/373999ad.2866021c.js new file mode 100644 index 0000000..5ae8ea5 --- /dev/null +++ b/assets/js/373999ad.2866021c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[6268],{4284:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>h,contentTitle:()=>m,default:()=>y,frontMatter:()=>c,metadata:()=>r,toc:()=>x});const r=JSON.parse('{"id":"user-guide/core-concepts/overview","title":"Overview","description":"KADAI is an open source Task Management System. It includes defining and creating tasks and keeping track of their execution, as well as distributing them to their responsible users. KADAI also offers options for detailed descriptions of each task using attachments, object references, and many other properties. In the following article, the basic entities of KADAI and related concepts are explained.","source":"@site/docs/user-guide/core-concepts/overview.md","sourceDirName":"user-guide/core-concepts","slug":"/user-guide/core-concepts/overview","permalink":"/kadai-doc/docs/user-guide/core-concepts/overview","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1},"sidebar":"userSidebar","previous":{"title":"Core Concepts","permalink":"/kadai-doc/docs/category/core-concepts"},"next":{"title":"Task Lifecycle","permalink":"/kadai-doc/docs/user-guide/core-concepts/taskLifecycle"}}');var o=n(4848),i=n(8453),a=n(9734),s=n.n(a);const l='\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n',d='\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n',c={sidebar_position:1},m="Overview",h={},x=[{value:"KADAI Entities",id:"kadai-entities",level:2},{value:"Task",id:"task",level:3},{value:"ObjectReference",id:"objectreference",level:3},{value:"Attachment",id:"attachment",level:3},{value:"Classification",id:"classification",level:3},{value:"Workbasket",id:"workbasket",level:3},{value:"WorkbasketAccessItem",id:"workbasketaccessitem",level:3},{value:"Summary Objects",id:"summary-objects",level:3},{value:"Operations on entities",id:"operations-on-entities",level:2},{value:"List of important features",id:"list-of-important-features",level:2}];function u(e){const t={a:"a",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"overview",children:"Overview"})}),"\n","\n",(0,o.jsx)(t.p,{children:"KADAI is an open source Task Management System. It includes defining and creating tasks and keeping track of their execution, as well as distributing them to their responsible users. KADAI also offers options for detailed descriptions of each task using attachments, object references, and many other properties. In the following article, the basic entities of KADAI and related concepts are explained."}),"\n",(0,o.jsxs)(t.p,{children:["To provide its functionality, KADAI consists of different components.\nThey are shown in the diagram below.\nAs different components provide different features,\nthe description of relevant modules can be found ",(0,o.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/reference/modules",children:"here"}),".\nYou can read more about the Java Library and its usage ",(0,o.jsx)(t.a,{href:"./javaApiUsage",children:"here"}),"."]}),"\n",(0,o.jsx)(s(),{content:d}),"\n",(0,o.jsx)(t.h2,{id:"kadai-entities",children:"KADAI Entities"}),"\n",(0,o.jsxs)(t.p,{children:["All KADAI Entities can be found in the Java API. You can read more about our Java API ",(0,o.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/core-concepts/javaApiUsage",children:"here"}),". For better readability, entities are capitalized in the documentation."]}),"\n",(0,o.jsxs)(t.p,{children:["KADAI operates using Tasks, Classifications, and Workbaskets.\nAdditional entities are Attachments, ObjectReferences, and WorkbasketAccessIds.\nThe entities are stored in the ",(0,o.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/configuration/database",children:"configured database"}),".\nYou can see the detailed data model ",(0,o.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/reference/dataModel",children:"here"}),"."]}),"\n",(0,o.jsx)(s(),{content:l}),"\n",(0,o.jsx)(t.h3,{id:"task",children:"Task"}),"\n",(0,o.jsx)(t.p,{children:"The Task entity represents a human task that should be worked on by one of the responsible users.\nA Task is identified by unique id that cannot be changed after creation."}),"\n",(0,o.jsx)(t.p,{children:"Each Task has exactly one Classification and an arbitrary number of Attachments. Each Attachment also has a Classification. These Classifications categorize the Task and the Attachment. They also determine some of their properties. For example, you can prioritize Tasks differently by using different Classifications. To compute the priority of a Task, take the greatest priority of the Classification of the Task and the Classifications of its Attachments."}),"\n",(0,o.jsx)(t.p,{children:"The Task is assigned to exactly one Workbasket. A Workbasket describes the group of people who can work on this Task. This way, different users have access to different Tasks."}),"\n",(0,o.jsxs)(t.p,{children:["A Task goes through different states during its existence.\nThe Task Lifecycle describes the states and their transitions.\nYou can read more about it ",(0,o.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/core-concepts/taskLifecycle",children:"here"})]}),"\n",(0,o.jsx)(t.h3,{id:"objectreference",children:"ObjectReference"}),"\n",(0,o.jsx)(t.p,{children:"ObjectReference refers to a Task related document or any other real world object that the Task is about. The document is identified by the value field of ObjectReference. Each Task must have one primary ObjectReference. The primary ObjectReference defines the main involved document. A Task can have several secondary ObjectReferences that are also relevant for the Task."}),"\n",(0,o.jsx)(t.h3,{id:"attachment",children:"Attachment"}),"\n",(0,o.jsx)(t.p,{children:"Similar to ObjectReference, an Attachment describes a Task related document.\nWhile an ObjectReference only refers to an object,\nan Attachment describes it using different attributes.\nThat's why an Attachment has a Classification and an ObjectReference.\nAn example Attachment can describe a letter that leads to the Task creation.\nIn this case,\nthe ObjectReference of the Attachment will refer to the letter\nstored in a different system."}),"\n",(0,o.jsx)(t.h3,{id:"classification",children:"Classification"}),"\n",(0,o.jsx)(t.p,{children:'The Classification entity represents a category of Tasks.\nThe Tasks with the same Classification have some common attributes.\nFor example, the due date and priority of a Task is computed using its Classification.\nA Classification can be identified by its id.\nAlternatively, a Classification has a key which identifies it in a certain domain.\nThis way, the Classification can be determined using the (key, domain) pair.\nThere can be multiple Classifications with the same key in different domains.\nFor each key, there is a master Classification.\nA master Classification has a domain value "" (empty String).\nIf a Classification is not found in a given domain,\nthen the master Classification with the same key is returned.\nThe successful deletion of the master Classification means the deletion of all Classifications with that key.'}),"\n",(0,o.jsx)(t.h3,{id:"workbasket",children:"Workbasket"}),"\n",(0,o.jsx)(t.p,{children:"A Workbasket is a list of Tasks.\nIt's used to manage the group of people who can work on the Tasks in this list.\nEach user has access to a set of Workbaskets.\nFor example, each team member has access to the Workbasket of the team.\nSimilar to a Classification,\na Workbasket can be identified either by id or by the (key, domain) pair.\nThere can be multiple Workbaskets with the same key but different domains."}),"\n",(0,o.jsxs)(t.p,{children:["There are different options for accessing a Workbasket. You can read more about them and other permissions ",(0,o.jsx)(t.a,{href:"./securityAndPermissions#access-to-workbaskets",children:"here"}),"."]}),"\n",(0,o.jsx)(t.p,{children:"KADAI provides different options for choosing a Workbasket for a specific Task.\nFor example, there is the Task Routing feature.\nTask Routing allows implementing custom logic for determining the Workbasket for a Task."}),"\n",(0,o.jsx)(t.h3,{id:"workbasketaccessitem",children:"WorkbasketAccessItem"}),"\n",(0,o.jsxs)(t.p,{children:["A WorkbasketAccessItem specifies permissions for a given Workbasket and a specific user or group. You can read more about different permissions ",(0,o.jsx)(t.a,{href:"./securityAndPermissions#access-to-workbaskets",children:"here"}),". There is also an ",(0,o.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/core-concepts/securityAndPermissions#example-workbasketaccesslist-table",children:"example table"})," containing WorkbasketAccessItems."]}),"\n",(0,o.jsx)(t.h3,{id:"summary-objects",children:"Summary Objects"}),"\n",(0,o.jsx)(t.p,{children:"KADAI provides the possibility to add large attributes to the entities. To minimize the computational load created by these large attributes, KADAI introduces summaries of its entities. Summary objects contain only the most important information. They are light versions of the original object. For example, TaskSummary doesn't contain Attachments or SecondaryObjectReferences. When asked to return a List of entities, our APIs return summaries of the objects. You can always get the full object using the information from the summary of this object."}),"\n",(0,o.jsx)(t.h2,{id:"operations-on-entities",children:"Operations on entities"}),"\n",(0,o.jsx)(t.p,{children:"KADAI provides the following operations on its entities:"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsx)(t.li,{children:"Creating"}),"\n",(0,o.jsx)(t.li,{children:"Updating"}),"\n",(0,o.jsx)(t.li,{children:"Deleting"}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/features/queriesFilteringAndSorting",children:"Querying"})," (additionally allows filtering and sorting entities by properties)"]}),"\n"]}),"\n",(0,o.jsxs)(t.p,{children:["You can read technical details about operating on entities ",(0,o.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/core-concepts/javaApiUsage",children:"using the Java-API"})," and ",(0,o.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/core-concepts/restApi",children:"using the REST-API"}),"."]}),"\n",(0,o.jsx)(t.h2,{id:"list-of-important-features",children:"List of important features"}),"\n",(0,o.jsxs)(t.p,{children:["You can look up important features of KADAI ",(0,o.jsx)(t.a,{href:"../../category/features",children:"here"}),"."]})]})}function y(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},8478:(e,t,n)=>{n.r(t),n.d(t,{default:()=>i});n(6540);var r=n(2303),o=n(4848);function i(e){let{children:t,fallback:n}=e;return(0,r.A)()?(0,o.jsx)(o.Fragment,{children:t?.()}):n??null}},9734:(e,t,n)=>{var r=n(8478),o=n(6540);function i(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var a=i(r),s=i(o),l=function(){return l=Object.assign||function(e){for(var t,n=1,r=arguments.length;n div {\n margin-left: auto;\n margin-right: auto;\n border: 1px solid transparent;\n min-width: 180px;\n}\n");var d=function(e){var t=e.content,n=e.maxHeight,r=e.autoFit,i=e.autoCrop,a=e.autoOrigin,d=e.allowZoomOut,c=e.allowZoomIn,m=e.checkVisibleState,h=e.toolbarPosition,x=e.toolbarNohide,u=e.toolbarButtons,y=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{n.d(t,{R:()=>a,x:()=>s});var r=n(6540);const o={},i=r.createContext(o);function a(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/373999ad.9bee414e.js b/assets/js/373999ad.9bee414e.js deleted file mode 100644 index 734ba94..0000000 --- a/assets/js/373999ad.9bee414e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[6268],{7272:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>h,contentTitle:()=>c,default:()=>y,frontMatter:()=>d,metadata:()=>m,toc:()=>x});var r=n(4848),o=n(8453),i=n(9734),a=n.n(i);const s='\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n',l='\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n',d={sidebar_position:1},c="Overview",m={id:"user-guide/core-concepts/overview",title:"Overview",description:"KADAI is an open source Task Management System. It includes defining and creating tasks and keeping track of their execution, as well as distributing them to their responsible users. KADAI also offers options for detailed descriptions of each task using attachments, object references, and many other properties. In the following article, the basic entities of KADAI and related concepts are explained.",source:"@site/docs/user-guide/core-concepts/overview.md",sourceDirName:"user-guide/core-concepts",slug:"/user-guide/core-concepts/overview",permalink:"/kadai-doc/docs/user-guide/core-concepts/overview",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"userSidebar",previous:{title:"Core Concepts",permalink:"/kadai-doc/docs/category/core-concepts"},next:{title:"Task Lifecycle",permalink:"/kadai-doc/docs/user-guide/core-concepts/taskLifecycle"}},h={},x=[{value:"KADAI Entities",id:"kadai-entities",level:2},{value:"Task",id:"task",level:3},{value:"ObjectReference",id:"objectreference",level:3},{value:"Attachment",id:"attachment",level:3},{value:"Classification",id:"classification",level:3},{value:"Workbasket",id:"workbasket",level:3},{value:"WorkbasketAccessItem",id:"workbasketaccessitem",level:3},{value:"Summary Objects",id:"summary-objects",level:3},{value:"Operations on entities",id:"operations-on-entities",level:2},{value:"List of important features",id:"list-of-important-features",level:2}];function u(e){const t={a:"a",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"overview",children:"Overview"})}),"\n","\n",(0,r.jsx)(t.p,{children:"KADAI is an open source Task Management System. It includes defining and creating tasks and keeping track of their execution, as well as distributing them to their responsible users. KADAI also offers options for detailed descriptions of each task using attachments, object references, and many other properties. In the following article, the basic entities of KADAI and related concepts are explained."}),"\n",(0,r.jsxs)(t.p,{children:["To provide its functionality, KADAI consists of different components.\nThey are shown in the diagram below.\nAs different components provide different features,\nthe description of relevant modules can be found ",(0,r.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/reference/modules",children:"here"}),".\nYou can read more about the Java Library and its usage ",(0,r.jsx)(t.a,{href:"./javaApiUsage",children:"here"}),"."]}),"\n",(0,r.jsx)(a(),{content:l}),"\n",(0,r.jsx)(t.h2,{id:"kadai-entities",children:"KADAI Entities"}),"\n",(0,r.jsxs)(t.p,{children:["All KADAI Entities can be found in the Java API. You can read more about our Java API ",(0,r.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/core-concepts/javaApiUsage",children:"here"}),". For better readability, entities are capitalized in the documentation."]}),"\n",(0,r.jsxs)(t.p,{children:["KADAI operates using Tasks, Classifications, and Workbaskets.\nAdditional entities are Attachments, ObjectReferences, and WorkbasketAccessIds.\nThe entities are stored in the ",(0,r.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/configuration/database",children:"configured database"}),".\nYou can see the detailed data model ",(0,r.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/reference/dataModel",children:"here"}),"."]}),"\n",(0,r.jsx)(a(),{content:s}),"\n",(0,r.jsx)(t.h3,{id:"task",children:"Task"}),"\n",(0,r.jsx)(t.p,{children:"The Task entity represents a human task that should be worked on by one of the responsible users.\nA Task is identified by unique id that cannot be changed after creation."}),"\n",(0,r.jsx)(t.p,{children:"Each Task has exactly one Classification and an arbitrary number of Attachments. Each Attachment also has a Classification. These Classifications categorize the Task and the Attachment. They also determine some of their properties. For example, you can prioritize Tasks differently by using different Classifications. To compute the priority of a Task, take the greatest priority of the Classification of the Task and the Classifications of its Attachments."}),"\n",(0,r.jsx)(t.p,{children:"The Task is assigned to exactly one Workbasket. A Workbasket describes the group of people who can work on this Task. This way, different users have access to different Tasks."}),"\n",(0,r.jsxs)(t.p,{children:["A Task goes through different states during its existence.\nThe Task Lifecycle describes the states and their transitions.\nYou can read more about it ",(0,r.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/core-concepts/taskLifecycle",children:"here"})]}),"\n",(0,r.jsx)(t.h3,{id:"objectreference",children:"ObjectReference"}),"\n",(0,r.jsx)(t.p,{children:"ObjectReference refers to a Task related document or any other real world object that the Task is about. The document is identified by the value field of ObjectReference. Each Task must have one primary ObjectReference. The primary ObjectReference defines the main involved document. A Task can have several secondary ObjectReferences that are also relevant for the Task."}),"\n",(0,r.jsx)(t.h3,{id:"attachment",children:"Attachment"}),"\n",(0,r.jsx)(t.p,{children:"Similar to ObjectReference, an Attachment describes a Task related document.\nWhile an ObjectReference only refers to an object,\nan Attachment describes it using different attributes.\nThat's why an Attachment has a Classification and an ObjectReference.\nAn example Attachment can describe a letter that leads to the Task creation.\nIn this case,\nthe ObjectReference of the Attachment will refer to the letter\nstored in a different system."}),"\n",(0,r.jsx)(t.h3,{id:"classification",children:"Classification"}),"\n",(0,r.jsx)(t.p,{children:'The Classification entity represents a category of Tasks.\nThe Tasks with the same Classification have some common attributes.\nFor example, the due date and priority of a Task is computed using its Classification.\nA Classification can be identified by its id.\nAlternatively, a Classification has a key which identifies it in a certain domain.\nThis way, the Classification can be determined using the (key, domain) pair.\nThere can be multiple Classifications with the same key in different domains.\nFor each key, there is a master Classification.\nA master Classification has a domain value "" (empty String).\nIf a Classification is not found in a given domain,\nthen the master Classification with the same key is returned.\nThe successful deletion of the master Classification means the deletion of all Classifications with that key.'}),"\n",(0,r.jsx)(t.h3,{id:"workbasket",children:"Workbasket"}),"\n",(0,r.jsx)(t.p,{children:"A Workbasket is a list of Tasks.\nIt's used to manage the group of people who can work on the Tasks in this list.\nEach user has access to a set of Workbaskets.\nFor example, each team member has access to the Workbasket of the team.\nSimilar to a Classification,\na Workbasket can be identified either by id or by the (key, domain) pair.\nThere can be multiple Workbaskets with the same key but different domains."}),"\n",(0,r.jsxs)(t.p,{children:["There are different options for accessing a Workbasket. You can read more about them and other permissions ",(0,r.jsx)(t.a,{href:"./securityAndPermissions#access-to-workbaskets",children:"here"}),"."]}),"\n",(0,r.jsx)(t.p,{children:"KADAI provides different options for choosing a Workbasket for a specific Task.\nFor example, there is the Task Routing feature.\nTask Routing allows implementing custom logic for determining the Workbasket for a Task."}),"\n",(0,r.jsx)(t.h3,{id:"workbasketaccessitem",children:"WorkbasketAccessItem"}),"\n",(0,r.jsxs)(t.p,{children:["A WorkbasketAccessItem specifies permissions for a given Workbasket and a specific user or group. You can read more about different permissions ",(0,r.jsx)(t.a,{href:"./securityAndPermissions#access-to-workbaskets",children:"here"}),". There is also an ",(0,r.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/core-concepts/securityAndPermissions#example-workbasketaccesslist-table",children:"example table"})," containing WorkbasketAccessItems."]}),"\n",(0,r.jsx)(t.h3,{id:"summary-objects",children:"Summary Objects"}),"\n",(0,r.jsx)(t.p,{children:"KADAI provides the possibility to add large attributes to the entities. To minimize the computational load created by these large attributes, KADAI introduces summaries of its entities. Summary objects contain only the most important information. They are light versions of the original object. For example, TaskSummary doesn't contain Attachments or SecondaryObjectReferences. When asked to return a List of entities, our APIs return summaries of the objects. You can always get the full object using the information from the summary of this object."}),"\n",(0,r.jsx)(t.h2,{id:"operations-on-entities",children:"Operations on entities"}),"\n",(0,r.jsx)(t.p,{children:"KADAI provides the following operations on its entities:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"Creating"}),"\n",(0,r.jsx)(t.li,{children:"Updating"}),"\n",(0,r.jsx)(t.li,{children:"Deleting"}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/features/queriesFilteringAndSorting",children:"Querying"})," (additionally allows filtering and sorting entities by properties)"]}),"\n"]}),"\n",(0,r.jsxs)(t.p,{children:["You can read technical details about operating on entities ",(0,r.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/core-concepts/javaApiUsage",children:"using the Java-API"})," and ",(0,r.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/core-concepts/restApi",children:"using the REST-API"}),"."]}),"\n",(0,r.jsx)(t.h2,{id:"list-of-important-features",children:"List of important features"}),"\n",(0,r.jsxs)(t.p,{children:["You can look up important features of KADAI ",(0,r.jsx)(t.a,{href:"../../category/features",children:"here"}),"."]})]})}function y(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}},8478:(e,t,n)=>{n.r(t),n.d(t,{default:()=>i});n(6540);var r=n(2303),o=n(4848);function i(e){let{children:t,fallback:n}=e;return(0,r.A)()?(0,o.jsx)(o.Fragment,{children:t?.()}):n??null}},9734:(e,t,n)=>{var r=n(8478),o=n(6540);function i(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var a=i(r),s=i(o),l=function(){return l=Object.assign||function(e){for(var t,n=1,r=arguments.length;n div {\n margin-left: auto;\n margin-right: auto;\n border: 1px solid transparent;\n min-width: 180px;\n}\n");var d=function(e){var t=e.content,n=e.maxHeight,r=e.autoFit,i=e.autoCrop,a=e.autoOrigin,d=e.allowZoomOut,c=e.allowZoomIn,m=e.checkVisibleState,h=e.toolbarPosition,x=e.toolbarNohide,u=e.toolbarButtons,y=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o{n.d(t,{R:()=>a,x:()=>s});var r=n(6540);const o={},i=r.createContext(o);function a(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/393be207.2759f6f0.js b/assets/js/393be207.2759f6f0.js new file mode 100644 index 0000000..8471359 --- /dev/null +++ b/assets/js/393be207.2759f6f0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[4134],{591:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>p,default:()=>l,frontMatter:()=>s,metadata:()=>a,toc:()=>d});const a=JSON.parse('{"type":"mdx","permalink":"/kadai-doc/markdown-page","source":"@site/src/pages/markdown-page.md","title":"Markdown page example","description":"You don\'t need React to write simple standalone pages.","frontMatter":{"title":"Markdown page example"},"unlisted":false}');var o=n(4848),r=n(8453);const s={title:"Markdown page example"},p="Markdown page example",c={},d=[];function i(e){const t={h1:"h1",header:"header",p:"p",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"markdown-page-example",children:"Markdown page example"})}),"\n",(0,o.jsx)(t.p,{children:"You don't need React to write simple standalone pages."})]})}function l(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(i,{...e})}):i(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>p});var a=n(6540);const o={},r=a.createContext(o);function s(e){const t=a.useContext(r);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function p(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),a.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/393be207.d1e95cb1.js b/assets/js/393be207.d1e95cb1.js deleted file mode 100644 index 3e8cb22..0000000 --- a/assets/js/393be207.d1e95cb1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[4134],{633:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>l,frontMatter:()=>r,metadata:()=>p,toc:()=>d});var a=n(4848),o=n(8453);const r={title:"Markdown page example"},s="Markdown page example",p={type:"mdx",permalink:"/kadai-doc/markdown-page",source:"@site/src/pages/markdown-page.md",title:"Markdown page example",description:"You don't need React to write simple standalone pages.",frontMatter:{title:"Markdown page example"},unlisted:!1},c={},d=[];function i(e){const t={h1:"h1",header:"header",p:"p",...(0,o.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.header,{children:(0,a.jsx)(t.h1,{id:"markdown-page-example",children:"Markdown page example"})}),"\n",(0,a.jsx)(t.p,{children:"You don't need React to write simple standalone pages."})]})}function l(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(i,{...e})}):i(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>p});var a=n(6540);const o={},r=a.createContext(o);function s(e){const t=a.useContext(r);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function p(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),a.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/42887586.7d83daa5.js b/assets/js/42887586.7d83daa5.js new file mode 100644 index 0000000..ec7c603 --- /dev/null +++ b/assets/js/42887586.7d83daa5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[847],{2519:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>u,frontMatter:()=>o,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"user-guide/reference/modules","title":"Modules","description":"Different functionality of KADAI can be found in different modules. In the following article, the relevant modules for external usage are explained. The modules for internal use only are left out of the article.","source":"@site/docs/user-guide/reference/modules.md","sourceDirName":"user-guide/reference","slug":"/user-guide/reference/modules","permalink":"/kadai-doc/docs/user-guide/reference/modules","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":4,"frontMatter":{"sidebar_position":4},"sidebar":"userSidebar","previous":{"title":"Data Model","permalink":"/kadai-doc/docs/user-guide/reference/dataModel"},"next":{"title":"Adapter","permalink":"/kadai-doc/docs/category/adapter"}}');var s=i(4848),t=i(8453);const o={sidebar_position:4},l="Modules",a={},d=[{value:"lib",id:"lib",level:2},{value:"rest",id:"rest",level:2},{value:"history",id:"history",level:2},{value:"routing",id:"routing",level:2},{value:"web",id:"web",level:2}];function c(e){const n={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"modules",children:"Modules"})}),"\n",(0,s.jsx)(n.p,{children:"Different functionality of KADAI can be found in different modules. In the following article, the relevant modules for external usage are explained. The modules for internal use only are left out of the article."}),"\n",(0,s.jsx)(n.h2,{id:"lib",children:"lib"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"kadai-core"})," provides the main functionality of KADAI. You can read more about kadai-core ",(0,s.jsx)(n.a,{href:"../core-concepts/javaApiUsage",children:"here"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"kadai-spring"})," configures Spring so that KADAI can be easily integrated"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"kadai-spring-example"})," provides an example usage of kadai-spring"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"kadai-cdi"})," uses dependency injection of java(CDI) for configuring KADAI"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"kadai-cdi-example"})," provides an example usage of kadai-cdi"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"rest",children:"rest"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"kadai-rest-spring"})," embends KADAI in a spring-boot application. It exposes the Java API by setting up a corresponding REST-API"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"kadai-rest-spring-example-boot"})," provides an example application that uses kadai-rest-spring"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"kadai-rest-spring-example-wildfly"})," provides an example application that can be deployed on a Wildfly server"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"history",children:"history"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"kadai-loghistory-provider"})," implements the history SPI (Service Provider Interface). It uses slf4j to log every event"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"kadai-simplehistory-provider"})," implements the history SPI (Service Provider Interface). It stores every history event in the KADAI database"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"kadai-simplehistory-rest-spring"})," implements a REST service to expose the functionality of kadai-simplehistory-provider"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"routing",children:"routing"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"kadai-spi-routing-dmn-router"})," allows Task routing according to automated rules"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"kadai-routing-rest"})," implements a REST service to expose the functionality of kadai-spi-routing-dmn-router"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"web",children:"web"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"frontend of KADAI"}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>l});var r=i(6540);const s={},t=r.createContext(s);function o(e){const n=r.useContext(t);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/42887586.8ab2ca57.js b/assets/js/42887586.8ab2ca57.js deleted file mode 100644 index a186e21..0000000 --- a/assets/js/42887586.8ab2ca57.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[847],{2175:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>u,frontMatter:()=>t,metadata:()=>l,toc:()=>d});var r=i(4848),s=i(8453);const t={sidebar_position:4},o="Modules",l={id:"user-guide/reference/modules",title:"Modules",description:"Different functionality of KADAI can be found in different modules. In the following article, the relevant modules for external usage are explained. The modules for internal use only are left out of the article.",source:"@site/docs/user-guide/reference/modules.md",sourceDirName:"user-guide/reference",slug:"/user-guide/reference/modules",permalink:"/kadai-doc/docs/user-guide/reference/modules",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:4,frontMatter:{sidebar_position:4},sidebar:"userSidebar",previous:{title:"Data Model",permalink:"/kadai-doc/docs/user-guide/reference/dataModel"},next:{title:"Adapter",permalink:"/kadai-doc/docs/category/adapter"}},a={},d=[{value:"lib",id:"lib",level:2},{value:"rest",id:"rest",level:2},{value:"history",id:"history",level:2},{value:"routing",id:"routing",level:2},{value:"web",id:"web",level:2}];function c(e){const n={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"modules",children:"Modules"})}),"\n",(0,r.jsx)(n.p,{children:"Different functionality of KADAI can be found in different modules. In the following article, the relevant modules for external usage are explained. The modules for internal use only are left out of the article."}),"\n",(0,r.jsx)(n.h2,{id:"lib",children:"lib"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"kadai-core"})," provides the main functionality of KADAI. You can read more about kadai-core ",(0,r.jsx)(n.a,{href:"../core-concepts/javaApiUsage",children:"here"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"kadai-spring"})," configures Spring so that KADAI can be easily integrated"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"kadai-spring-example"})," provides an example usage of kadai-spring"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"kadai-cdi"})," uses dependency injection of java(CDI) for configuring KADAI"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"kadai-cdi-example"})," provides an example usage of kadai-cdi"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"rest",children:"rest"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"kadai-rest-spring"})," embends KADAI in a spring-boot application. It exposes the Java API by setting up a corresponding REST-API"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"kadai-rest-spring-example-boot"})," provides an example application that uses kadai-rest-spring"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"kadai-rest-spring-example-wildfly"})," provides an example application that can be deployed on a Wildfly server"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"history",children:"history"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"kadai-loghistory-provider"})," implements the history SPI (Service Provider Interface). It uses slf4j to log every event"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"kadai-simplehistory-provider"})," implements the history SPI (Service Provider Interface). It stores every history event in the KADAI database"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"kadai-simplehistory-rest-spring"})," implements a REST service to expose the functionality of kadai-simplehistory-provider"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"routing",children:"routing"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"kadai-spi-routing-dmn-router"})," allows Task routing according to automated rules"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"kadai-routing-rest"})," implements a REST service to expose the functionality of kadai-spi-routing-dmn-router"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"web",children:"web"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"frontend of KADAI"}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>l});var r=i(6540);const s={},t=r.createContext(s);function o(e){const n=r.useContext(t);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/48eab233.ccacc2ff.js b/assets/js/48eab233.ccacc2ff.js new file mode 100644 index 0000000..223edce --- /dev/null +++ b/assets/js/48eab233.ccacc2ff.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[199],{6175:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>c});const a=JSON.parse('{"id":"user-guide/features/monitoring","title":"Monitoring","description":"Monitoring is a real time observation of the current state of work.","source":"@site/docs/user-guide/features/monitoring.md","sourceDirName":"user-guide/features","slug":"/user-guide/features/monitoring","permalink":"/kadai-doc/docs/user-guide/features/monitoring","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":4,"frontMatter":{"sidebar_position":4},"sidebar":"userSidebar","previous":{"title":"KADAI Jobs","permalink":"/kadai-doc/docs/user-guide/features/jobs"},"next":{"title":"Users","permalink":"/kadai-doc/docs/user-guide/features/users"}}');var n=s(4848),i=s(8453);const r={sidebar_position:4},o="Monitoring",d={},c=[];function u(e){const t={a:"a",code:"code",h1:"h1",header:"header",img:"img",p:"p",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"monitoring",children:"Monitoring"})}),"\n",(0,n.jsx)(t.p,{children:"Monitoring is a real time observation of the current state of work.\nIt allows viewing and evaluating the status of the team,\nthus relevant for team lead to monitor whether all tasks are completed on time.\nMonitoring also provides the possibility\nto see what work is due in the next few days so that it can be taken into account when staffing."}),"\n",(0,n.jsx)(t.p,{children:"The data shown by the monitoring includes Tasks and their attributes, like Workbaskets, status, age,\netc. Tasks fulfilling certain criteria are counted\nto create a statistic representing all current Tasks and their attributes.\nAn example of this can be seen below."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Tasks by Workbasket and due date: Table",src:s(7076).A+"",width:"1907",height:"550"})}),"\n",(0,n.jsx)(t.p,{children:"This screenshot shows one of the representations that can be created by the Monitor. It's a table that sums up the number of Tasks by the day of due date and their Workbasket. This table is visualized in the diagram provided by KADAI UI."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Tasks by Workbasket and due date: Diagram",src:s(2687).A+"",width:"1636",height:"1030"})}),"\n",(0,n.jsxs)(t.p,{children:["There are other options for filtering and aggregating Tasks in the KADAI Monitor.\nYou can see them in detail\nby switching tabs in the ",(0,n.jsx)(t.a,{href:"https://kadai-io.azurewebsites.net/kadai/#/kadai/monitor/tasks-priority",children:"monitoring UI"})," as part of our demo application.\nThe username and password for the demo application are ",(0,n.jsx)(t.code,{children:"admin"})," and ",(0,n.jsx)(t.code,{children:"admin"}),"."]}),"\n",(0,n.jsx)(t.p,{children:"Some data is additionally visualized.\nFor example, you can see Tasks divided by their status in a pie chart in KADAI UI:"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Tasks by Status: Diagram",src:s(622).A+"",width:"1393",height:"845"})})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},2687:(e,t,s)=>{s.d(t,{A:()=>a});const a=s.p+"assets/images/monitoring-by-workbasket-and-due-date-visual-0438ce173a174952b1c287c528412b71.png"},7076:(e,t,s)=>{s.d(t,{A:()=>a});const a=s.p+"assets/images/monitoring-by-workbasket-and-due-date-8bcf3aa3df82d0dffd5489771421c30a.png"},622:(e,t,s)=>{s.d(t,{A:()=>a});const a=s.p+"assets/images/monitoring-tasks-by-status-2357dec5ae9ab5792a7048457a1a8fe2.png"},8453:(e,t,s)=>{s.d(t,{R:()=>r,x:()=>o});var a=s(6540);const n={},i=a.createContext(n);function r(e){const t=a.useContext(i);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),a.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/48eab233.ef7df176.js b/assets/js/48eab233.ef7df176.js deleted file mode 100644 index 7e2f304..0000000 --- a/assets/js/48eab233.ef7df176.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[199],{7898:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>i,metadata:()=>o,toc:()=>c});var s=n(4848),a=n(8453);const i={sidebar_position:4},r="Monitoring",o={id:"user-guide/features/monitoring",title:"Monitoring",description:"Monitoring is a real time observation of the current state of work.",source:"@site/docs/user-guide/features/monitoring.md",sourceDirName:"user-guide/features",slug:"/user-guide/features/monitoring",permalink:"/kadai-doc/docs/user-guide/features/monitoring",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:4,frontMatter:{sidebar_position:4},sidebar:"userSidebar",previous:{title:"KADAI Jobs",permalink:"/kadai-doc/docs/user-guide/features/jobs"},next:{title:"Users",permalink:"/kadai-doc/docs/user-guide/features/users"}},d={},c=[];function u(e){const t={a:"a",code:"code",h1:"h1",header:"header",img:"img",p:"p",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"monitoring",children:"Monitoring"})}),"\n",(0,s.jsx)(t.p,{children:"Monitoring is a real time observation of the current state of work.\nIt allows viewing and evaluating the status of the team,\nthus relevant for team lead to monitor whether all tasks are completed on time.\nMonitoring also provides the possibility\nto see what work is due in the next few days so that it can be taken into account when staffing."}),"\n",(0,s.jsx)(t.p,{children:"The data shown by the monitoring includes Tasks and their attributes, like Workbaskets, status, age,\netc. Tasks fulfilling certain criteria are counted\nto create a statistic representing all current Tasks and their attributes.\nAn example of this can be seen below."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Tasks by Workbasket and due date: Table",src:n(7076).A+"",width:"1907",height:"550"})}),"\n",(0,s.jsx)(t.p,{children:"This screenshot shows one of the representations that can be created by the Monitor. It's a table that sums up the number of Tasks by the day of due date and their Workbasket. This table is visualized in the diagram provided by KADAI UI."}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Tasks by Workbasket and due date: Diagram",src:n(2687).A+"",width:"1636",height:"1030"})}),"\n",(0,s.jsxs)(t.p,{children:["There are other options for filtering and aggregating Tasks in the KADAI Monitor.\nYou can see them in detail\nby switching tabs in the ",(0,s.jsx)(t.a,{href:"https://kadai-io.azurewebsites.net/kadai/#/kadai/monitor/tasks-priority",children:"monitoring UI"})," as part of our demo application.\nThe username and password for the demo application are ",(0,s.jsx)(t.code,{children:"admin"})," and ",(0,s.jsx)(t.code,{children:"admin"}),"."]}),"\n",(0,s.jsx)(t.p,{children:"Some data is additionally visualized.\nFor example, you can see Tasks divided by their status in a pie chart in KADAI UI:"}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Tasks by Status: Diagram",src:n(622).A+"",width:"1393",height:"845"})})]})}function h(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},2687:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/monitoring-by-workbasket-and-due-date-visual-0438ce173a174952b1c287c528412b71.png"},7076:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/monitoring-by-workbasket-and-due-date-8bcf3aa3df82d0dffd5489771421c30a.png"},622:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/monitoring-tasks-by-status-2357dec5ae9ab5792a7048457a1a8fe2.png"},8453:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>o});var s=n(6540);const a={},i=s.createContext(a);function r(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5447c93a.653d4fde.js b/assets/js/5447c93a.653d4fde.js deleted file mode 100644 index eebd3d5..0000000 --- a/assets/js/5447c93a.653d4fde.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[7671],{4180:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>s,metadata:()=>r,toc:()=>d});var t=a(4848),i=a(8453);const s={sidebar_position:1},o="Database",r={id:"user-guide/configuration/database",title:"Database",description:"To use KADAI, you need to create a database yourself, and then specify it through the DataSource. You can see the list of the supported databases here.",source:"@site/docs/user-guide/configuration/database.md",sourceDirName:"user-guide/configuration",slug:"/user-guide/configuration/database",permalink:"/kadai-doc/docs/user-guide/configuration/database",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"userSidebar",previous:{title:"Configuration",permalink:"/kadai-doc/docs/category/configuration"},next:{title:"Security",permalink:"/kadai-doc/docs/user-guide/configuration/security"}},c={},d=[{value:"DataSource",id:"datasource",level:3},{value:"SchemaName and Prefilling the Database",id:"schemaname-and-prefilling-the-database",level:3},{value:"Connection options",id:"connection-options",level:2}];function l(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"database",children:"Database"})}),"\n",(0,t.jsxs)(n.p,{children:["To use KADAI, you need to create a database yourself, and then specify it through the ",(0,t.jsx)(n.a,{href:"#datasource",children:"DataSource"}),". You can see the list of the supported databases ",(0,t.jsx)(n.a,{href:"/kadai-doc/docs/user-guide/getting-started/supportedEnvironments",children:"here"}),".\nThe recommended page size for the database is 32 k. It's necessary to create the database schema. The sort order of query results can be changed by the collating sequence specified in database creation. The default for most databases is a case-sensitive sort order. If you want query results to be sorted case insensitively, you should specify an appropriate collating sequence."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Page size: 32k"}),"\n",(0,t.jsx)(n.li,{children:"Encoding: UTF-8"}),"\n",(0,t.jsxs)(n.li,{children:["Collating sequence examples:","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"db2 (case sensitive): IDENTITY"}),"\n",(0,t.jsx)(n.li,{children:"postgres (case sensitive): de_DE.UTF-8"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Example db2:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"CREATE DATABASE USING CODESET UTF-8 COLLATE USING IDENTITY PAGESIZE 32 K \n\n"})}),"\n",(0,t.jsx)(n.p,{children:"Example Postgres:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"CREATE DATABASE WITH ENCODING 'UTF8' LC_COLLATE='de_DE.UTF-8';\n"})}),"\n",(0,t.jsx)(n.h3,{id:"datasource",children:"DataSource"}),"\n",(0,t.jsx)(n.p,{children:"KADAI connects to the database via a DataSource. It does not support XADataSources for connections to databases. The DataSource can be specified during the creation of KadaiConfiguration. For example, as following:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"new KadaiConfiguration.Builder(dataSource, true, schemaName, false)\n .initKadaiProperties(propertiesFileName, delimiter)\n .build();\n"})}),"\n",(0,t.jsxs)(n.p,{children:["In Spring environment, the DataSource has standard spring options that can be configured in the ",(0,t.jsx)(n.code,{children:"application.properties"})," file. You can read more about them in the Spring documentation. Here is an example:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"spring.datasource.url=jdbc:h2:mem:kadai;NON_KEYWORDS=KEY,VALUE;IGNORECASE=TRUE;LOCK_MODE=0;\nspring.datasource.driverClassName=org.h2.Driver\nspring.datasource.username=sa\nspring.datasource.password=sa\n"})}),"\n",(0,t.jsx)(n.h3,{id:"schemaname-and-prefilling-the-database",children:"SchemaName and Prefilling the Database"}),"\n",(0,t.jsxs)(n.p,{children:['Additionally to the DataSource, you can also configure the schemaName.\nIt can be specified during the creation of KadaiConfiguration, as seen in the example above.\nThe default schemaName is `KADAI.\nThe schemaName can also be changed by setting the parameter "kadai.schemaName"\nin the ',(0,t.jsx)(n.code,{children:"application.properties"})," file:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"kadai.schemaName=KADAI\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Additionally to that, you can configure KADAI so that it prefills the database with sample data.\nYou can find sample data in the folder ",(0,t.jsx)(n.code,{children:"common/kadai-common-data/src/main/resources/sql/sample-data"}),'.\nTo do that, set the "generateSampleData" property in the ',(0,t.jsx)(n.code,{children:"application.properties"})," file to true:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"generateSampleData=true\n"})}),"\n",(0,t.jsx)(n.h2,{id:"connection-options",children:"Connection options"}),"\n",(0,t.jsx)(n.p,{children:"KADAI supports three connection management modes: PARTICIPATE, AUTOCOMMIT and EXPLICIT. You can specify the connection management mode when creating KadaiEngine using"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"KadaiEngine buildKadaiEngine (KadaiConfiguration configuration, ConnectionManagementMode connectionManagementMode)\n"})}),"\n",(0,t.jsx)(n.p,{children:"The default mode is PARTICIPATE."}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"mode"}),(0,t.jsx)(n.th,{children:"description"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"PARTICIPATE"}),(0,t.jsx)(n.td,{children:"KADAI participates in surrounding global transactions. It acquires and releases connections at begin / end of each API call and relies on the infrastructure to do the commit."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"AUTOCOMMIT"}),(0,t.jsx)(n.td,{children:"KADAI commits each single API call separately."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"EXPLICIT"}),(0,t.jsx)(n.td,{children:"KADAI doesn't acquire, commit or close connections. The client is responsible for opening a connection, passing it to KADAI, committing or rolling it back. In order to close a connection, the client has to call either KadaiEngine.closeConnection() or KadaiEngine.setConnection(null)."})]})]})]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,n,a)=>{a.d(n,{R:()=>o,x:()=>r});var t=a(6540);const i={},s=t.createContext(i);function o(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5447c93a.dc2831d3.js b/assets/js/5447c93a.dc2831d3.js new file mode 100644 index 0000000..7feb9fb --- /dev/null +++ b/assets/js/5447c93a.dc2831d3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[7671],{6210:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"user-guide/configuration/database","title":"Database","description":"To use KADAI, you need to create a database yourself, and then specify it through the DataSource. You can see the list of the supported databases here.","source":"@site/docs/user-guide/configuration/database.md","sourceDirName":"user-guide/configuration","slug":"/user-guide/configuration/database","permalink":"/kadai-doc/docs/user-guide/configuration/database","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1},"sidebar":"userSidebar","previous":{"title":"Configuration","permalink":"/kadai-doc/docs/category/configuration"},"next":{"title":"Security","permalink":"/kadai-doc/docs/user-guide/configuration/security"}}');var i=a(4848),s=a(8453);const o={sidebar_position:1},r="Database",c={},d=[{value:"DataSource",id:"datasource",level:3},{value:"SchemaName and Prefilling the Database",id:"schemaname-and-prefilling-the-database",level:3},{value:"Connection options",id:"connection-options",level:2}];function l(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"database",children:"Database"})}),"\n",(0,i.jsxs)(n.p,{children:["To use KADAI, you need to create a database yourself, and then specify it through the ",(0,i.jsx)(n.a,{href:"#datasource",children:"DataSource"}),". You can see the list of the supported databases ",(0,i.jsx)(n.a,{href:"/kadai-doc/docs/user-guide/getting-started/supportedEnvironments",children:"here"}),".\nThe recommended page size for the database is 32 k. It's necessary to create the database schema. The sort order of query results can be changed by the collating sequence specified in database creation. The default for most databases is a case-sensitive sort order. If you want query results to be sorted case insensitively, you should specify an appropriate collating sequence."]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Page size: 32k"}),"\n",(0,i.jsx)(n.li,{children:"Encoding: UTF-8"}),"\n",(0,i.jsxs)(n.li,{children:["Collating sequence examples:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"db2 (case sensitive): IDENTITY"}),"\n",(0,i.jsx)(n.li,{children:"postgres (case sensitive): de_DE.UTF-8"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Example db2:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"CREATE DATABASE USING CODESET UTF-8 COLLATE USING IDENTITY PAGESIZE 32 K \n\n"})}),"\n",(0,i.jsx)(n.p,{children:"Example Postgres:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"CREATE DATABASE WITH ENCODING 'UTF8' LC_COLLATE='de_DE.UTF-8';\n"})}),"\n",(0,i.jsx)(n.h3,{id:"datasource",children:"DataSource"}),"\n",(0,i.jsx)(n.p,{children:"KADAI connects to the database via a DataSource. It does not support XADataSources for connections to databases. The DataSource can be specified during the creation of KadaiConfiguration. For example, as following:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"new KadaiConfiguration.Builder(dataSource, true, schemaName, false)\n .initKadaiProperties(propertiesFileName, delimiter)\n .build();\n"})}),"\n",(0,i.jsxs)(n.p,{children:["In Spring environment, the DataSource has standard spring options that can be configured in the ",(0,i.jsx)(n.code,{children:"application.properties"})," file. You can read more about them in the Spring documentation. Here is an example:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"spring.datasource.url=jdbc:h2:mem:kadai;NON_KEYWORDS=KEY,VALUE;IGNORECASE=TRUE;LOCK_MODE=0;\nspring.datasource.driverClassName=org.h2.Driver\nspring.datasource.username=sa\nspring.datasource.password=sa\n"})}),"\n",(0,i.jsx)(n.h3,{id:"schemaname-and-prefilling-the-database",children:"SchemaName and Prefilling the Database"}),"\n",(0,i.jsxs)(n.p,{children:['Additionally to the DataSource, you can also configure the schemaName.\nIt can be specified during the creation of KadaiConfiguration, as seen in the example above.\nThe default schemaName is `KADAI.\nThe schemaName can also be changed by setting the parameter "kadai.schemaName"\nin the ',(0,i.jsx)(n.code,{children:"application.properties"})," file:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"kadai.schemaName=KADAI\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Additionally to that, you can configure KADAI so that it prefills the database with sample data.\nYou can find sample data in the folder ",(0,i.jsx)(n.code,{children:"common/kadai-common-data/src/main/resources/sql/sample-data"}),'.\nTo do that, set the "generateSampleData" property in the ',(0,i.jsx)(n.code,{children:"application.properties"})," file to true:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"generateSampleData=true\n"})}),"\n",(0,i.jsx)(n.h2,{id:"connection-options",children:"Connection options"}),"\n",(0,i.jsx)(n.p,{children:"KADAI supports three connection management modes: PARTICIPATE, AUTOCOMMIT and EXPLICIT. You can specify the connection management mode when creating KadaiEngine using"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"KadaiEngine buildKadaiEngine (KadaiConfiguration configuration, ConnectionManagementMode connectionManagementMode)\n"})}),"\n",(0,i.jsx)(n.p,{children:"The default mode is PARTICIPATE."}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"mode"}),(0,i.jsx)(n.th,{children:"description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"PARTICIPATE"}),(0,i.jsx)(n.td,{children:"KADAI participates in surrounding global transactions. It acquires and releases connections at begin / end of each API call and relies on the infrastructure to do the commit."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"AUTOCOMMIT"}),(0,i.jsx)(n.td,{children:"KADAI commits each single API call separately."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"EXPLICIT"}),(0,i.jsx)(n.td,{children:"KADAI doesn't acquire, commit or close connections. The client is responsible for opening a connection, passing it to KADAI, committing or rolling it back. In order to close a connection, the client has to call either KadaiEngine.closeConnection() or KadaiEngine.setConnection(null)."})]})]})]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},8453:(e,n,a)=>{a.d(n,{R:()=>o,x:()=>r});var t=a(6540);const i={},s=t.createContext(i);function o(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/56bd79c1.0c186d7f.js b/assets/js/56bd79c1.0c186d7f.js new file mode 100644 index 0000000..df1d042 --- /dev/null +++ b/assets/js/56bd79c1.0c186d7f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[2144],{1496:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>d,contentTitle:()=>a,default:()=>h,frontMatter:()=>t,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"user-guide/features/kadaiHistorySPI","title":"KadaiHistory SPI","description":"To follow this article, please read general SPI information before proceeding.","source":"@site/docs/user-guide/features/kadaiHistorySPI.md","sourceDirName":"user-guide/features","slug":"/user-guide/features/kadaiHistorySPI","permalink":"/kadai-doc/docs/user-guide/features/kadaiHistorySPI","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"sidebar_position":3},"sidebar":"userSidebar","previous":{"title":"List of provided SPIs","permalink":"/kadai-doc/docs/user-guide/features/listOfProvidedSPIs"},"next":{"title":"KADAI Jobs","permalink":"/kadai-doc/docs/user-guide/features/jobs"}}');var r=s(4848),o=s(8453);const t={sidebar_position:3},a="KadaiHistory SPI",d={},c=[{value:"Use Cases for KadaiHistory",id:"use-cases-for-kadaihistory",level:2},{value:"KadaiHistory Implementation and the corresponding REST-Service",id:"kadaihistory-implementation-and-the-corresponding-rest-service",level:2}];function l(e){const i={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(i.header,{children:(0,r.jsx)(i.h1,{id:"kadaihistory-spi",children:"KadaiHistory SPI"})}),"\n",(0,r.jsxs)(i.p,{children:["To follow this article, please read ",(0,r.jsx)(i.a,{href:"/kadai-doc/docs/user-guide/features/howToUseServiceProviderInterfaces",children:"general SPI information"})," before proceeding."]}),"\n",(0,r.jsxs)(i.p,{children:["The KadaiHistory can be used for different purposes.\nIn general, it tracks actions performed by KADAI,\nlike creation of Workbaskets, completion of Tasks, etc.\nThe HistoryService makes this information available for further usage.\nKADAI already provides an implementation for the KadaiHistory described ",(0,r.jsx)(i.a,{href:"#kadaihistory-implementation-and-the-corresponding-rest-service",children:"here"}),".\nBelow, you can see example business use cases for KadaiHistory."]}),"\n",(0,r.jsx)(i.h2,{id:"use-cases-for-kadaihistory",children:"Use Cases for KadaiHistory"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["History of one business process: (relevant for specialists working on a Task of that process)","\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Who worked on it before?"}),"\n",(0,r.jsx)(i.li,{children:"Who transferred it to me?"}),"\n",(0,r.jsx)(i.li,{children:"What happened in the process before it got assigned to the user?"}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["Auditing:","\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Is everything completed?"}),"\n",(0,r.jsx)(i.li,{children:"What happened to a specific document / process?"}),"\n",(0,r.jsx)(i.li,{children:"Who approved what?"}),"\n",(0,r.jsx)(i.li,{children:"Who changed something?"}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["Reporting: (SLA/KPI)","\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"How long did a process/Task take in average?"}),"\n",(0,r.jsx)(i.li,{children:"How long did it take until a new message from a customer is assigned to a specialist?"}),"\n",(0,r.jsx)(i.li,{children:"How often was required to change the Classification of the Task/document?"}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(i.li,{children:["Reporting:","\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"How many Tasks of what Classification did we receive this day/week/month?"}),"\n",(0,r.jsx)(i.li,{children:"How many Tasks have been completed by team/location/etc.?"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(i.h2,{id:"kadaihistory-implementation-and-the-corresponding-rest-service",children:"KadaiHistory Implementation and the corresponding REST-Service"}),"\n",(0,r.jsx)(i.p,{children:"Additionally to the SPI, KADAI already provides an implementation at io.kadai.simplehistory.impl.SimpleHistoryServiceImpl.\nYou can activate SimpleHistoryServiceImpl by adding the following dependency to your pom:"}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"\n io.kadai.history\n kadai-simplehistory-provider\n \n\n"})}),"\n",(0,r.jsxs)(i.p,{children:["KADAI also provides a REST service for SimpleHistoryServiceImpl documented ",(0,r.jsx)(i.a,{href:"https://kadai-io.azurewebsites.net/kadai/docs/rest/simplehistory-rest-api.html",children:"here"}),". If you want to use the REST Service, you can add the following dependency to your pom:"]}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"\n io.kadai.history\n kadai-simplehistory-rest-spring\n \n\n"})})]})}function h(e={}){const{wrapper:i}={...(0,o.R)(),...e.components};return i?(0,r.jsx)(i,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,i,s)=>{s.d(i,{R:()=>t,x:()=>a});var n=s(6540);const r={},o=n.createContext(r);function t(e){const i=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),n.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/56bd79c1.772c9cc2.js b/assets/js/56bd79c1.772c9cc2.js deleted file mode 100644 index 6ebae75..0000000 --- a/assets/js/56bd79c1.772c9cc2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[2144],{3718:(e,i,s)=>{s.r(i),s.d(i,{assets:()=>d,contentTitle:()=>t,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var n=s(4848),r=s(8453);const o={sidebar_position:3},t="KadaiHistory SPI",a={id:"user-guide/features/kadaiHistorySPI",title:"KadaiHistory SPI",description:"To follow this article, please read general SPI information before proceeding.",source:"@site/docs/user-guide/features/kadaiHistorySPI.md",sourceDirName:"user-guide/features",slug:"/user-guide/features/kadaiHistorySPI",permalink:"/kadai-doc/docs/user-guide/features/kadaiHistorySPI",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:3,frontMatter:{sidebar_position:3},sidebar:"userSidebar",previous:{title:"List of provided SPIs",permalink:"/kadai-doc/docs/user-guide/features/listOfProvidedSPIs"},next:{title:"KADAI Jobs",permalink:"/kadai-doc/docs/user-guide/features/jobs"}},d={},c=[{value:"Use Cases for KadaiHistory",id:"use-cases-for-kadaihistory",level:2},{value:"KadaiHistory Implementation and the corresponding REST-Service",id:"kadaihistory-implementation-and-the-corresponding-rest-service",level:2}];function l(e){const i={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"kadaihistory-spi",children:"KadaiHistory SPI"})}),"\n",(0,n.jsxs)(i.p,{children:["To follow this article, please read ",(0,n.jsx)(i.a,{href:"/kadai-doc/docs/user-guide/features/howToUseServiceProviderInterfaces",children:"general SPI information"})," before proceeding."]}),"\n",(0,n.jsxs)(i.p,{children:["The KadaiHistory can be used for different purposes.\nIn general, it tracks actions performed by KADAI,\nlike creation of Workbaskets, completion of Tasks, etc.\nThe HistoryService makes this information available for further usage.\nKADAI already provides an implementation for the KadaiHistory described ",(0,n.jsx)(i.a,{href:"#kadaihistory-implementation-and-the-corresponding-rest-service",children:"here"}),".\nBelow, you can see example business use cases for KadaiHistory."]}),"\n",(0,n.jsx)(i.h2,{id:"use-cases-for-kadaihistory",children:"Use Cases for KadaiHistory"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["History of one business process: (relevant for specialists working on a Task of that process)","\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:"Who worked on it before?"}),"\n",(0,n.jsx)(i.li,{children:"Who transferred it to me?"}),"\n",(0,n.jsx)(i.li,{children:"What happened in the process before it got assigned to the user?"}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["Auditing:","\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:"Is everything completed?"}),"\n",(0,n.jsx)(i.li,{children:"What happened to a specific document / process?"}),"\n",(0,n.jsx)(i.li,{children:"Who approved what?"}),"\n",(0,n.jsx)(i.li,{children:"Who changed something?"}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["Reporting: (SLA/KPI)","\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:"How long did a process/Task take in average?"}),"\n",(0,n.jsx)(i.li,{children:"How long did it take until a new message from a customer is assigned to a specialist?"}),"\n",(0,n.jsx)(i.li,{children:"How often was required to change the Classification of the Task/document?"}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["Reporting:","\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:"How many Tasks of what Classification did we receive this day/week/month?"}),"\n",(0,n.jsx)(i.li,{children:"How many Tasks have been completed by team/location/etc.?"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(i.h2,{id:"kadaihistory-implementation-and-the-corresponding-rest-service",children:"KadaiHistory Implementation and the corresponding REST-Service"}),"\n",(0,n.jsx)(i.p,{children:"Additionally to the SPI, KADAI already provides an implementation at io.kadai.simplehistory.impl.SimpleHistoryServiceImpl.\nYou can activate SimpleHistoryServiceImpl by adding the following dependency to your pom:"}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{children:"\n io.kadai.history\n kadai-simplehistory-provider\n \n\n"})}),"\n",(0,n.jsxs)(i.p,{children:["KADAI also provides a REST service for SimpleHistoryServiceImpl documented ",(0,n.jsx)(i.a,{href:"https://kadai-io.azurewebsites.net/kadai/docs/rest/simplehistory-rest-api.html",children:"here"}),". If you want to use the REST Service, you can add the following dependency to your pom:"]}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{children:"\n io.kadai.history\n kadai-simplehistory-rest-spring\n \n\n"})})]})}function h(e={}){const{wrapper:i}={...(0,r.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,i,s)=>{s.d(i,{R:()=>t,x:()=>a});var n=s(6540);const r={},o=n.createContext(r);function t(e){const i=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),n.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/57239c41.718ae3e7.js b/assets/js/57239c41.718ae3e7.js new file mode 100644 index 0000000..35a21d1 --- /dev/null +++ b/assets/js/57239c41.718ae3e7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[6191],{484:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>g,contentTitle:()=>c,default:()=>p,frontMatter:()=>h,metadata:()=>l,toc:()=>y});const l=JSON.parse('{"id":"user-guide/core-concepts/taskLifecycle","title":"Task Lifecycle","description":"A Task goes through different states during its existence.","source":"@site/docs/user-guide/core-concepts/taskLifecycle.md","sourceDirName":"user-guide/core-concepts","slug":"/user-guide/core-concepts/taskLifecycle","permalink":"/kadai-doc/docs/user-guide/core-concepts/taskLifecycle","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1},"sidebar":"userSidebar","previous":{"title":"Overview","permalink":"/kadai-doc/docs/user-guide/core-concepts/overview"},"next":{"title":"Java-API usage","permalink":"/kadai-doc/docs/user-guide/core-concepts/javaApiUsage"}}');var r=n(4848),o=n(8453),i=n(9734),a=n.n(i);const s='\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n',m='',d='\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n',x='\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n',h={sidebar_position:1},c="Task Lifecycle",g={},y=[{value:"Task States",id:"task-states",level:2},{value:"Task Timeline",id:"task-timeline",level:2},{value:"Task Timestamps",id:"task-timestamps",level:3},{value:"Example",id:"example",level:3}];function u(e){const t={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"task-lifecycle",children:"Task Lifecycle"})}),"\n",(0,r.jsx)(t.p,{children:"A Task goes through different states during its existence.\nThe Task Lifecycle describes the states and their transitions.\nAdditionally,\na Task has timestamps for important state transitions and expected milestones in the processing of the Task.\nIn this article, Task Lifecycle and the corresponding Task states are explained in detail."}),"\n",(0,r.jsx)(t.p,{children:"The following diagram shows Task states and their transitions. You can read more about Task States below."}),"\n",(0,r.jsx)(a(),{content:m}),"\n",(0,r.jsx)(t.h2,{id:"task-states",children:"Task States"}),"\n",(0,r.jsx)(a(),{content:s}),"\n",(0,r.jsx)(t.h2,{id:"task-timeline",children:"Task Timeline"}),"\n",(0,r.jsx)(t.p,{children:"The changes of state and timestamps during the lifetime of a Task can be shown in a timeline. Below is a general timeline of a Task for a common case. It shows how states and timestamps relate to each other, as well as their chronological order. It contains most of the timestamps. For a complete list of timestamps with an explanation, see the text below the diagram."}),"\n",(0,r.jsx)(a(),{content:x}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Reaction Time"}),": Describes the time taken for someone to claim the task after it has been planned."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Processing Time"}),": Describes how long someone worked on the task from start to finish."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Lead Time"}),": Describes the time between supposed start date of a task until completion."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Service Level"}),": Describes maximum duration from supposed start until deadline."]}),"\n"]}),"\n",(0,r.jsx)(t.h3,{id:"task-timestamps",children:"Task Timestamps"}),"\n",(0,r.jsxs)(t.p,{children:["Each Task has different timestamps. Most of them are shown in the ",(0,r.jsx)(t.a,{href:"#example",children:"example"})," below:"]}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"received"}),": Describes when the Task first came into the system. For example, it can be the timestamp of an e-mail containing the relevant document. If there is no such timestamp, then the received timestamp can be empty."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"created"}),": Describes when the Task was first inserted into the database."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"planned"}),": Describes when somebody should start working on the Task."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"claimed"}),": Describes when someone started to work on this Task."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"due"}),": Describes the deadline for Task completion."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"completed"}),": Describes when the Task was completed."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"modified"}),": Describes when the Task was modified last time. Modifying a Task includes creating, claiming, completing and updating it."]}),"\n"]}),"\n",(0,r.jsxs)(t.p,{children:["All timestamps except ",(0,r.jsx)(t.em,{children:"received"})," can be set automatically.\nThe timestamps ",(0,r.jsx)(t.em,{children:"received"}),", ",(0,r.jsx)(t.em,{children:"planned"})," and ",(0,r.jsx)(t.em,{children:"due"})," can be set manually.\nHowever,\nthe time between planned and due is usually configured\nto have a fix value\nby setting ",(0,r.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/configuration/classificationAndServiceLevel",children:"servicelevel.validation.enforce"})," to true.\nIf ",(0,r.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/configuration/classificationAndServiceLevel",children:"servicelevel.validation.enforce"})," is true,\nthe time between planned and due is the smallest service level corresponding to the Task.\nTo find out the smallest service level of the Task,\nthe service levels of Classification of the Task and the Classification of its Attachments are compared.\nThen, either due or planned are set accordingly.\nIf both attributes, planned and due, were set manually without matching the service level,\nand ",(0,r.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/configuration/classificationAndServiceLevel",children:"servicelevel.validation.enforce"})," is true,\nan exception will be thrown.\nIf ",(0,r.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/configuration/classificationAndServiceLevel",children:"servicelevel.validation.enforce"})," is false,\nthe time between planned and due is not fixed.\nThat means no exception will be thrown."]}),"\n",(0,r.jsx)(t.h3,{id:"example",children:"Example"}),"\n",(0,r.jsx)(t.p,{children:"Prerequisites:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["Classification ",(0,r.jsx)(t.code,{children:"Employment Contract"})," with Service Level P5D"]}),"\n",(0,r.jsxs)(t.li,{children:["Classification ",(0,r.jsx)(t.code,{children:"Contract Extension"})," with Service Level P7D"]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/configuration/classificationAndServiceLevel",children:"servicelevel.validation.enforce"})," is true"]}),"\n"]}),"\n",(0,r.jsx)(t.p,{children:"Example Scenario:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["An envelope containing a letter '",(0,r.jsx)(t.em,{children:"Extend Contract"}),"' describing a Task, and another document '",(0,r.jsx)(t.em,{children:"Contract of Max Mustermann"}),"' attached to the letter, is received on 01-11-2023."]}),"\n",(0,r.jsxs)(t.li,{children:["On the next day, the letter '",(0,r.jsx)(t.em,{children:"Extend Contract"}),"' is then scanned with an OCR reader, which creates a Task in KADAI. The task has a deadline of 10-11-2023 and is classified as ",(0,r.jsx)(t.code,{children:"Contract Extension"}),"."]}),"\n",(0,r.jsxs)(t.li,{children:["The Attachment '",(0,r.jsx)(t.em,{children:"Contract of Max Mustermann"}),"' is also scanned with the OCR reader, which creates an Attachment in KADAI and assigned it to the Classification ",(0,r.jsx)(t.code,{children:"Employment Contract"}),"."]}),"\n",(0,r.jsxs)(t.li,{children:["The planned timestamp of the Task is computed during the Task creation as following:","\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"service Levels of the Attachment and Task are compared."}),"\n",(0,r.jsxs)(t.li,{children:["The Classification ",(0,r.jsx)(t.code,{children:"Contract Extension"})," has a Service Level of P7D, and Classification ",(0,r.jsx)(t.code,{children:"Employment Contract"})," has a Service Level of P5D."]}),"\n",(0,r.jsx)(t.li,{children:"P5D is used to compute planned of the Task, because P5D is smaller than P7D."}),"\n",(0,r.jsx)(t.li,{children:"Planned is set to 3-11-2023."}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(t.li,{children:"An employee claims this Task on 06-11-2023."}),"\n",(0,r.jsx)(t.li,{children:"The employee completes it on 09-11-2023, one day before the due date."}),"\n"]}),"\n",(0,r.jsx)(a(),{content:d})]})}function p(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}},8478:(e,t,n)=>{n.r(t),n.d(t,{default:()=>o});n(6540);var l=n(2303),r=n(4848);function o(e){let{children:t,fallback:n}=e;return(0,l.A)()?(0,r.jsx)(r.Fragment,{children:t?.()}):n??null}},9734:(e,t,n)=>{var l=n(8478),r=n(6540);function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var i=o(l),a=o(r),s=function(){return s=Object.assign||function(e){for(var t,n=1,l=arguments.length;n div {\n margin-left: auto;\n margin-right: auto;\n border: 1px solid transparent;\n min-width: 180px;\n}\n");var m=function(e){var t=e.content,n=e.maxHeight,l=e.autoFit,o=e.autoCrop,i=e.autoOrigin,m=e.allowZoomOut,d=e.allowZoomIn,x=e.checkVisibleState,h=e.toolbarPosition,c=e.toolbarNohide,g=e.toolbarButtons,y=function(e,t){var n={};for(var l in e)Object.prototype.hasOwnProperty.call(e,l)&&t.indexOf(l)<0&&(n[l]=e[l]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(l=Object.getOwnPropertySymbols(e);r{n.d(t,{R:()=>i,x:()=>a});var l=n(6540);const r={},o=l.createContext(r);function i(e){const t=l.useContext(o);return l.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),l.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/57239c41.da4bb330.js b/assets/js/57239c41.da4bb330.js deleted file mode 100644 index cf7eda8..0000000 --- a/assets/js/57239c41.da4bb330.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[6191],{278:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>g,contentTitle:()=>h,default:()=>p,frontMatter:()=>x,metadata:()=>c,toc:()=>y});var l=n(4848),r=n(8453),o=n(9734),i=n.n(o);const a='\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n',s='',m='\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n',d='\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n',x={sidebar_position:1},h="Task Lifecycle",c={id:"user-guide/core-concepts/taskLifecycle",title:"Task Lifecycle",description:"A Task goes through different states during its existence.",source:"@site/docs/user-guide/core-concepts/taskLifecycle.md",sourceDirName:"user-guide/core-concepts",slug:"/user-guide/core-concepts/taskLifecycle",permalink:"/kadai-doc/docs/user-guide/core-concepts/taskLifecycle",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"userSidebar",previous:{title:"Overview",permalink:"/kadai-doc/docs/user-guide/core-concepts/overview"},next:{title:"Java-API usage",permalink:"/kadai-doc/docs/user-guide/core-concepts/javaApiUsage"}},g={},y=[{value:"Task States",id:"task-states",level:2},{value:"Task Timeline",id:"task-timeline",level:2},{value:"Task Timestamps",id:"task-timestamps",level:3},{value:"Example",id:"example",level:3}];function u(e){const t={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(t.header,{children:(0,l.jsx)(t.h1,{id:"task-lifecycle",children:"Task Lifecycle"})}),"\n",(0,l.jsx)(t.p,{children:"A Task goes through different states during its existence.\nThe Task Lifecycle describes the states and their transitions.\nAdditionally,\na Task has timestamps for important state transitions and expected milestones in the processing of the Task.\nIn this article, Task Lifecycle and the corresponding Task states are explained in detail."}),"\n",(0,l.jsx)(t.p,{children:"The following diagram shows Task states and their transitions. You can read more about Task States below."}),"\n",(0,l.jsx)(i(),{content:s}),"\n",(0,l.jsx)(t.h2,{id:"task-states",children:"Task States"}),"\n",(0,l.jsx)(i(),{content:a}),"\n",(0,l.jsx)(t.h2,{id:"task-timeline",children:"Task Timeline"}),"\n",(0,l.jsx)(t.p,{children:"The changes of state and timestamps during the lifetime of a Task can be shown in a timeline. Below is a general timeline of a Task for a common case. It shows how states and timestamps relate to each other, as well as their chronological order. It contains most of the timestamps. For a complete list of timestamps with an explanation, see the text below the diagram."}),"\n",(0,l.jsx)(i(),{content:d}),"\n",(0,l.jsxs)(t.ul,{children:["\n",(0,l.jsxs)(t.li,{children:[(0,l.jsx)(t.strong,{children:"Reaction Time"}),": Describes the time taken for someone to claim the task after it has been planned."]}),"\n",(0,l.jsxs)(t.li,{children:[(0,l.jsx)(t.strong,{children:"Processing Time"}),": Describes how long someone worked on the task from start to finish."]}),"\n",(0,l.jsxs)(t.li,{children:[(0,l.jsx)(t.strong,{children:"Lead Time"}),": Describes the time between supposed start date of a task until completion."]}),"\n",(0,l.jsxs)(t.li,{children:[(0,l.jsx)(t.strong,{children:"Service Level"}),": Describes maximum duration from supposed start until deadline."]}),"\n"]}),"\n",(0,l.jsx)(t.h3,{id:"task-timestamps",children:"Task Timestamps"}),"\n",(0,l.jsxs)(t.p,{children:["Each Task has different timestamps. Most of them are shown in the ",(0,l.jsx)(t.a,{href:"#example",children:"example"})," below:"]}),"\n",(0,l.jsxs)(t.ul,{children:["\n",(0,l.jsxs)(t.li,{children:[(0,l.jsx)(t.strong,{children:"received"}),": Describes when the Task first came into the system. For example, it can be the timestamp of an e-mail containing the relevant document. If there is no such timestamp, then the received timestamp can be empty."]}),"\n",(0,l.jsxs)(t.li,{children:[(0,l.jsx)(t.strong,{children:"created"}),": Describes when the Task was first inserted into the database."]}),"\n",(0,l.jsxs)(t.li,{children:[(0,l.jsx)(t.strong,{children:"planned"}),": Describes when somebody should start working on the Task."]}),"\n",(0,l.jsxs)(t.li,{children:[(0,l.jsx)(t.strong,{children:"claimed"}),": Describes when someone started to work on this Task."]}),"\n",(0,l.jsxs)(t.li,{children:[(0,l.jsx)(t.strong,{children:"due"}),": Describes the deadline for Task completion."]}),"\n",(0,l.jsxs)(t.li,{children:[(0,l.jsx)(t.strong,{children:"completed"}),": Describes when the Task was completed."]}),"\n",(0,l.jsxs)(t.li,{children:[(0,l.jsx)(t.strong,{children:"modified"}),": Describes when the Task was modified last time. Modifying a Task includes creating, claiming, completing and updating it."]}),"\n"]}),"\n",(0,l.jsxs)(t.p,{children:["All timestamps except ",(0,l.jsx)(t.em,{children:"received"})," can be set automatically.\nThe timestamps ",(0,l.jsx)(t.em,{children:"received"}),", ",(0,l.jsx)(t.em,{children:"planned"})," and ",(0,l.jsx)(t.em,{children:"due"})," can be set manually.\nHowever,\nthe time between planned and due is usually configured\nto have a fix value\nby setting ",(0,l.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/configuration/classificationAndServiceLevel",children:"servicelevel.validation.enforce"})," to true.\nIf ",(0,l.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/configuration/classificationAndServiceLevel",children:"servicelevel.validation.enforce"})," is true,\nthe time between planned and due is the smallest service level corresponding to the Task.\nTo find out the smallest service level of the Task,\nthe service levels of Classification of the Task and the Classification of its Attachments are compared.\nThen, either due or planned are set accordingly.\nIf both attributes, planned and due, were set manually without matching the service level,\nand ",(0,l.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/configuration/classificationAndServiceLevel",children:"servicelevel.validation.enforce"})," is true,\nan exception will be thrown.\nIf ",(0,l.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/configuration/classificationAndServiceLevel",children:"servicelevel.validation.enforce"})," is false,\nthe time between planned and due is not fixed.\nThat means no exception will be thrown."]}),"\n",(0,l.jsx)(t.h3,{id:"example",children:"Example"}),"\n",(0,l.jsx)(t.p,{children:"Prerequisites:"}),"\n",(0,l.jsxs)(t.ul,{children:["\n",(0,l.jsxs)(t.li,{children:["Classification ",(0,l.jsx)(t.code,{children:"Employment Contract"})," with Service Level P5D"]}),"\n",(0,l.jsxs)(t.li,{children:["Classification ",(0,l.jsx)(t.code,{children:"Contract Extension"})," with Service Level P7D"]}),"\n",(0,l.jsxs)(t.li,{children:[(0,l.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/configuration/classificationAndServiceLevel",children:"servicelevel.validation.enforce"})," is true"]}),"\n"]}),"\n",(0,l.jsx)(t.p,{children:"Example Scenario:"}),"\n",(0,l.jsxs)(t.ul,{children:["\n",(0,l.jsxs)(t.li,{children:["An envelope containing a letter '",(0,l.jsx)(t.em,{children:"Extend Contract"}),"' describing a Task, and another document '",(0,l.jsx)(t.em,{children:"Contract of Max Mustermann"}),"' attached to the letter, is received on 01-11-2023."]}),"\n",(0,l.jsxs)(t.li,{children:["On the next day, the letter '",(0,l.jsx)(t.em,{children:"Extend Contract"}),"' is then scanned with an OCR reader, which creates a Task in KADAI. The task has a deadline of 10-11-2023 and is classified as ",(0,l.jsx)(t.code,{children:"Contract Extension"}),"."]}),"\n",(0,l.jsxs)(t.li,{children:["The Attachment '",(0,l.jsx)(t.em,{children:"Contract of Max Mustermann"}),"' is also scanned with the OCR reader, which creates an Attachment in KADAI and assigned it to the Classification ",(0,l.jsx)(t.code,{children:"Employment Contract"}),"."]}),"\n",(0,l.jsxs)(t.li,{children:["The planned timestamp of the Task is computed during the Task creation as following:","\n",(0,l.jsxs)(t.ul,{children:["\n",(0,l.jsx)(t.li,{children:"service Levels of the Attachment and Task are compared."}),"\n",(0,l.jsxs)(t.li,{children:["The Classification ",(0,l.jsx)(t.code,{children:"Contract Extension"})," has a Service Level of P7D, and Classification ",(0,l.jsx)(t.code,{children:"Employment Contract"})," has a Service Level of P5D."]}),"\n",(0,l.jsx)(t.li,{children:"P5D is used to compute planned of the Task, because P5D is smaller than P7D."}),"\n",(0,l.jsx)(t.li,{children:"Planned is set to 3-11-2023."}),"\n"]}),"\n"]}),"\n",(0,l.jsx)(t.li,{children:"An employee claims this Task on 06-11-2023."}),"\n",(0,l.jsx)(t.li,{children:"The employee completes it on 09-11-2023, one day before the due date."}),"\n"]}),"\n",(0,l.jsx)(i(),{content:m})]})}function p(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,l.jsx)(t,{...e,children:(0,l.jsx)(u,{...e})}):u(e)}},8478:(e,t,n)=>{n.r(t),n.d(t,{default:()=>o});n(6540);var l=n(2303),r=n(4848);function o(e){let{children:t,fallback:n}=e;return(0,l.A)()?(0,r.jsx)(r.Fragment,{children:t?.()}):n??null}},9734:(e,t,n)=>{var l=n(8478),r=n(6540);function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var i=o(l),a=o(r),s=function(){return s=Object.assign||function(e){for(var t,n=1,l=arguments.length;n div {\n margin-left: auto;\n margin-right: auto;\n border: 1px solid transparent;\n min-width: 180px;\n}\n");var m=function(e){var t=e.content,n=e.maxHeight,l=e.autoFit,o=e.autoCrop,i=e.autoOrigin,m=e.allowZoomOut,d=e.allowZoomIn,x=e.checkVisibleState,h=e.toolbarPosition,c=e.toolbarNohide,g=e.toolbarButtons,y=function(e,t){var n={};for(var l in e)Object.prototype.hasOwnProperty.call(e,l)&&t.indexOf(l)<0&&(n[l]=e[l]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(l=Object.getOwnPropertySymbols(e);r{n.d(t,{R:()=>i,x:()=>a});var l=n(6540);const r={},o=l.createContext(r);function i(e){const t=l.useContext(o);return l.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),l.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6d9693cd.7cb3636a.js b/assets/js/6d9693cd.7cb3636a.js new file mode 100644 index 0000000..c65c9ac --- /dev/null +++ b/assets/js/6d9693cd.7cb3636a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[1921],{1701:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>u,contentTitle:()=>r,default:()=>l,frontMatter:()=>a,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"user-guide/userGuideIntro","title":"User Guide Intro","description":"Let\'s discover KADAI! This User Guide covers the installation of KADAI. You can start with an example installation here. It shows how to set up an application that uses KADAI by example. The guide explains the basic functionality of KADAI as well as its additional features. It also walks through different configuration and customization options of KADAI. In case of any additional questions, please contact us.","source":"@site/docs/user-guide/userGuideIntro.md","sourceDirName":"user-guide","slug":"/user-guide/userGuideIntro","permalink":"/kadai-doc/docs/user-guide/userGuideIntro","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1},"sidebar":"userSidebar","next":{"title":"Getting Started","permalink":"/kadai-doc/docs/category/getting-started"}}');var i=s(4848),o=s(8453);const a={sidebar_position:1},r="User Guide Intro",u={},d=[];function c(e){const t={a:"a",h1:"h1",header:"header",p:"p",strong:"strong",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"user-guide-intro",children:"User Guide Intro"})}),"\n",(0,i.jsxs)(t.p,{children:["Let's discover ",(0,i.jsx)(t.strong,{children:"KADAI"}),"! This User Guide covers the installation of KADAI. You can start with an example installation ",(0,i.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/getting-started/exampleSpringBoot",children:"here"}),". It shows how to set up an application that uses KADAI by example. The guide explains the basic functionality of KADAI as well as its additional features. It also walks through different configuration and customization options of KADAI. In case of any additional questions, please ",(0,i.jsx)(t.a,{href:"../contact-us/contactUs",children:"contact us"}),"."]})]})}function l(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>a,x:()=>r});var n=s(6540);const i={},o=n.createContext(i);function a(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6d9693cd.d3ea87f9.js b/assets/js/6d9693cd.d3ea87f9.js deleted file mode 100644 index 759edf2..0000000 --- a/assets/js/6d9693cd.d3ea87f9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[1921],{5375:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>u,contentTitle:()=>a,default:()=>l,frontMatter:()=>o,metadata:()=>r,toc:()=>d});var n=s(4848),i=s(8453);const o={sidebar_position:1},a="User Guide Intro",r={id:"user-guide/userGuideIntro",title:"User Guide Intro",description:"Let's discover KADAI! This User Guide covers the installation of KADAI. You can start with an example installation here. It shows how to set up an application that uses KADAI by example. The guide explains the basic functionality of KADAI as well as its additional features. It also walks through different configuration and customization options of KADAI. In case of any additional questions, please contact us.",source:"@site/docs/user-guide/userGuideIntro.md",sourceDirName:"user-guide",slug:"/user-guide/userGuideIntro",permalink:"/kadai-doc/docs/user-guide/userGuideIntro",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"userSidebar",next:{title:"Getting Started",permalink:"/kadai-doc/docs/category/getting-started"}},u={},d=[];function c(e){const t={a:"a",h1:"h1",header:"header",p:"p",strong:"strong",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"user-guide-intro",children:"User Guide Intro"})}),"\n",(0,n.jsxs)(t.p,{children:["Let's discover ",(0,n.jsx)(t.strong,{children:"KADAI"}),"! This User Guide covers the installation of KADAI. You can start with an example installation ",(0,n.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/getting-started/exampleSpringBoot",children:"here"}),". It shows how to set up an application that uses KADAI by example. The guide explains the basic functionality of KADAI as well as its additional features. It also walks through different configuration and customization options of KADAI. In case of any additional questions, please ",(0,n.jsx)(t.a,{href:"../contact-us/contactUs",children:"contact us"}),"."]})]})}function l(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},8453:(e,t,s)=>{s.d(t,{R:()=>a,x:()=>r});var n=s(6540);const i={},o=n.createContext(i);function a(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7218d785.3a9f35db.js b/assets/js/7218d785.3a9f35db.js deleted file mode 100644 index 0033abc..0000000 --- a/assets/js/7218d785.3a9f35db.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[5481],{8241:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>n,contentTitle:()=>t,default:()=>l,frontMatter:()=>o,metadata:()=>d,toc:()=>c});var i=r(4848),a=r(8453);const o={sidebar_position:2},t="List of provided SPIs",d={id:"user-guide/features/listOfProvidedSPIs",title:"List of provided SPIs",description:"Please read general SPI information to understand SPIs in KADAI in general.",source:"@site/docs/user-guide/features/listOfProvidedSPIs.md",sourceDirName:"user-guide/features",slug:"/user-guide/features/listOfProvidedSPIs",permalink:"/kadai-doc/docs/user-guide/features/listOfProvidedSPIs",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"userSidebar",previous:{title:"How to use Service Provider Interfaces (SPIs)",permalink:"/kadai-doc/docs/user-guide/features/howToUseServiceProviderInterfaces"},next:{title:"KadaiHistory SPI",permalink:"/kadai-doc/docs/user-guide/features/kadaiHistorySPI"}},n={},c=[];function u(e){const s={a:"a",h1:"h1",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"list-of-provided-spis",children:"List of provided SPIs"})}),"\n",(0,i.jsxs)(s.p,{children:["Please read ",(0,i.jsx)(s.a,{href:"/kadai-doc/docs/user-guide/features/howToUseServiceProviderInterfaces",children:"general SPI information"})," to understand SPIs in KADAI in general."]}),"\n",(0,i.jsx)(s.p,{children:"Currently, KADAI provides the following SPIs:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"io.kadai.spi.history.api.KadaiHistory"})," : Look up the history of KADAI. You can read more use cases for HistoryService ",(0,i.jsx)(s.a,{href:"/kadai-doc/docs/user-guide/features/kadaiHistorySPI",children:"here"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"io.kadai.spi.priority.api.PriorityServiceProvider"})," : Add rules for the calculation of Task priority."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"io.kadai.spi.routing.api.TaskRoutingProvider"})," : Add rules for automated Workbasket assignment for some of the new Tasks."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"io.kadai.spi.task.api.AfterRequestChangesProvider"})," : Add actions on Task that are executed after changes on reviewed Task have been requested (See more about Task Lifecycle ",(0,i.jsx)(s.a,{href:"/kadai-doc/docs/user-guide/core-concepts/taskLifecycle",children:"here"}),")."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"io.kadai.spi.task.api.AfterRequestReviewProvider"})," : Add actions on Task that are executed after a review on a claimed Task has been requested (See more about Task Lifecycle ",(0,i.jsx)(s.a,{href:"/kadai-doc/docs/user-guide/core-concepts/taskLifecycle",children:"here"}),")."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"io.kadai.spi.task.api.BeforeRequestChangesProvider"})," : Add actions on Task that are executed before changes on a reviewed Task have been requested (See more about Task Lifecycle ",(0,i.jsx)(s.a,{href:"/kadai-doc/docs/user-guide/core-concepts/taskLifecycle",children:"here"}),")."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"io.kadai.spi.task.api.BeforeRequestReviewProvider"})," : Add actions on Task that are executed before a review on a claimed Task has been requested (See more about Task Lifecycle ",(0,i.jsx)(s.a,{href:"/kadai-doc/docs/user-guide/core-concepts/taskLifecycle",children:"here"}),")."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"io.kadai.spi.task.api.CreateTaskPreprocessor"})," : Add actions on Task that are executed before a new one is created."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"io.kadai.spi.task.api.ReviewRequiredProvider"})," : Add actions on Task that are executed after changes on reviewed Task have been requested (See more about Task Lifecycle ",(0,i.jsx)(s.a,{href:"/kadai-doc/docs/user-guide/core-concepts/taskLifecycle",children:"here"}),")."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"io.kadai.spi.user.api.RefreshUserPostprocessor"})," : Add actions on User that are executed each time after the User is refreshed."]}),"\n"]})]})}function l(e={}){const{wrapper:s}={...(0,a.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},8453:(e,s,r)=>{r.d(s,{R:()=>t,x:()=>d});var i=r(6540);const a={},o=i.createContext(a);function t(e){const s=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function d(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:t(e.components),i.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7218d785.3f34ec24.js b/assets/js/7218d785.3f34ec24.js new file mode 100644 index 0000000..0d1a20e --- /dev/null +++ b/assets/js/7218d785.3f34ec24.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[5481],{762:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>n,contentTitle:()=>d,default:()=>l,frontMatter:()=>t,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"user-guide/features/listOfProvidedSPIs","title":"List of provided SPIs","description":"Please read general SPI information to understand SPIs in KADAI in general.","source":"@site/docs/user-guide/features/listOfProvidedSPIs.md","sourceDirName":"user-guide/features","slug":"/user-guide/features/listOfProvidedSPIs","permalink":"/kadai-doc/docs/user-guide/features/listOfProvidedSPIs","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"sidebar_position":2},"sidebar":"userSidebar","previous":{"title":"How to use Service Provider Interfaces (SPIs)","permalink":"/kadai-doc/docs/user-guide/features/howToUseServiceProviderInterfaces"},"next":{"title":"KadaiHistory SPI","permalink":"/kadai-doc/docs/user-guide/features/kadaiHistorySPI"}}');var a=r(4848),o=r(8453);const t={sidebar_position:2},d="List of provided SPIs",n={},c=[];function u(e){const s={a:"a",h1:"h1",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(s.header,{children:(0,a.jsx)(s.h1,{id:"list-of-provided-spis",children:"List of provided SPIs"})}),"\n",(0,a.jsxs)(s.p,{children:["Please read ",(0,a.jsx)(s.a,{href:"/kadai-doc/docs/user-guide/features/howToUseServiceProviderInterfaces",children:"general SPI information"})," to understand SPIs in KADAI in general."]}),"\n",(0,a.jsx)(s.p,{children:"Currently, KADAI provides the following SPIs:"}),"\n",(0,a.jsxs)(s.ul,{children:["\n",(0,a.jsxs)(s.li,{children:[(0,a.jsx)(s.strong,{children:"io.kadai.spi.history.api.KadaiHistory"})," : Look up the history of KADAI. You can read more use cases for HistoryService ",(0,a.jsx)(s.a,{href:"/kadai-doc/docs/user-guide/features/kadaiHistorySPI",children:"here"}),"."]}),"\n",(0,a.jsxs)(s.li,{children:[(0,a.jsx)(s.strong,{children:"io.kadai.spi.priority.api.PriorityServiceProvider"})," : Add rules for the calculation of Task priority."]}),"\n",(0,a.jsxs)(s.li,{children:[(0,a.jsx)(s.strong,{children:"io.kadai.spi.routing.api.TaskRoutingProvider"})," : Add rules for automated Workbasket assignment for some of the new Tasks."]}),"\n",(0,a.jsxs)(s.li,{children:[(0,a.jsx)(s.strong,{children:"io.kadai.spi.task.api.AfterRequestChangesProvider"})," : Add actions on Task that are executed after changes on reviewed Task have been requested (See more about Task Lifecycle ",(0,a.jsx)(s.a,{href:"/kadai-doc/docs/user-guide/core-concepts/taskLifecycle",children:"here"}),")."]}),"\n",(0,a.jsxs)(s.li,{children:[(0,a.jsx)(s.strong,{children:"io.kadai.spi.task.api.AfterRequestReviewProvider"})," : Add actions on Task that are executed after a review on a claimed Task has been requested (See more about Task Lifecycle ",(0,a.jsx)(s.a,{href:"/kadai-doc/docs/user-guide/core-concepts/taskLifecycle",children:"here"}),")."]}),"\n",(0,a.jsxs)(s.li,{children:[(0,a.jsx)(s.strong,{children:"io.kadai.spi.task.api.BeforeRequestChangesProvider"})," : Add actions on Task that are executed before changes on a reviewed Task have been requested (See more about Task Lifecycle ",(0,a.jsx)(s.a,{href:"/kadai-doc/docs/user-guide/core-concepts/taskLifecycle",children:"here"}),")."]}),"\n",(0,a.jsxs)(s.li,{children:[(0,a.jsx)(s.strong,{children:"io.kadai.spi.task.api.BeforeRequestReviewProvider"})," : Add actions on Task that are executed before a review on a claimed Task has been requested (See more about Task Lifecycle ",(0,a.jsx)(s.a,{href:"/kadai-doc/docs/user-guide/core-concepts/taskLifecycle",children:"here"}),")."]}),"\n",(0,a.jsxs)(s.li,{children:[(0,a.jsx)(s.strong,{children:"io.kadai.spi.task.api.CreateTaskPreprocessor"})," : Add actions on Task that are executed before a new one is created."]}),"\n",(0,a.jsxs)(s.li,{children:[(0,a.jsx)(s.strong,{children:"io.kadai.spi.task.api.ReviewRequiredProvider"})," : Add actions on Task that are executed after changes on reviewed Task have been requested (See more about Task Lifecycle ",(0,a.jsx)(s.a,{href:"/kadai-doc/docs/user-guide/core-concepts/taskLifecycle",children:"here"}),")."]}),"\n",(0,a.jsxs)(s.li,{children:[(0,a.jsx)(s.strong,{children:"io.kadai.spi.user.api.RefreshUserPostprocessor"})," : Add actions on User that are executed each time after the User is refreshed."]}),"\n"]})]})}function l(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,a.jsx)(s,{...e,children:(0,a.jsx)(u,{...e})}):u(e)}},8453:(e,s,r)=>{r.d(s,{R:()=>t,x:()=>d});var i=r(6540);const a={},o=i.createContext(a);function t(e){const s=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function d(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:t(e.components),i.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/76ee90bb.3d0f6f39.js b/assets/js/76ee90bb.3d0f6f39.js new file mode 100644 index 0000000..13efd71 --- /dev/null +++ b/assets/js/76ee90bb.3d0f6f39.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[6461],{1075:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>d,contentTitle:()=>a,default:()=>c,frontMatter:()=>r,metadata:()=>i,toc:()=>u});const i=JSON.parse('{"id":"user-guide/features/jobs","title":"KADAI Jobs","description":"During the usage of KADAI, some functionality has to be executed in the background implicitly.","source":"@site/docs/user-guide/features/jobs.md","sourceDirName":"user-guide/features","slug":"/user-guide/features/jobs","permalink":"/kadai-doc/docs/user-guide/features/jobs","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":4,"frontMatter":{"sidebar_position":4},"sidebar":"userSidebar","previous":{"title":"KadaiHistory SPI","permalink":"/kadai-doc/docs/user-guide/features/kadaiHistorySPI"},"next":{"title":"Monitoring","permalink":"/kadai-doc/docs/user-guide/features/monitoring"}}');var o=t(4848),n=t(8453);const r={sidebar_position:4},a="KADAI Jobs",d={},u=[{value:"TaskPriorityUpdateJob",id:"taskpriorityupdatejob",level:3},{value:"UserInfoRefreshJob",id:"userinforefreshjob",level:3},{value:"TaskCleanupJob",id:"taskcleanupjob",level:3},{value:"HistoryCleanupJob",id:"historycleanupjob",level:3}];function l(e){const s={a:"a",h1:"h1",h3:"h3",header:"header",p:"p",...(0,n.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.header,{children:(0,o.jsx)(s.h1,{id:"kadai-jobs",children:"KADAI Jobs"})}),"\n",(0,o.jsxs)(s.p,{children:["During the usage of KADAI, some functionality has to be executed in the background implicitly.\nThis is by Jobs that are run by the scheduler.\nBoth scheduler and customizable Jobs\nrun at a fixed rate that can be specified during KADAI set up.\nEach time the scheduler is run, it starts all jobs that are due.\nThis way, jobs can be created and run automatically.\nJobs can only be started by the scheduler.\nIf the scheduler is run once daily, a job can't be executed more frequently.\nAll job configuration options are explained ",(0,o.jsx)(s.a,{href:"/kadai-doc/docs/user-guide/configuration/kadaiJobs",children:"here"}),"."]}),"\n",(0,o.jsx)(s.p,{children:"You can implement your own Jobs or use Jobs provided by KADAI. The jobs provided by KADAI are listed\nbelow."}),"\n",(0,o.jsx)(s.h3,{id:"taskpriorityupdatejob",children:"TaskPriorityUpdateJob"}),"\n",(0,o.jsx)(s.p,{children:"This job updates Task priority for each Task once in a fixed time interval."}),"\n",(0,o.jsx)(s.h3,{id:"userinforefreshjob",children:"UserInfoRefreshJob"}),"\n",(0,o.jsx)(s.p,{children:"This job loads User Info into the User table from the .ldif file once in a fixed time interval."}),"\n",(0,o.jsx)(s.h3,{id:"taskcleanupjob",children:"TaskCleanupJob"}),"\n",(0,o.jsx)(s.p,{children:"This job deletes Tasks completed longer than a fixed time ago. This Job also runs at a fixed rate."}),"\n",(0,o.jsx)(s.h3,{id:"historycleanupjob",children:"HistoryCleanupJob"}),"\n",(0,o.jsx)(s.p,{children:"This job deletes HistoryEvents for deleted Tasks. This Job also runs at a fixed rate."})]})}function c(e={}){const{wrapper:s}={...(0,n.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,s,t)=>{t.d(s,{R:()=>r,x:()=>a});var i=t(6540);const o={},n=i.createContext(o);function r(e){const s=i.useContext(n);return i.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),i.createElement(n.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/76ee90bb.42a459cc.js b/assets/js/76ee90bb.42a459cc.js deleted file mode 100644 index 64e7a9f..0000000 --- a/assets/js/76ee90bb.42a459cc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[6461],{9564:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>d,contentTitle:()=>r,default:()=>c,frontMatter:()=>n,metadata:()=>a,toc:()=>u});var i=t(4848),o=t(8453);const n={sidebar_position:4},r="KADAI Jobs",a={id:"user-guide/features/jobs",title:"KADAI Jobs",description:"During the usage of KADAI, some functionality has to be executed in the background implicitly.",source:"@site/docs/user-guide/features/jobs.md",sourceDirName:"user-guide/features",slug:"/user-guide/features/jobs",permalink:"/kadai-doc/docs/user-guide/features/jobs",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:4,frontMatter:{sidebar_position:4},sidebar:"userSidebar",previous:{title:"KadaiHistory SPI",permalink:"/kadai-doc/docs/user-guide/features/kadaiHistorySPI"},next:{title:"Monitoring",permalink:"/kadai-doc/docs/user-guide/features/monitoring"}},d={},u=[{value:"TaskPriorityUpdateJob",id:"taskpriorityupdatejob",level:3},{value:"UserInfoRefreshJob",id:"userinforefreshjob",level:3},{value:"TaskCleanupJob",id:"taskcleanupjob",level:3},{value:"HistoryCleanupJob",id:"historycleanupjob",level:3}];function l(e){const s={a:"a",h1:"h1",h3:"h3",header:"header",p:"p",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"kadai-jobs",children:"KADAI Jobs"})}),"\n",(0,i.jsxs)(s.p,{children:["During the usage of KADAI, some functionality has to be executed in the background implicitly.\nThis is by Jobs that are run by the scheduler.\nBoth scheduler and customizable Jobs\nrun at a fixed rate that can be specified during KADAI set up.\nEach time the scheduler is run, it starts all jobs that are due.\nThis way, jobs can be created and run automatically.\nJobs can only be started by the scheduler.\nIf the scheduler is run once daily, a job can't be executed more frequently.\nAll job configuration options are explained ",(0,i.jsx)(s.a,{href:"/kadai-doc/docs/user-guide/configuration/kadaiJobs",children:"here"}),"."]}),"\n",(0,i.jsx)(s.p,{children:"You can implement your own Jobs or use Jobs provided by KADAI. The jobs provided by KADAI are listed\nbelow."}),"\n",(0,i.jsx)(s.h3,{id:"taskpriorityupdatejob",children:"TaskPriorityUpdateJob"}),"\n",(0,i.jsx)(s.p,{children:"This job updates Task priority for each Task once in a fixed time interval."}),"\n",(0,i.jsx)(s.h3,{id:"userinforefreshjob",children:"UserInfoRefreshJob"}),"\n",(0,i.jsx)(s.p,{children:"This job loads User Info into the User table from the .ldif file once in a fixed time interval."}),"\n",(0,i.jsx)(s.h3,{id:"taskcleanupjob",children:"TaskCleanupJob"}),"\n",(0,i.jsx)(s.p,{children:"This job deletes Tasks completed longer than a fixed time ago. This Job also runs at a fixed rate."}),"\n",(0,i.jsx)(s.h3,{id:"historycleanupjob",children:"HistoryCleanupJob"}),"\n",(0,i.jsx)(s.p,{children:"This job deletes HistoryEvents for deleted Tasks. This Job also runs at a fixed rate."})]})}function c(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},8453:(e,s,t)=>{t.d(s,{R:()=>r,x:()=>a});var i=t(6540);const o={},n=i.createContext(o);function r(e){const s=i.useContext(n);return i.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),i.createElement(n.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/81ecd14e.248fa2ae.js b/assets/js/81ecd14e.248fa2ae.js deleted file mode 100644 index e6c22de..0000000 --- a/assets/js/81ecd14e.248fa2ae.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[290],{421:(e,r,s)=>{s.r(r),s.d(r,{assets:()=>u,contentTitle:()=>a,default:()=>l,frontMatter:()=>t,metadata:()=>o,toc:()=>d});var n=s(4848),i=s(8453);const t={sidebar_position:7},a="Queries: Filtering and Sorting",o={id:"user-guide/features/queriesFilteringAndSorting",title:"Queries: Filtering and Sorting",description:"You can get a list of Tasks, Workbaskets, Classifications,",source:"@site/docs/user-guide/features/queriesFilteringAndSorting.md",sourceDirName:"user-guide/features",slug:"/user-guide/features/queriesFilteringAndSorting",permalink:"/kadai-doc/docs/user-guide/features/queriesFilteringAndSorting",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:7,frontMatter:{sidebar_position:7},sidebar:"userSidebar",previous:{title:"Users",permalink:"/kadai-doc/docs/user-guide/features/users"},next:{title:"Reference",permalink:"/kadai-doc/docs/category/reference"}},u={},d=[{value:"Query usage in the REST-API",id:"query-usage-in-the-rest-api",level:2}];function c(e){const r={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",img:"img",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(r.header,{children:(0,n.jsx)(r.h1,{id:"queries-filtering-and-sorting",children:"Queries: Filtering and Sorting"})}),"\n",(0,n.jsx)(r.p,{children:"You can get a list of Tasks, Workbaskets, Classifications,\nUsers and other resources using KADAI queries.\nThey allow filtering and sorting according to different criteria, e.g., priority,\nowner, etc. Queries can be executed using the REST-API or the Java-API."}),"\n",(0,n.jsx)(r.h2,{id:"query-usage-in-the-rest-api",children:"Query usage in the REST-API"}),"\n",(0,n.jsxs)(r.p,{children:["KADAI provides a REST-API described ",(0,n.jsx)(r.a,{href:"../core-concepts/restApi",children:"here"}),'.\nYou should use HTTP GET method to execute a query.\nQuery parameters for filtering and sorting are specified in the HTTP request after "?".\nFor example, the following request will return all Tasks that are owned by ',(0,n.jsx)(r.em,{children:"user-1-1"})," or ",(0,n.jsx)(r.em,{children:"user-1-2"}),":"]}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{children:"GET http://localhost:8080/kadai/api/v1/tasks?owner-in=user-1-1&owner-in=user-1-2\n"})}),"\n",(0,n.jsxs)(r.p,{children:["You can try querying using Postman like in our ",(0,n.jsx)(r.a,{href:"/kadai-doc/docs/user-guide/getting-started/exampleSpringBoot#step-5-try-out-the-rest-api",children:"Spring Boot example"}),".\nHere is an example of the query from our ",(0,n.jsx)(r.a,{href:"../core-concepts/restApi",children:"REST-API doc"})," using Postman:"]}),"\n",(0,n.jsx)(r.p,{children:(0,n.jsx)(r.img,{alt:"Query",src:s(8267).A+"",width:"1920",height:"1012"})}),"\n",(0,n.jsxs)(r.p,{children:["More about queries using the REST-API can be found in the ",(0,n.jsx)(r.a,{href:"https://kadai-io.azurewebsites.net/kadai/swagger-ui/index.html",children:"REST-API Documentation"}),"."]}),"\n",(0,n.jsx)(r.h1,{id:"query-in-java-api",children:"Query in JAVA-API"}),"\n",(0,n.jsxs)(r.p,{children:["You can also execute queries using the ",(0,n.jsx)(r.a,{href:"/kadai-doc/docs/user-guide/core-concepts/javaApiUsage",children:"JAVA-API"})," of KADAI. To do that, create a query using the service of the relevant entity. Then, add filtering and sorting parameters to your query and execute it. When querying for Tasks, you need to use ",(0,n.jsx)(r.code,{children:"TaskService.createTaskQuery()"}),". You can find the query filter and sorting parameters under ",(0,n.jsx)(r.code,{children:"io.kadai.TaskQuery.api"}),".\nHere is an example of a query that returns Tasks owned by ",(0,n.jsx)(r.em,{children:"user-1-1"})," or ",(0,n.jsx)(r.em,{children:"user-1-2"})," sorted by the business process id of the Task:"]}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-language",children:'List tasks = taskService.createTaskQuery()\n .ownerIn("user-1-1","user-1-2").orderByBusinessProcessId(SortDirection.ASCENDING)\n .list();\n'})})]})}function l(e={}){const{wrapper:r}={...(0,i.R)(),...e.components};return r?(0,n.jsx)(r,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},8267:(e,r,s)=>{s.d(r,{A:()=>n});const n=s.p+"assets/images/postman-query-4913da54d8ba8e03fc9fd64d36edcc0c.png"},8453:(e,r,s)=>{s.d(r,{R:()=>a,x:()=>o});var n=s(6540);const i={},t=n.createContext(i);function a(e){const r=n.useContext(t);return n.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function o(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),n.createElement(t.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/81ecd14e.361244e6.js b/assets/js/81ecd14e.361244e6.js new file mode 100644 index 0000000..d32a859 --- /dev/null +++ b/assets/js/81ecd14e.361244e6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[290],{8265:(e,r,s)=>{s.r(r),s.d(r,{assets:()=>u,contentTitle:()=>o,default:()=>l,frontMatter:()=>a,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"user-guide/features/queriesFilteringAndSorting","title":"Queries: Filtering and Sorting","description":"You can get a list of Tasks, Workbaskets, Classifications,","source":"@site/docs/user-guide/features/queriesFilteringAndSorting.md","sourceDirName":"user-guide/features","slug":"/user-guide/features/queriesFilteringAndSorting","permalink":"/kadai-doc/docs/user-guide/features/queriesFilteringAndSorting","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":7,"frontMatter":{"sidebar_position":7},"sidebar":"userSidebar","previous":{"title":"Users","permalink":"/kadai-doc/docs/user-guide/features/users"},"next":{"title":"Reference","permalink":"/kadai-doc/docs/category/reference"}}');var i=s(4848),t=s(8453);const a={sidebar_position:7},o="Queries: Filtering and Sorting",u={},d=[{value:"Query usage in the REST-API",id:"query-usage-in-the-rest-api",level:2}];function c(e){const r={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",img:"img",p:"p",pre:"pre",...(0,t.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(r.header,{children:(0,i.jsx)(r.h1,{id:"queries-filtering-and-sorting",children:"Queries: Filtering and Sorting"})}),"\n",(0,i.jsx)(r.p,{children:"You can get a list of Tasks, Workbaskets, Classifications,\nUsers and other resources using KADAI queries.\nThey allow filtering and sorting according to different criteria, e.g., priority,\nowner, etc. Queries can be executed using the REST-API or the Java-API."}),"\n",(0,i.jsx)(r.h2,{id:"query-usage-in-the-rest-api",children:"Query usage in the REST-API"}),"\n",(0,i.jsxs)(r.p,{children:["KADAI provides a REST-API described ",(0,i.jsx)(r.a,{href:"../core-concepts/restApi",children:"here"}),'.\nYou should use HTTP GET method to execute a query.\nQuery parameters for filtering and sorting are specified in the HTTP request after "?".\nFor example, the following request will return all Tasks that are owned by ',(0,i.jsx)(r.em,{children:"user-1-1"})," or ",(0,i.jsx)(r.em,{children:"user-1-2"}),":"]}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{children:"GET http://localhost:8080/kadai/api/v1/tasks?owner-in=user-1-1&owner-in=user-1-2\n"})}),"\n",(0,i.jsxs)(r.p,{children:["You can try querying using Postman like in our ",(0,i.jsx)(r.a,{href:"/kadai-doc/docs/user-guide/getting-started/exampleSpringBoot#step-5-try-out-the-rest-api",children:"Spring Boot example"}),".\nHere is an example of the query from our ",(0,i.jsx)(r.a,{href:"../core-concepts/restApi",children:"REST-API doc"})," using Postman:"]}),"\n",(0,i.jsx)(r.p,{children:(0,i.jsx)(r.img,{alt:"Query",src:s(8267).A+"",width:"1920",height:"1012"})}),"\n",(0,i.jsxs)(r.p,{children:["More about queries using the REST-API can be found in the ",(0,i.jsx)(r.a,{href:"https://kadai-io.azurewebsites.net/kadai/swagger-ui/index.html",children:"REST-API Documentation"}),"."]}),"\n",(0,i.jsx)(r.h1,{id:"query-in-java-api",children:"Query in JAVA-API"}),"\n",(0,i.jsxs)(r.p,{children:["You can also execute queries using the ",(0,i.jsx)(r.a,{href:"/kadai-doc/docs/user-guide/core-concepts/javaApiUsage",children:"JAVA-API"})," of KADAI. To do that, create a query using the service of the relevant entity. Then, add filtering and sorting parameters to your query and execute it. When querying for Tasks, you need to use ",(0,i.jsx)(r.code,{children:"TaskService.createTaskQuery()"}),". You can find the query filter and sorting parameters under ",(0,i.jsx)(r.code,{children:"io.kadai.TaskQuery.api"}),".\nHere is an example of a query that returns Tasks owned by ",(0,i.jsx)(r.em,{children:"user-1-1"})," or ",(0,i.jsx)(r.em,{children:"user-1-2"})," sorted by the business process id of the Task:"]}),"\n",(0,i.jsx)(r.pre,{children:(0,i.jsx)(r.code,{className:"language-language",children:'List tasks = taskService.createTaskQuery()\n .ownerIn("user-1-1","user-1-2").orderByBusinessProcessId(SortDirection.ASCENDING)\n .list();\n'})})]})}function l(e={}){const{wrapper:r}={...(0,t.R)(),...e.components};return r?(0,i.jsx)(r,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},8267:(e,r,s)=>{s.d(r,{A:()=>n});const n=s.p+"assets/images/postman-query-4913da54d8ba8e03fc9fd64d36edcc0c.png"},8453:(e,r,s)=>{s.d(r,{R:()=>a,x:()=>o});var n=s(6540);const i={},t=n.createContext(i);function a(e){const r=n.useContext(t);return n.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function o(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),n.createElement(t.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/93b79e6e.1aa76eae.js b/assets/js/93b79e6e.1aa76eae.js new file mode 100644 index 0000000..98c69d5 --- /dev/null +++ b/assets/js/93b79e6e.1aa76eae.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[2295],{4996:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>a,contentTitle:()=>d,default:()=>h,frontMatter:()=>o,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"user-guide/configuration/priorityReport","title":"Priority Report","description":"KADAI provides the possibility to customize Priority Reports in the UI. To configure it, go to \u201cSettings\u201d in the KADAI UI.","source":"@site/docs/user-guide/configuration/priorityReport.md","sourceDirName":"user-guide/configuration","slug":"/user-guide/configuration/priorityReport","permalink":"/kadai-doc/docs/user-guide/configuration/priorityReport","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":8,"frontMatter":{"sidebar_position":8},"sidebar":"userSidebar","previous":{"title":"History and Custom Properties","permalink":"/kadai-doc/docs/user-guide/configuration/historyAndCustomProperties"},"next":{"title":"UI","permalink":"/kadai-doc/docs/user-guide/configuration/ui"}}');var n=i(4848),s=i(8453);const o={sidebar_position:8},d="Priority Report",a={},c=[{value:"Placement of this configuration in KADAI",id:"placement-of-this-configuration-in-kadai",level:3}];function l(e){const t={code:"code",h1:"h1",h3:"h3",header:"header",img:"img",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"priority-report",children:"Priority Report"})}),"\n",(0,n.jsx)(t.p,{children:"KADAI provides the possibility to customize Priority Reports in the UI. To configure it, go to \u201cSettings\u201d in the KADAI UI."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"setting",src:i(1334).A+"",width:"4112",height:"2420"})}),"\n",(0,n.jsx)(t.p,{children:"Currently, the UI supports the following types of parameters:"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Type"}),(0,n.jsx)(t.th,{children:"What the UI shows"}),(0,n.jsx)(t.th,{children:"Usage"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"text"}),(0,n.jsx)(t.td,{children:"an input field where text can be typed in"}),(0,n.jsx)(t.td,{children:"Priority names"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"interval"}),(0,n.jsx)(t.td,{children:"two input fields for numbers, a lower and an upper boundary"}),(0,n.jsx)(t.td,{children:"Priority intervals"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"color"}),(0,n.jsx)(t.td,{children:"a color picker"}),(0,n.jsx)(t.td,{children:"Priority colors"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"json"}),(0,n.jsx)(t.td,{children:"a text area where a string in json format can be typed in."}),(0,n.jsx)(t.td,{children:"Filter values"})]})]})]}),"\n",(0,n.jsx)(t.h3,{id:"placement-of-this-configuration-in-kadai",children:"Placement of this configuration in KADAI"}),"\n",(0,n.jsxs)(t.p,{children:["The parameters described above are saved in the CONFIGURATION table under CUSTOM_ATTRIBUTES.\nThe data structure is divided in two parts:\nThe fields with their corresponding values and a field named ",(0,n.jsx)(t.code,{children:"schema"}),".\nThat field contains all information needed in the UI to display those parameters.\nThe default values can be found there."]})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},1334:(e,t,i)=>{i.d(t,{A:()=>r});const r=i.p+"assets/images/UISettings-5e62e293ad2cf2235861e3a8af822d18.png"},8453:(e,t,i)=>{i.d(t,{R:()=>o,x:()=>d});var r=i(6540);const n={},s=r.createContext(n);function o(e){const t=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),r.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/93b79e6e.4ba105a9.js b/assets/js/93b79e6e.4ba105a9.js deleted file mode 100644 index 86bb2c9..0000000 --- a/assets/js/93b79e6e.4ba105a9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[2295],{8579:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>a,contentTitle:()=>s,default:()=>h,frontMatter:()=>o,metadata:()=>d,toc:()=>c});var r=i(4848),n=i(8453);const o={sidebar_position:8},s="Priority Report",d={id:"user-guide/configuration/priorityReport",title:"Priority Report",description:"KADAI provides the possibility to customize Priority Reports in the UI. To configure it, go to \u201cSettings\u201d in the KADAI UI.",source:"@site/docs/user-guide/configuration/priorityReport.md",sourceDirName:"user-guide/configuration",slug:"/user-guide/configuration/priorityReport",permalink:"/kadai-doc/docs/user-guide/configuration/priorityReport",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:8,frontMatter:{sidebar_position:8},sidebar:"userSidebar",previous:{title:"History and Custom Properties",permalink:"/kadai-doc/docs/user-guide/configuration/historyAndCustomProperties"},next:{title:"UI",permalink:"/kadai-doc/docs/user-guide/configuration/ui"}},a={},c=[{value:"Placement of this configuration in KADAI",id:"placement-of-this-configuration-in-kadai",level:3}];function l(e){const t={code:"code",h1:"h1",h3:"h3",header:"header",img:"img",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,n.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"priority-report",children:"Priority Report"})}),"\n",(0,r.jsx)(t.p,{children:"KADAI provides the possibility to customize Priority Reports in the UI. To configure it, go to \u201cSettings\u201d in the KADAI UI."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{alt:"setting",src:i(1334).A+"",width:"4112",height:"2420"})}),"\n",(0,r.jsx)(t.p,{children:"Currently, the UI supports the following types of parameters:"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Type"}),(0,r.jsx)(t.th,{children:"What the UI shows"}),(0,r.jsx)(t.th,{children:"Usage"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"text"}),(0,r.jsx)(t.td,{children:"an input field where text can be typed in"}),(0,r.jsx)(t.td,{children:"Priority names"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"interval"}),(0,r.jsx)(t.td,{children:"two input fields for numbers, a lower and an upper boundary"}),(0,r.jsx)(t.td,{children:"Priority intervals"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"color"}),(0,r.jsx)(t.td,{children:"a color picker"}),(0,r.jsx)(t.td,{children:"Priority colors"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"json"}),(0,r.jsx)(t.td,{children:"a text area where a string in json format can be typed in."}),(0,r.jsx)(t.td,{children:"Filter values"})]})]})]}),"\n",(0,r.jsx)(t.h3,{id:"placement-of-this-configuration-in-kadai",children:"Placement of this configuration in KADAI"}),"\n",(0,r.jsxs)(t.p,{children:["The parameters described above are saved in the CONFIGURATION table under CUSTOM_ATTRIBUTES.\nThe data structure is divided in two parts:\nThe fields with their corresponding values and a field named ",(0,r.jsx)(t.code,{children:"schema"}),".\nThat field contains all information needed in the UI to display those parameters.\nThe default values can be found there."]})]})}function h(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},1334:(e,t,i)=>{i.d(t,{A:()=>r});const r=i.p+"assets/images/UISettings-5e62e293ad2cf2235861e3a8af822d18.png"},8453:(e,t,i)=>{i.d(t,{R:()=>s,x:()=>d});var r=i(6540);const n={},o=r.createContext(n);function s(e){const t=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:s(e.components),r.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/955ca316.64a1d0be.js b/assets/js/955ca316.64a1d0be.js new file mode 100644 index 0000000..22b96f7 --- /dev/null +++ b/assets/js/955ca316.64a1d0be.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[268],{625:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>o,toc:()=>l});const o=JSON.parse('{"id":"user-guide/features/howToUseServiceProviderInterfaces","title":"How to use Service Provider Interfaces (SPIs)","description":"KADAI allows","source":"@site/docs/user-guide/features/howToUseServiceProviderInterfaces.md","sourceDirName":"user-guide/features","slug":"/user-guide/features/howToUseServiceProviderInterfaces","permalink":"/kadai-doc/docs/user-guide/features/howToUseServiceProviderInterfaces","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1},"sidebar":"userSidebar","previous":{"title":"Features","permalink":"/kadai-doc/docs/category/features"},"next":{"title":"List of provided SPIs","permalink":"/kadai-doc/docs/user-guide/features/listOfProvidedSPIs"}}');var n=i(4848),s=i(8453);const r={sidebar_position:1},a="How to use Service Provider Interfaces (SPIs)",c={},l=[];function d(e){const t={a:"a",code:"code",h1:"h1",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"how-to-use-service-provider-interfaces-spis",children:"How to use Service Provider Interfaces (SPIs)"})}),"\n",(0,n.jsxs)(t.p,{children:["KADAI allows\ncustomizing and modify its behavior through the use of dedicated Service Provider Interfaces\n(SPI).\nEach SPI defines an interface that can be implemented by custom code.\nThis is a common approach for Java developers to extend their applications.\nYou can find out more about the background and the details in the Java documentation:\n",(0,n.jsx)(t.a,{href:"https://docs.oracle.com/javase/tutorial/sound/SPI-intro.html",children:"https://docs.oracle.com/javase/tutorial/sound/SPI-intro.html"})]}),"\n",(0,n.jsx)(t.p,{children:"To use an SPI within KADAI, do the following:"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsx)(t.li,{children:"Create a class that implements the relevant interface."}),"\n",(0,n.jsx)(t.li,{children:"Place that class into the classpath of your application."}),"\n",(0,n.jsx)(t.li,{children:"Provide a control file with the full name of the SPI (e.g., io.kadai.spi.task.api.CreateTaskPreprocessor) in the subdirectory META-INF/services of the classpath. This control file must contain the fully qualified classname (including the package) of the class that implements the relevant interface. This control file is used by the ServiceLoader to load the custom class at runtime. The control file may contain multiple classes that implement the interface. Each implementation should be declared in a new line. All implementations will be used consecutively in the declaration order of the control file."}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:'The steps above can look the following way for implementing the SPI "TaskRoutingProvider":'}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsx)(t.li,{children:"Implement TaskRoutingProvider in a class with the name DmnTaskRouter."}),"\n",(0,n.jsx)(t.li,{children:"Place this class within your application, for example, into the package myapp."}),"\n",(0,n.jsx)(t.li,{children:"Create src/main/resources/META-INF/services/io.kadai.spi.routing.api.TaskRoutingProvider with the following content:"}),"\n"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"myapp.DmnTaskRouter\n"})}),"\n",(0,n.jsx)(t.p,{children:"If you provide one or multiple implementations according to the description above,\nKADAI will invoke the implementations at a specific point.\nFor example,\nthe implementation of the CreateTaskPreprocessor will be invoked\nbefore a new Task is inserted into the database.\nThe Javadoc of each SPI describes these invocation conditions."}),"\n",(0,n.jsxs)(t.p,{children:["You can see the list of SPIs provided by KADAI ",(0,n.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/features/listOfProvidedSPIs",children:"here"}),"."]})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>r,x:()=>a});var o=i(6540);const n={},s=o.createContext(n);function r(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/955ca316.dbe0cc67.js b/assets/js/955ca316.dbe0cc67.js deleted file mode 100644 index a35fa64..0000000 --- a/assets/js/955ca316.dbe0cc67.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[268],{2050:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var o=i(4848),n=i(8453);const s={sidebar_position:1},r="How to use Service Provider Interfaces (SPIs)",a={id:"user-guide/features/howToUseServiceProviderInterfaces",title:"How to use Service Provider Interfaces (SPIs)",description:"KADAI allows",source:"@site/docs/user-guide/features/howToUseServiceProviderInterfaces.md",sourceDirName:"user-guide/features",slug:"/user-guide/features/howToUseServiceProviderInterfaces",permalink:"/kadai-doc/docs/user-guide/features/howToUseServiceProviderInterfaces",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"userSidebar",previous:{title:"Features",permalink:"/kadai-doc/docs/category/features"},next:{title:"List of provided SPIs",permalink:"/kadai-doc/docs/user-guide/features/listOfProvidedSPIs"}},c={},l=[];function d(e){const t={a:"a",code:"code",h1:"h1",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,n.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"how-to-use-service-provider-interfaces-spis",children:"How to use Service Provider Interfaces (SPIs)"})}),"\n",(0,o.jsxs)(t.p,{children:["KADAI allows\ncustomizing and modify its behavior through the use of dedicated Service Provider Interfaces\n(SPI).\nEach SPI defines an interface that can be implemented by custom code.\nThis is a common approach for Java developers to extend their applications.\nYou can find out more about the background and the details in the Java documentation:\n",(0,o.jsx)(t.a,{href:"https://docs.oracle.com/javase/tutorial/sound/SPI-intro.html",children:"https://docs.oracle.com/javase/tutorial/sound/SPI-intro.html"})]}),"\n",(0,o.jsx)(t.p,{children:"To use an SPI within KADAI, do the following:"}),"\n",(0,o.jsxs)(t.ol,{children:["\n",(0,o.jsx)(t.li,{children:"Create a class that implements the relevant interface."}),"\n",(0,o.jsx)(t.li,{children:"Place that class into the classpath of your application."}),"\n",(0,o.jsx)(t.li,{children:"Provide a control file with the full name of the SPI (e.g., io.kadai.spi.task.api.CreateTaskPreprocessor) in the subdirectory META-INF/services of the classpath. This control file must contain the fully qualified classname (including the package) of the class that implements the relevant interface. This control file is used by the ServiceLoader to load the custom class at runtime. The control file may contain multiple classes that implement the interface. Each implementation should be declared in a new line. All implementations will be used consecutively in the declaration order of the control file."}),"\n"]}),"\n",(0,o.jsx)(t.p,{children:'The steps above can look the following way for implementing the SPI "TaskRoutingProvider":'}),"\n",(0,o.jsxs)(t.ol,{children:["\n",(0,o.jsx)(t.li,{children:"Implement TaskRoutingProvider in a class with the name DmnTaskRouter."}),"\n",(0,o.jsx)(t.li,{children:"Place this class within your application, for example, into the package myapp."}),"\n",(0,o.jsx)(t.li,{children:"Create src/main/resources/META-INF/services/io.kadai.spi.routing.api.TaskRoutingProvider with the following content:"}),"\n"]}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{children:"myapp.DmnTaskRouter\n"})}),"\n",(0,o.jsx)(t.p,{children:"If you provide one or multiple implementations according to the description above,\nKADAI will invoke the implementations at a specific point.\nFor example,\nthe implementation of the CreateTaskPreprocessor will be invoked\nbefore a new Task is inserted into the database.\nThe Javadoc of each SPI describes these invocation conditions."}),"\n",(0,o.jsxs)(t.p,{children:["You can see the list of SPIs provided by KADAI ",(0,o.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/features/listOfProvidedSPIs",children:"here"}),"."]})]})}function h(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>r,x:()=>a});var o=i(6540);const n={},s=o.createContext(n);function r(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9ec8d0b6.39303c92.js b/assets/js/9ec8d0b6.39303c92.js deleted file mode 100644 index 5a7ffbf..0000000 --- a/assets/js/9ec8d0b6.39303c92.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[1484],{1895:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>m,contentTitle:()=>d,default:()=>h,frontMatter:()=>s,metadata:()=>x,toc:()=>y});var i=n(4848),r=n(8453),o=n(9734),l=n.n(o);const a='\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n',s={sidebar_position:3},d="Java-API usage",x={id:"user-guide/core-concepts/javaApiUsage",title:"Java-API usage",description:"The following article describes the practical implementation of KADAI's main concepts,",source:"@site/docs/user-guide/core-concepts/javaApiUsage.md",sourceDirName:"user-guide/core-concepts",slug:"/user-guide/core-concepts/javaApiUsage",permalink:"/kadai-doc/docs/user-guide/core-concepts/javaApiUsage",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:3,frontMatter:{sidebar_position:3},sidebar:"userSidebar",previous:{title:"Task Lifecycle",permalink:"/kadai-doc/docs/user-guide/core-concepts/taskLifecycle"},next:{title:"REST-API",permalink:"/kadai-doc/docs/user-guide/core-concepts/restApi"}},m={},y=[{value:"Where to find entities and operations on them",id:"where-to-find-entities-and-operations-on-them",level:2},{value:"The core of the Java-API",id:"the-core-of-the-java-api",level:2},{value:"How to create an Entity using the Java-API?",id:"how-to-create-an-entity-using-the-java-api",level:3},{value:"Example Task",id:"example-task",level:4},{value:"How to manipulate an Entity using the Java-API?",id:"how-to-manipulate-an-entity-using-the-java-api",level:3},{value:"How to integrate the Java API of KADAI into your application?",id:"how-to-integrate-the-java-api-of-kadai-into-your-application",level:3}];function c(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"java-api-usage",children:"Java-API usage"})}),"\n","\n",(0,i.jsxs)(t.p,{children:["The following article describes the practical implementation of KADAI's main concepts,\nexplained in the ",(0,i.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/core-concepts/overview",children:"Overview"}),".\nPlease be familiar with the contents of the Overview to understand this article."]}),"\n",(0,i.jsx)(t.h2,{id:"where-to-find-entities-and-operations-on-them",children:"Where to find entities and operations on them"}),"\n",(0,i.jsxs)(t.p,{children:["The Overview describes ",(0,i.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/core-concepts/overview#kadai-entities",children:"entities"})," and ",(0,i.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/core-concepts/overview#operations-on-entities",children:"operations on them"}),"."]}),"\n",(0,i.jsxs)(t.p,{children:["The Task, Classification and Workbasket as well as related entities can be found in ",(0,i.jsx)(t.code,{children:"io.kadai.task.api.models"}),", ",(0,i.jsx)(t.code,{children:"io.kadai.classification.api.models"}),", ",(0,i.jsx)(t.code,{children:"io.kadai.workbasket.api.models"}),". Besides Tasks, Classifications and Workbaskets, KADAI also operates using summary objects: TaskSummaries, ClassificationSummaries and WorkbasketSummaries. They represent the same concepts as Tasks, Classifications and Workbaskets. Each summary object refers to a full entity, but only contains the most important information. For example, a TaskSummary with id 1234 refers to the Task with the id 1234. However, the TaskSummary does not contain the Attachment of the Task as well as some other information. The summary objects can be found in the same package as the complete entity interfaces."]}),"\n",(0,i.jsxs)(t.p,{children:["Creating, Deleting and Updating can be done using TaskService,\nClassificationService and WorkbasketService.\nThe Services can be found in",(0,i.jsx)(t.code,{children:" io.kadai.task.api"}),",\n",(0,i.jsx)(t.code,{children:"io.kadai.classification.api"}),", ",(0,i.jsx)(t.code,{children:"io.kadai.workbasket.api"}),".\nThe corresponding queries can be also found in these packages.\nThey are called TaskQuery, ClassificationQuery and WorkbasketQuery."]}),"\n",(0,i.jsx)(t.h2,{id:"the-core-of-the-java-api",children:"The core of the Java-API"}),"\n",(0,i.jsxs)(t.p,{children:["Below is the diagram that shows different packages that make up the Java-API of KADAI.\nThey can be found in the ",(0,i.jsx)(t.code,{children:"lib/kadai-core"})," folder"]}),"\n",(0,i.jsx)(l(),{content:a}),"\n",(0,i.jsx)("br",{}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"io.kadai.classification.api"}),":"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"The Classification entity that consists of the Classification and ClassificationSummary interfaces in the models folder"}),"\n",(0,i.jsx)(t.li,{children:"Methods to create, update and delete a Classification in the ClassificationService interface"}),"\n",(0,i.jsx)(t.li,{children:"Methods to query the Classification with filtering and sorting in the ClassificationQuery interface"}),"\n",(0,i.jsx)(t.li,{children:"Used Exceptions and Enums"}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"io.kadai.task.api "}),":"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"The Task entity that consists of the Task and TaskSummary interfaces in the models folder"}),"\n",(0,i.jsx)(t.li,{children:"The Attachment entity that consists of the Attachment and AttachmentSummary interfaces in the models folder"}),"\n",(0,i.jsx)(t.li,{children:"The ObjectReference entity that consists of the ObjectReference interface in the models folder"}),"\n",(0,i.jsx)(t.li,{children:"Methods to create, update and delete a Task in the TaskService interface"}),"\n",(0,i.jsx)(t.li,{children:"Methods to query the Task with filtering and sorting in the TaskQuery interface"}),"\n",(0,i.jsx)(t.li,{children:"Used Exceptions and Enums"}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"io.kadai.workbasket.api"}),":"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"The Workbasket entity that consists of the Workbasket and WorkbasketSummary interfaces in the models folder"}),"\n",(0,i.jsx)(t.li,{children:"The WorkbasketAccessItem entity that consists of the WorkbasketAccessItem interface"}),"\n",(0,i.jsx)(t.li,{children:"Methods to create, update and delete a Workbasket in the WorkbasketService interface"}),"\n",(0,i.jsx)(t.li,{children:"Methods to query the Workbasket with filtering and sorting in the WorkbasketQuery interface"}),"\n",(0,i.jsx)(t.li,{children:"Used Exceptions and Enums"}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"io.kadai.common.api"}),":"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"KadaiEngine interface that brings all services of KADAI together"}),"\n",(0,i.jsx)(t.li,{children:"Other, non-entity-related services"}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"io.kadai.monitor.api"}),":"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Report models for aggregating data on an entity can be found in the reports folder"}),"\n",(0,i.jsx)(t.li,{children:"Reports can be created using ReportBuilders from the report folder. They make filtering of entities included in a Report possible"}),"\n",(0,i.jsx)(t.li,{children:"Methods to create ReportBuilder are in the MonitorService interface"}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"io.kadai.user.api"}),":"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"The User entity that consists of the User interface in the models folder"}),"\n",(0,i.jsx)(t.li,{children:"Methods to create, update and delete a User in the UserService interface"}),"\n",(0,i.jsx)(t.li,{children:"Used Exceptions"}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"io.kadai.spi"}),":"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["contains all Service Provider Interfaces (SPIs) of KADAI. An SPI allows the client to change the behavior of KADAI by implementing the SPI. More about SPIs can be found ",(0,i.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/features/howToUseServiceProviderInterfaces",children:"here"}),"."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"how-to-create-an-entity-using-the-java-api",children:"How to create an Entity using the Java-API?"}),"\n",(0,i.jsx)(t.h4,{id:"example-task",children:"Example Task"}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{children:["First create a Task object not persisted in the database yet with method\n",(0,i.jsx)(t.code,{children:"TaskService.newTask"})]}),"\n",(0,i.jsx)(t.li,{children:"Then set some properties of that Task via its setter methods."}),"\n",(0,i.jsxs)(t.li,{children:["Finally, persist this Task to the database via ",(0,i.jsx)(t.code,{children:"TaskSerivce.createTask"})]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["You can find corresponding functions ",(0,i.jsx)(t.code,{children:"WorkbasketService.newWorkbasket"}),", ",(0,i.jsx)(t.code,{children:"ClassificationService.newClassification"})," ",(0,i.jsx)(t.code,{children:"WorkbasketService.createWorkbasket"})," and ",(0,i.jsx)(t.code,{children:"ClassificationService.createClassification"})," in other Services. They can be used to create other entities."]}),"\n",(0,i.jsx)(t.h3,{id:"how-to-manipulate-an-entity-using-the-java-api",children:"How to manipulate an Entity using the Java-API?"}),"\n",(0,i.jsxs)(t.p,{children:["Some properties of an entity can be set via the entity interface\n(e.g., the Task interface) in the KADAI Java-API.\nFor example, the method ",(0,i.jsx)(t.code,{children:" Task.setDescription"})," can be used to set the description of a Task.\nHowever, some properties of entities cannot be set this way.\nFor example, a Workbasket has to be specified during the creation of a Task.\nYou can change the Workbasket by transferring the Task using ",(0,i.jsx)(t.code,{children:"TaskService.transfer"}),".\nThe state of a Task can only be modified by corresponding TaskService methods ",(0,i.jsx)(t.code,{children:"claim"}),",\n",(0,i.jsx)(t.code,{children:"forceClaim"}),",\n",(0,i.jsx)(t.code,{children:"cancelClaim"})," etc. You can read more about the status changes ",(0,i.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/core-concepts/taskLifecycle",children:"here"}),"."]}),"\n",(0,i.jsx)(t.h3,{id:"how-to-integrate-the-java-api-of-kadai-into-your-application",children:"How to integrate the Java API of KADAI into your application?"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"Find out the DataSource for your KADAI database. You can read here (link) about setting it up"}),"\n",(0,i.jsxs)(t.li,{children:["Pass the DataSource to the constructor of ",(0,i.jsx)(t.code,{children:"io.kadai.configuration.KadaiEngineConfiguration"}),"."]}),"\n",(0,i.jsxs)(t.li,{children:["Build a KADAIEngine using ",(0,i.jsx)(t.code,{children:"KadaiEngineConfiguration.buildEngine"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["You can use the corresponding Services by getting them with the methods ",(0,i.jsx)(t.code,{children:"KadaiEngine.getClassificationService"}),", ",(0,i.jsx)(t.code,{children:"KadaiEngine.getTaskService"})," and ",(0,i.jsx)(t.code,{children:"KadaiEngine.getWorkbasketService"}),"."]})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},8478:(e,t,n)=>{n.r(t),n.d(t,{default:()=>o});n(6540);var i=n(2303),r=n(4848);function o(e){let{children:t,fallback:n}=e;return(0,i.A)()?(0,r.jsx)(r.Fragment,{children:t?.()}):n??null}},9734:(e,t,n)=>{var i=n(8478),r=n(6540);function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var l=o(i),a=o(r),s=function(){return s=Object.assign||function(e){for(var t,n=1,i=arguments.length;n div {\n margin-left: auto;\n margin-right: auto;\n border: 1px solid transparent;\n min-width: 180px;\n}\n");var d=function(e){var t=e.content,n=e.maxHeight,i=e.autoFit,o=e.autoCrop,l=e.autoOrigin,d=e.allowZoomOut,x=e.allowZoomIn,m=e.checkVisibleState,y=e.toolbarPosition,c=e.toolbarNohide,h=e.toolbarButtons,p=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&t.indexOf(i)<0&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(i=Object.getOwnPropertySymbols(e);r{n.d(t,{R:()=>l,x:()=>a});var i=n(6540);const r={},o=i.createContext(r);function l(e){const t=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),i.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9ec8d0b6.edc58e3d.js b/assets/js/9ec8d0b6.edc58e3d.js new file mode 100644 index 0000000..2c05bd9 --- /dev/null +++ b/assets/js/9ec8d0b6.edc58e3d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[1484],{1780:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>m,contentTitle:()=>x,default:()=>h,frontMatter:()=>d,metadata:()=>i,toc:()=>y});const i=JSON.parse('{"id":"user-guide/core-concepts/javaApiUsage","title":"Java-API usage","description":"The following article describes the practical implementation of KADAI\'s main concepts,","source":"@site/docs/user-guide/core-concepts/javaApiUsage.md","sourceDirName":"user-guide/core-concepts","slug":"/user-guide/core-concepts/javaApiUsage","permalink":"/kadai-doc/docs/user-guide/core-concepts/javaApiUsage","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"sidebar_position":3},"sidebar":"userSidebar","previous":{"title":"Task Lifecycle","permalink":"/kadai-doc/docs/user-guide/core-concepts/taskLifecycle"},"next":{"title":"REST-API","permalink":"/kadai-doc/docs/user-guide/core-concepts/restApi"}}');var r=n(4848),o=n(8453),l=n(9734),a=n.n(l);const s='\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n',d={sidebar_position:3},x="Java-API usage",m={},y=[{value:"Where to find entities and operations on them",id:"where-to-find-entities-and-operations-on-them",level:2},{value:"The core of the Java-API",id:"the-core-of-the-java-api",level:2},{value:"How to create an Entity using the Java-API?",id:"how-to-create-an-entity-using-the-java-api",level:3},{value:"Example Task",id:"example-task",level:4},{value:"How to manipulate an Entity using the Java-API?",id:"how-to-manipulate-an-entity-using-the-java-api",level:3},{value:"How to integrate the Java API of KADAI into your application?",id:"how-to-integrate-the-java-api-of-kadai-into-your-application",level:3}];function c(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",ul:"ul",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"java-api-usage",children:"Java-API usage"})}),"\n","\n",(0,r.jsxs)(t.p,{children:["The following article describes the practical implementation of KADAI's main concepts,\nexplained in the ",(0,r.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/core-concepts/overview",children:"Overview"}),".\nPlease be familiar with the contents of the Overview to understand this article."]}),"\n",(0,r.jsx)(t.h2,{id:"where-to-find-entities-and-operations-on-them",children:"Where to find entities and operations on them"}),"\n",(0,r.jsxs)(t.p,{children:["The Overview describes ",(0,r.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/core-concepts/overview#kadai-entities",children:"entities"})," and ",(0,r.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/core-concepts/overview#operations-on-entities",children:"operations on them"}),"."]}),"\n",(0,r.jsxs)(t.p,{children:["The Task, Classification and Workbasket as well as related entities can be found in ",(0,r.jsx)(t.code,{children:"io.kadai.task.api.models"}),", ",(0,r.jsx)(t.code,{children:"io.kadai.classification.api.models"}),", ",(0,r.jsx)(t.code,{children:"io.kadai.workbasket.api.models"}),". Besides Tasks, Classifications and Workbaskets, KADAI also operates using summary objects: TaskSummaries, ClassificationSummaries and WorkbasketSummaries. They represent the same concepts as Tasks, Classifications and Workbaskets. Each summary object refers to a full entity, but only contains the most important information. For example, a TaskSummary with id 1234 refers to the Task with the id 1234. However, the TaskSummary does not contain the Attachment of the Task as well as some other information. The summary objects can be found in the same package as the complete entity interfaces."]}),"\n",(0,r.jsxs)(t.p,{children:["Creating, Deleting and Updating can be done using TaskService,\nClassificationService and WorkbasketService.\nThe Services can be found in",(0,r.jsx)(t.code,{children:" io.kadai.task.api"}),",\n",(0,r.jsx)(t.code,{children:"io.kadai.classification.api"}),", ",(0,r.jsx)(t.code,{children:"io.kadai.workbasket.api"}),".\nThe corresponding queries can be also found in these packages.\nThey are called TaskQuery, ClassificationQuery and WorkbasketQuery."]}),"\n",(0,r.jsx)(t.h2,{id:"the-core-of-the-java-api",children:"The core of the Java-API"}),"\n",(0,r.jsxs)(t.p,{children:["Below is the diagram that shows different packages that make up the Java-API of KADAI.\nThey can be found in the ",(0,r.jsx)(t.code,{children:"lib/kadai-core"})," folder"]}),"\n",(0,r.jsx)(a(),{content:s}),"\n",(0,r.jsx)("br",{}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.code,{children:"io.kadai.classification.api"}),":"]}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"The Classification entity that consists of the Classification and ClassificationSummary interfaces in the models folder"}),"\n",(0,r.jsx)(t.li,{children:"Methods to create, update and delete a Classification in the ClassificationService interface"}),"\n",(0,r.jsx)(t.li,{children:"Methods to query the Classification with filtering and sorting in the ClassificationQuery interface"}),"\n",(0,r.jsx)(t.li,{children:"Used Exceptions and Enums"}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.code,{children:"io.kadai.task.api "}),":"]}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"The Task entity that consists of the Task and TaskSummary interfaces in the models folder"}),"\n",(0,r.jsx)(t.li,{children:"The Attachment entity that consists of the Attachment and AttachmentSummary interfaces in the models folder"}),"\n",(0,r.jsx)(t.li,{children:"The ObjectReference entity that consists of the ObjectReference interface in the models folder"}),"\n",(0,r.jsx)(t.li,{children:"Methods to create, update and delete a Task in the TaskService interface"}),"\n",(0,r.jsx)(t.li,{children:"Methods to query the Task with filtering and sorting in the TaskQuery interface"}),"\n",(0,r.jsx)(t.li,{children:"Used Exceptions and Enums"}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.code,{children:"io.kadai.workbasket.api"}),":"]}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"The Workbasket entity that consists of the Workbasket and WorkbasketSummary interfaces in the models folder"}),"\n",(0,r.jsx)(t.li,{children:"The WorkbasketAccessItem entity that consists of the WorkbasketAccessItem interface"}),"\n",(0,r.jsx)(t.li,{children:"Methods to create, update and delete a Workbasket in the WorkbasketService interface"}),"\n",(0,r.jsx)(t.li,{children:"Methods to query the Workbasket with filtering and sorting in the WorkbasketQuery interface"}),"\n",(0,r.jsx)(t.li,{children:"Used Exceptions and Enums"}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.code,{children:"io.kadai.common.api"}),":"]}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"KadaiEngine interface that brings all services of KADAI together"}),"\n",(0,r.jsx)(t.li,{children:"Other, non-entity-related services"}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.code,{children:"io.kadai.monitor.api"}),":"]}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"Report models for aggregating data on an entity can be found in the reports folder"}),"\n",(0,r.jsx)(t.li,{children:"Reports can be created using ReportBuilders from the report folder. They make filtering of entities included in a Report possible"}),"\n",(0,r.jsx)(t.li,{children:"Methods to create ReportBuilder are in the MonitorService interface"}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.code,{children:"io.kadai.user.api"}),":"]}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"The User entity that consists of the User interface in the models folder"}),"\n",(0,r.jsx)(t.li,{children:"Methods to create, update and delete a User in the UserService interface"}),"\n",(0,r.jsx)(t.li,{children:"Used Exceptions"}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.code,{children:"io.kadai.spi"}),":"]}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["contains all Service Provider Interfaces (SPIs) of KADAI. An SPI allows the client to change the behavior of KADAI by implementing the SPI. More about SPIs can be found ",(0,r.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/features/howToUseServiceProviderInterfaces",children:"here"}),"."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(t.h3,{id:"how-to-create-an-entity-using-the-java-api",children:"How to create an Entity using the Java-API?"}),"\n",(0,r.jsx)(t.h4,{id:"example-task",children:"Example Task"}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsxs)(t.li,{children:["First create a Task object not persisted in the database yet with method\n",(0,r.jsx)(t.code,{children:"TaskService.newTask"})]}),"\n",(0,r.jsx)(t.li,{children:"Then set some properties of that Task via its setter methods."}),"\n",(0,r.jsxs)(t.li,{children:["Finally, persist this Task to the database via ",(0,r.jsx)(t.code,{children:"TaskSerivce.createTask"})]}),"\n"]}),"\n",(0,r.jsxs)(t.p,{children:["You can find corresponding functions ",(0,r.jsx)(t.code,{children:"WorkbasketService.newWorkbasket"}),", ",(0,r.jsx)(t.code,{children:"ClassificationService.newClassification"})," ",(0,r.jsx)(t.code,{children:"WorkbasketService.createWorkbasket"})," and ",(0,r.jsx)(t.code,{children:"ClassificationService.createClassification"})," in other Services. They can be used to create other entities."]}),"\n",(0,r.jsx)(t.h3,{id:"how-to-manipulate-an-entity-using-the-java-api",children:"How to manipulate an Entity using the Java-API?"}),"\n",(0,r.jsxs)(t.p,{children:["Some properties of an entity can be set via the entity interface\n(e.g., the Task interface) in the KADAI Java-API.\nFor example, the method ",(0,r.jsx)(t.code,{children:" Task.setDescription"})," can be used to set the description of a Task.\nHowever, some properties of entities cannot be set this way.\nFor example, a Workbasket has to be specified during the creation of a Task.\nYou can change the Workbasket by transferring the Task using ",(0,r.jsx)(t.code,{children:"TaskService.transfer"}),".\nThe state of a Task can only be modified by corresponding TaskService methods ",(0,r.jsx)(t.code,{children:"claim"}),",\n",(0,r.jsx)(t.code,{children:"forceClaim"}),",\n",(0,r.jsx)(t.code,{children:"cancelClaim"})," etc. You can read more about the status changes ",(0,r.jsx)(t.a,{href:"/kadai-doc/docs/user-guide/core-concepts/taskLifecycle",children:"here"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"how-to-integrate-the-java-api-of-kadai-into-your-application",children:"How to integrate the Java API of KADAI into your application?"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"Find out the DataSource for your KADAI database. You can read here (link) about setting it up"}),"\n",(0,r.jsxs)(t.li,{children:["Pass the DataSource to the constructor of ",(0,r.jsx)(t.code,{children:"io.kadai.configuration.KadaiEngineConfiguration"}),"."]}),"\n",(0,r.jsxs)(t.li,{children:["Build a KADAIEngine using ",(0,r.jsx)(t.code,{children:"KadaiEngineConfiguration.buildEngine"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(t.p,{children:["You can use the corresponding Services by getting them with the methods ",(0,r.jsx)(t.code,{children:"KadaiEngine.getClassificationService"}),", ",(0,r.jsx)(t.code,{children:"KadaiEngine.getTaskService"})," and ",(0,r.jsx)(t.code,{children:"KadaiEngine.getWorkbasketService"}),"."]})]})}function h(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8478:(e,t,n)=>{n.r(t),n.d(t,{default:()=>o});n(6540);var i=n(2303),r=n(4848);function o(e){let{children:t,fallback:n}=e;return(0,i.A)()?(0,r.jsx)(r.Fragment,{children:t?.()}):n??null}},9734:(e,t,n)=>{var i=n(8478),r=n(6540);function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var l=o(i),a=o(r),s=function(){return s=Object.assign||function(e){for(var t,n=1,i=arguments.length;n div {\n margin-left: auto;\n margin-right: auto;\n border: 1px solid transparent;\n min-width: 180px;\n}\n");var d=function(e){var t=e.content,n=e.maxHeight,i=e.autoFit,o=e.autoCrop,l=e.autoOrigin,d=e.allowZoomOut,x=e.allowZoomIn,m=e.checkVisibleState,y=e.toolbarPosition,c=e.toolbarNohide,h=e.toolbarButtons,p=function(e,t){var n={};for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&t.indexOf(i)<0&&(n[i]=e[i]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(i=Object.getOwnPropertySymbols(e);r{n.d(t,{R:()=>l,x:()=>a});var i=n(6540);const r={},o=i.createContext(r);function l(e){const t=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),i.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a3bd232a.3fc6f887.js b/assets/js/a3bd232a.3fc6f887.js deleted file mode 100644 index dcc33be..0000000 --- a/assets/js/a3bd232a.3fc6f887.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[3543],{4331:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>o,contentTitle:()=>a,default:()=>h,frontMatter:()=>n,metadata:()=>d,toc:()=>c});var r=t(4848),i=t(8453);const n={sidebar_position:5},a="Security and Permissions",d={id:"user-guide/core-concepts/securityAndPermissions",title:"Security and Permissions",description:"Security Overview",source:"@site/docs/user-guide/core-concepts/securityAndPermissions.md",sourceDirName:"user-guide/core-concepts",slug:"/user-guide/core-concepts/securityAndPermissions",permalink:"/kadai-doc/docs/user-guide/core-concepts/securityAndPermissions",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:5,frontMatter:{sidebar_position:5},sidebar:"userSidebar",previous:{title:"REST-API",permalink:"/kadai-doc/docs/user-guide/core-concepts/restApi"},next:{title:"Configuration",permalink:"/kadai-doc/docs/category/configuration"}},o={},c=[{value:"Security Overview",id:"security-overview",level:2},{value:"Security Roles in KADAI",id:"security-roles-in-kadai",level:2},{value:"Access to Workbaskets",id:"access-to-workbaskets",level:2},{value:"Example WorkbasketAccessList table",id:"example-workbasketaccesslist-table",level:3},{value:"Disable security using the securityEnabled parameter",id:"disable-security-using-the-securityenabled-parameter",level:2}];function l(e){const s={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"security-and-permissions",children:"Security and Permissions"})}),"\n",(0,r.jsx)(s.h2,{id:"security-overview",children:"Security Overview"}),"\n",(0,r.jsx)(s.p,{children:"KADAI Java library uses JAAS subjects for its authentication. Its security features can be used\nbased on the REST service. The authentication cannot be run without the REST service. Client side\nauthorization is required to view Tasks and Workbaskets or to make any changes. If the client side\nauthorization does not work, the unauthorized user will not be able to use KADAI properly."}),"\n",(0,r.jsxs)(s.p,{children:["We provide an example (kadai-rest-spring-example) which is using LDAP. You can build a simple\nstep-by-step example with our ",(0,r.jsx)(s.a,{href:"/kadai-doc/docs/user-guide/getting-started/exampleSpringBoot",children:"Getting Started"})," as well."]}),"\n",(0,r.jsxs)(s.p,{children:["KADAI Java library needs its client to provide a mapping to the JAAS Subject used for users and\ngroups. The client should create a JAAS context for the Java library. The ids of users and groups,\ne.g. ",(0,r.jsx)(s.code,{children:"user-1-1"})," or ",(0,r.jsx)(s.code,{children:"admin"}),", are then used for the internal logic in the Java library. Our REST\nService already provides LDAP support."]}),"\n",(0,r.jsx)(s.h2,{id:"security-roles-in-kadai",children:"Security Roles in KADAI"}),"\n",(0,r.jsx)(s.p,{children:"Users can have one of the six different roles:"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.strong,{children:"USER"}),"\nThe USER role grants access to KADAI. USER is everybody who gets assigned to and completes\ntasks."]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.strong,{children:"TASK_ADMIN"}),"\nThe TASK_ADMIN role includes all permissions on tasks except deleting a task/tasks.\nIt can also READ all workbaskets in case to create/transfer tasks in/to them."]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.strong,{children:"BUSINESS_ADMINISTRATOR"}),"\nThe BUSINESS_ADMINISTRATOR role allows changing the business configuration (workbaskets,\nclassifications, ...)"]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.strong,{children:"ADMINISTRATOR"}),"\nThe ADMINISTRATOR role includes all permissions on the system."]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.strong,{children:"MONITOR"}),"\nThe MONITOR role grants access to all monitoring operations and to the monitoring UI."]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.strong,{children:"TASK_ROUTER"}),"\nThe TASK_ROUTER role implies access to creating Tasks in all Workbaskets without having READ\npermissions for them. This role is used for automated scripts, not for persons."]}),"\n"]}),"\n",(0,r.jsxs)(s.p,{children:["You can assign roles to users or groups in the ",(0,r.jsx)(s.code,{children:"kadai.properties"})," file. Read more about LDAP\nconfiguration ",(0,r.jsx)(s.a,{href:"/kadai-doc/docs/user-guide/configuration/ldap",children:"here"})]}),"\n",(0,r.jsx)(s.h2,{id:"access-to-workbaskets",children:"Access to Workbaskets"}),"\n",(0,r.jsxs)(s.p,{children:["KADAI Java library uses WorkbasketAccessItems for authorization. WorkbasketAccessItems are stored\nin the WorkbasketAccessList database table. Each WorkbasketAccessItems contains values for each of\nthe following permissions: ",(0,r.jsx)(s.em,{children:"READ, OPEN, APPEND, TRANSFER, DISTRIBUTE and CUSTOM_1 through\nCUSTOM_12"}),'. A WorkbasketAccessItem belongs to a specific Workbasket-User or Workbasket-Group pair.\nThe user or group are specified by their accessId (for example, "user-1-1"). The different\npermissions have the following meaning:']}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Permission"}),(0,r.jsx)(s.th,{children:"Meaning"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"READ"}),(0,r.jsxs)(s.td,{children:["Read or query Workbasket metadata. If a user does ",(0,r.jsx)(s.strong,{children:"not"})," have the READ permission, he does not even know about the existence of the Workbasket."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"READTASKS"}),(0,r.jsxs)(s.td,{children:["Allows user to read or query metadata of Tasks without ",(0,r.jsx)(s.strong,{children:"explicitly"})," specifying Workbasket in the query. For this, the READ permission is also required. If a user does not have the READTASKS permission, he cannot specify this Workbasket when getting Tasks."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"OPEN"}),(0,r.jsxs)(s.td,{children:["The user is allowed to ",(0,r.jsx)(s.strong,{children:"explicitly"})," query the Tasks of specific Workbaskets. To do this, READ and READTASKS permissions are also required. If a user does not have the OPEN permission, he cannot query/filter Tasks by Workbaskets."]})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"EDITTASKS"}),(0,r.jsx)(s.td,{children:"Allows the user to update, claim or complete tasks. For editing, READ and READTASKS permissions are also required."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"APPEND"}),(0,r.jsx)(s.td,{children:"The user is allowed to append a Task to the Workbasket. This applies to creation of Tasks in this Workbasket as well as for transferring Tasks to this Workbasket."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"TRANSFER"}),(0,r.jsx)(s.td,{children:"Allows the user to transfer Tasks from this Workbasket to another one."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"DISTRIBUTE"}),(0,r.jsx)(s.td,{children:"The user is allowed to distribute Tasks from this Workbasket to the configured distribution targets. For distribution the APPEND and TRANSFER permissions are checked also."})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"CUSTOM_1 .. CUSTOM_12"}),(0,r.jsx)(s.td,{children:"Permissions to be used in custom code to configure application specific scenarios which are not directly checked by KADAI."})]})]})]}),"\n",(0,r.jsx)(s.h3,{id:"example-workbasketaccesslist-table",children:"Example WorkbasketAccessList table"}),"\n",(0,r.jsx)(s.p,{children:"Example WorkbasketAccessItems:"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"ID"}),(0,r.jsx)(s.th,{children:"WB_ID"}),(0,r.jsx)(s.th,{children:",ACCESS_ID"}),(0,r.jsx)(s.th,{children:"ACCESS_NAME"}),(0,r.jsx)(s.th,{children:"READ,"}),(0,r.jsx)(s.th,{children:"READTSKS"}),(0,r.jsx)(s.th,{children:"OPN,"}),(0,r.jsx)(s.th,{children:"EDITTSKS"}),(0,r.jsx)(s.th,{children:"APPD,"}),(0,r.jsx)(s.th,{children:"TRSFR,"}),(0,r.jsx)(s.th,{children:"DISTR,"}),(0,r.jsx)(s.th,{children:"C1,"}),(0,r.jsx)(s.th,{children:"..,"}),(0,r.jsx)(s.th,{children:"C12)"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"WA01"}),(0,r.jsx)(s.td,{children:"WB01"}),(0,r.jsx)(s.td,{children:"teamlead_1"}),(0,r.jsx)(s.td,{children:"Dominik"}),(0,r.jsx)(s.td,{children:"true"}),(0,r.jsx)(s.td,{children:"false"}),(0,r.jsx)(s.td,{children:"false"}),(0,r.jsx)(s.td,{children:"false"}),(0,r.jsx)(s.td,{children:"true"}),(0,r.jsx)(s.td,{children:"true"}),(0,r.jsx)(s.td,{children:"true"}),(0,r.jsx)(s.td,{children:"true,...false"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"WA02"}),(0,r.jsx)(s.td,{children:"WB01"}),(0,r.jsx)(s.td,{children:"teamlead_2"}),(0,r.jsx)(s.td,{children:"Holger"}),(0,r.jsx)(s.td,{children:"true"}),(0,r.jsx)(s.td,{children:"true"}),(0,r.jsx)(s.td,{children:"true"}),(0,r.jsx)(s.td,{children:"true"}),(0,r.jsx)(s.td,{children:"false"}),(0,r.jsx)(s.td,{children:"false"}),(0,r.jsx)(s.td,{children:"true"}),(0,r.jsx)(s.td,{children:"true,...true;"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"WA03"}),(0,r.jsx)(s.td,{children:"WB01"}),(0,r.jsx)(s.td,{children:"group_1"}),(0,r.jsx)(s.td,{children:"Schaden"}),(0,r.jsx)(s.td,{children:"true"}),(0,r.jsx)(s.td,{children:"true"}),(0,r.jsx)(s.td,{children:"true"}),(0,r.jsx)(s.td,{children:"false"}),(0,r.jsx)(s.td,{children:"false"}),(0,r.jsx)(s.td,{children:"true"}),(0,r.jsx)(s.td,{children:"false"}),(0,r.jsx)(s.td,{children:"true,...true;"}),(0,r.jsx)(s.td,{}),(0,r.jsx)(s.td,{})]})]})]}),"\n",(0,r.jsxs)(s.h2,{id:"disable-security-using-the-securityenabled-parameter",children:["Disable security using the ",(0,r.jsx)(s.em,{children:"securityEnabled"})," parameter"]}),"\n",(0,r.jsxs)(s.p,{children:["The securityEnabled-flag can disable authentication for the complete KADAI functionality if set\nto false. The default value of the flag is true. You can change the value by specifying the\n",(0,r.jsx)(s.em,{children:"securityEnabled"})," parameter of the constructor of KadaiEngineConfiguration."]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{children:"KadaiEngineConfiguration(DataSource dataSource, boolean useManagedTransactions,\n boolean securityEnabled, String propertiesFileName, String propertiesSeparator)\n"})}),"\n",(0,r.jsx)(s.p,{children:"In the spring boot example, you can add the following bean to disable security:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{children:' @Bean\n public KadaiEngineConfiguration kadaiEngineConfiguration(DataSource dataSource) {\n return new SpringKadaiEngineConfiguration(dataSource, true, false, "KADAI");\n }\n'})}),"\n",(0,r.jsxs)(s.p,{children:["The CONFIGURATION table has an ENFORCE_SECURITY field.\nIf this field is already set, then\n",(0,r.jsx)(s.em,{children:"securityEnabled"})," should be set to the same value.\nIf the ENFORCE_SECURITY flag in the database has\nno value, then the first KadaiEngine connecting to the database sets its ",(0,r.jsx)(s.em,{children:"securityEnabled"})," as the\nvalue of ENFORCE_SECURITY."]})]})}function h(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,s,t)=>{t.d(s,{R:()=>a,x:()=>d});var r=t(6540);const i={},n=r.createContext(i);function a(e){const s=r.useContext(n);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function d(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(n.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a3bd232a.7c1046b9.js b/assets/js/a3bd232a.7c1046b9.js new file mode 100644 index 0000000..c2d4aa6 --- /dev/null +++ b/assets/js/a3bd232a.7c1046b9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[3543],{6832:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>o,contentTitle:()=>d,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"user-guide/core-concepts/securityAndPermissions","title":"Security and Permissions","description":"Security Overview","source":"@site/docs/user-guide/core-concepts/securityAndPermissions.md","sourceDirName":"user-guide/core-concepts","slug":"/user-guide/core-concepts/securityAndPermissions","permalink":"/kadai-doc/docs/user-guide/core-concepts/securityAndPermissions","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":5,"frontMatter":{"sidebar_position":5},"sidebar":"userSidebar","previous":{"title":"REST-API","permalink":"/kadai-doc/docs/user-guide/core-concepts/restApi"},"next":{"title":"Configuration","permalink":"/kadai-doc/docs/category/configuration"}}');var i=t(4848),n=t(8453);const a={sidebar_position:5},d="Security and Permissions",o={},c=[{value:"Security Overview",id:"security-overview",level:2},{value:"Security Roles in KADAI",id:"security-roles-in-kadai",level:2},{value:"Access to Workbaskets",id:"access-to-workbaskets",level:2},{value:"Example WorkbasketAccessList table",id:"example-workbasketaccesslist-table",level:3},{value:"Disable security using the securityEnabled parameter",id:"disable-security-using-the-securityenabled-parameter",level:2}];function l(e){const s={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"security-and-permissions",children:"Security and Permissions"})}),"\n",(0,i.jsx)(s.h2,{id:"security-overview",children:"Security Overview"}),"\n",(0,i.jsx)(s.p,{children:"KADAI Java library uses JAAS subjects for its authentication. Its security features can be used\nbased on the REST service. The authentication cannot be run without the REST service. Client side\nauthorization is required to view Tasks and Workbaskets or to make any changes. If the client side\nauthorization does not work, the unauthorized user will not be able to use KADAI properly."}),"\n",(0,i.jsxs)(s.p,{children:["We provide an example (kadai-rest-spring-example) which is using LDAP. You can build a simple\nstep-by-step example with our ",(0,i.jsx)(s.a,{href:"/kadai-doc/docs/user-guide/getting-started/exampleSpringBoot",children:"Getting Started"})," as well."]}),"\n",(0,i.jsxs)(s.p,{children:["KADAI Java library needs its client to provide a mapping to the JAAS Subject used for users and\ngroups. The client should create a JAAS context for the Java library. The ids of users and groups,\ne.g. ",(0,i.jsx)(s.code,{children:"user-1-1"})," or ",(0,i.jsx)(s.code,{children:"admin"}),", are then used for the internal logic in the Java library. Our REST\nService already provides LDAP support."]}),"\n",(0,i.jsx)(s.h2,{id:"security-roles-in-kadai",children:"Security Roles in KADAI"}),"\n",(0,i.jsx)(s.p,{children:"Users can have one of the six different roles:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"USER"}),"\nThe USER role grants access to KADAI. USER is everybody who gets assigned to and completes\ntasks."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"TASK_ADMIN"}),"\nThe TASK_ADMIN role includes all permissions on tasks except deleting a task/tasks.\nIt can also READ all workbaskets in case to create/transfer tasks in/to them."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"BUSINESS_ADMINISTRATOR"}),"\nThe BUSINESS_ADMINISTRATOR role allows changing the business configuration (workbaskets,\nclassifications, ...)"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"ADMINISTRATOR"}),"\nThe ADMINISTRATOR role includes all permissions on the system."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"MONITOR"}),"\nThe MONITOR role grants access to all monitoring operations and to the monitoring UI."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"TASK_ROUTER"}),"\nThe TASK_ROUTER role implies access to creating Tasks in all Workbaskets without having READ\npermissions for them. This role is used for automated scripts, not for persons."]}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:["You can assign roles to users or groups in the ",(0,i.jsx)(s.code,{children:"kadai.properties"})," file. Read more about LDAP\nconfiguration ",(0,i.jsx)(s.a,{href:"/kadai-doc/docs/user-guide/configuration/ldap",children:"here"})]}),"\n",(0,i.jsx)(s.h2,{id:"access-to-workbaskets",children:"Access to Workbaskets"}),"\n",(0,i.jsxs)(s.p,{children:["KADAI Java library uses WorkbasketAccessItems for authorization. WorkbasketAccessItems are stored\nin the WorkbasketAccessList database table. Each WorkbasketAccessItems contains values for each of\nthe following permissions: ",(0,i.jsx)(s.em,{children:"READ, OPEN, APPEND, TRANSFER, DISTRIBUTE and CUSTOM_1 through\nCUSTOM_12"}),'. A WorkbasketAccessItem belongs to a specific Workbasket-User or Workbasket-Group pair.\nThe user or group are specified by their accessId (for example, "user-1-1"). The different\npermissions have the following meaning:']}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Permission"}),(0,i.jsx)(s.th,{children:"Meaning"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"READ"}),(0,i.jsxs)(s.td,{children:["Read or query Workbasket metadata. If a user does ",(0,i.jsx)(s.strong,{children:"not"})," have the READ permission, he does not even know about the existence of the Workbasket."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"READTASKS"}),(0,i.jsxs)(s.td,{children:["Allows user to read or query metadata of Tasks without ",(0,i.jsx)(s.strong,{children:"explicitly"})," specifying Workbasket in the query. For this, the READ permission is also required. If a user does not have the READTASKS permission, he cannot specify this Workbasket when getting Tasks."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"OPEN"}),(0,i.jsxs)(s.td,{children:["The user is allowed to ",(0,i.jsx)(s.strong,{children:"explicitly"})," query the Tasks of specific Workbaskets. To do this, READ and READTASKS permissions are also required. If a user does not have the OPEN permission, he cannot query/filter Tasks by Workbaskets."]})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"EDITTASKS"}),(0,i.jsx)(s.td,{children:"Allows the user to update, claim or complete tasks. For editing, READ and READTASKS permissions are also required."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"APPEND"}),(0,i.jsx)(s.td,{children:"The user is allowed to append a Task to the Workbasket. This applies to creation of Tasks in this Workbasket as well as for transferring Tasks to this Workbasket."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"TRANSFER"}),(0,i.jsx)(s.td,{children:"Allows the user to transfer Tasks from this Workbasket to another one."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"DISTRIBUTE"}),(0,i.jsx)(s.td,{children:"The user is allowed to distribute Tasks from this Workbasket to the configured distribution targets. For distribution the APPEND and TRANSFER permissions are checked also."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"CUSTOM_1 .. CUSTOM_12"}),(0,i.jsx)(s.td,{children:"Permissions to be used in custom code to configure application specific scenarios which are not directly checked by KADAI."})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"example-workbasketaccesslist-table",children:"Example WorkbasketAccessList table"}),"\n",(0,i.jsx)(s.p,{children:"Example WorkbasketAccessItems:"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"ID"}),(0,i.jsx)(s.th,{children:"WB_ID"}),(0,i.jsx)(s.th,{children:",ACCESS_ID"}),(0,i.jsx)(s.th,{children:"ACCESS_NAME"}),(0,i.jsx)(s.th,{children:"READ,"}),(0,i.jsx)(s.th,{children:"READTSKS"}),(0,i.jsx)(s.th,{children:"OPN,"}),(0,i.jsx)(s.th,{children:"EDITTSKS"}),(0,i.jsx)(s.th,{children:"APPD,"}),(0,i.jsx)(s.th,{children:"TRSFR,"}),(0,i.jsx)(s.th,{children:"DISTR,"}),(0,i.jsx)(s.th,{children:"C1,"}),(0,i.jsx)(s.th,{children:"..,"}),(0,i.jsx)(s.th,{children:"C12)"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"WA01"}),(0,i.jsx)(s.td,{children:"WB01"}),(0,i.jsx)(s.td,{children:"teamlead_1"}),(0,i.jsx)(s.td,{children:"Dominik"}),(0,i.jsx)(s.td,{children:"true"}),(0,i.jsx)(s.td,{children:"false"}),(0,i.jsx)(s.td,{children:"false"}),(0,i.jsx)(s.td,{children:"false"}),(0,i.jsx)(s.td,{children:"true"}),(0,i.jsx)(s.td,{children:"true"}),(0,i.jsx)(s.td,{children:"true"}),(0,i.jsx)(s.td,{children:"true,...false"}),(0,i.jsx)(s.td,{}),(0,i.jsx)(s.td,{})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"WA02"}),(0,i.jsx)(s.td,{children:"WB01"}),(0,i.jsx)(s.td,{children:"teamlead_2"}),(0,i.jsx)(s.td,{children:"Holger"}),(0,i.jsx)(s.td,{children:"true"}),(0,i.jsx)(s.td,{children:"true"}),(0,i.jsx)(s.td,{children:"true"}),(0,i.jsx)(s.td,{children:"true"}),(0,i.jsx)(s.td,{children:"false"}),(0,i.jsx)(s.td,{children:"false"}),(0,i.jsx)(s.td,{children:"true"}),(0,i.jsx)(s.td,{children:"true,...true;"}),(0,i.jsx)(s.td,{}),(0,i.jsx)(s.td,{})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"WA03"}),(0,i.jsx)(s.td,{children:"WB01"}),(0,i.jsx)(s.td,{children:"group_1"}),(0,i.jsx)(s.td,{children:"Schaden"}),(0,i.jsx)(s.td,{children:"true"}),(0,i.jsx)(s.td,{children:"true"}),(0,i.jsx)(s.td,{children:"true"}),(0,i.jsx)(s.td,{children:"false"}),(0,i.jsx)(s.td,{children:"false"}),(0,i.jsx)(s.td,{children:"true"}),(0,i.jsx)(s.td,{children:"false"}),(0,i.jsx)(s.td,{children:"true,...true;"}),(0,i.jsx)(s.td,{}),(0,i.jsx)(s.td,{})]})]})]}),"\n",(0,i.jsxs)(s.h2,{id:"disable-security-using-the-securityenabled-parameter",children:["Disable security using the ",(0,i.jsx)(s.em,{children:"securityEnabled"})," parameter"]}),"\n",(0,i.jsxs)(s.p,{children:["The securityEnabled-flag can disable authentication for the complete KADAI functionality if set\nto false. The default value of the flag is true. You can change the value by specifying the\n",(0,i.jsx)(s.em,{children:"securityEnabled"})," parameter of the constructor of KadaiEngineConfiguration."]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{children:"KadaiEngineConfiguration(DataSource dataSource, boolean useManagedTransactions,\n boolean securityEnabled, String propertiesFileName, String propertiesSeparator)\n"})}),"\n",(0,i.jsx)(s.p,{children:"In the spring boot example, you can add the following bean to disable security:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{children:' @Bean\n public KadaiEngineConfiguration kadaiEngineConfiguration(DataSource dataSource) {\n return new SpringKadaiEngineConfiguration(dataSource, true, false, "KADAI");\n }\n'})}),"\n",(0,i.jsxs)(s.p,{children:["The CONFIGURATION table has an ENFORCE_SECURITY field.\nIf this field is already set, then\n",(0,i.jsx)(s.em,{children:"securityEnabled"})," should be set to the same value.\nIf the ENFORCE_SECURITY flag in the database has\nno value, then the first KadaiEngine connecting to the database sets its ",(0,i.jsx)(s.em,{children:"securityEnabled"})," as the\nvalue of ENFORCE_SECURITY."]})]})}function h(e={}){const{wrapper:s}={...(0,n.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},8453:(e,s,t)=>{t.d(s,{R:()=>a,x:()=>d});var r=t(6540);const i={},n=r.createContext(i);function a(e){const s=r.useContext(n);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function d(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(n.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a4bffc61.67dba5c4.js b/assets/js/a4bffc61.67dba5c4.js new file mode 100644 index 0000000..1b5ed20 --- /dev/null +++ b/assets/js/a4bffc61.67dba5c4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[8918],{8146:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>u,frontMatter:()=>i,metadata:()=>n,toc:()=>l});const n=JSON.parse('{"id":"user-guide/core-concepts/restApi","title":"REST-API","description":"KADAI provides a REST API to interact with the KADAI entities.","source":"@site/docs/user-guide/core-concepts/restApi.md","sourceDirName":"user-guide/core-concepts","slug":"/user-guide/core-concepts/restApi","permalink":"/kadai-doc/docs/user-guide/core-concepts/restApi","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":4,"frontMatter":{"sidebar_position":4},"sidebar":"userSidebar","previous":{"title":"Java-API usage","permalink":"/kadai-doc/docs/user-guide/core-concepts/javaApiUsage"},"next":{"title":"Security and Permissions","permalink":"/kadai-doc/docs/user-guide/core-concepts/securityAndPermissions"}}');var r=o(4848),a=o(8453);o(9734);const i={sidebar_position:4},s="REST-API",c={},l=[];function d(e){const t={a:"a",code:"code",em:"em",h1:"h1",header:"header",p:"p",pre:"pre",...(0,a.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"rest-api",children:"REST-API"})}),"\n","\n",(0,r.jsx)(t.p,{children:"KADAI provides a REST API to interact with the KADAI entities.\nFor example, you can get metadata of Workbaskets, create new Tasks, update Tasks, etc.\nThe path for all requests to KADAI starts with the following:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"http://localhost:8080/kadai/api/v1/\n"})}),"\n",(0,r.jsxs)(t.p,{children:["You can make your request by specifying the correct path with the corresponding HTTP method. The entity that the request is working on can be specified as part of the path. For example, the following request returns the Task with the id ",(0,r.jsx)(t.em,{children:"TKI:100000000000000000000000000000000000"}),":"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"GET http://localhost:8080/kadai/api/v1/tasks/TKI:100000000000000000000000000000000000\n"})}),"\n",(0,r.jsx)(t.p,{children:"We can also add parameters for filtering or sorting to the request.\nThe following example filters all Tasks that are READY\nand returns them sorted by the key of their Classification:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"GET http://localhost:8080/kadai/api/v1/tasks?state=READY&sort-by=CLASSIFICATION_KEY\n"})}),"\n",(0,r.jsxs)(t.p,{children:["The full documentation of the REST-API can be found ",(0,r.jsx)(t.a,{href:"https://kadai-io.azurewebsites.net/kadai/swagger-ui/index.html",children:"here"}),"."]})]})}function u(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8478:(e,t,o)=>{o.r(t),o.d(t,{default:()=>a});o(6540);var n=o(2303),r=o(4848);function a(e){let{children:t,fallback:o}=e;return(0,n.A)()?(0,r.jsx)(r.Fragment,{children:t?.()}):o??null}},9734:(e,t,o)=>{var n=o(8478),r=o(6540);function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var i=a(n),s=a(r),c=function(){return c=Object.assign||function(e){for(var t,o=1,n=arguments.length;o div {\n margin-left: auto;\n margin-right: auto;\n border: 1px solid transparent;\n min-width: 180px;\n}\n");var l=function(e){var t=e.content,o=e.maxHeight,n=e.autoFit,a=e.autoCrop,i=e.autoOrigin,l=e.allowZoomOut,d=e.allowZoomIn,u=e.checkVisibleState,p=e.toolbarPosition,h=e.toolbarNohide,f=e.toolbarButtons,m=function(e,t){var o={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(o[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(n=Object.getOwnPropertySymbols(e);r{o.d(t,{R:()=>i,x:()=>s});var n=o(6540);const r={},a=n.createContext(r);function i(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a4bffc61.9492e0aa.js b/assets/js/a4bffc61.9492e0aa.js deleted file mode 100644 index 41ca8ca..0000000 --- a/assets/js/a4bffc61.9492e0aa.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[8918],{4662:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var n=o(4848),r=o(8453);o(9734);const a={sidebar_position:4},i="REST-API",s={id:"user-guide/core-concepts/restApi",title:"REST-API",description:"KADAI provides a REST API to interact with the KADAI entities.",source:"@site/docs/user-guide/core-concepts/restApi.md",sourceDirName:"user-guide/core-concepts",slug:"/user-guide/core-concepts/restApi",permalink:"/kadai-doc/docs/user-guide/core-concepts/restApi",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:4,frontMatter:{sidebar_position:4},sidebar:"userSidebar",previous:{title:"Java-API usage",permalink:"/kadai-doc/docs/user-guide/core-concepts/javaApiUsage"},next:{title:"Security and Permissions",permalink:"/kadai-doc/docs/user-guide/core-concepts/securityAndPermissions"}},c={},l=[];function d(e){const t={a:"a",code:"code",em:"em",h1:"h1",header:"header",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"rest-api",children:"REST-API"})}),"\n","\n",(0,n.jsx)(t.p,{children:"KADAI provides a REST API to interact with the KADAI entities.\nFor example, you can get metadata of Workbaskets, create new Tasks, update Tasks, etc.\nThe path for all requests to KADAI starts with the following:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"http://localhost:8080/kadai/api/v1/\n"})}),"\n",(0,n.jsxs)(t.p,{children:["You can make your request by specifying the correct path with the corresponding HTTP method. The entity that the request is working on can be specified as part of the path. For example, the following request returns the Task with the id ",(0,n.jsx)(t.em,{children:"TKI:100000000000000000000000000000000000"}),":"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"GET http://localhost:8080/kadai/api/v1/tasks/TKI:100000000000000000000000000000000000\n"})}),"\n",(0,n.jsx)(t.p,{children:"We can also add parameters for filtering or sorting to the request.\nThe following example filters all Tasks that are READY\nand returns them sorted by the key of their Classification:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"GET http://localhost:8080/kadai/api/v1/tasks?state=READY&sort-by=CLASSIFICATION_KEY\n"})}),"\n",(0,n.jsxs)(t.p,{children:["The full documentation of the REST-API can be found ",(0,n.jsx)(t.a,{href:"https://kadai-io.azurewebsites.net/kadai/swagger-ui/index.html",children:"here"}),"."]})]})}function u(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},8478:(e,t,o)=>{o.r(t),o.d(t,{default:()=>a});o(6540);var n=o(2303),r=o(4848);function a(e){let{children:t,fallback:o}=e;return(0,n.A)()?(0,r.jsx)(r.Fragment,{children:t?.()}):o??null}},9734:(e,t,o)=>{var n=o(8478),r=o(6540);function a(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var i=a(n),s=a(r),c=function(){return c=Object.assign||function(e){for(var t,o=1,n=arguments.length;o div {\n margin-left: auto;\n margin-right: auto;\n border: 1px solid transparent;\n min-width: 180px;\n}\n");var l=function(e){var t=e.content,o=e.maxHeight,n=e.autoFit,a=e.autoCrop,i=e.autoOrigin,l=e.allowZoomOut,d=e.allowZoomIn,u=e.checkVisibleState,p=e.toolbarPosition,h=e.toolbarNohide,f=e.toolbarButtons,m=function(e,t){var o={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(o[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(n=Object.getOwnPropertySymbols(e);r{o.d(t,{R:()=>i,x:()=>s});var n=o(6540);const r={},a=n.createContext(r);function i(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a51fc69b.312e0bda.js b/assets/js/a51fc69b.312e0bda.js deleted file mode 100644 index ebcc15e..0000000 --- a/assets/js/a51fc69b.312e0bda.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[3878],{4479:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>l,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var n=r(4848),d=r(8453);const a={sidebar_position:2},o="Data Model",s={id:"user-guide/reference/dataModel",title:"Data Model",description:"datamodel",source:"@site/docs/user-guide/reference/dataModel.md",sourceDirName:"user-guide/reference",slug:"/user-guide/reference/dataModel",permalink:"/kadai-doc/docs/user-guide/reference/dataModel",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"userSidebar",previous:{title:"Reference",permalink:"/kadai-doc/docs/category/reference"},next:{title:"Modules",permalink:"/kadai-doc/docs/user-guide/reference/modules"}},i={},c=[];function u(e){const t={h1:"h1",header:"header",img:"img",p:"p",...(0,d.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"data-model",children:"Data Model"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"datamodel",src:r(4641).A+"",width:"1918",height:"1557"})})]})}function l(e={}){const{wrapper:t}={...(0,d.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},4641:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/datamodel-75250cd7a6a8586c4dd9d891cf420a7d.png"},8453:(e,t,r)=>{r.d(t,{R:()=>o,x:()=>s});var n=r(6540);const d={},a=n.createContext(d);function o(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:o(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a51fc69b.afc695df.js b/assets/js/a51fc69b.afc695df.js new file mode 100644 index 0000000..ca8c6ce --- /dev/null +++ b/assets/js/a51fc69b.afc695df.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[3878],{5295:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>l,frontMatter:()=>d,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"user-guide/reference/dataModel","title":"Data Model","description":"datamodel","source":"@site/docs/user-guide/reference/dataModel.md","sourceDirName":"user-guide/reference","slug":"/user-guide/reference/dataModel","permalink":"/kadai-doc/docs/user-guide/reference/dataModel","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"sidebar_position":2},"sidebar":"userSidebar","previous":{"title":"Reference","permalink":"/kadai-doc/docs/category/reference"},"next":{"title":"Modules","permalink":"/kadai-doc/docs/user-guide/reference/modules"}}');var a=r(4848),s=r(8453);const d={sidebar_position:2},o="Data Model",i={},c=[];function u(e){const t={h1:"h1",header:"header",img:"img",p:"p",...(0,s.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.header,{children:(0,a.jsx)(t.h1,{id:"data-model",children:"Data Model"})}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"datamodel",src:r(4641).A+"",width:"1918",height:"1557"})})]})}function l(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(u,{...e})}):u(e)}},4641:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/datamodel-75250cd7a6a8586c4dd9d891cf420a7d.png"},8453:(e,t,r)=>{r.d(t,{R:()=>d,x:()=>o});var n=r(6540);const a={},s=n.createContext(a);function d(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:d(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a54ea03c.74fc193a.js b/assets/js/a54ea03c.74fc193a.js new file mode 100644 index 0000000..7e665f2 --- /dev/null +++ b/assets/js/a54ea03c.74fc193a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[2077],{4790:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>a,default:()=>c,frontMatter:()=>r,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"demo-app/demoApp","title":"Demo App","description":"While our main focus remains ob the backend of KADAI, we additionally provide an example frontend in form of a Demo App. This is only an example, as KADAI frontend can be implemented differently for specific use cases. Here is what the demo app looks like:","source":"@site/docs/demo-app/demoApp.md","sourceDirName":"demo-app","slug":"/demo-app/demoApp","permalink":"/kadai-doc/docs/demo-app/demoApp","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1},"sidebar":"userSidebar","previous":{"title":"Getting Started","permalink":"/kadai-doc/docs/user-guide/adapter/gettingStarted"}}');var o=i(4848),s=i(8453);const r={sidebar_position:1},a="Demo App",d={},l=[{value:"Click here to go to the Demo App",id:"click-here-to-go-to-the-demo-app",level:3},{value:"Try out the Demo App",id:"try-out-the-demo-app",level:2},{value:"Navigation in the Demo App",id:"navigation-in-the-demo-app",level:3}];function p(e){const n={a:"a",blockquote:"blockquote",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"demo-app",children:"Demo App"})}),"\n",(0,o.jsxs)(n.p,{children:["While our main focus remains ob the backend of KADAI, we additionally provide an example frontend in form of a Demo App. This is only an example, as KADAI frontend can be implemented differently for specific use cases. Here is what the demo app looks like:\n",(0,o.jsx)(n.img,{alt:"Demo App",src:i(1832).A+"",width:"4112",height:"2338"})]}),"\n",(0,o.jsx)(n.h3,{id:"click-here-to-go-to-the-demo-app",children:(0,o.jsx)(n.a,{href:"https://kadai-io.azurewebsites.net/kadai",children:"Click here to go to the Demo App"})}),"\n",(0,o.jsx)(n.h2,{id:"try-out-the-demo-app",children:"Try out the Demo App"}),"\n",(0,o.jsx)(n.p,{children:"In order to login as admin, you need to use the following credentials:"}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsx)(n.p,{children:"username: admin"}),"\n",(0,o.jsx)(n.p,{children:"password: admin"}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["Then, you will be forwarded to the ",(0,o.jsx)(n.strong,{children:"KADAI Administration"}),". There are other users available."]}),"\n",(0,o.jsx)(n.h3,{id:"navigation-in-the-demo-app",children:"Navigation in the Demo App"}),"\n",(0,o.jsx)(n.p,{children:"To navigate between different pages, select the menu using the three point icon on the upper left. Then, you can choose between the categories shown in the bucket list below."}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Administration"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Manage Workbaskets"}),"\n",(0,o.jsx)(n.li,{children:"Manage Classifications"}),"\n",(0,o.jsx)(n.li,{children:"Perform other admin activities"}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Monitor"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Observe current state of work"}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Workplace"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"See available Tasks"}),"\n",(0,o.jsx)(n.li,{children:"Perform actions on Tasks"}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"History"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Observe actions performed by KADAI in the past"}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.strong,{children:"Settings"})}),"\n"]})]})}function c(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(p,{...e})}):p(e)}},1832:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/demo-app-ba79b7e75af7bdfe07326f7c880dbd9c.png"},8453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>a});var t=i(6540);const o={},s=t.createContext(o);function r(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a54ea03c.f327eea3.js b/assets/js/a54ea03c.f327eea3.js deleted file mode 100644 index 0a96994..0000000 --- a/assets/js/a54ea03c.f327eea3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[2077],{45:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>c,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var t=i(4848),o=i(8453);const s={sidebar_position:1},r="Demo App",a={id:"demo-app/demoApp",title:"Demo App",description:"While our main focus remains ob the backend of KADAI, we additionally provide an example frontend in form of a Demo App. This is only an example, as KADAI frontend can be implemented differently for specific use cases. Here is what the demo app looks like:",source:"@site/docs/demo-app/demoApp.md",sourceDirName:"demo-app",slug:"/demo-app/demoApp",permalink:"/kadai-doc/docs/demo-app/demoApp",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"userSidebar",previous:{title:"Getting Started",permalink:"/kadai-doc/docs/user-guide/adapter/gettingStarted"}},d={},l=[{value:"Click here to go to the Demo App",id:"click-here-to-go-to-the-demo-app",level:3},{value:"Try out the Demo App",id:"try-out-the-demo-app",level:2},{value:"Navigation in the Demo App",id:"navigation-in-the-demo-app",level:3}];function p(e){const n={a:"a",blockquote:"blockquote",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"demo-app",children:"Demo App"})}),"\n",(0,t.jsxs)(n.p,{children:["While our main focus remains ob the backend of KADAI, we additionally provide an example frontend in form of a Demo App. This is only an example, as KADAI frontend can be implemented differently for specific use cases. Here is what the demo app looks like:\n",(0,t.jsx)(n.img,{alt:"Demo App",src:i(1832).A+"",width:"4112",height:"2338"})]}),"\n",(0,t.jsx)(n.h3,{id:"click-here-to-go-to-the-demo-app",children:(0,t.jsx)(n.a,{href:"https://kadai-io.azurewebsites.net/kadai",children:"Click here to go to the Demo App"})}),"\n",(0,t.jsx)(n.h2,{id:"try-out-the-demo-app",children:"Try out the Demo App"}),"\n",(0,t.jsx)(n.p,{children:"In order to login as admin, you need to use the following credentials:"}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"username: admin"}),"\n",(0,t.jsx)(n.p,{children:"password: admin"}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Then, you will be forwarded to the ",(0,t.jsx)(n.strong,{children:"KADAI Administration"}),". There are other users available."]}),"\n",(0,t.jsx)(n.h3,{id:"navigation-in-the-demo-app",children:"Navigation in the Demo App"}),"\n",(0,t.jsx)(n.p,{children:"To navigate between different pages, select the menu using the three point icon on the upper left. Then, you can choose between the categories shown in the bucket list below."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Administration"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Manage Workbaskets"}),"\n",(0,t.jsx)(n.li,{children:"Manage Classifications"}),"\n",(0,t.jsx)(n.li,{children:"Perform other admin activities"}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Monitor"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Observe current state of work"}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Workplace"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"See available Tasks"}),"\n",(0,t.jsx)(n.li,{children:"Perform actions on Tasks"}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"History"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Observe actions performed by KADAI in the past"}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.strong,{children:"Settings"})}),"\n"]})]})}function c(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(p,{...e})}):p(e)}},1832:(e,n,i)=>{i.d(n,{A:()=>t});const t=i.p+"assets/images/demo-app-ba79b7e75af7bdfe07326f7c880dbd9c.png"},8453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>a});var t=i(6540);const o={},s=t.createContext(o);function r(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b715cf33.7aa747ec.js b/assets/js/b715cf33.7aa747ec.js new file mode 100644 index 0000000..66dd4cc --- /dev/null +++ b/assets/js/b715cf33.7aa747ec.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[1793],{2876:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>o,contentTitle:()=>a,default:()=>h,frontMatter:()=>d,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"user-guide/configuration/security","title":"Security","description":"Users","source":"@site/docs/user-guide/configuration/security.md","sourceDirName":"user-guide/configuration","slug":"/user-guide/configuration/security","permalink":"/kadai-doc/docs/user-guide/configuration/security","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"sidebar_position":2},"sidebar":"userSidebar","previous":{"title":"Database","permalink":"/kadai-doc/docs/user-guide/configuration/database"},"next":{"title":"LDAP","permalink":"/kadai-doc/docs/user-guide/configuration/ldap"}}');var t=r(4848),n=r(8453);const d={sidebar_position:2},a="Security",o={},c=[{value:"Users",id:"users",level:2},{value:"Roles Mapping",id:"roles-mapping",level:3},{value:"REST Service Security",id:"rest-service-security",level:2}];function l(e){const s={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,n.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"security",children:"Security"})}),"\n",(0,t.jsx)(s.h2,{id:"users",children:"Users"}),"\n",(0,t.jsxs)(s.p,{children:["The configuration of the user-related parameters is in the file ",(0,t.jsx)(s.code,{children:"kadai.properties"}),". Some parameters allow multiple values specified as a list. In this case, individual values are separated by a configurable separator. Use the ",(0,t.jsx)(s.em,{children:"propertiesSeparator"}),' parameter to specify it. If none is provided, the default is "|". If you specify a propertiesSeparator, no list item in the properties file can contain any character from the propertiesSeparator.']}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Parameter"}),(0,t.jsx)(s.th,{children:"Description"}),(0,t.jsx)(s.th,{children:"Sample Value"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"EXTERNAL | manual | autoMAtic | Process"}),(0,t.jsx)(s.td,{}),(0,t.jsx)(s.td,{})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"kadai.user.minimalPermissionsToAssignDomains"}),(0,t.jsx)(s.td,{children:"The list of minimal Workbasket permissions of a user needed to belong to the domain. Needed to determine the domains of a user, which are aggregated in the getUser() method of the UserService. Values have to match the Enum values of WorkbasketPermission. If this property is not defined the dynamic computation of the domain attribute will not be executed."}),(0,t.jsx)(s.td,{children:"READ | OPEN"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"kadai.addAdditionalUserInfo"}),(0,t.jsx)(s.td,{children:"Add attributes of the user from the USER_INFO table, for example during a Task request or Task Query, the default value is false"}),(0,t.jsx)(s.td,{children:"true"})]})]})]}),"\n",(0,t.jsx)(s.h3,{id:"roles-mapping",children:"Roles Mapping"}),"\n",(0,t.jsxs)(s.p,{children:["KADAI's Roles and their meaning can be looked up ",(0,t.jsx)(s.a,{href:"../core-concepts/securityAndPermissions#security-roles-in-kadai",children:"here"}),".\nFor each role,\na list of access ids that refer to users or groups can be specified using the following keywords:"]}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Role"}),(0,t.jsx)(s.th,{children:"Keyword"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"user"}),(0,t.jsx)(s.td,{children:"kadai.roles.user"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"business_admin"}),(0,t.jsx)(s.td,{children:"kadai.roles.business_admin"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"task_admin"}),(0,t.jsx)(s.td,{children:"kadai.roles.task_admin"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"admin"}),(0,t.jsx)(s.td,{children:"kadai.roles.admin"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"monitor"}),(0,t.jsx)(s.td,{children:"kadai.roles.monitor"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"task_router"}),(0,t.jsx)(s.td,{children:"kadai.roles.task_router"})]})]})]}),"\n",(0,t.jsx)(s.p,{children:'The access ids are separated by a configurable separator. If none is provided, the default is "|". The assignment of roles to users or groups can look like this:'}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{children:"kadai.roles.user=cn=ksc-users,cn=groups,OU=Test,O=KADAI | teamlead-1 | teamlead-2 | user-1-1 | user-1-2 | user-2-1 | user-2-2 | user-b-1 | user-b-2\nkadai.roles.admin=admin | uid=admin,cn=users,OU=Test,O=KADAI\nkadai.roles.business_admin=businessadmin | cn=business-admins,cn=groups,OU=Test,O=KADAI\nkadai.roles.monitor=monitor | cn=monitor-users,cn=groups,OU=Test,O=KADAI\nkadai.roles.task_admin=taskadmin\n"})}),"\n",(0,t.jsx)(s.h2,{id:"rest-service-security",children:"REST Service Security"}),"\n",(0,t.jsxs)(s.p,{children:["As described in ",(0,t.jsx)(s.a,{href:"/kadai-doc/docs/user-guide/core-concepts/securityAndPermissions",children:"security"}),",\nkadai-core uses JAAS Subjects for authentication.\nHowever, when using the REST service of KADAI, you need to provide a mapping to the JAAS Subjects.\nKADAI shows\nhow to do that in the class BootWebSecurityConfigurer in the ",(0,t.jsx)(s.code,{children:"kadai-rest-spring-example-boot"})," module using LDAP.\nThere, you can also look up additional configuration of KADAI on REST level.\nThis way, KADAI provides LDAP support for its REST Service.\nYou can read more about LDAP Configuration ",(0,t.jsx)(s.a,{href:"/kadai-doc/docs/user-guide/configuration/ldap",children:"here"}),"."]}),"\n",(0,t.jsxs)(s.p,{children:["The following additional security parameters can be configured in the ",(0,t.jsx)(s.code,{children:"application.properties"}),":"]}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Parameter"}),(0,t.jsx)(s.th,{children:"Description"}),(0,t.jsx)(s.th,{children:"Sample Value"}),(0,t.jsx)(s.th,{children:"Optional"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"devMode"}),(0,t.jsx)(s.td,{children:"When using frontend with devMode set to true and enableCsrf to false, you will be automatically logged in as admin. The default value is false."}),(0,t.jsx)(s.td,{children:"false"}),(0,t.jsx)(s.td,{children:"true"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"enableCsrf"}),(0,t.jsx)(s.td,{children:"This property enables the support of CSRF tokens. This will not work together with devMode. You need to set it to false in order to use Basic Auth, for example in Postman.The default value is false."}),(0,t.jsx)(s.td,{children:"true"}),(0,t.jsx)(s.td,{children:"true"})]})]})]})]})}function h(e={}){const{wrapper:s}={...(0,n.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,s,r)=>{r.d(s,{R:()=>d,x:()=>a});var i=r(6540);const t={},n=i.createContext(t);function d(e){const s=i.useContext(n);return i.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:d(e.components),i.createElement(n.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b715cf33.b2f45a53.js b/assets/js/b715cf33.b2f45a53.js deleted file mode 100644 index 37b1c23..0000000 --- a/assets/js/b715cf33.b2f45a53.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[1793],{4767:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>o,contentTitle:()=>d,default:()=>h,frontMatter:()=>n,metadata:()=>a,toc:()=>c});var i=r(4848),t=r(8453);const n={sidebar_position:2},d="Security",a={id:"user-guide/configuration/security",title:"Security",description:"Users",source:"@site/docs/user-guide/configuration/security.md",sourceDirName:"user-guide/configuration",slug:"/user-guide/configuration/security",permalink:"/kadai-doc/docs/user-guide/configuration/security",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"userSidebar",previous:{title:"Database",permalink:"/kadai-doc/docs/user-guide/configuration/database"},next:{title:"LDAP",permalink:"/kadai-doc/docs/user-guide/configuration/ldap"}},o={},c=[{value:"Users",id:"users",level:2},{value:"Roles Mapping",id:"roles-mapping",level:3},{value:"REST Service Security",id:"rest-service-security",level:2}];function l(e){const s={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,t.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"security",children:"Security"})}),"\n",(0,i.jsx)(s.h2,{id:"users",children:"Users"}),"\n",(0,i.jsxs)(s.p,{children:["The configuration of the user-related parameters is in the file ",(0,i.jsx)(s.code,{children:"kadai.properties"}),". Some parameters allow multiple values specified as a list. In this case, individual values are separated by a configurable separator. Use the ",(0,i.jsx)(s.em,{children:"propertiesSeparator"}),' parameter to specify it. If none is provided, the default is "|". If you specify a propertiesSeparator, no list item in the properties file can contain any character from the propertiesSeparator.']}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Parameter"}),(0,i.jsx)(s.th,{children:"Description"}),(0,i.jsx)(s.th,{children:"Sample Value"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"EXTERNAL | manual | autoMAtic | Process"}),(0,i.jsx)(s.td,{}),(0,i.jsx)(s.td,{})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"kadai.user.minimalPermissionsToAssignDomains"}),(0,i.jsx)(s.td,{children:"The list of minimal Workbasket permissions of a user needed to belong to the domain. Needed to determine the domains of a user, which are aggregated in the getUser() method of the UserService. Values have to match the Enum values of WorkbasketPermission. If this property is not defined the dynamic computation of the domain attribute will not be executed."}),(0,i.jsx)(s.td,{children:"READ | OPEN"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"kadai.addAdditionalUserInfo"}),(0,i.jsx)(s.td,{children:"Add attributes of the user from the USER_INFO table, for example during a Task request or Task Query, the default value is false"}),(0,i.jsx)(s.td,{children:"true"})]})]})]}),"\n",(0,i.jsx)(s.h3,{id:"roles-mapping",children:"Roles Mapping"}),"\n",(0,i.jsxs)(s.p,{children:["KADAI's Roles and their meaning can be looked up ",(0,i.jsx)(s.a,{href:"../core-concepts/securityAndPermissions#security-roles-in-kadai",children:"here"}),".\nFor each role,\na list of access ids that refer to users or groups can be specified using the following keywords:"]}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Role"}),(0,i.jsx)(s.th,{children:"Keyword"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"user"}),(0,i.jsx)(s.td,{children:"kadai.roles.user"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"business_admin"}),(0,i.jsx)(s.td,{children:"kadai.roles.business_admin"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"task_admin"}),(0,i.jsx)(s.td,{children:"kadai.roles.task_admin"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"admin"}),(0,i.jsx)(s.td,{children:"kadai.roles.admin"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"monitor"}),(0,i.jsx)(s.td,{children:"kadai.roles.monitor"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"task_router"}),(0,i.jsx)(s.td,{children:"kadai.roles.task_router"})]})]})]}),"\n",(0,i.jsx)(s.p,{children:'The access ids are separated by a configurable separator. If none is provided, the default is "|". The assignment of roles to users or groups can look like this:'}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{children:"kadai.roles.user=cn=ksc-users,cn=groups,OU=Test,O=KADAI | teamlead-1 | teamlead-2 | user-1-1 | user-1-2 | user-2-1 | user-2-2 | user-b-1 | user-b-2\nkadai.roles.admin=admin | uid=admin,cn=users,OU=Test,O=KADAI\nkadai.roles.business_admin=businessadmin | cn=business-admins,cn=groups,OU=Test,O=KADAI\nkadai.roles.monitor=monitor | cn=monitor-users,cn=groups,OU=Test,O=KADAI\nkadai.roles.task_admin=taskadmin\n"})}),"\n",(0,i.jsx)(s.h2,{id:"rest-service-security",children:"REST Service Security"}),"\n",(0,i.jsxs)(s.p,{children:["As described in ",(0,i.jsx)(s.a,{href:"/kadai-doc/docs/user-guide/core-concepts/securityAndPermissions",children:"security"}),",\nkadai-core uses JAAS Subjects for authentication.\nHowever, when using the REST service of KADAI, you need to provide a mapping to the JAAS Subjects.\nKADAI shows\nhow to do that in the class BootWebSecurityConfigurer in the ",(0,i.jsx)(s.code,{children:"kadai-rest-spring-example-boot"})," module using LDAP.\nThere, you can also look up additional configuration of KADAI on REST level.\nThis way, KADAI provides LDAP support for its REST Service.\nYou can read more about LDAP Configuration ",(0,i.jsx)(s.a,{href:"/kadai-doc/docs/user-guide/configuration/ldap",children:"here"}),"."]}),"\n",(0,i.jsxs)(s.p,{children:["The following additional security parameters can be configured in the ",(0,i.jsx)(s.code,{children:"application.properties"}),":"]}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Parameter"}),(0,i.jsx)(s.th,{children:"Description"}),(0,i.jsx)(s.th,{children:"Sample Value"}),(0,i.jsx)(s.th,{children:"Optional"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"devMode"}),(0,i.jsx)(s.td,{children:"When using frontend with devMode set to true and enableCsrf to false, you will be automatically logged in as admin. The default value is false."}),(0,i.jsx)(s.td,{children:"false"}),(0,i.jsx)(s.td,{children:"true"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"enableCsrf"}),(0,i.jsx)(s.td,{children:"This property enables the support of CSRF tokens. This will not work together with devMode. You need to set it to false in order to use Basic Auth, for example in Postman.The default value is false."}),(0,i.jsx)(s.td,{children:"true"}),(0,i.jsx)(s.td,{children:"true"})]})]})]})]})}function h(e={}){const{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},8453:(e,s,r)=>{r.d(s,{R:()=>d,x:()=>a});var i=r(6540);const t={},n=i.createContext(t);function d(e){const s=i.useContext(n);return i.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:d(e.components),i.createElement(n.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c391ba29.b0788de9.js b/assets/js/c391ba29.b0788de9.js new file mode 100644 index 0000000..2b95da1 --- /dev/null +++ b/assets/js/c391ba29.b0788de9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[4755],{5804:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>a,contentTitle:()=>d,default:()=>c,frontMatter:()=>o,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"user-guide/configuration/kadaiJobs","title":"KADAI-jobs","description":"Jobs are automated processes that run in the background of the application, usually periodically. They are scheduled for configurable times and then run by the scheduler. For example, the TaskCleanupJob deletes Tasks after they reached a certain time passed after their completion. You can read more about jobs here.","source":"@site/docs/user-guide/configuration/kadaiJobs.md","sourceDirName":"user-guide/configuration","slug":"/user-guide/configuration/kadaiJobs","permalink":"/kadai-doc/docs/user-guide/configuration/kadaiJobs","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":5,"frontMatter":{"sidebar_position":5},"sidebar":"userSidebar","previous":{"title":"Classification and ServiceLevel","permalink":"/kadai-doc/docs/user-guide/configuration/classificationAndServiceLevel"},"next":{"title":"Holidays and Working Days","permalink":"/kadai-doc/docs/user-guide/configuration/holidaysAndWorkingDays"}}');var s=t(4848),n=t(8453);const o={sidebar_position:5},d="KADAI-jobs",a={},l=[{value:"Scheduler Configuration",id:"scheduler-configuration",level:2},{value:"General Jobs Configuration",id:"general-jobs-configuration",level:2},{value:"TaskCleanupJob Configuration",id:"taskcleanupjob-configuration",level:2},{value:"WorkbasketCleanupJob Configuration",id:"workbasketcleanupjob-configuration",level:2},{value:"HistoryCleanupJob Configuration",id:"historycleanupjob-configuration",level:2},{value:"TaskUpdatePriorityJob Configuration",id:"taskupdatepriorityjob-configuration",level:2},{value:"UserInfoRefreshJob Configuration",id:"userinforefreshjob-configuration",level:2},{value:"CustomJobs Configuration",id:"customjobs-configuration",level:2},{value:"Example",id:"example",level:2}];function h(e){const i={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"kadai-jobs",children:"KADAI-jobs"})}),"\n",(0,s.jsxs)(i.p,{children:["Jobs are automated processes that run in the background of the application, usually periodically. They are scheduled for configurable times and then run by the scheduler. For example, the TaskCleanupJob deletes Tasks after they reached a certain time passed after their completion. You can read more about jobs ",(0,s.jsx)(i.a,{href:"/kadai-doc/docs/user-guide/features/jobs",children:"here"}),".\nCommon options for jobs customization are listed and explained as following:"]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.strong,{children:"Batch size"}),": Maximum number of entities that are processed in one job"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.strong,{children:"Max number of retries"}),": Maximum number of retries if a job fails"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.strong,{children:"First run at"}),": The date for the first run of the job"]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.strong,{children:"Run every"}),": The interval between individual runs of a job"]}),"\n"]}),"\n",(0,s.jsx)(i.p,{children:"Additionally, different jobs have other special parameters for customization which can be found below.\nThere is an example job configuration and execution at the end of this article."}),"\n",(0,s.jsxs)(i.p,{children:["You can also configure the scheduler. The scheduler will initialize the first schedule for the jobs. Each run, the scheduler looks up which jobs are past their due date. These jobs get executed. The behavior of jobs and the scheduler in KADAI can be customized in the configuration file ",(0,s.jsx)(i.code,{children:"kadai.properties"})," with the following parameters:"]}),"\n",(0,s.jsx)(i.h2,{id:"scheduler-configuration",children:"Scheduler Configuration"}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Parameter"}),(0,s.jsx)(i.th,{children:"Description"}),(0,s.jsx)(i.th,{children:"Default Value"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"kadai.jobs.scheduler.enabled"}),(0,s.jsx)(i.td,{children:"Enabling automated scheduling of jobs"}),(0,s.jsx)(i.td,{children:"true"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"kadai.jobs.scheduler.initialStartDelay"}),(0,s.jsx)(i.td,{children:"Start delay before the first job gets scheduled"}),(0,s.jsx)(i.td,{children:"100"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"kadai.jobs.scheduler.period"}),(0,s.jsx)(i.td,{children:"The time interval between the individual runs of the scheduler"}),(0,s.jsx)(i.td,{children:"5"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"kadai.jobs.scheduler.periodTimeUnit"}),(0,s.jsx)(i.td,{children:"The unit for scheduler.initialStartDelay and scheduler.period"}),(0,s.jsx)(i.td,{children:"MINUTES"})]})]})]}),"\n",(0,s.jsx)(i.h2,{id:"general-jobs-configuration",children:"General Jobs Configuration"}),"\n",(0,s.jsx)(i.p,{children:"These configuration options are overwritten by job-specific configuration options"}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Parameter"}),(0,s.jsx)(i.th,{children:"Description"}),(0,s.jsx)(i.th,{children:"Default Value"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"kadai.jobs.maxRetries"}),(0,s.jsx)(i.td,{children:"number of automatic retries after a job has failed"}),(0,s.jsx)(i.td,{children:"3"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"kadai.jobs.batchSize"}),(0,s.jsx)(i.td,{children:"upper bound of how many tasks can be processed by one job"}),(0,s.jsx)(i.td,{children:"100"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"kadai.jobs.runEvery"}),(0,s.jsx)(i.td,{children:"period of time between the executions of jobs (Duration in ISO 8601 format)"}),(0,s.jsx)(i.td,{children:"P1D"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"kadai.jobs.firstRunAt"}),(0,s.jsx)(i.td,{children:"first time the job is run (DateTime n ISO 8601 format)"}),(0,s.jsx)(i.td,{children:"2023-01-01T00:00:00Z"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"kadai.jobs.lockExpirationPeriod"}),(0,s.jsx)(i.td,{children:"period of time the lock is valid (Duration in ISO 8601 format). Should be longer than the longest possible job execution time"}),(0,s.jsx)(i.td,{children:"P2D"})]})]})]}),"\n",(0,s.jsx)(i.h2,{id:"taskcleanupjob-configuration",children:"TaskCleanupJob Configuration"}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Parameter"}),(0,s.jsx)(i.th,{children:"Description"}),(0,s.jsx)(i.th,{children:"Default Value"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"kadai.jobs.cleanup.task.enable"}),(0,s.jsx)(i.td,{children:"Enabling automated cleanup of completed tasks after a period of time specified by job.runEvery"}),(0,s.jsx)(i.td,{children:"true"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"kadai.jobs.cleanup.task.minimumAge"}),(0,s.jsx)(i.td,{children:"the completed task can be deleted by the cleanup only after this period of time or later (Duration in ISO 8601 format)"}),(0,s.jsx)(i.td,{children:"P14D"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"kadai.jobs.cleanup.task.allCompletedSameParentBusiness"}),(0,s.jsx)(i.td,{children:"Prevent deletion of tasks if other tasks with same parent business process ID are not yet completed"}),(0,s.jsx)(i.td,{children:"true"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"kadai.jobs.cleanup.task.lockExpirationPeriod"}),(0,s.jsx)(i.td,{children:"period of time the lock is valid (Duration in ISO 8601 format). Should be longer than the longest possible job execution time"}),(0,s.jsx)(i.td,{children:"PT30M"})]})]})]}),"\n",(0,s.jsx)(i.h2,{id:"workbasketcleanupjob-configuration",children:"WorkbasketCleanupJob Configuration"}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Parameter"}),(0,s.jsx)(i.th,{children:"Description"}),(0,s.jsx)(i.th,{children:"Default Value"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"kadai.jobs.cleanup.workbasket.enable"}),(0,s.jsx)(i.td,{children:"Enable WorkbasketCleanupJob to cleanup completed workbaskets after a period of time if no pending tasks"}),(0,s.jsx)(i.td,{children:"true"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"kadai.jobs.cleanup.workbasket.lockExpirationPeriod"}),(0,s.jsx)(i.td,{children:"period of time the lock is valid (Duration in ISO 8601 format). Should be longer than the longest possible job execution time"}),(0,s.jsx)(i.td,{children:"PT30M"})]})]})]}),"\n",(0,s.jsx)(i.h2,{id:"historycleanupjob-configuration",children:"HistoryCleanupJob Configuration"}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Parameter"}),(0,s.jsx)(i.th,{children:"Description"}),(0,s.jsx)(i.th,{children:"Default Value"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"kadai.jobs.cleanup.history.simple.enable"}),(0,s.jsx)(i.td,{children:"Enables the HistoryCleanupJob to delete history events"}),(0,s.jsx)(i.td,{children:"false"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"kadai.jobs.cleanup.history.simple.minimumAge"}),(0,s.jsx)(i.td,{children:"a history event may only be deleted by the cleanup after this period of time or later (Duration in ISO 8601 format)"}),(0,s.jsx)(i.td,{children:"P14D"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"kadai.jobs.cleanup.history.simple.batchSize"}),(0,s.jsx)(i.td,{children:"upper bound of how many history events can be processed by one history cleanup job"}),(0,s.jsx)(i.td,{children:"100"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"kadai.jobs.cleanup.history.simple.allCompletedSameParentBusiness"}),(0,s.jsx)(i.td,{children:'Prevent deletion of Task History Events if other Task History Events with same parent business process ID have types other than "CREATED"'}),(0,s.jsx)(i.td,{children:"true"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"kadai.jobs.cleanup.history.simple.lockExpirationPeriod"}),(0,s.jsx)(i.td,{children:"period of time the lock is valid (Duration in ISO 8601 format). Should be longer than the longest possible job execution time"}),(0,s.jsx)(i.td,{children:"PT30M"})]})]})]}),"\n",(0,s.jsx)(i.h2,{id:"taskupdatepriorityjob-configuration",children:"TaskUpdatePriorityJob Configuration"}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Parameter"}),(0,s.jsx)(i.th,{children:"Description"}),(0,s.jsx)(i.th,{children:"Default Value"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"kadai.jobs.priority.task.enable"}),(0,s.jsx)(i.td,{children:"Enabling automated recalculation of priority of each tasks that is not in an endstate"}),(0,s.jsx)(i.td,{children:"false"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"kadai.jobs.priority.task.batchSize"}),(0,s.jsx)(i.td,{children:"upper bound of how many tasks can be processed by one TaskUpdatePriorityJob"}),(0,s.jsx)(i.td,{children:"100"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"kadai.jobs.priority.task.runEvery"}),(0,s.jsx)(i.td,{children:"period of time between the executions of the TaskUpdatePriorityJob (Duration in ISO 8601 format)"}),(0,s.jsx)(i.td,{children:"P1D"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"kadai.jobs.priority.task.firstRunAt"}),(0,s.jsx)(i.td,{children:"first time the job is executed (DateTime in ISO 8601 format)"}),(0,s.jsx)(i.td,{children:"2023-01-01T00:00:00Z"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"kadai.jobs.priority.task.lockExpirationPeriod"}),(0,s.jsx)(i.td,{children:"period of time the lock is valid (Duration in ISO 8601 format). Should be longer than the longest possible job execution time"}),(0,s.jsx)(i.td,{children:"PT30M"})]})]})]}),"\n",(0,s.jsx)(i.h2,{id:"userinforefreshjob-configuration",children:"UserInfoRefreshJob Configuration"}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Parameter"}),(0,s.jsx)(i.th,{children:"Description"}),(0,s.jsx)(i.th,{children:"Default Value"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"kadai.jobs.refresh.user.enable"}),(0,s.jsx)(i.td,{children:"Enable job to refresh all user info after a period of time"}),(0,s.jsx)(i.td,{children:"false"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"kadai.jobs.refresh.user.runEvery"}),(0,s.jsx)(i.td,{children:"period of time between the executions of the UserInfoRefreshJob (Duration in ISO 8601 format)"}),(0,s.jsx)(i.td,{children:"P1D"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"kadai.jobs.refresh.user.firstRunAt"}),(0,s.jsx)(i.td,{children:"first time the job is executed (DateTime in ISO 8601 format)"}),(0,s.jsx)(i.td,{children:"2023-01-01T23:00:00Z"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"kadai.jobs.refresh.user.lockExpirationPeriod"}),(0,s.jsx)(i.td,{children:"period of time the lock is valid (Duration in ISO 8601 format). Should be longer than the longest possible job execution time"}),(0,s.jsx)(i.td,{children:"PT30M"})]})]})]}),"\n",(0,s.jsx)(i.h2,{id:"customjobs-configuration",children:"CustomJobs Configuration"}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Parameter"}),(0,s.jsx)(i.th,{children:"Description"}),(0,s.jsx)(i.th,{children:"Default Value"})]})}),(0,s.jsx)(i.tbody,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"kadai.jobs.customJobs"}),(0,s.jsx)(i.td,{children:"Initialize custom jobs by specifying path to job class"}),(0,s.jsx)(i.td,{})]})})]}),"\n",(0,s.jsx)(i.h2,{id:"example",children:"Example"}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"Setup"}),":"]}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{children:"kadai.jobs.scheduler.enabled=true\nkadai.jobs.scheduler.initialStartDelay=2\nkadai.jobs.scheduler.period=3\nkadai.jobs.scheduler.periodTimeUnit=HOURS\nkadai.jobs.refresh.user.firstRunAt=2017-04-05T18:00:00Z\nkadai.jobs.refresh.user.runEvery=P4H\n"})}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"Result"})," (assuming the refresh user job is the only active job):"]}),"\n",(0,s.jsx)(i.p,{children:(0,s.jsx)(i.img,{alt:"Local Image",src:t(8368).A+"",width:"675",height:"281"})})]})}function c(e={}){const{wrapper:i}={...(0,n.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},8368:(e,i,t)=>{t.d(i,{A:()=>r});const r=t.p+"assets/images/Timeline.drawio-ceb12631b8434b428d94d7808d21f0ab.png"},8453:(e,i,t)=>{t.d(i,{R:()=>o,x:()=>d});var r=t(6540);const s={},n=r.createContext(s);function o(e){const i=r.useContext(n);return r.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function d(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(n.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c391ba29.fb66fb28.js b/assets/js/c391ba29.fb66fb28.js deleted file mode 100644 index bbc4061..0000000 --- a/assets/js/c391ba29.fb66fb28.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[4755],{8891:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>a,contentTitle:()=>o,default:()=>c,frontMatter:()=>n,metadata:()=>d,toc:()=>l});var r=t(4848),s=t(8453);const n={sidebar_position:5},o="KADAI-jobs",d={id:"user-guide/configuration/kadaiJobs",title:"KADAI-jobs",description:"Jobs are automated processes that run in the background of the application, usually periodically. They are scheduled for configurable times and then run by the scheduler. For example, the TaskCleanupJob deletes Tasks after they reached a certain time passed after their completion. You can read more about jobs here.",source:"@site/docs/user-guide/configuration/kadaiJobs.md",sourceDirName:"user-guide/configuration",slug:"/user-guide/configuration/kadaiJobs",permalink:"/kadai-doc/docs/user-guide/configuration/kadaiJobs",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:5,frontMatter:{sidebar_position:5},sidebar:"userSidebar",previous:{title:"Classification and ServiceLevel",permalink:"/kadai-doc/docs/user-guide/configuration/classificationAndServiceLevel"},next:{title:"Holidays and Working Days",permalink:"/kadai-doc/docs/user-guide/configuration/holidaysAndWorkingDays"}},a={},l=[{value:"Scheduler Configuration",id:"scheduler-configuration",level:2},{value:"General Jobs Configuration",id:"general-jobs-configuration",level:2},{value:"TaskCleanupJob Configuration",id:"taskcleanupjob-configuration",level:2},{value:"WorkbasketCleanupJob Configuration",id:"workbasketcleanupjob-configuration",level:2},{value:"HistoryCleanupJob Configuration",id:"historycleanupjob-configuration",level:2},{value:"TaskUpdatePriorityJob Configuration",id:"taskupdatepriorityjob-configuration",level:2},{value:"UserInfoRefreshJob Configuration",id:"userinforefreshjob-configuration",level:2},{value:"CustomJobs Configuration",id:"customjobs-configuration",level:2},{value:"Example",id:"example",level:2}];function h(e){const i={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(i.header,{children:(0,r.jsx)(i.h1,{id:"kadai-jobs",children:"KADAI-jobs"})}),"\n",(0,r.jsxs)(i.p,{children:["Jobs are automated processes that run in the background of the application, usually periodically. They are scheduled for configurable times and then run by the scheduler. For example, the TaskCleanupJob deletes Tasks after they reached a certain time passed after their completion. You can read more about jobs ",(0,r.jsx)(i.a,{href:"/kadai-doc/docs/user-guide/features/jobs",children:"here"}),".\nCommon options for jobs customization are listed and explained as following:"]}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Batch size"}),": Maximum number of entities that are processed in one job"]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Max number of retries"}),": Maximum number of retries if a job fails"]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"First run at"}),": The date for the first run of the job"]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.strong,{children:"Run every"}),": The interval between individual runs of a job"]}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:"Additionally, different jobs have other special parameters for customization which can be found below.\nThere is an example job configuration and execution at the end of this article."}),"\n",(0,r.jsxs)(i.p,{children:["You can also configure the scheduler. The scheduler will initialize the first schedule for the jobs. Each run, the scheduler looks up which jobs are past their due date. These jobs get executed. The behavior of jobs and the scheduler in KADAI can be customized in the configuration file ",(0,r.jsx)(i.code,{children:"kadai.properties"})," with the following parameters:"]}),"\n",(0,r.jsx)(i.h2,{id:"scheduler-configuration",children:"Scheduler Configuration"}),"\n",(0,r.jsxs)(i.table,{children:[(0,r.jsx)(i.thead,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.th,{children:"Parameter"}),(0,r.jsx)(i.th,{children:"Description"}),(0,r.jsx)(i.th,{children:"Default Value"})]})}),(0,r.jsxs)(i.tbody,{children:[(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"kadai.jobs.scheduler.enabled"}),(0,r.jsx)(i.td,{children:"Enabling automated scheduling of jobs"}),(0,r.jsx)(i.td,{children:"true"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"kadai.jobs.scheduler.initialStartDelay"}),(0,r.jsx)(i.td,{children:"Start delay before the first job gets scheduled"}),(0,r.jsx)(i.td,{children:"100"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"kadai.jobs.scheduler.period"}),(0,r.jsx)(i.td,{children:"The time interval between the individual runs of the scheduler"}),(0,r.jsx)(i.td,{children:"5"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"kadai.jobs.scheduler.periodTimeUnit"}),(0,r.jsx)(i.td,{children:"The unit for scheduler.initialStartDelay and scheduler.period"}),(0,r.jsx)(i.td,{children:"MINUTES"})]})]})]}),"\n",(0,r.jsx)(i.h2,{id:"general-jobs-configuration",children:"General Jobs Configuration"}),"\n",(0,r.jsx)(i.p,{children:"These configuration options are overwritten by job-specific configuration options"}),"\n",(0,r.jsxs)(i.table,{children:[(0,r.jsx)(i.thead,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.th,{children:"Parameter"}),(0,r.jsx)(i.th,{children:"Description"}),(0,r.jsx)(i.th,{children:"Default Value"})]})}),(0,r.jsxs)(i.tbody,{children:[(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"kadai.jobs.maxRetries"}),(0,r.jsx)(i.td,{children:"number of automatic retries after a job has failed"}),(0,r.jsx)(i.td,{children:"3"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"kadai.jobs.batchSize"}),(0,r.jsx)(i.td,{children:"upper bound of how many tasks can be processed by one job"}),(0,r.jsx)(i.td,{children:"100"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"kadai.jobs.runEvery"}),(0,r.jsx)(i.td,{children:"period of time between the executions of jobs (Duration in ISO 8601 format)"}),(0,r.jsx)(i.td,{children:"P1D"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"kadai.jobs.firstRunAt"}),(0,r.jsx)(i.td,{children:"first time the job is run (DateTime n ISO 8601 format)"}),(0,r.jsx)(i.td,{children:"2023-01-01T00:00:00Z"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"kadai.jobs.lockExpirationPeriod"}),(0,r.jsx)(i.td,{children:"period of time the lock is valid (Duration in ISO 8601 format). Should be longer than the longest possible job execution time"}),(0,r.jsx)(i.td,{children:"P2D"})]})]})]}),"\n",(0,r.jsx)(i.h2,{id:"taskcleanupjob-configuration",children:"TaskCleanupJob Configuration"}),"\n",(0,r.jsxs)(i.table,{children:[(0,r.jsx)(i.thead,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.th,{children:"Parameter"}),(0,r.jsx)(i.th,{children:"Description"}),(0,r.jsx)(i.th,{children:"Default Value"})]})}),(0,r.jsxs)(i.tbody,{children:[(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"kadai.jobs.cleanup.task.enable"}),(0,r.jsx)(i.td,{children:"Enabling automated cleanup of completed tasks after a period of time specified by job.runEvery"}),(0,r.jsx)(i.td,{children:"true"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"kadai.jobs.cleanup.task.minimumAge"}),(0,r.jsx)(i.td,{children:"the completed task can be deleted by the cleanup only after this period of time or later (Duration in ISO 8601 format)"}),(0,r.jsx)(i.td,{children:"P14D"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"kadai.jobs.cleanup.task.allCompletedSameParentBusiness"}),(0,r.jsx)(i.td,{children:"Prevent deletion of tasks if other tasks with same parent business process ID are not yet completed"}),(0,r.jsx)(i.td,{children:"true"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"kadai.jobs.cleanup.task.lockExpirationPeriod"}),(0,r.jsx)(i.td,{children:"period of time the lock is valid (Duration in ISO 8601 format). Should be longer than the longest possible job execution time"}),(0,r.jsx)(i.td,{children:"PT30M"})]})]})]}),"\n",(0,r.jsx)(i.h2,{id:"workbasketcleanupjob-configuration",children:"WorkbasketCleanupJob Configuration"}),"\n",(0,r.jsxs)(i.table,{children:[(0,r.jsx)(i.thead,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.th,{children:"Parameter"}),(0,r.jsx)(i.th,{children:"Description"}),(0,r.jsx)(i.th,{children:"Default Value"})]})}),(0,r.jsxs)(i.tbody,{children:[(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"kadai.jobs.cleanup.workbasket.enable"}),(0,r.jsx)(i.td,{children:"Enable WorkbasketCleanupJob to cleanup completed workbaskets after a period of time if no pending tasks"}),(0,r.jsx)(i.td,{children:"true"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"kadai.jobs.cleanup.workbasket.lockExpirationPeriod"}),(0,r.jsx)(i.td,{children:"period of time the lock is valid (Duration in ISO 8601 format). Should be longer than the longest possible job execution time"}),(0,r.jsx)(i.td,{children:"PT30M"})]})]})]}),"\n",(0,r.jsx)(i.h2,{id:"historycleanupjob-configuration",children:"HistoryCleanupJob Configuration"}),"\n",(0,r.jsxs)(i.table,{children:[(0,r.jsx)(i.thead,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.th,{children:"Parameter"}),(0,r.jsx)(i.th,{children:"Description"}),(0,r.jsx)(i.th,{children:"Default Value"})]})}),(0,r.jsxs)(i.tbody,{children:[(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"kadai.jobs.cleanup.history.simple.enable"}),(0,r.jsx)(i.td,{children:"Enables the HistoryCleanupJob to delete history events"}),(0,r.jsx)(i.td,{children:"false"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"kadai.jobs.cleanup.history.simple.minimumAge"}),(0,r.jsx)(i.td,{children:"a history event may only be deleted by the cleanup after this period of time or later (Duration in ISO 8601 format)"}),(0,r.jsx)(i.td,{children:"P14D"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"kadai.jobs.cleanup.history.simple.batchSize"}),(0,r.jsx)(i.td,{children:"upper bound of how many history events can be processed by one history cleanup job"}),(0,r.jsx)(i.td,{children:"100"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"kadai.jobs.cleanup.history.simple.allCompletedSameParentBusiness"}),(0,r.jsx)(i.td,{children:'Prevent deletion of Task History Events if other Task History Events with same parent business process ID have types other than "CREATED"'}),(0,r.jsx)(i.td,{children:"true"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"kadai.jobs.cleanup.history.simple.lockExpirationPeriod"}),(0,r.jsx)(i.td,{children:"period of time the lock is valid (Duration in ISO 8601 format). Should be longer than the longest possible job execution time"}),(0,r.jsx)(i.td,{children:"PT30M"})]})]})]}),"\n",(0,r.jsx)(i.h2,{id:"taskupdatepriorityjob-configuration",children:"TaskUpdatePriorityJob Configuration"}),"\n",(0,r.jsxs)(i.table,{children:[(0,r.jsx)(i.thead,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.th,{children:"Parameter"}),(0,r.jsx)(i.th,{children:"Description"}),(0,r.jsx)(i.th,{children:"Default Value"})]})}),(0,r.jsxs)(i.tbody,{children:[(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"kadai.jobs.priority.task.enable"}),(0,r.jsx)(i.td,{children:"Enabling automated recalculation of priority of each tasks that is not in an endstate"}),(0,r.jsx)(i.td,{children:"false"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"kadai.jobs.priority.task.batchSize"}),(0,r.jsx)(i.td,{children:"upper bound of how many tasks can be processed by one TaskUpdatePriorityJob"}),(0,r.jsx)(i.td,{children:"100"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"kadai.jobs.priority.task.runEvery"}),(0,r.jsx)(i.td,{children:"period of time between the executions of the TaskUpdatePriorityJob (Duration in ISO 8601 format)"}),(0,r.jsx)(i.td,{children:"P1D"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"kadai.jobs.priority.task.firstRunAt"}),(0,r.jsx)(i.td,{children:"first time the job is executed (DateTime in ISO 8601 format)"}),(0,r.jsx)(i.td,{children:"2023-01-01T00:00:00Z"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"kadai.jobs.priority.task.lockExpirationPeriod"}),(0,r.jsx)(i.td,{children:"period of time the lock is valid (Duration in ISO 8601 format). Should be longer than the longest possible job execution time"}),(0,r.jsx)(i.td,{children:"PT30M"})]})]})]}),"\n",(0,r.jsx)(i.h2,{id:"userinforefreshjob-configuration",children:"UserInfoRefreshJob Configuration"}),"\n",(0,r.jsxs)(i.table,{children:[(0,r.jsx)(i.thead,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.th,{children:"Parameter"}),(0,r.jsx)(i.th,{children:"Description"}),(0,r.jsx)(i.th,{children:"Default Value"})]})}),(0,r.jsxs)(i.tbody,{children:[(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"kadai.jobs.refresh.user.enable"}),(0,r.jsx)(i.td,{children:"Enable job to refresh all user info after a period of time"}),(0,r.jsx)(i.td,{children:"false"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"kadai.jobs.refresh.user.runEvery"}),(0,r.jsx)(i.td,{children:"period of time between the executions of the UserInfoRefreshJob (Duration in ISO 8601 format)"}),(0,r.jsx)(i.td,{children:"P1D"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"kadai.jobs.refresh.user.firstRunAt"}),(0,r.jsx)(i.td,{children:"first time the job is executed (DateTime in ISO 8601 format)"}),(0,r.jsx)(i.td,{children:"2023-01-01T23:00:00Z"})]}),(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"kadai.jobs.refresh.user.lockExpirationPeriod"}),(0,r.jsx)(i.td,{children:"period of time the lock is valid (Duration in ISO 8601 format). Should be longer than the longest possible job execution time"}),(0,r.jsx)(i.td,{children:"PT30M"})]})]})]}),"\n",(0,r.jsx)(i.h2,{id:"customjobs-configuration",children:"CustomJobs Configuration"}),"\n",(0,r.jsxs)(i.table,{children:[(0,r.jsx)(i.thead,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.th,{children:"Parameter"}),(0,r.jsx)(i.th,{children:"Description"}),(0,r.jsx)(i.th,{children:"Default Value"})]})}),(0,r.jsx)(i.tbody,{children:(0,r.jsxs)(i.tr,{children:[(0,r.jsx)(i.td,{children:"kadai.jobs.customJobs"}),(0,r.jsx)(i.td,{children:"Initialize custom jobs by specifying path to job class"}),(0,r.jsx)(i.td,{})]})})]}),"\n",(0,r.jsx)(i.h2,{id:"example",children:"Example"}),"\n",(0,r.jsxs)(i.p,{children:[(0,r.jsx)(i.strong,{children:"Setup"}),":"]}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{children:"kadai.jobs.scheduler.enabled=true\nkadai.jobs.scheduler.initialStartDelay=2\nkadai.jobs.scheduler.period=3\nkadai.jobs.scheduler.periodTimeUnit=HOURS\nkadai.jobs.refresh.user.firstRunAt=2017-04-05T18:00:00Z\nkadai.jobs.refresh.user.runEvery=P4H\n"})}),"\n",(0,r.jsxs)(i.p,{children:[(0,r.jsx)(i.strong,{children:"Result"})," (assuming the refresh user job is the only active job):"]}),"\n",(0,r.jsx)(i.p,{children:(0,r.jsx)(i.img,{alt:"Local Image",src:t(8368).A+"",width:"675",height:"281"})})]})}function c(e={}){const{wrapper:i}={...(0,s.R)(),...e.components};return i?(0,r.jsx)(i,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},8368:(e,i,t)=>{t.d(i,{A:()=>r});const r=t.p+"assets/images/Timeline.drawio-ceb12631b8434b428d94d7808d21f0ab.png"},8453:(e,i,t)=>{t.d(i,{R:()=>o,x:()=>d});var r=t(6540);const s={},n=r.createContext(s);function o(e){const i=r.useContext(n);return r.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function d(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(n.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c9ced819.b01beb7a.js b/assets/js/c9ced819.b01beb7a.js new file mode 100644 index 0000000..bc477fe --- /dev/null +++ b/assets/js/c9ced819.b01beb7a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[37],{9356:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>d,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"user-guide/configuration/historyAndCustomProperties","title":"History and Custom Properties","description":"The concept of History in KADAI is explained in more detail here.","source":"@site/docs/user-guide/configuration/historyAndCustomProperties.md","sourceDirName":"user-guide/configuration","slug":"/user-guide/configuration/historyAndCustomProperties","permalink":"/kadai-doc/docs/user-guide/configuration/historyAndCustomProperties","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":7,"frontMatter":{"sidebar_position":7},"sidebar":"userSidebar","previous":{"title":"Holidays and Working Days","permalink":"/kadai-doc/docs/user-guide/configuration/holidaysAndWorkingDays"},"next":{"title":"Priority Report","permalink":"/kadai-doc/docs/user-guide/configuration/priorityReport"}}');var r=t(4848),n=t(8453);const s={sidebar_position:7},a="History and Custom Properties",d={},c=[{value:"History",id:"history",level:2},{value:"Custom",id:"custom",level:2}];function l(e){const i={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,n.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(i.header,{children:(0,r.jsx)(i.h1,{id:"history-and-custom-properties",children:"History and Custom Properties"})}),"\n",(0,r.jsxs)(i.p,{children:["The concept of History in KADAI is explained in more detail ",(0,r.jsx)(i.a,{href:"/kadai-doc/docs/user-guide/features/kadaiHistorySPI",children:"here"}),"."]}),"\n",(0,r.jsx)(i.h2,{id:"history",children:"History"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.code,{children:"kadai.history.deletion.on.task.deletion.enabled"}),": After deletion of a Task, all history events related to that Task will also be deleted."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.code,{children:" kadai.historylogger.name"}),": The name of the logger that writes to the audit file.\nExample:\n",(0,r.jsx)(i.code,{children:"kadai.historylogger.name=AUDIT"})]}),"\n"]}),"\n",(0,r.jsx)(i.h2,{id:"custom",children:"Custom"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.code,{children:"my_custom_property1"})," : You can define the meaning of the value parameter yourself."]}),"\n",(0,r.jsxs)(i.li,{children:[(0,r.jsx)(i.code,{children:"my_custom_property2"})," : You can define the meaning of the value parameter yourself."]}),"\n"]})]})}function u(e={}){const{wrapper:i}={...(0,n.R)(),...e.components};return i?(0,r.jsx)(i,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,i,t)=>{t.d(i,{R:()=>s,x:()=>a});var o=t(6540);const r={},n=o.createContext(r);function s(e){const i=o.useContext(n);return o.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function a(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),o.createElement(n.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c9ced819.fe9cb59d.js b/assets/js/c9ced819.fe9cb59d.js deleted file mode 100644 index 1429cfe..0000000 --- a/assets/js/c9ced819.fe9cb59d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[37],{7418:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>a,contentTitle:()=>s,default:()=>u,frontMatter:()=>n,metadata:()=>d,toc:()=>c});var o=t(4848),r=t(8453);const n={sidebar_position:7},s="History and Custom Properties",d={id:"user-guide/configuration/historyAndCustomProperties",title:"History and Custom Properties",description:"The concept of History in KADAI is explained in more detail here.",source:"@site/docs/user-guide/configuration/historyAndCustomProperties.md",sourceDirName:"user-guide/configuration",slug:"/user-guide/configuration/historyAndCustomProperties",permalink:"/kadai-doc/docs/user-guide/configuration/historyAndCustomProperties",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:7,frontMatter:{sidebar_position:7},sidebar:"userSidebar",previous:{title:"Holidays and Working Days",permalink:"/kadai-doc/docs/user-guide/configuration/holidaysAndWorkingDays"},next:{title:"Priority Report",permalink:"/kadai-doc/docs/user-guide/configuration/priorityReport"}},a={},c=[{value:"History",id:"history",level:2},{value:"Custom",id:"custom",level:2}];function l(e){const i={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(i.header,{children:(0,o.jsx)(i.h1,{id:"history-and-custom-properties",children:"History and Custom Properties"})}),"\n",(0,o.jsxs)(i.p,{children:["The concept of History in KADAI is explained in more detail ",(0,o.jsx)(i.a,{href:"/kadai-doc/docs/user-guide/features/kadaiHistorySPI",children:"here"}),"."]}),"\n",(0,o.jsx)(i.h2,{id:"history",children:"History"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.code,{children:"kadai.history.deletion.on.task.deletion.enabled"}),": After deletion of a Task, all history events related to that Task will also be deleted."]}),"\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.code,{children:" kadai.historylogger.name"}),": The name of the logger that writes to the audit file.\nExample:\n",(0,o.jsx)(i.code,{children:"kadai.historylogger.name=AUDIT"})]}),"\n"]}),"\n",(0,o.jsx)(i.h2,{id:"custom",children:"Custom"}),"\n",(0,o.jsxs)(i.ul,{children:["\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.code,{children:"my_custom_property1"})," : You can define the meaning of the value parameter yourself."]}),"\n",(0,o.jsxs)(i.li,{children:[(0,o.jsx)(i.code,{children:"my_custom_property2"})," : You can define the meaning of the value parameter yourself."]}),"\n"]})]})}function u(e={}){const{wrapper:i}={...(0,r.R)(),...e.components};return i?(0,o.jsx)(i,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453:(e,i,t)=>{t.d(i,{R:()=>s,x:()=>d});var o=t(6540);const r={},n=o.createContext(r);function s(e){const i=o.useContext(n);return o.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function d(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),o.createElement(n.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ce69b5c4.2d97da67.js b/assets/js/ce69b5c4.2d97da67.js new file mode 100644 index 0000000..045604c --- /dev/null +++ b/assets/js/ce69b5c4.2d97da67.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[6298],{4966:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>u,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"user-guide/features/users","title":"Users","description":"In KADAI, a User is an entity that represents a user. A user is used for authentication as well as for specifying the owner of a Task. The User entity has attributes such as name, phone number and e-mail.","source":"@site/docs/user-guide/features/users.md","sourceDirName":"user-guide/features","slug":"/user-guide/features/users","permalink":"/kadai-doc/docs/user-guide/features/users","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":6,"frontMatter":{"sidebar_position":6},"sidebar":"userSidebar","previous":{"title":"Monitoring","permalink":"/kadai-doc/docs/user-guide/features/monitoring"},"next":{"title":"Queries: Filtering and Sorting","permalink":"/kadai-doc/docs/user-guide/features/queriesFilteringAndSorting"}}');var t=r(4848),i=r(8453);const o={sidebar_position:6},a="Users",u={},d=[{value:"Operations on Users",id:"operations-on-users",level:2},{value:"Configuration",id:"configuration",level:2}];function c(e){const s={a:"a",h1:"h1",h2:"h2",header:"header",p:"p",strong:"strong",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"users",children:"Users"})}),"\n",(0,t.jsx)(s.p,{children:"In KADAI, a User is an entity that represents a user. A user is used for authentication as well as for specifying the owner of a Task. The User entity has attributes such as name, phone number and e-mail."}),"\n",(0,t.jsxs)(s.p,{children:['A user can belong to one or multiple groups and have permissions assigned.\nGroups and permissions are used to determine additional access rights of the user.\nFor example, if "user-1" belongs to the group "group-1", and "group-1"\nhas access to the Workbasket "workbasket-of-group-1",\nthen "user-1" has access to the "workbasket-of-group-1".\nThe same applies to permissions.\nUsers, Groups and permissions are identified via an ',(0,t.jsx)(s.strong,{children:"AccessId"})," in KADAI.\nThe AccessId is used for determining access rights through WorkbasketAccessItems.\nYou can read more about it ",(0,t.jsx)(s.a,{href:"/kadai-doc/docs/user-guide/core-concepts/overview#workbasketaccessitem",children:"here"}),".\nAdditionally,\nUsers and Groups both have ",(0,t.jsx)(s.a,{href:"/kadai-doc/docs/user-guide/core-concepts/securityAndPermissions#security-roles-in-kadai",children:"Roles"})," assigned."]}),"\n",(0,t.jsx)(s.h2,{id:"operations-on-users",children:"Operations on Users"}),"\n",(0,t.jsxs)(s.p,{children:["You can create, get, update and delete a User via UserService in the Java-API. In the REST-API, you can fetch detailed information about Users via the associated API operations.\nA detailed description of the REST operations on AccessIds, Users and Groups can be found in the ",(0,t.jsx)(s.a,{href:"https://kadai-io.azurewebsites.net/kadai/swagger-ui/index.html",children:"REST API documentation"})]}),"\n",(0,t.jsxs)(s.p,{children:["You can set up your Users using LDAP. In this case, you can also use the ",(0,t.jsx)(s.a,{href:"/kadai-doc/docs/user-guide/features/jobs#userinforefreshjob",children:"UserInfoRefreshJob"})," to keep the Users up to date with your .ldif file."]}),"\n",(0,t.jsx)(s.h2,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsxs)(s.p,{children:["You can read more about the configuration of Users ",(0,t.jsx)(s.a,{href:"/kadai-doc/docs/user-guide/configuration/security#users",children:"here"}),"."]})]})}function h(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},8453:(e,s,r)=>{r.d(s,{R:()=>o,x:()=>a});var n=r(6540);const t={},i=n.createContext(t);function o(e){const s=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),n.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ce69b5c4.4ffb2ec3.js b/assets/js/ce69b5c4.4ffb2ec3.js deleted file mode 100644 index cf25cc7..0000000 --- a/assets/js/ce69b5c4.4ffb2ec3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[6298],{1902:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>u,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>a,toc:()=>d});var n=r(4848),t=r(8453);const i={sidebar_position:6},o="Users",a={id:"user-guide/features/users",title:"Users",description:"In KADAI, a User is an entity that represents a user. A user is used for authentication as well as for specifying the owner of a Task. The User entity has attributes such as name, phone number and e-mail.",source:"@site/docs/user-guide/features/users.md",sourceDirName:"user-guide/features",slug:"/user-guide/features/users",permalink:"/kadai-doc/docs/user-guide/features/users",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:6,frontMatter:{sidebar_position:6},sidebar:"userSidebar",previous:{title:"Monitoring",permalink:"/kadai-doc/docs/user-guide/features/monitoring"},next:{title:"Queries: Filtering and Sorting",permalink:"/kadai-doc/docs/user-guide/features/queriesFilteringAndSorting"}},u={},d=[{value:"Operations on Users",id:"operations-on-users",level:2},{value:"Configuration",id:"configuration",level:2}];function c(e){const s={a:"a",h1:"h1",h2:"h2",header:"header",p:"p",strong:"strong",...(0,t.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.header,{children:(0,n.jsx)(s.h1,{id:"users",children:"Users"})}),"\n",(0,n.jsx)(s.p,{children:"In KADAI, a User is an entity that represents a user. A user is used for authentication as well as for specifying the owner of a Task. The User entity has attributes such as name, phone number and e-mail."}),"\n",(0,n.jsxs)(s.p,{children:['A user can belong to one or multiple groups and have permissions assigned.\nGroups and permissions are used to determine additional access rights of the user.\nFor example, if "user-1" belongs to the group "group-1", and "group-1"\nhas access to the Workbasket "workbasket-of-group-1",\nthen "user-1" has access to the "workbasket-of-group-1".\nThe same applies to permissions.\nUsers, Groups and permissions are identified via an ',(0,n.jsx)(s.strong,{children:"AccessId"})," in KADAI.\nThe AccessId is used for determining access rights through WorkbasketAccessItems.\nYou can read more about it ",(0,n.jsx)(s.a,{href:"/kadai-doc/docs/user-guide/core-concepts/overview#workbasketaccessitem",children:"here"}),".\nAdditionally,\nUsers and Groups both have ",(0,n.jsx)(s.a,{href:"/kadai-doc/docs/user-guide/core-concepts/securityAndPermissions#security-roles-in-kadai",children:"Roles"})," assigned."]}),"\n",(0,n.jsx)(s.h2,{id:"operations-on-users",children:"Operations on Users"}),"\n",(0,n.jsxs)(s.p,{children:["You can create, get, update and delete a User via UserService in the Java-API. In the REST-API, you can fetch detailed information about Users via the associated API operations.\nA detailed description of the REST operations on AccessIds, Users and Groups can be found in the ",(0,n.jsx)(s.a,{href:"https://kadai-io.azurewebsites.net/kadai/swagger-ui/index.html",children:"REST API documentation"})]}),"\n",(0,n.jsxs)(s.p,{children:["You can set up your Users using LDAP. In this case, you can also use the ",(0,n.jsx)(s.a,{href:"/kadai-doc/docs/user-guide/features/jobs#userinforefreshjob",children:"UserInfoRefreshJob"})," to keep the Users up to date with your .ldif file."]}),"\n",(0,n.jsx)(s.h2,{id:"configuration",children:"Configuration"}),"\n",(0,n.jsxs)(s.p,{children:["You can read more about the configuration of Users ",(0,n.jsx)(s.a,{href:"/kadai-doc/docs/user-guide/configuration/security#users",children:"here"}),"."]})]})}function h(e={}){const{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},8453:(e,s,r)=>{r.d(s,{R:()=>o,x:()=>a});var n=r(6540);const t={},i=n.createContext(t);function o(e){const s=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),n.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/dcf8ed49.d8dd7215.js b/assets/js/dcf8ed49.75279970.js similarity index 69% rename from assets/js/dcf8ed49.d8dd7215.js rename to assets/js/dcf8ed49.75279970.js index 214bb1d..0638973 100644 --- a/assets/js/dcf8ed49.d8dd7215.js +++ b/assets/js/dcf8ed49.75279970.js @@ -1 +1 @@ -"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[7048],{1975:(e,a,n)=>{n.r(a),n.d(a,{assets:()=>d,contentTitle:()=>o,default:()=>l,frontMatter:()=>r,metadata:()=>s,toc:()=>p});var t=n(4848),i=n(8453);const r={},o="Getting Started",s={id:"user-guide/adapter/gettingStarted",title:"Getting Started",description:"In this article, the set-up of the Adapter is explained step by step. Additionally, you can try out some of the functionalities of the Adapter following the instructions in this article.",source:"@site/docs/user-guide/adapter/gettingStarted.md",sourceDirName:"user-guide/adapter",slug:"/user-guide/adapter/gettingStarted",permalink:"/kadai-doc/docs/user-guide/adapter/gettingStarted",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{},sidebar:"userSidebar",previous:{title:"Adapter",permalink:"/kadai-doc/docs/category/adapter"},next:{title:"Demo App",permalink:"/kadai-doc/docs/demo-app/demoApp"}},d={},p=[{value:"What you'll need",id:"what-youll-need",level:2},{value:"Step 0 (optional): Initialize an empty Camunda application",id:"step-0-optional-initialize-an-empty-camunda-application",level:2},{value:"Step 1: Configure your Camunda application",id:"step-1-configure-your-camunda-application",level:2},{value:"kadai-outbox.properties",id:"kadai-outboxproperties",level:3},{value:"application.properties",id:"applicationproperties",level:3},{value:"application.yaml",id:"applicationyaml",level:3},{value:"Step 2: Initialize an empty Adapter application",id:"step-2-initialize-an-empty-adapter-application",level:2},{value:"Step 3: Configure your Adapter application",id:"step-3-configure-your-adapter-application",level:2},{value:"application.properties",id:"applicationproperties-1",level:3},{value:"kadai.properties",id:"kadaiproperties",level:3},{value:"Step 4: Add SPIs to your Adapter application",id:"step-4-add-spis-to-your-adapter-application",level:2},{value:"Step 5: Start all applications together",id:"step-5-start-all-applications-together",level:2},{value:"Step 6: Try out different functionalities of Adapter.",id:"step-6-try-out-different-functionalities-of-adapter",level:2}];function c(e){const a={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(a.header,{children:(0,t.jsx)(a.h1,{id:"getting-started",children:"Getting Started"})}),"\n",(0,t.jsx)(a.p,{children:"In this article, the set-up of the Adapter is explained step by step. Additionally, you can try out some of the functionalities of the Adapter following the instructions in this article."}),"\n",(0,t.jsx)(a.h2,{id:"what-youll-need",children:"What you'll need"}),"\n",(0,t.jsxs)(a.ul,{children:["\n",(0,t.jsx)(a.li,{children:"an IDE of your choice (preferably IntelliJ)"}),"\n",(0,t.jsx)(a.li,{children:"Java 17"}),"\n",(0,t.jsx)(a.li,{children:"maven"}),"\n",(0,t.jsx)(a.li,{children:"Camunda Modeler"}),"\n",(0,t.jsx)(a.li,{children:"Postgres or Docker (to set up postgres database)"}),"\n",(0,t.jsx)(a.li,{children:"optional: Postman (makes REST API requests easier)"}),"\n",(0,t.jsxs)(a.li,{children:["Working KADAI application (see ",(0,t.jsx)(a.a,{href:"/kadai-doc/docs/user-guide/getting-started/exampleSpringBoot",children:"here"})," for instructions)"]}),"\n"]}),"\n",(0,t.jsx)(a.p,{children:"Note: Please name your packages, folders and files exactly like in the example!"}),"\n",(0,t.jsx)(a.h2,{id:"step-0-optional-initialize-an-empty-camunda-application",children:"Step 0 (optional): Initialize an empty Camunda application"}),"\n",(0,t.jsxs)(a.p,{children:["If you don't have a Camunda application that you could use for experimenting with the Adapter, install a new application. You can use ",(0,t.jsx)(a.a,{href:"https://start.camunda.com/",children:"https://start.camunda.com/"}),' to initialize an empty application. You need to choose Java 17. Additionally, make sure that the modules "REST API", "Webapps" and "Spin" are chosen and set an admin username and password of your choice.']}),"\n",(0,t.jsx)(a.p,{children:(0,t.jsx)(a.img,{alt:"Local Image",src:n(5952).A+"",width:"1407",height:"1488"})}),"\n",(0,t.jsx)(a.p,{children:"Unpack the project in a folder of your choice and open it in your IDE."}),"\n",(0,t.jsx)(a.h2,{id:"step-1-configure-your-camunda-application",children:"Step 1: Configure your Camunda application"}),"\n",(0,t.jsx)(a.p,{children:'Add a new extension property to your User Tasks. The name of the property should be kadai.classification-key. It should have an existing classification key as value. If you are using the KADAI example application, you can enter "L1050" as value.'}),"\n",(0,t.jsx)(a.p,{children:"Add following dependencies to the dependencies section of your pom:"}),"\n",(0,t.jsx)(a.pre,{children:(0,t.jsx)(a.code,{children:"\n io.kadai\n kadai-adapter-camunda-outbox-rest-spring-boot-starter\n 9.0.0\n\n\n org.jboss.resteasy\n resteasy-servlet-spring-boot-starter\n 6.2.0.Final\n\n\n org.camunda.spin\n camunda-spin-dataformat-json-jackson\n\n\n org.postgresql\n postgresql\n\n"})}),"\n",(0,t.jsx)(a.p,{children:'You need to exclude the following from the org.camunda.bpm.springboot dependency with the artifact ID "camunda-bpm-spring-boot-starter-rest":'}),"\n",(0,t.jsx)(a.pre,{children:(0,t.jsx)(a.code,{children:"\n org.camunda.bpm.springboot\n camunda-bpm-spring-boot-starter-rest\n \n \n org.skyscreamer\n jsonassert\n \n \n\n"})}),"\n",(0,t.jsx)(a.p,{children:"Then, add a repository to the pom:"}),"\n",(0,t.jsx)(a.pre,{children:(0,t.jsx)(a.code,{children:"\n \n jboss-public-repository\n JBoss Repository\n https://repository.jboss.org/nexus/content/groups/public\n \n\n"})}),"\n",(0,t.jsx)(a.p,{children:'Add the following file to your "resources" folder:'}),"\n",(0,t.jsx)(a.h3,{id:"kadai-outboxproperties",children:"kadai-outbox.properties"}),"\n",(0,t.jsx)(a.pre,{children:(0,t.jsx)(a.code,{children:"kadai.adapter.outbox.schema = kadai_tables\nkadai.adapter.outbox.max.number.of.events = 57\nkadai.adapter.create_outbox_schema = true\nkadai.adapter.outbox.initial.number.of.task.creation.retries = 5\nkadai.adapter.outbox.duration.between.task.creation.retries = PT1H\n\n#kadai.adapter.outbox.datasource.jndi=java:jboss/datasources/ProcessEnginePostgres\n#kadai.adapter.outbox.datasource.jndi=jdbc/ProcessEngine\n\nkadai.adapter.outbox.datasource.driver=org.postgresql.Driver\nkadai.adapter.outbox.datasource.url=jdbc:postgresql://localhost:5102/postgres\nkadai.adapter.outbox.datasource.username=postgres\nkadai.adapter.outbox.datasource.password=postgres\n\n#kadai.adapter.outbox.datasource.url=jdbc:h2:mem:camunda;NON_KEYWORDS=KEY,VALUE;IGNORECASE=TRUE;LOCK_MODE=0;DB_CLOSE_ON_EXIT=FALSE;\n#kadai.adapter.outbox.datasource.driver=org.h2.Driver\n#kadai.adapter.outbox.datasource.username=sa\n#kadai.adapter.outbox.datasource.password=sa\n"})}),"\n",(0,t.jsxs)(a.p,{children:["You need to add at least one of the following ",(0,t.jsx)(a.code,{children:"application.properties"})," or ",(0,t.jsx)(a.code,{children:"application.yaml"})," given below:"]}),"\n",(0,t.jsx)(a.h3,{id:"applicationproperties",children:"application.properties"}),"\n",(0,t.jsx)(a.pre,{children:(0,t.jsx)(a.code,{children:"server.port=8085\nspring.main.allow-bean-definition-overriding=true\ncamunda.bpm.auto-deployment-enabled=true\n\nserver.servlet.context-path=/example-context-root\ncamunda.bpm.admin-user.id=admin\ncamunda.bpm.admin-user.first-name=admin\ncamunda.bpm.admin-user.password=admin\ncamunda.bpm.admin-user.last-name=admin\n\ncamunda.bpm.database.type=postgres\n\n# new mandatory field starting from camunda version 7.20\n# see https://forum.camunda.io/t/camunda-7-20-history-time-to-live-cannot-be-null-cannot-deploy-wf-created-in-7-18/48159\ncamunda.bpm.generic-properties.properties.historyTimeToLive: P180D\n\n# properties for resteasy-servlet-spring-boot-starter\n# without these 2 propertiers the camunda-context is registered twice\nresteasy.jaxrs.app.registration=property\nresteasy.jaxrs.app.classes=io.kadai.adapter.camunda.outbox.rest.config.OutboxRestServiceConfig\n\nspring.datasource.url=jdbc:postgresql://localhost:5102/postgres\nspring.datasource.driver-class-name = org.postgresql.Driver\nspring.datasource.username = postgres\nspring.datasource.password = postgres\n\n#spring.datasource.url=jdbc:h2:mem:camunda;NON_KEYWORDS=KEY,VALUE;IGNORECASE=TRUE;DB_CLOSE_ON_EXIT=FALSE;\n#spring.datasource.driverClassName=org.h2.Driver\n#spring.datasource.username=sa\n#spring.datasource.password=sa\n\n"})}),"\n",(0,t.jsx)(a.h3,{id:"applicationyaml",children:"application.yaml"}),"\n",(0,t.jsx)(a.pre,{children:(0,t.jsx)(a.code,{children:"camunda:\n bpm:\n admin-user:\n first-name: admin\n id: admin\n last-name: admin\n password: admin\n auto-deployment-enabled: true\n database:\n type: postgres\n generic-properties:\n properties:\n historyTimeToLive: P180D\nresteasy:\n jaxrs:\n app:\n classes: io.kadai.adapter.camunda.outbox.rest.config.OutboxRestServiceConfig\n registration: property\nserver:\n port: 8085\n servlet:\n context-path: /example-context-root\nspring:\n datasource:\n driver-class-name: org.postgresql.Driver\n password: postgres\n url: jdbc:postgresql://localhost:5102/postgres\n username: postgres\n main:\n allow-bean-definition-overriding: true\n"})}),"\n",(0,t.jsx)(a.p,{children:"Start the camunda application and check if it runs correctly.\nClose the camunda application after checking."}),"\n",(0,t.jsx)(a.h2,{id:"step-2-initialize-an-empty-adapter-application",children:"Step 2: Initialize an empty Adapter application"}),"\n",(0,t.jsxs)(a.p,{children:["Use the ",(0,t.jsx)(a.a,{href:"https://start.spring.io/",children:"Spring Initializer"})," to initialize a Spring Boot Project. Chose Java 17."]}),"\n",(0,t.jsx)(a.p,{children:(0,t.jsx)(a.img,{alt:"Local Image",src:n(8467).A+"",width:"3357",height:"1848"})}),"\n",(0,t.jsx)(a.p,{children:"Unpack the project in a folder of your choice and open it in your IDE."}),"\n",(0,t.jsx)(a.h2,{id:"step-3-configure-your-adapter-application",children:"Step 3: Configure your Adapter application"}),"\n",(0,t.jsx)(a.p,{children:"Add following dependencies to the dependencies section of your pom (if they don't already exist):"}),"\n",(0,t.jsx)(a.pre,{children:(0,t.jsx)(a.code,{children:"\n \n org.springframework.boot\n spring-boot-starter-web\n \n \n org.springframework.boot\n spring-boot-configuration-processor\n true\n \n \n io.kadai\n kadai-adapter\n 9.0.0\n \n \n io.kadai\n kadai-adapter-camunda-system-connector\n 9.0.0\n \n \n io.kadai\n kadai-adapter-kadai-connector\n 9.0.0\n \n \n com.ibm.db2\n jcc\n \n \n org.postgresql\n postgresql\n \n \n com.h2database\n h2\n \n\n"})}),"\n",(0,t.jsx)(a.p,{children:"Add the following annotations to your AdapterApplication, and import the packages correspondingly:"}),"\n",(0,t.jsx)(a.pre,{children:(0,t.jsx)(a.code,{children:'@EnableScheduling\n@ComponentScan(basePackages = "io.kadai.adapter")\n@Import({AdapterConfiguration.class})\n'})}),"\n",(0,t.jsx)(a.p,{children:"Add following files to your resources folder:"}),"\n",(0,t.jsx)(a.h3,{id:"applicationproperties-1",children:"application.properties"}),"\n",(0,t.jsx)(a.pre,{children:(0,t.jsx)(a.code,{children:"######################################################################################\n## Adapter properties\n######################################################################################\n##\n#logging.level.org.springframework=DEBUG\nlogging.level.io.kadai=DEBUG\n#logging.level.com.spring.ibatis=DEBUG\n#logging.level.com.spring.ibatis.*=DEBUG\n#logging.level.org.apache.ibatis=DEBUG\n\n#logging.level.io.kadai=info\n\n## Set Server Port for Adapter\nserver.port = 8083\nspring.main.allow-bean-definition-overriding=true\n\nkadai.adapter.run-as.user=taskadmin\nkadai.adapter.scheduler.run.interval.for.start.kadai.tasks.in.milliseconds=10000\nkadai.adapter.scheduler.run.interval.for.complete.referenced.tasks.in.milliseconds=10000\nkadai.adapter.scheduler.run.interval.for.claim.referenced.tasks.in.milliseconds=10000\nkadai.adapter.scheduler.run.interval.for.cancel.claim.referenced.tasks.in.milliseconds=10000\nkadai.adapter.scheduler.run.interval.for.check.finished.referenced.tasks.in.milliseconds=10000\n\nkadai-system-connector-camunda-rest-api-user-name=admin\nkadai-system-connector-camunda-rest-api-user-password=admin\nkadai-system-connector-outbox-rest-api-user-name=admin\nkadai-system-connector-outbox-rest-api-user-password=admin\n####################################################################################\n# System connector properties\n####################################################################################\n#\n# Set URLs of Camunda REST API and associated KADAI Outbox REST API. The format is\n# | , ..., | \n\nkadai-system-connector-camundaSystemURLs=http://localhost:8085/example-context-root/engine-rest | http://localhost:8085/example-context-root/outbox-rest\n\n####################################################################################\n# Kadai-connector properties\n####################################################################################\n#\n# Configure the datasource for Kadai DB (used by kadai-connector)\n#kadai.datasource.jdbcUrl = jdbc:h2:tcp://localhost:9095/mem:kadai;NON_KEYWORDS=KEY,VALUE;IGNORECASE=TRUE;LOCK_MODE=0;\n#kadai.datasource.jdbcUrl=jdbc:h2:mem:kadai;NON_KEYWORDS=KEY,VALUE;IGNORECASE=TRUE;LOCK_MODE=0;DB_CLOSE_ON_EXIT=FALSE\n#kadai.datasource.driverClassName = org.h2.Driver\n#kadai.datasource.username = sa\n#kadai.datasource.password = sa\nkadai.schemaName=kadai\n#\n# kadai.datasource.jdbcUrl=jdbc:db2://localhost:50050/kadai\n# kadai.datasource.driverClassName=com.ibm.db2.jcc.DB2Driver\n# kadai.datasource.username=db2user\n# kadai.datasource.password=Db2password\n\nkadai.datasource.jdbcUrl=jdbc:postgresql://localhost:5102/postgres\nkadai.datasource.driverClassName=org.postgresql.Driver\nkadai.datasource.username=postgres\nkadai.datasource.password=postgres\n#kadai.schemaName=kadai\n\nkadai.adapter.mapping.default.objectreference.company=DEFAULT_COMPANY\nkadai.adapter.mapping.default.objectreference.system=DEFAULT_SYSTEM\nkadai.adapter.mapping.default.objectreference.system.instance=DEFAULT_SYSTEM_INSTANCE\nkadai.adapter.mapping.default.objectreference.type=DEFAULT_TYPE\nkadai.adapter.mapping.default.objectreference.value=DEFAULT_VALUE\n\n"})}),"\n",(0,t.jsx)(a.h3,{id:"kadaiproperties",children:"kadai.properties"}),"\n",(0,t.jsx)(a.pre,{children:(0,t.jsx)(a.code,{children:"kadai.roles.user=group1 | group2|teamlead-1 |teamlead-2 |user-1-1| user-1-1| user-1-2| user-2-1| user-2-2| max|elena|simone\nkadai.roles.Admin=name=konrad,Organisation=novatec|admin\nkadai.roles.business_admin=max|Moritz|businessadmin\nkadai.roles.task_admin=peter | taskadmin\nkadai.roles.monitor=john|teamlead_2 | monitor\nkadai.domains=DOMAIN_A|DOMAIN_B|DOMAIN_C\nkadai.classification.types=TASK|DOCUMENT\nkadai.classification.categories.task=EXTERNAL| manual| autoMAtic| Process\nkadai.classification.categories.document=EXTERNAL\nkadai.jobs.enabled=false\n"})}),"\n",(0,t.jsx)(a.h2,{id:"step-4-add-spis-to-your-adapter-application",children:"Step 4: Add SPIs to your Adapter application"}),"\n",(0,t.jsxs)(a.p,{children:["SPIs need to be additionally specified in the Adapter application. You can read more about SPIs ",(0,t.jsx)(a.a,{href:"/kadai-doc/docs/user-guide/features/howToUseServiceProviderInterfaces",children:"here"}),".\nThe necessary SPI for the Adapter application can be built as follows: First, create a new package with the name ",(0,t.jsx)(a.code,{children:"taskrouting"}),". Then, create a class in the package ",(0,t.jsx)(a.code,{children:"taskrouting"})," with the name ExampleTaskRouter. It should look like this:"]}),"\n",(0,t.jsx)(a.pre,{children:(0,t.jsx)(a.code,{children:'package com.example.demo.taskrouting; //or your own path depending on your packages\nimport io.kadai.common.api.KadaiEngine;\nimport io.kadai.spi.routing.api.TaskRoutingProvider;\nimport io.kadai.task.api.models.Task;\n\n/** This is a sample implementation of TaskRouter. */\npublic class ExampleTaskRouter implements TaskRoutingProvider {\n\n @Override\n public void initialize(KadaiEngine kadaiEngine) {\n // no-op\n }\n\n @Override\n public String determineWorkbasketId(Task task) {\n return "WBI:100000000000000000000000000000000001";\n }\n}\n'})}),"\n",(0,t.jsxs)(a.p,{children:["Next, add a new folder to your resources folder and name it ",(0,t.jsx)(a.code,{children:"META-INF"}),". Create a new folder named ",(0,t.jsx)(a.code,{children:"services"})," in the folder ",(0,t.jsx)(a.code,{children:"META-INF"}),", so that services is a subfolder of ",(0,t.jsx)(a.code,{children:"META-INF"}),". Finally, create a file in the ",(0,t.jsx)(a.code,{children:"services"})," folder with the name ",(0,t.jsx)(a.code,{children:"io.kadai.spi.routing.api.TaskRoutingProvider"}),". This file must contain the fully qualified classname (including the package) of the class ExampleTaskRouter, for example:"]}),"\n",(0,t.jsx)(a.pre,{children:(0,t.jsx)(a.code,{children:"com.example.demo.taskrouting.ExampleTaskRouter\n"})}),"\n",(0,t.jsx)(a.p,{children:"Make sure there aren't any empty lines in this file.\nThe finished structure of the source folder should look like this:"}),"\n",(0,t.jsx)(a.p,{children:(0,t.jsx)(a.img,{alt:"Local Image",src:n(2438).A+"",width:"1251",height:"933"})}),"\n",(0,t.jsx)(a.h2,{id:"step-5-start-all-applications-together",children:"Step 5: Start all applications together"}),"\n",(0,t.jsxs)(a.p,{children:["First, check if your postgres database is running. For example, start the container provided in the KADAI repository by executing ",(0,t.jsx)(a.code,{children:"bash ./docker-databases/prepare_db.sh POSTGRES_14 && exit"})," in a terminal."]}),"\n",(0,t.jsx)(a.p,{children:"Then, start your KADAI application. Start your camunda app next, and login. Last, start the adapter."}),"\n",(0,t.jsx)(a.h2,{id:"step-6-try-out-different-functionalities-of-adapter",children:"Step 6: Try out different functionalities of Adapter."}),"\n",(0,t.jsxs)(a.ol,{children:["\n",(0,t.jsxs)(a.li,{children:["\n",(0,t.jsx)(a.p,{children:'Start a process with a User Task in Camunda. The User Task should be imported to KADAI automatically. You can check it by first knowing the name of the user task from the started process, then make a postgres GET request to KADAI using the following request, entering the name (or just substring of the name) of the user task for the "name-like" attribute.'}),"\n",(0,t.jsx)(a.pre,{children:(0,t.jsx)(a.code,{children:"GET http://localhost:8080/kadai/api/v1/tasks?name-like=Say hello\n"})}),"\n",(0,t.jsxs)(a.p,{children:['Here we assume that the name of the user task is "Say hello to demo", but you can set the name differently by opening the ',(0,t.jsx)(a.code,{children:"process.bpmn"})," file in the camunda application and set the name attribute in ",(0,t.jsx)(a.code,{children:""}),"differently.\nMake sure that the correct port number is used for KADAI request. You can check the port number in ",(0,t.jsx)(a.code,{children:"application.properties"})," of KADAI under ",(0,t.jsx)(a.code,{children:"server.port"}),'. If not specified, then the default port is 8080. You have to authenticate yourself using Basic Auth: In Postman, go to the "Authorization" tab. There, select basicAuth and type "admin" as user and "admin" as password. Make sure enableCsrf is set to false in the properties of the KADAI application.']}),"\n",(0,t.jsx)(a.p,{children:"The output of the request in Postman should look like this:"}),"\n",(0,t.jsx)(a.p,{children:(0,t.jsx)(a.img,{alt:"Local Image",src:n(2672).A+"",width:"1920",height:"1019"})}),"\n"]}),"\n",(0,t.jsxs)(a.li,{children:["\n",(0,t.jsxs)(a.p,{children:["Claim the KADAI Task from the previous step using Postman. Make sure you add the following property to the ",(0,t.jsx)(a.code,{children:"application.properties"})," file of the adapter application: ",(0,t.jsx)(a.code,{children:"kadai.adapter.camunda.claiming.enabled=true"}),", then restart the adapter. To send the POST request, use the same authorization as in the previous step. The Task should get claimed in Camunda automatically."]}),"\n",(0,t.jsx)(a.pre,{children:(0,t.jsx)(a.code,{children:"POST http://localhost:8080/kadai/api/v1/tasks/{taskid}/claim\n"})}),"\n",(0,t.jsxs)(a.p,{children:["You can check that the task in KADAI is also claimed by making the same GET Request as in Step 1 and see the ",(0,t.jsx)(a.code,{children:"claimed"})," attribute."]}),"\n"]}),"\n",(0,t.jsxs)(a.li,{children:["\n",(0,t.jsx)(a.p,{children:"Complete the KADAI Task from the previous step using Postman. To send the POST request, use the same authorization as in the previous step. The Task should disappear from Camunda Tasklist."}),"\n",(0,t.jsx)(a.pre,{children:(0,t.jsx)(a.code,{children:"POST http://localhost:8080/kadai/api/v1/tasks/{taskid}/complete\n"})}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(a.p,{children:["More functionalities like the cancelling of a claimed task and their URLs can be found in the ",(0,t.jsx)(a.a,{href:"https://kadai-io.azurewebsites.net/kadai/swagger-ui/index.html",children:"full documentation of the REST-API"}),"."]})]})}function l(e={}){const{wrapper:a}={...(0,i.R)(),...e.components};return a?(0,t.jsx)(a,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},2438:(e,a,n)=>{n.d(a,{A:()=>t});const t=n.p+"assets/images/adapter-getting-started-project-structure-cb71d0e550090b7fb987bfd169d8a2bc.png"},8467:(e,a,n)=>{n.d(a,{A:()=>t});const t=n.p+"assets/images/adapter-initialization-54b523db9b07bfb30c1a961c825b3ad3.png"},5952:(e,a,n)=>{n.d(a,{A:()=>t});const t=n.p+"assets/images/camunda-initialization-8afbd82adc705e090b52fd8945d9e0b6.png"},2672:(e,a,n)=>{n.d(a,{A:()=>t});const t=n.p+"assets/images/show-tasks-57dd5257e2cb1b7edc6e6119f1556b93.png"},8453:(e,a,n)=>{n.d(a,{R:()=>o,x:()=>s});var t=n(6540);const i={},r=t.createContext(i);function o(e){const a=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(a):{...a,...e}}),[a,e])}function s(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),t.createElement(r.Provider,{value:a},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[7048],{3327:(e,a,n)=>{n.r(a),n.d(a,{assets:()=>d,contentTitle:()=>s,default:()=>l,frontMatter:()=>o,metadata:()=>t,toc:()=>p});const t=JSON.parse('{"id":"user-guide/adapter/gettingStarted","title":"Getting Started","description":"In this article, the set-up of the Adapter is explained step by step. Additionally, you can try out some of the functionalities of the Adapter following the instructions in this article.","source":"@site/docs/user-guide/adapter/gettingStarted.md","sourceDirName":"user-guide/adapter","slug":"/user-guide/adapter/gettingStarted","permalink":"/kadai-doc/docs/user-guide/adapter/gettingStarted","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{},"sidebar":"userSidebar","previous":{"title":"Adapter","permalink":"/kadai-doc/docs/category/adapter"},"next":{"title":"Demo App","permalink":"/kadai-doc/docs/demo-app/demoApp"}}');var i=n(4848),r=n(8453);const o={},s="Getting Started",d={},p=[{value:"What you'll need",id:"what-youll-need",level:2},{value:"Step 0 (optional): Initialize an empty Camunda application",id:"step-0-optional-initialize-an-empty-camunda-application",level:2},{value:"Step 1: Configure your Camunda application",id:"step-1-configure-your-camunda-application",level:2},{value:"kadai-outbox.properties",id:"kadai-outboxproperties",level:3},{value:"application.properties",id:"applicationproperties",level:3},{value:"application.yaml",id:"applicationyaml",level:3},{value:"Step 2: Initialize an empty Adapter application",id:"step-2-initialize-an-empty-adapter-application",level:2},{value:"Step 3: Configure your Adapter application",id:"step-3-configure-your-adapter-application",level:2},{value:"application.properties",id:"applicationproperties-1",level:3},{value:"kadai.properties",id:"kadaiproperties",level:3},{value:"Step 4: Add SPIs to your Adapter application",id:"step-4-add-spis-to-your-adapter-application",level:2},{value:"Step 5: Start all applications together",id:"step-5-start-all-applications-together",level:2},{value:"Step 6: Try out different functionalities of Adapter.",id:"step-6-try-out-different-functionalities-of-adapter",level:2}];function c(e){const a={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(a.header,{children:(0,i.jsx)(a.h1,{id:"getting-started",children:"Getting Started"})}),"\n",(0,i.jsx)(a.p,{children:"In this article, the set-up of the Adapter is explained step by step. Additionally, you can try out some of the functionalities of the Adapter following the instructions in this article."}),"\n",(0,i.jsx)(a.h2,{id:"what-youll-need",children:"What you'll need"}),"\n",(0,i.jsxs)(a.ul,{children:["\n",(0,i.jsx)(a.li,{children:"an IDE of your choice (preferably IntelliJ)"}),"\n",(0,i.jsx)(a.li,{children:"Java 17"}),"\n",(0,i.jsx)(a.li,{children:"maven"}),"\n",(0,i.jsx)(a.li,{children:"Camunda Modeler"}),"\n",(0,i.jsx)(a.li,{children:"Postgres or Docker (to set up postgres database)"}),"\n",(0,i.jsx)(a.li,{children:"optional: Postman (makes REST API requests easier)"}),"\n",(0,i.jsxs)(a.li,{children:["Working KADAI application (see ",(0,i.jsx)(a.a,{href:"/kadai-doc/docs/user-guide/getting-started/exampleSpringBoot",children:"here"})," for instructions)"]}),"\n"]}),"\n",(0,i.jsx)(a.p,{children:"Note: Please name your packages, folders and files exactly like in the example!"}),"\n",(0,i.jsx)(a.h2,{id:"step-0-optional-initialize-an-empty-camunda-application",children:"Step 0 (optional): Initialize an empty Camunda application"}),"\n",(0,i.jsxs)(a.p,{children:["If you don't have a Camunda application that you could use for experimenting with the Adapter, install a new application. You can use ",(0,i.jsx)(a.a,{href:"https://start.camunda.com/",children:"https://start.camunda.com/"}),' to initialize an empty application. You need to choose Java 17. Additionally, make sure that the modules "REST API", "Webapps" and "Spin" are chosen and set an admin username and password of your choice.']}),"\n",(0,i.jsx)(a.p,{children:(0,i.jsx)(a.img,{alt:"Local Image",src:n(5952).A+"",width:"1407",height:"1488"})}),"\n",(0,i.jsx)(a.p,{children:"Unpack the project in a folder of your choice and open it in your IDE."}),"\n",(0,i.jsx)(a.h2,{id:"step-1-configure-your-camunda-application",children:"Step 1: Configure your Camunda application"}),"\n",(0,i.jsx)(a.p,{children:'Add a new extension property to your User Tasks. The name of the property should be kadai.classification-key. It should have an existing classification key as value. If you are using the KADAI example application, you can enter "L1050" as value.'}),"\n",(0,i.jsx)(a.p,{children:"Add following dependencies to the dependencies section of your pom:"}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{children:"\n io.kadai\n kadai-adapter-camunda-outbox-rest-spring-boot-starter\n 9.0.0\n\n\n org.jboss.resteasy\n resteasy-servlet-spring-boot-starter\n 6.2.0.Final\n\n\n org.camunda.spin\n camunda-spin-dataformat-json-jackson\n\n\n org.postgresql\n postgresql\n\n"})}),"\n",(0,i.jsx)(a.p,{children:'You need to exclude the following from the org.camunda.bpm.springboot dependency with the artifact ID "camunda-bpm-spring-boot-starter-rest":'}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{children:"\n org.camunda.bpm.springboot\n camunda-bpm-spring-boot-starter-rest\n \n \n org.skyscreamer\n jsonassert\n \n \n\n"})}),"\n",(0,i.jsx)(a.p,{children:"Then, add a repository to the pom:"}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{children:"\n \n jboss-public-repository\n JBoss Repository\n https://repository.jboss.org/nexus/content/groups/public\n \n\n"})}),"\n",(0,i.jsx)(a.p,{children:'Add the following file to your "resources" folder:'}),"\n",(0,i.jsx)(a.h3,{id:"kadai-outboxproperties",children:"kadai-outbox.properties"}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{children:"kadai.adapter.outbox.schema = kadai_tables\nkadai.adapter.outbox.max.number.of.events = 57\nkadai.adapter.create_outbox_schema = true\nkadai.adapter.outbox.initial.number.of.task.creation.retries = 5\nkadai.adapter.outbox.duration.between.task.creation.retries = PT1H\n\n#kadai.adapter.outbox.datasource.jndi=java:jboss/datasources/ProcessEnginePostgres\n#kadai.adapter.outbox.datasource.jndi=jdbc/ProcessEngine\n\nkadai.adapter.outbox.datasource.driver=org.postgresql.Driver\nkadai.adapter.outbox.datasource.url=jdbc:postgresql://localhost:5102/postgres\nkadai.adapter.outbox.datasource.username=postgres\nkadai.adapter.outbox.datasource.password=postgres\n\n#kadai.adapter.outbox.datasource.url=jdbc:h2:mem:camunda;NON_KEYWORDS=KEY,VALUE;IGNORECASE=TRUE;LOCK_MODE=0;DB_CLOSE_ON_EXIT=FALSE;\n#kadai.adapter.outbox.datasource.driver=org.h2.Driver\n#kadai.adapter.outbox.datasource.username=sa\n#kadai.adapter.outbox.datasource.password=sa\n"})}),"\n",(0,i.jsxs)(a.p,{children:["You need to add at least one of the following ",(0,i.jsx)(a.code,{children:"application.properties"})," or ",(0,i.jsx)(a.code,{children:"application.yaml"})," given below:"]}),"\n",(0,i.jsx)(a.h3,{id:"applicationproperties",children:"application.properties"}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{children:"server.port=8085\nspring.main.allow-bean-definition-overriding=true\ncamunda.bpm.auto-deployment-enabled=true\n\nserver.servlet.context-path=/example-context-root\ncamunda.bpm.admin-user.id=admin\ncamunda.bpm.admin-user.first-name=admin\ncamunda.bpm.admin-user.password=admin\ncamunda.bpm.admin-user.last-name=admin\n\ncamunda.bpm.database.type=postgres\n\n# new mandatory field starting from camunda version 7.20\n# see https://forum.camunda.io/t/camunda-7-20-history-time-to-live-cannot-be-null-cannot-deploy-wf-created-in-7-18/48159\ncamunda.bpm.generic-properties.properties.historyTimeToLive: P180D\n\n# properties for resteasy-servlet-spring-boot-starter\n# without these 2 propertiers the camunda-context is registered twice\nresteasy.jaxrs.app.registration=property\nresteasy.jaxrs.app.classes=io.kadai.adapter.camunda.outbox.rest.config.OutboxRestServiceConfig\n\nspring.datasource.url=jdbc:postgresql://localhost:5102/postgres\nspring.datasource.driver-class-name = org.postgresql.Driver\nspring.datasource.username = postgres\nspring.datasource.password = postgres\n\n#spring.datasource.url=jdbc:h2:mem:camunda;NON_KEYWORDS=KEY,VALUE;IGNORECASE=TRUE;DB_CLOSE_ON_EXIT=FALSE;\n#spring.datasource.driverClassName=org.h2.Driver\n#spring.datasource.username=sa\n#spring.datasource.password=sa\n\n"})}),"\n",(0,i.jsx)(a.h3,{id:"applicationyaml",children:"application.yaml"}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{children:"camunda:\n bpm:\n admin-user:\n first-name: admin\n id: admin\n last-name: admin\n password: admin\n auto-deployment-enabled: true\n database:\n type: postgres\n generic-properties:\n properties:\n historyTimeToLive: P180D\nresteasy:\n jaxrs:\n app:\n classes: io.kadai.adapter.camunda.outbox.rest.config.OutboxRestServiceConfig\n registration: property\nserver:\n port: 8085\n servlet:\n context-path: /example-context-root\nspring:\n datasource:\n driver-class-name: org.postgresql.Driver\n password: postgres\n url: jdbc:postgresql://localhost:5102/postgres\n username: postgres\n main:\n allow-bean-definition-overriding: true\n"})}),"\n",(0,i.jsx)(a.p,{children:"Start the camunda application and check if it runs correctly.\nClose the camunda application after checking."}),"\n",(0,i.jsx)(a.h2,{id:"step-2-initialize-an-empty-adapter-application",children:"Step 2: Initialize an empty Adapter application"}),"\n",(0,i.jsxs)(a.p,{children:["Use the ",(0,i.jsx)(a.a,{href:"https://start.spring.io/",children:"Spring Initializer"})," to initialize a Spring Boot Project. Chose Java 17."]}),"\n",(0,i.jsx)(a.p,{children:(0,i.jsx)(a.img,{alt:"Local Image",src:n(8467).A+"",width:"3357",height:"1848"})}),"\n",(0,i.jsx)(a.p,{children:"Unpack the project in a folder of your choice and open it in your IDE."}),"\n",(0,i.jsx)(a.h2,{id:"step-3-configure-your-adapter-application",children:"Step 3: Configure your Adapter application"}),"\n",(0,i.jsx)(a.p,{children:"Add following dependencies to the dependencies section of your pom (if they don't already exist):"}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{children:"\n \n org.springframework.boot\n spring-boot-starter-web\n \n \n org.springframework.boot\n spring-boot-configuration-processor\n true\n \n \n io.kadai\n kadai-adapter\n 9.0.0\n \n \n io.kadai\n kadai-adapter-camunda-system-connector\n 9.0.0\n \n \n io.kadai\n kadai-adapter-kadai-connector\n 9.0.0\n \n \n com.ibm.db2\n jcc\n \n \n org.postgresql\n postgresql\n \n \n com.h2database\n h2\n \n\n"})}),"\n",(0,i.jsx)(a.p,{children:"Add the following annotations to your AdapterApplication, and import the packages correspondingly:"}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{children:'@EnableScheduling\n@ComponentScan(basePackages = "io.kadai.adapter")\n@Import({AdapterConfiguration.class})\n'})}),"\n",(0,i.jsx)(a.p,{children:"Add following files to your resources folder:"}),"\n",(0,i.jsx)(a.h3,{id:"applicationproperties-1",children:"application.properties"}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{children:"######################################################################################\n## Adapter properties\n######################################################################################\n##\n#logging.level.org.springframework=DEBUG\nlogging.level.io.kadai=DEBUG\n#logging.level.com.spring.ibatis=DEBUG\n#logging.level.com.spring.ibatis.*=DEBUG\n#logging.level.org.apache.ibatis=DEBUG\n\n#logging.level.io.kadai=info\n\n## Set Server Port for Adapter\nserver.port = 8083\nspring.main.allow-bean-definition-overriding=true\n\nkadai.adapter.run-as.user=taskadmin\nkadai.adapter.scheduler.run.interval.for.start.kadai.tasks.in.milliseconds=10000\nkadai.adapter.scheduler.run.interval.for.complete.referenced.tasks.in.milliseconds=10000\nkadai.adapter.scheduler.run.interval.for.claim.referenced.tasks.in.milliseconds=10000\nkadai.adapter.scheduler.run.interval.for.cancel.claim.referenced.tasks.in.milliseconds=10000\nkadai.adapter.scheduler.run.interval.for.check.finished.referenced.tasks.in.milliseconds=10000\n\nkadai-system-connector-camunda-rest-api-user-name=admin\nkadai-system-connector-camunda-rest-api-user-password=admin\nkadai-system-connector-outbox-rest-api-user-name=admin\nkadai-system-connector-outbox-rest-api-user-password=admin\n####################################################################################\n# System connector properties\n####################################################################################\n#\n# Set URLs of Camunda REST API and associated KADAI Outbox REST API. The format is\n# | , ..., | \n\nkadai-system-connector-camundaSystemURLs=http://localhost:8085/example-context-root/engine-rest | http://localhost:8085/example-context-root/outbox-rest\n\n####################################################################################\n# Kadai-connector properties\n####################################################################################\n#\n# Configure the datasource for Kadai DB (used by kadai-connector)\n#kadai.datasource.jdbcUrl = jdbc:h2:tcp://localhost:9095/mem:kadai;NON_KEYWORDS=KEY,VALUE;IGNORECASE=TRUE;LOCK_MODE=0;\n#kadai.datasource.jdbcUrl=jdbc:h2:mem:kadai;NON_KEYWORDS=KEY,VALUE;IGNORECASE=TRUE;LOCK_MODE=0;DB_CLOSE_ON_EXIT=FALSE\n#kadai.datasource.driverClassName = org.h2.Driver\n#kadai.datasource.username = sa\n#kadai.datasource.password = sa\nkadai.schemaName=kadai\n#\n# kadai.datasource.jdbcUrl=jdbc:db2://localhost:50050/kadai\n# kadai.datasource.driverClassName=com.ibm.db2.jcc.DB2Driver\n# kadai.datasource.username=db2user\n# kadai.datasource.password=Db2password\n\nkadai.datasource.jdbcUrl=jdbc:postgresql://localhost:5102/postgres\nkadai.datasource.driverClassName=org.postgresql.Driver\nkadai.datasource.username=postgres\nkadai.datasource.password=postgres\n#kadai.schemaName=kadai\n\nkadai.adapter.mapping.default.objectreference.company=DEFAULT_COMPANY\nkadai.adapter.mapping.default.objectreference.system=DEFAULT_SYSTEM\nkadai.adapter.mapping.default.objectreference.system.instance=DEFAULT_SYSTEM_INSTANCE\nkadai.adapter.mapping.default.objectreference.type=DEFAULT_TYPE\nkadai.adapter.mapping.default.objectreference.value=DEFAULT_VALUE\n\n"})}),"\n",(0,i.jsx)(a.h3,{id:"kadaiproperties",children:"kadai.properties"}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{children:"kadai.roles.user=group1 | group2|teamlead-1 |teamlead-2 |user-1-1| user-1-1| user-1-2| user-2-1| user-2-2| max|elena|simone\nkadai.roles.Admin=name=konrad,Organisation=novatec|admin\nkadai.roles.business_admin=max|Moritz|businessadmin\nkadai.roles.task_admin=peter | taskadmin\nkadai.roles.monitor=john|teamlead_2 | monitor\nkadai.domains=DOMAIN_A|DOMAIN_B|DOMAIN_C\nkadai.classification.types=TASK|DOCUMENT\nkadai.classification.categories.task=EXTERNAL| manual| autoMAtic| Process\nkadai.classification.categories.document=EXTERNAL\nkadai.jobs.enabled=false\n"})}),"\n",(0,i.jsx)(a.h2,{id:"step-4-add-spis-to-your-adapter-application",children:"Step 4: Add SPIs to your Adapter application"}),"\n",(0,i.jsxs)(a.p,{children:["SPIs need to be additionally specified in the Adapter application. You can read more about SPIs ",(0,i.jsx)(a.a,{href:"/kadai-doc/docs/user-guide/features/howToUseServiceProviderInterfaces",children:"here"}),".\nThe necessary SPI for the Adapter application can be built as follows: First, create a new package with the name ",(0,i.jsx)(a.code,{children:"taskrouting"}),". Then, create a class in the package ",(0,i.jsx)(a.code,{children:"taskrouting"})," with the name ExampleTaskRouter. It should look like this:"]}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{children:'package com.example.demo.taskrouting; //or your own path depending on your packages\nimport io.kadai.common.api.KadaiEngine;\nimport io.kadai.spi.routing.api.TaskRoutingProvider;\nimport io.kadai.task.api.models.Task;\n\n/** This is a sample implementation of TaskRouter. */\npublic class ExampleTaskRouter implements TaskRoutingProvider {\n\n @Override\n public void initialize(KadaiEngine kadaiEngine) {\n // no-op\n }\n\n @Override\n public String determineWorkbasketId(Task task) {\n return "WBI:100000000000000000000000000000000001";\n }\n}\n'})}),"\n",(0,i.jsxs)(a.p,{children:["Next, add a new folder to your resources folder and name it ",(0,i.jsx)(a.code,{children:"META-INF"}),". Create a new folder named ",(0,i.jsx)(a.code,{children:"services"})," in the folder ",(0,i.jsx)(a.code,{children:"META-INF"}),", so that services is a subfolder of ",(0,i.jsx)(a.code,{children:"META-INF"}),". Finally, create a file in the ",(0,i.jsx)(a.code,{children:"services"})," folder with the name ",(0,i.jsx)(a.code,{children:"io.kadai.spi.routing.api.TaskRoutingProvider"}),". This file must contain the fully qualified classname (including the package) of the class ExampleTaskRouter, for example:"]}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{children:"com.example.demo.taskrouting.ExampleTaskRouter\n"})}),"\n",(0,i.jsx)(a.p,{children:"Make sure there aren't any empty lines in this file.\nThe finished structure of the source folder should look like this:"}),"\n",(0,i.jsx)(a.p,{children:(0,i.jsx)(a.img,{alt:"Local Image",src:n(2438).A+"",width:"1251",height:"933"})}),"\n",(0,i.jsx)(a.h2,{id:"step-5-start-all-applications-together",children:"Step 5: Start all applications together"}),"\n",(0,i.jsxs)(a.p,{children:["First, check if your postgres database is running. For example, start the container provided in the KADAI repository by executing ",(0,i.jsx)(a.code,{children:"bash ./docker-databases/prepare_db.sh POSTGRES_14 && exit"})," in a terminal."]}),"\n",(0,i.jsx)(a.p,{children:"Then, start your KADAI application. Start your camunda app next, and login. Last, start the adapter."}),"\n",(0,i.jsx)(a.h2,{id:"step-6-try-out-different-functionalities-of-adapter",children:"Step 6: Try out different functionalities of Adapter."}),"\n",(0,i.jsxs)(a.ol,{children:["\n",(0,i.jsxs)(a.li,{children:["\n",(0,i.jsx)(a.p,{children:'Start a process with a User Task in Camunda. The User Task should be imported to KADAI automatically. You can check it by first knowing the name of the user task from the started process, then make a postgres GET request to KADAI using the following request, entering the name (or just substring of the name) of the user task for the "name-like" attribute.'}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{children:"GET http://localhost:8080/kadai/api/v1/tasks?name-like=Say hello\n"})}),"\n",(0,i.jsxs)(a.p,{children:['Here we assume that the name of the user task is "Say hello to demo", but you can set the name differently by opening the ',(0,i.jsx)(a.code,{children:"process.bpmn"})," file in the camunda application and set the name attribute in ",(0,i.jsx)(a.code,{children:""}),"differently.\nMake sure that the correct port number is used for KADAI request. You can check the port number in ",(0,i.jsx)(a.code,{children:"application.properties"})," of KADAI under ",(0,i.jsx)(a.code,{children:"server.port"}),'. If not specified, then the default port is 8080. You have to authenticate yourself using Basic Auth: In Postman, go to the "Authorization" tab. There, select basicAuth and type "admin" as user and "admin" as password. Make sure enableCsrf is set to false in the properties of the KADAI application.']}),"\n",(0,i.jsx)(a.p,{children:"The output of the request in Postman should look like this:"}),"\n",(0,i.jsx)(a.p,{children:(0,i.jsx)(a.img,{alt:"Local Image",src:n(2672).A+"",width:"1920",height:"1019"})}),"\n"]}),"\n",(0,i.jsxs)(a.li,{children:["\n",(0,i.jsxs)(a.p,{children:["Claim the KADAI Task from the previous step using Postman. Make sure you add the following property to the ",(0,i.jsx)(a.code,{children:"application.properties"})," file of the adapter application: ",(0,i.jsx)(a.code,{children:"kadai.adapter.camunda.claiming.enabled=true"}),", then restart the adapter. To send the POST request, use the same authorization as in the previous step. The Task should get claimed in Camunda automatically."]}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{children:"POST http://localhost:8080/kadai/api/v1/tasks/{taskid}/claim\n"})}),"\n",(0,i.jsxs)(a.p,{children:["You can check that the task in KADAI is also claimed by making the same GET Request as in Step 1 and see the ",(0,i.jsx)(a.code,{children:"claimed"})," attribute."]}),"\n"]}),"\n",(0,i.jsxs)(a.li,{children:["\n",(0,i.jsx)(a.p,{children:"Complete the KADAI Task from the previous step using Postman. To send the POST request, use the same authorization as in the previous step. The Task should disappear from Camunda Tasklist."}),"\n",(0,i.jsx)(a.pre,{children:(0,i.jsx)(a.code,{children:"POST http://localhost:8080/kadai/api/v1/tasks/{taskid}/complete\n"})}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(a.p,{children:["More functionalities like the cancelling of a claimed task and their URLs can be found in the ",(0,i.jsx)(a.a,{href:"https://kadai-io.azurewebsites.net/kadai/swagger-ui/index.html",children:"full documentation of the REST-API"}),"."]})]})}function l(e={}){const{wrapper:a}={...(0,r.R)(),...e.components};return a?(0,i.jsx)(a,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},2438:(e,a,n)=>{n.d(a,{A:()=>t});const t=n.p+"assets/images/adapter-getting-started-project-structure-cb71d0e550090b7fb987bfd169d8a2bc.png"},8467:(e,a,n)=>{n.d(a,{A:()=>t});const t=n.p+"assets/images/adapter-initialization-54b523db9b07bfb30c1a961c825b3ad3.png"},5952:(e,a,n)=>{n.d(a,{A:()=>t});const t=n.p+"assets/images/camunda-initialization-8afbd82adc705e090b52fd8945d9e0b6.png"},2672:(e,a,n)=>{n.d(a,{A:()=>t});const t=n.p+"assets/images/show-tasks-57dd5257e2cb1b7edc6e6119f1556b93.png"},8453:(e,a,n)=>{n.d(a,{R:()=>o,x:()=>s});var t=n(6540);const i={},r=t.createContext(i);function o(e){const a=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(a):{...a,...e}}),[a,e])}function s(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),t.createElement(r.Provider,{value:a},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e5931ac3.140d1122.js b/assets/js/e5931ac3.140d1122.js deleted file mode 100644 index fa38cfe..0000000 --- a/assets/js/e5931ac3.140d1122.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[2841],{513:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>i,contentTitle:()=>a,default:()=>l,frontMatter:()=>c,metadata:()=>r,toc:()=>u});var o=n(4848),s=n(8453);const c={sidebar_position:1},a="Contact Us",r={id:"contact-us/contactUs",title:"Contact Us",description:"Do you have any questions about KADAI? Do you have a suggestion for improvement? Please use the contact information below to contact us.",source:"@site/docs/contact-us/contactUs.md",sourceDirName:"contact-us",slug:"/contact-us/contactUs",permalink:"/kadai-doc/docs/contact-us/contactUs",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"communitySidebar"},i={},u=[];function d(t){const e={a:"a",blockquote:"blockquote",br:"br",h1:"h1",header:"header",p:"p",...(0,s.R)(),...t.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(e.header,{children:(0,o.jsx)(e.h1,{id:"contact-us",children:"Contact Us"})}),"\n",(0,o.jsx)(e.p,{children:"Do you have any questions about KADAI? Do you have a suggestion for improvement? Please use the contact information below to contact us."}),"\n",(0,o.jsxs)(e.blockquote,{children:["\n",(0,o.jsxs)(e.p,{children:["Name: Holger Hagen",(0,o.jsx)(e.br,{}),"\n","E-mail: ",(0,o.jsx)(e.a,{href:"mailto:holger.hagen@envite.de",children:"holger.hagen@envite.de"})]}),"\n"]})]})}function l(t={}){const{wrapper:e}={...(0,s.R)(),...t.components};return e?(0,o.jsx)(e,{...t,children:(0,o.jsx)(d,{...t})}):d(t)}},8453:(t,e,n)=>{n.d(e,{R:()=>a,x:()=>r});var o=n(6540);const s={},c=o.createContext(s);function a(t){const e=o.useContext(c);return o.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function r(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(s):t.components||s:a(t.components),o.createElement(c.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/e5931ac3.336abed3.js b/assets/js/e5931ac3.336abed3.js new file mode 100644 index 0000000..82bc7b1 --- /dev/null +++ b/assets/js/e5931ac3.336abed3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[2841],{9420:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>i,contentTitle:()=>r,default:()=>d,frontMatter:()=>c,metadata:()=>o,toc:()=>u});const o=JSON.parse('{"id":"contact-us/contactUs","title":"Contact Us","description":"Do you have any questions about KADAI? Do you have a suggestion for improvement? Please use the contact information below to contact us.","source":"@site/docs/contact-us/contactUs.md","sourceDirName":"contact-us","slug":"/contact-us/contactUs","permalink":"/kadai-doc/docs/contact-us/contactUs","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1},"sidebar":"communitySidebar"}');var s=n(4848),a=n(8453);const c={sidebar_position:1},r="Contact Us",i={},u=[];function l(t){const e={a:"a",blockquote:"blockquote",br:"br",h1:"h1",header:"header",p:"p",...(0,a.R)(),...t.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(e.header,{children:(0,s.jsx)(e.h1,{id:"contact-us",children:"Contact Us"})}),"\n",(0,s.jsx)(e.p,{children:"Do you have any questions about KADAI? Do you have a suggestion for improvement? Please use the contact information below to contact us."}),"\n",(0,s.jsxs)(e.blockquote,{children:["\n",(0,s.jsxs)(e.p,{children:["Name: Holger Hagen",(0,s.jsx)(e.br,{}),"\n","E-mail: ",(0,s.jsx)(e.a,{href:"mailto:holger.hagen@envite.de",children:"holger.hagen@envite.de"})]}),"\n"]})]})}function d(t={}){const{wrapper:e}={...(0,a.R)(),...t.components};return e?(0,s.jsx)(e,{...t,children:(0,s.jsx)(l,{...t})}):l(t)}},8453:(t,e,n)=>{n.d(e,{R:()=>c,x:()=>r});var o=n(6540);const s={},a=o.createContext(s);function c(t){const e=o.useContext(a);return o.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function r(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(s):t.components||s:c(t.components),o.createElement(a.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/ef1c3cd1.ea7c3c31.js b/assets/js/ef1c3cd1.ea7c3c31.js deleted file mode 100644 index 2a8910d..0000000 --- a/assets/js/ef1c3cd1.ea7c3c31.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[4529],{4919:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>c,contentTitle:()=>n,default:()=>p,frontMatter:()=>r,metadata:()=>o,toc:()=>d});var s=t(4848),a=t(8453);const r={sidebar_position:4},n="Classification and ServiceLevel",o={id:"user-guide/configuration/classificationAndServiceLevel",title:"Classification and ServiceLevel",description:'The configuration of these parameters is in the file `kadai.properties`. Some parameters allow multiple values specified as a list. In this case, individual values are separated by a configurable separator. Use the propertiesSeparator parameter to specify it. If none is provided, the default is "|". If you specify a propertiesSeparator, no list item in the properties file can contain any character from the propertiesSeparator.',source:"@site/docs/user-guide/configuration/classificationAndServiceLevel.md",sourceDirName:"user-guide/configuration",slug:"/user-guide/configuration/classificationAndServiceLevel",permalink:"/kadai-doc/docs/user-guide/configuration/classificationAndServiceLevel",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:4,frontMatter:{sidebar_position:4},sidebar:"userSidebar",previous:{title:"LDAP",permalink:"/kadai-doc/docs/user-guide/configuration/ldap"},next:{title:"KADAI-jobs",permalink:"/kadai-doc/docs/user-guide/configuration/kadaiJobs"}},c={},d=[];function l(e){const i={code:"code",em:"em",h1:"h1",header:"header",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.header,{children:(0,s.jsx)(i.h1,{id:"classification-and-servicelevel",children:"Classification and ServiceLevel"})}),"\n",(0,s.jsxs)(i.p,{children:["The configuration of these parameters is in the file ",(0,s.jsx)(i.code,{children:"kadai.properties"}),". Some parameters allow multiple values specified as a list. In this case, individual values are separated by a configurable separator. Use the ",(0,s.jsx)(i.em,{children:"propertiesSeparator"}),' parameter to specify it. If none is provided, the default is "|". If you specify a propertiesSeparator, no list item in the properties file can contain any character from the propertiesSeparator.']}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Parameter"}),(0,s.jsx)(i.th,{children:"Description"}),(0,s.jsx)(i.th,{children:"Sample Value"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"kadai.domains"}),(0,s.jsx)(i.td,{children:"A list of domains for Classifications and Workbaskets"}),(0,s.jsx)(i.td,{children:"DOMAIN_C | DOMAIN_TEST"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"kadai.classification.types"}),(0,s.jsx)(i.td,{children:"A list of Classification types (case insensitive)"}),(0,s.jsx)(i.td,{children:"TASK | document"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"kadai.classification.categories. (for example kadai.classification.categories.document)"}),(0,s.jsx)(i.td,{children:"A list of classification categories for each type"}),(0,s.jsx)(i.td,{children:"EXTERNAL | manual | autoMAtic | Process"})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"kadai.servicelevel.validation.enforce"}),(0,s.jsx)(i.td,{children:"allows user to create Tasks with date-attributes independent of the serviceLevel of the Classifications"}),(0,s.jsx)(i.td,{children:"true"})]})]})]})]})}function p(e={}){const{wrapper:i}={...(0,a.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,i,t)=>{t.d(i,{R:()=>n,x:()=>o});var s=t(6540);const a={},r=s.createContext(a);function n(e){const i=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function o(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:n(e.components),s.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ef1c3cd1.ed172744.js b/assets/js/ef1c3cd1.ed172744.js new file mode 100644 index 0000000..935f107 --- /dev/null +++ b/assets/js/ef1c3cd1.ed172744.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[4529],{6428:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>c,contentTitle:()=>o,default:()=>p,frontMatter:()=>n,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"user-guide/configuration/classificationAndServiceLevel","title":"Classification and ServiceLevel","description":"The configuration of these parameters is in the file `kadai.properties`. Some parameters allow multiple values specified as a list. In this case, individual values are separated by a configurable separator. Use the propertiesSeparator parameter to specify it. If none is provided, the default is \\"|\\". If you specify a propertiesSeparator, no list item in the properties file can contain any character from the propertiesSeparator.","source":"@site/docs/user-guide/configuration/classificationAndServiceLevel.md","sourceDirName":"user-guide/configuration","slug":"/user-guide/configuration/classificationAndServiceLevel","permalink":"/kadai-doc/docs/user-guide/configuration/classificationAndServiceLevel","draft":false,"unlisted":false,"tags":[],"version":"current","sidebarPosition":4,"frontMatter":{"sidebar_position":4},"sidebar":"userSidebar","previous":{"title":"LDAP","permalink":"/kadai-doc/docs/user-guide/configuration/ldap"},"next":{"title":"KADAI-jobs","permalink":"/kadai-doc/docs/user-guide/configuration/kadaiJobs"}}');var a=t(4848),r=t(8453);const n={sidebar_position:4},o="Classification and ServiceLevel",c={},d=[];function l(e){const i={code:"code",em:"em",h1:"h1",header:"header",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(i.header,{children:(0,a.jsx)(i.h1,{id:"classification-and-servicelevel",children:"Classification and ServiceLevel"})}),"\n",(0,a.jsxs)(i.p,{children:["The configuration of these parameters is in the file ",(0,a.jsx)(i.code,{children:"kadai.properties"}),". Some parameters allow multiple values specified as a list. In this case, individual values are separated by a configurable separator. Use the ",(0,a.jsx)(i.em,{children:"propertiesSeparator"}),' parameter to specify it. If none is provided, the default is "|". If you specify a propertiesSeparator, no list item in the properties file can contain any character from the propertiesSeparator.']}),"\n",(0,a.jsxs)(i.table,{children:[(0,a.jsx)(i.thead,{children:(0,a.jsxs)(i.tr,{children:[(0,a.jsx)(i.th,{children:"Parameter"}),(0,a.jsx)(i.th,{children:"Description"}),(0,a.jsx)(i.th,{children:"Sample Value"})]})}),(0,a.jsxs)(i.tbody,{children:[(0,a.jsxs)(i.tr,{children:[(0,a.jsx)(i.td,{children:"kadai.domains"}),(0,a.jsx)(i.td,{children:"A list of domains for Classifications and Workbaskets"}),(0,a.jsx)(i.td,{children:"DOMAIN_C | DOMAIN_TEST"})]}),(0,a.jsxs)(i.tr,{children:[(0,a.jsx)(i.td,{children:"kadai.classification.types"}),(0,a.jsx)(i.td,{children:"A list of Classification types (case insensitive)"}),(0,a.jsx)(i.td,{children:"TASK | document"})]}),(0,a.jsxs)(i.tr,{children:[(0,a.jsx)(i.td,{children:"kadai.classification.categories. (for example kadai.classification.categories.document)"}),(0,a.jsx)(i.td,{children:"A list of classification categories for each type"}),(0,a.jsx)(i.td,{children:"EXTERNAL | manual | autoMAtic | Process"})]}),(0,a.jsxs)(i.tr,{children:[(0,a.jsx)(i.td,{children:"kadai.servicelevel.validation.enforce"}),(0,a.jsx)(i.td,{children:"allows user to create Tasks with date-attributes independent of the serviceLevel of the Classifications"}),(0,a.jsx)(i.td,{children:"true"})]})]})]})]})}function p(e={}){const{wrapper:i}={...(0,r.R)(),...e.components};return i?(0,a.jsx)(i,{...e,children:(0,a.jsx)(l,{...e})}):l(e)}},8453:(e,i,t)=>{t.d(i,{R:()=>n,x:()=>o});var s=t(6540);const a={},r=s.createContext(a);function n(e){const i=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function o(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:n(e.components),s.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/main.46123788.js b/assets/js/main.46123788.js new file mode 100644 index 0000000..bfcfdcc --- /dev/null +++ b/assets/js/main.46123788.js @@ -0,0 +1,2 @@ +/*! For license information please see main.46123788.js.LICENSE.txt */ +(self.webpackChunkfirst_example=self.webpackChunkfirst_example||[]).push([[8792],{8328:(e,t,n)=>{"use strict";n.d(t,{A:()=>p});n(6540);var r=n(3259),o=n.n(r),a=n(4054);const i={"0251b216":[()=>n.e(3706).then(n.bind(n,3354)),"@site/docs/user-guide/configuration/ui.md",3354],"12fe0deb":[()=>n.e(4228).then(n.bind(n,2872)),"@site/docs/user-guide/getting-started/supportedEnvironments.md",2872],"14eb3368":[()=>Promise.all([n.e(1869),n.e(6969)]).then(n.bind(n,7247)),"@theme/DocCategoryGeneratedIndexPage",7247],17896441:[()=>Promise.all([n.e(1869),n.e(9408),n.e(8401)]).then(n.bind(n,8632)),"@theme/DocItem",8632],"1c269d1d":[()=>Promise.all([n.e(1869),n.e(9475)]).then(n.bind(n,3801)),"@site/docs/user-guide/getting-started/exampleSpringBoot.md",3801],"1f391b9e":[()=>Promise.all([n.e(1869),n.e(9408),n.e(6061)]).then(n.bind(n,7973)),"@theme/MDXPage",7973],"24ec522f":[()=>n.e(1904).then(n.bind(n,924)),"@site/docs/user-guide/configuration/holidaysAndWorkingDays.md",924],"25a759bd":[()=>n.e(8456).then(n.t.bind(n,2969,19)),"@generated/docusaurus-plugin-content-docs/default/p/kadai-doc-docs-category-adapter-1ca.json",2969],"2a7b3772":[()=>n.e(4358).then(n.bind(n,1928)),"@site/docs/user-guide/configuration/ldap.md",1928],"2ca91d46":[()=>n.e(6253).then(n.t.bind(n,6528,19)),"@generated/docusaurus-plugin-content-docs/default/p/kadai-doc-docs-ace.json",6528],"373999ad":[()=>n.e(6268).then(n.bind(n,4284)),"@site/docs/user-guide/core-concepts/overview.md",4284],"393be207":[()=>n.e(4134).then(n.bind(n,591)),"@site/src/pages/markdown-page.md",591],42887586:[()=>n.e(847).then(n.bind(n,2519)),"@site/docs/user-guide/reference/modules.md",2519],"48eab233":[()=>n.e(199).then(n.bind(n,6175)),"@site/docs/user-guide/features/monitoring.md",6175],"5447c93a":[()=>n.e(7671).then(n.bind(n,6210)),"@site/docs/user-guide/configuration/database.md",6210],"56bd79c1":[()=>n.e(2144).then(n.bind(n,1496)),"@site/docs/user-guide/features/kadaiHistorySPI.md",1496],"57239c41":[()=>n.e(6191).then(n.bind(n,484)),"@site/docs/user-guide/core-concepts/taskLifecycle.md",484],"5e95c892":[()=>n.e(9647).then(n.bind(n,7121)),"@theme/DocsRoot",7121],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,4784)),"@generated/docusaurus.config",4784],"6c4ad7f3":[()=>n.e(2253).then(n.t.bind(n,1671,19)),"@generated/docusaurus-plugin-content-docs/default/p/kadai-doc-docs-category-core-concepts-37a.json",1671],"6d9693cd":[()=>n.e(1921).then(n.bind(n,1701)),"@site/docs/user-guide/userGuideIntro.md",1701],"7218d785":[()=>n.e(5481).then(n.bind(n,762)),"@site/docs/user-guide/features/listOfProvidedSPIs.md",762],"76ee90bb":[()=>n.e(6461).then(n.bind(n,1075)),"@site/docs/user-guide/features/jobs.md",1075],"81ecd14e":[()=>n.e(290).then(n.bind(n,8265)),"@site/docs/user-guide/features/queriesFilteringAndSorting.md",8265],"9112dd25":[()=>n.e(9803).then(n.t.bind(n,7520,19)),"@generated/docusaurus-plugin-content-docs/default/p/kadai-doc-docs-category-configuration-957.json",7520],"93b79e6e":[()=>n.e(2295).then(n.bind(n,4996)),"@site/docs/user-guide/configuration/priorityReport.md",4996],"955ca316":[()=>n.e(268).then(n.bind(n,625)),"@site/docs/user-guide/features/howToUseServiceProviderInterfaces.md",625],"9ec8d0b6":[()=>n.e(1484).then(n.bind(n,1780)),"@site/docs/user-guide/core-concepts/javaApiUsage.md",1780],a3bd232a:[()=>n.e(3543).then(n.bind(n,6832)),"@site/docs/user-guide/core-concepts/securityAndPermissions.md",6832],a4bffc61:[()=>n.e(8918).then(n.bind(n,8146)),"@site/docs/user-guide/core-concepts/restApi.md",8146],a51fc69b:[()=>n.e(3878).then(n.bind(n,5295)),"@site/docs/user-guide/reference/dataModel.md",5295],a54ea03c:[()=>n.e(2077).then(n.bind(n,4790)),"@site/docs/demo-app/demoApp.md",4790],a7456010:[()=>n.e(1235).then(n.t.bind(n,8552,19)),"@generated/docusaurus-plugin-content-pages/default/__plugin.json",8552],a7bd4aaa:[()=>n.e(7098).then(n.bind(n,1723)),"@theme/DocVersionRoot",1723],a94703ab:[()=>Promise.all([n.e(1869),n.e(9048)]).then(n.bind(n,1377)),"@theme/DocRoot",1377],aba21aa0:[()=>n.e(5742).then(n.t.bind(n,7093,19)),"@generated/docusaurus-plugin-content-docs/default/__plugin.json",7093],b715cf33:[()=>n.e(1793).then(n.bind(n,2876)),"@site/docs/user-guide/configuration/security.md",2876],c391ba29:[()=>n.e(4755).then(n.bind(n,5804)),"@site/docs/user-guide/configuration/kadaiJobs.md",5804],c4f5d8e4:[()=>Promise.all([n.e(1869),n.e(2634)]).then(n.bind(n,8791)),"@site/src/pages/index.js",8791],c5a41c6c:[()=>n.e(8833).then(n.t.bind(n,1382,19)),"@generated/docusaurus-plugin-content-docs/default/p/kadai-doc-docs-category-features-8c1.json",1382],c68f7959:[()=>n.e(9888).then(n.t.bind(n,848,19)),"@generated/docusaurus-plugin-content-docs/default/p/kadai-doc-docs-category-getting-started-b8e.json",848],c9ced819:[()=>n.e(37).then(n.bind(n,9356)),"@site/docs/user-guide/configuration/historyAndCustomProperties.md",9356],ce69b5c4:[()=>n.e(6298).then(n.bind(n,4966)),"@site/docs/user-guide/features/users.md",4966],dcf8ed49:[()=>n.e(7048).then(n.bind(n,3327)),"@site/docs/user-guide/adapter/gettingStarted.md",3327],e5931ac3:[()=>n.e(2841).then(n.bind(n,9420)),"@site/docs/contact-us/contactUs.md",9420],ef1c3cd1:[()=>n.e(4529).then(n.bind(n,6428)),"@site/docs/user-guide/configuration/classificationAndServiceLevel.md",6428],fc35c4d2:[()=>n.e(3573).then(n.t.bind(n,3878,19)),"@generated/docusaurus-plugin-content-docs/default/p/kadai-doc-docs-category-reference-0f0.json",3878]};var l=n(4848);function s(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,l.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,l.jsx)("p",{children:String(t)}),(0,l.jsx)("div",{children:(0,l.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,l.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,l.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,l.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,l.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,l.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,l.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,l.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,l.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,l.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var u=n(6921),c=n(3102);function d(e,t){if("*"===e)return o()({loading:s,loader:()=>n.e(2237).then(n.bind(n,2237)),modules:["@theme/NotFound"],webpack:()=>[2237],render(e,t){const n=e.default;return(0,l.jsx)(c.W,{value:{plugin:{name:"native",id:"default"}},children:(0,l.jsx)(n,{...t})})}});const r=a[`${e}-${t}`],d={},p=[],f=[],g=(0,u.A)(r);return Object.entries(g).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],p.push(r[1]),f.push(r[2]))})),o().Map({loading:s,loader:d,modules:p,webpack:()=>f,render(t,n){const o=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let i=o;const l=n.split(".");l.slice(0,-1).forEach((e=>{i=i[e]})),i[l[l.length-1]]=a}));const a=o.__comp;delete o.__comp;const i=o.__context;delete o.__context;const s=o.__props;return delete o.__props,(0,l.jsx)(c.W,{value:i,children:(0,l.jsx)(a,{...o,...s,...n})})}})}const p=[{path:"/kadai-doc/markdown-page",component:d("/kadai-doc/markdown-page","038"),exact:!0},{path:"/kadai-doc/docs",component:d("/kadai-doc/docs","e06"),routes:[{path:"/kadai-doc/docs",component:d("/kadai-doc/docs","a4a"),routes:[{path:"/kadai-doc/docs",component:d("/kadai-doc/docs","907"),routes:[{path:"/kadai-doc/docs/category/adapter",component:d("/kadai-doc/docs/category/adapter","054"),exact:!0,sidebar:"userSidebar"},{path:"/kadai-doc/docs/category/configuration",component:d("/kadai-doc/docs/category/configuration","c81"),exact:!0,sidebar:"userSidebar"},{path:"/kadai-doc/docs/category/core-concepts",component:d("/kadai-doc/docs/category/core-concepts","cd1"),exact:!0,sidebar:"userSidebar"},{path:"/kadai-doc/docs/category/features",component:d("/kadai-doc/docs/category/features","e2e"),exact:!0,sidebar:"userSidebar"},{path:"/kadai-doc/docs/category/getting-started",component:d("/kadai-doc/docs/category/getting-started","96b"),exact:!0,sidebar:"userSidebar"},{path:"/kadai-doc/docs/category/reference",component:d("/kadai-doc/docs/category/reference","945"),exact:!0,sidebar:"userSidebar"},{path:"/kadai-doc/docs/contact-us/contactUs",component:d("/kadai-doc/docs/contact-us/contactUs","754"),exact:!0,sidebar:"communitySidebar"},{path:"/kadai-doc/docs/demo-app/demoApp",component:d("/kadai-doc/docs/demo-app/demoApp","eaf"),exact:!0,sidebar:"userSidebar"},{path:"/kadai-doc/docs/user-guide/adapter/gettingStarted",component:d("/kadai-doc/docs/user-guide/adapter/gettingStarted","42c"),exact:!0,sidebar:"userSidebar"},{path:"/kadai-doc/docs/user-guide/configuration/classificationAndServiceLevel",component:d("/kadai-doc/docs/user-guide/configuration/classificationAndServiceLevel","b6a"),exact:!0,sidebar:"userSidebar"},{path:"/kadai-doc/docs/user-guide/configuration/database",component:d("/kadai-doc/docs/user-guide/configuration/database","1f7"),exact:!0,sidebar:"userSidebar"},{path:"/kadai-doc/docs/user-guide/configuration/historyAndCustomProperties",component:d("/kadai-doc/docs/user-guide/configuration/historyAndCustomProperties","f07"),exact:!0,sidebar:"userSidebar"},{path:"/kadai-doc/docs/user-guide/configuration/holidaysAndWorkingDays",component:d("/kadai-doc/docs/user-guide/configuration/holidaysAndWorkingDays","0f0"),exact:!0,sidebar:"userSidebar"},{path:"/kadai-doc/docs/user-guide/configuration/kadaiJobs",component:d("/kadai-doc/docs/user-guide/configuration/kadaiJobs","4da"),exact:!0,sidebar:"userSidebar"},{path:"/kadai-doc/docs/user-guide/configuration/ldap",component:d("/kadai-doc/docs/user-guide/configuration/ldap","8fd"),exact:!0,sidebar:"userSidebar"},{path:"/kadai-doc/docs/user-guide/configuration/priorityReport",component:d("/kadai-doc/docs/user-guide/configuration/priorityReport","b47"),exact:!0,sidebar:"userSidebar"},{path:"/kadai-doc/docs/user-guide/configuration/security",component:d("/kadai-doc/docs/user-guide/configuration/security","020"),exact:!0,sidebar:"userSidebar"},{path:"/kadai-doc/docs/user-guide/configuration/ui",component:d("/kadai-doc/docs/user-guide/configuration/ui","680"),exact:!0,sidebar:"userSidebar"},{path:"/kadai-doc/docs/user-guide/core-concepts/javaApiUsage",component:d("/kadai-doc/docs/user-guide/core-concepts/javaApiUsage","866"),exact:!0,sidebar:"userSidebar"},{path:"/kadai-doc/docs/user-guide/core-concepts/overview",component:d("/kadai-doc/docs/user-guide/core-concepts/overview","679"),exact:!0,sidebar:"userSidebar"},{path:"/kadai-doc/docs/user-guide/core-concepts/restApi",component:d("/kadai-doc/docs/user-guide/core-concepts/restApi","51c"),exact:!0,sidebar:"userSidebar"},{path:"/kadai-doc/docs/user-guide/core-concepts/securityAndPermissions",component:d("/kadai-doc/docs/user-guide/core-concepts/securityAndPermissions","2d0"),exact:!0,sidebar:"userSidebar"},{path:"/kadai-doc/docs/user-guide/core-concepts/taskLifecycle",component:d("/kadai-doc/docs/user-guide/core-concepts/taskLifecycle","935"),exact:!0,sidebar:"userSidebar"},{path:"/kadai-doc/docs/user-guide/features/howToUseServiceProviderInterfaces",component:d("/kadai-doc/docs/user-guide/features/howToUseServiceProviderInterfaces","90d"),exact:!0,sidebar:"userSidebar"},{path:"/kadai-doc/docs/user-guide/features/jobs",component:d("/kadai-doc/docs/user-guide/features/jobs","8e0"),exact:!0,sidebar:"userSidebar"},{path:"/kadai-doc/docs/user-guide/features/kadaiHistorySPI",component:d("/kadai-doc/docs/user-guide/features/kadaiHistorySPI","7cc"),exact:!0,sidebar:"userSidebar"},{path:"/kadai-doc/docs/user-guide/features/listOfProvidedSPIs",component:d("/kadai-doc/docs/user-guide/features/listOfProvidedSPIs","1de"),exact:!0,sidebar:"userSidebar"},{path:"/kadai-doc/docs/user-guide/features/monitoring",component:d("/kadai-doc/docs/user-guide/features/monitoring","7d4"),exact:!0,sidebar:"userSidebar"},{path:"/kadai-doc/docs/user-guide/features/queriesFilteringAndSorting",component:d("/kadai-doc/docs/user-guide/features/queriesFilteringAndSorting","17e"),exact:!0,sidebar:"userSidebar"},{path:"/kadai-doc/docs/user-guide/features/users",component:d("/kadai-doc/docs/user-guide/features/users","d22"),exact:!0,sidebar:"userSidebar"},{path:"/kadai-doc/docs/user-guide/getting-started/exampleSpringBoot",component:d("/kadai-doc/docs/user-guide/getting-started/exampleSpringBoot","d73"),exact:!0,sidebar:"userSidebar"},{path:"/kadai-doc/docs/user-guide/getting-started/supportedEnvironments",component:d("/kadai-doc/docs/user-guide/getting-started/supportedEnvironments","2eb"),exact:!0,sidebar:"userSidebar"},{path:"/kadai-doc/docs/user-guide/reference/dataModel",component:d("/kadai-doc/docs/user-guide/reference/dataModel","c4c"),exact:!0,sidebar:"userSidebar"},{path:"/kadai-doc/docs/user-guide/reference/modules",component:d("/kadai-doc/docs/user-guide/reference/modules","d64"),exact:!0,sidebar:"userSidebar"},{path:"/kadai-doc/docs/user-guide/userGuideIntro",component:d("/kadai-doc/docs/user-guide/userGuideIntro","9e3"),exact:!0,sidebar:"userSidebar"}]}]}]},{path:"/kadai-doc/",component:d("/kadai-doc/","36c"),exact:!0},{path:"*",component:d("*")}]},6125:(e,t,n)=>{"use strict";n.d(t,{o:()=>a,x:()=>i});var r=n(6540),o=n(4848);const a=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,o.jsx)(a.Provider,{value:n,children:t})}},7815:(e,t,n)=>{"use strict";var r=n(6540),o=n(5338),a=n(545),i=n(4625),l=n(4784),s=n(8193);const u=[n(119),n(6134),n(6294),n(1043)];var c=n(8328),d=n(6347),p=n(2831),f=n(4848);function g(e){let{children:t}=e;return(0,f.jsx)(f.Fragment,{children:t})}var m=n(5260),h=n(4586),y=n(6025),b=n(6342),v=n(1003),w=n(2131),k=n(4090);const x="default";var S=n(440),E=n(1463);function _(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,h.A)(),r=(0,w.o)(),o=n[e].htmlLang,a=e=>e.replace("-","_");return(0,f.jsxs)(m.A,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,f.jsx)("meta",{property:"og:locale",content:a(o)}),Object.values(n).filter((e=>o!==e.htmlLang)).map((e=>(0,f.jsx)("meta",{property:"og:locale:alternate",content:a(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function C(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,h.A)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,h.A)(),{pathname:r}=(0,d.zy)();return e+(0,S.Ks)((0,y.Ay)(r),{trailingSlash:n,baseUrl:t})}(),o=t?`${n}${t}`:r;return(0,f.jsxs)(m.A,{children:[(0,f.jsx)("meta",{property:"og:url",content:o}),(0,f.jsx)("link",{rel:"canonical",href:o})]})}function A(){const{i18n:{currentLocale:e}}=(0,h.A)(),{metadata:t,image:n}=(0,b.p)();return(0,f.jsxs)(f.Fragment,{children:[(0,f.jsxs)(m.A,{children:[(0,f.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,f.jsx)("body",{className:k.w})]}),n&&(0,f.jsx)(v.be,{image:n}),(0,f.jsx)(C,{}),(0,f.jsx)(_,{}),(0,f.jsx)(E.A,{tag:x,locale:e}),(0,f.jsx)(m.A,{children:t.map(((e,t)=>(0,f.jsx)("meta",{...e},t)))})]})}const T=new Map;var j=n(6125),P=n(6988),N=n(205);function L(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>o.forEach((e=>e?.()))}const R=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,N.A)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,o=t.hash===n.hash,a=t.search===n.search;if(r&&o&&!a)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),L("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function O(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,p.u)(c.A,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class D extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=s.A.canUseDOM?L("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=L("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),O(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return(0,f.jsx)(R,{previousLocation:this.previousLocation,location:t,children:(0,f.jsx)(d.qh,{location:t,render:()=>e})})}}const I=D,M="__docusaurus-base-url-issue-banner-container",F="__docusaurus-base-url-issue-banner",z="__docusaurus-base-url-issue-banner-suggestion-container";function B(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '${M}';\n var bannerHtml = ${JSON.stringify(function(e){return`\n
\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

Current configured baseUrl = ${e} ${"/"===e?" (default value)":""}

\n

We suggest trying baseUrl =

\n
\n`}(e)).replace(/{let{route:t}=e;return!0===t.exact})))return T.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return T.set(e.pathname,t),{...e,pathname:t}}((0,d.zy)());return(0,f.jsx)(I,{location:e,children:V})}function Q(){return(0,f.jsx)(H.A,{children:(0,f.jsx)(P.l,{children:(0,f.jsxs)(j.x,{children:[(0,f.jsxs)(g,{children:[(0,f.jsx)(q,{}),(0,f.jsx)(A,{}),(0,f.jsx)($,{}),(0,f.jsx)(K,{})]}),(0,f.jsx)(W,{})]})})})}var Y=n(4054);const Z=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const o=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;o?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var X=n(6921);const J=new Set,ee=new Set,te=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ne={prefetch:e=>{if(!(e=>!te()&&!ee.has(e)&&!J.has(e))(e))return!1;J.add(e);const t=(0,p.u)(c.A,e).flatMap((e=>{return t=e.route.path,Object.entries(Y).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,X.A)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Z(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!te()&&!ee.has(e))(e)&&(ee.add(e),O(e))},re=Object.freeze(ne);function oe(e){let{children:t}=e;return"hash"===l.default.future.experimental_router?(0,f.jsx)(i.I9,{children:t}):(0,f.jsx)(i.Kd,{children:t})}const ae=Boolean(!0);if(s.A.canUseDOM){window.docusaurus=re;const e=document.getElementById("__docusaurus"),t=(0,f.jsx)(a.vd,{children:(0,f.jsx)(oe,{children:(0,f.jsx)(Q,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},i=()=>{if(window.docusaurusRoot)window.docusaurusRoot.render(t);else if(ae)window.docusaurusRoot=o.hydrateRoot(e,t,{onRecoverableError:n});else{const r=o.createRoot(e,{onRecoverableError:n});r.render(t),window.docusaurusRoot=r}};O(window.location.pathname).then((()=>{(0,r.startTransition)(i)}))}},6988:(e,t,n)=>{"use strict";n.d(t,{o:()=>d,l:()=>p});var r=n(6540),o=n(4784);const a=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/kadai-doc/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/kadai-doc/docs","mainDocId":"user-guide/userGuideIntro","docs":[{"id":"contact-us/contactUs","path":"/kadai-doc/docs/contact-us/contactUs","sidebar":"communitySidebar"},{"id":"demo-app/demoApp","path":"/kadai-doc/docs/demo-app/demoApp","sidebar":"userSidebar"},{"id":"user-guide/adapter/gettingStarted","path":"/kadai-doc/docs/user-guide/adapter/gettingStarted","sidebar":"userSidebar"},{"id":"user-guide/configuration/classificationAndServiceLevel","path":"/kadai-doc/docs/user-guide/configuration/classificationAndServiceLevel","sidebar":"userSidebar"},{"id":"user-guide/configuration/database","path":"/kadai-doc/docs/user-guide/configuration/database","sidebar":"userSidebar"},{"id":"user-guide/configuration/historyAndCustomProperties","path":"/kadai-doc/docs/user-guide/configuration/historyAndCustomProperties","sidebar":"userSidebar"},{"id":"user-guide/configuration/holidaysAndWorkingDays","path":"/kadai-doc/docs/user-guide/configuration/holidaysAndWorkingDays","sidebar":"userSidebar"},{"id":"user-guide/configuration/kadaiJobs","path":"/kadai-doc/docs/user-guide/configuration/kadaiJobs","sidebar":"userSidebar"},{"id":"user-guide/configuration/ldap","path":"/kadai-doc/docs/user-guide/configuration/ldap","sidebar":"userSidebar"},{"id":"user-guide/configuration/priorityReport","path":"/kadai-doc/docs/user-guide/configuration/priorityReport","sidebar":"userSidebar"},{"id":"user-guide/configuration/security","path":"/kadai-doc/docs/user-guide/configuration/security","sidebar":"userSidebar"},{"id":"user-guide/configuration/ui","path":"/kadai-doc/docs/user-guide/configuration/ui","sidebar":"userSidebar"},{"id":"user-guide/core-concepts/javaApiUsage","path":"/kadai-doc/docs/user-guide/core-concepts/javaApiUsage","sidebar":"userSidebar"},{"id":"user-guide/core-concepts/overview","path":"/kadai-doc/docs/user-guide/core-concepts/overview","sidebar":"userSidebar"},{"id":"user-guide/core-concepts/restApi","path":"/kadai-doc/docs/user-guide/core-concepts/restApi","sidebar":"userSidebar"},{"id":"user-guide/core-concepts/securityAndPermissions","path":"/kadai-doc/docs/user-guide/core-concepts/securityAndPermissions","sidebar":"userSidebar"},{"id":"user-guide/core-concepts/taskLifecycle","path":"/kadai-doc/docs/user-guide/core-concepts/taskLifecycle","sidebar":"userSidebar"},{"id":"user-guide/features/howToUseServiceProviderInterfaces","path":"/kadai-doc/docs/user-guide/features/howToUseServiceProviderInterfaces","sidebar":"userSidebar"},{"id":"user-guide/features/jobs","path":"/kadai-doc/docs/user-guide/features/jobs","sidebar":"userSidebar"},{"id":"user-guide/features/kadaiHistorySPI","path":"/kadai-doc/docs/user-guide/features/kadaiHistorySPI","sidebar":"userSidebar"},{"id":"user-guide/features/listOfProvidedSPIs","path":"/kadai-doc/docs/user-guide/features/listOfProvidedSPIs","sidebar":"userSidebar"},{"id":"user-guide/features/monitoring","path":"/kadai-doc/docs/user-guide/features/monitoring","sidebar":"userSidebar"},{"id":"user-guide/features/queriesFilteringAndSorting","path":"/kadai-doc/docs/user-guide/features/queriesFilteringAndSorting","sidebar":"userSidebar"},{"id":"user-guide/features/users","path":"/kadai-doc/docs/user-guide/features/users","sidebar":"userSidebar"},{"id":"user-guide/getting-started/exampleSpringBoot","path":"/kadai-doc/docs/user-guide/getting-started/exampleSpringBoot","sidebar":"userSidebar"},{"id":"user-guide/getting-started/supportedEnvironments","path":"/kadai-doc/docs/user-guide/getting-started/supportedEnvironments","sidebar":"userSidebar"},{"id":"user-guide/reference/dataModel","path":"/kadai-doc/docs/user-guide/reference/dataModel","sidebar":"userSidebar"},{"id":"user-guide/reference/modules","path":"/kadai-doc/docs/user-guide/reference/modules","sidebar":"userSidebar"},{"id":"user-guide/userGuideIntro","path":"/kadai-doc/docs/user-guide/userGuideIntro","sidebar":"userSidebar"},{"id":"/category/getting-started","path":"/kadai-doc/docs/category/getting-started","sidebar":"userSidebar"},{"id":"/category/core-concepts","path":"/kadai-doc/docs/category/core-concepts","sidebar":"userSidebar"},{"id":"/category/configuration","path":"/kadai-doc/docs/category/configuration","sidebar":"userSidebar"},{"id":"/category/features","path":"/kadai-doc/docs/category/features","sidebar":"userSidebar"},{"id":"/category/reference","path":"/kadai-doc/docs/category/reference","sidebar":"userSidebar"},{"id":"/category/adapter","path":"/kadai-doc/docs/category/adapter","sidebar":"userSidebar"}],"draftIds":[],"sidebars":{"userSidebar":{"link":{"path":"/kadai-doc/docs/user-guide/userGuideIntro","label":"user-guide/userGuideIntro"}},"communitySidebar":{"link":{"path":"/kadai-doc/docs/contact-us/contactUs","label":"contact-us/contactUs"}}}}],"breadcrumbs":true}},"docusaurus-plugin-drawio":{"default":{"id":"default"}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var l=n(2654);const s=JSON.parse('{"docusaurusVersion":"3.6.0","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.6.0"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"3.6.0"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.6.0"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.6.0"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.6.0"},"docusaurus-plugin-drawio":{"type":"package","name":"docusaurus-plugin-drawio","version":"0.4.0"}}}');var u=n(4848);const c={siteConfig:o.default,siteMetadata:s,globalData:a,i18n:i,codeTranslations:l},d=r.createContext(c);function p(e){let{children:t}=e;return(0,u.jsx)(d.Provider,{value:c,children:t})}},7489:(e,t,n)=>{"use strict";n.d(t,{A:()=>m});var r=n(6540),o=n(8193),a=n(5260),i=n(440),l=n(781),s=n(3102),u=n(4848);function c(e){let{error:t,tryAgain:n}=e;return(0,u.jsxs)("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"},children:[(0,u.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,u.jsx)("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,u.jsx)(d,{error:t})]})}function d(e){let{error:t}=e;const n=(0,i.rA)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,u.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:n})}function p(e){let{children:t}=e;return(0,u.jsx)(s.W,{value:{plugin:{name:"docusaurus-core-error-boundary",id:"default"}},children:t})}function f(e){let{error:t,tryAgain:n}=e;return(0,u.jsx)(p,{children:(0,u.jsxs)(m,{fallback:()=>(0,u.jsx)(c,{error:t,tryAgain:n}),children:[(0,u.jsx)(a.A,{children:(0,u.jsx)("title",{children:"Page Error"})}),(0,u.jsx)(l.A,{children:(0,u.jsx)(c,{error:t,tryAgain:n})})]})})}const g=e=>(0,u.jsx)(f,{...e});class m extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){o.A.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??g)(e)}return e??null}}},8193:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,o={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5260:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(6540);var r=n(545),o=n(4848);function a(e){return(0,o.jsx)(r.mg,{...e})}},8774:(e,t,n)=>{"use strict";n.d(t,{A:()=>f});var r=n(6540),o=n(4625),a=n(440),i=n(4586),l=n(6654),s=n(8193),u=n(3427),c=n(6025),d=n(4848);function p(e,t){let{isNavLink:n,to:p,href:f,activeClassName:g,isActive:m,"data-noBrokenLinkCheck":h,autoAddBaseUrl:y=!0,...b}=e;const{siteConfig:v}=(0,i.A)(),{trailingSlash:w,baseUrl:k}=v,x=v.future.experimental_router,{withBaseUrl:S}=(0,c.hH)(),E=(0,u.A)(),_=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>_.current));const C=p||f;const A=(0,l.A)(C),T=C?.replace("pathname://","");let j=void 0!==T?(P=T,y&&(e=>e.startsWith("/"))(P)?S(P):P):void 0;var P;"hash"===x&&j?.startsWith("./")&&(j=j?.slice(1)),j&&A&&(j=(0,a.Ks)(j,{trailingSlash:w,baseUrl:k}));const N=(0,r.useRef)(!1),L=n?o.k2:o.N_,R=s.A.canUseIntersectionObserver,O=(0,r.useRef)(),D=()=>{N.current||null==j||(window.docusaurus.preload(j),N.current=!0)};(0,r.useEffect)((()=>(!R&&A&&s.A.canUseDOM&&null!=j&&window.docusaurus.prefetch(j),()=>{R&&O.current&&O.current.disconnect()})),[O,j,R,A]);const I=j?.startsWith("#")??!1,M=!b.target||"_self"===b.target,F=!j||!A||!M||I&&"hash"!==x;h||!I&&F||E.collectLink(j),b.id&&E.collectAnchor(b.id);const z={};return F?(0,d.jsx)("a",{ref:_,href:j,...C&&!A&&{target:"_blank",rel:"noopener noreferrer"},...b,...z}):(0,d.jsx)(L,{...b,onMouseEnter:D,onTouchStart:D,innerRef:e=>{_.current=e,R&&e&&A&&(O.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(O.current.unobserve(e),O.current.disconnect(),null!=j&&window.docusaurus.prefetch(j))}))})),O.current.observe(e))},to:j,...n&&{isActive:m,activeClassName:g},...z})}const f=r.forwardRef(p)},418:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});const r=()=>null},1312:(e,t,n)=>{"use strict";n.d(t,{A:()=>u,T:()=>s});var r=n(6540),o=n(4848);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var i=n(2654);function l(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return i[t??n]??n??t}function s(e,t){let{message:n,id:r}=e;return a(l({message:n,id:r}),t)}function u(e){let{children:t,id:n,values:r}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const i=l({message:t,id:n});return(0,o.jsx)(o.Fragment,{children:a(i,r)})}},7065:(e,t,n)=>{"use strict";n.d(t,{W:()=>r});const r="default"},6654:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function o(e){return void 0!==e&&!r(e)}n.d(t,{A:()=>o,z:()=>r})},6025:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>l,hH:()=>i});var r=n(6540),o=n(4586),a=n(6654);function i(){const{siteConfig:e}=(0,o.A)(),{baseUrl:t,url:n}=e,i=e.future.experimental_router,l=(0,r.useCallback)(((e,r)=>function(e){let{siteUrl:t,baseUrl:n,url:r,options:{forcePrependBaseUrl:o=!1,absolute:i=!1}={},router:l}=e;if(!r||r.startsWith("#")||(0,a.z)(r))return r;if("hash"===l)return r.startsWith("/")?`.${r}`:`./${r}`;if(o)return n+r.replace(/^\//,"");if(r===n.replace(/\/$/,""))return n;const s=r.startsWith(n)?r:n+r.replace(/^\//,"");return i?t+s:s}({siteUrl:n,baseUrl:t,url:e,options:r,router:i})),[n,t,i]);return{withBaseUrl:l}}function l(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},3427:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(6540);n(4848);const o=r.createContext({collectAnchor:()=>{},collectLink:()=>{}}),a=()=>(0,r.useContext)(o);function i(){return a()}},4586:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6540),o=n(6988);function a(){return(0,r.useContext)(o.o)}},2303:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6540),o=n(6125);function a(){return(0,r.useContext)(o.o)}},205:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540);const o=n(8193).A.canUseDOM?r.useLayoutEffect:r.useEffect},6921:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function o(e){const t={};return function e(n,o){Object.entries(n).forEach((n=>{let[a,i]=n;const l=o?`${o}.${a}`:a;r(i)?e(i,l):t[l]=i}))}(e),t}},3102:(e,t,n)=>{"use strict";n.d(t,{W:()=>i,o:()=>a});var r=n(6540),o=n(4848);const a=r.createContext(null);function i(e){let{children:t,value:n}=e;const i=r.useContext(a),l=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:i,value:n})),[i,n]);return(0,o.jsx)(a.Provider,{value:l,children:t})}},3886:(e,t,n)=>{"use strict";n.d(t,{VQ:()=>h,g1:()=>b});var r=n(6540),o=n(4070),a=n(7065),i=n(6342),l=n(679),s=n(9532),u=n(4848);const c=e=>`docs-preferred-version-${e}`,d={save:(e,t,n)=>{(0,l.Wf)(c(e),{persistence:t}).set(n)},read:(e,t)=>(0,l.Wf)(c(e),{persistence:t}).get(),clear:(e,t)=>{(0,l.Wf)(c(e),{persistence:t}).del()}},p=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const f=r.createContext(null);function g(){const e=(0,o.Gy)(),t=(0,i.p)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[a,l]=(0,r.useState)((()=>p(n)));(0,r.useEffect)((()=>{l(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function o(e){const t=d.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(d.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,o(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[a,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){d.save(e,t,n),l((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function m(e){let{children:t}=e;const n=g();return(0,u.jsx)(f.Provider,{value:n,children:t})}function h(e){let{children:t}=e;return(0,u.jsx)(m,{children:t})}function y(){const e=(0,r.useContext)(f);if(!e)throw new s.dV("DocsPreferredVersionContextProvider");return e}function b(e){void 0===e&&(e=a.W);const t=(0,o.ht)(e),[n,i]=y(),{preferredVersionName:l}=n[e];return{preferredVersion:t.versions.find((e=>e.name===l))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}},609:(e,t,n)=>{"use strict";n.d(t,{V:()=>s,t:()=>u});var r=n(6540),o=n(9532),a=n(4848);const i=Symbol("EmptyContext"),l=r.createContext(i);function s(e){let{children:t,name:n,items:o}=e;const i=(0,r.useMemo)((()=>n&&o?{name:n,items:o}:null),[n,o]);return(0,a.jsx)(l.Provider,{value:i,children:t})}function u(){const e=(0,r.useContext)(l);if(e===i)throw new o.dV("DocsSidebarProvider");return e}},4718:(e,t,n)=>{"use strict";n.d(t,{d1:()=>C,Nr:()=>f,w8:()=>y,$S:()=>g,cC:()=>p,B5:()=>_,Vd:()=>x,QB:()=>E,fW:()=>S,OF:()=>k,Y:()=>v});var r=n(6540),o=n(6347),a=n(2831),i=n(4070),l=n(9169);function s(e){return Array.from(new Set(e))}var u=n(3886),c=n(3025),d=n(609);function p(e){const t=(0,c.r)();if(!e)return;const n=t.docs[e];if(!n)throw new Error(`no version doc found by id=${e}`);return n}function f(e){return"link"!==e.type||e.unlisted?"category"===e.type?function(e){if(e.href&&!e.linkUnlisted)return e.href;for(const t of e.items){const e=f(t);if(e)return e}}(e):void 0:e.href}function g(){const{pathname:e}=(0,o.zy)(),t=(0,d.t)();if(!t)throw new Error("Unexpected: cant find current sidebar in context");const n=w({sidebarItems:t.items,pathname:e,onlyCategories:!0}).slice(-1)[0];if(!n)throw new Error(`${e} is not associated with a category. useCurrentSidebarCategory() should only be used on category index pages.`);return n}const m=(e,t)=>void 0!==e&&(0,l.ys)(e,t),h=(e,t)=>e.some((e=>y(e,t)));function y(e,t){return"link"===e.type?m(e.href,t):"category"===e.type&&(m(e.href,t)||h(e.items,t))}function b(e,t){switch(e.type){case"category":return y(e,t)||e.items.some((e=>b(e,t)));case"link":return!e.unlisted||y(e,t);default:return!0}}function v(e,t){return(0,r.useMemo)((()=>e.filter((e=>b(e,t)))),[e,t])}function w(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const o=[];return function e(t){for(const a of t)if("category"===a.type&&((0,l.ys)(a.href,n)||e(a.items))||"link"===a.type&&(0,l.ys)(a.href,n)){return r&&"category"!==a.type||o.unshift(a),!0}return!1}(t),o}function k(){const e=(0,d.t)(),{pathname:t}=(0,o.zy)(),n=(0,i.vT)()?.pluginData.breadcrumbs;return!1!==n&&e?w({sidebarItems:e.items,pathname:t}):null}function x(e){const{activeVersion:t}=(0,i.zK)(e),{preferredVersion:n}=(0,u.g1)(e),o=(0,i.r7)(e);return(0,r.useMemo)((()=>s([t,n,o].filter(Boolean))),[t,n,o])}function S(e,t){const n=x(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function E(e,t){const n=x(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${s(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function _(e){let{route:t}=e;const n=(0,o.zy)(),r=(0,c.r)(),i=t.routes,l=i.find((e=>(0,o.B6)(n.pathname,e)));if(!l)return null;const s=l.sidebar,u=s?r.docsSidebars[s]:void 0;return{docElement:(0,a.v)(i),sidebarName:s,sidebarItems:u}}function C(e){return e.filter((e=>!("category"===e.type||"link"===e.type)||!!f(e)))}},3025:(e,t,n)=>{"use strict";n.d(t,{n:()=>l,r:()=>s});var r=n(6540),o=n(9532),a=n(4848);const i=r.createContext(null);function l(e){let{children:t,version:n}=e;return(0,a.jsx)(i.Provider,{value:n,children:t})}function s(){const e=(0,r.useContext)(i);if(null===e)throw new o.dV("DocsVersionProvider");return e}},4070:(e,t,n)=>{"use strict";n.d(t,{zK:()=>m,vT:()=>p,Gy:()=>c,HW:()=>h,ht:()=>d,r7:()=>g,jh:()=>f});var r=n(6347),o=n(4586),a=n(7065);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,o.A)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const l=e=>e.versions.find((e=>e.isLast));function s(e,t){const n=function(e,t){return[...e.versions].sort(((e,t)=>e.path===t.path?0:e.path.includes(t.path)?-1:t.path.includes(e.path)?1:0)).find((e=>!!(0,r.B6)(t,{path:e.path,exact:!1,strict:!1})))}(e,t),o=n?.docs.find((e=>!!(0,r.B6)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:o,alternateDocVersions:o?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(o.id):{}}}const u={},c=()=>i("docusaurus-plugin-content-docs")??u,d=e=>{try{return function(e,t,n){void 0===t&&(t=a.W),void 0===n&&(n={});const r=i(e),o=r?.[t];if(!o&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return o}("docusaurus-plugin-content-docs",e,{failfast:!0})}catch(t){throw new Error("You are using a feature of the Docusaurus docs plugin, but this plugin does not seem to be enabled"+("Default"===e?"":` (pluginId=${e}`),{cause:t})}};function p(e){void 0===e&&(e={});const t=c(),{pathname:n}=(0,r.zy)();return function(e,t,n){void 0===n&&(n={});const o=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.B6)(t,{path:n.path,exact:!1,strict:!1})})),a=o?{pluginId:o[0],pluginData:o[1]}:void 0;if(!a&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return a}(t,n,e)}function f(e){return d(e).versions}function g(e){const t=d(e);return l(t)}function m(e){const t=d(e),{pathname:n}=(0,r.zy)();return s(t,n)}function h(e){const t=d(e),{pathname:n}=(0,r.zy)();return function(e,t){const n=l(e);return{latestDocSuggestion:s(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},6294:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>a});var r=n(5947),o=n.n(r);o().configure({showSpinner:!1});const a={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{o().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){o().done()}}},6134:(e,t,n)=>{"use strict";var r=n(1765),o=n(4784);!function(e){const{themeConfig:{prism:t}}=o.default,{additionalLanguages:r}=t,a=globalThis.Prism;globalThis.Prism=e,r.forEach((e=>{"php"===e&&n(9700),n(8692)(`./prism-${e}`)})),delete globalThis.Prism,void 0!==a&&(globalThis.Prism=e)}(r.My)},1107:(e,t,n)=>{"use strict";n.d(t,{A:()=>c});n(6540);var r=n(4164),o=n(1312),a=n(6342),i=n(8774),l=n(3427);const s={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};var u=n(4848);function c(e){let{as:t,id:n,...c}=e;const d=(0,l.A)(),{navbar:{hideOnScroll:p}}=(0,a.p)();if("h1"===t||!n)return(0,u.jsx)(t,{...c,id:void 0});d.collectAnchor(n);const f=(0,o.T)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof c.children?c.children:n});return(0,u.jsxs)(t,{...c,className:(0,r.A)("anchor",p?s.anchorWithHideOnScrollNavbar:s.anchorWithStickyNavbar,c.className),id:n,children:[c.children,(0,u.jsx)(i.A,{className:"hash-link",to:`#${n}`,"aria-label":f,title:f,children:"\u200b"})]})}},3186:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(6540);const r={iconExternalLink:"iconExternalLink_nPIU"};var o=n(4848);function a(e){let{width:t=13.5,height:n=13.5}=e;return(0,o.jsx)("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r.iconExternalLink,children:(0,o.jsx)("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"})})}},781:(e,t,n)=>{"use strict";n.d(t,{A:()=>ft});var r=n(6540),o=n(4164),a=n(7489),i=n(1003),l=n(6347),s=n(1312),u=n(5062),c=n(4848);const d="__docusaurus_skipToContent_fallback";function p(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){const e=(0,r.useRef)(null),{action:t}=(0,l.W6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&p(t)}),[]);return(0,u.$)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}const g=(0,s.T)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function m(e){const t=e.children??g,{containerRef:n,onClick:r}=f();return(0,c.jsx)("div",{ref:n,role:"region","aria-label":g,children:(0,c.jsx)("a",{...e,href:`#${d}`,onClick:r,children:t})})}var h=n(7559),y=n(4090);const b={skipToContent:"skipToContent_fXgn"};function v(){return(0,c.jsx)(m,{className:b.skipToContent})}var w=n(6342),k=n(5041);function x(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:o=1.2,className:a,...i}=e;return(0,c.jsx)("svg",{viewBox:"0 0 15 15",width:t,height:n,...i,children:(0,c.jsx)("g",{stroke:r,strokeWidth:o,children:(0,c.jsx)("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})})})}const S={closeButton:"closeButton_CVFx"};function E(e){return(0,c.jsx)("button",{type:"button","aria-label":(0,s.T)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,o.A)("clean-btn close",S.closeButton,e.className),children:(0,c.jsx)(x,{width:14,height:14,strokeWidth:3.1})})}const _={content:"content_knG7"};function C(e){const{announcementBar:t}=(0,w.p)(),{content:n}=t;return(0,c.jsx)("div",{...e,className:(0,o.A)(_.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const A={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function T(){const{announcementBar:e}=(0,w.p)(),{isActive:t,close:n}=(0,k.M)();if(!t)return null;const{backgroundColor:r,textColor:o,isCloseable:a}=e;return(0,c.jsxs)("div",{className:A.announcementBar,style:{backgroundColor:r,color:o},role:"banner",children:[a&&(0,c.jsx)("div",{className:A.announcementBarPlaceholder}),(0,c.jsx)(C,{className:A.announcementBarContent}),a&&(0,c.jsx)(E,{onClick:n,className:A.announcementBarClose})]})}var j=n(9876),P=n(3104);var N=n(9532),L=n(5600);const R=r.createContext(null);function O(e){let{children:t}=e;const n=function(){const e=(0,j.M)(),t=(0,L.YL)(),[n,o]=(0,r.useState)(!1),a=null!==t.component,i=(0,N.ZC)(a);return(0,r.useEffect)((()=>{a&&!i&&o(!0)}),[a,i]),(0,r.useEffect)((()=>{a?e.shown||o(!0):o(!1)}),[e.shown,a]),(0,r.useMemo)((()=>[n,o]),[n])}();return(0,c.jsx)(R.Provider,{value:n,children:t})}function D(e){if(e.component){const t=e.component;return(0,c.jsx)(t,{...e.props})}}function I(){const e=(0,r.useContext)(R);if(!e)throw new N.dV("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,o=(0,r.useCallback)((()=>n(!1)),[n]),a=(0,L.YL)();return(0,r.useMemo)((()=>({shown:t,hide:o,content:D(a)})),[o,a,t])}function M(e){let{header:t,primaryMenu:n,secondaryMenu:r}=e;const{shown:a}=I();return(0,c.jsxs)("div",{className:"navbar-sidebar",children:[t,(0,c.jsxs)("div",{className:(0,o.A)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":a}),children:[(0,c.jsx)("div",{className:"navbar-sidebar__item menu",children:n}),(0,c.jsx)("div",{className:"navbar-sidebar__item menu",children:r})]})]})}var F=n(5293),z=n(2303);function B(e){return(0,c.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,c.jsx)("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"})})}function U(e){return(0,c.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,c.jsx)("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"})})}const $={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function q(e){let{className:t,buttonClassName:n,value:r,onChange:a}=e;const i=(0,z.A)(),l=(0,s.T)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===r?(0,s.T)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,s.T)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return(0,c.jsx)("div",{className:(0,o.A)($.toggle,t),children:(0,c.jsxs)("button",{className:(0,o.A)("clean-btn",$.toggleButton,!i&&$.toggleButtonDisabled,n),type:"button",onClick:()=>a("dark"===r?"light":"dark"),disabled:!i,title:l,"aria-label":l,"aria-live":"polite","aria-pressed":"dark"===r?"true":"false",children:[(0,c.jsx)(B,{className:(0,o.A)($.toggleIcon,$.lightToggleIcon)}),(0,c.jsx)(U,{className:(0,o.A)($.toggleIcon,$.darkToggleIcon)})]})})}const H=r.memo(q),G={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function W(e){let{className:t}=e;const n=(0,w.p)().navbar.style,r=(0,w.p)().colorMode.disableSwitch,{colorMode:o,setColorMode:a}=(0,F.G)();return r?null:(0,c.jsx)(H,{className:t,buttonClassName:"dark"===n?G.darkNavbarColorModeToggle:void 0,value:o,onChange:a})}var V=n(3465);function K(){return(0,c.jsx)(V.A,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function Q(){const e=(0,j.M)();return(0,c.jsx)("button",{type:"button","aria-label":(0,s.T)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle(),children:(0,c.jsx)(x,{color:"var(--ifm-color-emphasis-600)"})})}function Y(){return(0,c.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,c.jsx)(K,{}),(0,c.jsx)(W,{className:"margin-right--md"}),(0,c.jsx)(Q,{})]})}var Z=n(8774),X=n(6025),J=n(6654);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(3186);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:o,label:a,html:i,isDropdownLink:l,prependBaseUrlToHref:s,...u}=e;const d=(0,X.Ay)(r),p=(0,X.Ay)(t),f=(0,X.Ay)(o,{forcePrependBaseUrl:!0}),g=a&&o&&!(0,J.A)(o),m=i?{dangerouslySetInnerHTML:{__html:i}}:{children:(0,c.jsxs)(c.Fragment,{children:[a,g&&(0,c.jsx)(te.A,{...l&&{width:12,height:12}})]})};return o?(0,c.jsx)(Z.A,{href:s?f:o,...u,...m}):(0,c.jsx)(Z.A,{to:d,isNavLink:!0,...(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(p)},...u,...m})}function re(e){let{className:t,isDropdownItem:n=!1,...r}=e;const a=(0,c.jsx)(ne,{className:(0,o.A)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n,...r});return n?(0,c.jsx)("li",{children:a}):a}function oe(e){let{className:t,isDropdownItem:n,...r}=e;return(0,c.jsx)("li",{className:"menu__list-item",children:(0,c.jsx)(ne,{className:(0,o.A)("menu__link",t),...r})})}function ae(e){let{mobile:t=!1,position:n,...r}=e;const o=t?oe:re;return(0,c.jsx)(o,{...r,activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")})}var ie=n(1422),le=n(9169),se=n(4586);const ue={dropdownNavbarItemMobile:"dropdownNavbarItemMobile_S0Fm"};function ce(e,t){return e.some((e=>function(e,t){return!!(0,le.ys)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function de(e){let{items:t,position:n,className:a,onClick:i,...l}=e;const s=(0,r.useRef)(null),[u,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{s.current&&!s.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[s]),(0,c.jsxs)("div",{ref:s,className:(0,o.A)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":u}),children:[(0,c.jsx)(ne,{"aria-haspopup":"true","aria-expanded":u,role:"button",href:l.to?void 0:"#",className:(0,o.A)("navbar__link",a),...l,onClick:l.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!u))},children:l.children??l.label}),(0,c.jsx)("ul",{className:"dropdown__menu",children:t.map(((e,t)=>(0,r.createElement)(_e,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function pe(e){let{items:t,className:n,position:a,onClick:i,...s}=e;const u=function(){const{siteConfig:{baseUrl:e}}=(0,se.A)(),{pathname:t}=(0,l.zy)();return t.replace(e,"/")}(),d=ce(t,u),{collapsed:p,toggleCollapsed:f,setCollapsed:g}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&g(!d)}),[u,d,g]),(0,c.jsxs)("li",{className:(0,o.A)("menu__list-item",{"menu__list-item--collapsed":p}),children:[(0,c.jsx)(ne,{role:"button",className:(0,o.A)(ue.dropdownNavbarItemMobile,"menu__link menu__link--sublist menu__link--sublist-caret",n),...s,onClick:e=>{e.preventDefault(),f()},children:s.children??s.label}),(0,c.jsx)(ie.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:p,children:t.map(((e,t)=>(0,r.createElement)(_e,{mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active",...e,key:t})))})]})}function fe(e){let{mobile:t=!1,...n}=e;const r=t?pe:de;return(0,c.jsx)(r,{...n})}var ge=n(2131);function me(e){let{width:t=20,height:n=20,...r}=e;return(0,c.jsx)("svg",{viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0,...r,children:(0,c.jsx)("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"})})}const he="iconLanguage_nlXk";var ye=n(418);const be={navbarSearchContainer:"navbarSearchContainer_Bca1"};function ve(e){let{children:t,className:n}=e;return(0,c.jsx)("div",{className:(0,o.A)(n,be.navbarSearchContainer),children:t})}var we=n(4070),ke=n(4718);var xe=n(3886);function Se(e,t){return t.alternateDocVersions[e.name]??function(e){return e.docs.find((t=>t.id===e.mainDocId))}(e)}const Ee={default:ae,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,queryString:o="",...a}=e;const{i18n:{currentLocale:i,locales:u,localeConfigs:d}}=(0,se.A)(),p=(0,ge.o)(),{search:f,hash:g}=(0,l.zy)(),m=[...n,...u.map((e=>{const n=`${`pathname://${p.createUrl({locale:e,fullyQualified:!1})}`}${f}${g}${o}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...r],h=t?(0,s.T)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return(0,c.jsx)(fe,{...a,mobile:t,label:(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(me,{className:he}),h]}),items:m})},search:function(e){let{mobile:t,className:n}=e;return t?null:(0,c.jsx)(ve,{className:n,children:(0,c.jsx)(ye.A,{})})},dropdown:fe,html:function(e){let{value:t,className:n,mobile:r=!1,isDropdownItem:a=!1}=e;const i=a?"li":"div";return(0,c.jsx)(i,{className:(0,o.A)({navbar__item:!r&&!a,"menu__list-item":r},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:a}=(0,we.zK)(r),i=(0,ke.QB)(t,r),l=a?.path===i?.path;return null===i||i.unlisted&&!l?null:(0,c.jsx)(ae,{exact:!0,...o,isActive:()=>l||!!a?.sidebar&&a.sidebar===i.sidebar,label:n??i.id,to:i.path})},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:a}=(0,we.zK)(r),i=(0,ke.fW)(t,r).link;if(!i)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return(0,c.jsx)(ae,{exact:!0,...o,isActive:()=>a?.sidebar===t,label:n??i.label,to:i.path})},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...o}=e;const a=(0,ke.Vd)(r)[0],i=t??a.label,l=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(a).path;return(0,c.jsx)(ae,{...o,label:i,to:l})},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:o,dropdownItemsAfter:a,...i}=e;const{search:u,hash:d}=(0,l.zy)(),p=(0,we.zK)(n),f=(0,we.jh)(n),{savePreferredVersionName:g}=(0,xe.g1)(n),m=[...o,...f.map((function(e){const t=Se(e,p);return{label:e.label,to:`${t.path}${u}${d}`,isActive:()=>e===p.activeVersion,onClick:()=>g(e.name)}})),...a],h=(0,ke.Vd)(n)[0],y=t&&m.length>1?(0,s.T)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):h.label,b=t&&m.length>1?void 0:Se(h,p).path;return m.length<=1?(0,c.jsx)(ae,{...i,mobile:t,label:y,to:b,isActive:r?()=>!1:void 0}):(0,c.jsx)(fe,{...i,mobile:t,label:y,to:b,items:m,isActive:r?()=>!1:void 0})}};function _e(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=Ee[r];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return(0,c.jsx)(o,{...n})}function Ce(){const e=(0,j.M)(),t=(0,w.p)().navbar.items;return(0,c.jsx)("ul",{className:"menu__list",children:t.map(((t,n)=>(0,r.createElement)(_e,{mobile:!0,...t,onClick:()=>e.toggle(),key:n})))})}function Ae(e){return(0,c.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,c.jsx)(s.A,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)",children:"\u2190 Back to main menu"})})}function Te(){const e=0===(0,w.p)().navbar.items.length,t=I();return(0,c.jsxs)(c.Fragment,{children:[!e&&(0,c.jsx)(Ae,{onClick:()=>t.hide()}),t.content]})}function je(){const e=(0,j.M)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?(0,c.jsx)(M,{header:(0,c.jsx)(Y,{}),primaryMenu:(0,c.jsx)(Ce,{}),secondaryMenu:(0,c.jsx)(Te,{})}):null}const Pe={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Ne(e){return(0,c.jsx)("div",{role:"presentation",...e,className:(0,o.A)("navbar-sidebar__backdrop",e.className)})}function Le(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:a}}=(0,w.p)(),i=(0,j.M)(),{navbarRef:l,isNavbarVisible:d}=function(e){const[t,n]=(0,r.useState)(e),o=(0,r.useRef)(!1),a=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(a.current=e.getBoundingClientRect().height)}),[]);return(0,P.Mq)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=l?n(!1):i+u{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return o.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return(0,c.jsxs)("nav",{ref:l,"aria-label":(0,s.T)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,o.A)("navbar","navbar--fixed-top",n&&[Pe.navbarHideable,!d&&Pe.navbarHidden],{"navbar--dark":"dark"===a,"navbar--primary":"primary"===a,"navbar-sidebar--show":i.shown}),children:[t,(0,c.jsx)(Ne,{onClick:i.toggle}),(0,c.jsx)(je,{})]})}var Re=n(440);const Oe={errorBoundaryError:"errorBoundaryError_a6uf",errorBoundaryFallback:"errorBoundaryFallback_VBag"};function De(e){return(0,c.jsx)("button",{type:"button",...e,children:(0,c.jsx)(s.A,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error",children:"Try again"})})}function Ie(e){let{error:t}=e;const n=(0,Re.rA)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,c.jsx)("p",{className:Oe.errorBoundaryError,children:n})}class Me extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const Fe="right";function ze(e){let{width:t=30,height:n=30,className:r,...o}=e;return(0,c.jsx)("svg",{className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true",...o,children:(0,c.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"})})}function Be(){const{toggle:e,shown:t}=(0,j.M)();return(0,c.jsx)("button",{onClick:e,"aria-label":(0,s.T)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button",children:(0,c.jsx)(ze,{})})}const Ue={colorModeToggle:"colorModeToggle_DEke"};function $e(e){let{items:t}=e;return(0,c.jsx)(c.Fragment,{children:t.map(((e,t)=>(0,c.jsx)(Me,{onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t}),children:(0,c.jsx)(_e,{...e})},t)))})}function qe(e){let{left:t,right:n}=e;return(0,c.jsxs)("div",{className:"navbar__inner",children:[(0,c.jsx)("div",{className:"navbar__items",children:t}),(0,c.jsx)("div",{className:"navbar__items navbar__items--right",children:n})]})}function He(){const e=(0,j.M)(),t=(0,w.p)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??Fe)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return(0,c.jsx)(qe,{left:(0,c.jsxs)(c.Fragment,{children:[!e.disabled&&(0,c.jsx)(Be,{}),(0,c.jsx)(K,{}),(0,c.jsx)($e,{items:n})]}),right:(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)($e,{items:r}),(0,c.jsx)(W,{className:Ue.colorModeToggle}),!o&&(0,c.jsx)(ve,{children:(0,c.jsx)(ye.A,{})})]})})}function Ge(){return(0,c.jsx)(Le,{children:(0,c.jsx)(He,{})})}function We(e){let{item:t}=e;const{to:n,href:r,label:o,prependBaseUrlToHref:a,...i}=t,l=(0,X.Ay)(n),s=(0,X.Ay)(r,{forcePrependBaseUrl:!0});return(0,c.jsxs)(Z.A,{className:"footer__link-item",...r?{href:a?s:r}:{to:l},...i,children:[o,r&&!(0,J.A)(r)&&(0,c.jsx)(te.A,{})]})}function Ve(e){let{item:t}=e;return t.html?(0,c.jsx)("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):(0,c.jsx)("li",{className:"footer__item",children:(0,c.jsx)(We,{item:t})},t.href??t.to)}function Ke(e){let{column:t}=e;return(0,c.jsxs)("div",{className:"col footer__col",children:[(0,c.jsx)("div",{className:"footer__title",children:t.title}),(0,c.jsx)("ul",{className:"footer__items clean-list",children:t.items.map(((e,t)=>(0,c.jsx)(Ve,{item:e},t)))})]})}function Qe(e){let{columns:t}=e;return(0,c.jsx)("div",{className:"row footer__links",children:t.map(((e,t)=>(0,c.jsx)(Ke,{column:e},t)))})}function Ye(){return(0,c.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function Ze(e){let{item:t}=e;return t.html?(0,c.jsx)("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):(0,c.jsx)(We,{item:t})}function Xe(e){let{links:t}=e;return(0,c.jsx)("div",{className:"footer__links text--center",children:(0,c.jsx)("div",{className:"footer__links",children:t.map(((e,n)=>(0,c.jsxs)(r.Fragment,{children:[(0,c.jsx)(Ze,{item:e}),t.length!==n+1&&(0,c.jsx)(Ye,{})]},n)))})})}function Je(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?(0,c.jsx)(Qe,{columns:t}):(0,c.jsx)(Xe,{links:t})}var et=n(1122);const tt={footerLogoLink:"footerLogoLink_BH7S"};function nt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.hH)(),r={light:n(t.src),dark:n(t.srcDark??t.src)};return(0,c.jsx)(et.A,{className:(0,o.A)("footer__logo",t.className),alt:t.alt,sources:r,width:t.width,height:t.height,style:t.style})}function rt(e){let{logo:t}=e;return t.href?(0,c.jsx)(Z.A,{href:t.href,className:tt.footerLogoLink,target:t.target,children:(0,c.jsx)(nt,{logo:t})}):(0,c.jsx)(nt,{logo:t})}function ot(e){let{copyright:t}=e;return(0,c.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function at(e){let{style:t,links:n,logo:r,copyright:a}=e;return(0,c.jsx)("footer",{className:(0,o.A)("footer",{"footer--dark":"dark"===t}),children:(0,c.jsxs)("div",{className:"container container-fluid",children:[n,(r||a)&&(0,c.jsxs)("div",{className:"footer__bottom text--center",children:[r&&(0,c.jsx)("div",{className:"margin-bottom--sm",children:r}),a]})]})})}function it(){const{footer:e}=(0,w.p)();if(!e)return null;const{copyright:t,links:n,logo:r,style:o}=e;return(0,c.jsx)(at,{style:o,links:n&&n.length>0&&(0,c.jsx)(Je,{links:n}),logo:r&&(0,c.jsx)(rt,{logo:r}),copyright:t&&(0,c.jsx)(ot,{copyright:t})})}const lt=r.memo(it),st=(0,N.fM)([F.a,k.o,P.Tv,xe.VQ,i.Jx,function(e){let{children:t}=e;return(0,c.jsx)(L.y_,{children:(0,c.jsx)(j.e,{children:(0,c.jsx)(O,{children:t})})})}]);function ut(e){let{children:t}=e;return(0,c.jsx)(st,{children:t})}var ct=n(1107);function dt(e){let{error:t,tryAgain:n}=e;return(0,c.jsx)("main",{className:"container margin-vert--xl",children:(0,c.jsx)("div",{className:"row",children:(0,c.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,c.jsx)(ct.A,{as:"h1",className:"hero__title",children:(0,c.jsx)(s.A,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed",children:"This page crashed."})}),(0,c.jsx)("div",{className:"margin-vert--lg",children:(0,c.jsx)(De,{onClick:n,className:"button button--primary shadow--lw"})}),(0,c.jsx)("hr",{}),(0,c.jsx)("div",{className:"margin-vert--md",children:(0,c.jsx)(Ie,{error:t})})]})})})}const pt={mainWrapper:"mainWrapper_z2l0"};function ft(e){const{children:t,noFooter:n,wrapperClassName:r,title:l,description:s}=e;return(0,y.J)(),(0,c.jsxs)(ut,{children:[(0,c.jsx)(i.be,{title:l,description:s}),(0,c.jsx)(v,{}),(0,c.jsx)(T,{}),(0,c.jsx)(Ge,{}),(0,c.jsx)("div",{id:d,className:(0,o.A)(h.G.wrapper.main,pt.mainWrapper,r),children:(0,c.jsx)(a.A,{fallback:e=>(0,c.jsx)(dt,{...e}),children:t})}),!n&&(0,c.jsx)(lt,{})]})}},3465:(e,t,n)=>{"use strict";n.d(t,{A:()=>c});n(6540);var r=n(8774),o=n(6025),a=n(4586),i=n(6342),l=n(1122),s=n(4848);function u(e){let{logo:t,alt:n,imageClassName:r}=e;const a={light:(0,o.Ay)(t.src),dark:(0,o.Ay)(t.srcDark||t.src)},i=(0,s.jsx)(l.A,{className:t.className,sources:a,height:t.height,width:t.width,alt:n,style:t.style});return r?(0,s.jsx)("div",{className:r,children:i}):i}function c(e){const{siteConfig:{title:t}}=(0,a.A)(),{navbar:{title:n,logo:l}}=(0,i.p)(),{imageClassName:c,titleClassName:d,...p}=e,f=(0,o.Ay)(l?.href||"/"),g=n?"":t,m=l?.alt??g;return(0,s.jsxs)(r.A,{to:f,...p,...l?.target&&{target:l.target},children:[l&&(0,s.jsx)(u,{logo:l,alt:m,imageClassName:c}),null!=n&&(0,s.jsx)("b",{className:d,children:n})]})}},1463:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(6540);var r=n(5260),o=n(4848);function a(e){let{locale:t,version:n,tag:a}=e;const i=t;return(0,o.jsxs)(r.A,{children:[t&&(0,o.jsx)("meta",{name:"docusaurus_locale",content:t}),n&&(0,o.jsx)("meta",{name:"docusaurus_version",content:n}),a&&(0,o.jsx)("meta",{name:"docusaurus_tag",content:a}),i&&(0,o.jsx)("meta",{name:"docsearch:language",content:i}),n&&(0,o.jsx)("meta",{name:"docsearch:version",content:n}),a&&(0,o.jsx)("meta",{name:"docsearch:docusaurus_tag",content:a})]})}},1122:(e,t,n)=>{"use strict";n.d(t,{A:()=>c});var r=n(6540),o=n(4164),a=n(2303),i=n(5293);const l={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var s=n(4848);function u(e){let{className:t,children:n}=e;const u=(0,a.A)(),{colorMode:c}=(0,i.G)();return(0,s.jsx)(s.Fragment,{children:(u?"dark"===c?["dark"]:["light"]:["light","dark"]).map((e=>{const a=n({theme:e,className:(0,o.A)(t,l.themedComponent,l[`themedComponent--${e}`])});return(0,s.jsx)(r.Fragment,{children:a},e)}))})}function c(e){const{sources:t,className:n,alt:r,...o}=e;return(0,s.jsx)(u,{className:n,children:e=>{let{theme:n,className:a}=e;return(0,s.jsx)("img",{src:t[n],alt:r,className:a,...o})}})}},1422:(e,t,n)=>{"use strict";n.d(t,{N:()=>y,u:()=>u});var r=n(6540),o=n(8193),a=n(205),i=n(3109),l=n(4848);const s="ease-in-out";function u(e){let{initialState:t}=e;const[n,o]=(0,r.useState)(t??!1),a=(0,r.useCallback)((()=>{o((e=>!e))}),[]);return{collapsed:n,setCollapsed:o,toggleCollapsed:a}}const c={display:"none",overflow:"hidden",height:"0px"},d={display:"block",overflow:"visible",height:"auto"};function p(e,t){const n=t?c:d;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function f(e){let{collapsibleRef:t,collapsed:n,animation:o}=e;const a=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){const t=e.scrollHeight,n=o?.duration??function(e){if((0,i.O)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${o?.easing??s}`,height:`${t}px`}}function l(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!a.current)return p(e,n),void(a.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(l(),requestAnimationFrame((()=>{e.style.height=c.height,e.style.overflow=c.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{l()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,o])}function g(e){if(!o.A.canUseDOM)return e?c:d}function m(e){let{as:t="div",collapsed:n,children:o,animation:a,onCollapseTransitionEnd:i,className:s,disableSSRStyle:u}=e;const c=(0,r.useRef)(null);return f({collapsibleRef:c,collapsed:n,animation:a}),(0,l.jsx)(t,{ref:c,style:u?void 0:g(n),onTransitionEnd:e=>{"height"===e.propertyName&&(p(c.current,n),i?.(n))},className:s,children:o})}function h(e){let{collapsed:t,...n}=e;const[o,i]=(0,r.useState)(!t),[s,u]=(0,r.useState)(t);return(0,a.A)((()=>{t||i(!0)}),[t]),(0,a.A)((()=>{o&&u(t)}),[o,t]),o?(0,l.jsx)(m,{...n,collapsed:s}):null}function y(e){let{lazy:t,...n}=e;const r=t?h:m;return(0,l.jsx)(r,{...n})}},5041:(e,t,n)=>{"use strict";n.d(t,{M:()=>m,o:()=>g});var r=n(6540),o=n(2303),a=n(679),i=n(9532),l=n(6342),s=n(4848);const u=(0,a.Wf)("docusaurus.announcement.dismiss"),c=(0,a.Wf)("docusaurus.announcement.id"),d=()=>"true"===u.get(),p=e=>u.set(String(e)),f=r.createContext(null);function g(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,l.p)(),t=(0,o.A)(),[n,a]=(0,r.useState)((()=>!!t&&d()));(0,r.useEffect)((()=>{a(d())}),[]);const i=(0,r.useCallback)((()=>{p(!0),a(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=c.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;c.set(t),r&&p(!1),!r&&d()||a(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return(0,s.jsx)(f.Provider,{value:n,children:t})}function m(){const e=(0,r.useContext)(f);if(!e)throw new i.dV("AnnouncementBarProvider");return e}},5293:(e,t,n)=>{"use strict";n.d(t,{G:()=>y,a:()=>h});var r=n(6540),o=n(8193),a=n(9532),i=n(679),l=n(6342),s=n(4848);const u=r.createContext(void 0),c="theme",d=(0,i.Wf)(c),p={light:"light",dark:"dark"},f=e=>e===p.dark?p.dark:p.light,g=e=>o.A.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),m=e=>{d.set(f(e))};function h(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,l.p)(),[o,a]=(0,r.useState)(g(e));(0,r.useEffect)((()=>{t&&d.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:o=!0}=r;t?(a(t),o&&m(t)):(a(n?window.matchMedia("(prefers-color-scheme: dark)").matches?p.dark:p.light:e),d.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",f(o))}),[o]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==c)return;const t=d.get();null!==t&&i(f(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const s=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||s.current?s.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:o,setColorMode:i,get isDarkTheme(){return o===p.dark},setLightTheme(){i(p.light)},setDarkTheme(){i(p.dark)}})),[o,i])}();return(0,s.jsx)(u.Provider,{value:n,children:t})}function y(){const e=(0,r.useContext)(u);if(null==e)throw new a.dV("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},9876:(e,t,n)=>{"use strict";n.d(t,{e:()=>f,M:()=>g});var r=n(6540),o=n(5600),a=n(4581),i=n(6347),l=n(9532);function s(e){!function(e){const t=(0,i.W6)(),n=(0,l._q)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}var u=n(6342),c=n(4848);const d=r.createContext(void 0);function p(){const e=function(){const e=(0,o.YL)(),{items:t}=(0,u.p)().navbar;return 0===t.length&&!e.component}(),t=(0,a.l)(),n=!e&&"mobile"===t,[i,l]=(0,r.useState)(!1);s((()=>{if(i)return l(!1),!1}));const c=(0,r.useCallback)((()=>{l((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&l(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:c,shown:i})),[e,n,c,i])}function f(e){let{children:t}=e;const n=p();return(0,c.jsx)(d.Provider,{value:n,children:t})}function g(){const e=r.useContext(d);if(void 0===e)throw new l.dV("NavbarMobileSidebarProvider");return e}},5600:(e,t,n)=>{"use strict";n.d(t,{GX:()=>u,YL:()=>s,y_:()=>l});var r=n(6540),o=n(9532),a=n(4848);const i=r.createContext(null);function l(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return(0,a.jsx)(i.Provider,{value:n,children:t})}function s(){const e=(0,r.useContext)(i);if(!e)throw new o.dV("NavbarSecondaryMenuContentProvider");return e[0]}function u(e){let{component:t,props:n}=e;const a=(0,r.useContext)(i);if(!a)throw new o.dV("NavbarSecondaryMenuContentProvider");const[,l]=a,s=(0,o.Be)(n);return(0,r.useEffect)((()=>{l({component:t,props:s})}),[l,t,s]),(0,r.useEffect)((()=>()=>l({component:null,props:null})),[l]),null}},4090:(e,t,n)=>{"use strict";n.d(t,{w:()=>o,J:()=>a});var r=n(6540);const o="navigation-with-keyboard";function a(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(o),"mousedown"===e.type&&document.body.classList.remove(o)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(o),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},4581:(e,t,n)=>{"use strict";n.d(t,{l:()=>l});var r=n(6540),o=n(8193);const a={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function l(e){let{desktopBreakpoint:t=i}=void 0===e?{}:e;const[n,l]=(0,r.useState)((()=>"ssr"));return(0,r.useEffect)((()=>{function e(){l(function(e){if(!o.A.canUseDOM)throw new Error("getWindowSize() should only be called after React hydration");return window.innerWidth>e?a.desktop:a.mobile}(t))}return e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[t]),n}},7559:(e,t,n)=>{"use strict";n.d(t,{G:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",blogAuthorsListPage:"blog-authors-list-page",blogAuthorsPostsPage:"blog-authors-posts-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",unlistedBanner:"theme-unlisted-banner",draftBanner:"theme-draft-banner",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{blogFooterTagsRow:"theme-blog-footer-tags-row",blogFooterEditMetaRow:"theme-blog-footer-edit-meta-row"},pages:{pageFooterEditMetaRow:"theme-pages-footer-edit-meta-row"}}},3109:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{O:()=>r})},1003:(e,t,n)=>{"use strict";n.d(t,{e3:()=>f,be:()=>d,Jx:()=>g});var r=n(6540),o=n(4164),a=n(5260),i=n(3102);function l(){const e=r.useContext(i.o);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var s=n(6025),u=n(4586);var c=n(4848);function d(e){let{title:t,description:n,keywords:r,image:o,children:i}=e;const l=function(e){const{siteConfig:t}=(0,u.A)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}(t),{withBaseUrl:d}=(0,s.hH)(),p=o?d(o,{absolute:!0}):void 0;return(0,c.jsxs)(a.A,{children:[t&&(0,c.jsx)("title",{children:l}),t&&(0,c.jsx)("meta",{property:"og:title",content:l}),n&&(0,c.jsx)("meta",{name:"description",content:n}),n&&(0,c.jsx)("meta",{property:"og:description",content:n}),r&&(0,c.jsx)("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),p&&(0,c.jsx)("meta",{property:"og:image",content:p}),p&&(0,c.jsx)("meta",{name:"twitter:image",content:p}),i]})}const p=r.createContext(void 0);function f(e){let{className:t,children:n}=e;const i=r.useContext(p),l=(0,o.A)(i,t);return(0,c.jsxs)(p.Provider,{value:l,children:[(0,c.jsx)(a.A,{children:(0,c.jsx)("html",{className:l})}),n]})}function g(e){let{children:t}=e;const n=l(),r=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const a=`plugin-id-${n.plugin.id}`;return(0,c.jsx)(f,{className:(0,o.A)(r,a),children:t})}},9532:(e,t,n)=>{"use strict";n.d(t,{Be:()=>u,ZC:()=>l,_q:()=>i,dV:()=>s,fM:()=>c});var r=n(6540),o=n(205),a=n(4848);function i(e){const t=(0,r.useRef)(e);return(0,o.A)((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function l(e){const t=(0,r.useRef)();return(0,o.A)((()=>{t.current=e})),t.current}class s extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function u(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function c(e){return t=>{let{children:n}=t;return(0,a.jsx)(a.Fragment,{children:e.reduceRight(((e,t)=>(0,a.jsx)(t,{children:e})),n)})}}},9169:(e,t,n)=>{"use strict";n.d(t,{Dt:()=>l,ys:()=>i});var r=n(6540),o=n(8328),a=n(4586);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function l(){const{baseUrl:e}=(0,a.A)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function o(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(o).flatMap((e=>e.routes??[])))}(n)}({routes:o.A,baseUrl:e})),[e])}},3104:(e,t,n)=>{"use strict";n.d(t,{Mq:()=>p,Tv:()=>u,gk:()=>f});var r=n(6540),o=n(8193),a=n(2303),i=(n(205),n(9532)),l=n(4848);const s=r.createContext(void 0);function u(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return(0,l.jsx)(s.Provider,{value:n,children:t})}function c(){const e=(0,r.useContext)(s);if(null==e)throw new i.dV("ScrollControllerProvider");return e}const d=()=>o.A.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function p(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=c(),o=(0,r.useRef)(d()),a=(0,i._q)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=d();a(e,o.current),o.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[a,n,...t])}function f(){const e=(0,r.useRef)(null),t=(0,a.A)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const o=document.documentElement.scrollTop;(n&&o>e||!n&&ot&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},679:(e,t,n)=>{"use strict";n.d(t,{Wf:()=>u});n(6540);const r=JSON.parse('{"N":"localStorage","M":""}'),o=r.N;function a(e){let{key:t,oldValue:n,newValue:r,storage:o}=e;if(n===r)return;const a=document.createEvent("StorageEvent");a.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,o),window.dispatchEvent(a)}function i(e){if(void 0===e&&(e=o),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,l||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),l=!0),null}var t}let l=!1;const s={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function u(e,t){const n=`${e}${r.M}`;if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(n);const o=i(t?.persistence);return null===o?s:{get:()=>{try{return o.getItem(n)}catch(e){return console.error(`Docusaurus storage error, can't get key=${n}`,e),null}},set:e=>{try{const t=o.getItem(n);o.setItem(n,e),a({key:n,oldValue:t,newValue:e,storage:o})}catch(t){console.error(`Docusaurus storage error, can't set ${n}=${e}`,t)}},del:()=>{try{const e=o.getItem(n);o.removeItem(n),a({key:n,oldValue:e,newValue:null,storage:o})}catch(e){console.error(`Docusaurus storage error, can't delete key=${n}`,e)}},listen:e=>{try{const t=t=>{t.storageArea===o&&t.key===n&&e(t)};return window.addEventListener("storage",t),()=>window.removeEventListener("storage",t)}catch(t){return console.error(`Docusaurus storage error, can't listen for changes of key=${n}`,t),()=>{}}}}}},2131:(e,t,n)=>{"use strict";n.d(t,{o:()=>i});var r=n(4586),o=n(6347),a=n(440);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:l}}=(0,r.A)(),{pathname:s}=(0,o.zy)(),u=(0,a.Ks)(s,{trailingSlash:n,baseUrl:e}),c=l===i?e:e.replace(`/${l}/`,"/"),d=u.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===i?`${c}`:`${c}${e}/`}(n)}${d}`}}}},5062:(e,t,n)=>{"use strict";n.d(t,{$:()=>i});var r=n(6540),o=n(6347),a=n(9532);function i(e){const t=(0,o.zy)(),n=(0,a.ZC)(t),i=(0,a._q)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6342:(e,t,n)=>{"use strict";n.d(t,{p:()=>o});var r=n(4586);function o(){return(0,r.A)().siteConfig.themeConfig}},2983:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addTrailingSlash=o,t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[i]=e.split(/[#?]/),l="/"===i||i===r?i:(s=i,u=n,u?o(s):a(s));var s,u;return e.replace(i,l)},t.addLeadingSlash=function(e){return(0,r.addPrefix)(e,"/")},t.removeTrailingSlash=a;const r=n(2566);function o(e){return e.endsWith("/")?e:`${e}/`}function a(e){return(0,r.removeSuffix)(e,"/")}},253:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=function e(t){if(t.cause)return[t,...e(t.cause)];return[t]}},440:(e,t,n)=>{"use strict";t.rA=t.Ks=void 0;const r=n(1635);var o=n(2983);Object.defineProperty(t,"Ks",{enumerable:!0,get:function(){return r.__importDefault(o).default}});var a=n(2566);var i=n(253);Object.defineProperty(t,"rA",{enumerable:!0,get:function(){return i.getErrorCausalChain}})},2566:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addPrefix=function(e,t){return e.startsWith(t)?e:`${t}${e}`},t.removeSuffix=function(e,t){if(""===t)return e;return e.endsWith(t)?e.slice(0,-t.length):e},t.addSuffix=function(e,t){return e.endsWith(t)?e:`${e}${t}`},t.removePrefix=function(e,t){return e.startsWith(t)?e.slice(t.length):e}},1513:(e,t,n)=>{"use strict";n.d(t,{zR:()=>w,TM:()=>C,yJ:()=>f,sC:()=>T,AO:()=>p});var r=n(8168);function o(e){return"/"===e.charAt(0)}function a(e,t){for(var n=t,r=n+1,o=e.length;r=0;p--){var f=i[p];"."===f?a(i,p):".."===f?(a(i,p),d++):d&&(a(i,p),d--)}if(!u)for(;d--;d)i.unshift("..");!u||""===i[0]||i[0]&&o(i[0])||i.unshift("");var g=i.join("/");return n&&"/"!==g.substr(-1)&&(g+="/"),g};var l=n(1561);function s(e){return"/"===e.charAt(0)?e:"/"+e}function u(e){return"/"===e.charAt(0)?e.substr(1):e}function c(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function p(e){var t=e.pathname,n=e.search,r=e.hash,o=t||"/";return n&&"?"!==n&&(o+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(o+="#"===r.charAt(0)?r:"#"+r),o}function f(e,t,n,o){var a;"string"==typeof e?(a=function(e){var t=e||"/",n="",r="",o=t.indexOf("#");-1!==o&&(r=t.substr(o),t=t.substr(0,o));var a=t.indexOf("?");return-1!==a&&(n=t.substr(a),t=t.substr(0,a)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),a.state=t):(void 0===(a=(0,r.A)({},e)).pathname&&(a.pathname=""),a.search?"?"!==a.search.charAt(0)&&(a.search="?"+a.search):a.search="",a.hash?"#"!==a.hash.charAt(0)&&(a.hash="#"+a.hash):a.hash="",void 0!==t&&void 0===a.state&&(a.state=t));try{a.pathname=decodeURI(a.pathname)}catch(l){throw l instanceof URIError?new URIError('Pathname "'+a.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):l}return n&&(a.key=n),o?a.pathname?"/"!==a.pathname.charAt(0)&&(a.pathname=i(a.pathname,o.pathname)):a.pathname=o.pathname:a.pathname||(a.pathname="/"),a}function g(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,o){if(null!=e){var a="function"==typeof e?e(t,n):e;"string"==typeof a?"function"==typeof r?r(a,o):o(!0):o(!1!==a)}else o(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,o):n.push(o),d({action:r,location:o,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",o=f(e,t,m(),w.location);c.confirmTransitionTo(o,r,n,(function(e){e&&(w.entries[w.index]=o,d({action:r,location:o}))}))},go:v,goBack:function(){v(-1)},goForward:function(){v(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(4363),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},a={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},l={};function s(e){return r.isMemo(e)?i:l[e.$$typeof]||o}l[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[r.Memo]=i;var u=Object.defineProperty,c=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,g=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(g){var o=f(n);o&&o!==g&&e(t,o,r)}var i=c(n);d&&(i=i.concat(d(n)));for(var l=s(t),m=s(n),h=0;h{"use strict";e.exports=function(e,t,n,r,o,a,i,l){if(!e){var s;if(void 0===t)s=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var u=[n,r,o,a,i,l],c=0;(s=new Error(t.replace(/%s/g,(function(){return u[c++]})))).name="Invariant Violation"}throw s.framesToPop=1,s}}},4634:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},119:(e,t,n)=>{"use strict";n.r(t)},1043:(e,t,n)=>{"use strict";n.r(t)},5947:function(e,t,n){var r,o;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function o(e,t,n){return en?n:e}function a(e){return 100*(-1+e)}function i(e,t,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+a(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+a(e)+"%,0)"}:{"margin-left":a(e)+"%"}).transition="all "+t+"ms "+n,o}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=o(e,r.minimum,1),n.status=1===e?null:e;var a=n.render(!t),u=a.querySelector(r.barSelector),c=r.speed,d=r.easing;return a.offsetWidth,l((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(u,i(e,c,d)),1===e?(s(a,{transition:"none",opacity:1}),a.offsetWidth,setTimeout((function(){s(a,{transition:"all "+c+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),c)}),c)):setTimeout(t,c)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*o(Math.random()*t,.1,.95)),t=o(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");c(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var o,i=t.querySelector(r.barSelector),l=e?"-100":a(n.status||0),u=document.querySelector(r.parent);return s(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(o=t.querySelector(r.spinnerSelector))&&f(o),u!=document.body&&c(u,"nprogress-custom-parent"),u.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var l=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),s=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,o=e.length,a=t.charAt(0).toUpperCase()+t.slice(1);o--;)if((r=e[o]+a)in n)return r;return t}function o(e){return e=n(e),t[e]||(t[e]=r(e))}function a(e,t,n){t=o(t),e.style[t]=n}return function(e,t){var n,r,o=arguments;if(2==o.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&a(e,n,r);else a(e,o[1],o[2])}}();function u(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function c(e,t){var n=p(e),r=n+t;u(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=p(e);u(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(o="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=o)},5302:(e,t,n)=>{var r=n(4634);e.exports=f,e.exports.parse=a,e.exports.compile=function(e,t){return l(a(e,t),t)},e.exports.tokensToFunction=l,e.exports.tokensToRegExp=p;var o=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function a(e,t){for(var n,r=[],a=0,i=0,l="",c=t&&t.delimiter||"/";null!=(n=o.exec(e));){var d=n[0],p=n[1],f=n.index;if(l+=e.slice(i,f),i=f+d.length,p)l+=p[1];else{var g=e[i],m=n[2],h=n[3],y=n[4],b=n[5],v=n[6],w=n[7];l&&(r.push(l),l="");var k=null!=m&&null!=g&&g!==m,x="+"===v||"*"===v,S="?"===v||"*"===v,E=n[2]||c,_=y||b;r.push({name:h||a++,prefix:m||"",delimiter:E,optional:S,repeat:x,partial:k,asterisk:!!w,pattern:_?u(_):w?".*":"[^"+s(E)+"]+?"})}}return i{e.exports&&(e.exports={core:{meta:{path:"components/prism-core.js",option:"mandatory"},core:"Core"},themes:{meta:{path:"themes/{id}.css",link:"index.html?theme={id}",exclusive:!0},prism:{title:"Default",option:"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{title:"Okaidia",owner:"ocodia"},"prism-twilight":{title:"Twilight",owner:"remybach"},"prism-coy":{title:"Coy",owner:"tshedor"},"prism-solarizedlight":{title:"Solarized Light",owner:"hectormatos2011 "},"prism-tomorrow":{title:"Tomorrow Night",owner:"Rosey"}},languages:{meta:{path:"components/prism-{id}",noCSS:!0,examplesPath:"examples/prism-{id}",addCheckAll:!0},markup:{title:"Markup",alias:["html","xml","svg","mathml","ssml","atom","rss"],aliasTitles:{html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",atom:"Atom",rss:"RSS"},option:"default"},css:{title:"CSS",option:"default",modify:"markup"},clike:{title:"C-like",option:"default"},javascript:{title:"JavaScript",require:"clike",modify:"markup",optional:"regex",alias:"js",option:"default"},abap:{title:"ABAP",owner:"dellagustin"},abnf:{title:"ABNF",owner:"RunDevelopment"},actionscript:{title:"ActionScript",require:"javascript",modify:"markup",owner:"Golmote"},ada:{title:"Ada",owner:"Lucretia"},agda:{title:"Agda",owner:"xy-ren"},al:{title:"AL",owner:"RunDevelopment"},antlr4:{title:"ANTLR4",alias:"g4",owner:"RunDevelopment"},apacheconf:{title:"Apache Configuration",owner:"GuiTeK"},apex:{title:"Apex",require:["clike","sql"],owner:"RunDevelopment"},apl:{title:"APL",owner:"ngn"},applescript:{title:"AppleScript",owner:"Golmote"},aql:{title:"AQL",owner:"RunDevelopment"},arduino:{title:"Arduino",require:"cpp",alias:"ino",owner:"dkern"},arff:{title:"ARFF",owner:"Golmote"},armasm:{title:"ARM Assembly",alias:"arm-asm",owner:"RunDevelopment"},arturo:{title:"Arturo",alias:"art",optional:["bash","css","javascript","markup","markdown","sql"],owner:"drkameleon"},asciidoc:{alias:"adoc",title:"AsciiDoc",owner:"Golmote"},aspnet:{title:"ASP.NET (C#)",require:["markup","csharp"],owner:"nauzilus"},asm6502:{title:"6502 Assembly",owner:"kzurawel"},asmatmel:{title:"Atmel AVR Assembly",owner:"cerkit"},autohotkey:{title:"AutoHotkey",owner:"aviaryan"},autoit:{title:"AutoIt",owner:"Golmote"},avisynth:{title:"AviSynth",alias:"avs",owner:"Zinfidel"},"avro-idl":{title:"Avro IDL",alias:"avdl",owner:"RunDevelopment"},awk:{title:"AWK",alias:"gawk",aliasTitles:{gawk:"GAWK"},owner:"RunDevelopment"},bash:{title:"Bash",alias:["sh","shell"],aliasTitles:{sh:"Shell",shell:"Shell"},owner:"zeitgeist87"},basic:{title:"BASIC",owner:"Golmote"},batch:{title:"Batch",owner:"Golmote"},bbcode:{title:"BBcode",alias:"shortcode",aliasTitles:{shortcode:"Shortcode"},owner:"RunDevelopment"},bbj:{title:"BBj",owner:"hyyan"},bicep:{title:"Bicep",owner:"johnnyreilly"},birb:{title:"Birb",require:"clike",owner:"Calamity210"},bison:{title:"Bison",require:"c",owner:"Golmote"},bnf:{title:"BNF",alias:"rbnf",aliasTitles:{rbnf:"RBNF"},owner:"RunDevelopment"},bqn:{title:"BQN",owner:"yewscion"},brainfuck:{title:"Brainfuck",owner:"Golmote"},brightscript:{title:"BrightScript",owner:"RunDevelopment"},bro:{title:"Bro",owner:"wayward710"},bsl:{title:"BSL (1C:Enterprise)",alias:"oscript",aliasTitles:{oscript:"OneScript"},owner:"Diversus23"},c:{title:"C",require:"clike",owner:"zeitgeist87"},csharp:{title:"C#",require:"clike",alias:["cs","dotnet"],owner:"mvalipour"},cpp:{title:"C++",require:"c",owner:"zeitgeist87"},cfscript:{title:"CFScript",require:"clike",alias:"cfc",owner:"mjclemente"},chaiscript:{title:"ChaiScript",require:["clike","cpp"],owner:"RunDevelopment"},cil:{title:"CIL",owner:"sbrl"},cilkc:{title:"Cilk/C",require:"c",alias:"cilk-c",owner:"OpenCilk"},cilkcpp:{title:"Cilk/C++",require:"cpp",alias:["cilk-cpp","cilk"],owner:"OpenCilk"},clojure:{title:"Clojure",owner:"troglotit"},cmake:{title:"CMake",owner:"mjrogozinski"},cobol:{title:"COBOL",owner:"RunDevelopment"},coffeescript:{title:"CoffeeScript",require:"javascript",alias:"coffee",owner:"R-osey"},concurnas:{title:"Concurnas",alias:"conc",owner:"jasontatton"},csp:{title:"Content-Security-Policy",owner:"ScottHelme"},cooklang:{title:"Cooklang",owner:"ahue"},coq:{title:"Coq",owner:"RunDevelopment"},crystal:{title:"Crystal",require:"ruby",owner:"MakeNowJust"},"css-extras":{title:"CSS Extras",require:"css",modify:"css",owner:"milesj"},csv:{title:"CSV",owner:"RunDevelopment"},cue:{title:"CUE",owner:"RunDevelopment"},cypher:{title:"Cypher",owner:"RunDevelopment"},d:{title:"D",require:"clike",owner:"Golmote"},dart:{title:"Dart",require:"clike",owner:"Golmote"},dataweave:{title:"DataWeave",owner:"machaval"},dax:{title:"DAX",owner:"peterbud"},dhall:{title:"Dhall",owner:"RunDevelopment"},diff:{title:"Diff",owner:"uranusjr"},django:{title:"Django/Jinja2",require:"markup-templating",alias:"jinja2",owner:"romanvm"},"dns-zone-file":{title:"DNS zone file",owner:"RunDevelopment",alias:"dns-zone"},docker:{title:"Docker",alias:"dockerfile",owner:"JustinBeckwith"},dot:{title:"DOT (Graphviz)",alias:"gv",optional:"markup",owner:"RunDevelopment"},ebnf:{title:"EBNF",owner:"RunDevelopment"},editorconfig:{title:"EditorConfig",owner:"osipxd"},eiffel:{title:"Eiffel",owner:"Conaclos"},ejs:{title:"EJS",require:["javascript","markup-templating"],owner:"RunDevelopment",alias:"eta",aliasTitles:{eta:"Eta"}},elixir:{title:"Elixir",owner:"Golmote"},elm:{title:"Elm",owner:"zwilias"},etlua:{title:"Embedded Lua templating",require:["lua","markup-templating"],owner:"RunDevelopment"},erb:{title:"ERB",require:["ruby","markup-templating"],owner:"Golmote"},erlang:{title:"Erlang",owner:"Golmote"},"excel-formula":{title:"Excel Formula",alias:["xlsx","xls"],owner:"RunDevelopment"},fsharp:{title:"F#",require:"clike",owner:"simonreynolds7"},factor:{title:"Factor",owner:"catb0t"},false:{title:"False",owner:"edukisto"},"firestore-security-rules":{title:"Firestore security rules",require:"clike",owner:"RunDevelopment"},flow:{title:"Flow",require:"javascript",owner:"Golmote"},fortran:{title:"Fortran",owner:"Golmote"},ftl:{title:"FreeMarker Template Language",require:"markup-templating",owner:"RunDevelopment"},gml:{title:"GameMaker Language",alias:"gamemakerlanguage",require:"clike",owner:"LiarOnce"},gap:{title:"GAP (CAS)",owner:"RunDevelopment"},gcode:{title:"G-code",owner:"RunDevelopment"},gdscript:{title:"GDScript",owner:"RunDevelopment"},gedcom:{title:"GEDCOM",owner:"Golmote"},gettext:{title:"gettext",alias:"po",owner:"RunDevelopment"},gherkin:{title:"Gherkin",owner:"hason"},git:{title:"Git",owner:"lgiraudel"},glsl:{title:"GLSL",require:"c",owner:"Golmote"},gn:{title:"GN",alias:"gni",owner:"RunDevelopment"},"linker-script":{title:"GNU Linker Script",alias:"ld",owner:"RunDevelopment"},go:{title:"Go",require:"clike",owner:"arnehormann"},"go-module":{title:"Go module",alias:"go-mod",owner:"RunDevelopment"},gradle:{title:"Gradle",require:"clike",owner:"zeabdelkhalek-badido18"},graphql:{title:"GraphQL",optional:"markdown",owner:"Golmote"},groovy:{title:"Groovy",require:"clike",owner:"robfletcher"},haml:{title:"Haml",require:"ruby",optional:["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],owner:"Golmote"},handlebars:{title:"Handlebars",require:"markup-templating",alias:["hbs","mustache"],aliasTitles:{mustache:"Mustache"},owner:"Golmote"},haskell:{title:"Haskell",alias:"hs",owner:"bholst"},haxe:{title:"Haxe",require:"clike",optional:"regex",owner:"Golmote"},hcl:{title:"HCL",owner:"outsideris"},hlsl:{title:"HLSL",require:"c",owner:"RunDevelopment"},hoon:{title:"Hoon",owner:"matildepark"},http:{title:"HTTP",optional:["csp","css","hpkp","hsts","javascript","json","markup","uri"],owner:"danielgtaylor"},hpkp:{title:"HTTP Public-Key-Pins",owner:"ScottHelme"},hsts:{title:"HTTP Strict-Transport-Security",owner:"ScottHelme"},ichigojam:{title:"IchigoJam",owner:"BlueCocoa"},icon:{title:"Icon",owner:"Golmote"},"icu-message-format":{title:"ICU Message Format",owner:"RunDevelopment"},idris:{title:"Idris",alias:"idr",owner:"KeenS",require:"haskell"},ignore:{title:".ignore",owner:"osipxd",alias:["gitignore","hgignore","npmignore"],aliasTitles:{gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore"}},inform7:{title:"Inform 7",owner:"Golmote"},ini:{title:"Ini",owner:"aviaryan"},io:{title:"Io",owner:"AlesTsurko"},j:{title:"J",owner:"Golmote"},java:{title:"Java",require:"clike",owner:"sherblot"},javadoc:{title:"JavaDoc",require:["markup","java","javadoclike"],modify:"java",optional:"scala",owner:"RunDevelopment"},javadoclike:{title:"JavaDoc-like",modify:["java","javascript","php"],owner:"RunDevelopment"},javastacktrace:{title:"Java stack trace",owner:"RunDevelopment"},jexl:{title:"Jexl",owner:"czosel"},jolie:{title:"Jolie",require:"clike",owner:"thesave"},jq:{title:"JQ",owner:"RunDevelopment"},jsdoc:{title:"JSDoc",require:["javascript","javadoclike","typescript"],modify:"javascript",optional:["actionscript","coffeescript"],owner:"RunDevelopment"},"js-extras":{title:"JS Extras",require:"javascript",modify:"javascript",optional:["actionscript","coffeescript","flow","n4js","typescript"],owner:"RunDevelopment"},json:{title:"JSON",alias:"webmanifest",aliasTitles:{webmanifest:"Web App Manifest"},owner:"CupOfTea696"},json5:{title:"JSON5",require:"json",owner:"RunDevelopment"},jsonp:{title:"JSONP",require:"json",owner:"RunDevelopment"},jsstacktrace:{title:"JS stack trace",owner:"sbrl"},"js-templates":{title:"JS Templates",require:"javascript",modify:"javascript",optional:["css","css-extras","graphql","markdown","markup","sql"],owner:"RunDevelopment"},julia:{title:"Julia",owner:"cdagnino"},keepalived:{title:"Keepalived Configure",owner:"dev-itsheng"},keyman:{title:"Keyman",owner:"mcdurdin"},kotlin:{title:"Kotlin",alias:["kt","kts"],aliasTitles:{kts:"Kotlin Script"},require:"clike",owner:"Golmote"},kumir:{title:"KuMir (\u041a\u0443\u041c\u0438\u0440)",alias:"kum",owner:"edukisto"},kusto:{title:"Kusto",owner:"RunDevelopment"},latex:{title:"LaTeX",alias:["tex","context"],aliasTitles:{tex:"TeX",context:"ConTeXt"},owner:"japborst"},latte:{title:"Latte",require:["clike","markup-templating","php"],owner:"nette"},less:{title:"Less",require:"css",optional:"css-extras",owner:"Golmote"},lilypond:{title:"LilyPond",require:"scheme",alias:"ly",owner:"RunDevelopment"},liquid:{title:"Liquid",require:"markup-templating",owner:"cinhtau"},lisp:{title:"Lisp",alias:["emacs","elisp","emacs-lisp"],owner:"JuanCaicedo"},livescript:{title:"LiveScript",owner:"Golmote"},llvm:{title:"LLVM IR",owner:"porglezomp"},log:{title:"Log file",optional:"javastacktrace",owner:"RunDevelopment"},lolcode:{title:"LOLCODE",owner:"Golmote"},lua:{title:"Lua",owner:"Golmote"},magma:{title:"Magma (CAS)",owner:"RunDevelopment"},makefile:{title:"Makefile",owner:"Golmote"},markdown:{title:"Markdown",require:"markup",optional:"yaml",alias:"md",owner:"Golmote"},"markup-templating":{title:"Markup templating",require:"markup",owner:"Golmote"},mata:{title:"Mata",owner:"RunDevelopment"},matlab:{title:"MATLAB",owner:"Golmote"},maxscript:{title:"MAXScript",owner:"RunDevelopment"},mel:{title:"MEL",owner:"Golmote"},mermaid:{title:"Mermaid",owner:"RunDevelopment"},metafont:{title:"METAFONT",owner:"LaeriExNihilo"},mizar:{title:"Mizar",owner:"Golmote"},mongodb:{title:"MongoDB",owner:"airs0urce",require:"javascript"},monkey:{title:"Monkey",owner:"Golmote"},moonscript:{title:"MoonScript",alias:"moon",owner:"RunDevelopment"},n1ql:{title:"N1QL",owner:"TMWilds"},n4js:{title:"N4JS",require:"javascript",optional:"jsdoc",alias:"n4jsd",owner:"bsmith-n4"},"nand2tetris-hdl":{title:"Nand To Tetris HDL",owner:"stephanmax"},naniscript:{title:"Naninovel Script",owner:"Elringus",alias:"nani"},nasm:{title:"NASM",owner:"rbmj"},neon:{title:"NEON",owner:"nette"},nevod:{title:"Nevod",owner:"nezaboodka"},nginx:{title:"nginx",owner:"volado"},nim:{title:"Nim",owner:"Golmote"},nix:{title:"Nix",owner:"Golmote"},nsis:{title:"NSIS",owner:"idleberg"},objectivec:{title:"Objective-C",require:"c",alias:"objc",owner:"uranusjr"},ocaml:{title:"OCaml",owner:"Golmote"},odin:{title:"Odin",owner:"edukisto"},opencl:{title:"OpenCL",require:"c",modify:["c","cpp"],owner:"Milania1"},openqasm:{title:"OpenQasm",alias:"qasm",owner:"RunDevelopment"},oz:{title:"Oz",owner:"Golmote"},parigp:{title:"PARI/GP",owner:"Golmote"},parser:{title:"Parser",require:"markup",owner:"Golmote"},pascal:{title:"Pascal",alias:"objectpascal",aliasTitles:{objectpascal:"Object Pascal"},owner:"Golmote"},pascaligo:{title:"Pascaligo",owner:"DefinitelyNotAGoat"},psl:{title:"PATROL Scripting Language",owner:"bertysentry"},pcaxis:{title:"PC-Axis",alias:"px",owner:"RunDevelopment"},peoplecode:{title:"PeopleCode",alias:"pcode",owner:"RunDevelopment"},perl:{title:"Perl",owner:"Golmote"},php:{title:"PHP",require:"markup-templating",owner:"milesj"},phpdoc:{title:"PHPDoc",require:["php","javadoclike"],modify:"php",owner:"RunDevelopment"},"php-extras":{title:"PHP Extras",require:"php",modify:"php",owner:"milesj"},"plant-uml":{title:"PlantUML",alias:"plantuml",owner:"RunDevelopment"},plsql:{title:"PL/SQL",require:"sql",owner:"Golmote"},powerquery:{title:"PowerQuery",alias:["pq","mscript"],owner:"peterbud"},powershell:{title:"PowerShell",owner:"nauzilus"},processing:{title:"Processing",require:"clike",owner:"Golmote"},prolog:{title:"Prolog",owner:"Golmote"},promql:{title:"PromQL",owner:"arendjr"},properties:{title:".properties",owner:"Golmote"},protobuf:{title:"Protocol Buffers",require:"clike",owner:"just-boris"},pug:{title:"Pug",require:["markup","javascript"],optional:["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],owner:"Golmote"},puppet:{title:"Puppet",owner:"Golmote"},pure:{title:"Pure",optional:["c","cpp","fortran"],owner:"Golmote"},purebasic:{title:"PureBasic",require:"clike",alias:"pbfasm",owner:"HeX0R101"},purescript:{title:"PureScript",require:"haskell",alias:"purs",owner:"sriharshachilakapati"},python:{title:"Python",alias:"py",owner:"multipetros"},qsharp:{title:"Q#",require:"clike",alias:"qs",owner:"fedonman"},q:{title:"Q (kdb+ database)",owner:"Golmote"},qml:{title:"QML",require:"javascript",owner:"RunDevelopment"},qore:{title:"Qore",require:"clike",owner:"temnroegg"},r:{title:"R",owner:"Golmote"},racket:{title:"Racket",require:"scheme",alias:"rkt",owner:"RunDevelopment"},cshtml:{title:"Razor C#",alias:"razor",require:["markup","csharp"],optional:["css","css-extras","javascript","js-extras"],owner:"RunDevelopment"},jsx:{title:"React JSX",require:["markup","javascript"],optional:["jsdoc","js-extras","js-templates"],owner:"vkbansal"},tsx:{title:"React TSX",require:["jsx","typescript"]},reason:{title:"Reason",require:"clike",owner:"Golmote"},regex:{title:"Regex",owner:"RunDevelopment"},rego:{title:"Rego",owner:"JordanSh"},renpy:{title:"Ren'py",alias:"rpy",owner:"HyuchiaDiego"},rescript:{title:"ReScript",alias:"res",owner:"vmarcosp"},rest:{title:"reST (reStructuredText)",owner:"Golmote"},rip:{title:"Rip",owner:"ravinggenius"},roboconf:{title:"Roboconf",owner:"Golmote"},robotframework:{title:"Robot Framework",alias:"robot",owner:"RunDevelopment"},ruby:{title:"Ruby",require:"clike",alias:"rb",owner:"samflores"},rust:{title:"Rust",owner:"Golmote"},sas:{title:"SAS",optional:["groovy","lua","sql"],owner:"Golmote"},sass:{title:"Sass (Sass)",require:"css",optional:"css-extras",owner:"Golmote"},scss:{title:"Sass (SCSS)",require:"css",optional:"css-extras",owner:"MoOx"},scala:{title:"Scala",require:"java",owner:"jozic"},scheme:{title:"Scheme",owner:"bacchus123"},"shell-session":{title:"Shell session",require:"bash",alias:["sh-session","shellsession"],owner:"RunDevelopment"},smali:{title:"Smali",owner:"RunDevelopment"},smalltalk:{title:"Smalltalk",owner:"Golmote"},smarty:{title:"Smarty",require:"markup-templating",optional:"php",owner:"Golmote"},sml:{title:"SML",alias:"smlnj",aliasTitles:{smlnj:"SML/NJ"},owner:"RunDevelopment"},solidity:{title:"Solidity (Ethereum)",alias:"sol",require:"clike",owner:"glachaud"},"solution-file":{title:"Solution file",alias:"sln",owner:"RunDevelopment"},soy:{title:"Soy (Closure Template)",require:"markup-templating",owner:"Golmote"},sparql:{title:"SPARQL",require:"turtle",owner:"Triply-Dev",alias:"rq"},"splunk-spl":{title:"Splunk SPL",owner:"RunDevelopment"},sqf:{title:"SQF: Status Quo Function (Arma 3)",require:"clike",owner:"RunDevelopment"},sql:{title:"SQL",owner:"multipetros"},squirrel:{title:"Squirrel",require:"clike",owner:"RunDevelopment"},stan:{title:"Stan",owner:"RunDevelopment"},stata:{title:"Stata Ado",require:["mata","java","python"],owner:"RunDevelopment"},iecst:{title:"Structured Text (IEC 61131-3)",owner:"serhioromano"},stylus:{title:"Stylus",owner:"vkbansal"},supercollider:{title:"SuperCollider",alias:"sclang",owner:"RunDevelopment"},swift:{title:"Swift",owner:"chrischares"},systemd:{title:"Systemd configuration file",owner:"RunDevelopment"},"t4-templating":{title:"T4 templating",owner:"RunDevelopment"},"t4-cs":{title:"T4 Text Templates (C#)",require:["t4-templating","csharp"],alias:"t4",owner:"RunDevelopment"},"t4-vb":{title:"T4 Text Templates (VB)",require:["t4-templating","vbnet"],owner:"RunDevelopment"},tap:{title:"TAP",owner:"isaacs",require:"yaml"},tcl:{title:"Tcl",owner:"PeterChaplin"},tt2:{title:"Template Toolkit 2",require:["clike","markup-templating"],owner:"gflohr"},textile:{title:"Textile",require:"markup",optional:"css",owner:"Golmote"},toml:{title:"TOML",owner:"RunDevelopment"},tremor:{title:"Tremor",alias:["trickle","troy"],owner:"darach",aliasTitles:{trickle:"trickle",troy:"troy"}},turtle:{title:"Turtle",alias:"trig",aliasTitles:{trig:"TriG"},owner:"jakubklimek"},twig:{title:"Twig",require:"markup-templating",owner:"brandonkelly"},typescript:{title:"TypeScript",require:"javascript",optional:"js-templates",alias:"ts",owner:"vkbansal"},typoscript:{title:"TypoScript",alias:"tsconfig",aliasTitles:{tsconfig:"TSConfig"},owner:"dkern"},unrealscript:{title:"UnrealScript",alias:["uscript","uc"],owner:"RunDevelopment"},uorazor:{title:"UO Razor Script",owner:"jaseowns"},uri:{title:"URI",alias:"url",aliasTitles:{url:"URL"},owner:"RunDevelopment"},v:{title:"V",require:"clike",owner:"taggon"},vala:{title:"Vala",require:"clike",optional:"regex",owner:"TemplarVolk"},vbnet:{title:"VB.Net",require:"basic",owner:"Bigsby"},velocity:{title:"Velocity",require:"markup",owner:"Golmote"},verilog:{title:"Verilog",owner:"a-rey"},vhdl:{title:"VHDL",owner:"a-rey"},vim:{title:"vim",owner:"westonganger"},"visual-basic":{title:"Visual Basic",alias:["vb","vba"],aliasTitles:{vba:"VBA"},owner:"Golmote"},warpscript:{title:"WarpScript",owner:"RunDevelopment"},wasm:{title:"WebAssembly",owner:"Golmote"},"web-idl":{title:"Web IDL",alias:"webidl",owner:"RunDevelopment"},wgsl:{title:"WGSL",owner:"Dr4gonthree"},wiki:{title:"Wiki markup",require:"markup",owner:"Golmote"},wolfram:{title:"Wolfram language",alias:["mathematica","nb","wl"],aliasTitles:{mathematica:"Mathematica",nb:"Mathematica Notebook"},owner:"msollami"},wren:{title:"Wren",owner:"clsource"},xeora:{title:"Xeora",require:"markup",alias:"xeoracube",aliasTitles:{xeoracube:"XeoraCube"},owner:"freakmaxi"},"xml-doc":{title:"XML doc (.net)",require:"markup",modify:["csharp","fsharp","vbnet"],owner:"RunDevelopment"},xojo:{title:"Xojo (REALbasic)",owner:"Golmote"},xquery:{title:"XQuery",require:"markup",owner:"Golmote"},yaml:{title:"YAML",alias:"yml",owner:"hason"},yang:{title:"YANG",owner:"RunDevelopment"},zig:{title:"Zig",owner:"RunDevelopment"}},plugins:{meta:{path:"plugins/{id}/prism-{id}",link:"plugins/{id}/"},"line-highlight":{title:"Line Highlight",description:"Highlights specific lines and/or line ranges."},"line-numbers":{title:"Line Numbers",description:"Line number at the beginning of code lines.",owner:"kuba-kubula"},"show-invisibles":{title:"Show Invisibles",description:"Show hidden characters such as tabs and line breaks.",optional:["autolinker","data-uri-highlight"]},autolinker:{title:"Autolinker",description:"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},wpd:{title:"WebPlatform Docs",description:'Makes tokens link to WebPlatform.org documentation. The links open in a new tab.'},"custom-class":{title:"Custom Class",description:"This plugin allows you to prefix Prism's default classes (.comment can become .namespace--comment) or replace them with your defined ones (like .editor__comment). You can even add new classes.",owner:"dvkndn",noCSS:!0},"file-highlight":{title:"File Highlight",description:"Fetch external files and highlight them with Prism. Used on the Prism website itself.",noCSS:!0},"show-language":{title:"Show Language",description:"Display the highlighted language in code blocks (inline code does not show the label).",owner:"nauzilus",noCSS:!0,require:"toolbar"},"jsonp-highlight":{title:"JSONP Highlight",description:"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).",noCSS:!0,owner:"nauzilus"},"highlight-keywords":{title:"Highlight Keywords",description:"Adds special CSS classes for each keyword for fine-grained highlighting.",owner:"vkbansal",noCSS:!0},"remove-initial-line-feed":{title:"Remove initial line feed",description:"Removes the initial line feed in code blocks.",owner:"Golmote",noCSS:!0},"inline-color":{title:"Inline color",description:"Adds a small inline preview for colors in style sheets.",require:"css-extras",owner:"RunDevelopment"},previewers:{title:"Previewers",description:"Previewers for angles, colors, gradients, easing and time.",require:"css-extras",owner:"Golmote"},autoloader:{title:"Autoloader",description:"Automatically loads the needed languages to highlight the code blocks.",owner:"Golmote",noCSS:!0},"keep-markup":{title:"Keep Markup",description:"Prevents custom markup from being dropped out during highlighting.",owner:"Golmote",optional:"normalize-whitespace",noCSS:!0},"command-line":{title:"Command Line",description:"Display a command line with a prompt and, optionally, the output/response from the commands.",owner:"chriswells0"},"unescaped-markup":{title:"Unescaped Markup",description:"Write markup without having to escape anything."},"normalize-whitespace":{title:"Normalize Whitespace",description:"Supports multiple operations to normalize whitespace in code blocks.",owner:"zeitgeist87",optional:"unescaped-markup",noCSS:!0},"data-uri-highlight":{title:"Data-URI Highlight",description:"Highlights data-URI contents.",owner:"Golmote",noCSS:!0},toolbar:{title:"Toolbar",description:"Attach a toolbar for plugins to easily register buttons on the top of a code block.",owner:"mAAdhaTTah"},"copy-to-clipboard":{title:"Copy to Clipboard Button",description:"Add a button that copies the code block to the clipboard when clicked.",owner:"mAAdhaTTah",require:"toolbar",noCSS:!0},"download-button":{title:"Download Button",description:"A button in the toolbar of a code block adding a convenient way to download a code file.",owner:"Golmote",require:"toolbar",noCSS:!0},"match-braces":{title:"Match braces",description:"Highlights matching braces.",owner:"RunDevelopment"},"diff-highlight":{title:"Diff Highlight",description:"Highlights the code inside diff blocks.",owner:"RunDevelopment",require:"diff"},"filter-highlight-all":{title:"Filter highlightAll",description:"Filters the elements the highlightAll and highlightAllUnder methods actually highlight.",owner:"RunDevelopment",noCSS:!0},treeview:{title:"Treeview",description:"A language with special styles to highlight file system tree structures.",owner:"Golmote"}}})},8722:(e,t,n)=>{const r=n(6969),o=n(8380),a=new Set;function i(e){void 0===e?e=Object.keys(r.languages).filter((e=>"meta"!=e)):Array.isArray(e)||(e=[e]);const t=[...a,...Object.keys(Prism.languages)];o(r,e,t).load((e=>{if(!(e in r.languages))return void(i.silent||console.warn("Language does not exist: "+e));const t="./prism-"+e;delete n.c[n(3157).resolve(t)],delete Prism.languages[e],n(3157)(t),a.add(e)}))}i.silent=!1,e.exports=i},9700:()=>{!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,o,a){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(o,(function(e){if("function"==typeof a&&!a(e))return e;for(var o,l=i.length;-1!==n.code.indexOf(o=t(r,l));)++l;return i[l]=e,o})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var o=0,a=Object.keys(n.tokenStack);!function i(l){for(var s=0;s=a.length);s++){var u=l[s];if("string"==typeof u||u.content&&"string"==typeof u.content){var c=a[o],d=n.tokenStack[c],p="string"==typeof u?u:u.content,f=t(r,c),g=p.indexOf(f);if(g>-1){++o;var m=p.substring(0,g),h=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),y=p.substring(g+f.length),b=[];m&&b.push.apply(b,i([m])),b.push(h),y&&b.push.apply(b,i([y])),"string"==typeof u?l.splice.apply(l,[s,1].concat(b)):u.content=b}}else u.content&&i(u.content)}return l}(n.tokens)}}}})}(Prism)},8692:(e,t,n)=>{var r={"./":8722};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=8692},3157:(e,t,n)=>{var r={"./":8722};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=3157},8380:e=>{"use strict";var t=function(){var e=function(){};function t(e,t){Array.isArray(e)?e.forEach(t):null!=e&&t(e,0)}function n(e){for(var t={},n=0,r=e.length;n "));var l={},s=e[r];if(s){function u(t){if(!(t in e))throw new Error(r+" depends on an unknown component "+t);if(!(t in l))for(var i in o(t,a),l[t]=!0,n[t])l[i]=!0}t(s.require,u),t(s.optional,u),t(s.modify,u)}n[r]=l,a.pop()}}return function(e){var t=n[e];return t||(o(e,r),t=n[e]),t}}function o(e){for(var t in e)return!0;return!1}return function(a,i,l){var s=function(e){var t={};for(var n in e){var r=e[n];for(var o in r)if("meta"!=o){var a=r[o];t[o]="string"==typeof a?{title:a}:a}}return t}(a),u=function(e){var n;return function(r){if(r in e)return r;if(!n)for(var o in n={},e){var a=e[o];t(a&&a.alias,(function(t){if(t in n)throw new Error(t+" cannot be alias for both "+o+" and "+n[t]);if(t in e)throw new Error(t+" cannot be alias of "+o+" because it is a component.");n[t]=o}))}return n[r]||r}}(s);i=i.map(u),l=(l||[]).map(u);var c=n(i),d=n(l);i.forEach((function e(n){var r=s[n];t(r&&r.require,(function(t){t in d||(c[t]=!0,e(t))}))}));for(var p,f=r(s),g=c;o(g);){for(var m in p={},g){var h=s[m];t(h&&h.modify,(function(e){e in d&&(p[e]=!0)}))}for(var y in d)if(!(y in c))for(var b in f(y))if(b in c){p[y]=!0;break}for(var v in g=p)c[v]=!0}var w={getIds:function(){var e=[];return w.load((function(t){e.push(t)})),e},load:function(t,n){return function(t,n,r,o){var a=o?o.series:void 0,i=o?o.parallel:e,l={},s={};function u(e){if(e in l)return l[e];s[e]=!0;var o,c=[];for(var d in t(e))d in n&&c.push(d);if(0===c.length)o=r(e);else{var p=i(c.map((function(e){var t=u(e);return delete s[e],t})));a?o=a(p,(function(){return r(e)})):r(e)}return l[e]=o}for(var c in n)u(c);var d=[];for(var p in s)d.push(l[p]);return i(d)}(f,c,t,n)}};return w}}();e.exports=t},2694:(e,t,n)=>{"use strict";var r=n(6925);function o(){}function a(){}a.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,a,i){if(i!==r){var l=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:a,resetWarningCache:o};return n.PropTypes=n,n}},5556:(e,t,n)=>{e.exports=n(2694)()},6925:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},2551:(e,t,n)=>{"use strict";var r=n(6540),o=n(9982);function a(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n