sodas-validation-ui 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- .sodas-validation-ui__panel{min-height:0}.sodas-validation-ui__panel[hidden]{display:none}.sodas-validation-ui__toolbar{display:flex;align-items:center;gap:.5rem}.sodas-validation-ui__add-select{min-width:180px}.sodas-validation-ui__sections,.sodas-validation-ui__list{display:flex;flex-direction:column;gap:1rem}.sodas-validation-ui__rule-card{--sodas-validation-ui-font-family: var(--sodas-validation-ui-font-family, inherit);--sodas-validation-ui-font-size: var(--sodas-validation-ui-font-size, inherit)}.sodas-validation-ui__rule-fields-row{overflow-x:auto;padding-bottom:.25rem}.sodas-validation-ui__field{min-width:100px;flex-shrink:0}.sodas-validation-ui__field--checkbox{min-width:auto}.sodas-validation-ui__field--readonly .sodas-validation-ui__field-value{font-size:.875rem;padding:.25rem 0}.sodas-validation-ui__panel .card-title{color:var(--sodas-validation-ui-card-title-color, inherit)}.sodas-validation-ui__section-title-editable{color:var(--sodas-validation-ui-section-title-color, inherit)}.sodas-validation-ui__section-title-editable:hover{background:var(--sodas-validation-ui-bg-hover, rgba(0, 0, 0, .04))}.sodas-validation-ui__assessment-section{padding:1rem 0;border-bottom:1px solid var(--bs-border-color, #dee2e6)}.sodas-validation-ui__assessment-section:last-of-type{border-bottom:none}.sodas-validation-ui__assessment-title{font-size:1.1rem;font-weight:600;color:var(--sodas-validation-ui-section-title-color, inherit)}.sodas-validation-ui__template-row{cursor:pointer}.sodas-validation-ui__template-row:last-child{border-bottom:none!important}.template-editor__rules{border-top-color:var(--sodas-validation-ui-border-color-light, #dee2e6)}.quality-requirement-editor__name-label{font-size:1.25rem;font-weight:600}.quality-requirement-editor__name-input{font-size:1.25rem;font-weight:500}.quality-requirement-editor__nodes,.quality-requirement-editor__node-rules{border-top-color:var(--sodas-validation-ui-border-color-light, #dee2e6)}
1
+ .sodas-validation-ui .btn,.sodas-validation-ui__modal .btn{white-space:nowrap}.sodas-validation-ui__panel{min-height:0}.sodas-validation-ui__panel[hidden]{display:none}.sodas-validation-ui__toolbar{display:flex;align-items:center;gap:.5rem}.sodas-validation-ui__add-select{min-width:180px}.sodas-validation-ui__sections,.sodas-validation-ui__list{display:flex;flex-direction:column;gap:1rem}.sodas-validation-ui__rule-card{--sodas-validation-ui-font-family: var(--sodas-validation-ui-font-family, inherit);--sodas-validation-ui-font-size: var(--sodas-validation-ui-font-size, inherit)}.sodas-validation-ui__rule-fields-row{overflow-x:auto;padding-bottom:.25rem}.sodas-validation-ui__field{min-width:100px;flex-shrink:0}.sodas-validation-ui__field--checkbox{min-width:auto}.sodas-validation-ui__field--readonly .sodas-validation-ui__field-value{font-size:.875rem;padding:.25rem 0}.sodas-validation-ui__panel .card-title{color:var(--sodas-validation-ui-card-title-color, inherit)}.sodas-validation-ui__section-title-editable{color:var(--sodas-validation-ui-section-title-color, inherit)}.sodas-validation-ui__section-title-editable:hover{background:var(--sodas-validation-ui-bg-hover, rgba(0, 0, 0, .04))}.sodas-validation-ui__assessment-section{padding:1rem 0;border-bottom:1px solid var(--bs-border-color, #dee2e6)}.sodas-validation-ui__assessment-section:last-of-type{border-bottom:none}.sodas-validation-ui__assessment-title{font-size:1.1rem;font-weight:600;color:var(--sodas-validation-ui-section-title-color, inherit)}.sodas-validation-ui__template-row{cursor:pointer}.sodas-validation-ui__template-row:last-child{border-bottom:none!important}.template-editor__rules{border-top-color:var(--sodas-validation-ui-border-color-light, #dee2e6)}.quality-requirement-editor__name-label{font-size:1.25rem;font-weight:600}.quality-requirement-editor__name-input{font-size:1.25rem;font-weight:500}.quality-requirement-editor__nodes,.quality-requirement-editor__node-rules{border-top-color:var(--sodas-validation-ui-border-color-light, #dee2e6)}
@@ -928,12 +928,13 @@ function Ce({ validationRules: e }) {
928
928
  variant: "primary",
929
929
  onClick: Ee,
930
930
  "aria-label": t("saveAsTemplateAria"),
931
- children: t("save")
931
+ children: t("templateSave")
932
932
  }
933
933
  ) }),
934
934
  /* @__PURE__ */ s(
935
935
  I,
936
936
  {
937
+ className: "sodas-validation-ui__modal",
937
938
  show: r,
938
939
  onHide: () => !c && h(!1),
939
940
  centered: !0,
@@ -990,6 +991,7 @@ function Ce({ validationRules: e }) {
990
991
  /* @__PURE__ */ s(
991
992
  I,
992
993
  {
994
+ className: "sodas-validation-ui__modal",
993
995
  show: b,
994
996
  onHide: () => !P && A(!1),
995
997
  centered: !0,
@@ -1 +1 @@
1
- (function(y,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("react/jsx-runtime"),require("react"),require("react-bootstrap"),require("sodas-sdk")):typeof define=="function"&&define.amd?define(["exports","react/jsx-runtime","react","react-bootstrap","sodas-sdk"],e):(y=typeof globalThis<"u"?globalThis:y||self,e(y.SodasValidationUI={},y.jsxRuntime,y.React,y.ReactBootstrap,y.sodasSdk))})(this,(function(y,e,c,i,d){"use strict";const M={en:{byType:"By Type",byColumn:"By Column",append:"Append",set:"Set",column:"Column",columnName:"Column Name",type:"Type",addColumn:"Add column",addRule:"Add rule",selectType:"-- Select type --",noRules:"No rules. Select a type and click Append to add one.",noColumns:'No columns. Click "Add column" to add a column section.',loadFromTemplate:"Load from Template",saveAsTemplate:"Save as Template",save:"Save",saving:"Saving…",templateSave:"Template Save",templateName:"Template name",templateDescription:"Description (optional)",name:"Name",description:"Description (optional)",cancel:"Cancel",search:"Search",searching:"Searching…",loadTemplateSelect:"{{count}} template(s). Select one and choose Append or Set.",noTemplatesFound:"No templates found. Type to search by name (up to 10 results).",searchByTemplateName:"Search by template name",templateNameSearchAria:"Template name search",remove:"Remove",removeColumn:"Remove column",removeRule:"Remove rule",editColumnName:"Edit column name",columnNameAria:"Column name",appendRuleAria:"Append rule",validationRuleTypeAria:"Validation rule type",addColumnSectionAria:"Add column section",loadFromTemplateAria:"Load from template",saveAsTemplateAria:"Save as template",noQualityMetadata:"No quality metadata to display.",other:"Other",validationRulesMustBeArray:"validationRules must be an array",qualityMetadataMustBeArray:"qualityMetadata must be an array"},ko:{byType:"타입별",byColumn:"컬럼별",append:"추가",set:"설정",column:"컬럼",columnName:"컬럼명",type:"타입",addColumn:"컬럼 추가",addRule:"규칙 추가",selectType:"-- 타입 선택 --",noRules:"규칙이 없습니다. 타입을 선택한 뒤 추가를 눌러 주세요.",noColumns:'컬럼이 없습니다. "컬럼 추가"를 눌러 컬럼을 추가하세요.',loadFromTemplate:"템플릿에서 불러오기",saveAsTemplate:"템플릿으로 저장",save:"저장",saving:"저장 중…",templateSave:"템플릿 저장",templateName:"템플릿 이름",templateDescription:"설명 (선택)",name:"이름",description:"설명 (선택)",cancel:"취소",search:"검색",searching:"검색 중…",loadTemplateSelect:"{{count}}개 템플릿. 하나를 선택한 뒤 추가 또는 설정을 선택하세요.",noTemplatesFound:"검색 결과가 없습니다. 이름으로 검색해 보세요 (최대 10건).",searchByTemplateName:"템플릿 이름으로 검색",templateNameSearchAria:"템플릿 이름 검색",remove:"삭제",removeColumn:"컬럼 삭제",removeRule:"규칙 삭제",editColumnName:"컬럼명 편집",columnNameAria:"컬럼명",appendRuleAria:"규칙 추가",validationRuleTypeAria:"검증 규칙 타입",addColumnSectionAria:"컬럼 섹션 추가",loadFromTemplateAria:"템플릿에서 불러오기",saveAsTemplateAria:"템플릿으로 저장",noQualityMetadata:"표시할 품질 메타데이터가 없습니다.",other:"기타",validationRulesMustBeArray:"validationRules는 배열이어야 합니다",qualityMetadataMustBeArray:"qualityMetadata는 배열이어야 합니다"}},S="ko";function W(a,l={}){return!a||typeof a!="string"?a:Object.entries(l).reduce((o,[s,n])=>o.replace(new RegExp(`\\{\\{${s}\\}\\}`,"g"),String(n)),a)}function ve(a=S){const l=M[a]||M[S]||M.en;return(o,s)=>{const n=l[o]??M.en?.[o]??o;return W(n,s)}}const Z=c.createContext({locale:S,setLocale:()=>{},t:ve()});function pe({children:a,locale:l=S}){const[o,s]=c.useState(l),n=c.useMemo(()=>{const t=M[o]||M[S]||M.en;return{locale:o,setLocale:s,t:(r,v)=>{const I=t[r]??M.en?.[r]??r;return W(I,v)}}},[o]);return e.jsx(Z.Provider,{value:n,children:a})}function be(){const a=c.useContext(Z);if(!a)throw new Error("useI18n must be used within I18nProvider");return a}function V(){const a=c.useContext(Z);if(!a?.t){const l=M[S]||M.en;return{locale:S,setLocale:()=>{},t:(o,s)=>{const n=l[o]??M.en?.[o]??o;return W(n,s)}}}return a}function _({label:a,value:l=""}){return e.jsxs("div",{className:"mb-0 sodas-validation-ui__field sodas-validation-ui__field--readonly",children:[e.jsx(i.Form.Label,{className:"text-muted small mb-0",children:a}),e.jsx("div",{className:"sodas-validation-ui__field-value",children:l})]})}const P={[d.VALIDATION_TYPE.DATA_TYPE]:"Data Type",[d.VALIDATION_TYPE.RANGE]:"Range",[d.VALIDATION_TYPE.PATTERN]:"Pattern",[d.VALIDATION_TYPE.UNIQUENESS]:"Uniqueness",[d.VALIDATION_TYPE.CUSTOM]:"Custom",[d.VALIDATION_TYPE.COMPLETENESS]:"Completeness",[d.VALIDATION_TYPE.LENGTH]:"Length",[d.VALIDATION_TYPE.ALLOWED_VALUES]:"Allowed Values",[d.VALIDATION_TYPE.OUTLIER]:"Outlier",[d.VALIDATION_TYPE.STATISTICAL]:"Statistical"},Q={completeness:"Completeness",data_type:"Data Type",uniqueness:"Uniqueness",range:"Range",pattern:"Pattern",length:"Length",allowed_values:"Allowed Values",outlier:"Outlier",statistical:"Statistical",custom:"Custom"},ee=Object.entries(d.COMPARISION_OPERATOR).map(([a,l])=>({value:l,label:a})),Ne=Object.entries(d.CUSTOM_CONDITION_TYPE).map(([a,l])=>({value:l,label:a})),ye=Object.entries(d.OUTLIER_METHOD).map(([a,l])=>({value:l,label:a})),Te=Object.entries(d.EXPECTED_TYPE).map(([a,l])=>({value:l,label:a})),ge=Object.entries(d.DATETIME_FORMAT_TYPE).map(([a,l])=>({value:l,label:a}));function A({label:a,value:l="",type:o="text",onChange:s,options:n,checkbox:t}){return n?e.jsxs(i.Form.Group,{className:"mb-0 sodas-validation-ui__field",children:[e.jsx(i.Form.Label,{children:a}),e.jsx(i.Form.Select,{size:"sm",value:l,onChange:r=>s(r.target.value),"aria-label":a,children:n.map(r=>e.jsx("option",{value:r.value,children:r.label},r.value))})]}):o==="checkbox"||t?e.jsx(i.Form.Group,{className:"mb-0 sodas-validation-ui__field sodas-validation-ui__field--checkbox",children:e.jsx(i.Form.Check,{type:"checkbox",label:a,checked:!!l,onChange:r=>s(r.target.checked),"aria-label":a})}):e.jsxs(i.Form.Group,{className:"mb-0 sodas-validation-ui__field",children:[e.jsx(i.Form.Label,{children:a}),e.jsx(i.Form.Control,{size:"sm",type:o,value:l,onChange:r=>s(r.target.value),"aria-label":a})]})}function _e({rule:a,type:l,forceUpdate:o}){const s=(n,t)=>{typeof n=="function"&&n.call(a,t),o()};switch(l){case d.VALIDATION_TYPE.UNIQUENESS:return e.jsx(A,{label:"Unique",type:"checkbox",value:a.getUnique,onChange:n=>s(a.setUnique,!!n),checkbox:!0});case d.VALIDATION_TYPE.PATTERN:return e.jsx(A,{label:"Pattern",value:a.getPattern??"",onChange:n=>s(a.setPattern,n)});case d.VALIDATION_TYPE.RANGE:return e.jsxs(e.Fragment,{children:[e.jsx(A,{label:"Min value",type:"number",value:String(a.getMinValue??0),onChange:n=>s(a.setMinValue,Number(n)||0)}),e.jsx(A,{label:"Max value",type:"number",value:String(a.getMaxValue??0),onChange:n=>s(a.setMaxValue,Number(n)||0)})]});case d.VALIDATION_TYPE.LENGTH:return e.jsxs(e.Fragment,{children:[e.jsx(A,{label:"Min length",type:"number",value:String(a.getMinLength??0),onChange:n=>s(a.setMinLength,Number(n)||0)}),e.jsx(A,{label:"Max length",type:"number",value:String(a.getMaxLength??0),onChange:n=>s(a.setMaxLength,Number(n)||0)})]});case d.VALIDATION_TYPE.ALLOWED_VALUES:{const n=a.getAllowedValues??[],t=Array.isArray(n)?n.join(", "):"";return e.jsx(A,{label:"Allowed values (comma-separated)",value:t,onChange:r=>s(a.setAllowedValues,r.split(",").map(v=>v.trim()).filter(Boolean))})}case d.VALIDATION_TYPE.COMPLETENESS:return e.jsx(A,{label:"Min completeness",type:"number",value:String(a.getMinCompleteness??0),onChange:n=>s(a.setMinCompleteness,Number(n)||0)});case d.VALIDATION_TYPE.DATA_TYPE:{const n=a.getExpectedType??d.EXPECTED_TYPE.STRING;return e.jsxs(e.Fragment,{children:[e.jsx(A,{label:"Expected type",value:n,options:Te,onChange:t=>s(a.setExpectedType,t)}),n===d.EXPECTED_TYPE.DATETIME&&e.jsx(A,{label:"Datetime format",value:a.getDatetimeFormat??d.DATETIME_FORMAT_TYPE.YYYY_MM_DD_HH_MM_SS,options:ge,onChange:t=>s(a.setDatetimeFormat,t)})]})}case d.VALIDATION_TYPE.OUTLIER:return e.jsxs(e.Fragment,{children:[e.jsx(A,{label:"Method",value:a.getMethod??d.OUTLIER_METHOD.Z_SCORE,options:ye,onChange:n=>s(a.setMethod,n)}),e.jsx(A,{label:"Threshold",type:"number",value:String(a.getThreshold??0),onChange:n=>s(a.setThreshold,Number(n)||0)})]});case d.VALIDATION_TYPE.STATISTICAL:return e.jsxs(e.Fragment,{children:[e.jsx(A,{label:"Check",value:a.getCheck??"",onChange:n=>s(a.setCheck,n)}),e.jsx(A,{label:"Threshold",type:"number",value:String(a.getThreshold??0),onChange:n=>s(a.setThreshold,Number(n)||0)}),e.jsx(A,{label:"Comparison",value:a.getComparision??d.COMPARISION_OPERATOR.EQUAL,options:ee,onChange:n=>s(a.setComparision,n)})]});case d.VALIDATION_TYPE.CUSTOM:{const n=a.getCondition??{};return e.jsxs(e.Fragment,{children:[e.jsx(A,{label:"Condition type",value:n.type??d.CUSTOM_CONDITION_TYPE.ALL,options:Ne,onChange:t=>s(a.setCondition,{...n,type:t})}),e.jsx(A,{label:"Threshold (threholder)",type:"number",value:String(n.threholder??0),onChange:t=>s(a.setCondition,{...n,threholder:Number(t)||0})}),e.jsx(A,{label:"Comparison",value:n.comparision??d.COMPARISION_OPERATOR.EQUAL,options:ee,onChange:t=>s(a.setCondition,{...n,comparision:t})})]})}default:return null}}function L(a,l,o){return a==null?void 0:a[l]??a[o]}function fe({rule:a,type:l}){switch(l??L(a,"getType","type")){case d.VALIDATION_TYPE.UNIQUENESS:case"uniqueness":return e.jsx(_,{label:"Unique",value:L(a,"getUnique","unique")?"Yes":"No"});case d.VALIDATION_TYPE.PATTERN:case"pattern":return e.jsx(_,{label:"Pattern",value:L(a,"getPattern","pattern")??"—"});case d.VALIDATION_TYPE.RANGE:case"range":return e.jsxs(e.Fragment,{children:[e.jsx(_,{label:"Min value",value:String(L(a,"getMinValue","min_value")??"—")}),e.jsx(_,{label:"Max value",value:String(L(a,"getMaxValue","max_value")??"—")})]});case d.VALIDATION_TYPE.LENGTH:case"length":return e.jsxs(e.Fragment,{children:[e.jsx(_,{label:"Min length",value:String(L(a,"getMinLength","min_length")??"—")}),e.jsx(_,{label:"Max length",value:String(L(a,"getMaxLength","max_length")??"—")})]});case d.VALIDATION_TYPE.ALLOWED_VALUES:case"allowed_values":{const s=L(a,"getAllowedValues","allowed_values")??[],n=Array.isArray(s)?s.join(", "):"—";return e.jsx(_,{label:"Allowed values",value:n})}case d.VALIDATION_TYPE.COMPLETENESS:case"completeness":return e.jsx(_,{label:"Min completeness",value:String(L(a,"getMinCompleteness","min_completeness")??"—")});case d.VALIDATION_TYPE.DATA_TYPE:case"data_type":{const s=L(a,"getExpectedType","expected_type")??d.EXPECTED_TYPE.STRING??"string",t=s===(d.EXPECTED_TYPE?.DATETIME??"datetime")?L(a,"getDatetimeFormat","datetime_format")??"—":null;return e.jsxs(e.Fragment,{children:[e.jsx(_,{label:"Expected type",value:s}),t!==null&&e.jsx(_,{label:"Datetime format",value:t})]})}case d.VALIDATION_TYPE.OUTLIER:case"outlier":return e.jsxs(e.Fragment,{children:[e.jsx(_,{label:"Method",value:L(a,"getMethod","method")??"—"}),e.jsx(_,{label:"Threshold",value:String(L(a,"getThreshold","threshold")??"—")})]});case d.VALIDATION_TYPE.STATISTICAL:case"statistical":return e.jsxs(e.Fragment,{children:[e.jsx(_,{label:"Check",value:L(a,"getCheck","check")??"—"}),e.jsx(_,{label:"Threshold",value:String(L(a,"getThreshold","threshold")??"—")}),e.jsx(_,{label:"Comparison",value:L(a,"getComparision","comparision")??"—"})]});case d.VALIDATION_TYPE.CUSTOM:case"custom":{const s=L(a,"getCondition","condition")??{};return e.jsxs(e.Fragment,{children:[e.jsx(_,{label:"Condition type",value:s.type??"—"}),e.jsx(_,{label:"Threshold",value:String(s.threholder??"—")}),e.jsx(_,{label:"Comparison",value:s.comparision??"—"})]})}default:return null}}function $({rule:a,showColumn:l=!0}){const{t:o}=V(),s=a?.getType??a?.type;return e.jsx("div",{className:"sodas-validation-ui__rule-display",children:e.jsxs("div",{className:"d-flex flex-wrap gap-2 align-items-end sodas-validation-ui__rule-fields-row",children:[e.jsxs("div",{className:"d-flex flex-wrap gap-2 sodas-validation-ui__fields",children:[l&&e.jsx(_,{label:o("column"),value:a?.getColumn??a?.column??"—"}),e.jsx(_,{label:o("name"),value:a?.getName??a?.name??"—"})]}),e.jsx("div",{className:"d-flex flex-wrap gap-2 sodas-validation-ui__type-fields",children:e.jsx(fe,{rule:a,type:s})})]})})}function ae({rule:a,index:l,onRemove:o,onCommonChange:s,forceUpdate:n,showColumn:t=!0}){const{t:r}=V(),v=a.getType;return e.jsx(i.Card,{className:"sodas-validation-ui__rule-card",children:e.jsxs(i.Card.Body,{children:[e.jsxs("div",{className:"d-flex justify-content-between align-items-center mb-2",children:[e.jsx(i.Card.Title,{className:"mb-0 fs-6",children:P[v]??v}),e.jsx(i.Button,{variant:"danger",size:"sm",onClick:o,"aria-label":`${r("removeRule")} ${l+1}`,children:r("remove")})]}),e.jsxs("div",{className:"d-flex flex-wrap gap-2 align-items-end sodas-validation-ui__rule-fields-row",children:[e.jsxs("div",{className:"d-flex flex-wrap gap-2 sodas-validation-ui__fields",children:[t&&e.jsx(A,{label:r("column"),value:a.getColumn,onChange:I=>s(a,"column",I)}),e.jsx(A,{label:r("name"),value:a.getName,onChange:I=>s(a,"name",I)})]}),e.jsx("div",{className:"d-flex flex-wrap gap-2 sodas-validation-ui__type-fields",children:e.jsx(_e,{rule:a,type:v,forceUpdate:n})})]})]})})}function Y(a,l){if(!Array.isArray(l))return;const o=a.toValidationRules();l.length=0,l.push(...o)}function Ce(){const[,a]=c.useState(0);return c.useCallback(()=>a(l=>l+1),[])}function le({validationRules:a}){const{t:l}=V(),[o,s]=c.useState(()=>Array.isArray(a)?d.ColumnGroupedValidationRules.fromValidationRules(a):d.ColumnGroupedValidationRules.fromValidationRules([])),n=Ce(),[t,r]=c.useState(0);if(!Array.isArray(a))return e.jsx("div",{className:"alert alert-danger sodas-validation-ui sodas-validation-ui--empty",children:l("validationRulesMustBeArray")});const v=o.getColumnNames(),I=()=>{const u=`New Column ${t+1}`;r(b=>b+1);const g=d.createRule(d.VALIDATION_TYPE.COMPLETENESS);g.setColumn(u),g.setMinCompleteness(1),s(b=>{const C=d.ColumnGroupedValidationRules.fromValidationRules(b.toValidationRules());return C.appendColumn(u,[g]),Y(C,a),C})},T=u=>{s(g=>{const b=d.ColumnGroupedValidationRules.fromValidationRules(g.toValidationRules()),C=b.getColumnNames();return u>=0&&u<C.length&&(b.removeColumn(u),Y(b,a)),b})},O=(u,g)=>{const b=String(g).trim();b!==""&&s(C=>{const h=d.ColumnGroupedValidationRules.fromValidationRules(C.toValidationRules()),w=h.getColumnNames();if(u>=0&&u<w.length)try{h.setColumnName(u,b),Y(h,a)}catch{}return h})},m=(u,g)=>{const b=d.createRule(g);b.setColumn(u),s(C=>{const h=d.ColumnGroupedValidationRules.fromValidationRules(C.toValidationRules());return h.getColumnNames().includes(u)?h.getRules(u).push(b):h.appendColumn(u,[b]),Y(h,a),h})},N=(u,g)=>{s(b=>{const C=d.ColumnGroupedValidationRules.fromValidationRules(b.toValidationRules()),h=C.getRules(u),w=h.indexOf(g);return w!==-1&&(h.splice(w,1),Y(C,a)),C})},f=(u,g,b)=>{g==="column"?u.setColumn(b):g==="name"&&u.setName(b),n()};return e.jsxs("div",{className:"sodas-validation-ui sodas-validation-ui--columned",children:[e.jsx("div",{className:"d-flex mb-3 sodas-validation-ui__toolbar",children:e.jsx(i.Button,{variant:"primary",size:"sm",onClick:I,"aria-label":l("addColumnSectionAria"),children:l("addColumn")})}),e.jsx("div",{className:"sodas-validation-ui__sections",children:v.map((u,g)=>e.jsx(Ae,{columnName:u,columnIndex:g,rules:o.getRules(u),onRenameColumn:O,onRemoveColumn:T,onAddRule:m,onRemoveRule:N,onCommonChange:f,forceUpdate:n},g))}),v.length===0&&e.jsx("p",{className:"text-muted small sodas-validation-ui__empty",children:l("noColumns")})]})}function Ae({columnName:a,columnIndex:l,rules:o,onRenameColumn:s,onRemoveColumn:n,onAddRule:t,onRemoveRule:r,onCommonChange:v,forceUpdate:I}){const{t:T}=V(),[O,m]=c.useState(""),[N,f]=c.useState(a),[u,g]=c.useState(!1);c.useEffect(()=>{f(a)},[a]);const b=()=>{g(!1);const h=N.trim();h!==""&&h!==a?s(l,h):f(a)},C=h=>{h.key==="Enter"&&h.target.blur()};return e.jsxs(i.Card,{className:"mb-3 sodas-validation-ui__section sodas-validation-ui__section--column",children:[e.jsxs(i.Card.Header,{className:"d-flex justify-content-between align-items-start gap-2 flex-wrap",children:[e.jsxs("div",{className:"flex-grow-1 min-w-0",children:[e.jsx(i.Form.Label,{className:"small fw-semibold text-muted mb-1",children:T("columnName")}),u?e.jsx(i.Form.Control,{size:"sm",type:"text",value:N,onChange:h=>f(h.target.value),onBlur:b,onKeyDown:C,"aria-label":T("columnNameAria"),autoFocus:!0}):e.jsx("h5",{className:"mb-0 card-title cursor-pointer rounded p-1 sodas-validation-ui__section-title-editable",onClick:()=>g(!0),onFocus:()=>g(!0),tabIndex:0,role:"button","aria-label":T("editColumnName"),children:a})]}),e.jsx(i.Button,{variant:"danger",size:"sm",onClick:()=>n(l),"aria-label":`${T("removeColumn")} ${a}`,children:T("removeColumn")})]}),e.jsxs(i.Card.Body,{children:[e.jsxs("div",{className:"d-flex align-items-center gap-2 flex-wrap mb-2 sodas-validation-ui__toolbar--inline",children:[e.jsx(i.Form.Label,{className:"mb-0 fw-semibold",children:T("addRule")}),e.jsxs(i.Form.Select,{className:"sodas-validation-ui__add-select",value:O,onChange:h=>m(h.target.value),"aria-label":T("validationRuleTypeAria"),children:[e.jsx("option",{value:"",children:T("selectType")}),Object.entries(P).map(([h,w])=>e.jsx("option",{value:h,children:w},h))]}),e.jsx(i.Button,{variant:"primary",size:"sm",onClick:()=>{O&&(t(a,O),m(""))},disabled:!O,"aria-label":T("appendRuleAria"),children:T("append")})]}),e.jsx("ul",{className:"list-unstyled mb-0 sodas-validation-ui__list",children:o.map((h,w)=>e.jsx("li",{className:"mb-2 sodas-validation-ui__rule",children:e.jsx(ae,{rule:h,index:w,onRemove:()=>r(a,h),onCommonChange:v,forceUpdate:I,showColumn:!1})},w))})]})]})}function Ee(){const[,a]=c.useState(0);return c.useCallback(()=>a(l=>l+1),[])}function se({validationRules:a}){const{t:l}=V(),o=Ee(),[s,n]=c.useState(""),t=m=>{if(!Array.isArray(a))return;const N=d.createRule(m);a.push(N),o()},r=()=>{s&&t(s)},v=m=>{Array.isArray(a)&&(a.splice(m,1),o())},I=(m,N,f)=>{N==="column"?m.setColumn(f):N==="name"&&m.setName(f),o()};if(!Array.isArray(a))return e.jsx("div",{className:"alert alert-danger sodas-validation-ui sodas-validation-ui--empty",children:l("validationRulesMustBeArray")});const T=new Map;a.forEach((m,N)=>{const f=m.getType;T.has(f)||T.set(f,[]),T.get(f).push({rule:m,index:N})});const O=[];return a.forEach(m=>{const N=m.getType;O.includes(N)||O.push(N)}),e.jsxs("div",{className:"sodas-validation-ui sodas-validation-ui--type-based",children:[e.jsxs("div",{className:"d-flex align-items-center gap-2 flex-wrap mb-3 sodas-validation-ui__toolbar",children:[e.jsx(i.Form.Label,{className:"mb-0 fw-semibold",children:l("addRule")}),e.jsxs(i.Form.Select,{className:"sodas-validation-ui__add-select",value:s,onChange:m=>n(m.target.value),"aria-label":l("validationRuleTypeAria"),children:[e.jsx("option",{value:"",children:l("selectType")}),Object.entries(P).map(([m,N])=>e.jsx("option",{value:m,children:N},m))]}),e.jsx(i.Button,{variant:"primary",size:"sm",onClick:r,disabled:!s,"aria-label":l("appendRuleAria"),children:l("append")})]}),e.jsx("div",{className:"sodas-validation-ui__sections",children:O.map(m=>{const N=T.get(m)??[];return e.jsxs("section",{className:"card mb-3 sodas-validation-ui__section",children:[e.jsx("div",{className:"card-header",children:e.jsx("h5",{className:"mb-0 card-title",children:P[m]??m})}),e.jsx("ul",{className:"list-unstyled mb-0 p-2 sodas-validation-ui__list",children:N.map(({rule:f,index:u})=>e.jsx("li",{className:"sodas-validation-ui__rule mb-2",children:e.jsx(ae,{rule:f,index:u,onRemove:()=>v(u),onCommonChange:I,forceUpdate:o,showColumn:!0})},u))})]},m)})}),a.length===0&&e.jsx("p",{className:"text-muted small sodas-validation-ui__empty",children:l("noRules")})]})}const q="type",H="column",Ie=10;function J({validationRules:a}){const{t:l}=V(),[o,s]=c.useState(q),[n,t]=c.useState(0),[r,v]=c.useState(!1),[I,T]=c.useState(""),[O,m]=c.useState(""),[N,f]=c.useState(null),[u,g]=c.useState(!1),[b,C]=c.useState(!1),[h,w]=c.useState(""),[K,ce]=c.useState([]),[je,ue]=c.useState(0),[F,me]=c.useState(!1),[he,R]=c.useState(null),[D,X]=c.useState(null),k=c.useRef(!1),ze=()=>{T(""),m(""),f(null),v(!0)},Ke=async p=>{p.preventDefault(),f(null),g(!0);try{const E=new d.ValidationTemplate;E.name=I,E.description=O,E.validationRules=[...a],await E.createDBRecord(),v(!1)}catch(E){f(E instanceof Error?E.message:String(E))}finally{g(!1)}},Xe=()=>{w(""),ce([]),ue(0),R(null),X(null),C(!0)},G=c.useCallback(async(p=1,E)=>{const Ze=E!==void 0?E:h.trim()||"";me(!0),R(null);try{const x=await d.ValidationTemplate.listDBRecords(p,Ie,d.SortOrder.DESC,Ze||void 0);ce(x.list??[]),ue(x.total??0),X(null)}catch(x){R(x instanceof Error?x.message:String(x))}finally{me(!1)}},[h]);c.useEffect(()=>{b&&(k.current=!0,G(1,""))},[b]),c.useEffect(()=>{if(!b){k.current=!1;return}if(k.current){k.current=!1;return}const p=setTimeout(()=>G(1),300);return()=>clearTimeout(p)},[b,h,G]);const ke=()=>{if(!D)return;const p=D.validationRules??[];a.push(...p),t(E=>E+1),C(!1)},We=()=>{if(!D)return;const p=D.validationRules??[];a.splice(0,a.length,...p),t(E=>E+1),C(!1)};return Array.isArray(a)?e.jsxs("div",{className:"sodas-validation-ui sodas-validation-ui--tabs",children:[e.jsxs("div",{className:"d-flex flex-wrap align-items-center justify-content-between gap-2 border-bottom pb-2 mb-3",children:[e.jsxs(i.Nav,{variant:"tabs",activeKey:o,onSelect:p=>p&&s(p),role:"tablist","aria-label":"Editor mode",className:"flex-grow-1",children:[e.jsx(i.Nav.Item,{children:e.jsx(i.Nav.Link,{eventKey:q,role:"tab","aria-selected":o===q,"aria-controls":"validation-rules-editor-panel-type",id:"validation-rules-editor-tab-type",children:l("byType")})}),e.jsx(i.Nav.Item,{children:e.jsx(i.Nav.Link,{eventKey:H,role:"tab","aria-selected":o===H,"aria-controls":"validation-rules-editor-panel-column",id:"validation-rules-editor-tab-column",children:l("byColumn")})})]}),e.jsx("div",{className:"d-flex align-items-center gap-2 flex-wrap ms-auto",children:e.jsx(i.Button,{variant:"info",size:"sm",onClick:Xe,"aria-label":l("loadFromTemplateAria"),children:l("loadFromTemplate")})})]}),e.jsx("div",{id:"validation-rules-editor-panel-type",role:"tabpanel","aria-labelledby":"validation-rules-editor-tab-type",hidden:o!==q,className:"sodas-validation-ui__panel",children:o===q&&e.jsx(se,{validationRules:a},n)}),e.jsx("div",{id:"validation-rules-editor-panel-column",role:"tabpanel","aria-labelledby":"validation-rules-editor-tab-column",hidden:o!==H,className:"sodas-validation-ui__panel",children:o===H&&e.jsx(le,{validationRules:a},n)}),e.jsx("div",{className:"mt-3 pt-3 border-top d-flex justify-content-end",children:e.jsx(i.Button,{variant:"primary",onClick:ze,"aria-label":l("saveAsTemplateAria"),children:l("save")})}),e.jsxs(i.Modal,{show:r,onHide:()=>!u&&v(!1),centered:!0,children:[e.jsx(i.Modal.Header,{closeButton:!0,children:e.jsx(i.Modal.Title,{children:l("templateSave")})}),e.jsxs(i.Form,{onSubmit:Ke,children:[e.jsxs(i.Modal.Body,{children:[N&&e.jsx("div",{className:"alert alert-danger small mb-3",role:"alert",children:N}),e.jsxs(i.Form.Group,{className:"mb-3",children:[e.jsx(i.Form.Label,{children:l("name")}),e.jsx(i.Form.Control,{type:"text",value:I,onChange:p=>T(p.target.value),placeholder:l("templateName"),"aria-label":l("templateName"),required:!0})]}),e.jsxs(i.Form.Group,{className:"mb-0",children:[e.jsx(i.Form.Label,{children:l("description")}),e.jsx(i.Form.Control,{as:"textarea",rows:3,value:O,onChange:p=>m(p.target.value),placeholder:l("templateDescription"),"aria-label":l("templateDescription")})]})]}),e.jsxs(i.Modal.Footer,{children:[e.jsx(i.Button,{variant:"secondary",onClick:()=>v(!1),disabled:u,children:l("cancel")}),e.jsx(i.Button,{variant:"primary",type:"submit",disabled:u,children:l(u?"saving":"save")})]})]})]}),e.jsxs(i.Modal,{show:b,onHide:()=>!F&&C(!1),centered:!0,size:"lg",children:[e.jsx(i.Modal.Header,{closeButton:!0,children:e.jsx(i.Modal.Title,{children:l("loadFromTemplate")})}),e.jsxs(i.Modal.Body,{children:[he&&e.jsx("div",{className:"alert alert-danger small mb-3",role:"alert",children:he}),e.jsxs("div",{className:"d-flex gap-2 mb-3",children:[e.jsx(i.Form.Control,{type:"text",value:h,onChange:p=>w(p.target.value),placeholder:l("searchByTemplateName"),"aria-label":l("templateNameSearchAria"),onKeyDown:p=>p.key==="Enter"&&(p.preventDefault(),G(1))}),e.jsx(i.Button,{variant:"info",onClick:()=>G(1),disabled:F,children:l(F?"searching":"search")})]}),K.length>0&&e.jsxs(e.Fragment,{children:[e.jsx("p",{className:"small text-muted mb-2",children:l("loadTemplateSelect",{count:je})}),e.jsx("div",{className:"border rounded overflow-auto mb-3",style:{maxHeight:280},children:K.map(p=>e.jsxs("div",{className:`p-2 border-bottom cursor-pointer sodas-validation-ui__template-row ${D===p?"bg-primary bg-opacity-10":""}`,onClick:()=>X(p),onKeyDown:E=>{(E.key==="Enter"||E.key===" ")&&(E.preventDefault(),X(p))},role:"button",tabIndex:0,"aria-pressed":D===p,children:[e.jsx("div",{className:"fw-medium",children:p.name??"(no name)"}),p.description&&e.jsx("div",{className:"small text-muted text-truncate",children:p.description})]},p.iri??p.id??p.name??Math.random()))})]}),K.length===0&&!F&&b&&e.jsx("p",{className:"text-muted small mb-0",children:l("noTemplatesFound")})]}),e.jsxs(i.Modal.Footer,{children:[e.jsx(i.Button,{variant:"secondary",onClick:()=>C(!1),disabled:F,children:l("cancel")}),e.jsx(i.Button,{variant:"primary",onClick:ke,disabled:!D||F,children:l("append")}),e.jsx(i.Button,{variant:"success",onClick:We,disabled:!D||F,children:l("set")})]})]})]}):e.jsx("div",{className:"alert alert-danger sodas-validation-ui sodas-validation-ui--empty",children:"validationRules must be an array"})}function ne({validationRules:a}){if(!Array.isArray(a))return e.jsx("div",{className:"alert alert-danger sodas-validation-ui sodas-validation-ui--empty",children:"validationRules must be an array"});const l=new Map,o=[];return a.forEach(s=>{const t=(s?.getColumn??s?.column??"")||"(no column)";l.has(t)||(l.set(t,[]),o.push(t)),l.get(t).push(s)}),e.jsxs("div",{className:"sodas-validation-ui sodas-validation-ui--columned sodas-validation-ui--viewer",children:[e.jsx("div",{className:"sodas-validation-ui__sections",children:o.map(s=>{const n=l.get(s)??[];return e.jsxs(i.Card,{className:"mb-3 sodas-validation-ui__section sodas-validation-ui__section--column",children:[e.jsx(i.Card.Header,{children:e.jsx("h5",{className:"mb-0 card-title",children:s})}),e.jsx(i.Card.Body,{children:e.jsx("ul",{className:"list-unstyled mb-0 sodas-validation-ui__list",children:n.map((t,r)=>e.jsx("li",{className:"mb-2 sodas-validation-ui__rule",children:e.jsx(i.Card,{className:"sodas-validation-ui__rule-card",children:e.jsx(i.Card.Body,{className:"py-2",children:e.jsx($,{rule:t,showColumn:!1})})})},r))})})]},s)})}),a.length===0&&e.jsx("p",{className:"text-muted small sodas-validation-ui__empty",children:"No validation rules to display."})]})}function Le(a){return P[a]??Q[a]??a}function ie({validationRules:a}){if(!Array.isArray(a))return e.jsx("div",{className:"alert alert-danger sodas-validation-ui sodas-validation-ui--empty",children:"validationRules must be an array"});const l=new Map,o=[];return a.forEach(s=>{const n=s?.getType??s?.type??"unknown";l.has(n)||(l.set(n,[]),o.push(n)),l.get(n).push(s)}),e.jsxs("div",{className:"sodas-validation-ui sodas-validation-ui--type-based sodas-validation-ui--viewer",children:[e.jsx("div",{className:"sodas-validation-ui__sections",children:o.map(s=>{const n=l.get(s)??[];return e.jsxs("section",{className:"card mb-3 sodas-validation-ui__section",children:[e.jsx("div",{className:"card-header",children:e.jsx("h5",{className:"mb-0 card-title",children:Le(s)})}),e.jsx("ul",{className:"list-unstyled mb-0 p-2 sodas-validation-ui__list",children:n.map((t,r)=>e.jsx("li",{className:"sodas-validation-ui__rule mb-2",children:e.jsx(i.Card,{className:"sodas-validation-ui__rule-card",children:e.jsx(i.Card.Body,{className:"py-2",children:e.jsx($,{rule:t,showColumn:!0})})})},r))})]},s)})}),a.length===0&&e.jsx("p",{className:"text-muted small sodas-validation-ui__empty",children:"No validation rules to display."})]})}const U="type",j="column";function Oe({validationRules:a}){const{t:l}=V(),[o,s]=c.useState(U);return Array.isArray(a)?e.jsxs("div",{className:"sodas-validation-ui sodas-validation-ui--tabs sodas-validation-ui--viewer",children:[e.jsx("div",{className:"d-flex flex-wrap align-items-center border-bottom pb-2 mb-3",children:e.jsxs(i.Nav,{variant:"tabs",activeKey:o,onSelect:n=>n&&s(n),role:"tablist","aria-label":"View mode",className:"flex-grow-1",children:[e.jsx(i.Nav.Item,{children:e.jsx(i.Nav.Link,{eventKey:U,role:"tab","aria-selected":o===U,"aria-controls":"validation-rules-viewer-panel-type",id:"validation-rules-viewer-tab-type",children:l("byType")})}),e.jsx(i.Nav.Item,{children:e.jsx(i.Nav.Link,{eventKey:j,role:"tab","aria-selected":o===j,"aria-controls":"validation-rules-viewer-panel-column",id:"validation-rules-viewer-tab-column",children:l("byColumn")})})]})}),e.jsx("div",{id:"validation-rules-viewer-panel-type",role:"tabpanel","aria-labelledby":"validation-rules-viewer-tab-type",hidden:o!==U,className:"sodas-validation-ui__panel",children:o===U&&e.jsx(ie,{validationRules:a})}),e.jsx("div",{id:"validation-rules-viewer-panel-column",role:"tabpanel","aria-labelledby":"validation-rules-viewer-tab-column",hidden:o!==j,className:"sodas-validation-ui__panel",children:o===j&&e.jsx(ne,{validationRules:a})})]}):e.jsx("div",{className:"alert alert-danger sodas-validation-ui sodas-validation-ui--empty",children:l("validationRulesMustBeArray")})}function we(a){return P[a]??Q[a]??a}function Me(a){const l=a?.rule??a,o=typeof a?.score=="number"?a.score:0,s=!!a?.pass;return{rule:l,score:o,pass:s}}function oe({item:a,showColumn:l=!0}){const{rule:o,score:s,pass:n}=Me(a),t=o?.getType??o?.type;return e.jsx(i.Card,{className:"sodas-validation-ui__rule-card sodas-validation-ui__quality-metadata-card",children:e.jsxs(i.Card.Body,{children:[e.jsxs("div",{className:"d-flex justify-content-between align-items-center flex-wrap gap-2 mb-2",children:[e.jsx(i.Card.Title,{className:"mb-0 fs-6",children:we(t)}),e.jsxs("div",{className:"d-flex align-items-center gap-2",children:[e.jsxs("span",{className:"sodas-validation-ui__score",title:"Score",children:["Score: ",e.jsx("strong",{children:Number(s).toPrecision(3)})]}),e.jsx(i.Badge,{bg:n?"success":"danger",className:"sodas-validation-ui__pass-badge",children:n?"Pass":"Fail"})]})]}),e.jsx($,{rule:o,showColumn:l})]})})}function Ve(a){return a?.rule??a}function Se(a){return P[a]??Q[a]??a}function te({qualityMetadata:a}){if(!Array.isArray(a))return e.jsx("div",{className:"alert alert-danger sodas-validation-ui sodas-validation-ui--empty",children:"qualityMetadata must be an array"});const l=new Map,o=[];return a.forEach(s=>{const n=Ve(s),t=n?.getType??n?.type??"unknown";l.has(t)||(l.set(t,[]),o.push(t)),l.get(t).push(s)}),e.jsxs("div",{className:"sodas-validation-ui sodas-validation-ui--type-based sodas-validation-ui--quality-metadata",children:[e.jsx("div",{className:"sodas-validation-ui__sections",children:o.map(s=>{const n=l.get(s)??[];return e.jsxs("section",{className:"card mb-3 sodas-validation-ui__section",children:[e.jsx("div",{className:"card-header",children:e.jsx("h5",{className:"mb-0 card-title",children:Se(s)})}),e.jsx("ul",{className:"list-unstyled mb-0 p-2 sodas-validation-ui__list",children:n.map((t,r)=>e.jsx("li",{className:"sodas-validation-ui__rule mb-2",children:e.jsx(oe,{item:t,showColumn:!0})},r))})]},s)})}),a.length===0&&e.jsx("p",{className:"text-muted small sodas-validation-ui__empty",children:"No quality metadata to display."})]})}function Pe(a){return a?.rule??a}function de({qualityMetadata:a}){if(!Array.isArray(a))return e.jsx("div",{className:"alert alert-danger sodas-validation-ui sodas-validation-ui--empty",children:"qualityMetadata must be an array"});const l=new Map,o=[];return a.forEach(s=>{const n=Pe(s),r=(n?.getColumn??n?.column??"")||"(no column)";l.has(r)||(l.set(r,[]),o.push(r)),l.get(r).push(s)}),e.jsxs("div",{className:"sodas-validation-ui sodas-validation-ui--columned sodas-validation-ui--quality-metadata",children:[e.jsx("div",{className:"sodas-validation-ui__sections",children:o.map(s=>{const n=l.get(s)??[];return e.jsxs(i.Card,{className:"mb-3 sodas-validation-ui__section sodas-validation-ui__section--column",children:[e.jsx(i.Card.Header,{children:e.jsx("h5",{className:"mb-0 card-title",children:s})}),e.jsx(i.Card.Body,{children:e.jsx("ul",{className:"list-unstyled mb-0 sodas-validation-ui__list",children:n.map((t,r)=>e.jsx("li",{className:"mb-2 sodas-validation-ui__rule",children:e.jsx(oe,{item:t,showColumn:!1})},r))})})]},s)})}),a.length===0&&e.jsx("p",{className:"text-muted small sodas-validation-ui__empty",children:"No quality metadata to display."})]})}const z="type",re="column",B="__uncategorized__";function De(a){const l=new Map,o=[];return a.forEach(s=>{const n=s?.assessment_id??s?.assessmentId??B;if(!l.has(n)){const t=s?.assessment_name??s?.assessmentName??(n===B?"Other":n);l.set(n,{assessmentId:n,assessmentName:t,items:[]}),o.push(n)}l.get(n).items.push(s)}),o.map(s=>l.get(s))}function Fe({qualityMetadata:a}){const{t:l}=V(),[o,s]=c.useState(z);if(!Array.isArray(a))return e.jsx("div",{className:"alert alert-danger sodas-validation-ui sodas-validation-ui--empty",children:l("qualityMetadataMustBeArray")});const n=De(a);return e.jsxs("div",{className:"sodas-validation-ui sodas-validation-ui--tabs sodas-validation-ui--quality-metadata-viewer",children:[e.jsx("div",{className:"d-flex flex-wrap align-items-center border-bottom pb-2 mb-3",children:e.jsxs(i.Nav,{variant:"tabs",activeKey:o,onSelect:t=>t&&s(t),role:"tablist","aria-label":"View mode",className:"flex-grow-1",children:[e.jsx(i.Nav.Item,{children:e.jsx(i.Nav.Link,{eventKey:z,role:"tab","aria-selected":o===z,children:l("byType")})}),e.jsx(i.Nav.Item,{children:e.jsx(i.Nav.Link,{eventKey:re,role:"tab","aria-selected":o===re,children:l("byColumn")})})]})}),n.map(({assessmentId:t,assessmentName:r,items:v})=>e.jsxs("section",{className:"sodas-validation-ui__assessment-section mb-4","aria-labelledby":`assessment-header-${t}`,children:[e.jsx("h4",{id:`assessment-header-${t}`,className:"sodas-validation-ui__assessment-title mb-3",children:t===B?l("other"):r}),o===z?e.jsx(te,{qualityMetadata:v}):e.jsx(de,{qualityMetadata:v})]},t)),a.length===0&&e.jsx("p",{className:"text-muted small sodas-validation-ui__empty",children:l("noQualityMetadata")})]})}function xe(){const[,a]=c.useState(0);return c.useCallback(()=>a(l=>l+1),[])}function Ye({template:a}){const l=xe(),o=c.useRef(a);if(o.current=a,a==null||typeof a!="object")return e.jsx("div",{className:"alert alert-danger template-editor template-editor--empty",children:"template must be an object"});const s=o.current;Array.isArray(s.validationRules)||(s.validationRules=[]);const n=T=>{s.name=T.target.value,l()},t=T=>{s.description=T.target.value,l()},r=s.name??"",v=s.description??"",I=s.validationRules;return e.jsxs("div",{className:"template-editor",children:[e.jsxs(i.Form,{className:"template-editor__meta mb-4",children:[e.jsxs(i.Form.Group,{className:"mb-3",children:[e.jsx(i.Form.Label,{children:"Name"}),e.jsx(i.Form.Control,{type:"text",value:r,onChange:n,placeholder:"Template name","aria-label":"Template name"})]}),e.jsxs(i.Form.Group,{className:"mb-3",children:[e.jsx(i.Form.Label,{children:"Description"}),e.jsx(i.Form.Control,{as:"textarea",rows:3,value:v,onChange:t,placeholder:"Template description","aria-label":"Template description"})]})]}),e.jsxs("div",{className:"template-editor__rules pt-3 border-top",children:[e.jsx("h5",{className:"mb-3",children:"Validation Rules"}),e.jsx(J,{validationRules:I})]})]})}function qe(){const[,a]=c.useState(0);return c.useCallback(()=>a(l=>l+1),[])}function Ue({qualityRequirement:a,hook_names:l=[]}){const o=qe(),s=c.useRef(a);if(s.current=a,a==null||typeof a!="object")return e.jsx("div",{className:"alert alert-danger quality-requirement-editor quality-requirement-editor--empty",children:"qualityRequirement must be an object"});const n=s.current;Array.isArray(n.nodes)||(n.nodes=[]);const t=m=>{n.name=m.target.value,o()},r=()=>{n.nodes.push({node_name:"",hook:"",validation_rules:[]}),o()},v=m=>{n.nodes.splice(m,1),o()},I=(m,N,f)=>{const u=n.nodes[m];u&&(u[N]=f,o())},T=n.name??"",O=n.nodes;return e.jsxs("div",{className:"quality-requirement-editor",children:[e.jsx(i.Form,{className:"quality-requirement-editor__meta mb-4",children:e.jsxs(i.Form.Group,{children:[e.jsx(i.Form.Label,{className:"quality-requirement-editor__name-label",children:"Name"}),e.jsx(i.Form.Control,{className:"quality-requirement-editor__name-input",type:"text",value:T,onChange:t,placeholder:"Quality requirement name","aria-label":"Quality requirement name"})]})}),e.jsxs("div",{className:"quality-requirement-editor__nodes pt-3 border-top",children:[e.jsxs("div",{className:"d-flex justify-content-between align-items-center mb-3",children:[e.jsx("h5",{className:"mb-0",children:"Nodes"}),e.jsx(i.Button,{variant:"primary",size:"sm",onClick:r,"aria-label":"Add node",children:"Add node"})]}),O.length===0&&e.jsx("p",{className:"text-muted small quality-requirement-editor__empty-nodes",children:'No nodes. Click "Add node" to add one.'}),e.jsx("ul",{className:"list-unstyled mb-0 quality-requirement-editor__list",children:O.map((m,N)=>e.jsx("li",{className:"quality-requirement-editor__node mb-3",children:e.jsx(Ge,{node:m,index:N,hookNames:l,onRemove:()=>v(N),onFieldChange:(f,u)=>I(N,f,u)})},N))})]})]})}function Ge({node:a,index:l,hookNames:o=[],onRemove:s,onFieldChange:n}){const t=c.useRef(a);t.current=a;const r=t.current;return Array.isArray(r.validation_rules)||(r.validation_rules=[]),e.jsxs(i.Card,{className:"quality-requirement-editor__node-card",children:[e.jsxs(i.Card.Header,{className:"d-flex justify-content-between align-items-center",children:[e.jsxs(i.Card.Title,{className:"mb-0 fs-6",children:["Node ",l+1]}),e.jsx(i.Button,{variant:"danger",size:"sm",onClick:s,"aria-label":`Remove node ${l+1}`,children:"Remove"})]}),e.jsxs(i.Card.Body,{children:[e.jsx(i.Form,{className:"quality-requirement-editor__node-fields mb-3",children:e.jsxs("div",{className:"row g-2",children:[e.jsxs(i.Form.Group,{className:"col-md-6",children:[e.jsx(i.Form.Label,{children:"Node name"}),e.jsx(i.Form.Control,{size:"sm",type:"text",value:r.node_name??"",onChange:v=>n("node_name",v.target.value),placeholder:"node_name","aria-label":"Node name"})]}),e.jsxs(i.Form.Group,{className:"col-md-6",children:[e.jsx(i.Form.Label,{children:"Hook"}),e.jsxs(i.Form.Select,{size:"sm",value:r.hook??"",onChange:v=>n("hook",v.target.value),"aria-label":"Hook",children:[e.jsx("option",{value:"",children:"선택"}),o.map(v=>e.jsx("option",{value:v,children:v},v))]})]})]})}),e.jsxs("div",{className:"quality-requirement-editor__node-rules pt-3 border-top",children:[e.jsx("h6",{className:"mb-2",children:"Validation rules"}),e.jsx(J,{validationRules:r.validation_rules})]})]})]})}function Qe(a){return P[a]??Q[a]??a}function $e({qualityRequirement:a}){if(a==null||typeof a!="object")return e.jsx("div",{className:"alert alert-danger sodas-validation-ui sodas-validation-ui--empty",children:"qualityRequirement must be an object"});const l=a.name??"",o=Array.isArray(a.nodes)?a.nodes:[];return e.jsxs("div",{className:"sodas-validation-ui sodas-validation-ui--quality-requirement-viewer",children:[e.jsx("div",{className:"mb-4",children:e.jsx("h4",{className:"sodas-validation-ui__quality-requirement-name mb-0",children:l||"—"})}),e.jsxs("div",{className:"pt-3 border-top",children:[e.jsx("h5",{className:"mb-3",children:"Nodes"}),o.length===0&&e.jsx("p",{className:"text-muted small mb-0",children:"No nodes."}),e.jsx("ul",{className:"list-unstyled mb-0",children:o.map((s,n)=>e.jsx("li",{className:"mb-3",children:e.jsx(He,{node:s,index:n})},n))})]})]})}function He({node:a,index:l}){const o=a?.node_name??"—",s=a?.hook??"—",n=Array.isArray(a?.validation_rules)?a.validation_rules:[];return e.jsxs(i.Card,{className:"sodas-validation-ui__rule-card",children:[e.jsx(i.Card.Header,{children:e.jsxs(i.Card.Title,{className:"mb-0 fs-6",children:["Node ",l+1]})}),e.jsxs(i.Card.Body,{children:[e.jsxs("div",{className:"d-flex flex-wrap gap-3 mb-3",children:[e.jsx(_,{label:"Node name",value:o}),e.jsx(_,{label:"Hook",value:s})]}),e.jsxs("div",{className:"pt-3 border-top",children:[e.jsx("h6",{className:"mb-2",children:"Validation rules"}),n.length===0?e.jsx("p",{className:"text-muted small mb-0",children:"No validation rules."}):e.jsx("ul",{className:"list-unstyled mb-0 sodas-validation-ui__list",children:n.map((t,r)=>e.jsx("li",{className:"mb-2",children:e.jsx(i.Card,{className:"sodas-validation-ui__rule-card",children:e.jsxs(i.Card.Body,{className:"py-2",children:[e.jsx("div",{className:"mb-1",children:e.jsx("span",{className:"fw-semibold small",children:Qe(t?.getType??t?.type)})}),e.jsx($,{rule:t,showColumn:!0})]})})},r))})]})]})]})}y.ColumnedQualityMetadataViewer=de,y.ColumnedValidationRulesEditor=le,y.ColumnedValidationRulesViewer=ne,y.I18nProvider=pe,y.QualityMetadataViewer=Fe,y.QualityRequirementEditor=Ue,y.QualityRequirementViewer=$e,y.TemplateEditor=Ye,y.TypeBasedQualityMetadataViewer=te,y.TypeBasedValidationRulesEditor=se,y.TypeBasedValidationRulesViewer=ie,y.ValidationRulesEditor=J,y.ValidationRulesViewer=Oe,y.defaultLocale=S,y.translations=M,y.useI18n=be,y.useI18nOptional=V,Object.defineProperty(y,Symbol.toStringTag,{value:"Module"})}));
1
+ (function(y,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("react/jsx-runtime"),require("react"),require("react-bootstrap"),require("sodas-sdk")):typeof define=="function"&&define.amd?define(["exports","react/jsx-runtime","react","react-bootstrap","sodas-sdk"],e):(y=typeof globalThis<"u"?globalThis:y||self,e(y.SodasValidationUI={},y.jsxRuntime,y.React,y.ReactBootstrap,y.sodasSdk))})(this,(function(y,e,c,i,d){"use strict";const M={en:{byType:"By Type",byColumn:"By Column",append:"Append",set:"Set",column:"Column",columnName:"Column Name",type:"Type",addColumn:"Add column",addRule:"Add rule",selectType:"-- Select type --",noRules:"No rules. Select a type and click Append to add one.",noColumns:'No columns. Click "Add column" to add a column section.',loadFromTemplate:"Load from Template",saveAsTemplate:"Save as Template",save:"Save",saving:"Saving…",templateSave:"Template Save",templateName:"Template name",templateDescription:"Description (optional)",name:"Name",description:"Description (optional)",cancel:"Cancel",search:"Search",searching:"Searching…",loadTemplateSelect:"{{count}} template(s). Select one and choose Append or Set.",noTemplatesFound:"No templates found. Type to search by name (up to 10 results).",searchByTemplateName:"Search by template name",templateNameSearchAria:"Template name search",remove:"Remove",removeColumn:"Remove column",removeRule:"Remove rule",editColumnName:"Edit column name",columnNameAria:"Column name",appendRuleAria:"Append rule",validationRuleTypeAria:"Validation rule type",addColumnSectionAria:"Add column section",loadFromTemplateAria:"Load from template",saveAsTemplateAria:"Save as template",noQualityMetadata:"No quality metadata to display.",other:"Other",validationRulesMustBeArray:"validationRules must be an array",qualityMetadataMustBeArray:"qualityMetadata must be an array"},ko:{byType:"타입별",byColumn:"컬럼별",append:"추가",set:"설정",column:"컬럼",columnName:"컬럼명",type:"타입",addColumn:"컬럼 추가",addRule:"규칙 추가",selectType:"-- 타입 선택 --",noRules:"규칙이 없습니다. 타입을 선택한 뒤 추가를 눌러 주세요.",noColumns:'컬럼이 없습니다. "컬럼 추가"를 눌러 컬럼을 추가하세요.',loadFromTemplate:"템플릿에서 불러오기",saveAsTemplate:"템플릿으로 저장",save:"저장",saving:"저장 중…",templateSave:"템플릿 저장",templateName:"템플릿 이름",templateDescription:"설명 (선택)",name:"이름",description:"설명 (선택)",cancel:"취소",search:"검색",searching:"검색 중…",loadTemplateSelect:"{{count}}개 템플릿. 하나를 선택한 뒤 추가 또는 설정을 선택하세요.",noTemplatesFound:"검색 결과가 없습니다. 이름으로 검색해 보세요 (최대 10건).",searchByTemplateName:"템플릿 이름으로 검색",templateNameSearchAria:"템플릿 이름 검색",remove:"삭제",removeColumn:"컬럼 삭제",removeRule:"규칙 삭제",editColumnName:"컬럼명 편집",columnNameAria:"컬럼명",appendRuleAria:"규칙 추가",validationRuleTypeAria:"검증 규칙 타입",addColumnSectionAria:"컬럼 섹션 추가",loadFromTemplateAria:"템플릿에서 불러오기",saveAsTemplateAria:"템플릿으로 저장",noQualityMetadata:"표시할 품질 메타데이터가 없습니다.",other:"기타",validationRulesMustBeArray:"validationRules는 배열이어야 합니다",qualityMetadataMustBeArray:"qualityMetadata는 배열이어야 합니다"}},S="ko";function W(a,l={}){return!a||typeof a!="string"?a:Object.entries(l).reduce((o,[s,n])=>o.replace(new RegExp(`\\{\\{${s}\\}\\}`,"g"),String(n)),a)}function ve(a=S){const l=M[a]||M[S]||M.en;return(o,s)=>{const n=l[o]??M.en?.[o]??o;return W(n,s)}}const Z=c.createContext({locale:S,setLocale:()=>{},t:ve()});function pe({children:a,locale:l=S}){const[o,s]=c.useState(l),n=c.useMemo(()=>{const t=M[o]||M[S]||M.en;return{locale:o,setLocale:s,t:(r,v)=>{const I=t[r]??M.en?.[r]??r;return W(I,v)}}},[o]);return e.jsx(Z.Provider,{value:n,children:a})}function Ne(){const a=c.useContext(Z);if(!a)throw new Error("useI18n must be used within I18nProvider");return a}function V(){const a=c.useContext(Z);if(!a?.t){const l=M[S]||M.en;return{locale:S,setLocale:()=>{},t:(o,s)=>{const n=l[o]??M.en?.[o]??o;return W(n,s)}}}return a}function g({label:a,value:l=""}){return e.jsxs("div",{className:"mb-0 sodas-validation-ui__field sodas-validation-ui__field--readonly",children:[e.jsx(i.Form.Label,{className:"text-muted small mb-0",children:a}),e.jsx("div",{className:"sodas-validation-ui__field-value",children:l})]})}const P={[d.VALIDATION_TYPE.DATA_TYPE]:"Data Type",[d.VALIDATION_TYPE.RANGE]:"Range",[d.VALIDATION_TYPE.PATTERN]:"Pattern",[d.VALIDATION_TYPE.UNIQUENESS]:"Uniqueness",[d.VALIDATION_TYPE.CUSTOM]:"Custom",[d.VALIDATION_TYPE.COMPLETENESS]:"Completeness",[d.VALIDATION_TYPE.LENGTH]:"Length",[d.VALIDATION_TYPE.ALLOWED_VALUES]:"Allowed Values",[d.VALIDATION_TYPE.OUTLIER]:"Outlier",[d.VALIDATION_TYPE.STATISTICAL]:"Statistical"},Q={completeness:"Completeness",data_type:"Data Type",uniqueness:"Uniqueness",range:"Range",pattern:"Pattern",length:"Length",allowed_values:"Allowed Values",outlier:"Outlier",statistical:"Statistical",custom:"Custom"},ee=Object.entries(d.COMPARISION_OPERATOR).map(([a,l])=>({value:l,label:a})),be=Object.entries(d.CUSTOM_CONDITION_TYPE).map(([a,l])=>({value:l,label:a})),ye=Object.entries(d.OUTLIER_METHOD).map(([a,l])=>({value:l,label:a})),Te=Object.entries(d.EXPECTED_TYPE).map(([a,l])=>({value:l,label:a})),_e=Object.entries(d.DATETIME_FORMAT_TYPE).map(([a,l])=>({value:l,label:a}));function A({label:a,value:l="",type:o="text",onChange:s,options:n,checkbox:t}){return n?e.jsxs(i.Form.Group,{className:"mb-0 sodas-validation-ui__field",children:[e.jsx(i.Form.Label,{children:a}),e.jsx(i.Form.Select,{size:"sm",value:l,onChange:r=>s(r.target.value),"aria-label":a,children:n.map(r=>e.jsx("option",{value:r.value,children:r.label},r.value))})]}):o==="checkbox"||t?e.jsx(i.Form.Group,{className:"mb-0 sodas-validation-ui__field sodas-validation-ui__field--checkbox",children:e.jsx(i.Form.Check,{type:"checkbox",label:a,checked:!!l,onChange:r=>s(r.target.checked),"aria-label":a})}):e.jsxs(i.Form.Group,{className:"mb-0 sodas-validation-ui__field",children:[e.jsx(i.Form.Label,{children:a}),e.jsx(i.Form.Control,{size:"sm",type:o,value:l,onChange:r=>s(r.target.value),"aria-label":a})]})}function ge({rule:a,type:l,forceUpdate:o}){const s=(n,t)=>{typeof n=="function"&&n.call(a,t),o()};switch(l){case d.VALIDATION_TYPE.UNIQUENESS:return e.jsx(A,{label:"Unique",type:"checkbox",value:a.getUnique,onChange:n=>s(a.setUnique,!!n),checkbox:!0});case d.VALIDATION_TYPE.PATTERN:return e.jsx(A,{label:"Pattern",value:a.getPattern??"",onChange:n=>s(a.setPattern,n)});case d.VALIDATION_TYPE.RANGE:return e.jsxs(e.Fragment,{children:[e.jsx(A,{label:"Min value",type:"number",value:String(a.getMinValue??0),onChange:n=>s(a.setMinValue,Number(n)||0)}),e.jsx(A,{label:"Max value",type:"number",value:String(a.getMaxValue??0),onChange:n=>s(a.setMaxValue,Number(n)||0)})]});case d.VALIDATION_TYPE.LENGTH:return e.jsxs(e.Fragment,{children:[e.jsx(A,{label:"Min length",type:"number",value:String(a.getMinLength??0),onChange:n=>s(a.setMinLength,Number(n)||0)}),e.jsx(A,{label:"Max length",type:"number",value:String(a.getMaxLength??0),onChange:n=>s(a.setMaxLength,Number(n)||0)})]});case d.VALIDATION_TYPE.ALLOWED_VALUES:{const n=a.getAllowedValues??[],t=Array.isArray(n)?n.join(", "):"";return e.jsx(A,{label:"Allowed values (comma-separated)",value:t,onChange:r=>s(a.setAllowedValues,r.split(",").map(v=>v.trim()).filter(Boolean))})}case d.VALIDATION_TYPE.COMPLETENESS:return e.jsx(A,{label:"Min completeness",type:"number",value:String(a.getMinCompleteness??0),onChange:n=>s(a.setMinCompleteness,Number(n)||0)});case d.VALIDATION_TYPE.DATA_TYPE:{const n=a.getExpectedType??d.EXPECTED_TYPE.STRING;return e.jsxs(e.Fragment,{children:[e.jsx(A,{label:"Expected type",value:n,options:Te,onChange:t=>s(a.setExpectedType,t)}),n===d.EXPECTED_TYPE.DATETIME&&e.jsx(A,{label:"Datetime format",value:a.getDatetimeFormat??d.DATETIME_FORMAT_TYPE.YYYY_MM_DD_HH_MM_SS,options:_e,onChange:t=>s(a.setDatetimeFormat,t)})]})}case d.VALIDATION_TYPE.OUTLIER:return e.jsxs(e.Fragment,{children:[e.jsx(A,{label:"Method",value:a.getMethod??d.OUTLIER_METHOD.Z_SCORE,options:ye,onChange:n=>s(a.setMethod,n)}),e.jsx(A,{label:"Threshold",type:"number",value:String(a.getThreshold??0),onChange:n=>s(a.setThreshold,Number(n)||0)})]});case d.VALIDATION_TYPE.STATISTICAL:return e.jsxs(e.Fragment,{children:[e.jsx(A,{label:"Check",value:a.getCheck??"",onChange:n=>s(a.setCheck,n)}),e.jsx(A,{label:"Threshold",type:"number",value:String(a.getThreshold??0),onChange:n=>s(a.setThreshold,Number(n)||0)}),e.jsx(A,{label:"Comparison",value:a.getComparision??d.COMPARISION_OPERATOR.EQUAL,options:ee,onChange:n=>s(a.setComparision,n)})]});case d.VALIDATION_TYPE.CUSTOM:{const n=a.getCondition??{};return e.jsxs(e.Fragment,{children:[e.jsx(A,{label:"Condition type",value:n.type??d.CUSTOM_CONDITION_TYPE.ALL,options:be,onChange:t=>s(a.setCondition,{...n,type:t})}),e.jsx(A,{label:"Threshold (threholder)",type:"number",value:String(n.threholder??0),onChange:t=>s(a.setCondition,{...n,threholder:Number(t)||0})}),e.jsx(A,{label:"Comparison",value:n.comparision??d.COMPARISION_OPERATOR.EQUAL,options:ee,onChange:t=>s(a.setCondition,{...n,comparision:t})})]})}default:return null}}function L(a,l,o){return a==null?void 0:a[l]??a[o]}function fe({rule:a,type:l}){switch(l??L(a,"getType","type")){case d.VALIDATION_TYPE.UNIQUENESS:case"uniqueness":return e.jsx(g,{label:"Unique",value:L(a,"getUnique","unique")?"Yes":"No"});case d.VALIDATION_TYPE.PATTERN:case"pattern":return e.jsx(g,{label:"Pattern",value:L(a,"getPattern","pattern")??"—"});case d.VALIDATION_TYPE.RANGE:case"range":return e.jsxs(e.Fragment,{children:[e.jsx(g,{label:"Min value",value:String(L(a,"getMinValue","min_value")??"—")}),e.jsx(g,{label:"Max value",value:String(L(a,"getMaxValue","max_value")??"—")})]});case d.VALIDATION_TYPE.LENGTH:case"length":return e.jsxs(e.Fragment,{children:[e.jsx(g,{label:"Min length",value:String(L(a,"getMinLength","min_length")??"—")}),e.jsx(g,{label:"Max length",value:String(L(a,"getMaxLength","max_length")??"—")})]});case d.VALIDATION_TYPE.ALLOWED_VALUES:case"allowed_values":{const s=L(a,"getAllowedValues","allowed_values")??[],n=Array.isArray(s)?s.join(", "):"—";return e.jsx(g,{label:"Allowed values",value:n})}case d.VALIDATION_TYPE.COMPLETENESS:case"completeness":return e.jsx(g,{label:"Min completeness",value:String(L(a,"getMinCompleteness","min_completeness")??"—")});case d.VALIDATION_TYPE.DATA_TYPE:case"data_type":{const s=L(a,"getExpectedType","expected_type")??d.EXPECTED_TYPE.STRING??"string",t=s===(d.EXPECTED_TYPE?.DATETIME??"datetime")?L(a,"getDatetimeFormat","datetime_format")??"—":null;return e.jsxs(e.Fragment,{children:[e.jsx(g,{label:"Expected type",value:s}),t!==null&&e.jsx(g,{label:"Datetime format",value:t})]})}case d.VALIDATION_TYPE.OUTLIER:case"outlier":return e.jsxs(e.Fragment,{children:[e.jsx(g,{label:"Method",value:L(a,"getMethod","method")??"—"}),e.jsx(g,{label:"Threshold",value:String(L(a,"getThreshold","threshold")??"—")})]});case d.VALIDATION_TYPE.STATISTICAL:case"statistical":return e.jsxs(e.Fragment,{children:[e.jsx(g,{label:"Check",value:L(a,"getCheck","check")??"—"}),e.jsx(g,{label:"Threshold",value:String(L(a,"getThreshold","threshold")??"—")}),e.jsx(g,{label:"Comparison",value:L(a,"getComparision","comparision")??"—"})]});case d.VALIDATION_TYPE.CUSTOM:case"custom":{const s=L(a,"getCondition","condition")??{};return e.jsxs(e.Fragment,{children:[e.jsx(g,{label:"Condition type",value:s.type??"—"}),e.jsx(g,{label:"Threshold",value:String(s.threholder??"—")}),e.jsx(g,{label:"Comparison",value:s.comparision??"—"})]})}default:return null}}function $({rule:a,showColumn:l=!0}){const{t:o}=V(),s=a?.getType??a?.type;return e.jsx("div",{className:"sodas-validation-ui__rule-display",children:e.jsxs("div",{className:"d-flex flex-wrap gap-2 align-items-end sodas-validation-ui__rule-fields-row",children:[e.jsxs("div",{className:"d-flex flex-wrap gap-2 sodas-validation-ui__fields",children:[l&&e.jsx(g,{label:o("column"),value:a?.getColumn??a?.column??"—"}),e.jsx(g,{label:o("name"),value:a?.getName??a?.name??"—"})]}),e.jsx("div",{className:"d-flex flex-wrap gap-2 sodas-validation-ui__type-fields",children:e.jsx(fe,{rule:a,type:s})})]})})}function ae({rule:a,index:l,onRemove:o,onCommonChange:s,forceUpdate:n,showColumn:t=!0}){const{t:r}=V(),v=a.getType;return e.jsx(i.Card,{className:"sodas-validation-ui__rule-card",children:e.jsxs(i.Card.Body,{children:[e.jsxs("div",{className:"d-flex justify-content-between align-items-center mb-2",children:[e.jsx(i.Card.Title,{className:"mb-0 fs-6",children:P[v]??v}),e.jsx(i.Button,{variant:"danger",size:"sm",onClick:o,"aria-label":`${r("removeRule")} ${l+1}`,children:r("remove")})]}),e.jsxs("div",{className:"d-flex flex-wrap gap-2 align-items-end sodas-validation-ui__rule-fields-row",children:[e.jsxs("div",{className:"d-flex flex-wrap gap-2 sodas-validation-ui__fields",children:[t&&e.jsx(A,{label:r("column"),value:a.getColumn,onChange:I=>s(a,"column",I)}),e.jsx(A,{label:r("name"),value:a.getName,onChange:I=>s(a,"name",I)})]}),e.jsx("div",{className:"d-flex flex-wrap gap-2 sodas-validation-ui__type-fields",children:e.jsx(ge,{rule:a,type:v,forceUpdate:n})})]})]})})}function Y(a,l){if(!Array.isArray(l))return;const o=a.toValidationRules();l.length=0,l.push(...o)}function Ce(){const[,a]=c.useState(0);return c.useCallback(()=>a(l=>l+1),[])}function le({validationRules:a}){const{t:l}=V(),[o,s]=c.useState(()=>Array.isArray(a)?d.ColumnGroupedValidationRules.fromValidationRules(a):d.ColumnGroupedValidationRules.fromValidationRules([])),n=Ce(),[t,r]=c.useState(0);if(!Array.isArray(a))return e.jsx("div",{className:"alert alert-danger sodas-validation-ui sodas-validation-ui--empty",children:l("validationRulesMustBeArray")});const v=o.getColumnNames(),I=()=>{const u=`New Column ${t+1}`;r(N=>N+1);const _=d.createRule(d.VALIDATION_TYPE.COMPLETENESS);_.setColumn(u),_.setMinCompleteness(1),s(N=>{const C=d.ColumnGroupedValidationRules.fromValidationRules(N.toValidationRules());return C.appendColumn(u,[_]),Y(C,a),C})},T=u=>{s(_=>{const N=d.ColumnGroupedValidationRules.fromValidationRules(_.toValidationRules()),C=N.getColumnNames();return u>=0&&u<C.length&&(N.removeColumn(u),Y(N,a)),N})},O=(u,_)=>{const N=String(_).trim();N!==""&&s(C=>{const h=d.ColumnGroupedValidationRules.fromValidationRules(C.toValidationRules()),w=h.getColumnNames();if(u>=0&&u<w.length)try{h.setColumnName(u,N),Y(h,a)}catch{}return h})},m=(u,_)=>{const N=d.createRule(_);N.setColumn(u),s(C=>{const h=d.ColumnGroupedValidationRules.fromValidationRules(C.toValidationRules());return h.getColumnNames().includes(u)?h.getRules(u).push(N):h.appendColumn(u,[N]),Y(h,a),h})},b=(u,_)=>{s(N=>{const C=d.ColumnGroupedValidationRules.fromValidationRules(N.toValidationRules()),h=C.getRules(u),w=h.indexOf(_);return w!==-1&&(h.splice(w,1),Y(C,a)),C})},f=(u,_,N)=>{_==="column"?u.setColumn(N):_==="name"&&u.setName(N),n()};return e.jsxs("div",{className:"sodas-validation-ui sodas-validation-ui--columned",children:[e.jsx("div",{className:"d-flex mb-3 sodas-validation-ui__toolbar",children:e.jsx(i.Button,{variant:"primary",size:"sm",onClick:I,"aria-label":l("addColumnSectionAria"),children:l("addColumn")})}),e.jsx("div",{className:"sodas-validation-ui__sections",children:v.map((u,_)=>e.jsx(Ae,{columnName:u,columnIndex:_,rules:o.getRules(u),onRenameColumn:O,onRemoveColumn:T,onAddRule:m,onRemoveRule:b,onCommonChange:f,forceUpdate:n},_))}),v.length===0&&e.jsx("p",{className:"text-muted small sodas-validation-ui__empty",children:l("noColumns")})]})}function Ae({columnName:a,columnIndex:l,rules:o,onRenameColumn:s,onRemoveColumn:n,onAddRule:t,onRemoveRule:r,onCommonChange:v,forceUpdate:I}){const{t:T}=V(),[O,m]=c.useState(""),[b,f]=c.useState(a),[u,_]=c.useState(!1);c.useEffect(()=>{f(a)},[a]);const N=()=>{_(!1);const h=b.trim();h!==""&&h!==a?s(l,h):f(a)},C=h=>{h.key==="Enter"&&h.target.blur()};return e.jsxs(i.Card,{className:"mb-3 sodas-validation-ui__section sodas-validation-ui__section--column",children:[e.jsxs(i.Card.Header,{className:"d-flex justify-content-between align-items-start gap-2 flex-wrap",children:[e.jsxs("div",{className:"flex-grow-1 min-w-0",children:[e.jsx(i.Form.Label,{className:"small fw-semibold text-muted mb-1",children:T("columnName")}),u?e.jsx(i.Form.Control,{size:"sm",type:"text",value:b,onChange:h=>f(h.target.value),onBlur:N,onKeyDown:C,"aria-label":T("columnNameAria"),autoFocus:!0}):e.jsx("h5",{className:"mb-0 card-title cursor-pointer rounded p-1 sodas-validation-ui__section-title-editable",onClick:()=>_(!0),onFocus:()=>_(!0),tabIndex:0,role:"button","aria-label":T("editColumnName"),children:a})]}),e.jsx(i.Button,{variant:"danger",size:"sm",onClick:()=>n(l),"aria-label":`${T("removeColumn")} ${a}`,children:T("removeColumn")})]}),e.jsxs(i.Card.Body,{children:[e.jsxs("div",{className:"d-flex align-items-center gap-2 flex-wrap mb-2 sodas-validation-ui__toolbar--inline",children:[e.jsx(i.Form.Label,{className:"mb-0 fw-semibold",children:T("addRule")}),e.jsxs(i.Form.Select,{className:"sodas-validation-ui__add-select",value:O,onChange:h=>m(h.target.value),"aria-label":T("validationRuleTypeAria"),children:[e.jsx("option",{value:"",children:T("selectType")}),Object.entries(P).map(([h,w])=>e.jsx("option",{value:h,children:w},h))]}),e.jsx(i.Button,{variant:"primary",size:"sm",onClick:()=>{O&&(t(a,O),m(""))},disabled:!O,"aria-label":T("appendRuleAria"),children:T("append")})]}),e.jsx("ul",{className:"list-unstyled mb-0 sodas-validation-ui__list",children:o.map((h,w)=>e.jsx("li",{className:"mb-2 sodas-validation-ui__rule",children:e.jsx(ae,{rule:h,index:w,onRemove:()=>r(a,h),onCommonChange:v,forceUpdate:I,showColumn:!1})},w))})]})]})}function Ee(){const[,a]=c.useState(0);return c.useCallback(()=>a(l=>l+1),[])}function se({validationRules:a}){const{t:l}=V(),o=Ee(),[s,n]=c.useState(""),t=m=>{if(!Array.isArray(a))return;const b=d.createRule(m);a.push(b),o()},r=()=>{s&&t(s)},v=m=>{Array.isArray(a)&&(a.splice(m,1),o())},I=(m,b,f)=>{b==="column"?m.setColumn(f):b==="name"&&m.setName(f),o()};if(!Array.isArray(a))return e.jsx("div",{className:"alert alert-danger sodas-validation-ui sodas-validation-ui--empty",children:l("validationRulesMustBeArray")});const T=new Map;a.forEach((m,b)=>{const f=m.getType;T.has(f)||T.set(f,[]),T.get(f).push({rule:m,index:b})});const O=[];return a.forEach(m=>{const b=m.getType;O.includes(b)||O.push(b)}),e.jsxs("div",{className:"sodas-validation-ui sodas-validation-ui--type-based",children:[e.jsxs("div",{className:"d-flex align-items-center gap-2 flex-wrap mb-3 sodas-validation-ui__toolbar",children:[e.jsx(i.Form.Label,{className:"mb-0 fw-semibold",children:l("addRule")}),e.jsxs(i.Form.Select,{className:"sodas-validation-ui__add-select",value:s,onChange:m=>n(m.target.value),"aria-label":l("validationRuleTypeAria"),children:[e.jsx("option",{value:"",children:l("selectType")}),Object.entries(P).map(([m,b])=>e.jsx("option",{value:m,children:b},m))]}),e.jsx(i.Button,{variant:"primary",size:"sm",onClick:r,disabled:!s,"aria-label":l("appendRuleAria"),children:l("append")})]}),e.jsx("div",{className:"sodas-validation-ui__sections",children:O.map(m=>{const b=T.get(m)??[];return e.jsxs("section",{className:"card mb-3 sodas-validation-ui__section",children:[e.jsx("div",{className:"card-header",children:e.jsx("h5",{className:"mb-0 card-title",children:P[m]??m})}),e.jsx("ul",{className:"list-unstyled mb-0 p-2 sodas-validation-ui__list",children:b.map(({rule:f,index:u})=>e.jsx("li",{className:"sodas-validation-ui__rule mb-2",children:e.jsx(ae,{rule:f,index:u,onRemove:()=>v(u),onCommonChange:I,forceUpdate:o,showColumn:!0})},u))})]},m)})}),a.length===0&&e.jsx("p",{className:"text-muted small sodas-validation-ui__empty",children:l("noRules")})]})}const q="type",H="column",Ie=10;function J({validationRules:a}){const{t:l}=V(),[o,s]=c.useState(q),[n,t]=c.useState(0),[r,v]=c.useState(!1),[I,T]=c.useState(""),[O,m]=c.useState(""),[b,f]=c.useState(null),[u,_]=c.useState(!1),[N,C]=c.useState(!1),[h,w]=c.useState(""),[K,ce]=c.useState([]),[je,ue]=c.useState(0),[F,me]=c.useState(!1),[he,R]=c.useState(null),[D,X]=c.useState(null),k=c.useRef(!1),ze=()=>{T(""),m(""),f(null),v(!0)},Ke=async p=>{p.preventDefault(),f(null),_(!0);try{const E=new d.ValidationTemplate;E.name=I,E.description=O,E.validationRules=[...a],await E.createDBRecord(),v(!1)}catch(E){f(E instanceof Error?E.message:String(E))}finally{_(!1)}},Xe=()=>{w(""),ce([]),ue(0),R(null),X(null),C(!0)},G=c.useCallback(async(p=1,E)=>{const Ze=E!==void 0?E:h.trim()||"";me(!0),R(null);try{const x=await d.ValidationTemplate.listDBRecords(p,Ie,d.SortOrder.DESC,Ze||void 0);ce(x.list??[]),ue(x.total??0),X(null)}catch(x){R(x instanceof Error?x.message:String(x))}finally{me(!1)}},[h]);c.useEffect(()=>{N&&(k.current=!0,G(1,""))},[N]),c.useEffect(()=>{if(!N){k.current=!1;return}if(k.current){k.current=!1;return}const p=setTimeout(()=>G(1),300);return()=>clearTimeout(p)},[N,h,G]);const ke=()=>{if(!D)return;const p=D.validationRules??[];a.push(...p),t(E=>E+1),C(!1)},We=()=>{if(!D)return;const p=D.validationRules??[];a.splice(0,a.length,...p),t(E=>E+1),C(!1)};return Array.isArray(a)?e.jsxs("div",{className:"sodas-validation-ui sodas-validation-ui--tabs",children:[e.jsxs("div",{className:"d-flex flex-wrap align-items-center justify-content-between gap-2 border-bottom pb-2 mb-3",children:[e.jsxs(i.Nav,{variant:"tabs",activeKey:o,onSelect:p=>p&&s(p),role:"tablist","aria-label":"Editor mode",className:"flex-grow-1",children:[e.jsx(i.Nav.Item,{children:e.jsx(i.Nav.Link,{eventKey:q,role:"tab","aria-selected":o===q,"aria-controls":"validation-rules-editor-panel-type",id:"validation-rules-editor-tab-type",children:l("byType")})}),e.jsx(i.Nav.Item,{children:e.jsx(i.Nav.Link,{eventKey:H,role:"tab","aria-selected":o===H,"aria-controls":"validation-rules-editor-panel-column",id:"validation-rules-editor-tab-column",children:l("byColumn")})})]}),e.jsx("div",{className:"d-flex align-items-center gap-2 flex-wrap ms-auto",children:e.jsx(i.Button,{variant:"info",size:"sm",onClick:Xe,"aria-label":l("loadFromTemplateAria"),children:l("loadFromTemplate")})})]}),e.jsx("div",{id:"validation-rules-editor-panel-type",role:"tabpanel","aria-labelledby":"validation-rules-editor-tab-type",hidden:o!==q,className:"sodas-validation-ui__panel",children:o===q&&e.jsx(se,{validationRules:a},n)}),e.jsx("div",{id:"validation-rules-editor-panel-column",role:"tabpanel","aria-labelledby":"validation-rules-editor-tab-column",hidden:o!==H,className:"sodas-validation-ui__panel",children:o===H&&e.jsx(le,{validationRules:a},n)}),e.jsx("div",{className:"mt-3 pt-3 border-top d-flex justify-content-end",children:e.jsx(i.Button,{variant:"primary",onClick:ze,"aria-label":l("saveAsTemplateAria"),children:l("templateSave")})}),e.jsxs(i.Modal,{className:"sodas-validation-ui__modal",show:r,onHide:()=>!u&&v(!1),centered:!0,children:[e.jsx(i.Modal.Header,{closeButton:!0,children:e.jsx(i.Modal.Title,{children:l("templateSave")})}),e.jsxs(i.Form,{onSubmit:Ke,children:[e.jsxs(i.Modal.Body,{children:[b&&e.jsx("div",{className:"alert alert-danger small mb-3",role:"alert",children:b}),e.jsxs(i.Form.Group,{className:"mb-3",children:[e.jsx(i.Form.Label,{children:l("name")}),e.jsx(i.Form.Control,{type:"text",value:I,onChange:p=>T(p.target.value),placeholder:l("templateName"),"aria-label":l("templateName"),required:!0})]}),e.jsxs(i.Form.Group,{className:"mb-0",children:[e.jsx(i.Form.Label,{children:l("description")}),e.jsx(i.Form.Control,{as:"textarea",rows:3,value:O,onChange:p=>m(p.target.value),placeholder:l("templateDescription"),"aria-label":l("templateDescription")})]})]}),e.jsxs(i.Modal.Footer,{children:[e.jsx(i.Button,{variant:"secondary",onClick:()=>v(!1),disabled:u,children:l("cancel")}),e.jsx(i.Button,{variant:"primary",type:"submit",disabled:u,children:l(u?"saving":"save")})]})]})]}),e.jsxs(i.Modal,{className:"sodas-validation-ui__modal",show:N,onHide:()=>!F&&C(!1),centered:!0,size:"lg",children:[e.jsx(i.Modal.Header,{closeButton:!0,children:e.jsx(i.Modal.Title,{children:l("loadFromTemplate")})}),e.jsxs(i.Modal.Body,{children:[he&&e.jsx("div",{className:"alert alert-danger small mb-3",role:"alert",children:he}),e.jsxs("div",{className:"d-flex gap-2 mb-3",children:[e.jsx(i.Form.Control,{type:"text",value:h,onChange:p=>w(p.target.value),placeholder:l("searchByTemplateName"),"aria-label":l("templateNameSearchAria"),onKeyDown:p=>p.key==="Enter"&&(p.preventDefault(),G(1))}),e.jsx(i.Button,{variant:"info",onClick:()=>G(1),disabled:F,children:l(F?"searching":"search")})]}),K.length>0&&e.jsxs(e.Fragment,{children:[e.jsx("p",{className:"small text-muted mb-2",children:l("loadTemplateSelect",{count:je})}),e.jsx("div",{className:"border rounded overflow-auto mb-3",style:{maxHeight:280},children:K.map(p=>e.jsxs("div",{className:`p-2 border-bottom cursor-pointer sodas-validation-ui__template-row ${D===p?"bg-primary bg-opacity-10":""}`,onClick:()=>X(p),onKeyDown:E=>{(E.key==="Enter"||E.key===" ")&&(E.preventDefault(),X(p))},role:"button",tabIndex:0,"aria-pressed":D===p,children:[e.jsx("div",{className:"fw-medium",children:p.name??"(no name)"}),p.description&&e.jsx("div",{className:"small text-muted text-truncate",children:p.description})]},p.iri??p.id??p.name??Math.random()))})]}),K.length===0&&!F&&N&&e.jsx("p",{className:"text-muted small mb-0",children:l("noTemplatesFound")})]}),e.jsxs(i.Modal.Footer,{children:[e.jsx(i.Button,{variant:"secondary",onClick:()=>C(!1),disabled:F,children:l("cancel")}),e.jsx(i.Button,{variant:"primary",onClick:ke,disabled:!D||F,children:l("append")}),e.jsx(i.Button,{variant:"success",onClick:We,disabled:!D||F,children:l("set")})]})]})]}):e.jsx("div",{className:"alert alert-danger sodas-validation-ui sodas-validation-ui--empty",children:"validationRules must be an array"})}function ne({validationRules:a}){if(!Array.isArray(a))return e.jsx("div",{className:"alert alert-danger sodas-validation-ui sodas-validation-ui--empty",children:"validationRules must be an array"});const l=new Map,o=[];return a.forEach(s=>{const t=(s?.getColumn??s?.column??"")||"(no column)";l.has(t)||(l.set(t,[]),o.push(t)),l.get(t).push(s)}),e.jsxs("div",{className:"sodas-validation-ui sodas-validation-ui--columned sodas-validation-ui--viewer",children:[e.jsx("div",{className:"sodas-validation-ui__sections",children:o.map(s=>{const n=l.get(s)??[];return e.jsxs(i.Card,{className:"mb-3 sodas-validation-ui__section sodas-validation-ui__section--column",children:[e.jsx(i.Card.Header,{children:e.jsx("h5",{className:"mb-0 card-title",children:s})}),e.jsx(i.Card.Body,{children:e.jsx("ul",{className:"list-unstyled mb-0 sodas-validation-ui__list",children:n.map((t,r)=>e.jsx("li",{className:"mb-2 sodas-validation-ui__rule",children:e.jsx(i.Card,{className:"sodas-validation-ui__rule-card",children:e.jsx(i.Card.Body,{className:"py-2",children:e.jsx($,{rule:t,showColumn:!1})})})},r))})})]},s)})}),a.length===0&&e.jsx("p",{className:"text-muted small sodas-validation-ui__empty",children:"No validation rules to display."})]})}function Le(a){return P[a]??Q[a]??a}function ie({validationRules:a}){if(!Array.isArray(a))return e.jsx("div",{className:"alert alert-danger sodas-validation-ui sodas-validation-ui--empty",children:"validationRules must be an array"});const l=new Map,o=[];return a.forEach(s=>{const n=s?.getType??s?.type??"unknown";l.has(n)||(l.set(n,[]),o.push(n)),l.get(n).push(s)}),e.jsxs("div",{className:"sodas-validation-ui sodas-validation-ui--type-based sodas-validation-ui--viewer",children:[e.jsx("div",{className:"sodas-validation-ui__sections",children:o.map(s=>{const n=l.get(s)??[];return e.jsxs("section",{className:"card mb-3 sodas-validation-ui__section",children:[e.jsx("div",{className:"card-header",children:e.jsx("h5",{className:"mb-0 card-title",children:Le(s)})}),e.jsx("ul",{className:"list-unstyled mb-0 p-2 sodas-validation-ui__list",children:n.map((t,r)=>e.jsx("li",{className:"sodas-validation-ui__rule mb-2",children:e.jsx(i.Card,{className:"sodas-validation-ui__rule-card",children:e.jsx(i.Card.Body,{className:"py-2",children:e.jsx($,{rule:t,showColumn:!0})})})},r))})]},s)})}),a.length===0&&e.jsx("p",{className:"text-muted small sodas-validation-ui__empty",children:"No validation rules to display."})]})}const U="type",j="column";function Oe({validationRules:a}){const{t:l}=V(),[o,s]=c.useState(U);return Array.isArray(a)?e.jsxs("div",{className:"sodas-validation-ui sodas-validation-ui--tabs sodas-validation-ui--viewer",children:[e.jsx("div",{className:"d-flex flex-wrap align-items-center border-bottom pb-2 mb-3",children:e.jsxs(i.Nav,{variant:"tabs",activeKey:o,onSelect:n=>n&&s(n),role:"tablist","aria-label":"View mode",className:"flex-grow-1",children:[e.jsx(i.Nav.Item,{children:e.jsx(i.Nav.Link,{eventKey:U,role:"tab","aria-selected":o===U,"aria-controls":"validation-rules-viewer-panel-type",id:"validation-rules-viewer-tab-type",children:l("byType")})}),e.jsx(i.Nav.Item,{children:e.jsx(i.Nav.Link,{eventKey:j,role:"tab","aria-selected":o===j,"aria-controls":"validation-rules-viewer-panel-column",id:"validation-rules-viewer-tab-column",children:l("byColumn")})})]})}),e.jsx("div",{id:"validation-rules-viewer-panel-type",role:"tabpanel","aria-labelledby":"validation-rules-viewer-tab-type",hidden:o!==U,className:"sodas-validation-ui__panel",children:o===U&&e.jsx(ie,{validationRules:a})}),e.jsx("div",{id:"validation-rules-viewer-panel-column",role:"tabpanel","aria-labelledby":"validation-rules-viewer-tab-column",hidden:o!==j,className:"sodas-validation-ui__panel",children:o===j&&e.jsx(ne,{validationRules:a})})]}):e.jsx("div",{className:"alert alert-danger sodas-validation-ui sodas-validation-ui--empty",children:l("validationRulesMustBeArray")})}function we(a){return P[a]??Q[a]??a}function Me(a){const l=a?.rule??a,o=typeof a?.score=="number"?a.score:0,s=!!a?.pass;return{rule:l,score:o,pass:s}}function oe({item:a,showColumn:l=!0}){const{rule:o,score:s,pass:n}=Me(a),t=o?.getType??o?.type;return e.jsx(i.Card,{className:"sodas-validation-ui__rule-card sodas-validation-ui__quality-metadata-card",children:e.jsxs(i.Card.Body,{children:[e.jsxs("div",{className:"d-flex justify-content-between align-items-center flex-wrap gap-2 mb-2",children:[e.jsx(i.Card.Title,{className:"mb-0 fs-6",children:we(t)}),e.jsxs("div",{className:"d-flex align-items-center gap-2",children:[e.jsxs("span",{className:"sodas-validation-ui__score",title:"Score",children:["Score: ",e.jsx("strong",{children:Number(s).toPrecision(3)})]}),e.jsx(i.Badge,{bg:n?"success":"danger",className:"sodas-validation-ui__pass-badge",children:n?"Pass":"Fail"})]})]}),e.jsx($,{rule:o,showColumn:l})]})})}function Ve(a){return a?.rule??a}function Se(a){return P[a]??Q[a]??a}function te({qualityMetadata:a}){if(!Array.isArray(a))return e.jsx("div",{className:"alert alert-danger sodas-validation-ui sodas-validation-ui--empty",children:"qualityMetadata must be an array"});const l=new Map,o=[];return a.forEach(s=>{const n=Ve(s),t=n?.getType??n?.type??"unknown";l.has(t)||(l.set(t,[]),o.push(t)),l.get(t).push(s)}),e.jsxs("div",{className:"sodas-validation-ui sodas-validation-ui--type-based sodas-validation-ui--quality-metadata",children:[e.jsx("div",{className:"sodas-validation-ui__sections",children:o.map(s=>{const n=l.get(s)??[];return e.jsxs("section",{className:"card mb-3 sodas-validation-ui__section",children:[e.jsx("div",{className:"card-header",children:e.jsx("h5",{className:"mb-0 card-title",children:Se(s)})}),e.jsx("ul",{className:"list-unstyled mb-0 p-2 sodas-validation-ui__list",children:n.map((t,r)=>e.jsx("li",{className:"sodas-validation-ui__rule mb-2",children:e.jsx(oe,{item:t,showColumn:!0})},r))})]},s)})}),a.length===0&&e.jsx("p",{className:"text-muted small sodas-validation-ui__empty",children:"No quality metadata to display."})]})}function Pe(a){return a?.rule??a}function de({qualityMetadata:a}){if(!Array.isArray(a))return e.jsx("div",{className:"alert alert-danger sodas-validation-ui sodas-validation-ui--empty",children:"qualityMetadata must be an array"});const l=new Map,o=[];return a.forEach(s=>{const n=Pe(s),r=(n?.getColumn??n?.column??"")||"(no column)";l.has(r)||(l.set(r,[]),o.push(r)),l.get(r).push(s)}),e.jsxs("div",{className:"sodas-validation-ui sodas-validation-ui--columned sodas-validation-ui--quality-metadata",children:[e.jsx("div",{className:"sodas-validation-ui__sections",children:o.map(s=>{const n=l.get(s)??[];return e.jsxs(i.Card,{className:"mb-3 sodas-validation-ui__section sodas-validation-ui__section--column",children:[e.jsx(i.Card.Header,{children:e.jsx("h5",{className:"mb-0 card-title",children:s})}),e.jsx(i.Card.Body,{children:e.jsx("ul",{className:"list-unstyled mb-0 sodas-validation-ui__list",children:n.map((t,r)=>e.jsx("li",{className:"mb-2 sodas-validation-ui__rule",children:e.jsx(oe,{item:t,showColumn:!1})},r))})})]},s)})}),a.length===0&&e.jsx("p",{className:"text-muted small sodas-validation-ui__empty",children:"No quality metadata to display."})]})}const z="type",re="column",B="__uncategorized__";function De(a){const l=new Map,o=[];return a.forEach(s=>{const n=s?.assessment_id??s?.assessmentId??B;if(!l.has(n)){const t=s?.assessment_name??s?.assessmentName??(n===B?"Other":n);l.set(n,{assessmentId:n,assessmentName:t,items:[]}),o.push(n)}l.get(n).items.push(s)}),o.map(s=>l.get(s))}function Fe({qualityMetadata:a}){const{t:l}=V(),[o,s]=c.useState(z);if(!Array.isArray(a))return e.jsx("div",{className:"alert alert-danger sodas-validation-ui sodas-validation-ui--empty",children:l("qualityMetadataMustBeArray")});const n=De(a);return e.jsxs("div",{className:"sodas-validation-ui sodas-validation-ui--tabs sodas-validation-ui--quality-metadata-viewer",children:[e.jsx("div",{className:"d-flex flex-wrap align-items-center border-bottom pb-2 mb-3",children:e.jsxs(i.Nav,{variant:"tabs",activeKey:o,onSelect:t=>t&&s(t),role:"tablist","aria-label":"View mode",className:"flex-grow-1",children:[e.jsx(i.Nav.Item,{children:e.jsx(i.Nav.Link,{eventKey:z,role:"tab","aria-selected":o===z,children:l("byType")})}),e.jsx(i.Nav.Item,{children:e.jsx(i.Nav.Link,{eventKey:re,role:"tab","aria-selected":o===re,children:l("byColumn")})})]})}),n.map(({assessmentId:t,assessmentName:r,items:v})=>e.jsxs("section",{className:"sodas-validation-ui__assessment-section mb-4","aria-labelledby":`assessment-header-${t}`,children:[e.jsx("h4",{id:`assessment-header-${t}`,className:"sodas-validation-ui__assessment-title mb-3",children:t===B?l("other"):r}),o===z?e.jsx(te,{qualityMetadata:v}):e.jsx(de,{qualityMetadata:v})]},t)),a.length===0&&e.jsx("p",{className:"text-muted small sodas-validation-ui__empty",children:l("noQualityMetadata")})]})}function xe(){const[,a]=c.useState(0);return c.useCallback(()=>a(l=>l+1),[])}function Ye({template:a}){const l=xe(),o=c.useRef(a);if(o.current=a,a==null||typeof a!="object")return e.jsx("div",{className:"alert alert-danger template-editor template-editor--empty",children:"template must be an object"});const s=o.current;Array.isArray(s.validationRules)||(s.validationRules=[]);const n=T=>{s.name=T.target.value,l()},t=T=>{s.description=T.target.value,l()},r=s.name??"",v=s.description??"",I=s.validationRules;return e.jsxs("div",{className:"template-editor",children:[e.jsxs(i.Form,{className:"template-editor__meta mb-4",children:[e.jsxs(i.Form.Group,{className:"mb-3",children:[e.jsx(i.Form.Label,{children:"Name"}),e.jsx(i.Form.Control,{type:"text",value:r,onChange:n,placeholder:"Template name","aria-label":"Template name"})]}),e.jsxs(i.Form.Group,{className:"mb-3",children:[e.jsx(i.Form.Label,{children:"Description"}),e.jsx(i.Form.Control,{as:"textarea",rows:3,value:v,onChange:t,placeholder:"Template description","aria-label":"Template description"})]})]}),e.jsxs("div",{className:"template-editor__rules pt-3 border-top",children:[e.jsx("h5",{className:"mb-3",children:"Validation Rules"}),e.jsx(J,{validationRules:I})]})]})}function qe(){const[,a]=c.useState(0);return c.useCallback(()=>a(l=>l+1),[])}function Ue({qualityRequirement:a,hook_names:l=[]}){const o=qe(),s=c.useRef(a);if(s.current=a,a==null||typeof a!="object")return e.jsx("div",{className:"alert alert-danger quality-requirement-editor quality-requirement-editor--empty",children:"qualityRequirement must be an object"});const n=s.current;Array.isArray(n.nodes)||(n.nodes=[]);const t=m=>{n.name=m.target.value,o()},r=()=>{n.nodes.push({node_name:"",hook:"",validation_rules:[]}),o()},v=m=>{n.nodes.splice(m,1),o()},I=(m,b,f)=>{const u=n.nodes[m];u&&(u[b]=f,o())},T=n.name??"",O=n.nodes;return e.jsxs("div",{className:"quality-requirement-editor",children:[e.jsx(i.Form,{className:"quality-requirement-editor__meta mb-4",children:e.jsxs(i.Form.Group,{children:[e.jsx(i.Form.Label,{className:"quality-requirement-editor__name-label",children:"Name"}),e.jsx(i.Form.Control,{className:"quality-requirement-editor__name-input",type:"text",value:T,onChange:t,placeholder:"Quality requirement name","aria-label":"Quality requirement name"})]})}),e.jsxs("div",{className:"quality-requirement-editor__nodes pt-3 border-top",children:[e.jsxs("div",{className:"d-flex justify-content-between align-items-center mb-3",children:[e.jsx("h5",{className:"mb-0",children:"Nodes"}),e.jsx(i.Button,{variant:"primary",size:"sm",onClick:r,"aria-label":"Add node",children:"Add node"})]}),O.length===0&&e.jsx("p",{className:"text-muted small quality-requirement-editor__empty-nodes",children:'No nodes. Click "Add node" to add one.'}),e.jsx("ul",{className:"list-unstyled mb-0 quality-requirement-editor__list",children:O.map((m,b)=>e.jsx("li",{className:"quality-requirement-editor__node mb-3",children:e.jsx(Ge,{node:m,index:b,hookNames:l,onRemove:()=>v(b),onFieldChange:(f,u)=>I(b,f,u)})},b))})]})]})}function Ge({node:a,index:l,hookNames:o=[],onRemove:s,onFieldChange:n}){const t=c.useRef(a);t.current=a;const r=t.current;return Array.isArray(r.validation_rules)||(r.validation_rules=[]),e.jsxs(i.Card,{className:"quality-requirement-editor__node-card",children:[e.jsxs(i.Card.Header,{className:"d-flex justify-content-between align-items-center",children:[e.jsxs(i.Card.Title,{className:"mb-0 fs-6",children:["Node ",l+1]}),e.jsx(i.Button,{variant:"danger",size:"sm",onClick:s,"aria-label":`Remove node ${l+1}`,children:"Remove"})]}),e.jsxs(i.Card.Body,{children:[e.jsx(i.Form,{className:"quality-requirement-editor__node-fields mb-3",children:e.jsxs("div",{className:"row g-2",children:[e.jsxs(i.Form.Group,{className:"col-md-6",children:[e.jsx(i.Form.Label,{children:"Node name"}),e.jsx(i.Form.Control,{size:"sm",type:"text",value:r.node_name??"",onChange:v=>n("node_name",v.target.value),placeholder:"node_name","aria-label":"Node name"})]}),e.jsxs(i.Form.Group,{className:"col-md-6",children:[e.jsx(i.Form.Label,{children:"Hook"}),e.jsxs(i.Form.Select,{size:"sm",value:r.hook??"",onChange:v=>n("hook",v.target.value),"aria-label":"Hook",children:[e.jsx("option",{value:"",children:"선택"}),o.map(v=>e.jsx("option",{value:v,children:v},v))]})]})]})}),e.jsxs("div",{className:"quality-requirement-editor__node-rules pt-3 border-top",children:[e.jsx("h6",{className:"mb-2",children:"Validation rules"}),e.jsx(J,{validationRules:r.validation_rules})]})]})]})}function Qe(a){return P[a]??Q[a]??a}function $e({qualityRequirement:a}){if(a==null||typeof a!="object")return e.jsx("div",{className:"alert alert-danger sodas-validation-ui sodas-validation-ui--empty",children:"qualityRequirement must be an object"});const l=a.name??"",o=Array.isArray(a.nodes)?a.nodes:[];return e.jsxs("div",{className:"sodas-validation-ui sodas-validation-ui--quality-requirement-viewer",children:[e.jsx("div",{className:"mb-4",children:e.jsx("h4",{className:"sodas-validation-ui__quality-requirement-name mb-0",children:l||"—"})}),e.jsxs("div",{className:"pt-3 border-top",children:[e.jsx("h5",{className:"mb-3",children:"Nodes"}),o.length===0&&e.jsx("p",{className:"text-muted small mb-0",children:"No nodes."}),e.jsx("ul",{className:"list-unstyled mb-0",children:o.map((s,n)=>e.jsx("li",{className:"mb-3",children:e.jsx(He,{node:s,index:n})},n))})]})]})}function He({node:a,index:l}){const o=a?.node_name??"—",s=a?.hook??"—",n=Array.isArray(a?.validation_rules)?a.validation_rules:[];return e.jsxs(i.Card,{className:"sodas-validation-ui__rule-card",children:[e.jsx(i.Card.Header,{children:e.jsxs(i.Card.Title,{className:"mb-0 fs-6",children:["Node ",l+1]})}),e.jsxs(i.Card.Body,{children:[e.jsxs("div",{className:"d-flex flex-wrap gap-3 mb-3",children:[e.jsx(g,{label:"Node name",value:o}),e.jsx(g,{label:"Hook",value:s})]}),e.jsxs("div",{className:"pt-3 border-top",children:[e.jsx("h6",{className:"mb-2",children:"Validation rules"}),n.length===0?e.jsx("p",{className:"text-muted small mb-0",children:"No validation rules."}):e.jsx("ul",{className:"list-unstyled mb-0 sodas-validation-ui__list",children:n.map((t,r)=>e.jsx("li",{className:"mb-2",children:e.jsx(i.Card,{className:"sodas-validation-ui__rule-card",children:e.jsxs(i.Card.Body,{className:"py-2",children:[e.jsx("div",{className:"mb-1",children:e.jsx("span",{className:"fw-semibold small",children:Qe(t?.getType??t?.type)})}),e.jsx($,{rule:t,showColumn:!0})]})})},r))})]})]})]})}y.ColumnedQualityMetadataViewer=de,y.ColumnedValidationRulesEditor=le,y.ColumnedValidationRulesViewer=ne,y.I18nProvider=pe,y.QualityMetadataViewer=Fe,y.QualityRequirementEditor=Ue,y.QualityRequirementViewer=$e,y.TemplateEditor=Ye,y.TypeBasedQualityMetadataViewer=te,y.TypeBasedValidationRulesEditor=se,y.TypeBasedValidationRulesViewer=ie,y.ValidationRulesEditor=J,y.ValidationRulesViewer=Oe,y.defaultLocale=S,y.translations=M,y.useI18n=Ne,y.useI18nOptional=V,Object.defineProperty(y,Symbol.toStringTag,{value:"Module"})}));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sodas-validation-ui",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "type": "module",
5
5
  "scripts": {
6
6
  "dev": "vite",