react-pert 1.0.3 → 1.0.4
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.
- package/dist/index.js +1 -1
- package/dist/index.umd.cjs +10 -10
- package/package.json +1 -1
package/dist/index.js
CHANGED
package/dist/index.umd.cjs
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
(function(f,n){typeof exports=="object"&&typeof module<"u"?n(exports,require("react/jsx-runtime"),require("react")):typeof define=="function"&&define.amd?define(["exports","react/jsx-runtime","react"],n):(f=typeof globalThis<"u"?globalThis:f||self,n(f["react-pert"]={},f["react/jsx-runtime"],f.React))})(this,function(f,n,c){"use strict";var ct=Object.defineProperty;var ht=(f,n,c)=>n in f?ct(f,n,{enumerable:!0,configurable:!0,writable:!0,value:c}):f[n]=c;var M=(f,n,c)=>ht(f,typeof n!="symbol"?n+"":n,c);var L=document.createElement("style");L.textContent=`._arrows_62ntr_1 ._arrow_62ntr_1{fill:transparent;stroke:var(--arrow-stroke-color);stroke-width:var(--arrow-stroke-width);transition:stroke .2s,stroke-width .2s,opacity .2s}._arrows_62ntr_1 ._arrow_62ntr_1._critical_62ntr_8{stroke:var(--arrow-critical-stroke-color)}._arrows_62ntr_1._onHover_62ntr_13 ._arrow_62ntr_1{opacity:.3}._arrows_62ntr_1._onSelect_62ntr_17 ._arrow_62ntr_1{opacity:0}._arrows_62ntr_1._onSelect_62ntr_17 ._arrow_62ntr_1._hover_62ntr_24,._arrows_62ntr_1._onSelect_62ntr_17 ._arrow_62ntr_1._visible_62ntr_25,._arrows_62ntr_1._onHover_62ntr_13 ._arrow_62ntr_1._hover_62ntr_24,._arrows_62ntr_1._onHover_62ntr_13 ._arrow_62ntr_1._visible_62ntr_25{stroke-width:calc(var(--arrow-stroke-width) + 1);opacity:1}._tasks_1slwh_1 ._task_1slwh_1{-webkit-user-select:none;-moz-user-select:none;user-select:none;transition:filter .2s,opacity .2s}._tasks_1slwh_1 ._task_1slwh_1 text{fill:var(--task-text-color);font-family:var(--task-font-family)}._tasks_1slwh_1 ._task_1slwh_1 rect{transition:stroke-width .2s;stroke:var(--task-stroke-color);stroke-width:var(--task-stroke-width);fill:var(--task-bg)}._tasks_1slwh_1 ._task_1slwh_1 rect~path{stroke:var(--task-stroke-color)}._tasks_1slwh_1 ._task_1slwh_1._critical_1slwh_22 rect{fill:var(--task-bg-critical)}._tasks_1slwh_1 ._task_1slwh_1:hover{cursor:pointer;filter:brightness(.9)}._tasks_1slwh_1 ._task_1slwh_1:hover rect{stroke-width:var(--task-stroke-hover-width)}._tasks_1slwh_1 ._task_1slwh_1._selected_1slwh_35 rect{stroke:var(--task-selected-stroke-color);stroke-width:var(--task-selected-stroke-width)}._tasks_1slwh_1:has(._task_1slwh_1._selected_1slwh_35) ._task_1slwh_1:not(._selected_1slwh_35):not(._visible_1slwh_44){opacity:.7;filter:brightness(.6)}._tasks_1slwh_1:has(._task_1slwh_1._selected_1slwh_35) ._task_1slwh_1:not(._selected_1slwh_35):not(._visible_1slwh_44):hover{cursor:pointer;filter:brightness(.9);opacity:1}._tasks_1slwh_1:has(._task_1slwh_1._selected_1slwh_35) ._task_1slwh_1:not(._selected_1slwh_35):not(._visible_1slwh_44):hover rect{stroke:var(--task-stroke-color);stroke-linejoin:bevel}
|
|
2
|
-
/*$vite$:1*/`,document.head.appendChild(L);const A=()=>Math.random().toString(36).substring(7);let B=class{constructor(
|
|
3
|
-
M ${
|
|
4
|
-
L ${
|
|
5
|
-
M ${
|
|
6
|
-
L ${
|
|
7
|
-
M ${
|
|
8
|
-
L ${
|
|
9
|
-
M ${
|
|
10
|
-
L ${
|
|
11
|
-
`,[
|
|
2
|
+
/*$vite$:1*/`,document.head.appendChild(L);const A=()=>Math.random().toString(36).substring(7);let B=class{constructor(e){M(this,"levels");M(this,"tasksMap");M(this,"initialData");M(this,"links");M(this,"criticalPaths");M(this,"lastTaskKey");M(this,"startTaskKey");M(this,"projectDuration");this.initialData=e,this.tasksMap=new Map,this.lastTaskKey=`Finish-${A()}`,this.startTaskKey=`Start-${A()}`,this.links=[],this.criticalPaths=[],this.levels=new Map,this.projectDuration=0}convertDataToMap(){this.tasksMap=new Map,this.tasksMap.set(this.startTaskKey,{key:this.startTaskKey,duration:0,text:"Start"}),this.initialData.forEach((e,s)=>{if(this.tasksMap.has(e.key))throw Error(`Duplicate keys found ${e.key}`);this.tasksMap.set(e.key,!e.dependsOn||e.dependsOn.length===0?{...e,dependsOn:[this.startTaskKey],index:s}:{...e,index:s})})}calculatePERT(){this.convertDataToMap(),this.calcLevels(),this.levels.forEach(s=>{s.forEach(t=>{this.calculateEarlyTimes(t)})});let e=Array.from(this.tasksMap.values()).reduce((s,t)=>s.earlyFinish>t.earlyFinish?s:t);e.lateFinish=e.earlyFinish,e.critical=!0,this.tasksMap.set(this.lastTaskKey,{key:this.lastTaskKey,text:"Finish",dependsOn:[e.key],duration:0,earlyStart:e.earlyFinish,earlyFinish:e.earlyFinish,lateFinish:e.earlyFinish,lateStart:e.earlyFinish,level:this.levels.size,critical:!0,freeFloat:0,totalFloat:0,index:this.tasksMap.size-1}),this.levels.set(this.levels.size,[this.lastTaskKey]),this.projectDuration=e.lateFinish;for(const[,s]of[...this.levels.entries()].reverse())s.forEach(t=>{this.calculateLateTimes(t,e.lateFinish)});this.levels.forEach((s,t)=>{this.levels.set(t,s.sort((l,a)=>this.tasksMap.get(l).index-this.tasksMap.get(a).index))})}getSuccessors(e){return Array.from(this.tasksMap.values()).filter(s=>s.dependsOn&&s.dependsOn.includes(e.key))}calculateEarlyTimes(e){const s=this.tasksMap.get(e);if(!s.dependsOn)s.earlyStart=0;else{let t=0;s.dependsOn.forEach(l=>{const a=this.tasksMap.get(l);t=Math.max(t,a.earlyStart+a.duration)}),s.earlyStart=t}s.earlyFinish=s.earlyStart+s.duration}calculateLateTimes(e,s){var h;const t=this.tasksMap.get(e),l=this.getSuccessors(t);t.key!==this.lastTaskKey&&l.length===0&&((h=this.tasksMap.get(this.lastTaskKey).dependsOn)==null||h.push(e));let a=l.length===0?s:Math.min(...l.map(i=>i.lateFinish-i.duration));t.lateFinish=a,t.lateStart=t.lateFinish-t.duration,t.critical=t.earlyFinish===t.lateFinish,t.critical?(t.freeFloat=0,t.totalFloat=0):(t.freeFloat=(l.length===0?s:Math.min(...l.map(i=>i.earlyStart)))-t.earlyFinish,t.totalFloat=t.lateFinish-t.earlyFinish)}calcLevels(){this.levels.clear();let e=[];const s=t=>{if(e.includes(t.key))throw new Error("Circular dependency detected");if(!t.dependsOn||t.dependsOn.length===0)t.level=0;else{let a=0;t.dependsOn.forEach(h=>{const i=this.tasksMap.get(h);if(!i)throw new Error(`Task with KEY '${h}' was not found.`);i.level===void 0&&(e.push(t.key),s(i)),a=Math.max(a,i.level+1)}),t.level=a}this.levels.has(t.level)||this.levels.set(t.level,[]);const l=this.levels.get(t.level);l.includes(t.key)||l.push(t.key)};this.tasksMap.forEach(t=>{t.level===void 0&&(e=[],s(t))})}calcNodeLinks(){const e=[],s=[];this.tasksMap.forEach((t,l)=>{t.dependsOn?t.dependsOn.forEach(a=>{s.push(a),e.push({from:a,to:t.key,critical:t.critical&&this.tasksMap.get(a).critical})}):l!==this.startTaskKey&&e.push({from:this.startTaskKey,to:t.key,critical:t.critical})}),this.tasksMap.forEach(t=>{!s.includes(t.key)&&t.key!==this.lastTaskKey&&e.push({from:t.key,to:this.lastTaskKey,critical:t.critical})}),this.links=e.sort((t,l)=>Number(t.critical)-Number(l.critical))}calcCriticalPaths(){this.calcNodeLinks();const e=[];this.links.filter(t=>t.critical&&t.from===this.startTaskKey&&t.to!==this.lastTaskKey).forEach(t=>{const l=[t],a=h=>{const i=this.links.filter(o=>o.critical&&o.from===h.to&&o.to!==this.lastTaskKey);i.length===0?e.push(l.map(o=>({text:this.tasksMap.get(o.to).text,key:o.to}))):i.forEach(o=>{l.push(o),a(o),l.pop()})};a(t)}),this.criticalPaths=e}getTasks(){return this.calculatePERT(),this.tasksMap}getCriticalPaths(){return this.criticalPaths.length===0&&this.calcCriticalPaths(),this.criticalPaths}getLevels(){return this.levels}getNodeLinks(){return this.links}getProjectDuration(){return this.projectDuration}solve(){return{tasks:this.getTasks(),levels:this.getLevels(),criticalPaths:this.getCriticalPaths(),links:this.getNodeLinks(),projectDuration:this.getProjectDuration()}}};const K={tasks:new Map,levels:new Map,links:[],criticalPaths:[],projectDuration:0},C=c.createContext(null),N=c.createContext(null),H=r=>({children:e})=>{const[s,t]=c.useState(K),[l,a]=c.useState(null),h=c.useCallback(i=>{try{const o=new B(i).solve();t(o),a(null)}catch(o){console.error(o),t(K),a(o.message)}},[]);return n.jsx(r.Provider,{value:{pertData:s,calculatePertResults:h,error:l},children:e})},U=H(C),Y=H(N),X=(r={bounds:!0})=>{const e=c.useContext(C);if(!e)throw new Error("usePertData must be used within a PertProvider");const s=Array.from(e.pertData.tasks.values()),t=r!=null&&r.bounds?s.slice(1,-1).map(l=>{var a;return{...l,dependsOn:(a=l.dependsOn)!=null&&a.includes(s[0].key)?[]:l.dependsOn}}):s;return{...e.pertData,tasks:t,error:e.error,projectDuration:e.pertData.projectDuration}},j=()=>{const r=c.useContext(C);if(!r){const e=c.useContext(N);if(!e)throw new Error("usePertData must be used within a PertProvider or InternalPertProvider");return e}return r},b={arrows:"_arrows_62ntr_1",arrow:"_arrow_62ntr_1",critical:"_critical_62ntr_8",onHover:"_onHover_62ntr_13",onSelect:"_onSelect_62ntr_17",visible:"_visible_62ntr_25"},V=({arrows:r,taskSize:e,levels:s,size:t,gap:l,tasks:a,selectedTask:h,hoveredTask:i,arrowStyles:o})=>{const _=(u,k)=>h===u||h===k||i===u||i===k,w=(u,k=!1)=>{const d=a.get(u),v=d.level,y=s.get(v).findIndex(S=>S===u),g=s.get(v).length,T=g*e+(g-1)*l.y,m=(t.height-T)/2+e/2,x=v*(e+l.x)+(k?e*(3/2):e/2),E=y*(e+l.y)+m;return{x,y:E,level:v,task:d}},p=`${b.arrows} ${h?b.onSelect:""} ${i?b.onHover:""}`;return n.jsx("g",{className:p,children:r.map((u,k)=>{const{x:d,y:v,level:y,task:g}=w(u.from,!0),{x:T,y:m,level:x,task:E}=w(u.to),S=`${b.arrow} ${_(g.key,E.key)?b.visible:""} ${u.critical?b.critical:""}`;return n.jsx("path",{className:S,d:`M ${d} ${v} C ${d+20*(x-y)+(T-d)/1.2} ${v} ${d+20*(x-y)+(T-d)/4} ${m} ${T} ${m}`,style:o},k)})})},P={tasks:"_tasks_1slwh_1",task:"_task_1slwh_1",critical:"_critical_1slwh_22",selected:"_selected_1slwh_35",visible:"_visible_1slwh_44"},q=({task:r,x:e,y:s,dimensions:t})=>{const{halfRadius:l,twoThirdsRadius:a}=t;return n.jsxs(n.Fragment,{children:[n.jsx("text",{x:e-l,y:s-a,fill:"black",children:r.earlyStart}),n.jsx("text",{x:e+l,y:s-a,fill:"black",children:r.earlyFinish}),n.jsx("text",{x:e-l,y:s+a,fill:"black",children:r.lateStart}),n.jsx("text",{x:e+l,y:s+a,fill:"black",children:r.lateFinish})]})},J=({task:r,x:e,y:s,dimensions:t,onHover:l,onTaskClick:a,isVisible:h,isSelected:i,taskStyles:o})=>{const{radius:_}=t,w=c.useMemo(()=>`
|
|
3
|
+
M ${e-_} ${s-_/3}
|
|
4
|
+
L ${e+_} ${s-_/3}
|
|
5
|
+
M ${e-_} ${s+_/3}
|
|
6
|
+
L ${e+_} ${s+_/3}
|
|
7
|
+
M ${e} ${s+_/3}
|
|
8
|
+
L ${e} ${s+_}
|
|
9
|
+
M ${e} ${s-_}
|
|
10
|
+
L ${e} ${s-_/3}
|
|
11
|
+
`,[e,s,_]);return n.jsxs("g",{className:`${P.task} ${i?P.selected:""} ${h?P.visible:""} ${r.critical?P.critical:""}`,onMouseEnter:()=>l(r.key,!0),onMouseLeave:()=>l(r.key,!1),onClick:()=>a(r.key),style:o,children:[n.jsx("rect",{x:e-_,y:s-_,rx:"20",ry:"20",width:_*2,height:_*2}),n.jsx("text",{x:e,y:s,children:r.text}),n.jsx(q,{task:r,x:e,y:s,dimensions:t}),n.jsx("path",{d:w,fill:"none"})]})},W=c.memo(J),Z=({level:r,keyList:e,tasks:s,taskSize:t,gap:l,offset:a,dimensions:h,selectedTask:i,onHover:o,onTaskClick:_,taskStyles:w})=>n.jsx("g",{children:e.map((p,u)=>{var T,m,x;const k=s.get(p);if(!k)return null;const d=r*t+t+l.x*r,v=u*(t+l.y)+a,y=!!(i&&((T=k.dependsOn)!=null&&T.includes(i)||(x=(m=s.get(i))==null?void 0:m.dependsOn)!=null&&x.includes(k.key))),g=k.key===i;return n.jsx(W,{task:k,x:d,y:v,dimensions:h,onHover:o,onTaskClick:_,isSelected:g,isVisible:y,taskStyles:w},k.key)})}),Q=c.memo(Z),G=({tasks:r,levels:e,taskSize:s,size:t,gap:l,selectedTask:a,setHoveredTask:h,taskStyles:i})=>{const o=c.useMemo(()=>({radius:s/2,halfRadius:s/4,twoThirdsRadius:s/6*2}),[s]),_=c.useCallback((u,k)=>{h(k?u:null)},[h]),w=c.useCallback(u=>{O(a!==u?u:null)},[a]),p=c.useMemo(()=>Array.from(e.entries()).map(([u,k])=>{const d=k.length*s+(k.length-1)*l.y,v=(t.height-d)/2+o.radius;return n.jsx(Q,{level:u,keyList:k,tasks:r,taskSize:s,gap:l,offset:v,dimensions:o,selectedTask:a,onHover:_,onTaskClick:w,taskStyles:i},u)}),[e,r,s,l,t.height,o,a,_,w,i]);return n.jsx("g",{className:P.tasks,children:p})},z=c.memo(G),R={width:300,height:200},tt={display:"block",boxSizing:"border-box",transition:"width 0.3s ease, height 0.3s ease"},$={CRITICAL:"#ff9147",TASK_BG:"#aaaeff",GRID:"#83838350",TEXT:"#000",SELECTED:"#6868ff",STROKE:"#615f77"},D={BORDER:1,HOVER_BORDER:2,SELECTED_BORDER:3};function et({size:r,taskSize:e,strokeColor:s}){const t=Math.ceil(r.height/e)+1,l=Math.ceil(r.width/e)+1,a=(h,i,o)=>Array.from({length:h},(_,w)=>{const p=w*e;return n.jsx("line",{x1:i?p:0,y1:i?0:p,x2:i?p:o,y2:i?o:p,style:{stroke:s??$.GRID}},w)});return n.jsxs("g",{children:[n.jsx("g",{children:a(t,!1,r.width)}),n.jsx("g",{children:a(l,!0,r.height)})]})}const st=({size:r,pertData:e,selectedTask:s,setHoveredTask:t,hoveredTask:l,styles:{fontSize:a,taskSize:h,gap:i,disableGrid:o,taskBackground:_,selectedBorderColor:w,borderColor:p,criticalColor:u,arrowColor:k,arrowWidth:d,chartBackground:v,textColor:y,fontFamily:g,borderWidth:T,hoverBorderWidth:m,selectedBorderWidth:x,gridColor:E}})=>{const S={"--task-bg":_??$.TASK_BG,"--task-bg-critical":u??$.CRITICAL,"--task-stroke-color":p??$.STROKE,"--task-stroke-width":T??D.BORDER,"--task-stroke-hover-width":m??D.HOVER_BORDER,"--task-selected-stroke-width":x??D.SELECTED_BORDER,"--task-selected-stroke-color":w??$.SELECTED,"--task-text-color":y??$.TEXT,"--task-font-family":g??"inherit"},it={"--arrow-stroke-color":k??$.STROKE,"--arrow-critical-stroke-color":u??$.CRITICAL,"--arrow-stroke-width":d??2},ot={...tt,fontSize:a,backgroundColor:v};return n.jsx("svg",{width:r.width,height:r.height,viewBox:`0 0 ${r.width} ${r.height}`,xmlns:"http://www.w3.org/2000/svg",style:ot,dominantBaseline:"central",textAnchor:"middle",children:n.jsxs("g",{className:"content",children:[!o&&n.jsx(et,{size:r,taskSize:h,strokeColor:E}),n.jsx(V,{gap:i,arrows:e.links,taskSize:h,size:r,levels:e.levels,tasks:e.tasks,selectedTask:s,hoveredTask:l,arrowStyles:it}),n.jsx(z,{gap:i,size:r,taskSize:h,tasks:e.tasks,levels:e.levels,selectedTask:s,setHoveredTask:t,taskStyles:S})]})})};function rt({error:r}){return n.jsx("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",fontSize:"1.5rem",padding:"3rem"},children:r})}const lt=({taskSize:r,gap:e})=>{const{pertData:s}=j();return c.useMemo(()=>{const t=Array.from(s.levels.values());if(!t.length)return{width:0,height:0};const l=Math.max(...t.map(a=>a.length));return{width:(t.length+1)*r+(t.length-1)*e.x,height:(l+1)*r+(l-1)*e.y}},[s.levels,r,e])},I={sm:"0.75rem",md:"1rem",lg:"1.25rem",xl:"1.5rem","2xl":"1.75rem","3xl":"2rem",default:"1rem",min:"0.75rem",max:"2rem"};let F=null;const O=r=>{if(!F)return;const{setter:e,onSelect:s,getTask:t}=F;if(!r){e(null),s==null||s(null);return}const l=(t==null?void 0:t(r))??null;s==null||s(l),e(l?r:null)},at=({tasks:r,onSelect:e,styles:s})=>{const{pertData:t,calculatePertResults:l,error:a}=j(),h=c.useRef(),[i,o]=c.useState(null),[_,w]=c.useState(null),p=E=>t.tasks.get(E);F={setter:c.useRef(o).current,getTask:p,onSelect:e},c.useEffect(()=>{const E=JSON.stringify(r);h.current!==E&&(l(r),O(null),h.current=E)},[r,l]);const k=c.useCallback(E=>{w(E)},[]),{gap:d,taskSize:v,fontSize:y}=s,g=Math.max(v??100,70),T=c.useMemo(()=>({x:Math.max(g,(d==null?void 0:d.x)??0),y:Math.max(g,(d==null?void 0:d.y)??0)}),[d==null?void 0:d.x,d==null?void 0:d.y,g]),m=lt({taskSize:g,gap:T}),x=c.useMemo(()=>y?typeof y=="number"?`${y}px`:I[y]||y:I.default,[y]);return a?n.jsx(rt,{error:a}):n.jsx(st,{size:a?R:m,pertData:t,selectedTask:i,hoveredTask:_,setHoveredTask:k,styles:{...s,fontSize:x,taskSize:g,gap:T}})},nt=({styles:r,...e})=>n.jsx(Y,{children:n.jsx("div",{style:{width:"fit-content",height:"fit-content",boxSizing:"border-box"},children:n.jsx(at,{...e,styles:r??{}})})});f.Pert=nt,f.PertProvider=U,f.setSelectedTask=O,f.usePert=X,Object.defineProperty(f,Symbol.toStringTag,{value:"Module"})});
|