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/Table.cjs.js.map +1 -1
- package/dist/Table.esm.js.map +1 -1
- package/dist/index.css +1 -1
- package/dist/index.css.map +1 -1
- package/package.json +1 -1
- package/dist/WorkOrderAnalyticsByClient.cjs.js +0 -417
- package/dist/WorkOrderAnalyticsByClient.cjs.js.map +0 -1
- package/dist/WorkOrderAnalyticsByClient.esm.js +0 -412
- package/dist/WorkOrderAnalyticsByClient.esm.js.map +0 -1
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:
|
|
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 */
|
package/dist/index.css.map
CHANGED
|
@@ -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,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
|