trotl-table 1.0.96 → 1.0.97

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.css CHANGED
@@ -1,2 +1,2 @@
1
- :root{--z-index-dropdown:9999;--bg:#fff;--text:#1b1b1b;--accent:#ff4500;--secondary:#e0e0e0;--highlight:#00c896;--font-heading:"Bebas Neue",sans-serif;--font-body:"Inter",sans-serif;--bg-color:#fff;--text-color:#111;--accent-color:#646cffaa;--card-radius:12px;--card-shadow:0 4px 12px rgba(0,0,0,.1);--font-family:"Segoe UI",sans-serif;--btn-view-bg:var(--accent-color,#646cffaa);--btn-edit-bg:#4caf50;--btn-delete-bg:#f44336;--btn-text-color:#fff;--bg-light:#fff;--bg-dark:#1e1e1e;--text-light:#000;--text-dark:#f0f0f0;--accent-light:#0078d4;--accent-dark:#00b7c3;--border-light:#ccc;--border-dark:#444;--cld-bg-color:rgba(0,0,0,.03);--bc-color:var(--text-muted,#666);--editor-border:#ccc;--input-bg:#fff;--input-text:#333;--bg-card-header:#ababab;--color-bg-DebounceSelect:#fff;--table-bg:#93a4a7;--table-color:#fff;--table-hover-bg:#e4e4e4;--table-hover-color:#000;--table-bg-nth-child:#f7f7f7;--tabs-bg:#f0e9e9;--tab-inactive-bg:#c9c9c9;--tab-active-bg:#2995a3;--tab-bg:#2995a3;--tab-color:#fff;--border-color:#2995a3;.table-cell-input{border:1px solid var(--border-light,#ccc);padding:2px 4px}.table-cell-input:focus{border-color:grey;outline:none}}[data-theme=dark]{--tabs-bg:#1b1b1b;--tab-inactive-bg:#383838;--tab-bg:#2995a3;--tab-color:#fff;--bg:#1b1b1b;--text:#e0e0e0;--accent:#ff4500;--secondary:#333;--highlight:#00c896;--bg-color:#111;--text-color:#f5f5f5;--accent-color:#61dafbaa;--btn-view-bg:var(--accent-color,#61dafbaa);--btn-edit-bg:#81c784;--btn-delete-bg:#e57373;--btn-text-color:#fff;--cld-bg-color:hsla(0,0%,56%,.04);--bc-color:red;--bc-bg:#1b1b1b;--editor-border:#555;--input-bg:#222;--input-text:#eee;--color-bg-DebounceSelect:#1b1b1b;--table-hover-bg:#d03e1f;--table-hover-color:#fff;--table-bg-nth-child:#363636}body{background:var(--bg-color);color:var(--text-color);margin:0;transition:background .3s ease,color .3s ease}.header-content-search{bottom:35px;left:2px;position:fixed;width:200px;z-index:10000}.body-content{bottom:0;box-sizing:border-box;left:0;overflow-y:auto;padding:10px;position:absolute;right:0;top:0}.filters{top:10px}.fieldsInline{align-items:center;display:flex;gap:10px;justify-content:space-between}.left{flex:1}.right{flex:none;margin-left:auto}.spinnerOverlay{align-items:center;background:var(--overlay-bg);display:flex;height:100%;justify-content:center;left:0;position:absolute;top:0;width:100%;z-index:999}.spinnerOver{animation:spin 1s linear infinite;border-top:4px solid var(--spinner-border);border:4px solid var(--spinner-border);border-radius:50%;border-top-color:var(--spinner-top);height:40px;width:40px}@keyframes spin{to{transform:rotate(1turn)}}.layout-container{box-sizing:border-box;display:flex;flex-direction:column}.scroll-section{flex:1;overflow-y:auto}.first-scroll{max-height:40vh}.basic-button{background:linear-gradient(90deg,#007bff,#00bfff);border:none;box-shadow:0 2px 4px rgba(0,0,0,.1);font-size:1rem;font-weight:500;padding:.5rem 1rem;transition:background .3s ease,transform .2s ease}.basic-button,.basic-button-small{border-radius:2px;color:#fff;cursor:pointer}.basic-button-small{background:#999;border:none;flex:1;padding:6px}.confirm{background:red}.basic-button-small:hover,.basic-button:hover{background:linear-gradient(90deg,#0056b3,#09c);transform:translateY(-1px)}.basic-button:active{box-shadow:inset 0 2px 4px rgba(0,0,0,.2);transform:translateY(0)}.basic-button:disabled{background:#ccc;color:#666;cursor:not-allowed}.basic-input{background-color:#fff;border:1px solid #ccc;border-radius:2px;box-sizing:border-box;color:#333;font-size:1rem;font-weight:400;height:34px;outline:none;padding:0 .75rem;transition:border-color .3s ease,box-shadow .2s ease;width:100%}.basic-input:focus{border-color:#007bff;box-shadow:0 0 0 2px rgba(0,123,255,.2)}.basic-input:disabled{background-color:#f5f5f5;color:#999;cursor:not-allowed}.basic-select{appearance:none;background-color:#fff;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 140 140' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='m35 50 35 35 35-35' stroke='%23333' stroke-width='15' fill='none' stroke-linecap='round'/%3E%3C/svg%3E");background-position:right .75rem center;background-repeat:no-repeat;background-size:12px;border:1px solid #ccc;border-radius:2px;box-sizing:border-box;color:#333;cursor:pointer;font-size:1rem;font-weight:400;height:34px;outline:none;padding:0 .75rem;transition:border-color .3s ease,box-shadow .2s ease;width:100%}.basic-select:focus{border-color:#007bff;box-shadow:0 0 0 2px rgba(0,123,255,.2)}.basic-select:disabled{background-color:#f5f5f5;color:#999;cursor:not-allowed}.basic-checkbox{accent-color:#007bff;cursor:pointer;height:18px;margin:0;transition:transform .2s ease;width:18px}.basic-checkbox:focus{outline:none;transform:scale(1.1)}.basic-checkbox:disabled{accent-color:#ccc;cursor:not-allowed}.basic-checkbox-label{align-items:center;display:flex;font-size:1rem;gap:.5rem;height:34px}.basic-input-dropdown-menu{background-color:var(--color-bg-DebounceSelect);border:1px solid var(--color-border);border-radius:2px;box-shadow:0 2px 6px rgba(0,0,0,.1);box-sizing:border-box;left:0;max-height:200px;overflow-y:auto;position:absolute;right:0;top:100%;width:100%;z-index:var(--z-index-dropdown)}.basic-input-dropdown-item{cursor:pointer;padding:8px;transition:background-color .2s ease}.loading,.no-results-dropdown-item{color:var(--color-loading);font-style:italic;padding:8px}.modal-overlay{align-items:center;display:flex;height:100%;justify-content:center;left:0;position:fixed;top:0;width:100%;z-index:999}.modal-box{background:var(--bg);border-radius:2px;box-shadow:0 4px 12px rgba(0,0,0,.2);max-height:90vh;max-width:400px;max-width:90vw;overflow:auto;padding:1.5rem;position:relative;resize:both;width:100%}.modal-box.overflowing:after{bottom:8px;color:#888;content:"↘";cursor:se-resize;font-size:.75rem;pointer-events:none;position:absolute;right:8px}.modal-title{font-size:1.25rem;margin-bottom:1rem;margin-top:0}.modal-content{margin-bottom:1.5rem;max-height:80vh;overflow:auto}.modal-actions{display:flex;gap:.5rem;justify-content:flex-end}.modal-btn{border:none;border-radius:4px;cursor:pointer;padding:.5rem 1rem}.modal-btn.cancel{background-color:#ccc}.modal-btn.confirm{background-color:var(--accent-light);font-weight:700}.small-button-icon{align-items:center;background:hsla(0,0%,100%,.3);border:none;border-radius:2;color:#fff;cursor:pointer;display:flex;font-weight:700;height:22;justify-content:center;padding:5;width:26}.table-container{border-radius:2px;display:flex;flex-direction:column;height:100%;min-height:0;overflow-x:auto;overflow-y:hidden;width:100%}.table-header{background:var(--table-bg);color:var(--table-color);font-weight:700;min-width:max-content;transition:margin-right .2s ease}.header-row .table-cell{position:relative}.column-resizer{bottom:0;cursor:col-resize;position:absolute;right:0;top:0;width:10px;z-index:2}.column-resizer:hover{background:rgba(0,0,0,.05)}.header-row{background:var(--table-bg);color:var(--table-color)}.table-header.scroll-adjust{margin-right:15px}.main-table{flex:1 1 auto;min-height:0;overflow:hidden;width:100%}.virtual-table{display:flex;flex-direction:column;min-width:0}.table-row{align-items:center;border-bottom:1px solid #d0d0d0;box-sizing:border-box;display:flex;overflow:hidden;width:100%}.table-row.group-row{background-color:#f5f5f5;border-bottom:2px solid #999;font-weight:700}.group-header{flex:1 1 0%;font-weight:700;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.table-row:nth-child(2n){background-color:var(--table-bg-nth-child)}.virtual-table .table-row:not(:first-child):hover{background-color:var(--table-hover-bg);color:var(--table-hover-color);cursor:pointer}.table-cell{border:1px solid #e0e0e0;flex:1 1 0%;max-width:100%;min-width:0;overflow:hidden;padding:8px;text-align:left;text-overflow:ellipsis;white-space:nowrap}.group-row .table-cell{border:none}.checkbox-cell,.key-cell{flex:0 0 40px;text-align:center}.action-cell{overflow:hidden}.action-cell,.table-cell.action-cell{display:flex;gap:4px;justify-content:center}.table-cell.action-cell{align-items:center;border:none;box-sizing:border-box;flex-wrap:nowrap;padding:4px}.action-btn-table{border:none;border-radius:2px;color:#fff;cursor:pointer;font-size:12px;height:24px;line-height:1;padding:2px 6px;transition:background-color .2s ease;white-space:nowrap}.action-btn:hover{opacity:.9}.table-row:hover{background-color:var(--table-hover-bg,#e6f0ff);color:var(--table-hover-color,#000);cursor:pointer;transition:background-color .2s ease,color .2s ease}.row-main{display:flex;flex:1;min-width:0;overflow:hidden}.highlight{background-color:#ff0;font-weight:700}
1
+ :root{--z-index-dropdown:9999;--bg:#fff;--text:#1b1b1b;--accent:#ff4500;--secondary:#e0e0e0;--highlight:#00c896;--font-heading:"Bebas Neue",sans-serif;--font-body:"Inter",sans-serif;--bg-color:#fff;--text-color:#111;--accent-color:#646cffaa;--card-radius:12px;--card-shadow:0 4px 12px rgba(0,0,0,.1);--font-family:"Segoe UI",sans-serif;--btn-view-bg:var(--accent-color,#646cffaa);--btn-edit-bg:#4caf50;--btn-delete-bg:#f44336;--btn-text-color:#fff;--bg-light:#fff;--bg-dark:#1e1e1e;--text-light:#000;--text-dark:#f0f0f0;--accent-light:#0078d4;--accent-dark:#00b7c3;--border-light:#ccc;--border-dark:#444;--cld-bg-color:rgba(0,0,0,.03);--bc-color:var(--text-muted,#666);--editor-border:#ccc;--input-bg:#fff;--input-text:#333;--bg-card-header:#ababab;--color-bg-DebounceSelect:#fff;--table-bg:#93a4a7;--table-color:#fff;--table-hover-bg:#e4e4e4;--table-hover-color:#000;--table-bg-nth-child:#f7f7f7;--tabs-bg:#f0e9e9;--tab-inactive-bg:#c9c9c9;--tab-active-bg:#2995a3;--tab-bg:#2995a3;--tab-color:#fff;--border-color:#2995a3;.table-cell-input{border:1px solid var(--border-light,#ccc);padding:2px 4px}.table-cell-input:focus{border-color:grey;outline:none}}[data-theme=dark]{--tabs-bg:#1b1b1b;--tab-inactive-bg:#383838;--tab-bg:#2995a3;--tab-color:#fff;--bg:#1b1b1b;--text:#e0e0e0;--accent:#ff4500;--secondary:#333;--highlight:#00c896;--bg-color:#111;--text-color:#f5f5f5;--accent-color:#61dafbaa;--btn-view-bg:var(--accent-color,#61dafbaa);--btn-edit-bg:#81c784;--btn-delete-bg:#e57373;--btn-text-color:#fff;--cld-bg-color:hsla(0,0%,56%,.04);--bc-color:red;--bc-bg:#1b1b1b;--editor-border:#555;--input-bg:#222;--input-text:#eee;--color-bg-DebounceSelect:#1b1b1b;--table-hover-bg:#d03e1f;--table-hover-color:#fff;--table-bg-nth-child:#363636}body{background:var(--bg-color);color:var(--text-color);margin:0;transition:background .3s ease,color .3s ease}.header-content-search{bottom:35px;left:2px;position:fixed;width:200px;z-index:10000}.body-content{bottom:0;box-sizing:border-box;left:0;overflow-y:auto;padding:10px;position:absolute;right:0;top:0}.filters{top:10px}.fieldsInline{align-items:center;display:flex;gap:10px;justify-content:space-between}.left{flex:1}.right{flex:none;margin-left:auto}.spinnerOverlay{align-items:center;background:var(--overlay-bg);display:flex;height:100%;justify-content:center;left:0;position:absolute;top:0;width:100%;z-index:999}.spinnerOver{animation:spin 1s linear infinite;border-top:4px solid var(--spinner-border);border:4px solid var(--spinner-border);border-radius:50%;border-top-color:var(--spinner-top);height:40px;width:40px}@keyframes spin{to{transform:rotate(1turn)}}.layout-container{box-sizing:border-box;display:flex;flex-direction:column}.scroll-section{flex:1;overflow-y:auto}.first-scroll{max-height:40vh}.basic-button{background:linear-gradient(90deg,#007bff,#00bfff);border:none;box-shadow:0 2px 4px rgba(0,0,0,.1);font-size:1rem;font-weight:500;padding:.5rem 1rem;transition:background .3s ease,transform .2s ease}.basic-button,.basic-button-small{border-radius:2px;color:#fff;cursor:pointer}.basic-button-small{background:#999;border:none;flex:1;padding:6px}.confirm{background:red}.basic-button-small:hover,.basic-button:hover{background:linear-gradient(90deg,#0056b3,#09c);transform:translateY(-1px)}.basic-button:active{box-shadow:inset 0 2px 4px rgba(0,0,0,.2);transform:translateY(0)}.basic-button:disabled{background:#ccc;color:#666;cursor:not-allowed}.basic-input{background-color:#fff;border:1px solid #ccc;border-radius:2px;box-sizing:border-box;color:#333;font-size:1rem;font-weight:400;height:34px;outline:none;padding:0 .75rem;transition:border-color .3s ease,box-shadow .2s ease;width:100%}.basic-input:focus{border-color:#007bff;box-shadow:0 0 0 2px rgba(0,123,255,.2)}.basic-input:disabled{background-color:#f5f5f5;color:#999;cursor:not-allowed}.basic-select{appearance:none;background-color:#fff;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 140 140' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='m35 50 35 35 35-35' stroke='%23333' stroke-width='15' fill='none' stroke-linecap='round'/%3E%3C/svg%3E");background-position:right .75rem center;background-repeat:no-repeat;background-size:12px;border:1px solid #ccc;border-radius:2px;box-sizing:border-box;color:#333;cursor:pointer;font-size:1rem;font-weight:400;height:34px;outline:none;padding:0 .75rem;transition:border-color .3s ease,box-shadow .2s ease;width:100%}.basic-select:focus{border-color:#007bff;box-shadow:0 0 0 2px rgba(0,123,255,.2)}.basic-select:disabled{background-color:#f5f5f5;color:#999;cursor:not-allowed}.basic-checkbox{accent-color:#007bff;cursor:pointer;height:18px;margin:0;transition:transform .2s ease;width:18px}.basic-checkbox:focus{outline:none;transform:scale(1.1)}.basic-checkbox:disabled{accent-color:#ccc;cursor:not-allowed}.basic-checkbox-label{align-items:center;display:flex;font-size:1rem;gap:.5rem;height:34px}.basic-input-dropdown-menu{background-color:var(--color-bg-DebounceSelect);border:1px solid var(--color-border);border-radius:2px;box-shadow:0 2px 6px rgba(0,0,0,.1);box-sizing:border-box;left:0;max-height:200px;overflow-y:auto;position:absolute;right:0;top:100%;width:100%;z-index:var(--z-index-dropdown)}.basic-input-dropdown-item{cursor:pointer;padding:8px;transition:background-color .2s ease}.loading,.no-results-dropdown-item{color:var(--color-loading);font-style:italic;padding:8px}.modal-overlay{align-items:center;display:flex;height:100%;justify-content:center;left:0;position:fixed;top:0;width:100%;z-index:999}.modal-box{background:var(--bg);border-radius:2px;box-shadow:0 4px 12px rgba(0,0,0,.2);max-height:90vh;max-width:400px;max-width:90vw;overflow:auto;padding:1.5rem;position:relative;resize:both;width:100%}.modal-box.overflowing:after{bottom:8px;color:#888;content:"↘";cursor:se-resize;font-size:.75rem;pointer-events:none;position:absolute;right:8px}.modal-title{font-size:1.25rem;margin-bottom:1rem;margin-top:0}.modal-content{margin-bottom:1.5rem;max-height:80vh;overflow:auto}.modal-actions{display:flex;gap:.5rem;justify-content:flex-end}.modal-btn{border:none;border-radius:4px;cursor:pointer;padding:.5rem 1rem}.modal-btn.cancel{background-color:#ccc}.modal-btn.confirm{background-color:var(--accent-light);font-weight:700}.small-button-icon{align-items:center;background:hsla(0,0%,100%,.3);border:none;border-radius:2;color:#fff;cursor:pointer;display:flex;font-weight:700;height:22;justify-content:center;padding:5;width:26}.table-container{border-radius:2px;display:flex;flex-direction:column;height:100%;min-height:0;overflow-x:auto;overflow-y:hidden;width:100%}.table-header{background:var(--table-bg);box-sizing:border-box;color:var(--table-color);font-weight:700;min-width:0;transition:margin-right .2s ease;width:100%}.header-row .table-cell{position:relative}.column-resizer{bottom:0;cursor:col-resize;position:absolute;right:0;top:0;width:10px;z-index:2}.column-resizer:hover{background:rgba(0,0,0,.05)}.header-row{background:var(--table-bg);color:var(--table-color)}.table-header.scroll-adjust{margin-right:15px}.main-table{flex:1 1 auto;min-height:0;overflow:hidden;width:100%}.virtual-table{display:flex;flex-direction:column;min-width:0}.table-row{align-items:center;border-bottom:1px solid #d0d0d0;box-sizing:border-box;display:flex;overflow:hidden;width:100%}.table-row.group-row{background-color:#f5f5f5;border-bottom:2px solid #999;font-weight:700}.group-header{flex:1 1 0%;font-weight:700;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.table-row:nth-child(2n){background-color:var(--table-bg-nth-child)}.virtual-table .table-row:not(:first-child):hover{background-color:var(--table-hover-bg);color:var(--table-hover-color);cursor:pointer}.table-cell{border:1px solid #e0e0e0;flex:1 1 0%;max-width:100%;min-width:0;overflow:hidden;padding:8px;text-align:left;text-overflow:ellipsis;white-space:nowrap}.group-row .table-cell{border:none}.checkbox-cell,.key-cell{flex:0 0 40px;text-align:center}.action-cell{overflow:hidden}.action-cell,.table-cell.action-cell{display:flex;gap:4px;justify-content:center}.table-cell.action-cell{align-items:center;border:none;box-sizing:border-box;flex-wrap:nowrap;padding:4px}.action-btn-table{border:none;border-radius:2px;color:#fff;cursor:pointer;font-size:12px;height:24px;line-height:1;padding:2px 6px;transition:background-color .2s ease;white-space:nowrap}.action-btn:hover{opacity:.9}.table-row:hover{background-color:var(--table-hover-bg,#e6f0ff);color:var(--table-hover-color,#000);cursor:pointer;transition:background-color .2s ease,color .2s ease}.row-main{display:flex;flex:1;min-width:0;overflow:hidden}.highlight{background-color:#ff0;font-weight:700}
2
2
  /*# sourceMappingURL=index.css.map */
@@ -1 +1 @@
1
- {"version":3,"sources":["index.css"],"names":[],"mappings":"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","file":"index.css","sourcesContent":[":root {\r\n --z-index-dropdown: 9999;\r\n\r\n --bg: #ffffff;\r\n --text: #1b1b1b;\r\n --accent: #ff4500;\r\n --secondary: #e0e0e0;\r\n --highlight: #00c896;\r\n --font-heading: 'Bebas Neue', sans-serif;\r\n --font-body: 'Inter', sans-serif;\r\n\r\n --bg-color: #ffffff;\r\n --text-color: #111111;\r\n --accent-color: #646cffaa;\r\n --card-radius: 12px;\r\n --card-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\r\n --font-family: 'Segoe UI', sans-serif;\r\n\r\n --btn-view-bg: var(--accent-color, #646cffaa);\r\n --btn-edit-bg: #4caf50;\r\n --btn-delete-bg: #f44336;\r\n --btn-text-color: #ffffff;\r\n\r\n --bg-light: #ffffff;\r\n --bg-dark: #1e1e1e;\r\n --text-light: #000000;\r\n --text-dark: #f0f0f0;\r\n --accent-light: #0078d4;\r\n --accent-dark: #00b7c3;\r\n --border-light: #ccc;\r\n --border-dark: #444;\r\n\r\n /* calendar */\r\n --cld-bg-color: rgba(0, 0, 0, 0.03);\r\n /* breadcrumbs */\r\n --bc-color: var(--text-muted, #666);\r\n /* EditableRows */\r\n --editor-border: #ccc;\r\n --input-bg: #fff;\r\n --input-text: #333;\r\n\r\n /* card */\r\n --bg-card-header: #ababab;\r\n\r\n /* DebounceSelect */\r\n --color-bg-DebounceSelect: #ffffff;\r\n\r\n /* Table */\r\n --table-bg: #93a4a7;\r\n --table-color: #ffffff;\r\n --table-hover-bg: #e4e4e4;\r\n --table-hover-color: #000000;\r\n --table-bg-nth-child: #f7f7f7;\r\n\r\n/* editable cell input focus styling */\r\n.table-cell-input {\r\n border: 1px solid var(--border-light, #ccc);\r\n padding: 2px 4px;\r\n}\r\n.table-cell-input:focus {\r\n border-color: grey;\r\n outline: none;\r\n}\r\n\r\n /* TABS */\r\n --tabs-bg: #f0e9e9;\r\n --tab-inactive-bg: #c9c9c9;\r\n --tab-active-bg: #2995A3;\r\n --tab-bg: #2995A3;\r\n --tab-color: #ffffff;\r\n --border-color: #2995A3;\r\n}\r\n\r\n[data-theme='dark'] {\r\n\r\n /* TABS */\r\n --tabs-bg: #1b1b1b;\r\n --tab-inactive-bg: #383838;\r\n --tab-bg: #2995A3;\r\n --tab-color: #ffffff;\r\n\r\n --bg: #1b1b1b;\r\n --text: #e0e0e0;\r\n --accent: #ff4500;\r\n --secondary: #333;\r\n --highlight: #00c896;\r\n\r\n --bg-color: #111111;\r\n --text-color: #f5f5f5;\r\n --accent-color: #61dafbaa;\r\n\r\n --btn-view-bg: var(--accent-color, #61dafbaa);\r\n --btn-edit-bg: #81c784;\r\n --btn-delete-bg: #e57373;\r\n --btn-text-color: #ffffff;\r\n /* calendar */\r\n --cld-bg-color: hsla(0, 0%, 56%, 0.04);\r\n /* breadcrumbs */\r\n --bc-color: red;\r\n --bc-bg: #1b1b1b;\r\n /* EditableRows */\r\n --editor-border: #555;\r\n --input-bg: #222;\r\n --input-text: #eee;\r\n\r\n /* DebounceSelect */\r\n --color-bg-DebounceSelect: #1b1b1b;\r\n\r\n /* Table */\r\n --table-hover-bg: #d03e1f;\r\n --table-hover-color: #ffffff;\r\n --table-bg-nth-child: #363636;\r\n}\r\n\r\n/* Apply theme to body */\r\nbody {\r\n background: var(--bg-color);\r\n color: var(--text-color);\r\n transition: background 0.3s ease, color 0.3s ease;\r\n margin: 0;\r\n /* min-height: 100vh; */\r\n}\r\n\r\n.header-content-search {\r\n position: fixed;\r\n z-index: 10000;\r\n /* justify-content: center; */\r\n /* align-items: center; */\r\n /* margin-top: -4px; */\r\n /* top: 5px; */\r\n bottom: 35px;\r\n left: 2px;\r\n width: 200px;\r\n}\r\n\r\n\r\n.body-content {\r\n position: absolute;\r\n top: 0px;\r\n /* match header height */\r\n bottom: 0;\r\n left: 0;\r\n right: 0;\r\n overflow-y: auto;\r\n padding: 10px;\r\n box-sizing: border-box;\r\n}\r\n\r\n.filters {\r\n top: 10px;\r\n}\r\n\r\n/* === Layout === */\r\n.fieldsInline {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n gap: 10px;\r\n /* padding: 0.5rem 1rem; */\r\n}\r\n\r\n.left {\r\n flex: 1;\r\n}\r\n\r\n.right {\r\n flex: none;\r\n margin-left: auto;\r\n}\r\n\r\n/* === Spinner Overlay === */\r\n.spinnerOverlay {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n background: var(--overlay-bg);\r\n /* theme-aware overlay */\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n z-index: 999;\r\n}\r\n\r\n.spinnerOver {\r\n width: 40px;\r\n height: 40px;\r\n border: 4px solid var(--spinner-border);\r\n border-top: 4px solid var(--spinner-top);\r\n border-radius: 50%;\r\n animation: spin 1s linear infinite;\r\n}\r\n\r\n@keyframes spin {\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n}\r\n\r\n/* MULTI SCROLL */\r\n.layout-container {\r\n display: flex;\r\n flex-direction: column;\r\n /* height: 100vh; */\r\n /* padding: 10px; */\r\n box-sizing: border-box;\r\n /* gap: 1rem; */\r\n}\r\n\r\n.scroll-section {\r\n flex: 1;\r\n overflow-y: auto;\r\n /* padding: 10px; */\r\n /* border: 1px solid #ccc; */\r\n /* background: #f9f9f9; */\r\n /* box-shadow: inset 0 0 4px rgba(0, 0, 0, 0.1); */\r\n}\r\n\r\n/* Optional: different heights */\r\n.first-scroll {\r\n max-height: 40vh;\r\n}\r\n\r\n.second-scroll {\r\n /* max-height: 50vh; */\r\n}\r\n\r\n\r\n/* BASIC BUTTONS */\r\n.basic-button {\r\n padding: 0.5rem 1rem;\r\n /* height: 40px; */\r\n font-size: 1rem;\r\n font-weight: 500;\r\n color: #fff;\r\n background: linear-gradient(to right, #007bff, #00bfff);\r\n /* blue gradient */\r\n border: none;\r\n border-radius: 2px;\r\n cursor: pointer;\r\n transition: background 0.3s ease, transform 0.2s ease;\r\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\r\n}\r\n\r\n.basic-button-small {\r\n flex: 1;\r\n padding: 6px;\r\n border-radius: 2px;\r\n border: none;\r\n background: #999;\r\n color: #fff;\r\n cursor: pointer;\r\n}\r\n\r\n.cancel {\r\n /* background: #ff0000; */\r\n}\r\n\r\n.confirm {\r\n background: #ff0000;\r\n\r\n}\r\n\r\n.basic-button-small:hover {\r\n background: linear-gradient(to right, #0056b3, #0099cc);\r\n transform: translateY(-1px);\r\n}\r\n\r\n.basic-button:hover {\r\n background: linear-gradient(to right, #0056b3, #0099cc);\r\n transform: translateY(-1px);\r\n}\r\n\r\n.basic-button:active {\r\n transform: translateY(0);\r\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.2);\r\n}\r\n\r\n.basic-button:disabled {\r\n background: #ccc;\r\n color: #666;\r\n cursor: not-allowed;\r\n}\r\n\r\n/* BASIC INPUTS */\r\n.basic-input {\r\n height: 34px;\r\n padding: 0 0.75rem;\r\n font-size: 1rem;\r\n font-weight: 400;\r\n color: #333;\r\n background-color: #fff;\r\n border: 1px solid #ccc;\r\n border-radius: 2px;\r\n box-sizing: border-box;\r\n transition: border-color 0.3s ease, box-shadow 0.2s ease;\r\n outline: none;\r\n width: 100%;\r\n}\r\n\r\n.basic-input:focus {\r\n border-color: #007bff;\r\n box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.2);\r\n}\r\n\r\n.basic-input:disabled {\r\n background-color: #f5f5f5;\r\n color: #999;\r\n cursor: not-allowed;\r\n}\r\n\r\n/* BASIC SELECT */\r\n.basic-select {\r\n height: 34px;\r\n padding: 0 0.75rem;\r\n font-size: 1rem;\r\n font-weight: 400;\r\n color: #333;\r\n background-color: #fff;\r\n border: 1px solid #ccc;\r\n border-radius: 2px;\r\n box-sizing: border-box;\r\n outline: none;\r\n width: 100%;\r\n appearance: none;\r\n /* removes default arrow styling */\r\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 140 140' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M35 50 L70 85 L105 50' stroke='%23333' stroke-width='15' fill='none' stroke-linecap='round'/%3E%3C/svg%3E\");\r\n background-repeat: no-repeat;\r\n background-position: right 0.75rem center;\r\n background-size: 12px;\r\n cursor: pointer;\r\n transition: border-color 0.3s ease, box-shadow 0.2s ease;\r\n}\r\n\r\n.basic-select:focus {\r\n border-color: #007bff;\r\n box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.2);\r\n}\r\n\r\n.basic-select:disabled {\r\n background-color: #f5f5f5;\r\n color: #999;\r\n cursor: not-allowed;\r\n}\r\n\r\n/* BASIC checkbox */\r\n.basic-checkbox {\r\n width: 18px;\r\n height: 18px;\r\n margin: 0;\r\n accent-color: #007bff;\r\n /* ✅ native color for modern browsers */\r\n cursor: pointer;\r\n transition: transform 0.2s ease;\r\n}\r\n\r\n.basic-checkbox:focus {\r\n outline: none;\r\n transform: scale(1.1);\r\n}\r\n\r\n.basic-checkbox:disabled {\r\n accent-color: #ccc;\r\n cursor: not-allowed;\r\n}\r\n\r\n.basic-checkbox-label {\r\n display: flex;\r\n align-items: center;\r\n gap: 0.5rem;\r\n font-size: 1rem;\r\n height: 34px;\r\n /* ✅ match row height */\r\n}\r\n\r\n/* BASIC debounce drop down menu */\r\n.basic-input-dropdown-menu {\r\n width: 100%;\r\n /* ✅ Full width inside the form */\r\n box-sizing: border-box;\r\n /* ✅ Prevent overflow from padding */\r\n position: absolute;\r\n top: 100%;\r\n left: 0;\r\n right: 0;\r\n background-color: var(--color-bg-DebounceSelect);\r\n border: 1px solid var(--color-border);\r\n max-height: 200px;\r\n overflow-y: auto;\r\n z-index: var(--z-index-dropdown);\r\n border-radius: 2px;\r\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);\r\n}\r\n\r\n.basic-input-dropdown-item {\r\n padding: 8px;\r\n cursor: pointer;\r\n transition: background-color 0.2s ease;\r\n}\r\n\r\n.loading,\r\n.no-results-dropdown-item {\r\n padding: 8px;\r\n color: var(--color-loading);\r\n font-style: italic;\r\n}\r\n\r\n.modal-overlay {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n /* background: var(--bg-light); */\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n z-index: 999;\r\n}\r\n\r\n.modal-box {\r\n background: var(--bg);\r\n padding: 1.5rem;\r\n border-radius: 2px;\r\n width: 100%;\r\n max-width: 400px;\r\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);\r\n /* make dialog resizable when content overflows */\r\n position: relative;\r\n resize: both;\r\n overflow: auto;\r\n max-width: 90vw;\r\n max-height: 90vh;\r\n}\r\n\r\n/* custom resize indicator in bottom-right corner */\r\n.modal-box.overflowing::after {\r\n content: '↘';\r\n position: absolute;\r\n right: 8px;\r\n bottom: 8px;\r\n font-size: 0.75rem;\r\n color: #888;\r\n cursor: se-resize;\r\n pointer-events: none;\r\n}\r\n\r\n.modal-title {\r\n margin-top: 0;\r\n font-size: 1.25rem;\r\n margin-bottom: 1rem;\r\n}\r\n\r\n.modal-content {\r\n margin-bottom: 1.5rem;\r\n /* ensure inner content scrolls if too tall */\r\n max-height: calc(80vh);\r\n overflow: auto;\r\n}\r\n\r\n.modal-actions {\r\n display: flex;\r\n justify-content: flex-end;\r\n gap: 0.5rem;\r\n}\r\n\r\n.modal-btn {\r\n padding: 0.5rem 1rem;\r\n border: none;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n}\r\n\r\n.modal-btn.cancel {\r\n background-color: #ccc;\r\n}\r\n\r\n.modal-btn.confirm {\r\n background-color: var(--accent-light);\r\n font-weight: bold;\r\n}\r\n\r\n.small-button-icon {\r\n border: none;\r\n background: rgba(255, 255, 255, 0.3);\r\n color: #fff;\r\n cursor: pointer;\r\n width: 26;\r\n height: 22;\r\n border-radius: 2;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n font-weight: bold;\r\n padding: 5;\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n.table-container {\r\n display: flex;\r\n flex-direction: column;\r\n width: 100%;\r\n height: 100%;\r\n min-height: 0;\r\n /* border: 1px solid #ccc; */\r\n border-radius: 2px;\r\n /* allow horizontal scrolling when columns are resized wider than the container */\r\n overflow-x: auto;\r\n overflow-y: hidden;\r\n}\r\n\r\n.table-header {\r\n font-weight: bold;\r\n transition: margin-right 0.2s ease;\r\n /* margin-right: 15px; */\r\n background: var(--table-bg);\r\n color: var(--table-color);\r\n min-width: max-content;\r\n}\r\n\r\n.header-row {\r\n background: var(--table-bg);\r\n color: var(--table-color);\r\n}\r\n\r\n.header-row .table-cell {\r\n position: relative;\r\n}\r\n\r\n.column-resizer {\r\n position: absolute;\r\n right: 0;\r\n top: 0;\r\n bottom: 0;\r\n width: 10px;\r\n cursor: col-resize;\r\n z-index: 2;\r\n}\r\n\r\n.column-resizer:hover {\r\n background: rgba(0, 0, 0, 0.05);\r\n}\r\n\r\n.header-row {\r\n background: var(--table-bg);\r\n color: var(--table-color);\r\n}\r\n\r\n.table-header.scroll-adjust {\r\n margin-right: 15px;\r\n /* adjust depending on scrollbar width */\r\n}\r\n\r\n.main-table {\r\n flex: 1 1 auto;\r\n min-height: 0;\r\n width: 100%;\r\n overflow: hidden;\r\n}\r\n\r\n.virtual-table {\r\n display: flex;\r\n flex-direction: column;\r\n /* prevent flex children from expanding beyond container width */\r\n min-width: 0;\r\n}\r\n\r\n.table-row {\r\n display: flex;\r\n align-items: center;\r\n width: 100%;\r\n /* force row to stay within container width */\r\n box-sizing: border-box;\r\n /* clip any content that overflows the row bounds */\r\n overflow: hidden;\r\n /* add line between rows */\r\n border-bottom: 1px solid #d0d0d0;\r\n}\r\n\r\n/* Group header rows have parent-style border */\r\n.table-row.group-row {\r\n border-bottom: 2px solid #999;\r\n background-color: #f5f5f5;\r\n font-weight: bold;\r\n}\r\n\r\n/* Group header cell styling */\r\n.group-header {\r\n font-weight: bold;\r\n flex: 1 1 0%;\r\n min-width: 0;\r\n overflow: hidden;\r\n white-space: nowrap;\r\n text-overflow: ellipsis;\r\n}\r\n\r\n/* Alternate row background color */\r\n.table-row:nth-child(even) {\r\n background-color: var(--table-bg-nth-child);\r\n}\r\n\r\n.virtual-table .table-row:not(:first-child):hover {\r\n background-color: var(--table-hover-bg);\r\n color: var(--table-hover-color);\r\n cursor: pointer;\r\n}\r\n\r\n/* border-bottom: 1px solid #5c5c5c; */\r\n\r\n.table-cell {\r\n flex: 1 1 0%;\r\n min-width: 0; /* allow the cell to shrink below its content width */\r\n max-width: 100%; /* prevent cells from exceeding their allocated space */\r\n padding: 8px;\r\n text-align: left;\r\n overflow: hidden;\r\n white-space: nowrap; /* single line only */\r\n text-overflow: ellipsis;/* show \"...\" when truncated */\r\n border: 1px solid #e0e0e0;\r\n /* border-bottom: 1px solid #ccc; */\r\n}\r\n\r\n/* No individual cell borders in group header rows */\r\n.group-row .table-cell {\r\n border: none;\r\n}\r\n\r\n.checkbox-cell {\r\n flex: 0 0 40px;\r\n text-align: center;\r\n}\r\n\r\n.key-cell {\r\n flex: 0 0 40px;\r\n text-align: center;\r\n}\r\n\r\n.action-cell {\r\n display: flex;\r\n justify-content: center;\r\n gap: 4px;\r\n overflow: hidden;\r\n}\r\n\r\n.table-cell.action-cell {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n gap: 4px;\r\n flex-wrap: nowrap;\r\n padding: 4px;\r\n border: none;\r\n box-sizing: border-box;\r\n}\r\n\r\n.action-btn-table {\r\n padding: 2px 6px;\r\n font-size: 12px;\r\n height: 24px;\r\n line-height: 1;\r\n border: none;\r\n border-radius: 2px;\r\n cursor: pointer;\r\n white-space: nowrap;\r\n transition: background-color 0.2s ease;\r\n color: #ffffff;\r\n}\r\n\r\n.action-btn:hover {\r\n opacity: 0.9;\r\n}\r\n\r\n/* Highlight row when hovered */\r\n.table-row:hover {\r\n background-color: var(--table-hover-bg, #e6f0ff);\r\n /* light blue fallback */\r\n color: var(--table-hover-color, #000);\r\n cursor: pointer;\r\n transition: background-color 0.2s ease, color 0.2s ease;\r\n}\r\n\r\n.row-main {\r\n display: flex;\r\n flex: 1;\r\n min-width: 0;\r\n overflow: hidden;\r\n}\r\n\r\n.highlight {\r\n background-color: yellow;\r\n font-weight: bold;\r\n}"]}
1
+ {"version":3,"sources":["index.css"],"names":[],"mappings":"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","file":"index.css","sourcesContent":[":root {\r\n --z-index-dropdown: 9999;\r\n\r\n --bg: #ffffff;\r\n --text: #1b1b1b;\r\n --accent: #ff4500;\r\n --secondary: #e0e0e0;\r\n --highlight: #00c896;\r\n --font-heading: 'Bebas Neue', sans-serif;\r\n --font-body: 'Inter', sans-serif;\r\n\r\n --bg-color: #ffffff;\r\n --text-color: #111111;\r\n --accent-color: #646cffaa;\r\n --card-radius: 12px;\r\n --card-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\r\n --font-family: 'Segoe UI', sans-serif;\r\n\r\n --btn-view-bg: var(--accent-color, #646cffaa);\r\n --btn-edit-bg: #4caf50;\r\n --btn-delete-bg: #f44336;\r\n --btn-text-color: #ffffff;\r\n\r\n --bg-light: #ffffff;\r\n --bg-dark: #1e1e1e;\r\n --text-light: #000000;\r\n --text-dark: #f0f0f0;\r\n --accent-light: #0078d4;\r\n --accent-dark: #00b7c3;\r\n --border-light: #ccc;\r\n --border-dark: #444;\r\n\r\n /* calendar */\r\n --cld-bg-color: rgba(0, 0, 0, 0.03);\r\n /* breadcrumbs */\r\n --bc-color: var(--text-muted, #666);\r\n /* EditableRows */\r\n --editor-border: #ccc;\r\n --input-bg: #fff;\r\n --input-text: #333;\r\n\r\n /* card */\r\n --bg-card-header: #ababab;\r\n\r\n /* DebounceSelect */\r\n --color-bg-DebounceSelect: #ffffff;\r\n\r\n /* Table */\r\n --table-bg: #93a4a7;\r\n --table-color: #ffffff;\r\n --table-hover-bg: #e4e4e4;\r\n --table-hover-color: #000000;\r\n --table-bg-nth-child: #f7f7f7;\r\n\r\n/* editable cell input focus styling */\r\n.table-cell-input {\r\n border: 1px solid var(--border-light, #ccc);\r\n padding: 2px 4px;\r\n}\r\n.table-cell-input:focus {\r\n border-color: grey;\r\n outline: none;\r\n}\r\n\r\n /* TABS */\r\n --tabs-bg: #f0e9e9;\r\n --tab-inactive-bg: #c9c9c9;\r\n --tab-active-bg: #2995A3;\r\n --tab-bg: #2995A3;\r\n --tab-color: #ffffff;\r\n --border-color: #2995A3;\r\n}\r\n\r\n[data-theme='dark'] {\r\n\r\n /* TABS */\r\n --tabs-bg: #1b1b1b;\r\n --tab-inactive-bg: #383838;\r\n --tab-bg: #2995A3;\r\n --tab-color: #ffffff;\r\n\r\n --bg: #1b1b1b;\r\n --text: #e0e0e0;\r\n --accent: #ff4500;\r\n --secondary: #333;\r\n --highlight: #00c896;\r\n\r\n --bg-color: #111111;\r\n --text-color: #f5f5f5;\r\n --accent-color: #61dafbaa;\r\n\r\n --btn-view-bg: var(--accent-color, #61dafbaa);\r\n --btn-edit-bg: #81c784;\r\n --btn-delete-bg: #e57373;\r\n --btn-text-color: #ffffff;\r\n /* calendar */\r\n --cld-bg-color: hsla(0, 0%, 56%, 0.04);\r\n /* breadcrumbs */\r\n --bc-color: red;\r\n --bc-bg: #1b1b1b;\r\n /* EditableRows */\r\n --editor-border: #555;\r\n --input-bg: #222;\r\n --input-text: #eee;\r\n\r\n /* DebounceSelect */\r\n --color-bg-DebounceSelect: #1b1b1b;\r\n\r\n /* Table */\r\n --table-hover-bg: #d03e1f;\r\n --table-hover-color: #ffffff;\r\n --table-bg-nth-child: #363636;\r\n}\r\n\r\n/* Apply theme to body */\r\nbody {\r\n background: var(--bg-color);\r\n color: var(--text-color);\r\n transition: background 0.3s ease, color 0.3s ease;\r\n margin: 0;\r\n /* min-height: 100vh; */\r\n}\r\n\r\n.header-content-search {\r\n position: fixed;\r\n z-index: 10000;\r\n /* justify-content: center; */\r\n /* align-items: center; */\r\n /* margin-top: -4px; */\r\n /* top: 5px; */\r\n bottom: 35px;\r\n left: 2px;\r\n width: 200px;\r\n}\r\n\r\n\r\n.body-content {\r\n position: absolute;\r\n top: 0px;\r\n /* match header height */\r\n bottom: 0;\r\n left: 0;\r\n right: 0;\r\n overflow-y: auto;\r\n padding: 10px;\r\n box-sizing: border-box;\r\n}\r\n\r\n.filters {\r\n top: 10px;\r\n}\r\n\r\n/* === Layout === */\r\n.fieldsInline {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n gap: 10px;\r\n /* padding: 0.5rem 1rem; */\r\n}\r\n\r\n.left {\r\n flex: 1;\r\n}\r\n\r\n.right {\r\n flex: none;\r\n margin-left: auto;\r\n}\r\n\r\n/* === Spinner Overlay === */\r\n.spinnerOverlay {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n background: var(--overlay-bg);\r\n /* theme-aware overlay */\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n z-index: 999;\r\n}\r\n\r\n.spinnerOver {\r\n width: 40px;\r\n height: 40px;\r\n border: 4px solid var(--spinner-border);\r\n border-top: 4px solid var(--spinner-top);\r\n border-radius: 50%;\r\n animation: spin 1s linear infinite;\r\n}\r\n\r\n@keyframes spin {\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n}\r\n\r\n/* MULTI SCROLL */\r\n.layout-container {\r\n display: flex;\r\n flex-direction: column;\r\n /* height: 100vh; */\r\n /* padding: 10px; */\r\n box-sizing: border-box;\r\n /* gap: 1rem; */\r\n}\r\n\r\n.scroll-section {\r\n flex: 1;\r\n overflow-y: auto;\r\n /* padding: 10px; */\r\n /* border: 1px solid #ccc; */\r\n /* background: #f9f9f9; */\r\n /* box-shadow: inset 0 0 4px rgba(0, 0, 0, 0.1); */\r\n}\r\n\r\n/* Optional: different heights */\r\n.first-scroll {\r\n max-height: 40vh;\r\n}\r\n\r\n.second-scroll {\r\n /* max-height: 50vh; */\r\n}\r\n\r\n\r\n/* BASIC BUTTONS */\r\n.basic-button {\r\n padding: 0.5rem 1rem;\r\n /* height: 40px; */\r\n font-size: 1rem;\r\n font-weight: 500;\r\n color: #fff;\r\n background: linear-gradient(to right, #007bff, #00bfff);\r\n /* blue gradient */\r\n border: none;\r\n border-radius: 2px;\r\n cursor: pointer;\r\n transition: background 0.3s ease, transform 0.2s ease;\r\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\r\n}\r\n\r\n.basic-button-small {\r\n flex: 1;\r\n padding: 6px;\r\n border-radius: 2px;\r\n border: none;\r\n background: #999;\r\n color: #fff;\r\n cursor: pointer;\r\n}\r\n\r\n.cancel {\r\n /* background: #ff0000; */\r\n}\r\n\r\n.confirm {\r\n background: #ff0000;\r\n\r\n}\r\n\r\n.basic-button-small:hover {\r\n background: linear-gradient(to right, #0056b3, #0099cc);\r\n transform: translateY(-1px);\r\n}\r\n\r\n.basic-button:hover {\r\n background: linear-gradient(to right, #0056b3, #0099cc);\r\n transform: translateY(-1px);\r\n}\r\n\r\n.basic-button:active {\r\n transform: translateY(0);\r\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.2);\r\n}\r\n\r\n.basic-button:disabled {\r\n background: #ccc;\r\n color: #666;\r\n cursor: not-allowed;\r\n}\r\n\r\n/* BASIC INPUTS */\r\n.basic-input {\r\n height: 34px;\r\n padding: 0 0.75rem;\r\n font-size: 1rem;\r\n font-weight: 400;\r\n color: #333;\r\n background-color: #fff;\r\n border: 1px solid #ccc;\r\n border-radius: 2px;\r\n box-sizing: border-box;\r\n transition: border-color 0.3s ease, box-shadow 0.2s ease;\r\n outline: none;\r\n width: 100%;\r\n}\r\n\r\n.basic-input:focus {\r\n border-color: #007bff;\r\n box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.2);\r\n}\r\n\r\n.basic-input:disabled {\r\n background-color: #f5f5f5;\r\n color: #999;\r\n cursor: not-allowed;\r\n}\r\n\r\n/* BASIC SELECT */\r\n.basic-select {\r\n height: 34px;\r\n padding: 0 0.75rem;\r\n font-size: 1rem;\r\n font-weight: 400;\r\n color: #333;\r\n background-color: #fff;\r\n border: 1px solid #ccc;\r\n border-radius: 2px;\r\n box-sizing: border-box;\r\n outline: none;\r\n width: 100%;\r\n appearance: none;\r\n /* removes default arrow styling */\r\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 140 140' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M35 50 L70 85 L105 50' stroke='%23333' stroke-width='15' fill='none' stroke-linecap='round'/%3E%3C/svg%3E\");\r\n background-repeat: no-repeat;\r\n background-position: right 0.75rem center;\r\n background-size: 12px;\r\n cursor: pointer;\r\n transition: border-color 0.3s ease, box-shadow 0.2s ease;\r\n}\r\n\r\n.basic-select:focus {\r\n border-color: #007bff;\r\n box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.2);\r\n}\r\n\r\n.basic-select:disabled {\r\n background-color: #f5f5f5;\r\n color: #999;\r\n cursor: not-allowed;\r\n}\r\n\r\n/* BASIC checkbox */\r\n.basic-checkbox {\r\n width: 18px;\r\n height: 18px;\r\n margin: 0;\r\n accent-color: #007bff;\r\n /* ✅ native color for modern browsers */\r\n cursor: pointer;\r\n transition: transform 0.2s ease;\r\n}\r\n\r\n.basic-checkbox:focus {\r\n outline: none;\r\n transform: scale(1.1);\r\n}\r\n\r\n.basic-checkbox:disabled {\r\n accent-color: #ccc;\r\n cursor: not-allowed;\r\n}\r\n\r\n.basic-checkbox-label {\r\n display: flex;\r\n align-items: center;\r\n gap: 0.5rem;\r\n font-size: 1rem;\r\n height: 34px;\r\n /* ✅ match row height */\r\n}\r\n\r\n/* BASIC debounce drop down menu */\r\n.basic-input-dropdown-menu {\r\n width: 100%;\r\n /* ✅ Full width inside the form */\r\n box-sizing: border-box;\r\n /* ✅ Prevent overflow from padding */\r\n position: absolute;\r\n top: 100%;\r\n left: 0;\r\n right: 0;\r\n background-color: var(--color-bg-DebounceSelect);\r\n border: 1px solid var(--color-border);\r\n max-height: 200px;\r\n overflow-y: auto;\r\n z-index: var(--z-index-dropdown);\r\n border-radius: 2px;\r\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);\r\n}\r\n\r\n.basic-input-dropdown-item {\r\n padding: 8px;\r\n cursor: pointer;\r\n transition: background-color 0.2s ease;\r\n}\r\n\r\n.loading,\r\n.no-results-dropdown-item {\r\n padding: 8px;\r\n color: var(--color-loading);\r\n font-style: italic;\r\n}\r\n\r\n.modal-overlay {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n /* background: var(--bg-light); */\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n z-index: 999;\r\n}\r\n\r\n.modal-box {\r\n background: var(--bg);\r\n padding: 1.5rem;\r\n border-radius: 2px;\r\n width: 100%;\r\n max-width: 400px;\r\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);\r\n /* make dialog resizable when content overflows */\r\n position: relative;\r\n resize: both;\r\n overflow: auto;\r\n max-width: 90vw;\r\n max-height: 90vh;\r\n}\r\n\r\n/* custom resize indicator in bottom-right corner */\r\n.modal-box.overflowing::after {\r\n content: '↘';\r\n position: absolute;\r\n right: 8px;\r\n bottom: 8px;\r\n font-size: 0.75rem;\r\n color: #888;\r\n cursor: se-resize;\r\n pointer-events: none;\r\n}\r\n\r\n.modal-title {\r\n margin-top: 0;\r\n font-size: 1.25rem;\r\n margin-bottom: 1rem;\r\n}\r\n\r\n.modal-content {\r\n margin-bottom: 1.5rem;\r\n /* ensure inner content scrolls if too tall */\r\n max-height: calc(80vh);\r\n overflow: auto;\r\n}\r\n\r\n.modal-actions {\r\n display: flex;\r\n justify-content: flex-end;\r\n gap: 0.5rem;\r\n}\r\n\r\n.modal-btn {\r\n padding: 0.5rem 1rem;\r\n border: none;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n}\r\n\r\n.modal-btn.cancel {\r\n background-color: #ccc;\r\n}\r\n\r\n.modal-btn.confirm {\r\n background-color: var(--accent-light);\r\n font-weight: bold;\r\n}\r\n\r\n.small-button-icon {\r\n border: none;\r\n background: rgba(255, 255, 255, 0.3);\r\n color: #fff;\r\n cursor: pointer;\r\n width: 26;\r\n height: 22;\r\n border-radius: 2;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n font-weight: bold;\r\n padding: 5;\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n.table-container {\r\n display: flex;\r\n flex-direction: column;\r\n width: 100%;\r\n height: 100%;\r\n min-height: 0;\r\n /* border: 1px solid #ccc; */\r\n border-radius: 2px;\r\n /* allow horizontal scrolling when columns are resized wider than the container */\r\n overflow-x: auto;\r\n overflow-y: hidden;\r\n}\r\n\r\n.table-header {\r\n font-weight: bold;\r\n transition: margin-right 0.2s ease;\r\n /* margin-right: 15px; */\r\n background: var(--table-bg);\r\n color: var(--table-color);\r\n /* Keep header sizing tied to the virtualized body viewport. */\r\n width: 100%;\r\n min-width: 0;\r\n box-sizing: border-box;\r\n}\r\n\r\n.header-row {\r\n background: var(--table-bg);\r\n color: var(--table-color);\r\n}\r\n\r\n.header-row .table-cell {\r\n position: relative;\r\n}\r\n\r\n.column-resizer {\r\n position: absolute;\r\n right: 0;\r\n top: 0;\r\n bottom: 0;\r\n width: 10px;\r\n cursor: col-resize;\r\n z-index: 2;\r\n}\r\n\r\n.column-resizer:hover {\r\n background: rgba(0, 0, 0, 0.05);\r\n}\r\n\r\n.header-row {\r\n background: var(--table-bg);\r\n color: var(--table-color);\r\n}\r\n\r\n.table-header.scroll-adjust {\r\n margin-right: 15px;\r\n /* adjust depending on scrollbar width */\r\n}\r\n\r\n.main-table {\r\n flex: 1 1 auto;\r\n min-height: 0;\r\n width: 100%;\r\n overflow: hidden;\r\n}\r\n\r\n.virtual-table {\r\n display: flex;\r\n flex-direction: column;\r\n /* prevent flex children from expanding beyond container width */\r\n min-width: 0;\r\n}\r\n\r\n.table-row {\r\n display: flex;\r\n align-items: center;\r\n width: 100%;\r\n /* force row to stay within container width */\r\n box-sizing: border-box;\r\n /* clip any content that overflows the row bounds */\r\n overflow: hidden;\r\n /* add line between rows */\r\n border-bottom: 1px solid #d0d0d0;\r\n}\r\n\r\n/* Group header rows have parent-style border */\r\n.table-row.group-row {\r\n border-bottom: 2px solid #999;\r\n background-color: #f5f5f5;\r\n font-weight: bold;\r\n}\r\n\r\n/* Group header cell styling */\r\n.group-header {\r\n font-weight: bold;\r\n flex: 1 1 0%;\r\n min-width: 0;\r\n overflow: hidden;\r\n white-space: nowrap;\r\n text-overflow: ellipsis;\r\n}\r\n\r\n/* Alternate row background color */\r\n.table-row:nth-child(even) {\r\n background-color: var(--table-bg-nth-child);\r\n}\r\n\r\n.virtual-table .table-row:not(:first-child):hover {\r\n background-color: var(--table-hover-bg);\r\n color: var(--table-hover-color);\r\n cursor: pointer;\r\n}\r\n\r\n/* border-bottom: 1px solid #5c5c5c; */\r\n\r\n.table-cell {\r\n flex: 1 1 0%;\r\n min-width: 0; /* allow the cell to shrink below its content width */\r\n max-width: 100%; /* prevent cells from exceeding their allocated space */\r\n padding: 8px;\r\n text-align: left;\r\n overflow: hidden;\r\n white-space: nowrap; /* single line only */\r\n text-overflow: ellipsis;/* show \"...\" when truncated */\r\n border: 1px solid #e0e0e0;\r\n /* border-bottom: 1px solid #ccc; */\r\n}\r\n\r\n/* No individual cell borders in group header rows */\r\n.group-row .table-cell {\r\n border: none;\r\n}\r\n\r\n.checkbox-cell {\r\n flex: 0 0 40px;\r\n text-align: center;\r\n}\r\n\r\n.key-cell {\r\n flex: 0 0 40px;\r\n text-align: center;\r\n}\r\n\r\n.action-cell {\r\n display: flex;\r\n justify-content: center;\r\n gap: 4px;\r\n overflow: hidden;\r\n}\r\n\r\n.table-cell.action-cell {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n gap: 4px;\r\n flex-wrap: nowrap;\r\n padding: 4px;\r\n border: none;\r\n box-sizing: border-box;\r\n}\r\n\r\n.action-btn-table {\r\n padding: 2px 6px;\r\n font-size: 12px;\r\n height: 24px;\r\n line-height: 1;\r\n border: none;\r\n border-radius: 2px;\r\n cursor: pointer;\r\n white-space: nowrap;\r\n transition: background-color 0.2s ease;\r\n color: #ffffff;\r\n}\r\n\r\n.action-btn:hover {\r\n opacity: 0.9;\r\n}\r\n\r\n/* Highlight row when hovered */\r\n.table-row:hover {\r\n background-color: var(--table-hover-bg, #e6f0ff);\r\n /* light blue fallback */\r\n color: var(--table-hover-color, #000);\r\n cursor: pointer;\r\n transition: background-color 0.2s ease, color 0.2s ease;\r\n}\r\n\r\n.row-main {\r\n display: flex;\r\n flex: 1;\r\n min-width: 0;\r\n overflow: hidden;\r\n}\r\n\r\n.highlight {\r\n background-color: yellow;\r\n font-weight: bold;\r\n}"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "trotl-table",
3
- "version": "1.0.96",
3
+ "version": "1.0.97",
4
4
  "description": "Reusable table UI",
5
5
  "main": "dist/index.cjs.js",
6
6
  "module": "dist/index.esm.js",
@@ -1,417 +0,0 @@
1
- 'use strict';
2
-
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
- var React = require('react');
6
-
7
- const COMPLETED_STATUS_ID = "3a861ce5-dfd5-451d-81f3-7e90788eff18";
8
- const MONTH_NAMES = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
9
- function getDocuments(payload) {
10
- if (Array.isArray(payload)) return payload;
11
- if (Array.isArray(payload?.data)) return payload.data;
12
- if (Array.isArray(payload?.documents)) return payload.documents;
13
- if (Array.isArray(payload?.items)) return payload.items;
14
- if (Array.isArray(payload?.results)) return payload.results;
15
- return [];
16
- }
17
- function parseDateValue(raw) {
18
- if (raw === undefined || raw === null || raw === "") return null;
19
- const timestamp = typeof raw === "number" ? raw >= 1e12 ? raw : raw * 1000 : typeof raw === "string" && /^\d+$/.test(raw.trim()) ? Number(raw) >= 1e12 ? Number(raw) : Number(raw) * 1000 : raw;
20
- const date = new Date(timestamp);
21
- return Number.isNaN(date.getTime()) ? null : date;
22
- }
23
- function getWorkOrderDate(document) {
24
- const value = document.completedAt || document.completedDate || document.createdAt || document.createdOn || document.creationDate || document.date || document.startDate || document.updatedAt;
25
- return parseDateValue(value);
26
- }
27
- function getClientName(document) {
28
- return document.clientLabel || document.clientName || document.clientId || "Unknown client";
29
- }
30
- function getTherapistName(document) {
31
- return document.therapistLabel || document.therapistName || document.therapistId || "Unknown therapist";
32
- }
33
- function isFutureCalendarDate(date, referenceDate) {
34
- const dateKey = date.getFullYear() * 10000 + (date.getMonth() + 1) * 100 + date.getDate();
35
- const referenceKey = referenceDate.getFullYear() * 10000 + (referenceDate.getMonth() + 1) * 100 + referenceDate.getDate();
36
- return dateKey > referenceKey;
37
- }
38
- function countBy(items, getKey) {
39
- return items.reduce((counts, item) => {
40
- const key = getKey(item);
41
- counts[key] = (counts[key] || 0) + 1;
42
- return counts;
43
- }, {});
44
- }
45
- function formatNumber(value) {
46
- return new Intl.NumberFormat().format(value);
47
- }
48
- function SummaryCard({
49
- label,
50
- value,
51
- detail
52
- }) {
53
- return /*#__PURE__*/React.createElement("div", {
54
- className: "analytics-summary-card"
55
- }, /*#__PURE__*/React.createElement("span", {
56
- className: "analytics-summary-label"
57
- }, label), /*#__PURE__*/React.createElement("strong", {
58
- className: "analytics-summary-value"
59
- }, value), detail && /*#__PURE__*/React.createElement("span", {
60
- className: "analytics-summary-detail"
61
- }, detail));
62
- }
63
- function BarChart({
64
- rows,
65
- labelKey,
66
- valueKey,
67
- color = "#2995A3"
68
- }) {
69
- const maximum = Math.max(...rows.map(row => row[valueKey]), 1);
70
- return /*#__PURE__*/React.createElement("div", {
71
- className: "analytics-bar-chart"
72
- }, rows.map(row => /*#__PURE__*/React.createElement("div", {
73
- className: "analytics-bar-row",
74
- key: row.key || row[labelKey]
75
- }, /*#__PURE__*/React.createElement("span", {
76
- className: "analytics-bar-label",
77
- title: row[labelKey]
78
- }, row[labelKey]), /*#__PURE__*/React.createElement("span", {
79
- className: "analytics-bar-track"
80
- }, /*#__PURE__*/React.createElement("span", {
81
- className: "analytics-bar-fill",
82
- style: {
83
- width: `${row[valueKey] / maximum * 100}%`,
84
- backgroundColor: color
85
- }
86
- })), /*#__PURE__*/React.createElement("strong", null, formatNumber(row[valueKey])))));
87
- }
88
- function MonthlyChart({
89
- rows,
90
- onMonthClick
91
- }) {
92
- const maximum = Math.max(...rows.map(row => row.orders), 1);
93
- return /*#__PURE__*/React.createElement("div", {
94
- className: "analytics-month-chart",
95
- role: "img",
96
- "aria-label": "Completed WorkOrders by month"
97
- }, rows.map(row => /*#__PURE__*/React.createElement("button", {
98
- type: "button",
99
- className: "analytics-month-column",
100
- key: row.key,
101
- onClick: () => onMonthClick(row),
102
- title: `Open ${row.month} ${row.year} details`
103
- }, /*#__PURE__*/React.createElement("span", {
104
- className: "analytics-month-value"
105
- }, row.orders), /*#__PURE__*/React.createElement("span", {
106
- className: "analytics-month-bar",
107
- style: {
108
- height: `${Math.max(row.orders / maximum * 100, 3)}%`
109
- }
110
- }), /*#__PURE__*/React.createElement("span", {
111
- className: "analytics-month-label"
112
- }, row.month.slice(0, 3), " ", row.year))));
113
- }
114
- function AnalyticsTable({
115
- columns,
116
- rows,
117
- emptyMessage = "No completed WorkOrders found."
118
- }) {
119
- return /*#__PURE__*/React.createElement("div", {
120
- className: "analytics-table-wrap"
121
- }, /*#__PURE__*/React.createElement("table", {
122
- className: "analytics-table"
123
- }, /*#__PURE__*/React.createElement("thead", null, /*#__PURE__*/React.createElement("tr", null, columns.map(column => /*#__PURE__*/React.createElement("th", {
124
- key: column.key
125
- }, column.label)))), /*#__PURE__*/React.createElement("tbody", null, rows.length === 0 ? /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("td", {
126
- colSpan: columns.length,
127
- className: "analytics-empty"
128
- }, emptyMessage)) : rows.map((row, index) => /*#__PURE__*/React.createElement("tr", {
129
- key: row.key || index
130
- }, columns.map(column => /*#__PURE__*/React.createElement("td", {
131
- key: column.key
132
- }, column.render ? column.render(row) : row[column.key])))))));
133
- }
134
- function getWorkOrderLabel(order) {
135
- return order.workOrderLabel || order.documentNumber || order.orderNumber || order.name || order.id || "WorkOrder";
136
- }
137
- function getWorkOrderHref(order) {
138
- return order.url || order.link || order.href || (order.id ? `/work-orders/${order.id}` : null);
139
- }
140
- function MonthDetailsModal({
141
- month,
142
- orders,
143
- onClose
144
- }) {
145
- if (!month) return null;
146
- return /*#__PURE__*/React.createElement("div", {
147
- className: "analytics-modal-backdrop",
148
- role: "presentation",
149
- onClick: onClose
150
- }, /*#__PURE__*/React.createElement("div", {
151
- className: "analytics-modal",
152
- role: "dialog",
153
- "aria-modal": "true",
154
- "aria-labelledby": "month-details-title",
155
- onClick: event => event.stopPropagation()
156
- }, /*#__PURE__*/React.createElement("div", {
157
- className: "analytics-modal-header"
158
- }, /*#__PURE__*/React.createElement("h3", {
159
- id: "month-details-title"
160
- }, month.month, " ", month.year, " WorkOrders"), /*#__PURE__*/React.createElement("button", {
161
- type: "button",
162
- className: "analytics-modal-close",
163
- onClick: onClose,
164
- "aria-label": "Close"
165
- }, "\xD7")), /*#__PURE__*/React.createElement("p", null, orders.length, " completed WorkOrder", orders.length === 1 ? "" : "s", " in this month."), /*#__PURE__*/React.createElement("div", {
166
- className: "analytics-modal-list"
167
- }, orders.length === 0 ? /*#__PURE__*/React.createElement("div", {
168
- className: "analytics-empty"
169
- }, "No WorkOrders found.") : orders.map((order, index) => {
170
- const href = getWorkOrderHref(order);
171
- const label = getWorkOrderLabel(order);
172
- return /*#__PURE__*/React.createElement("div", {
173
- className: "analytics-work-order-item",
174
- key: order.id || `${label}-${index}`
175
- }, href ? /*#__PURE__*/React.createElement("a", {
176
- href: href,
177
- target: "_blank",
178
- rel: "noreferrer"
179
- }, label) : /*#__PURE__*/React.createElement("strong", null, label), /*#__PURE__*/React.createElement("span", null, order.client, " \xB7 ", order.therapist), order.date && /*#__PURE__*/React.createElement("small", null, order.date.toLocaleDateString()));
180
- }))));
181
- }
182
- function WorkOrderAnalyticsByClient({
183
- endpoint = "/api/documents?type=WorkOrder",
184
- fetchDocuments,
185
- currentDate = new Date()
186
- }) {
187
- const [documents, setDocuments] = React.useState([]);
188
- const [loading, setLoading] = React.useState(true);
189
- const [error, setError] = React.useState("");
190
- const [refreshToken, setRefreshToken] = React.useState(0);
191
- const [selectedMonth, setSelectedMonth] = React.useState(null);
192
- React.useEffect(() => {
193
- let cancelled = false;
194
- const loadDocuments = async () => {
195
- setLoading(true);
196
- setError("");
197
- try {
198
- const result = fetchDocuments ? await fetchDocuments() : await fetch(endpoint, {
199
- headers: {
200
- "Content-Type": "application/json"
201
- }
202
- }).then(response => {
203
- if (!response.ok) throw new Error(`Request failed (${response.status})`);
204
- return response.json();
205
- });
206
- if (!cancelled) setDocuments(getDocuments(result));
207
- } catch (loadError) {
208
- if (!cancelled) setError(loadError.message || "Unable to load WorkOrders.");
209
- } finally {
210
- if (!cancelled) setLoading(false);
211
- }
212
- };
213
- loadDocuments();
214
- return () => {
215
- cancelled = true;
216
- };
217
- }, [endpoint, fetchDocuments, refreshToken]);
218
- const completedOrders = React.useMemo(() => documents.filter(document => document.type === "WorkOrder" || document.documentType === "WorkOrder" || !document.type).filter(document => document.statusId === COMPLETED_STATUS_ID).map(document => ({
219
- ...document,
220
- date: getWorkOrderDate(document),
221
- client: getClientName(document),
222
- therapist: getTherapistName(document)
223
- })).filter(document => document.date && !isFutureCalendarDate(document.date, currentDate)), [documents, currentDate]);
224
- const currentYear = currentDate.getFullYear();
225
- const years = React.useMemo(() => [...new Set(completedOrders.map(order => order.date.getFullYear()))].sort((a, b) => b - a), [completedOrders]);
226
- const yearRows = years.map(year => ({
227
- key: year,
228
- year,
229
- orders: completedOrders.filter(order => order.date.getFullYear() === year).length
230
- }));
231
- const monthRows = [...new Set(completedOrders.map(order => `${order.date.getFullYear()}-${order.date.getMonth()}`))].map(key => {
232
- const [year, monthIndex] = key.split("-").map(Number);
233
- return {
234
- key,
235
- year,
236
- month: MONTH_NAMES[monthIndex],
237
- monthIndex,
238
- orders: completedOrders.filter(order => order.date.getFullYear() === year && order.date.getMonth() === monthIndex).length
239
- };
240
- }).sort((a, b) => b.year - a.year || MONTH_NAMES.indexOf(a.month) - MONTH_NAMES.indexOf(b.month));
241
- const clientCounts = countBy(completedOrders, order => order.client);
242
- const clientRows = Object.entries(clientCounts).map(([client, orders]) => ({
243
- key: client,
244
- client,
245
- orders,
246
- share: completedOrders.length ? `${Math.round(orders / completedOrders.length * 100)}%` : "0%"
247
- })).sort((a, b) => b.orders - a.orders || a.client.localeCompare(b.client));
248
- const clientYearRows = Object.entries(clientCounts).map(([client]) => {
249
- const row = {
250
- key: client,
251
- client
252
- };
253
- years.forEach(year => {
254
- row[year] = completedOrders.filter(order => order.client === client && order.date.getFullYear() === year).length;
255
- });
256
- row.total = clientCounts[client];
257
- return row;
258
- }).sort((a, b) => b.total - a.total || a.client.localeCompare(b.client));
259
- const clientMonthRows = monthRows.flatMap(monthRow => Object.entries(clientCounts).map(([client]) => ({
260
- key: `${monthRow.key}-${client}`,
261
- year: monthRow.year,
262
- month: monthRow.month,
263
- client,
264
- orders: completedOrders.filter(order => order.client === client && order.date.getFullYear() === monthRow.year && order.date.getMonth() === MONTH_NAMES.indexOf(monthRow.month)).length
265
- })).filter(row => row.orders > 0));
266
- const therapistCounts = countBy(completedOrders, order => order.therapist);
267
- const topTherapist = Object.entries(therapistCounts).sort((a, b) => b[1] - a[1])[0];
268
- const topClientRows = clientRows.slice(0, 8);
269
- return /*#__PURE__*/React.createElement("section", {
270
- className: "analytics-by-client"
271
- }, /*#__PURE__*/React.createElement("div", {
272
- className: "analytics-header"
273
- }, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("h2", null, "WorkOrder analytics by client"), /*#__PURE__*/React.createElement("p", null, "Completed WorkOrders grouped by client, year, and month."), /*#__PURE__*/React.createElement("small", {
274
- className: "analytics-source"
275
- }, "Source: ", /*#__PURE__*/React.createElement("code", null, endpoint), " \xB7 Completed status only")), /*#__PURE__*/React.createElement("div", {
276
- className: "analytics-header-actions"
277
- }, loading && /*#__PURE__*/React.createElement("span", {
278
- className: "analytics-status"
279
- }, "Loading..."), !loading && /*#__PURE__*/React.createElement("button", {
280
- type: "button",
281
- className: "analytics-refresh",
282
- onClick: () => setRefreshToken(value => value + 1)
283
- }, "Refresh data"))), error && /*#__PURE__*/React.createElement("div", {
284
- className: "analytics-error",
285
- role: "alert"
286
- }, error), !loading && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
287
- className: "analytics-summary-grid"
288
- }, /*#__PURE__*/React.createElement(SummaryCard, {
289
- label: "Completed WorkOrders",
290
- value: formatNumber(completedOrders.length)
291
- }), /*#__PURE__*/React.createElement(SummaryCard, {
292
- label: "Clients",
293
- value: formatNumber(Object.keys(clientCounts).length)
294
- }), /*#__PURE__*/React.createElement(SummaryCard, {
295
- label: `${currentYear} orders`,
296
- value: formatNumber(yearRows.find(row => row.year === currentYear)?.orders || 0)
297
- }), /*#__PURE__*/React.createElement(SummaryCard, {
298
- label: "Top therapist",
299
- value: topTherapist?.[0] || "-",
300
- detail: topTherapist ? `${formatNumber(topTherapist[1])} orders` : ""
301
- })), /*#__PURE__*/React.createElement("div", {
302
- className: "analytics-grid"
303
- }, /*#__PURE__*/React.createElement("div", {
304
- className: "analytics-panel"
305
- }, /*#__PURE__*/React.createElement("h3", null, "Completed orders by year"), /*#__PURE__*/React.createElement(BarChart, {
306
- rows: yearRows,
307
- labelKey: "year",
308
- valueKey: "orders"
309
- })), /*#__PURE__*/React.createElement("div", {
310
- className: "analytics-panel"
311
- }, /*#__PURE__*/React.createElement("h3", null, "Top clients"), /*#__PURE__*/React.createElement(BarChart, {
312
- rows: topClientRows,
313
- labelKey: "client",
314
- valueKey: "orders",
315
- color: "#646cff"
316
- }))), /*#__PURE__*/React.createElement("div", {
317
- className: "analytics-panel"
318
- }, /*#__PURE__*/React.createElement("h3", null, "Monthly trend"), monthRows.length ? /*#__PURE__*/React.createElement(MonthlyChart, {
319
- rows: monthRows,
320
- onMonthClick: setSelectedMonth
321
- }) : /*#__PURE__*/React.createElement("p", {
322
- className: "analytics-empty"
323
- }, "No monthly data available.")), /*#__PURE__*/React.createElement("div", {
324
- className: "analytics-grid"
325
- }, /*#__PURE__*/React.createElement("div", {
326
- className: "analytics-panel"
327
- }, /*#__PURE__*/React.createElement("h3", null, "Totals by year"), /*#__PURE__*/React.createElement(AnalyticsTable, {
328
- columns: [{
329
- key: "year",
330
- label: "Year"
331
- }, {
332
- key: "orders",
333
- label: "Work orders",
334
- render: row => formatNumber(row.orders)
335
- }],
336
- rows: yearRows
337
- })), /*#__PURE__*/React.createElement("div", {
338
- className: "analytics-panel"
339
- }, /*#__PURE__*/React.createElement("h3", null, "Totals by month"), /*#__PURE__*/React.createElement(AnalyticsTable, {
340
- columns: [{
341
- key: "year",
342
- label: "Year"
343
- }, {
344
- key: "month",
345
- label: "Month",
346
- render: row => /*#__PURE__*/React.createElement("button", {
347
- type: "button",
348
- className: "analytics-date-button",
349
- onClick: () => setSelectedMonth(row)
350
- }, row.month, " ", row.year)
351
- }, {
352
- key: "orders",
353
- label: "Work orders",
354
- render: row => formatNumber(row.orders)
355
- }],
356
- rows: monthRows
357
- }))), /*#__PURE__*/React.createElement("div", {
358
- className: "analytics-panel"
359
- }, /*#__PURE__*/React.createElement("h3", null, "Totals by client"), /*#__PURE__*/React.createElement(AnalyticsTable, {
360
- columns: [{
361
- key: "client",
362
- label: "Client"
363
- }, {
364
- key: "orders",
365
- label: "Work orders",
366
- render: row => formatNumber(row.orders)
367
- }, {
368
- key: "share",
369
- label: "Share of completed orders"
370
- }],
371
- rows: clientRows
372
- })), /*#__PURE__*/React.createElement("div", {
373
- className: "analytics-grid"
374
- }, /*#__PURE__*/React.createElement("div", {
375
- className: "analytics-panel"
376
- }, /*#__PURE__*/React.createElement("h3", null, "Work orders per client by year"), /*#__PURE__*/React.createElement(AnalyticsTable, {
377
- columns: [{
378
- key: "client",
379
- label: "Client"
380
- }, ...years.map(year => ({
381
- key: year,
382
- label: String(year),
383
- render: row => formatNumber(row[year])
384
- })), {
385
- key: "total",
386
- label: "Total",
387
- render: row => formatNumber(row.total)
388
- }],
389
- rows: clientYearRows
390
- })), /*#__PURE__*/React.createElement("div", {
391
- className: "analytics-panel"
392
- }, /*#__PURE__*/React.createElement("h3", null, "Work orders per client by month"), /*#__PURE__*/React.createElement(AnalyticsTable, {
393
- columns: [{
394
- key: "year",
395
- label: "Year"
396
- }, {
397
- key: "month",
398
- label: "Month"
399
- }, {
400
- key: "client",
401
- label: "Client"
402
- }, {
403
- key: "orders",
404
- label: "Work orders",
405
- render: row => formatNumber(row.orders)
406
- }],
407
- rows: clientMonthRows
408
- }))), /*#__PURE__*/React.createElement(MonthDetailsModal, {
409
- month: selectedMonth,
410
- orders: selectedMonth ? completedOrders.filter(order => order.date.getFullYear() === selectedMonth.year && order.date.getMonth() === selectedMonth.monthIndex) : [],
411
- onClose: () => setSelectedMonth(null)
412
- })));
413
- }
414
-
415
- exports.COMPLETED_STATUS_ID = COMPLETED_STATUS_ID;
416
- exports.default = WorkOrderAnalyticsByClient;
417
- //# sourceMappingURL=WorkOrderAnalyticsByClient.cjs.js.map