UNPKG

react-todolist-component

Version:

A clean, customizable React TodoList component with TypeScript support and advanced modal editor

239 lines (224 loc) 35.8 kB
'use strict'; var jsxRuntime = require('react/jsx-runtime'); var require$$0 = require('react'); /****************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ /* global Reflect, Promise, SuppressedError, Symbol, Iterator */ var __assign = function() { __assign = Object.assign || function __assign(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { var e = new Error(message); return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; }; function r(e){var t,f,n="";if("string"==typeof e||"number"==typeof e)n+=e;else if("object"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=" "),n+=f);}else for(f in e)e[f]&&(n&&(n+=" "),n+=f);return n}function clsx(){for(var e,t,f=0,n="",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=" "),n+=t);return n} var dist = {}; (function (exports) { Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const I=require$$0;var ae={exports:{}},L={};/** * @license React * react-jsx-runtime.production.min.js * * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */var Oe;function dr(){if(Oe)return L;Oe=1;var _=I,x=Symbol.for("react.element"),S=Symbol.for("react.fragment"),b=Object.prototype.hasOwnProperty,R=_.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,C={key:true,ref:true,__self:true,__source:true};function T(E,i,p){var f,h={},m=null,N=null;p!==void 0&&(m=""+p),i.key!==void 0&&(m=""+i.key),i.ref!==void 0&&(N=i.ref);for(f in i)b.call(i,f)&&!C.hasOwnProperty(f)&&(h[f]=i[f]);if(E&&E.defaultProps)for(f in i=E.defaultProps,i)h[f]===void 0&&(h[f]=i[f]);return {$$typeof:x,type:E,key:m,ref:N,props:h,_owner:R.current}}return L.Fragment=S,L.jsx=T,L.jsxs=T,L}var U={};/** * @license React * react-jsx-runtime.development.js * * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */var Pe;function vr(){return Pe||(Pe=1,process.env.NODE_ENV!=="production"&&function(){var _=I,x=Symbol.for("react.element"),S=Symbol.for("react.portal"),b=Symbol.for("react.fragment"),R=Symbol.for("react.strict_mode"),C=Symbol.for("react.profiler"),T=Symbol.for("react.provider"),E=Symbol.for("react.context"),i=Symbol.for("react.forward_ref"),p=Symbol.for("react.suspense"),f=Symbol.for("react.suspense_list"),h=Symbol.for("react.memo"),m=Symbol.for("react.lazy"),N=Symbol.for("react.offscreen"),V=Symbol.iterator,G="@@iterator";function k(e){if(e===null||typeof e!="object")return null;var r=V&&e[V]||e[G];return typeof r=="function"?r:null}var w=_.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;function s(e){{for(var r=arguments.length,t=new Array(r>1?r-1:0),n=1;n<r;n++)t[n-1]=arguments[n];D("error",e,t);}}function D(e,r,t){{var n=w.ReactDebugCurrentFrame,c=n.getStackAddendum();c!==""&&(r+="%s",t=t.concat([c]));var u=t.map(function(l){return String(l)});u.unshift("Warning: "+r),Function.prototype.apply.call(console[e],console,u);}}var O=false,De=false,Ae=false,Fe=false,Ie=false,ne;ne=Symbol.for("react.module.reference");function $e(e){return !!(typeof e=="string"||typeof e=="function"||e===b||e===C||Ie||e===R||e===p||e===f||Fe||e===N||O||De||Ae||typeof e=="object"&&e!==null&&(e.$$typeof===m||e.$$typeof===h||e.$$typeof===T||e.$$typeof===E||e.$$typeof===i||e.$$typeof===ne||e.getModuleId!==void 0))}function We(e,r,t){var n=e.displayName;if(n)return n;var c=r.displayName||r.name||"";return c!==""?t+"("+c+")":t}function ie(e){return e.displayName||"Context"}function P(e){if(e==null)return null;if(typeof e.tag=="number"&&s("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case b:return "Fragment";case S:return "Portal";case C:return "Profiler";case R:return "StrictMode";case p:return "Suspense";case f:return "SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case E:var r=e;return ie(r)+".Consumer";case T:var t=e;return ie(t._context)+".Provider";case i:return We(e,e.render,"ForwardRef");case h:var n=e.displayName||null;return n!==null?n:P(e.type)||"Memo";case m:{var c=e,u=c._payload,l=c._init;try{return P(l(u))}catch{return null}}}return null}var A=Object.assign,Y=0,se,oe,le,ce,ue,fe,de;function ve(){}ve.__reactDisabledLog=true;function Ye(){{if(Y===0){se=console.log,oe=console.info,le=console.warn,ce=console.error,ue=console.group,fe=console.groupCollapsed,de=console.groupEnd;var e={configurable:true,enumerable:true,value:ve,writable:true};Object.defineProperties(console,{info:e,log:e,warn:e,error:e,group:e,groupCollapsed:e,groupEnd:e});}Y++;}}function Me(){{if(Y--,Y===0){var e={configurable:true,enumerable:true,writable:true};Object.defineProperties(console,{log:A({},e,{value:se}),info:A({},e,{value:oe}),warn:A({},e,{value:le}),error:A({},e,{value:ce}),group:A({},e,{value:ue}),groupCollapsed:A({},e,{value:fe}),groupEnd:A({},e,{value:de})});}Y<0&&s("disabledDepth fell below zero. This is a bug in React. Please file an issue.");}}var z=w.ReactCurrentDispatcher,X;function q(e,r,t){{if(X===void 0)try{throw Error()}catch(c){var n=c.stack.trim().match(/\n( *(at )?)/);X=n&&n[1]||"";}return ` `+X+e}}var H=false,B;{var Le=typeof WeakMap=="function"?WeakMap:Map;B=new Le;}function me(e,r){if(!e||H)return "";{var t=B.get(e);if(t!==void 0)return t}var n;H=true;var c=Error.prepareStackTrace;Error.prepareStackTrace=void 0;var u;u=z.current,z.current=null,Ye();try{if(r){var l=function(){throw Error()};if(Object.defineProperty(l.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(l,[]);}catch(y){n=y;}Reflect.construct(e,[],l);}else {try{l.call();}catch(y){n=y;}e.call(l.prototype);}}else {try{throw Error()}catch(y){n=y;}e();}}catch(y){if(y&&n&&typeof y.stack=="string"){for(var o=y.stack.split(` `),g=n.stack.split(` `),d=o.length-1,v=g.length-1;d>=1&&v>=0&&o[d]!==g[v];)v--;for(;d>=1&&v>=0;d--,v--)if(o[d]!==g[v]){if(d!==1||v!==1)do if(d--,v--,v<0||o[d]!==g[v]){var j=` `+o[d].replace(" at new "," at ");return e.displayName&&j.includes("<anonymous>")&&(j=j.replace("<anonymous>",e.displayName)),typeof e=="function"&&B.set(e,j),j}while(d>=1&&v>=0);break}}}finally{H=false,z.current=u,Me(),Error.prepareStackTrace=c;}var W=e?e.displayName||e.name:"",F=W?q(W):"";return typeof e=="function"&&B.set(e,F),F}function Ue(e,r,t){return me(e,false)}function Ve(e){var r=e.prototype;return !!(r&&r.isReactComponent)}function J(e,r,t){if(e==null)return "";if(typeof e=="function")return me(e,Ve(e));if(typeof e=="string")return q(e);switch(e){case p:return q("Suspense");case f:return q("SuspenseList")}if(typeof e=="object")switch(e.$$typeof){case i:return Ue(e.render);case h:return J(e.type,r,t);case m:{var n=e,c=n._payload,u=n._init;try{return J(u(c),r,t)}catch{}}}return ""}var M=Object.prototype.hasOwnProperty,pe={},he=w.ReactDebugCurrentFrame;function K(e){if(e){var r=e._owner,t=J(e.type,e._source,r?r.type:null);he.setExtraStackFrame(t);}else he.setExtraStackFrame(null);}function qe(e,r,t,n,c){{var u=Function.call.bind(M);for(var l in e)if(u(e,l)){var o=void 0;try{if(typeof e[l]!="function"){var g=Error((n||"React class")+": "+t+" type `"+l+"` is invalid; it must be a function, usually from the `prop-types` package, but received `"+typeof e[l]+"`.This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.");throw g.name="Invariant Violation",g}o=e[l](r,l,n,t,null,"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED");}catch(d){o=d;}o&&!(o instanceof Error)&&(K(c),s("%s: type specification of %s `%s` is invalid; the type checker function must return `null` or an `Error` but returned a %s. You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).",n||"React class",t,l,typeof o),K(null)),o instanceof Error&&!(o.message in pe)&&(pe[o.message]=true,K(c),s("Failed %s type: %s",t,o.message),K(null));}}}var Be=Array.isArray;function Z(e){return Be(e)}function Je(e){{var r=typeof Symbol=="function"&&Symbol.toStringTag,t=r&&e[Symbol.toStringTag]||e.constructor.name||"Object";return t}}function Ke(e){try{return ge(e),!1}catch{return true}}function ge(e){return ""+e}function be(e){if(Ke(e))return s("The provided key is an unsupported type %s. This value must be coerced to a string before before using it here.",Je(e)),ge(e)}var ye=w.ReactCurrentOwner,Ge={key:true,ref:true,__self:true,__source:true},Ee,xe;function ze(e){if(M.call(e,"ref")){var r=Object.getOwnPropertyDescriptor(e,"ref").get;if(r&&r.isReactWarning)return false}return e.ref!==void 0}function Xe(e){if(M.call(e,"key")){var r=Object.getOwnPropertyDescriptor(e,"key").get;if(r&&r.isReactWarning)return false}return e.key!==void 0}function He(e,r){typeof e.ref=="string"&&ye.current;}function Ze(e,r){{var t=function(){Ee||(Ee=true,s("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)",r));};t.isReactWarning=true,Object.defineProperty(e,"key",{get:t,configurable:true});}}function Qe(e,r){{var t=function(){xe||(xe=true,s("%s: `ref` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)",r));};t.isReactWarning=true,Object.defineProperty(e,"ref",{get:t,configurable:true});}}var er=function(e,r,t,n,c,u,l){var o={$$typeof:x,type:e,key:r,ref:t,props:l,_owner:u};return o._store={},Object.defineProperty(o._store,"validated",{configurable:false,enumerable:false,writable:true,value:false}),Object.defineProperty(o,"_self",{configurable:false,enumerable:false,writable:false,value:n}),Object.defineProperty(o,"_source",{configurable:false,enumerable:false,writable:false,value:c}),Object.freeze&&(Object.freeze(o.props),Object.freeze(o)),o};function rr(e,r,t,n,c){{var u,l={},o=null,g=null;t!==void 0&&(be(t),o=""+t),Xe(r)&&(be(r.key),o=""+r.key),ze(r)&&(g=r.ref,He(r));for(u in r)M.call(r,u)&&!Ge.hasOwnProperty(u)&&(l[u]=r[u]);if(e&&e.defaultProps){var d=e.defaultProps;for(u in d)l[u]===void 0&&(l[u]=d[u]);}if(o||g){var v=typeof e=="function"?e.displayName||e.name||"Unknown":e;o&&Ze(l,v),g&&Qe(l,v);}return er(e,o,g,c,n,ye.current,l)}}var Q=w.ReactCurrentOwner,je=w.ReactDebugCurrentFrame;function $(e){if(e){var r=e._owner,t=J(e.type,e._source,r?r.type:null);je.setExtraStackFrame(t);}else je.setExtraStackFrame(null);}var ee;ee=false;function re(e){return typeof e=="object"&&e!==null&&e.$$typeof===x}function _e(){{if(Q.current){var e=P(Q.current.type);if(e)return ` Check the render method of \``+e+"`."}return ""}}function tr(e){return ""}var Re={};function ar(e){{var r=_e();if(!r){var t=typeof e=="string"?e:e.displayName||e.name;t&&(r=` Check the top-level render call using <`+t+">.");}return r}}function Te(e,r){{if(!e._store||e._store.validated||e.key!=null)return;e._store.validated=true;var t=ar(r);if(Re[t])return;Re[t]=true;var n="";e&&e._owner&&e._owner!==Q.current&&(n=" It was passed a child from "+P(e._owner.type)+"."),$(e),s('Each child in a list should have a unique "key" prop.%s%s See https://reactjs.org/link/warning-keys for more information.',t,n),$(null);}}function Ce(e,r){{if(typeof e!="object")return;if(Z(e))for(var t=0;t<e.length;t++){var n=e[t];re(n)&&Te(n,r);}else if(re(e))e._store&&(e._store.validated=true);else if(e){var c=k(e);if(typeof c=="function"&&c!==e.entries)for(var u=c.call(e),l;!(l=u.next()).done;)re(l.value)&&Te(l.value,r);}}}function nr(e){{var r=e.type;if(r==null||typeof r=="string")return;var t;if(typeof r=="function")t=r.propTypes;else if(typeof r=="object"&&(r.$$typeof===i||r.$$typeof===h))t=r.propTypes;else return;if(t){var n=P(r);qe(t,e.props,"prop",n,e);}else if(r.PropTypes!==void 0&&!ee){ee=true;var c=P(r);s("Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?",c||"Unknown");}typeof r.getDefaultProps=="function"&&!r.getDefaultProps.isReactClassApproved&&s("getDefaultProps is only used on classic React.createClass definitions. Use a static property named `defaultProps` instead.");}}function ir(e){{for(var r=Object.keys(e.props),t=0;t<r.length;t++){var n=r[t];if(n!=="children"&&n!=="key"){$(e),s("Invalid prop `%s` supplied to `React.Fragment`. React.Fragment can only have `key` and `children` props.",n),$(null);break}}e.ref!==null&&($(e),s("Invalid attribute `ref` supplied to `React.Fragment`."),$(null));}}var Se={};function we(e,r,t,n,c,u){{var l=$e(e);if(!l){var o="";(e===void 0||typeof e=="object"&&e!==null&&Object.keys(e).length===0)&&(o+=" You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.");var g=tr();g?o+=g:o+=_e();var d;e===null?d="null":Z(e)?d="array":e!==void 0&&e.$$typeof===x?(d="<"+(P(e.type)||"Unknown")+" />",o=" Did you accidentally export a JSX literal instead of a component?"):d=typeof e,s("React.jsx: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s",d,o);}var v=rr(e,r,t,c,u);if(v==null)return v;if(l){var j=r.children;if(j!==void 0)if(n)if(Z(j)){for(var W=0;W<j.length;W++)Ce(j[W],e);Object.freeze&&Object.freeze(j);}else s("React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.");else Ce(j,e);}if(M.call(r,"key")){var F=P(e),y=Object.keys(r).filter(function(fr){return fr!=="key"}),te=y.length>0?"{key: someKey, "+y.join(": ..., ")+": ...}":"{key: someKey}";if(!Se[F+te]){var ur=y.length>0?"{"+y.join(": ..., ")+": ...}":"{}";s(`A props object containing a "key" prop is being spread into JSX: let props = %s; <%s {...props} /> React keys must be passed directly to JSX without using spread: let props = %s; <%s key={someKey} {...props} />`,te,F,ur,F),Se[F+te]=true;}}return e===b?ir(v):nr(v),v}}function sr(e,r,t){return we(e,r,t,true)}function or(e,r,t){return we(e,r,t,false)}var lr=or,cr=sr;U.Fragment=b,U.jsx=lr,U.jsxs=cr;}()),U}process.env.NODE_ENV==="production"?ae.exports=dr():ae.exports=vr();var a=ae.exports;const ke=({comments:_,onAddComment:x,currentUser:S="Current User"})=>{const[b,R]=I.useState(""),C=i=>{i.preventDefault(),b.trim()&&(x(b),R(""));},T=i=>{const p=new Date(i),h=new Date().getTime()-p.getTime(),m=Math.floor(h/6e4);return m<1?"Just now":m<60?`${m}m ago`:m<1440?`${Math.floor(m/60)}h ago`:p.toLocaleDateString()},E=i=>i.split(" ").map(p=>p[0]).join("").toUpperCase().slice(0,2);return a.jsxs("div",{className:"comments",children:[a.jsx("header",{className:"comments-header",children:a.jsxs("h3",{children:["Comments (",_.length,")"]})}),a.jsx("div",{className:"comments-content",children:_.length===0?a.jsxs("div",{className:"comments-empty",children:[a.jsx("div",{children:"💬"}),a.jsx("p",{children:"No comments yet"}),a.jsx("span",{children:"Be the first to add a comment!"})]}):a.jsx("div",{className:"comments-list",children:_.map(i=>a.jsxs("div",{className:"comment",children:[a.jsx("div",{className:"comment-avatar",children:i.avatar?a.jsx("img",{src:i.avatar,alt:i.author}):a.jsx("div",{className:"avatar-initials",children:E(i.author)})}),a.jsxs("div",{className:"comment-content",children:[a.jsxs("div",{className:"comment-header",children:[a.jsx("span",{className:"comment-author",children:i.author}),a.jsx("span",{className:"comment-time",children:T(i.timestamp)})]}),a.jsx("div",{className:"comment-text",children:i.content})]})]},i.id))})}),a.jsx("footer",{className:"comments-footer",children:a.jsxs("form",{onSubmit:C,className:"comment-form",children:[a.jsxs("div",{className:"comment-input-group",children:[a.jsx("div",{className:"avatar-initials small",children:E(S)}),a.jsx("textarea",{value:b,onChange:i=>R(i.target.value),placeholder:"Add a comment...",rows:2})]}),a.jsxs("div",{className:"comment-actions",children:[a.jsx("button",{type:"button",onClick:()=>R(""),disabled:!b.trim(),className:"btn-secondary",children:"Clear"}),a.jsx("button",{type:"submit",disabled:!b.trim(),className:"btn-primary",children:"Add Comment"})]})]})})]})},Ne=()=>({id:Date.now().toString(),title:"",description:"",complete:false,assignedTo:"",dueDate:"",comments:[]}),mr=({isOpen:_,onClose:x,item:S,onSave:b,title:R="Edit Item",showComments:C=false,onAddComment:T,currentUser:E="Current User"})=>{const[i,p]=I.useState(Ne),[f,h]=I.useState({}),[m,N]=I.useState(false);I.useEffect(()=>{p(S||Ne()),h({});},[S,_]);const V=()=>{const s={};return i.title.trim()||(s.title="Title is required"),i.description.trim()||(s.description="Description is required"),i.assignedTo.trim()||(s.assignedTo="Assigned to is required"),h(s),Object.keys(s).length===0},G=async s=>{s.preventDefault(),V()&&(N(true),await new Promise(D=>setTimeout(D,300)),b(i),x(),N(false));},k=(s,D)=>{p(O=>({...O,[s]:D})),f[s]&&h(O=>({...O,[s]:""}));},w=s=>{if(!T||!i.id)return;const D={id:Date.now().toString(),author:E,content:s,timestamp:new Date().toISOString()};p(O=>({...O,comments:[...O.comments||[],D]})),T(i.id,s);};return _?a.jsx("div",{className:"cart-overlay",onClick:s=>s.target===s.currentTarget&&x(),children:a.jsxs("div",{className:`cart-modal ${C?"with-comments":""}`,children:[a.jsxs("header",{className:"cart-header",children:[a.jsx("h2",{children:R}),a.jsx("button",{onClick:x,"aria-label":"Close",children:"×"})]}),a.jsxs("div",{className:"cart-main",children:[a.jsxs("form",{onSubmit:G,className:"cart-form",children:[a.jsxs("div",{className:"cart-content",children:[a.jsxs("div",{className:"field",children:[a.jsx("label",{children:"Title *"}),a.jsx("input",{value:i.title,onChange:s=>k("title",s.target.value),placeholder:"Enter title",className:f.title?"error":""}),f.title&&a.jsx("span",{className:"error-text",children:f.title})]}),a.jsxs("div",{className:"field",children:[a.jsx("label",{children:"Description *"}),a.jsx("textarea",{value:i.description,onChange:s=>k("description",s.target.value),placeholder:"Enter description",rows:3,className:f.description?"error":""}),f.description&&a.jsx("span",{className:"error-text",children:f.description})]}),a.jsxs("div",{className:"field-row",children:[a.jsxs("div",{className:"field",children:[a.jsx("label",{children:"Assigned To *"}),a.jsx("input",{value:i.assignedTo,onChange:s=>k("assignedTo",s.target.value),placeholder:"Enter assignee",className:f.assignedTo?"error":""}),f.assignedTo&&a.jsx("span",{className:"error-text",children:f.assignedTo})]}),a.jsxs("div",{className:"field",children:[a.jsx("label",{children:"Due Date"}),a.jsx("input",{type:"date",value:i.dueDate,onChange:s=>k("dueDate",s.target.value)})]})]}),a.jsx("div",{className:"field-row",children:a.jsx("div",{className:"field checkbox-field",children:a.jsxs("label",{children:[a.jsx("input",{type:"checkbox",checked:i.complete,onChange:s=>k("complete",s.target.checked)}),"Mark as Complete"]})})})]}),a.jsxs("footer",{className:"cart-footer",children:[a.jsx("button",{type:"button",onClick:x,className:"btn-secondary",children:"Cancel"}),a.jsx("button",{type:"submit",disabled:m,className:"btn-primary",children:m?"Saving...":"Save"})]})]}),C&&a.jsx(ke,{comments:i.comments||[],onAddComment:w,currentUser:E})]})]})}):null};exports.CartEditor=mr;exports.CommentSidebar=ke; } (dist)); var TodoList = function (_a) { var _b = _a.items, items = _b === void 0 ? [] : _b, onAddItem = _a.onAddItem, onToggleItem = _a.onToggleItem; _a.onDeleteItem; var onEditItem = _a.onEditItem, _c = _a.showCompleted, showCompleted = _c === void 0 ? true : _c, _d = _a.allowEdit, allowEdit = _d === void 0 ? true : _d; _a.allowDelete; var _f = _a.showPriority, showPriority = _f === void 0 ? false : _f, _g = _a.showCategory, showCategory = _g === void 0 ? false : _g, _h = _a.showDueDate, showDueDate = _h === void 0 ? false : _h, _j = _a.showAssignedTo, showAssignedTo = _j === void 0 ? false : _j; _a.placeholder; var className = _a.className, _l = _a.theme, theme = _l === void 0 ? 'light' : _l, maxItems = _a.maxItems, _m = _a.sortBy, sortBy = _m === void 0 ? 'createdAt' : _m, _o = _a.sortOrder, sortOrder = _o === void 0 ? 'desc' : _o; // State - keeping it simple and focused var _p = require$$0.useState(''), searchTerm = _p[0], setSearchTerm = _p[1]; var _q = require$$0.useState(sortBy), sortField = _q[0], setSortField = _q[1]; var _r = require$$0.useState(sortOrder), sortDirection = _r[0], setSortDirection = _r[1]; // Cart Editor state var _s = require$$0.useState(false), isEditorOpen = _s[0], setIsEditorOpen = _s[1]; var _t = require$$0.useState(null), currentEditItem = _t[0], setCurrentEditItem = _t[1]; var _u = require$$0.useState(false), isCreatingNew = _u[0], setIsCreatingNew = _u[1]; // Pure utility functions - beautiful in their simplicity var formatDate = function (date) { return date.toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' }); }; var getPriorityVariant = function (priority) { var variants = { high: 'danger', medium: 'warning', low: 'success' }; return variants[priority] || 'secondary'; }; var isOverdue = function (dueDate) { return !!dueDate && dueDate < new Date(); }; // Convert TodoItem to CartItem for the editor var todoToCartItem = function (todo) { return ({ id: todo.id, title: todo.text, description: "Created: ".concat(formatDate(todo.createdAt)).concat(todo.updatedAt !== todo.createdAt ? " | Updated: ".concat(formatDate(todo.updatedAt)) : ''), complete: todo.completed, assignedTo: todo.assignedTo || 'Unassigned', dueDate: todo.dueDate ? todo.dueDate.toISOString().split('T')[0] : undefined, comments: todo.comments || [] }); }; // Convert CartItem back to TodoItem updates var cartItemToTodoUpdate = function (cartItem, originalTodo) { return (__assign(__assign({}, originalTodo), { text: cartItem.title, completed: cartItem.complete, assignedTo: cartItem.assignedTo === 'Unassigned' ? undefined : cartItem.assignedTo, dueDate: cartItem.dueDate ? new Date(cartItem.dueDate) : undefined, comments: cartItem.comments, updatedAt: new Date() })); }; // Event handlers - clean and purposeful var toggleTodo = function (id) { return onToggleItem === null || onToggleItem === void 0 ? void 0 : onToggleItem(id); }; // Cart Editor handlers var openEditor = function (item) { setCurrentEditItem(item); setIsCreatingNew(false); setIsEditorOpen(true); }; var openNewTodoEditor = function () { setCurrentEditItem(null); setIsCreatingNew(true); setIsEditorOpen(true); }; var closeEditor = function () { setIsEditorOpen(false); setCurrentEditItem(null); setIsCreatingNew(false); }; var saveFromEditor = function (cartItem) { if (isCreatingNew && onAddItem) { // Creating a new todo onAddItem(cartItem.title); } else if (currentEditItem && onEditItem) { // Editing existing todo var updatedTodo = cartItemToTodoUpdate(cartItem, currentEditItem); onEditItem(updatedTodo.id, updatedTodo.text); } closeEditor(); }; // Create a new CartItem for new todo creation var createNewCartItem = function () { return ({ id: Date.now().toString(), title: '', description: 'New task', complete: false, assignedTo: 'Unassigned', dueDate: undefined, comments: [] }); }; var handleSort = function (field) { var validField = field; if (sortField === validField) { setSortDirection(function (prev) { return prev === 'asc' ? 'desc' : 'asc'; }); } else { setSortField(validField); setSortDirection('asc'); } }; // Smart filtering and sorting - elegant logic var processedItems = require$$0.useMemo(function () { var searchLower = searchTerm.toLowerCase(); // Filter chain - readable and efficient var filtered = items .filter(function (item) { return showCompleted || !item.completed; }) .filter(function (item) { var _a, _b; return !searchTerm || item.text.toLowerCase().includes(searchLower) || ((_a = item.category) === null || _a === void 0 ? void 0 : _a.toLowerCase().includes(searchLower)) || ((_b = item.assignedTo) === null || _b === void 0 ? void 0 : _b.toLowerCase().includes(searchLower)); }); // Smart sorting - handles all types elegantly var getSortValue = function (item, field) { var _a; switch (field) { case 'text': return item.text.toLowerCase(); case 'priority': return { high: 3, medium: 2, low: 1 }[item.priority] || 0; case 'dueDate': return ((_a = item.dueDate) === null || _a === void 0 ? void 0 : _a.getTime()) || 0; case 'createdAt': default: return item.createdAt.getTime(); } }; filtered.sort(function (a, b) { var aVal = getSortValue(a, sortField); var bVal = getSortValue(b, sortField); var comparison = typeof aVal === 'string' ? aVal.localeCompare(bVal) : aVal - bVal; return sortDirection === 'asc' ? comparison : -comparison; }); return maxItems ? filtered.slice(0, maxItems) : filtered; }, [items, searchTerm, showCompleted, sortField, sortDirection, maxItems]); // Elegant sortable header component var SortableHeader = function (_a) { var children = _a.children, field = _a.field; var isActive = sortField === field; var icon = isActive ? (sortDirection === 'asc' ? '↑' : '↓') : '↕'; return (jsxRuntime.jsx("th", { className: "user-select-none", style: { cursor: 'pointer' }, onClick: function () { return handleSort(field); }, children: jsxRuntime.jsxs("div", { className: "d-flex justify-content-between align-items-center", children: [jsxRuntime.jsx("span", { children: children }), jsxRuntime.jsx("span", { className: "text-muted ms-1", children: icon })] }) })); }; // Clean derived state var stats = { total: items.length, completed: items.filter(function (item) { return item.completed; }).length, get remaining() { return this.total - this.completed; } }; var columns = [ { show: true, key: 'status', label: 'Status', width: '60px' }, { show: true, key: 'text', label: 'Task', sortable: true }, { show: showPriority, key: 'priority', label: 'Priority', sortable: true }, { show: showCategory, key: 'category', label: 'Category' }, { show: showDueDate, key: 'dueDate', label: 'Due Date', sortable: true }, { show: showAssignedTo, key: 'assignedTo', label: 'Assigned To', sortable: true }, { show: true, key: 'createdAt', label: 'Created', sortable: true } ].filter(function (col) { return col.show; }); var totalColumns = columns.length; return (jsxRuntime.jsx("div", { className: clsx('todolist', "todolist--".concat(theme), className), children: jsxRuntime.jsxs("div", { className: "container-fluid", children: [jsxRuntime.jsx("div", { className: "card shadow-sm", children: jsxRuntime.jsxs("div", { className: "card-body", children: [jsxRuntime.jsxs("div", { className: "row align-items-center mb-3", children: [jsxRuntime.jsx("div", { className: "col-md-6", children: jsxRuntime.jsxs("div", { className: "d-flex align-items-center", children: [jsxRuntime.jsx("span", { className: "badge bg-primary me-2", children: processedItems.length }), jsxRuntime.jsxs("small", { className: "text-muted", children: [stats.completed, " of ", stats.total, " completed"] })] }) }), jsxRuntime.jsx("div", { className: "col-md-6", children: jsxRuntime.jsxs("div", { className: "input-group", children: [jsxRuntime.jsx("span", { className: "input-group-text", children: jsxRuntime.jsx("i", { className: "fas fa-search" }) }), jsxRuntime.jsx("input", { type: "text", className: "form-control", placeholder: "Search tasks...", value: searchTerm, onChange: function (e) { return setSearchTerm(e.target.value); } })] }) })] }), onAddItem && (jsxRuntime.jsx("div", { className: "mb-3", children: jsxRuntime.jsxs("button", { className: "btn btn-primary", onClick: openNewTodoEditor, type: "button", children: [jsxRuntime.jsx("i", { className: "fas fa-plus me-2" }), "Add New Todo"] }) })), jsxRuntime.jsx("div", { className: "table-responsive", children: jsxRuntime.jsxs("table", { className: "table table-striped table-hover", children: [jsxRuntime.jsx("thead", { className: "table-dark", children: jsxRuntime.jsx("tr", { children: columns.map(function (_a) { var key = _a.key, label = _a.label, sortable = _a.sortable, width = _a.width; return (sortable ? (jsxRuntime.jsx(SortableHeader, { field: key, children: label }, key)) : (jsxRuntime.jsx("th", { style: width ? { width: width } : undefined, children: label }, key))); }) }) }), jsxRuntime.jsx("tbody", { children: processedItems.length === 0 ? (jsxRuntime.jsx("tr", { children: jsxRuntime.jsx("td", { colSpan: totalColumns, className: "text-center py-4", children: jsxRuntime.jsxs("div", { className: "text-muted", children: [jsxRuntime.jsx("i", { className: "fas fa-tasks fa-2x mb-3 d-block" }), searchTerm ? 'No tasks found matching your search' : 'No tasks yet. Add one above!'] }) }) })) : (processedItems.map(function (item) { return (jsxRuntime.jsx(TodoRow, { item: item, onToggle: toggleTodo, onOpenEditor: openEditor, formatDate: formatDate, getPriorityVariant: getPriorityVariant, isOverdue: isOverdue, showPriority: showPriority, showCategory: showCategory, showDueDate: showDueDate, showAssignedTo: showAssignedTo, allowEdit: allowEdit }, item.id)); })) })] }) }), processedItems.length > 0 && (jsxRuntime.jsx("div", { className: "mt-3 pt-3 border-top", children: jsxRuntime.jsxs("div", { className: "row text-center", children: [jsxRuntime.jsx("div", { className: "col-md-4", children: jsxRuntime.jsxs("div", { className: "text-muted", children: [jsxRuntime.jsx("i", { className: "fas fa-list me-1" }), jsxRuntime.jsx("strong", { children: processedItems.length }), " task", processedItems.length !== 1 ? 's' : '', " shown"] }) }), jsxRuntime.jsx("div", { className: "col-md-4", children: jsxRuntime.jsxs("div", { className: "text-success", children: [jsxRuntime.jsx("i", { className: "fas fa-check-circle me-1" }), jsxRuntime.jsx("strong", { children: stats.completed }), " completed"] }) }), jsxRuntime.jsx("div", { className: "col-md-4", children: jsxRuntime.jsxs("div", { className: "text-primary", children: [jsxRuntime.jsx("i", { className: "fas fa-clock me-1" }), jsxRuntime.jsx("strong", { children: stats.remaining }), " remaining"] }) })] }) }))] }) }), isEditorOpen && (jsxRuntime.jsx(dist.CartEditor, { item: isCreatingNew ? createNewCartItem() : todoToCartItem(currentEditItem), isOpen: isEditorOpen, onSave: saveFromEditor, onClose: closeEditor, showComments: true }))] }) })); }; var TodoRow = function (_a) { var item = _a.item, onToggle = _a.onToggle, onOpenEditor = _a.onOpenEditor, formatDate = _a.formatDate, getPriorityVariant = _a.getPriorityVariant; _a.isOverdue; var showPriority = _a.showPriority, showCategory = _a.showCategory, showDueDate = _a.showDueDate, showAssignedTo = _a.showAssignedTo, allowEdit = _a.allowEdit; var rowClass = clsx({ 'table-success': item.completed }); return (jsxRuntime.jsxs("tr", { className: rowClass, children: [jsxRuntime.jsx("td", { children: jsxRuntime.jsx("button", { className: clsx('btn btn-sm rounded-circle', { 'btn-success': item.completed, 'btn-outline-secondary': !item.completed }), onClick: function () { return onToggle(item.id); }, title: item.completed ? 'Mark as incomplete' : 'Mark as complete', style: { width: '32px', height: '32px' }, children: jsxRuntime.jsx("i", { className: "fas fa-".concat(item.completed ? 'check' : 'circle') }) }) }), jsxRuntime.jsx("td", { children: jsxRuntime.jsx("span", { className: clsx('d-inline-block', { 'text-decoration-line-through text-muted': item.completed, 'cursor-pointer': allowEdit }), onClick: allowEdit ? function () { return onOpenEditor(item); } : undefined, title: allowEdit ? "Click to edit in detailed editor" : undefined, style: allowEdit ? { cursor: 'pointer' } : undefined, children: item.text }) }), showPriority && (jsxRuntime.jsx("td", { children: item.priority && (jsxRuntime.jsxs("span", { className: "badge bg-".concat(getPriorityVariant(item.priority)), children: [jsxRuntime.jsx("i", { className: "fas fa-exclamation-triangle me-1" }), item.priority] })) })), showCategory && (jsxRuntime.jsx("td", { children: item.category && (jsxRuntime.jsxs("span", { className: "badge bg-info", children: [jsxRuntime.jsx("i", { className: "fas fa-tag me-1" }), item.category] })) })), showDueDate && (jsxRuntime.jsx("td", { children: item.dueDate ? (jsxRuntime.jsxs("span", { className: clsx('small', { 'text-muted': item.completed }), children: [jsxRuntime.jsx("i", { className: "fas fa-calendar me-1" }), formatDate(item.dueDate)] })) : (jsxRuntime.jsx("span", { className: "text-muted", children: "-" })) })), showAssignedTo && (jsxRuntime.jsx("td", { children: item.assignedTo ? (jsxRuntime.jsxs("span", { className: "small", children: [jsxRuntime.jsx("i", { className: "fas fa-user me-1" }), item.assignedTo] })) : (jsxRuntime.jsx("span", { className: "text-muted", children: "-" })) })), jsxRuntime.jsx("td", { children: jsxRuntime.jsxs("span", { className: "small text-muted", children: [jsxRuntime.jsx("i", { className: "fas fa-clock me-1" }), formatDate(item.createdAt)] }) })] })); }; exports.TodoList = TodoList; //# sourceMappingURL=index.js.map