@whoz-oss/coday-web 0.21.0 → 0.22.0
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/bin.js +1 -1
- package/client/index.html +2 -2
- package/client/{main-EA3JCDJD.js → main-AGMSTMSR.js} +1 -1
- package/package.json +1 -1
- package/server.js +1437 -0
- package/server/package.json +0 -16
- package/server/server.js +0 -123270
- package/server/server.js.map +0 -7
package/bin.js
CHANGED
|
@@ -6,7 +6,7 @@ import { fileURLToPath } from 'url';
|
|
|
6
6
|
const __filename = fileURLToPath(import.meta.url);
|
|
7
7
|
const __dirname = dirname(__filename);
|
|
8
8
|
|
|
9
|
-
const serverPath = resolve(__dirname, 'server
|
|
9
|
+
const serverPath = resolve(__dirname, 'server.js');
|
|
10
10
|
const args = process.argv.slice(2);
|
|
11
11
|
|
|
12
12
|
// Run the compiled JavaScript server
|
package/client/index.html
CHANGED
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
<html lang="en" data-beasties-container>
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="utf-8">
|
|
5
|
-
<title>
|
|
5
|
+
<title>client</title>
|
|
6
6
|
<base href="/">
|
|
7
7
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
8
8
|
<link rel="icon" type="image/x-icon" href="CODAY-Logo.png">
|
|
9
9
|
<style>:root{--color-bg:#f8f8f2;--color-bg-secondary:#f1f1eb;--color-text:#282a36;--color-text-secondary:#6272a4;--color-text-inverse:#ffffff;--color-primary:#7064fb;--color-primary-hover:#ff79c6;--color-link:#3498db;--color-border:#aeaeae;--color-input-bg:#ffffff;--color-success:#50fa7b;--color-error:#ff5555;--color-warning:#ffb86c;--color-info:#8be9fd;--color-message-user:#e2dee2;--color-message-ai:#e8ecf6;--color-code-bg:#f1f1f1;--color-code-text:#d63384;--color-bg-hover:#f1f3f4;--color-shadow:rgba(0, 0, 0, .1);--color-overlay:rgba(0, 0, 0, .3)}@media print{html,body,app-root{height:auto!important;max-height:none!important;min-height:auto!important;overflow:visible!important;position:static!important}body{background:#fff!important;color:#000!important;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif!important;font-size:11pt;line-height:1.6;padding:1rem!important}*{animation:none!important;transition:none!important;box-shadow:none!important;text-shadow:none!important}}*{box-sizing:border-box}html,body{margin:0;padding:0;width:100%;height:100%}body{background-color:var(--color-bg, #f8f8f2);color:var(--color-text, #282a36);font-family:system-ui,sans-serif;transition:background-color .2s ease,color .2s ease}</style><link rel="stylesheet" href="styles-GNE3YTAJ.css" media="print" onload="this.media='all'"><noscript><link rel="stylesheet" href="styles-GNE3YTAJ.css"></noscript></head>
|
|
10
10
|
<body>
|
|
11
11
|
<app-root></app-root>
|
|
12
|
-
<script src="polyfills-7R4CRVNH.js" type="module"></script><script src="main-
|
|
12
|
+
<script src="polyfills-7R4CRVNH.js" type="module"></script><script src="main-AGMSTMSR.js" type="module"></script></body>
|
|
13
13
|
</html>
|
|
@@ -92,4 +92,4 @@ This action cannot be undone once you post another message.`)&&(console.log("[CH
|
|
|
92
92
|
`).filter(o=>o.trim()).length===0){this.errorMessage="Template webhooks must have at least one command";return}let e=this.commandType==="template"?this.commands.trim().split(`
|
|
93
93
|
`).filter(r=>r.trim()):void 0,t=D({name:this.name.trim(),project:this.project.trim(),commandType:this.commandType},e&&{commands:e});this.save.emit(t)}onCancel(){this.cancelForm.emit()}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=se({type:n,selectors:[["app-webhook-form"]],inputs:{webhook:"webhook",isSaving:"isSaving",availableProjects:"availableProjects"},outputs:{save:"save",cancelForm:"cancelForm"},features:[st],decls:43,vars:15,consts:[[1,"webhook-form-container"],["class","error-message",4,"ngIf"],[3,"ngSubmit"],[1,"form-group"],["for","name"],["type","text","id","name","name","name","placeholder","e.g., CI Pipeline Webhook","required","",3,"ngModelChange","ngModel","disabled"],[1,"hint"],["for","project"],["type","text","id","project","name","project","placeholder","e.g., my-project","required","",3,"ngModel","disabled","ngModelChange",4,"ngIf"],["id","project","name","project","required","",3,"ngModel","disabled","ngModelChange",4,"ngIf"],[1,"field-label"],[1,"radio-group"],[1,"radio-option"],["type","radio","name","commandType","value","template",3,"ngModelChange","change","ngModel","disabled"],[1,"radio-label"],["type","radio","name","commandType","value","free",3,"ngModelChange","change","ngModel","disabled"],["class","form-group",4,"ngIf"],["class","info-box",4,"ngIf"],[1,"form-actions"],["type","button",1,"btn-cancel",3,"click","disabled"],["type","submit",1,"btn-save",3,"disabled"],[1,"error-message"],["type","text","id","project","name","project","placeholder","e.g., my-project","required","",3,"ngModelChange","ngModel","disabled"],["id","project","name","project","required","",3,"ngModelChange","ngModel","disabled"],["value",""],[3,"value",4,"ngFor","ngForOf"],[3,"value"],["for","commands"],["id","commands","name","commands","rows","6","placeholder","Enter commands, one per line (use double braces for placeholders)","required","",3,"ngModelChange","ngModel","disabled"],[1,"info-box"]],template:function(t,r){t&1&&(g(0,"div",0)(1,"h2"),b(2),m(),X(3,IR,2,1,"div",1),g(4,"form",2),I("ngSubmit",function(){return r.onSave()}),g(5,"div",3)(6,"label",4),b(7,"Name *"),m(),g(8,"input",5),ye("ngModelChange",function(i){return Ce(r.name,i)||(r.name=i),i}),m(),g(9,"small",6),b(10,"A descriptive name for this webhook"),m()(),g(11,"div",3)(12,"label",7),b(13,"Project *"),m(),X(14,xR,1,2,"input",8)(15,OR,4,3,"select",9),g(16,"small",6),b(17,"The project context for this webhook"),m()(),g(18,"div",3)(19,"span",10),b(20,"Command Type *"),m(),g(21,"div",11)(22,"label",12)(23,"input",13),ye("ngModelChange",function(i){return Ce(r.commandType,i)||(r.commandType=i),i}),I("change",function(){return r.onCommandTypeChange()}),m(),g(24,"span",14)(25,"strong"),b(26,"Template"),m(),g(27,"small"),b(28,"Pre-defined commands with placeholders"),m()()(),g(29,"label",12)(30,"input",15),ye("ngModelChange",function(i){return Ce(r.commandType,i)||(r.commandType=i),i}),I("change",function(){return r.onCommandTypeChange()}),m(),g(31,"span",14)(32,"strong"),b(33,"Free Form"),m(),g(34,"small"),b(35,"Caller provides prompts in request body"),m()()()()(),X(36,kR,6,2,"div",16)(37,NR,9,0,"div",17),g(38,"div",18)(39,"button",19),I("click",function(){return r.onCancel()}),b(40," Cancel "),m(),g(41,"button",20),b(42),m()()()()),t&2&&(y(2),Se(r.formTitle),y(),M("ngIf",r.errorMessage),y(5),ve("ngModel",r.name),M("disabled",r.isSaving),y(6),M("ngIf",r.availableProjects.length===0),y(),M("ngIf",r.availableProjects.length>0),y(8),ve("ngModel",r.commandType),M("disabled",r.isSaving),y(7),ve("ngModel",r.commandType),M("disabled",r.isSaving),y(6),M("ngIf",r.commandType==="template"),y(),M("ngIf",r.commandType==="free"),y(2),M("disabled",r.isSaving),y(2),M("disabled",r.isSaving),y(),_e(" ",r.isSaving?"Saving...":"Save Webhook"," "))},dependencies:[de,ct,Ge,qt,xd,ss,as,Wt,$r,Fo,Gt,Dd,Ja,kt,Za],styles:[".webhook-form-container[_ngcontent-%COMP%]{padding:1.5rem;background:var(--color-bg);border-radius:8px;max-width:600px;margin:0 auto}.webhook-form-container[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{margin:0 0 1.5rem;font-size:1.5rem;color:var(--color-text)}.error-message[_ngcontent-%COMP%]{padding:.75rem;background:#ff00001a;border-left:4px solid var(--color-error);color:var(--color-error);margin-bottom:1rem;border-radius:4px;font-size:.9rem}form[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:1.5rem}.form-group[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:.5rem}.form-group[_ngcontent-%COMP%] label[_ngcontent-%COMP%], .form-group[_ngcontent-%COMP%] .field-label[_ngcontent-%COMP%]{font-weight:500;color:var(--color-text);font-size:.95rem}.form-group[_ngcontent-%COMP%] input[type=text][_ngcontent-%COMP%], .form-group[_ngcontent-%COMP%] select[_ngcontent-%COMP%], .form-group[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%]{padding:.75rem;border:1px solid var(--color-border);border-radius:4px;font-size:.95rem;background:var(--color-bg);color:var(--color-text);font-family:inherit;transition:border-color .2s}.form-group[_ngcontent-%COMP%] input[type=text][_ngcontent-%COMP%]:focus, .form-group[_ngcontent-%COMP%] select[_ngcontent-%COMP%]:focus, .form-group[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%]:focus{outline:none;border-color:var(--color-primary)}.form-group[_ngcontent-%COMP%] input[type=text][_ngcontent-%COMP%]:disabled, .form-group[_ngcontent-%COMP%] select[_ngcontent-%COMP%]:disabled, .form-group[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%]:disabled{opacity:.6;cursor:not-allowed}.form-group[_ngcontent-%COMP%] input[type=text][_ngcontent-%COMP%]::placeholder, .form-group[_ngcontent-%COMP%] select[_ngcontent-%COMP%]::placeholder, .form-group[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%]::placeholder{color:var(--color-text-secondary)}.form-group[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%]{resize:vertical;min-height:120px;font-family:Monaco,Menlo,Ubuntu Mono,Consolas,monospace;font-size:.9rem}.form-group[_ngcontent-%COMP%] .hint[_ngcontent-%COMP%]{font-size:.85rem;color:var(--color-text-secondary);margin-top:-.25rem}.form-group[_ngcontent-%COMP%] .hint[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{background:var(--color-code-bg);padding:.125rem .25rem;border-radius:3px;font-size:.8rem}.radio-group[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:.75rem}.radio-group[_ngcontent-%COMP%] .radio-option[_ngcontent-%COMP%]{display:flex;align-items:flex-start;gap:.75rem;padding:.75rem;border:2px solid var(--color-border);border-radius:6px;cursor:pointer;transition:all .2s}.radio-group[_ngcontent-%COMP%] .radio-option[_ngcontent-%COMP%]:hover{border-color:var(--color-primary);background:var(--color-bg-hover)}.radio-group[_ngcontent-%COMP%] .radio-option[_ngcontent-%COMP%] input[type=radio][_ngcontent-%COMP%]{margin-top:.25rem;cursor:pointer}.radio-group[_ngcontent-%COMP%] .radio-option[_ngcontent-%COMP%] input[type=radio][_ngcontent-%COMP%]:disabled{cursor:not-allowed}.radio-group[_ngcontent-%COMP%] .radio-option[_ngcontent-%COMP%] .radio-label[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:.25rem;flex:1}.radio-group[_ngcontent-%COMP%] .radio-option[_ngcontent-%COMP%] .radio-label[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{color:var(--color-text);font-size:.95rem}.radio-group[_ngcontent-%COMP%] .radio-option[_ngcontent-%COMP%] .radio-label[_ngcontent-%COMP%] small[_ngcontent-%COMP%]{color:var(--color-text-secondary);font-size:.85rem}.radio-group[_ngcontent-%COMP%] .radio-option[_ngcontent-%COMP%]:has(input:checked){border-color:var(--color-primary);background:rgba(var(--color-primary-rgb),.05)}.info-box[_ngcontent-%COMP%]{padding:1rem;background:var(--color-bg-hover);border-left:4px solid var(--color-primary);border-radius:4px;font-size:.9rem}.info-box[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:0;color:var(--color-text);line-height:1.6}.info-box[_ngcontent-%COMP%] p[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{display:block;margin-bottom:.5rem}.info-box[_ngcontent-%COMP%] p[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{background:var(--color-code-bg);padding:.125rem .25rem;border-radius:3px;font-size:.85rem}.form-actions[_ngcontent-%COMP%]{display:flex;justify-content:flex-end;gap:1rem;margin-top:1rem;padding-top:1rem;border-top:1px solid var(--color-border)}.form-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{padding:.75rem 1.5rem;border:none;border-radius:4px;font-size:.95rem;font-weight:500;cursor:pointer;transition:all .2s}.form-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:disabled{opacity:.6;cursor:not-allowed}.form-actions[_ngcontent-%COMP%] .btn-cancel[_ngcontent-%COMP%]{background:transparent;border:1px solid var(--color-border);color:var(--color-text)}.form-actions[_ngcontent-%COMP%] .btn-cancel[_ngcontent-%COMP%]:hover:not(:disabled){background:var(--color-bg-hover)}.form-actions[_ngcontent-%COMP%] .btn-save[_ngcontent-%COMP%]{background:var(--color-primary);color:#fff}.form-actions[_ngcontent-%COMP%] .btn-save[_ngcontent-%COMP%]:hover:not(:disabled){background:var(--color-primary-hover)}@media (max-width: 768px){.webhook-form-container[_ngcontent-%COMP%]{padding:1rem}.webhook-form-container[_ngcontent-%COMP%] h2[_ngcontent-%COMP%]{font-size:1.25rem}.form-actions[_ngcontent-%COMP%]{flex-direction:column-reverse}.form-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{width:100%}}"]})};var Ud=class n{http=h(Or);BASE_URL="/api/webhooks";listWebhooks(){return this.http.get(this.BASE_URL)}getWebhook(e){return this.http.get(`${this.BASE_URL}/${e}`)}createWebhook(e){return this.http.post(this.BASE_URL,e)}updateWebhook(e,t){return this.http.put(`${this.BASE_URL}/${e}`,t)}deleteWebhook(e){return this.http.delete(`${this.BASE_URL}/${e}`)}static \u0275fac=function(t){return new(t||n)};static \u0275prov=T({token:n,factory:n.\u0275fac,providedIn:"root"})};function PR(n,e){if(n&1){let t=H();g(0,"button",12),I("click",function(){w(t);let o=_(2);return S(o.onFormCancel())}),b(1," \u2190 Back "),m()}}function RR(n,e){if(n&1&&(g(0,"div",7),b(1),m()),n&2){let t=_(2);y(),_e(" \u2705 ",t.successMessage," ")}}function FR(n,e){if(n&1&&(g(0,"div",8),b(1),m()),n&2){let t=_(2);y(),_e(" \u274C ",t.errorMessage," ")}}function LR(n,e){if(n&1){let t=H();g(0,"app-webhook-list",13),I("create",function(){w(t);let o=_(2);return S(o.onCreateClick())})("edit",function(o){w(t);let i=_(2);return S(i.onEditClick(o))})("deleteWebhook",function(o){w(t);let i=_(2);return S(i.onDeleteClick(o))})("copyUrl",function(o){w(t);let i=_(2);return S(i.onCopyUrl(o))}),m()}if(n&2){let t=_(2);M("webhooks",t.webhooks)("isLoading",t.isLoading)("errorMessage",t.errorMessage)}}function VR(n,e){if(n&1){let t=H();g(0,"app-webhook-form",14),I("save",function(o){w(t);let i=_(2);return S(i.onFormSave(o))})("cancelForm",function(){w(t);let o=_(2);return S(o.onFormCancel())}),m()}if(n&2){let t=_(2);M("webhook",t.editingWebhook)("isSaving",t.isSaving)("availableProjects",t.availableProjects)}}function jR(n,e){if(n&1){let t=H();g(0,"div",0)(1,"button",1),I("click",function(){w(t);let o=_();return S(o.onCloseClick())}),m(),g(2,"div",2)(3,"div",3),Ie(4,PR,2,0,"button",4),g(5,"h1",5),b(6),m(),g(7,"button",6),I("click",function(){w(t);let o=_();return S(o.onCloseClick())}),b(8,"\u2715"),m()(),Ie(9,RR,2,1,"div",7),Ie(10,FR,2,1,"div",8),g(11,"div",9),Ie(12,LR,1,3,"app-webhook-list",10),Ie(13,VR,1,3,"app-webhook-form",11),m()()()}if(n&2){let t=_();y(4),xe(t.currentView==="form"?4:-1),y(2),_e(" ",t.currentView==="list"?"Webhook Management":t.editingWebhook?"Edit Webhook":"Create Webhook"," "),y(3),xe(t.successMessage?9:-1),y(),xe(t.errorMessage&&t.currentView==="list"?10:-1),y(2),xe(t.currentView==="list"?12:-1),y(),xe(t.currentView==="form"?13:-1)}}var Hd=class n{isOpen=!1;availableProjects=[];isOpenChange=new B;closeModal=new B;webhookApi=h(Ud);webhooks=[];isLoading=!1;errorMessage="";currentView="list";editingWebhook;isSaving=!1;successMessage="";ngOnChanges(e){let t=e.isOpen;if(t){let r=t.currentValue,o=t.previousValue;r===!0&&o===!1&&(this.loadWebhooks(),this.currentView="list",this.editingWebhook=void 0),r===!1&&o===!0&&this.clearState()}}clearState(){this.webhooks=[],this.errorMessage="",this.successMessage="",this.currentView="list",this.editingWebhook=void 0,this.isLoading=!1,this.isSaving=!1}handleError(e,t){return console.error(t,e),`${t}: ${e.error?.error||e.message||"Unknown error"}`}loadWebhooks(){this.isLoading=!0,this.errorMessage="",this.webhookApi.listWebhooks().subscribe({next:e=>{this.webhooks=e,this.isLoading=!1},error:e=>{this.errorMessage=this.handleError(e,"Failed to load webhooks"),this.isLoading=!1}})}onCreateClick(){this.currentView="form",this.editingWebhook=void 0,this.errorMessage="",this.successMessage=""}onEditClick(e){this.currentView="form",this.editingWebhook=e,this.errorMessage="",this.successMessage=""}onDeleteClick(e){confirm(`Are you sure you want to delete webhook "${e.name}"?
|
|
94
94
|
|
|
95
|
-
This action cannot be undone.`)&&this.webhookApi.deleteWebhook(e.uuid).subscribe({next:()=>{this.showSuccess(`Webhook "${e.name}" deleted successfully`),this.loadWebhooks()},error:r=>{this.errorMessage=this.handleError(r,"Failed to delete webhook")}})}onCopyUrl(e){this.showSuccess("Webhook URL copied to clipboard!")}onFormSave(e){this.isSaving=!0,this.errorMessage="",this.editingWebhook?this.webhookApi.updateWebhook(this.editingWebhook.uuid,e).subscribe({next:t=>{this.isSaving=!1,this.showSuccess(`Webhook "${t.webhook.name}" updated successfully`),this.currentView="list",this.editingWebhook=void 0,this.loadWebhooks()},error:t=>{this.errorMessage=this.handleError(t,"Failed to update webhook"),this.isSaving=!1}}):this.webhookApi.createWebhook(e).subscribe({next:t=>{this.isSaving=!1,this.showSuccess(`Webhook "${t.name}" created successfully`),this.currentView="list",this.loadWebhooks()},error:t=>{this.errorMessage=this.handleError(t,"Failed to create webhook"),this.isSaving=!1}})}onFormCancel(){this.currentView="list",this.editingWebhook=void 0,this.errorMessage=""}showSuccess(e){this.successMessage=e,setTimeout(()=>this.successMessage="",3e3)}onCloseClick(){this.isOpenChange.emit(!1),this.closeModal.emit()}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=se({type:n,selectors:[["app-webhook-manager"]],inputs:{isOpen:"isOpen",availableProjects:"availableProjects"},outputs:{isOpenChange:"isOpenChange",closeModal:"closeModal"},features:[st],decls:1,vars:1,consts:[["role","dialog","aria-modal","true","aria-labelledby","modal-title",1,"modal-backdrop-wrapper"],["aria-label","Close modal","type","button",1,"modal-backdrop",3,"click"],[1,"modal-container"],[1,"modal-header"],["title","Back to list",1,"btn-back"],["id","modal-title",1,"modal-title"],["title","Close",1,"btn-close",3,"click"],[1,"success-message"],[1,"error-message"],[1,"modal-body"],[3,"webhooks","isLoading","errorMessage"],[3,"webhook","isSaving","availableProjects"],["title","Back to list",1,"btn-back",3,"click"],[3,"create","edit","deleteWebhook","copyUrl","webhooks","isLoading","errorMessage"],[3,"save","cancelForm","webhook","isSaving","availableProjects"]],template:function(t,r){t&1&&Ie(0,jR,14,6,"div",0),t&2&&xe(r.isOpen?0:-1)},dependencies:[de,Bd,$d],styles:[".modal-backdrop-wrapper[_ngcontent-%COMP%]{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;z-index:1000;padding:1rem}.modal-backdrop[_ngcontent-%COMP%]{position:absolute;inset:0;background:#00000080;border:none;padding:0;cursor:pointer;z-index:1}.modal-container[_ngcontent-%COMP%]{position:relative;z-index:2;background:var(--color-bg);border-radius:8px;box-shadow:0 4px 20px #0000004d;max-width:900px;width:100%;max-height:90vh;display:flex;flex-direction:column;overflow:hidden}.modal-header[_ngcontent-%COMP%]{display:flex;align-items:center;gap:1rem;padding:1rem 1.5rem;border-bottom:1px solid var(--color-border);background:var(--color-bg-hover)}.modal-header[_ngcontent-%COMP%] .btn-back[_ngcontent-%COMP%]{padding:.5rem 1rem;background:transparent;border:1px solid var(--color-border);border-radius:4px;color:var(--color-text);cursor:pointer;font-size:.9rem;transition:all .2s}.modal-header[_ngcontent-%COMP%] .btn-back[_ngcontent-%COMP%]:hover{background:var(--color-bg);border-color:var(--color-primary)}.modal-header[_ngcontent-%COMP%] .modal-title[_ngcontent-%COMP%]{flex:1;margin:0;font-size:1.25rem;color:var(--color-text)}.modal-header[_ngcontent-%COMP%] .btn-close[_ngcontent-%COMP%]{padding:.5rem;background:transparent;border:none;font-size:1.5rem;color:var(--color-text-secondary);cursor:pointer;transition:color .2s}.modal-header[_ngcontent-%COMP%] .btn-close[_ngcontent-%COMP%]:hover{color:var(--color-error)}.success-message[_ngcontent-%COMP%], .error-message[_ngcontent-%COMP%]{padding:.75rem 1.5rem;font-size:.9rem}.success-message[_ngcontent-%COMP%]{background:#00c8001a;color:var(--color-success);border-bottom:1px solid rgba(0,200,0,.3)}.error-message[_ngcontent-%COMP%]{background:#ff00001a;color:var(--color-error);border-bottom:1px solid rgba(255,0,0,.3)}.modal-body[_ngcontent-%COMP%]{flex:1;overflow-y:auto;padding:0}@media (max-width: 768px){.modal-container[_ngcontent-%COMP%]{max-width:100%;max-height:100vh;border-radius:0}}"]})};function BR(n,e){n&1&&(g(0,"span",22),b(1,"(No project)"),m())}function $R(n,e){if(n&1){let t=H();g(0,"div",15)(1,"button",21),I("click",function(){w(t);let o=_(2);return S(o.openProjectConfig())}),g(2,"span",17),b(3,"\u{1F4C1}"),m(),g(4,"span",18),b(5,"Project Config"),m(),Ie(6,BR,2,0,"span",22),m()(),g(7,"div",15)(8,"button",16),I("click",function(){w(t);let o=_(2);return S(o.openWebhooks())}),g(9,"span",17),b(10,"\u{1F517}"),m(),g(11,"span",18),b(12,"Webhooks"),m()()()}if(n&2){let t=_(2);y(),Ee("disabled",!t.hasProject()),M("disabled",!t.hasProject())("title",t.hasProject()?"Edit project configuration":"No project selected"),y(5),xe(t.hasProject()?-1:6)}}function UR(n,e){if(n&1){let t=H();g(0,"div",9),I("click",function(o){return w(t),S(o.stopPropagation())})("keydown",function(o){return w(t),S(o.stopPropagation())}),g(1,"div",10),oe(2,"app-project-selector",11),m(),g(3,"div",12),oe(4,"app-thread-selector",13),m(),g(5,"div",14)(6,"div",15)(7,"button",16),I("click",function(){w(t);let o=_();return S(o.openUserConfig())}),g(8,"span",17),b(9,"\u{1F464}"),m(),g(10,"span",18),b(11,"User Config"),m()()(),Ie(12,$R,13,5),g(13,"div",15)(14,"span",18),b(15,"Theme"),m(),oe(16,"app-theme-selector",19),m(),g(17,"div",15)(18,"span",18),b(19,"Preferences"),m(),oe(20,"app-options-panel",20),m()()()}if(n&2){let t=_();y(12),xe(t.isAdmin?12:-1)}}function HR(n,e){if(n&1){let t=H();g(0,"div",4)(1,"span",23),b(2,"\u26A0\uFE0F"),m(),g(3,"span",24),b(4),m(),g(5,"button",25),I("click",function(){w(t);let o=_();return S(o.configErrorMessage="")}),b(6,"\u2715"),m()()}if(n&2){let t=_();y(4),Se(t.configErrorMessage)}}function zR(n,e){if(n&1){let t=H();g(0,"app-json-editor",26),I("save",function(o){w(t);let i=_();return S(i.onProjectConfigSave(o))})("closeEditor",function(){w(t);let o=_();return S(o.onProjectConfigCancel())}),m()}if(n&2){let t=_();M("configType","project")("projectName",t.getCurrentProjectName())("isOpen",t.isProjectConfigOpen)("initialContent",t.projectConfigJson)("isLoading",t.isLoadingProjectConfig)("isSaving",t.isSavingProjectConfig)}}function WR(n,e){if(n&1){let t=H();g(0,"div",27),I("click",function(){w(t);let o=_();return S(o.closeMenu())})("keydown.escape",function(){w(t);let o=_();return S(o.closeMenu())}),m()}}var zd=class n{destroy$=new Q;isMenuOpen=!1;isUserConfigOpen=!1;isProjectConfigOpen=!1;isWebhooksOpen=!1;isAdmin=!1;userConfigJson="";projectConfigJson="";isLoadingUserConfig=!1;isLoadingProjectConfig=!1;isSavingUserConfig=!1;isSavingProjectConfig=!1;configSuccessMessage="";configErrorMessage="";sessionState=h(Vn);configApi=h(Rd);ngOnInit(){console.log("[FLOATING-MENU] SessionState service injected:",!!this.sessionState),this.configApi.getUserConfig().pipe(K(this.destroy$)).subscribe({next:e=>{this.isAdmin=e.temp_groups?.includes("CODAY_ADMIN")??!1,console.log("[FLOATING-MENU] User admin status:",this.isAdmin)},error:e=>{console.error("[FLOATING-MENU] Error loading user config for roles:",e),this.isAdmin=!1}})}ngOnDestroy(){this.destroy$.next(),this.destroy$.complete()}toggleMenu(){this.isMenuOpen=!this.isMenuOpen}closeMenu(){this.isMenuOpen=!1}onDocumentClick(e){let t=e.target;!t.closest(".floating-menu-btn")&&!t.closest(".floating-menu")&&this.closeMenu()}onEscapeKey(){this.closeMenu()}openUserConfig(){this.closeMenu(),this.isLoadingUserConfig=!0,this.configSuccessMessage="",this.configErrorMessage="",this.configApi.getUserConfig().pipe(K(this.destroy$)).subscribe({next:e=>{this.userConfigJson=JSON.stringify(e,null,2),this.isLoadingUserConfig=!1,this.isUserConfigOpen=!0},error:e=>{console.error("[FLOATING-MENU] Error loading user config:",e),this.isLoadingUserConfig=!1,this.configErrorMessage=e?.error?.error||"Failed to load user configuration"}})}openProjectConfig(){let e=this.getCurrentProjectName();if(this.closeMenu(),!e){console.error("[FLOATING-MENU] No project selected"),this.configErrorMessage="No project selected. Please select a project first.";return}this.isLoadingProjectConfig=!0,this.configSuccessMessage="",this.configErrorMessage="",this.configApi.getProjectConfig(e).pipe(K(this.destroy$)).subscribe({next:t=>{this.projectConfigJson=JSON.stringify(t,null,2),this.isLoadingProjectConfig=!1,this.isProjectConfigOpen=!0},error:t=>{console.error("[FLOATING-MENU] Error loading project config:",t),this.isLoadingProjectConfig=!1,this.configErrorMessage=t?.error?.error||"Failed to load project configuration"}})}hasProject(){return this.sessionState.hasProjectSelected()}getCurrentProjectName(){return this.sessionState.getCurrentProject()}onUserConfigSave(e){this.isSavingUserConfig=!0,this.configErrorMessage="",this.configApi.updateUserConfig(e).pipe(K(this.destroy$)).subscribe({next:t=>{console.log("[FLOATING-MENU] User config saved successfully"),this.isSavingUserConfig=!1,this.configSuccessMessage=t.message??"Configuration saved successfully",setTimeout(()=>{this.isUserConfigOpen=!1,this.configSuccessMessage=""},1500)},error:t=>{console.error("[FLOATING-MENU] Error saving user config:",t),this.isSavingUserConfig=!1,this.configErrorMessage=t?.error?.error||"Failed to save user configuration"}})}onProjectConfigSave(e){let t=this.getCurrentProjectName();if(!t){console.error("[FLOATING-MENU] No project selected"),this.configErrorMessage="No project selected. Cannot save configuration.";return}this.isSavingProjectConfig=!0,this.configErrorMessage="",this.configApi.updateProjectConfig(t,e).pipe(K(this.destroy$)).subscribe({next:r=>{console.log("[FLOATING-MENU] Project config saved successfully"),this.isSavingProjectConfig=!1,this.configSuccessMessage=r.message??"Configuration saved successfully",setTimeout(()=>{this.isProjectConfigOpen=!1,this.configSuccessMessage=""},1500)},error:r=>{console.error("[FLOATING-MENU] Error saving project config:",r),this.isSavingProjectConfig=!1,this.configErrorMessage=r?.error?.error||"Failed to save project configuration"}})}onUserConfigCancel(){this.isUserConfigOpen=!1,this.configSuccessMessage="",this.configErrorMessage=""}onProjectConfigCancel(){this.isProjectConfigOpen=!1,this.configSuccessMessage="",this.configErrorMessage=""}openWebhooks(){this.closeMenu(),this.isWebhooksOpen=!0}getAvailableProjects(){return[]}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=se({type:n,selectors:[["app-floating-menu"]],hostBindings:function(t,r){t&1&&I("click",function(i){return r.onDocumentClick(i)},yi)("keydown.escape",function(){return r.onEscapeKey()},yi)},decls:10,vars:13,consts:[["title","Menu Coday",1,"floating-menu-btn",3,"click"],["src","CODAY-Logo.png","alt","Coday",1,"logo"],[1,"hamburger-overlay"],["tabindex","-1","role","menu","aria-label","Menu principal de Coday",1,"floating-menu"],["role","alert",1,"error-notification"],[3,"save","closeEditor","configType","isOpen","initialContent","isLoading","isSaving"],[3,"configType","projectName","isOpen","initialContent","isLoading","isSaving"],[3,"isOpenChange","closeModal","isOpen","availableProjects"],["tabindex","-1","role","button","aria-label","Fermer le menu (cliquez ou appuyez sur \xC9chap)",1,"menu-backdrop"],["tabindex","-1","role","menu","aria-label","Menu principal de Coday",1,"floating-menu",3,"click","keydown"],[1,"menu-section","project-selector-section"],[1,"main-project-selector"],[1,"menu-section","navigation"],[1,"main-thread-selector"],[1,"menu-section"],[1,"menu-item-wrapper"],[1,"menu-button",3,"click"],[1,"menu-icon"],[1,"menu-text"],[1,"inline-selector"],[1,"inline-panel"],[1,"menu-button",3,"click","disabled","title"],[1,"disabled-hint"],[1,"error-icon"],[1,"error-text"],["aria-label","Close error message",1,"error-close",3,"click"],[3,"save","closeEditor","configType","projectName","isOpen","initialContent","isLoading","isSaving"],["tabindex","-1","role","button","aria-label","Fermer le menu (cliquez ou appuyez sur \xC9chap)",1,"menu-backdrop",3,"click","keydown.escape"]],template:function(t,r){t&1&&(g(0,"button",0),I("click",function(){return r.toggleMenu()}),oe(1,"img",1),g(2,"div",2),b(3,"\u2630"),m()(),Ie(4,UR,21,1,"div",3),Ie(5,HR,7,1,"div",4),g(6,"app-json-editor",5),I("save",function(i){return r.onUserConfigSave(i)})("closeEditor",function(){return r.onUserConfigCancel()}),m(),Ie(7,zR,1,6,"app-json-editor",6),g(8,"app-webhook-manager",7),I("isOpenChange",function(i){return r.isWebhooksOpen=i})("closeModal",function(){return r.isWebhooksOpen=!1}),m(),Ie(9,WR,1,0,"div",8)),t&2&&(Ee("active",r.isMenuOpen),y(4),xe(r.isMenuOpen?4:-1),y(),xe(r.configErrorMessage?5:-1),y(),M("configType","user")("isOpen",r.isUserConfigOpen)("initialContent",r.userConfigJson)("isLoading",r.isLoadingUserConfig)("isSaving",r.isSavingUserConfig),y(),xe(r.hasProject()?7:-1),y(),M("isOpen",r.isWebhooksOpen)("availableProjects",r.getAvailableProjects()),y(),xe(r.isMenuOpen?9:-1))},dependencies:[de,Fd,Xa,Ld,Vd,jd,Hd],styles:[".floating-menu-btn[_ngcontent-%COMP%]{position:fixed;top:1rem;left:1rem;z-index:1500;width:48px;height:48px;border-radius:50%;border:2px solid rgba(255,255,255,.2);background:var(--color-primary, #7064fb);color:#fff;box-shadow:0 4px 16px #0003,0 2px 8px #0000001a;transition:all .2s ease;cursor:pointer;display:flex;align-items:center;justify-content:center;position:relative}.floating-menu-btn[_ngcontent-%COMP%]:hover{transform:scale(1.05);box-shadow:0 6px 20px #00000040,0 4px 12px #00000026}.floating-menu-btn[_ngcontent-%COMP%]:active{transform:scale(.95)}.floating-menu-btn.active[_ngcontent-%COMP%]{background:var(--color-primary-hover, #ff79c6);border-color:#ffffff4d}.floating-menu-btn[_ngcontent-%COMP%] .logo[_ngcontent-%COMP%]{width:48px;height:48px;transition:opacity .2s;border-radius:2px}.floating-menu-btn[_ngcontent-%COMP%] .hamburger-overlay[_ngcontent-%COMP%]{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);opacity:0;transition:opacity .2s;font-size:18px;font-weight:400}.floating-menu-btn[_ngcontent-%COMP%]:hover .logo[_ngcontent-%COMP%]{opacity:.2}.floating-menu-btn[_ngcontent-%COMP%]:hover .hamburger-overlay[_ngcontent-%COMP%]{opacity:1}.floating-menu[_ngcontent-%COMP%]{position:fixed;top:4rem;left:1rem;z-index:1499;background:var(--color-input-bg, #ffffff);border:1px solid var(--color-border, #e5e7eb);border-radius:12px;box-shadow:0 8px 32px #0000001f;min-width:280px;max-width:320px;animation:_ngcontent-%COMP%_slideIn .2s ease-out}.floating-menu[_ngcontent-%COMP%] .menu-section[_ngcontent-%COMP%]{padding:.75rem}.floating-menu[_ngcontent-%COMP%] .menu-section[_ngcontent-%COMP%]:not(:last-child){border-bottom:1px solid var(--color-border, #e5e7eb)}.project-selector-section[_ngcontent-%COMP%]{padding:1rem!important}.project-selector-section[_ngcontent-%COMP%] .main-project-selector[_ngcontent-%COMP%]{width:100%}.menu-item[_ngcontent-%COMP%]{width:100%;display:flex;align-items:center;gap:.75rem;padding:.5rem .75rem;background:none;border:none;border-radius:6px;cursor:pointer;transition:background-color .2s;text-align:left}.menu-item[_ngcontent-%COMP%]:hover:not(:disabled){background:var(--color-bg-secondary, #f1f1eb)}.menu-item[_ngcontent-%COMP%]:disabled{opacity:.5;cursor:not-allowed}.menu-item[_ngcontent-%COMP%] .menu-icon[_ngcontent-%COMP%]{font-size:1.1rem;width:20px;text-align:center}.menu-item[_ngcontent-%COMP%] .menu-text[_ngcontent-%COMP%]{flex:1;font-size:.9rem;color:var(--color-text, #282a36)}.menu-item[_ngcontent-%COMP%] .coming-soon[_ngcontent-%COMP%]{font-size:.7rem;color:var(--color-text-secondary, #6272a4);background:var(--color-bg-secondary, #f1f1eb);padding:.2rem .4rem;border-radius:4px}.menu-item[_ngcontent-%COMP%] .disabled-hint[_ngcontent-%COMP%]{font-size:.7rem;color:var(--color-text-secondary, #6272a4);font-style:italic}.menu-item-wrapper[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.75rem;padding:.5rem .75rem}.menu-item-wrapper[_ngcontent-%COMP%] .menu-icon[_ngcontent-%COMP%]{font-size:1.1rem;width:20px;text-align:center}.menu-item-wrapper[_ngcontent-%COMP%] .menu-text[_ngcontent-%COMP%]{flex:1;font-size:.9rem;color:var(--color-text, #282a36)}.menu-item-wrapper[_ngcontent-%COMP%] .inline-selector[_ngcontent-%COMP%], .menu-item-wrapper[_ngcontent-%COMP%] .inline-panel[_ngcontent-%COMP%]{flex-shrink:0}.menu-item-wrapper[_ngcontent-%COMP%] .menu-button[_ngcontent-%COMP%]{width:100%;display:flex;align-items:center;gap:.75rem;padding:.5rem .75rem;background:none;border:none;border-radius:6px;cursor:pointer;transition:background-color .2s;text-align:left}.menu-item-wrapper[_ngcontent-%COMP%] .menu-button[_ngcontent-%COMP%]:hover:not(:disabled){background:var(--color-bg-secondary, #f1f1eb)}.menu-item-wrapper[_ngcontent-%COMP%] .menu-button[_ngcontent-%COMP%]:disabled, .menu-item-wrapper[_ngcontent-%COMP%] .menu-button.disabled[_ngcontent-%COMP%]{opacity:.5;cursor:not-allowed}.menu-item-wrapper[_ngcontent-%COMP%] .menu-button[_ngcontent-%COMP%] .menu-icon[_ngcontent-%COMP%]{font-size:1.1rem;width:20px;text-align:center}.menu-item-wrapper[_ngcontent-%COMP%] .menu-button[_ngcontent-%COMP%] .menu-text[_ngcontent-%COMP%]{flex:1;font-size:.9rem;color:var(--color-text, #282a36)}.menu-item-wrapper[_ngcontent-%COMP%] .menu-button[_ngcontent-%COMP%] .disabled-hint[_ngcontent-%COMP%]{font-size:.7rem;color:var(--color-text-secondary, #6272a4);font-style:italic}.main-project-selector[_ngcontent-%COMP%] .selector-button[_ngcontent-%COMP%]{font-size:1rem;font-weight:600;padding:.8rem 1rem;border:1px solid var(--color-border, #e5e7eb);border-radius:8px;background:var(--color-bg, #ffffff)}.main-project-selector[_ngcontent-%COMP%] .selector-button.clickable[_ngcontent-%COMP%]:hover{border-color:var(--color-primary, #7064fb)}.main-project-selector[_ngcontent-%COMP%] .selector-text[_ngcontent-%COMP%]{font-weight:600}.main-thread-selector[_ngcontent-%COMP%]{width:100%}.main-thread-selector[_ngcontent-%COMP%] .selector-button[_ngcontent-%COMP%]{font-size:.95rem;font-weight:500;padding:.75rem 1rem}.main-thread-selector[_ngcontent-%COMP%] .selector-button.clickable[_ngcontent-%COMP%]:hover{background:var(--color-bg-hover)}.main-thread-selector[_ngcontent-%COMP%] .selector-text[_ngcontent-%COMP%]{font-weight:500}.menu-backdrop[_ngcontent-%COMP%]{position:fixed;inset:0;z-index:1498;background:transparent}@keyframes _ngcontent-%COMP%_slideIn{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.error-notification[_ngcontent-%COMP%]{position:fixed;top:5rem;left:50%;transform:translate(-50%);z-index:2000;display:flex;align-items:center;gap:.75rem;background:#fee;border:1px solid #fcc;border-radius:8px;padding:1rem 1.25rem;box-shadow:0 4px 12px #ff000026;animation:_ngcontent-%COMP%_slideDown .3s ease-out}.error-notification[_ngcontent-%COMP%] .error-icon[_ngcontent-%COMP%]{font-size:1.2rem;flex-shrink:0}.error-notification[_ngcontent-%COMP%] .error-text[_ngcontent-%COMP%]{flex:1;color:#c00;font-size:.9rem;font-weight:500}.error-notification[_ngcontent-%COMP%] .error-close[_ngcontent-%COMP%]{background:none;border:none;color:#c00;font-size:1.2rem;cursor:pointer;padding:0;width:24px;height:24px;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:background-color .2s}.error-notification[_ngcontent-%COMP%] .error-close[_ngcontent-%COMP%]:hover{background:#ff00001a}@keyframes _ngcontent-%COMP%_slideDown{0%{opacity:0;transform:translate(-50%,-10px)}to{opacity:1;transform:translate(-50%)}}@media (max-width: 480px){.floating-menu[_ngcontent-%COMP%]{left:.5rem;right:.5rem;min-width:auto;max-width:none}.floating-menu-btn[_ngcontent-%COMP%]{left:.5rem;top:.5rem}.error-notification[_ngcontent-%COMP%]{left:1rem;right:1rem;transform:none;max-width:calc(100vw - 2rem)}}"]})};var Wd=class n{title="web-ng";themeService=h(ls);ngOnInit(){console.log("[APP] Application initialized with theme:",this.themeService.getCurrentTheme())}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=se({type:n,selectors:[["app-root"]],decls:2,vars:0,template:function(t,r){t&1&&oe(0,"router-outlet")(1,"app-floating-menu")},dependencies:[fm,xa,zd],encapsulation:2})};Ng(Wd,Uw).catch(n=>console.error(n));
|
|
95
|
+
This action cannot be undone.`)&&this.webhookApi.deleteWebhook(e.uuid).subscribe({next:()=>{this.showSuccess(`Webhook "${e.name}" deleted successfully`),this.loadWebhooks()},error:r=>{this.errorMessage=this.handleError(r,"Failed to delete webhook")}})}onCopyUrl(e){this.showSuccess("Webhook URL copied to clipboard!")}onFormSave(e){this.isSaving=!0,this.errorMessage="",this.editingWebhook?this.webhookApi.updateWebhook(this.editingWebhook.uuid,e).subscribe({next:t=>{this.isSaving=!1,this.showSuccess(`Webhook "${t.webhook.name}" updated successfully`),this.currentView="list",this.editingWebhook=void 0,this.loadWebhooks()},error:t=>{this.errorMessage=this.handleError(t,"Failed to update webhook"),this.isSaving=!1}}):this.webhookApi.createWebhook(e).subscribe({next:t=>{this.isSaving=!1,this.showSuccess(`Webhook "${t.name}" created successfully`),this.currentView="list",this.loadWebhooks()},error:t=>{this.errorMessage=this.handleError(t,"Failed to create webhook"),this.isSaving=!1}})}onFormCancel(){this.currentView="list",this.editingWebhook=void 0,this.errorMessage=""}showSuccess(e){this.successMessage=e,setTimeout(()=>this.successMessage="",3e3)}onCloseClick(){this.isOpenChange.emit(!1),this.closeModal.emit()}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=se({type:n,selectors:[["app-webhook-manager"]],inputs:{isOpen:"isOpen",availableProjects:"availableProjects"},outputs:{isOpenChange:"isOpenChange",closeModal:"closeModal"},features:[st],decls:1,vars:1,consts:[["role","dialog","aria-modal","true","aria-labelledby","modal-title",1,"modal-backdrop-wrapper"],["aria-label","Close modal","type","button",1,"modal-backdrop",3,"click"],[1,"modal-container"],[1,"modal-header"],["title","Back to list",1,"btn-back"],["id","modal-title",1,"modal-title"],["title","Close",1,"btn-close",3,"click"],[1,"success-message"],[1,"error-message"],[1,"modal-body"],[3,"webhooks","isLoading","errorMessage"],[3,"webhook","isSaving","availableProjects"],["title","Back to list",1,"btn-back",3,"click"],[3,"create","edit","deleteWebhook","copyUrl","webhooks","isLoading","errorMessage"],[3,"save","cancelForm","webhook","isSaving","availableProjects"]],template:function(t,r){t&1&&Ie(0,jR,14,6,"div",0),t&2&&xe(r.isOpen?0:-1)},dependencies:[de,Bd,$d],styles:[".modal-backdrop-wrapper[_ngcontent-%COMP%]{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;z-index:1000;padding:1rem}.modal-backdrop[_ngcontent-%COMP%]{position:absolute;inset:0;background:#00000080;border:none;padding:0;cursor:pointer;z-index:1}.modal-container[_ngcontent-%COMP%]{position:relative;z-index:2;background:var(--color-bg);border-radius:8px;box-shadow:0 4px 20px #0000004d;max-width:900px;width:100%;max-height:90vh;display:flex;flex-direction:column;overflow:hidden}.modal-header[_ngcontent-%COMP%]{display:flex;align-items:center;gap:1rem;padding:1rem 1.5rem;border-bottom:1px solid var(--color-border);background:var(--color-bg-hover)}.modal-header[_ngcontent-%COMP%] .btn-back[_ngcontent-%COMP%]{padding:.5rem 1rem;background:transparent;border:1px solid var(--color-border);border-radius:4px;color:var(--color-text);cursor:pointer;font-size:.9rem;transition:all .2s}.modal-header[_ngcontent-%COMP%] .btn-back[_ngcontent-%COMP%]:hover{background:var(--color-bg);border-color:var(--color-primary)}.modal-header[_ngcontent-%COMP%] .modal-title[_ngcontent-%COMP%]{flex:1;margin:0;font-size:1.25rem;color:var(--color-text)}.modal-header[_ngcontent-%COMP%] .btn-close[_ngcontent-%COMP%]{padding:.5rem;background:transparent;border:none;font-size:1.5rem;color:var(--color-text-secondary);cursor:pointer;transition:color .2s}.modal-header[_ngcontent-%COMP%] .btn-close[_ngcontent-%COMP%]:hover{color:var(--color-error)}.success-message[_ngcontent-%COMP%], .error-message[_ngcontent-%COMP%]{padding:.75rem 1.5rem;font-size:.9rem}.success-message[_ngcontent-%COMP%]{background:#00c8001a;color:var(--color-success);border-bottom:1px solid rgba(0,200,0,.3)}.error-message[_ngcontent-%COMP%]{background:#ff00001a;color:var(--color-error);border-bottom:1px solid rgba(255,0,0,.3)}.modal-body[_ngcontent-%COMP%]{flex:1;overflow-y:auto;padding:0}@media (max-width: 768px){.modal-container[_ngcontent-%COMP%]{max-width:100%;max-height:100vh;border-radius:0}}"]})};function BR(n,e){n&1&&(g(0,"span",22),b(1,"(No project)"),m())}function $R(n,e){if(n&1){let t=H();g(0,"div",15)(1,"button",21),I("click",function(){w(t);let o=_(2);return S(o.openProjectConfig())}),g(2,"span",17),b(3,"\u{1F4C1}"),m(),g(4,"span",18),b(5,"Project Config"),m(),Ie(6,BR,2,0,"span",22),m()(),g(7,"div",15)(8,"button",16),I("click",function(){w(t);let o=_(2);return S(o.openWebhooks())}),g(9,"span",17),b(10,"\u{1F517}"),m(),g(11,"span",18),b(12,"Webhooks"),m()()()}if(n&2){let t=_(2);y(),Ee("disabled",!t.hasProject()),M("disabled",!t.hasProject())("title",t.hasProject()?"Edit project configuration":"No project selected"),y(5),xe(t.hasProject()?-1:6)}}function UR(n,e){if(n&1){let t=H();g(0,"div",9),I("click",function(o){return w(t),S(o.stopPropagation())})("keydown",function(o){return w(t),S(o.stopPropagation())}),g(1,"div",10),oe(2,"app-project-selector",11),m(),g(3,"div",12),oe(4,"app-thread-selector",13),m(),g(5,"div",14)(6,"div",15)(7,"button",16),I("click",function(){w(t);let o=_();return S(o.openUserConfig())}),g(8,"span",17),b(9,"\u{1F464}"),m(),g(10,"span",18),b(11,"User Config"),m()()(),Ie(12,$R,13,5),g(13,"div",15)(14,"span",18),b(15,"Theme"),m(),oe(16,"app-theme-selector",19),m(),g(17,"div",15)(18,"span",18),b(19,"Preferences"),m(),oe(20,"app-options-panel",20),m()()()}if(n&2){let t=_();y(12),xe(t.isAdmin?12:-1)}}function HR(n,e){if(n&1){let t=H();g(0,"div",4)(1,"span",23),b(2,"\u26A0\uFE0F"),m(),g(3,"span",24),b(4),m(),g(5,"button",25),I("click",function(){w(t);let o=_();return S(o.configErrorMessage="")}),b(6,"\u2715"),m()()}if(n&2){let t=_();y(4),Se(t.configErrorMessage)}}function zR(n,e){if(n&1){let t=H();g(0,"app-json-editor",26),I("save",function(o){w(t);let i=_();return S(i.onProjectConfigSave(o))})("closeEditor",function(){w(t);let o=_();return S(o.onProjectConfigCancel())}),m()}if(n&2){let t=_();M("configType","project")("projectName",t.getCurrentProjectName())("isOpen",t.isProjectConfigOpen)("initialContent",t.projectConfigJson)("isLoading",t.isLoadingProjectConfig)("isSaving",t.isSavingProjectConfig)}}function WR(n,e){if(n&1){let t=H();g(0,"div",27),I("click",function(){w(t);let o=_();return S(o.closeMenu())})("keydown.escape",function(){w(t);let o=_();return S(o.closeMenu())}),m()}}var zd=class n{destroy$=new Q;isMenuOpen=!1;isUserConfigOpen=!1;isProjectConfigOpen=!1;isWebhooksOpen=!1;isAdmin=!1;userConfigJson="";projectConfigJson="";isLoadingUserConfig=!1;isLoadingProjectConfig=!1;isSavingUserConfig=!1;isSavingProjectConfig=!1;configSuccessMessage="";configErrorMessage="";sessionState=h(Vn);configApi=h(Rd);ngOnInit(){console.log("[FLOATING-MENU] SessionState service injected:",!!this.sessionState),this.configApi.getUserConfig().pipe(K(this.destroy$)).subscribe({next:e=>{this.isAdmin=e.temp_groups?.includes("CODAY_ADMIN")??!1,console.log("[FLOATING-MENU] User admin status:",this.isAdmin)},error:e=>{console.error("[FLOATING-MENU] Error loading user config for roles:",e),this.isAdmin=!1}})}ngOnDestroy(){this.destroy$.next(),this.destroy$.complete()}toggleMenu(){this.isMenuOpen=!this.isMenuOpen}closeMenu(){this.isMenuOpen=!1}onDocumentClick(e){let t=e.target;!t.closest(".floating-menu-btn")&&!t.closest(".floating-menu")&&this.closeMenu()}onEscapeKey(){this.closeMenu()}openUserConfig(){this.closeMenu(),this.isLoadingUserConfig=!0,this.configSuccessMessage="",this.configErrorMessage="",this.configApi.getUserConfig().pipe(K(this.destroy$)).subscribe({next:e=>{this.userConfigJson=JSON.stringify(e,null,2),this.isLoadingUserConfig=!1,this.isUserConfigOpen=!0},error:e=>{console.error("[FLOATING-MENU] Error loading user config:",e),this.isLoadingUserConfig=!1,this.configErrorMessage=e?.error?.error||"Failed to load user configuration"}})}openProjectConfig(){let e=this.getCurrentProjectName();if(this.closeMenu(),!e){console.error("[FLOATING-MENU] No project selected"),this.configErrorMessage="No project selected. Please select a project first.";return}this.isLoadingProjectConfig=!0,this.configSuccessMessage="",this.configErrorMessage="",this.configApi.getProjectConfig(e).pipe(K(this.destroy$)).subscribe({next:t=>{this.projectConfigJson=JSON.stringify(t,null,2),this.isLoadingProjectConfig=!1,this.isProjectConfigOpen=!0},error:t=>{console.error("[FLOATING-MENU] Error loading project config:",t),this.isLoadingProjectConfig=!1,this.configErrorMessage=t?.error?.error||"Failed to load project configuration"}})}hasProject(){return this.sessionState.hasProjectSelected()}getCurrentProjectName(){return this.sessionState.getCurrentProject()}onUserConfigSave(e){this.isSavingUserConfig=!0,this.configErrorMessage="",this.configApi.updateUserConfig(e).pipe(K(this.destroy$)).subscribe({next:t=>{console.log("[FLOATING-MENU] User config saved successfully"),this.isSavingUserConfig=!1,this.configSuccessMessage=t.message??"Configuration saved successfully",setTimeout(()=>{this.isUserConfigOpen=!1,this.configSuccessMessage=""},1500)},error:t=>{console.error("[FLOATING-MENU] Error saving user config:",t),this.isSavingUserConfig=!1,this.configErrorMessage=t?.error?.error||"Failed to save user configuration"}})}onProjectConfigSave(e){let t=this.getCurrentProjectName();if(!t){console.error("[FLOATING-MENU] No project selected"),this.configErrorMessage="No project selected. Cannot save configuration.";return}this.isSavingProjectConfig=!0,this.configErrorMessage="",this.configApi.updateProjectConfig(t,e).pipe(K(this.destroy$)).subscribe({next:r=>{console.log("[FLOATING-MENU] Project config saved successfully"),this.isSavingProjectConfig=!1,this.configSuccessMessage=r.message??"Configuration saved successfully",setTimeout(()=>{this.isProjectConfigOpen=!1,this.configSuccessMessage=""},1500)},error:r=>{console.error("[FLOATING-MENU] Error saving project config:",r),this.isSavingProjectConfig=!1,this.configErrorMessage=r?.error?.error||"Failed to save project configuration"}})}onUserConfigCancel(){this.isUserConfigOpen=!1,this.configSuccessMessage="",this.configErrorMessage=""}onProjectConfigCancel(){this.isProjectConfigOpen=!1,this.configSuccessMessage="",this.configErrorMessage=""}openWebhooks(){this.closeMenu(),this.isWebhooksOpen=!0}getAvailableProjects(){return[]}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=se({type:n,selectors:[["app-floating-menu"]],hostBindings:function(t,r){t&1&&I("click",function(i){return r.onDocumentClick(i)},yi)("keydown.escape",function(){return r.onEscapeKey()},yi)},decls:10,vars:13,consts:[["title","Menu Coday",1,"floating-menu-btn",3,"click"],["src","CODAY-Logo.png","alt","Coday",1,"logo"],[1,"hamburger-overlay"],["tabindex","-1","role","menu","aria-label","Menu principal de Coday",1,"floating-menu"],["role","alert",1,"error-notification"],[3,"save","closeEditor","configType","isOpen","initialContent","isLoading","isSaving"],[3,"configType","projectName","isOpen","initialContent","isLoading","isSaving"],[3,"isOpenChange","closeModal","isOpen","availableProjects"],["tabindex","-1","role","button","aria-label","Fermer le menu (cliquez ou appuyez sur \xC9chap)",1,"menu-backdrop"],["tabindex","-1","role","menu","aria-label","Menu principal de Coday",1,"floating-menu",3,"click","keydown"],[1,"menu-section","project-selector-section"],[1,"main-project-selector"],[1,"menu-section","navigation"],[1,"main-thread-selector"],[1,"menu-section"],[1,"menu-item-wrapper"],[1,"menu-button",3,"click"],[1,"menu-icon"],[1,"menu-text"],[1,"inline-selector"],[1,"inline-panel"],[1,"menu-button",3,"click","disabled","title"],[1,"disabled-hint"],[1,"error-icon"],[1,"error-text"],["aria-label","Close error message",1,"error-close",3,"click"],[3,"save","closeEditor","configType","projectName","isOpen","initialContent","isLoading","isSaving"],["tabindex","-1","role","button","aria-label","Fermer le menu (cliquez ou appuyez sur \xC9chap)",1,"menu-backdrop",3,"click","keydown.escape"]],template:function(t,r){t&1&&(g(0,"button",0),I("click",function(){return r.toggleMenu()}),oe(1,"img",1),g(2,"div",2),b(3,"\u2630"),m()(),Ie(4,UR,21,1,"div",3),Ie(5,HR,7,1,"div",4),g(6,"app-json-editor",5),I("save",function(i){return r.onUserConfigSave(i)})("closeEditor",function(){return r.onUserConfigCancel()}),m(),Ie(7,zR,1,6,"app-json-editor",6),g(8,"app-webhook-manager",7),I("isOpenChange",function(i){return r.isWebhooksOpen=i})("closeModal",function(){return r.isWebhooksOpen=!1}),m(),Ie(9,WR,1,0,"div",8)),t&2&&(Ee("active",r.isMenuOpen),y(4),xe(r.isMenuOpen?4:-1),y(),xe(r.configErrorMessage?5:-1),y(),M("configType","user")("isOpen",r.isUserConfigOpen)("initialContent",r.userConfigJson)("isLoading",r.isLoadingUserConfig)("isSaving",r.isSavingUserConfig),y(),xe(r.hasProject()?7:-1),y(),M("isOpen",r.isWebhooksOpen)("availableProjects",r.getAvailableProjects()),y(),xe(r.isMenuOpen?9:-1))},dependencies:[de,Fd,Xa,Ld,Vd,jd,Hd],styles:[".floating-menu-btn[_ngcontent-%COMP%]{position:fixed;top:1rem;left:1rem;z-index:1500;width:48px;height:48px;border-radius:50%;border:2px solid rgba(255,255,255,.2);background:var(--color-primary, #7064fb);color:#fff;box-shadow:0 4px 16px #0003,0 2px 8px #0000001a;transition:all .2s ease;cursor:pointer;display:flex;align-items:center;justify-content:center;position:relative}.floating-menu-btn[_ngcontent-%COMP%]:hover{transform:scale(1.05);box-shadow:0 6px 20px #00000040,0 4px 12px #00000026}.floating-menu-btn[_ngcontent-%COMP%]:active{transform:scale(.95)}.floating-menu-btn.active[_ngcontent-%COMP%]{background:var(--color-primary-hover, #ff79c6);border-color:#ffffff4d}.floating-menu-btn[_ngcontent-%COMP%] .logo[_ngcontent-%COMP%]{width:48px;height:48px;transition:opacity .2s;border-radius:2px}.floating-menu-btn[_ngcontent-%COMP%] .hamburger-overlay[_ngcontent-%COMP%]{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);opacity:0;transition:opacity .2s;font-size:18px;font-weight:400}.floating-menu-btn[_ngcontent-%COMP%]:hover .logo[_ngcontent-%COMP%]{opacity:.2}.floating-menu-btn[_ngcontent-%COMP%]:hover .hamburger-overlay[_ngcontent-%COMP%]{opacity:1}.floating-menu[_ngcontent-%COMP%]{position:fixed;top:4rem;left:1rem;z-index:1499;background:var(--color-input-bg, #ffffff);border:1px solid var(--color-border, #e5e7eb);border-radius:12px;box-shadow:0 8px 32px #0000001f;min-width:280px;max-width:320px;animation:_ngcontent-%COMP%_slideIn .2s ease-out}.floating-menu[_ngcontent-%COMP%] .menu-section[_ngcontent-%COMP%]{padding:.75rem}.floating-menu[_ngcontent-%COMP%] .menu-section[_ngcontent-%COMP%]:not(:last-child){border-bottom:1px solid var(--color-border, #e5e7eb)}.project-selector-section[_ngcontent-%COMP%]{padding:1rem!important}.project-selector-section[_ngcontent-%COMP%] .main-project-selector[_ngcontent-%COMP%]{width:100%}.menu-item[_ngcontent-%COMP%]{width:100%;display:flex;align-items:center;gap:.75rem;padding:.5rem .75rem;background:none;border:none;border-radius:6px;cursor:pointer;transition:background-color .2s;text-align:left}.menu-item[_ngcontent-%COMP%]:hover:not(:disabled){background:var(--color-bg-secondary, #f1f1eb)}.menu-item[_ngcontent-%COMP%]:disabled{opacity:.5;cursor:not-allowed}.menu-item[_ngcontent-%COMP%] .menu-icon[_ngcontent-%COMP%]{font-size:1.1rem;width:20px;text-align:center}.menu-item[_ngcontent-%COMP%] .menu-text[_ngcontent-%COMP%]{flex:1;font-size:.9rem;color:var(--color-text, #282a36)}.menu-item[_ngcontent-%COMP%] .coming-soon[_ngcontent-%COMP%]{font-size:.7rem;color:var(--color-text-secondary, #6272a4);background:var(--color-bg-secondary, #f1f1eb);padding:.2rem .4rem;border-radius:4px}.menu-item[_ngcontent-%COMP%] .disabled-hint[_ngcontent-%COMP%]{font-size:.7rem;color:var(--color-text-secondary, #6272a4);font-style:italic}.menu-item-wrapper[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.75rem;padding:.5rem .75rem}.menu-item-wrapper[_ngcontent-%COMP%] .menu-icon[_ngcontent-%COMP%]{font-size:1.1rem;width:20px;text-align:center}.menu-item-wrapper[_ngcontent-%COMP%] .menu-text[_ngcontent-%COMP%]{flex:1;font-size:.9rem;color:var(--color-text, #282a36)}.menu-item-wrapper[_ngcontent-%COMP%] .inline-selector[_ngcontent-%COMP%], .menu-item-wrapper[_ngcontent-%COMP%] .inline-panel[_ngcontent-%COMP%]{flex-shrink:0}.menu-item-wrapper[_ngcontent-%COMP%] .menu-button[_ngcontent-%COMP%]{width:100%;display:flex;align-items:center;gap:.75rem;padding:.5rem .75rem;background:none;border:none;border-radius:6px;cursor:pointer;transition:background-color .2s;text-align:left}.menu-item-wrapper[_ngcontent-%COMP%] .menu-button[_ngcontent-%COMP%]:hover:not(:disabled){background:var(--color-bg-secondary, #f1f1eb)}.menu-item-wrapper[_ngcontent-%COMP%] .menu-button[_ngcontent-%COMP%]:disabled, .menu-item-wrapper[_ngcontent-%COMP%] .menu-button.disabled[_ngcontent-%COMP%]{opacity:.5;cursor:not-allowed}.menu-item-wrapper[_ngcontent-%COMP%] .menu-button[_ngcontent-%COMP%] .menu-icon[_ngcontent-%COMP%]{font-size:1.1rem;width:20px;text-align:center}.menu-item-wrapper[_ngcontent-%COMP%] .menu-button[_ngcontent-%COMP%] .menu-text[_ngcontent-%COMP%]{flex:1;font-size:.9rem;color:var(--color-text, #282a36)}.menu-item-wrapper[_ngcontent-%COMP%] .menu-button[_ngcontent-%COMP%] .disabled-hint[_ngcontent-%COMP%]{font-size:.7rem;color:var(--color-text-secondary, #6272a4);font-style:italic}.main-project-selector[_ngcontent-%COMP%] .selector-button[_ngcontent-%COMP%]{font-size:1rem;font-weight:600;padding:.8rem 1rem;border:1px solid var(--color-border, #e5e7eb);border-radius:8px;background:var(--color-bg, #ffffff)}.main-project-selector[_ngcontent-%COMP%] .selector-button.clickable[_ngcontent-%COMP%]:hover{border-color:var(--color-primary, #7064fb)}.main-project-selector[_ngcontent-%COMP%] .selector-text[_ngcontent-%COMP%]{font-weight:600}.main-thread-selector[_ngcontent-%COMP%]{width:100%}.main-thread-selector[_ngcontent-%COMP%] .selector-button[_ngcontent-%COMP%]{font-size:.95rem;font-weight:500;padding:.75rem 1rem}.main-thread-selector[_ngcontent-%COMP%] .selector-button.clickable[_ngcontent-%COMP%]:hover{background:var(--color-bg-hover)}.main-thread-selector[_ngcontent-%COMP%] .selector-text[_ngcontent-%COMP%]{font-weight:500}.menu-backdrop[_ngcontent-%COMP%]{position:fixed;inset:0;z-index:1498;background:transparent}@keyframes _ngcontent-%COMP%_slideIn{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.error-notification[_ngcontent-%COMP%]{position:fixed;top:5rem;left:50%;transform:translate(-50%);z-index:2000;display:flex;align-items:center;gap:.75rem;background:#fee;border:1px solid #fcc;border-radius:8px;padding:1rem 1.25rem;box-shadow:0 4px 12px #ff000026;animation:_ngcontent-%COMP%_slideDown .3s ease-out}.error-notification[_ngcontent-%COMP%] .error-icon[_ngcontent-%COMP%]{font-size:1.2rem;flex-shrink:0}.error-notification[_ngcontent-%COMP%] .error-text[_ngcontent-%COMP%]{flex:1;color:#c00;font-size:.9rem;font-weight:500}.error-notification[_ngcontent-%COMP%] .error-close[_ngcontent-%COMP%]{background:none;border:none;color:#c00;font-size:1.2rem;cursor:pointer;padding:0;width:24px;height:24px;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:background-color .2s}.error-notification[_ngcontent-%COMP%] .error-close[_ngcontent-%COMP%]:hover{background:#ff00001a}@keyframes _ngcontent-%COMP%_slideDown{0%{opacity:0;transform:translate(-50%,-10px)}to{opacity:1;transform:translate(-50%)}}@media (max-width: 480px){.floating-menu[_ngcontent-%COMP%]{left:.5rem;right:.5rem;min-width:auto;max-width:none}.floating-menu-btn[_ngcontent-%COMP%]{left:.5rem;top:.5rem}.error-notification[_ngcontent-%COMP%]{left:1rem;right:1rem;transform:none;max-width:calc(100vw - 2rem)}}"]})};var Wd=class n{title="client";themeService=h(ls);ngOnInit(){console.log("[APP] Application initialized with theme:",this.themeService.getCurrentTheme())}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=se({type:n,selectors:[["app-root"]],decls:2,vars:0,template:function(t,r){t&1&&oe(0,"router-outlet")(1,"app-floating-menu")},dependencies:[fm,xa,zd],encapsulation:2})};Ng(Wd,Uw).catch(n=>console.error(n));
|